{"record":{"id":"b11f57664f7fb3fd","repo":"JuliusBrussee/caveman","slug":"provider-input-budget-exceeded","errorCode":"provider_input_budget_exceeded","errorMessage":"cachebench: provider input tokens %d exceed declared ceiling %d for %q","messagePattern":"cachebench: provider input tokens (.+?) exceed declared ceiling (.+?) for %q","errorType":"validation","errorClass":"ReplayRunError","httpStatus":null,"severity":"error","filePath":"cacheengine/cachebench/replay.go","lineNumber":728,"sourceCode":"\t\t\tErr: fmt.Errorf(\"cachebench: provider returned HTTP %d for %q\", response.StatusCode, record.RequestID),\n\t\t}\n\t}\n\tusage, ok := cacheengine.ExtractProviderUsage(record.Provider, response.Body)\n\tif !ok {\n\t\tevidence.FailureCode = \"provider_usage_invalid\"\n\t\treturn ReplayResult{Evidence: evidence, ProviderResponse: append([]byte(nil), response.Body...)}, &ReplayRunError{\n\t\t\tRequestID: record.RequestID, FailureCode: evidence.FailureCode,\n\t\t\tErr: fmt.Errorf(\"cachebench: provider usage unavailable for %q\", record.RequestID),\n\t\t}\n\t}\n\tevidence.ProviderUsageSHA256 = bodyDigest(usage.RawUsage)\n\tevidence.ProviderTotalInputTokens = usage.TotalInputTokens\n\tevidence.ProviderOutputTokens = usage.OutputTokens\n\tif usage.TotalInputTokens > record.DeclaredInputTokens {\n\t\tevidence.FailureCode = \"provider_input_budget_exceeded\"\n\t\treturn ReplayResult{Evidence: evidence, ProviderResponse: append([]byte(nil), response.Body...)}, &ReplayRunError{\n\t\t\tRequestID: record.RequestID, FailureCode: evidence.FailureCode,\n\t\t\tErr: fmt.Errorf(\"cachebench: provider input tokens %d exceed declared ceiling %d for %q\", usage.TotalInputTokens, record.DeclaredInputTokens, record.RequestID),\n\t\t}\n\t}\n\tif usage.OutputTokens > record.MaxOutputTokens {\n\t\tevidence.FailureCode = \"provider_output_budget_exceeded\"\n\t\treturn ReplayResult{Evidence: evidence, ProviderResponse: append([]byte(nil), response.Body...)}, &ReplayRunError{\n\t\t\tRequestID: record.RequestID, FailureCode: evidence.FailureCode,\n\t\t\tErr: fmt.Errorf(\"cachebench: provider output tokens %d exceed request ceiling %d for %q\", usage.OutputTokens, record.MaxOutputTokens, record.RequestID),\n\t\t}\n\t}\n\tverification, err := runner.Verifier.Verify(ctx, ReplayVerificationInput{Trace: record, Optimized: optimized, Response: response})\n\tif err != nil {\n\t\tevidence.FailureCode = \"quality_verifier_error\"\n\t\treturn ReplayResult{Evidence: evidence, ProviderResponse: append([]byte(nil), response.Body...)}, &ReplayRunError{\n\t\t\tRequestID: record.RequestID, FailureCode: evidence.FailureCode,\n\t\t\tErr: fmt.Errorf(\"cachebench: quality verifier failed for %q: %w\", record.RequestID, err),\n\t\t}\n\t}\n\tif !validTaskVerification(verification) {","sourceCodeStart":710,"sourceCodeEnd":746,"githubUrl":"https://github.com/JuliusBrussee/caveman/blob/27d5a3981a347890211bb1bf2439e5c821a63bc9/cacheengine/cachebench/replay.go#L710-L746","documentation":"The provider-reported total input tokens exceeded record.DeclaredInputTokens, the per-record ceiling declared in the trace. This guards against an optimization accidentally inflating inputs (or a mis-declared trace) busting the cost envelope; the request fails with FailureCode provider_input_budget_exceeded after usage extraction.","triggerScenarios":"Optimized body larger than declared (e.g. cache padding or template expansion), or a trace whose DeclaredInputTokens was recorded below the true value; provider counting overhead (e.g. cached tokens counted in total) pushing the number over the ceiling.","commonSituations":"See trigger scenarios.","solutions":["Compare evidence.ProviderTotalInputTokens with the native request's token count to see whether optimization inflated it or the declaration was wrong.","If the declaration is stale, re-capture the trace or correct DeclaredInputTokens for the record.","If optimization inflates inputs, disable or fix the responsible engine rewrite (see also error 884's equivalence check).","Account for provider-side counting rules (prompt caching overhead) when declaring the ceiling."],"exampleFix":"// before\nrecord := cachebench.TraceRecord{DeclaredInputTokens: 1000, Body: body} // provider counts 1200\n\n// after\nrecord := cachebench.TraceRecord{DeclaredInputTokens: 1500, Body: body} // ceiling with headroom","handlingStrategy":"validation","validationCode":"// verify declared ceilings against actual token counts before replay\nfor _, r := range records {\n    native, _ := r.NativeRequest()\n    if n := countTokens(native.Body); n > r.DeclaredInputTokens {\n        return fmt.Errorf(\"record %s: native body already %d tokens > declared %d\", r.RequestID, n, r.DeclaredInputTokens)\n    }\n}","typeGuard":"func isInputBudgetExceeded(err error) bool {\n    var rre *cachebench.ReplayRunError\n    return errors.As(err, &rre) && rre.FailureCode == \"provider_input_budget_exceeded\"\n}","tryCatchPattern":"if err := runner.Run(ctx, records, emit); err != nil {\n    if isInputBudgetExceeded(err) {\n        // compare evidence.ProviderTotalInputTokens vs native count: bad declaration vs inflating rewrite\n    }\n    return err\n}","preventionTips":["Declare input ceilings with headroom over the native token count (optimization + provider counting overhead).","Recompute DeclaredInputTokens whenever bodies or engine rewrites change.","Watch for engine rewrites that add cache padding; budget for them."],"tags":["cachebench","budget","tokens","provider-api"],"backgroundTag":null,"analyzedSha":"27d5a3981a347890211bb1bf2439e5c821a63bc9","analyzedAt":"2026-08-15T09:26:11.751Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}