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

  1. Ensure the usage evidence passed in carries the provider's reported provider and model strings verbatim.
  2. 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.
  3. 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

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


AI-assisted analysis of JuliusBrussee/caveman@27d5a3981a (2026-08-15). Data as JSON: /api/errors/aefd5524e00afdc6. Report an issue: GitHub.