fork of Kludex/zigai, ported to zig 0.17
zigai docs errors.md
19 kB · 292 lines
Markdown
at main

Error reference #

ZigAI returns named errors for framework decisions and preserves allocator, runtime, transport implementation, and application callback errors alongside them. Public operations therefore use inferred error unions: handle the named cases relevant to the application, then propagate the remainder.

Agent errors #

Context and usage #

Error Meaning
ContextPromptTooLarge Provider-facing prompt text exceeds its byte budget.
ContextToolsTooLarge Tool definitions or tool traffic exceed their byte budget.
ContextSchemaTooLarge Tool or output schemas exceed their byte budget.
ContextMediaTooLarge Rich-media sources exceed their raw byte budget.
ContextTokenLimitExceeded Estimated input exceeds total capacity after output reservation.
ContextSizeOverflow Aggregate context size cannot be represented as u64.
InputTokenLimitExceeded Provider-reported cumulative input usage exceeded the run limit.
OutputTokenLimitExceeded Provider-reported cumulative output usage exceeded the run limit.
TotalTokenLimitExceeded Provider-reported combined usage exceeded the run limit.
CostLimitExceeded Available provider-reported or estimated cost exceeded the nano-USD run limit.
UsageOverflow A usage counter, duration, or exact cost exceeded its integer representation.
MaxModelRequestsExceeded The run exhausted its model-request budget.
MaxToolCallsExceeded The run exhausted its local tool-call budget.

Model capabilities and output #

Error Meaning
ModelDoesNotSupportAudio Audio was supplied to a model profile without audio support.
ModelDoesNotSupportBinaryContent Generic binary content is unsupported.
ModelDoesNotSupportDocuments Documents are unsupported.
ModelDoesNotSupportImages Images are unsupported.
ModelDoesNotSupportSystemMessages System prompts or instructions are unsupported.
ModelDoesNotSupportThinking Thinking content cannot be preserved.
ModelDoesNotSupportTools Local tools are unsupported.
ModelDoesNotSupportVideo Video was supplied to a model profile without video support.
ModelDoesNotSupportWebFetch Native web fetch is unsupported.
ModelDoesNotSupportWebSearch Native web search is unsupported.
ModelDoesNotSupportXSearch Native X search is unsupported.
ModelDoesNotSupportCodeExecution Provider-managed code execution is unsupported.
ModelDoesNotSupportFileSearch Provider-managed file search is unsupported.
ModelDoesNotSupportRemoteMcp Provider-managed remote MCP is unsupported.
ModelDoesNotSupportJsonObjectOutput JSON-object output is unsupported.
ModelDoesNotSupportJsonSchemaOutput JSON Schema output is unsupported.
ModelDoesNotSupportMaxTokens The model rejects max_tokens.
ModelDoesNotSupportReasoningEffort The requested reasoning effort is unsupported.
ModelDoesNotSupportSeed The model rejects deterministic seeds.
ModelDoesNotSupportStopSequences The model rejects stop sequences.
ModelDoesNotSupportStreaming The selected model cannot stream.
ModelDoesNotSupportTemperature The model rejects temperature.
ModelDoesNotSupportTopP / ModelDoesNotSupportTopK The requested sampling control is unsupported.
ModelDoesNotSupportPresencePenalty / ModelDoesNotSupportFrequencyPenalty The requested penalty is unsupported.
ModelDoesNotSupportLogprobs The model cannot return requested log probabilities.
ModelDoesNotSupportToolChoice The model cannot encode the requested tool-choice policy.
ModelDoesNotSupportParallelToolCallSetting The provider cannot encode an explicit parallel-tool policy.
ModelDoesNotSupportThinkingBudget The model cannot accept a thinking token budget.
ModelDoesNotSupportServiceTier The requested service tier is absent from the profile.
ModelDoesNotSupportTruncation The model cannot encode truncation policy.
ModelDoesNotSupportRequestHeaders The model does not expose request-scoped headers.
ModelDoesNotSupportExtraBody The provider-extension tag does not match the model profile.
InvalidModelSettings A portable value, tool selector, or request header is malformed.
ContentFiltered Provider filtering ended generation.
EmptyModelResponse A successful response had no usable parts.
IncompleteToolCall Generation ended inside a tool call.
ModelOutputTruncated Length termination prevented a complete result.
InvalidTypedOutput Validated structured output could not decode as the requested Zig type.
InvalidStructuredOutput Structured output could not decode for the final stream snapshot.
InvalidOutputSpec An output name, schema, alternative list, or prompt template is malformed.
ModelDoesNotSupportPromptedOutput Prompted output was selected for a model without instruction support.
OutputToolRequired Tool-output mode received no output-tool call before its retry budget ended.
OutputRetriesExceeded An output function or validator requested another attempt after its retry budget ended.
ProviderFileProviderMismatch A provider-managed file belongs to another provider.
PendingMessageQueueAlreadyUsed A one-run pending-message queue was attached again.
PendingMessageQueueClosed A message was submitted after the queue stopped accepting input.

Tools and deferred runs #

Error Meaning
DuplicateToolName Two local tools have the same provider-visible name.
DuplicateBuiltinTool A provider-managed tool identity was registered twice.
DuplicateCapabilityId Two composed capability scopes declare the same stable ID.
InvalidCapability A capability ID, metadata list, dependency, conflict, limit, or active-state declaration is invalid.
MissingCapabilityDependency A dependency ID is absent from the composed capability registry.
CapabilityDependencyCycle Capability dependencies contain a cycle.
CapabilityConflict Initial capability composition would activate two conflicting bundles.
UnknownTool The model requested a tool unavailable in the current step.
ParallelToolCallsNotSupported The model emitted parallel calls while policy disabled them.
ParallelToolCallsRequireIo Parallel execution requires an Io runtime.
ToolConcurrencyUnavailable The runtime cannot schedule the controlled tool tasks.
ToolIsolationRequiresIo A timeout or concurrency control requires Io.
ToolQueueOverflow Too many tool calls are waiting for a slot.
ToolResultTooLarge Encoded tool output exceeds its byte limit.
ToolFollowUpOverflow Tool follow-up count or aggregate bytes exceed policy.
ToolTimedOut A local tool exceeded its timeout.
ToolCallRequiresDeferredRun A normal run encountered approval or external execution.
MissingDeferredToolDecision A paused call has no resume decision.
UnexpectedDeferredToolDecision A decision does not match a paused call.
DeferredToolRequiresResult External execution resumed without a result.
InvalidDeferredState Paused state or resume JSON is malformed or incompatible.
InvalidContentRole A follow-up part is invalid for a request message.
InvalidToolFollowUpMessage A follow-up violates provider message invariants.

On-demand load failures such as UnknownCapability, CapabilityAlreadyAvailable, InvalidCapabilityArguments, and a dynamic CapabilityConflict are ordinary recoverable tool failures. They are returned to the model from load_capability; they do not escape as an agent setup error or partially activate a bundle.

Runtime control #

Error Meaning
Cancelled The run's cancellation token was signalled.
RunTimedOut The invocation deadline elapsed.
RunControlRequiresIo A deadline was configured without Io.
RunControlConcurrencyUnavailable The runtime cannot schedule an operation and its watchers.
RetryBackoffRequiresIo Retry sleep was configured without Io.
RetryIdempotencyRequiresIo Idempotent retry keys need an Io entropy source.

Security policy #

Error Meaning
InvalidUrl An outbound or provider-fetched value is not a valid absolute URL.
UrlMissingHost The URL has no network host.
UrlSchemeNotAllowed The URL is not HTTPS and HTTP was not enabled.
UrlCredentialsForbidden The URL embeds a username or password.
LocalNetworkUrlForbidden The URL uses a local name or non-public literal IP.
UrlHostNotAllowed The URL host is absent from an explicit allowlist.
UrlOriginNotAllowed A provider-directed URL does not match the configured API origin.

MCP authorization #

Error Meaning
InvalidAuthorizationIssuer A token, response, or metadata document is bound to a different authorization-server issuer.
MissingAuthorizationIssuer RFC 9207 support was advertised but the authorization response omitted iss.
InvalidAuthorizationServerMetadata Discovered OAuth/OIDC metadata is missing required fields or contains an ineligible endpoint.
InvalidProtectedResourceMetadata RFC 9728 metadata is malformed, mismatched, duplicated, or lacks Bearer-header support.
InvalidResourceUri The configured RFC 8707 resource is not an eligible canonical endpoint URI.
PkceUnsupported Authorization-server metadata does not advertise S256.
InvalidBearerChallenge A WWW-Authenticate Bearer challenge is malformed or ambiguous.
InvalidBearerToken A token is empty, unsafe for an HTTP header, malformed, or conflicts with a configured token provider.
InvalidOrigin A present browser Origin is malformed, duplicated, or outside the exact allowlist.
InvalidRequestHost A required Host is absent, malformed, duplicated, or does not match deployment policy.
InsecureHttpTransport A protected server request arrived over cleartext without an explicit development opt-in.

Provider errors #

All adapters use the stable ProviderRequestError categories.

Error Meaning Retried by default
ProviderConnectionError A recognized DNS, connect, or connection-lifetime failure. Yes
ProviderResponseDecodeError A success payload cannot be decoded. Yes
ProviderRateLimited HTTP 429. Yes
ProviderServerError HTTP 5xx. Yes
ProviderRequestFailed Another non-success status. No

Adapters additionally expose InvalidProviderResponse for direct decoder calls and InvalidRequestEncoding for unrepresentable input. OpenAI adds UnsupportedBuiltinTool and UnsupportedContentType. Anthropic adds UnsupportedContentType and UnsupportedOutputMode. Google adds UnsupportedContentType.

ProviderErrorObserver is infallible and synchronous. Its values are borrowed. Raw bodies are empty unless ProviderErrorPolicy.capture_body is enabled, and even then they cannot exceed max_body_bytes. Configured API keys are always suppressed; sensitive_data_redacted reports when this changed visible detail.

Provider construction and optional operations use these boundary errors:

Namespace Error Meaning
provider InvalidProviderPolicy Identity, API root, timeout, or URL policy is invalid.
provider UnsupportedProviderOperation The provider does not implement the requested discovery or file operation.
provider InvalidProviderFileInput Upload metadata is empty, oversized, unsafe for multipart framing, or unsupported by the provider.
provider ProviderFileTooLarge Upload bytes exceed the configured provider file limit.
provider InvalidProviderFileOwner A file handle or returned descriptor belongs to another provider.
provider InvalidProviderFileReference A file handle is empty, or an operation returned metadata for another file ID.
providers.http InvalidProviderCredential A credential is empty or unsafe for an HTTP header.
providers.http InvalidProviderEndpoint The API root or adapter endpoint is ambiguous or not relative.
providers.http InvalidProviderHeader A configured or adapter header is malformed.
providers.http ProviderHeaderConflict Two layers claim the same case-insensitive header name.

Transport and data errors #

Namespace Error Meaning
transport ResponseTooLarge A decompressed buffered body exceeded policy.
transport StreamLineTooLarge A decompressed stream line exceeded policy.
transport RequestCancelled Cancellation interrupted transport work.
transport RequestTimedOut The transport deadline elapsed.
transport StreamingNotSupported The transport has no line-streaming implementation.
transport UnsupportedCompressionMethod The response encoding cannot be decompressed.
transport RedirectRejected A 3xx response was rejected without following its target.
json DocumentTooLarge Encoded JSON exceeds its boundary limit.
json ValueTooLarge One decoded string or encoded number is too large.
json NestingTooDeep JSON nesting exceeds policy.
json CollectionTooLarge One object or array has too many entries.
json InvalidJson Input is not one complete JSON document.
json_schema InvalidJsonOutput Structured output is not valid JSON.
json_schema InvalidJsonSchema The configured schema is invalid.
json_schema UnsupportedJsonSchema The schema uses vocabulary outside ZigAI's documented fail-closed subset.
json_schema OutputSchemaValidationFailed Output does not satisfy the schema.
history InvalidHistory History JSON or message sequence is invalid.
history UnsupportedVersion The history version is unsupported.
codecs.pydantic_ai InvalidMessages Valid JSON does not have the PydanticAI stable-v2 message shape.
messages.ProviderDetails.fromValue InvalidProviderDetails Provider details are not a JSON object.
context_budget ContextSizeOverflow Byte or estimate arithmetic overflowed.
evals MissingExpectedOutput An evaluator requires an absent expected value.
evals InvalidModelGrade A model grader returned an invalid grade.

Agent specification errors #

Error Meaning
InvalidAgentSpec JSON/YAML shape, identifier, value, duplicate, or bound is invalid.
UnsupportedAgentSpecVersion The document version is not supported.
InvalidEnvironmentInterpolation A placeholder is malformed.
EnvironmentVariableNotAllowed A secret reference or placeholder is outside its explicit allowlist.
MissingEnvironmentVariable An allowed environment value is unavailable.
EmptySecret An allowed secret variable exists but is empty.
UnknownProvider / UnknownModel The application resolver does not recognize the selection.
InvalidProviderConfiguration The resolver rejects the expanded endpoint or provider fields.
UnknownCapability No implementation exists for a declared capability or dependency.
InvalidCapabilityImplementation A catalog entry is anonymous or returns a different ID.
InvalidCapabilityComposition The resolved registry has a structural, dependency, cycle, or conflict diagnostic.

ProviderResolver.buildFn is an application extension point. Its allocation, client-construction, and application errors propagate unchanged. Dry-run validation never invokes it.

MCP errors #

Error Meaning
EmptyCommand A stdio transport has no program command.
HeaderMismatch A header value violates its schema annotation.
InputRequired Elicitation needs input but no handler supplied it.
InvalidMcpHeaderAnnotation Tool header annotations are malformed.
InvalidMcpMessage A JSON-RPC message is malformed.
InvalidMcpResponse A result does not match its method shape.
InvalidMcpToolArguments Tool arguments are not a bounded JSON object.
InvalidMcpTransportConfiguration An MCP transport concurrency or buffering limit is invalid.
InvalidTaskStore A durable task snapshot is malformed or has an unsupported version.
McpHttpRequestFailed Streamable HTTP returned a non-success response.
McpMessageTooLarge An MCP message exceeded its byte limit.
McpPaginationCursorCycle A paginated collection repeated a cursor.
McpProcessClosed A stdio child closed before the matching response.
McpResponseIdMismatch A response ID does not match the request.
McpRpcError The peer returned a JSON-RPC error envelope.
McpStdioBackpressure A stdio transport reached its pending-request bound.
MissingMcpClient An MCP toolset has no client.
MissingMcpClientCapability A Tasks operation was attempted without the extension capability.
MissingMcpTaskStore Durable task resumption was requested without a store.
MissingMcpSseResponse Streamable HTTP did not produce the required SSE stream.
SubscriptionRecoveryRequiresIo A nonzero subscription recovery delay has no I/O runtime.
TaskPollingRequiresIo A nonzero task polling delay has no I/O runtime.
TaskStoreTooLarge A durable task snapshot exceeded its configured byte bound.
TooManyMcpPages Tool discovery exceeded the configured page limit.
TooManyMcpRoundTrips Elicitation exceeded its round-trip limit.
TooManyMcpTaskPolls A task remained non-terminal after its bounded polling budget.
UnsupportedMcpProtocolVersion Discovery negotiated an unsupported revision.

Application errors #

Tool functions, lifecycle hooks, stream sinks, dynamic instructions, history processors, selectors, evaluators, transports, telemetry exporters, and MCP handlers may return application-defined errors. ZigAI propagates them unchanged. They are intentionally not converted to ProviderConnectionError or another framework category.

The public callback contracts are split deliberately:

Callback Contract Reason
Provider error observer Infallible Observation cannot change request control flow.
Token estimator Infallible It performs borrowed, allocation-free counting.
Tool recovery classifier Infallible It classifies an error already produced.
Tool, model, and transport operations Fallible They perform application or external I/O work.
Stream, lifecycle, retry, and telemetry sinks Fallible Applications may stop a run when delivery fails.
Instructions, history, toolsets, selectors, and evaluators Fallible They may allocate or call application services.
MCP handlers and event sinks Fallible They cross application and protocol boundaries.

This keeps anyerror only at extension points where preserving the application's concrete error is part of the API. Framework-owned decisions use the named sets above.