JuliusBrussee/caveman · error · Error
cave_provider_identity_missing
cave_provider_identity_missing
Error message
cave_provider_identity_missing
What it means
Thrown by validateProviderUsage (packages/agent/src/execution-kernel.ts:131): the provider usage evidence lacks a usable identity — provider or model is not a string, or is an empty string. Every reserved turn must report complete usage with an exact provider/model identity; evidence without identity cannot be billed or trusted and fails closed.
Source
Thrown at packages/agent/src/execution-kernel.ts:131
totalTokens: number;
}
export interface ValidatedProviderUsage extends ProviderUsageEvidence {
priced: boolean;
catalogCostUsd: number;
}
export function validateProviderUsage(
evidence: ProviderUsageEvidence,
options: {
expected?: { provider: string; model: string };
reportedCostUsd?: number;
requirePriced?: boolean;
} = {},
): ValidatedProviderUsage {
if (typeof evidence.provider !== "string" || evidence.provider.length === 0 ||
typeof evidence.model !== "string" || evidence.model.length === 0) {
throw new Error("cave_provider_identity_missing");
}
if (options.expected !== undefined &&
(evidence.provider !== options.expected.provider || evidence.model !== options.expected.model)) {
throw new Error("cave_provider_model_identity_mismatch");
}
const values = [
evidence.inputTokens,
evidence.outputTokens,
evidence.cacheReadTokens,
evidence.cacheWriteTokens,
evidence.reasoningTokens,
evidence.totalTokens,
];
const disjointTotal = evidence.inputTokens + evidence.outputTokens +
evidence.cacheReadTokens + evidence.cacheWriteTokens;
if (values.some((value) => !Number.isSafeInteger(value) || value < 0) ||
evidence.totalTokens <= 0 || evidence.totalTokens !== disjointTotal ||
evidence.reasoningTokens > evidence.outputTokens) {View on GitHub (pinned to 27d5a3981a)
Solutions
- Ensure the usage evidence passed in carries the provider's reported provider and model strings verbatim.
- If an upstream SDK omits the model in usage, take it from the response's model field and attach it to the evidence before validation.
- In tests, populate provider/model on fixture usage objects instead of only token counts.
Example fix
// before
validateProviderUsage({ /* provider/model missing */ inputTokens: 10, outputTokens: 5, ... });
// after
validateProviderUsage({ provider: "anthropic", model: "claude-sonnet-4-5", inputTokens: 10, outputTokens: 5, cacheReadTokens: 0, cacheWriteTokens: 0, reasoningTokens: 0, totalTokens: 15 }); Defensive patterns
Strategy: type-guard
Validate before calling
function hasUsageIdentity(e: { provider?: unknown; model?: unknown }): boolean {
return typeof e.provider === "string" && e.provider.length > 0 &&
typeof e.model === "string" && e.model.length > 0;
}
if (!hasUsageIdentity(evidence)) throw new Error("usage evidence lacks provider/model identity"); Type guard
interface ProviderUsageEvidence { provider: string; model: string; inputTokens: number; outputTokens: number; cacheReadTokens: number; cacheWriteTokens: number; reasoningTokens: number; totalTokens: number; }
function isProviderUsageEvidence(v: unknown): v is ProviderUsageEvidence {
const e = v as Record<string, unknown>;
return typeof e?.provider === "string" && (e.provider as string).length > 0 &&
typeof e?.model === "string" && (e.model as string).length > 0 &&
["inputTokens","outputTokens","cacheReadTokens","cacheWriteTokens","reasoningTokens","totalTokens"].every((k) => typeof e[k] === "number");
} Prevention
- Always attach the provider-reported model string to aggregated usage before validation.
- When mapping adapter responses, write a mapper that guarantees provider/model presence.
- In test fixtures, populate identity fields, not just token counts.
When it happens
Trigger: Calling validateProviderUsage with evidence whose provider/model fields are missing, undefined, non-string, or empty — typically usage parsed from an adapter or SDK response that did not populate the model field.
Common situations: A provider/adapter returning usage without a model name; destructuring or mapping usage objects and dropping fields; streaming paths where usage is aggregated from partial chunks and identity is lost; mocking provider responses in tests without identity fields.
Related errors
- cave_provider_model_identity_mismatch
- cave_provider_usage_incomplete
- cave_provider_cost_mismatch
- unsupported provider ${JSON.stringify(value)}
- option not found
AI-assisted analysis of JuliusBrussee/caveman@27d5a3981a (2026-08-15).
Data as JSON: /api/errors/aefd5524e00afdc6.
Report an issue: GitHub.