Changelog
This changelog covers public developer-docs and API-contract changes.
On this page 1 of 17
Entries summarize customer-visible documentation and compatibility updates for the paid beta public API. Private operational and deployment notes stay out of the public changelog.
2026-08-10#
- New setup guides for two additional coding agents: OpenCode registers Keiro as an OpenAI-compatible provider in
opencode.json, and Pi adds a Keiro provider entry to~/.pi/agent/models.json. Both pages appear in the Build navigation alongside the existing Codex, Claude Code, and Omnigent guides.
2026-08-08#
/v1/messagesusage adopts Anthropic's native disjoint input-side semantics for all callers, effective with the next deployment:input_tokensexcludes the cached portions of the prompt, andinput_tokens + cache_read_input_tokens + cache_creation_input_tokensequals the full prompt. The previous additive-subset shape — the full inclusive count ininput_tokenswith the cache fields as subsets of it — is retired. Clients that readinput_tokensas the inclusive total should sum the three input-side fields to recover it; responses with zero cache activity are unchanged. See Messages.- Prompt tokens served from a prompt cache now bill at 0.1x the model's input rate on every public model. Cache writes carry no surcharge and bill at the standard input rate. The usage fields that report cached prompt portions are unchanged; only the billed amount drops. See Usage and billing.
2026-08-05#
- Requests refused by a platform-internal capacity gate now return
503 server_errorwith the new coderoute_capacity, a retriable condition carrying aRetry-Afterhorizon. These refusals previously surfaced as502 upstream_server_error, wrongly implying an upstream dependency; no upstream is involved and an unchanged retry usually succeeds within seconds.provider_unavailableremains reserved for genuine upstream unavailability.
2026-08-02#
eb1-previewandeb1-efficient-previewnow report acontext_window(andmax_input_tokens) of400000in/v1/models, up from120000;eb1-fast-previewreports240000. The previous figures were aggregated over the smallest reachable execution target, which is only correct for fixed ensembles; routed requests are admitted whenever any evaluated target fits, so the published number understated the window the API was already serving. The published figure remains a floor the API honors on every request;eb1-frontier-previewis unchanged at400000. Existing Codex setups pick up the new windows on their next setup run.- Context-overflow errors now report the enforced bound. The
Minprompt is too long: {N} tokens > {M} maximum(anddetails.context_window) is the largest limit the rejected request was actually evaluated against, in the same units as{N}, rather than the requested model's published window;{N} > {M}holds on every such error, so clients that trim by the reported gap now trim the right amount.
2026-07-29#
- Model IDs the API does not offer now return a uniform
404 model_not_foundthat names the public IDs, with403 model_not_availablereserved for public models your plan does not include. Previously some unknown IDs surfaced as availability errors. - Streamed Messages responses carry
thinkingsummary blocks, delivered throughthinking_deltaevents, when extended thinking is enabled. These blocks contain summary text constructed by the API and are unsigned; do not round-trip them as provider-signed thinking blocks. POST /v1/messages/count_tokensnow applies the same per-part minimums to image and document blocks that admission and billing apply, so multimodal estimates rise to match what is charged.- Validation errors on
/v1/messagesnow name fields in Messages coordinates (messages[i].content[j]) instead of the Responses spelling. /v1/messageserror bodies now carryerror.request_id, matching theX-Request-Idheader, completing the 2026-07-15 error-identification contract on the Messages surface.- The Claude Code installer verifies the key with one authenticated request before storing it, reports incomplete setups honestly, and gains an uninstall command.
eb1-frontier-previewnow reports acontext_windowof400000in/v1/models, up from128000. The raised figure remains a floor the API honors on every request: admission continues to validate against every execution target with the same safety margins as before. The120000windows oneb1-preview,eb1-fast-preview, andeb1-efficient-previeware unchanged, as are the legacy request identifiers accepted for compatibility. Requests remain subject to the organization's per-minute token budget (request_exceeds_capacity, see 2026-07-19). Existing Codex setups pick up the new window on their next setup run.- Routed preview requests rejected purely for context size now return
400 invalid_request_errorwithcodecontext_length_exceeded, matching every other context-overflow rejection. Previously this one path reported the genericrequest_requirements_unsatisfied. That code is now reserved for requests whose input, tool, reasoning, or media requirements cannot be satisfied together for reasons beyond context size alone.
2026-07-26#
- Stream lifetimes are now documented per-effort time entitlements instead of one flat internal timeout. A stream that is actively working is never ended for taking long: streams end early only on a documented idle timeout (90 seconds without model activity; 120 seconds at
xhighand above) or on the wall-clock ceiling for the requested reasoning effort (5 minutes atnone/minimalup to 60 minutes atmax/ultra). Requests that do not set a reasoning effort resolve no lower than themediumrow (10 minutes);eb1-frontier-previewdefaults to themaxrow. Previously, long runs could be interrupted near 600 seconds even while the model was still working. - When a stream deadline fires, the run ends with one honest terminal instead of a spurious error: Responses streams carry
response.incompletewithincomplete_details.reasonofstream_idle_timeoutorstream_ceiling_timeout; Chat Completions reportsfinish_reasonlengthand Messages reportsstop_reasonmax_tokens. Tokens consumed before the stop are billed; the terminal event is truthful about why the run stopped. See Streaming.
2026-07-22#
- The discoverable model catalog is
eb1-preview,eb1-frontier-preview,eb1-fast-preview, andeb1-efficient-preview, superseding the naming contract published on 2026-07-20. Theeb1-preview-efficient,eb1-preview-fast, andeb1-preview-deltaidentifiers remain accepted on requests and in stored conversations with unchanged behavior and pricing, but no longer appear in/v1/models, Console menus, CLI listings, or Codex setup. Responses to requests that use one of those identifiers name the canonical id; responses toeb1-preview-deltarequests nameeb1-delta-preview, which remains callable but does not appear in discovery. - Invalid model-exclusion inputs now return the governed, non-retriable
400 invalid_request_errorenvelope withcodebad_request. Previously these caller-fixable requests could be serialized as a retriable502 upstream_error. Synchronous responses now carryx-should-retry: false; synchronous bodies and streaming error frames carryretryable: falsewith no retry horizon.
2026-07-20#
- Public discovery, Console, CLI, and Codex now use one four-model naming contract:
eb1-preview,eb1-preview-efficient,eb1-preview-fast, andeb1-preview-delta. Existing stored configurations using earlier preview spellings remain request-compatible, but new configuration and response identity use the current IDs. - Keiro 0.12.22 requests safe reasoning summaries for registered eb1 models and displays available segments while a response is in progress. These segments are terminal activity, not assistant answer text: they do not enter conversation history, copied code blocks, or piped stdout. Python callers can consume the same validated stream separately with
ModelsAPI.responses_stream(on_reasoning_summary=...)or its admin sibling. Direct-provider requests receive no implicit summary setting.
2026-07-19#
- Responses usage now reports provider-supplied prompt-cache reads and writes in
input_tokens_details.cached_tokensandcache_write_tokens, instead of always reporting zero. Both are subsets ofinput_tokensand do not changetotal_tokens. The Console chat tester preserves those reported cache-read counts andoutput_tokens_details.reasoning_tokensin a compact Token details disclosure when those subsets are positive; required structural zeroes remain undisclosed because they do not prove provider provenance. It labels arithmetic totals and remainders as derived and does not fabricate system-prompt, history, user-message, or tool-schema buckets that the API does not separately report. - Published context windows now match the limit the API enforces end to end.
eb1-preview,eb1-efficient-preview, andeb1-fast-previewreport acontext_windowof120000in/v1/models, down from the previously published128000;eb1-frontier-previewis unchanged at128000. Requests between the two figures could previously be rejected with a context-overflow error despite sitting inside the published window; the published figure is now a floor the API honors on every request. - Requests whose selected model cannot satisfy every input, tool, reasoning, and context requirement now fail before dispatch with non-retriable HTTP 400 code
request_requirements_unsatisfied. - Requests whose token estimate exceeds a full minute of the organization's token-per-minute budget now return a terminal
400 invalid_request_errorwithcoderequest_exceeds_capacity, instead of a429rate limit. The old429carried aRetry-Afterheader even though no unchanged retry could ever succeed, trapping status-driven clients in an infinite retry loop. The new response carriesx-should-retry: false, no retry horizon, and nox-ratelimit-reset-*-tokensheader; the message anddetails.dimension: "token_budget_request"are unchanged. Reduce the input ormax_output_tokens, or raise the limit, and resend.
2026-07-18#
- Usage objects on OpenAI-format surfaces now itemize reasoning tokens and follow the standard arithmetic exactly. Chat Completions usage gains
completion_tokens_details(withreasoning_tokens), andtotal_tokensalways equalsprompt_tokens + completion_tokens, with reasoning counted insidecompletion_tokens. Previously, reasoning-heavy requests could report atotal_tokenslarger than the visible sum with no breakdown. - Responses usage now matches the standard
ResponseUsageschema:input_tokens,input_tokens_details.cached_tokens,output_tokens,output_tokens_details.reasoning_tokens, andtotal_tokens(= input_tokens + output_tokens). The former non-standard flatreasoning_tokenskey and theprompt_tokens/completion_tokensaliases are removed. Strict typed SDK clients that previously failed to validate usage now parse it; clients reading the flat keys must switch to the nested fields. /v1/messagesoutput_tokensnow includes reasoning tokens, matching the Anthropic convention that thinking is part of output.usagedetail objects reportcached_tokens: 0for now; prompt-cache accounting is not yet reflected in usage counts.
2026-07-17#
- Retired the
/v24bversioned endpoint path. It no longer differs from the current default deployment, so requests to/v24b/v1/*now return410 endpoint_retiredinstead of routing to current-default weights under a versioned label. Use the default API (/v1). - The Keiro CLI no longer offers a
v24bendpoint preset.keiro endpoint v24b, saved v24b gateway URLs, and explicit v24b URLs surface the retirement guidance instead of binding to the default gateway.
2026-07-15#
- Missing pricing for an otherwise valid model now returns the governed, non-retriable
404 model_not_foundenvelope withx-should-retry: false. - Chat Completions stream error frames now nest a full
errorobject (code, type, message, retry signals,retryable,request_id, anddetailson limit denials) alongside the existing flat fields. OpenAI-compatible SDKs surface it as a typed error instead of failing to parse the frame. The flat fields are deprecated (removal is at least two releases out and gated on usage telemetry); Messages and Responses stream error frames gain the samedetailsobject on limit denials. /v1/messagesresponses now also carry arequest-idheader (an alias ofX-Request-Id) so Anthropic-compatible SDKs populate.request_id.- Responses that produced no output because reasoning consumed the entire completion budget now report
status: "incomplete"withincomplete_details.reason: "max_output_tokens"and awarningnaming the fix, instead of claiming success; Chat Completions reportfinish_reason: "length". Billed usage is unchanged and still reported. - Error messages no longer carry
[Error NNNN]/[Recovery: …]bracket furniture; recovery guidance appears as a plain sentence only when it applies to the specific failure. Message text remains non-contractual. - Corrected upstream authentication failures to a fixed
502withcodeupstream_auth_error. Previously an upstream401could pass through as your fault; SDKs raisedAuthenticationErrorand stopped retrying for a platform-side condition. Your API key is valid when you see this code. - Replaced the
401codeauthentication_error(which duplicatedtype) with three specific codes:missing_authorization,bearer_scheme_required, andinvalid_api_key(with a redacteddetails.key_hint). Code-matching clients keep working: the old code's value remains as the errortype. All401responses now carryWWW-Authenticate: Bearer. error.paramis now populated with the offending field name where known; previously documented as alwaysnull.- Documented every error code with per-code anchors, added
413and415to the status table, and removed the never-emitted408row. - Added retry-signal headers to error responses:
retry-after-ms(milliseconds, fractional precision) on retriable denials andx-should-retry: falseon denials an unchanged retry cannot clear. Deterministic denials also carry"retryable": falsein the error body. - Error responses now include
error.request_id, matching theX-Request-Idheader; stream error frames carry it on the Messages and Responses wires.
2026-07-10#
- Added an API reference index and dedicated guides for Messages, function tools, image input, API-key lifecycle, usage and billing, and Codex setup.
- Reworked Quickstart into an install-to-output workflow with one credential policy: saved Keiro credentials, interactive curl/Python secrets, and secret-file references for other runtimes.
- Reconciled API-key guidance with the console's create, staged-replacement, and delete/revoke workflow.
- Added contextual related-page paths throughout the documentation.
- Corrected the subprocessor description: authenticated docs are served by Keiro-operated services, while Netlify hosts the public website, early-access intake, and published status artifact.
2026-07-01#
- Documented idempotent requests, including the
Idempotency-Keyheader, theX-Idempotent-ReplayandX-Original-Request-Idreplay headers, and409 idempotency_key_conflictconflicts. - Documented the
409status code and clarified that the errorparamfield is alwaysnull. - Added a Responses streaming event taxonomy.
- Documented Netlify's hosting purpose for the public website, early-access intake, and published status artifact.
2026-06-25#
- Added shared Keiro Labs web-surface tokens to generated docs.
- Added skip links, active sidebar navigation, canonical URLs, Open Graph URLs, and table scrolling to the docs shell.
- Updated docs Markdown rendering for emphasis, blockquotes, h4-h6 headings, and in-list code fences.
- Updated rate-limit retry guidance to honor
Retry-After.
2026-06-15#
- Added initial paid beta public docs surface.
- Standardized runnable examples on one public base URL.
- Documented chat completions, responses, streaming, models, rate limits, errors, SDKs, support, and migration guidance.
- Kept local
keiro guiscoped to chat UX only.