DOCS

Provider failures and cache diagnostics

Read fixed provider failure categories, cache observations and Claude continuity diagnostics.

About 6 min read · 9 sections

On this page

Return to the diagnostics overview.

Claude output between requests

claude_session_violation records unexpected output after a Claude request has ended: the hashed thread key, session state, pending-call count, and fixed messageKind, eventKind, and nativeError categories. It also records whether the frame reports an error and whether an assistant frame matches the completed message. Unknown categories become other. No message text, IDs, tool arguments, or diagnostic prose are recorded. The session still closes without replay. Older unexpected_output records do not identify the frame that triggered them.

Responses tool identity failures

tool_identity_failure separates Responses catalog/name matching failures from malformed arguments and other invalid_tool_call errors. Its upstreamCode is one of missing_tool_name, unknown_wire_tool, unexpected_tool_namespace or undeclared_tool; upstreamLastEvent and bounded stream counts identify the actual failure boundary. The client receives a fixed explanation and the same final refusal behavior as other invalid tool output. No tool is dispatched by this classification. Names, namespaces, arguments and response content remain private, and no automatic inference retry is added.

Chat Completions malformed tool calls

malformed_tool_call records a sampled Chat Completions model returning a tool call the client cannot run. Its upstreamEvent is chat.tool_call and its upstreamCode is unknown_tool or invalid_tool_arguments. Unlike invalid_tool_call, this failure is retryable, so one event does not mean a worker stopped. Tool names and arguments stay out of telemetry.

Cache and failure screen

api_cache_cold records large measured cold OpenRouter Responses requests, with token counts and flags for changed catalogs, instructions, sampled opening history or affinity. Idle time runs from the previous measured completion to the next request. Content and digests never enter telemetry; unchanged sampled fields do not prove that the full prefix matched or that the provider retained its cache. copilot_session_violation records a fixed event type, guard reason, session state, pending-call count and whether a request was attached. Unknown event names become unknown; event payloads are never recorded. copilot_tool_rejected distinguishes missing, non-string and empty names, declared or ambiguous caller aliases, names shaped like retired native tools, and other undeclared names. It records only that fixed category and catalog/call counts. The unknown name and arguments remain private. All unknown calls still fail without execution or an automatic conversation replay.

The native app's Diagnostics screen reads local telemetry over the last 1, 6 or 24 hours. It shows input tokens, cache reads and writes, failed requests per model, Copilot session reuse/rebuild reasons, and the latest provider failures and reconnect signals. It names the Mac being inspected; a client-only setup does not silently present another host's usage as local data.

gateway diagnostics --since HOURS includes the same cacheUsage, copilotSessions and issues fields alongside its existing summary. Cache hit percentages use the input tokens of requests that actually reported cache reads. Explicit zero means a measured cold cache; absent or incomplete counts remain unreported. Sample counts show partial coverage. Failed requests retain whatever usage the provider reported before failing. Copilot requests with multiple model calls report cache totals only when every call supplied those counts. Claude cache percentages also require its native input, read and write counts because native input excludes both kinds of cache tokens. Historical records from older versions may already have normalized missing counts to zero; that original observation coverage cannot be recovered. Copilot session token totals have separate read/write sample counts; a total of zero with no samples is unreported usage, not a measured cold cache.

Claude, Copilot and Grok blocked/preserved continuity decisions appear among diagnostic issues. They indicate that Gateway stopped instead of silently replaying history. Deterministic tool/protocol failures keep their original diagnostic class and usage even when the client-facing response is a final HTTP 400 or terminal stream error. See provider reuse.

New Copilot failures record fixed discriminants such as unknown_tool, duplicate_tool_id, malformed_tool_call, invalid_tool_arguments, nontext_custom_input and tool_request_missing. They preserve the existing tool checks and retry behavior. No tool names, arguments, prompts or private error prose are added. Old generic invalid_tool_call records cannot be reconstructed; the app labels those as lacking a detailed reason. Routine filesystem lookup errors remain in the CLI's existing recentProblems rather than burying provider failures in the app. A retrying turn and a failed provider request are separate signals; the screen does not claim they are correlated without a shared identifier.

The native view render uses sampled server telemetry for visual QA. It does not establish deployment or retrospective recovery of missing error details.

Gateway-rule refusals and dropped control items

Two fixed fields describe how the gateway treated a Responses request before any provider ran (details).

Field Where Meaning
translation_reason request_failed, and the stderr provider_failure line The gateway refused the request by its own rule, not because translation failed. The only value is unsupported_compaction: the request carried a compaction_trigger item. Any other value is dropped.
droppedControlItems request_completed, request_empty, request_failed How many configuration_update items were removed. A count only, never item content; absent when it is zero.

gateway diagnostics counts a refused compaction as failed:invalid_request:unsupported_compaction beside the translation reasons (failed:invalid_request:<reason>), so it does not hide among plain failed:invalid_request rows.

Provider connection diagnostics

Responses transport failures retain only an allowlisted low-level network code (upstreamCode) and a fixed upstreamStage of connect, stream, or unknown. Raw exception messages, socket addresses, URLs, certificate details, stacks, credentials, and request content are excluded. Unknown faults remain unknown; the gateway does not infer a DNS or TLS cause from message text.

Known transient Responses connection failures and named temporary throttles have independent pre-output 120-second budgets. Each uses a jittered one-, two-, four-, then eight-second schedule (or a throttle's bounded Retry-After); all other retryable failures share one retry. A wait that would reach a class deadline is not shortened, and the deadline is checked again after the abortable wait before another upstream request starts. An already-started request may outlast that retry window but remains bounded by the caller deadline. request_failed may include a descriptor-safe integer retryAfterMs only from 0 through 3,600,000. Any inference output makes the failure final for this provider call so recovery cannot duplicate visible text or caller tool calls. Certificate, permanent DNS, connection-refused, unknown, cancellation, and OAuth refresh faults are excluded from this additional internal retry.

Claude credential failures

Claude authentication failures carry upstreamReason only when a native claude.assistant or claude.result failure reports authentication_failed. The value is a fixed reason listed in Claude sessions; provider diagnostic text and credentials are never recorded. A claude_credential_recovery event records only the reason, attempt number and fixed outcome (attempted, recovered, failed, or cancelled). These records distinguish a bounded recovery from a final login failure without treating local credential presence as proof of working authentication.

Claude request rejections

Native Claude invalid_request failures are final request errors. JSON clients receive HTTP 400; Responses streams receive invalid_prompt, and Messages streams receive invalid_request_error. Clients must not repeat the unchanged request as a transient disconnect. Context overflow still uses its separate context_length_exceeded classification so the client can compact normally.

When a bounded native failure diagnostic begins with API Error: and carries the fixed reasoning_extraction details marker line, the gateway returns a fixed explanation of Claude's private-reasoning refusal. Telemetry stores only upstreamReason: reasoning_extraction. It never stores the diagnostic prose, provider request/message IDs from that prose, caller content or credentials. The gateway does not rewrite the chat, remove caller instructions, switch models, or try to bypass the provider's refusal. A refusal is not a crash: the session ends as claude_session closed with missReason: refused and no replay hold. The next message goes to Claude, and the cache stop limits repeated resends.

Grok CLI records

Each Grok subscription request writes one grok_cli event: model, effort, durationMs, result (tool_use, end_turn, result or none), exitCode, spawnFailed, aborted, toolCalls, inputTokens, cacheReadTokens, outputTokens and costUsd, the allowance cost the CLI reported. Failures use the upstream events grok.assistant, grok.result and grok.tool_use. See Grok subscription.