Repository navigation
Releases: hrygo/CLIProxyAPI
Releases · hrygo/CLIProxyAPI
Release list
v1.3.5-upstream8.0.35
v1.3.5-upstream8.0.35 - 2026-10-28
Summary
/v1/messagesturns that keep the reservedDeferredToolPlaceholderbut no longer declare aToolSearchfunction are now forwarded instead of being rejected locally with422 deferred bridge requires an active client ToolSearch declaration.- Routes configured with
client-search: disablednow reject every turn that declaresToolSearch, even when the bridge would forward the body unchanged. - Compatibility: no configuration change is required. Requests that previously failed now complete with the surviving declarations, while discovery history that cannot be replayed and forced tool choices naming a dropped declaration still fail with
422.
Upstream alignment
- Upstream release:
v8.0.35 - Previous baseline:
v8.0.35 - Intake record: absorbed.md
- Ported: None. This release ports no new upstream work; it is built on the
v8.0.35baseline, so the tag keeps the previous suffix. - Skipped: The exclusions recorded for the
v8.0.35intake remain in force: the separate upstreamapply_patchpipeline and its tests, synthesized fetch entries and visibility changes, and catalog or prompt snapshots.
Breaking changes
- None.
Added
- None.
Changed
- A placeholder-only turn now degrades: the reserved placeholder and the deferred declarations that no discovery result activated are dropped, and
defer_loadingis stripped before the non-Anthropic translator runs. client-search: disablednow rejects every turn that declaresToolSearch, including one the bridge would have forwarded unchanged. This matches the Responses pipeline, which triggers on the declared client search contract, and the documented meaning of the policy.
Fixed
- A Claude Code turn that carries
DeferredToolPlaceholderwithdefer_loading: trueand noToolSearchdeclaration no longer fails in a few milliseconds with422 unsupported_protocol. Such a turn is forwarded with its remaining declarations, so an eager conversation that still advertises deferred support completes. - A forced
tool_choicethat names a dropped declaration is still rejected with422 forced tool is not active after discovery, and a history containing a search call or atool_referenceresult without an activeToolSearchdeclaration is still rejected with422 deferred history requires an active client ToolSearch declaration. - The degrade decision is structural: caller text and tool arguments are never read as discovery, while escaped spellings, duplicate JSON members and lossy Unicode are still inspected and refused by the existing checks.
Security
- None.
Validation
- Regression gate PASS on the release candidate with Go 1.26.4:
gofmt,go vet ./...,go test ./... -count=1(102 packages) and a server build. - Red-green: restoring the unconditional guard fails four unit subtests, two executor-level cases and two route-policy cases.
- Live end-to-end with a locally built binary, a temporary configuration and a fake OpenAI-compatible upstream on isolated loopback ports:
mainbefore the fix answered422in 1.5 ms without contacting the upstream; this candidate answered200in 1.9 ms and the upstream receivedGlob,GrepandReadonly, without the placeholder ordefer_loading. - Coverage limit: these checks use synthetic requests and a deterministic fake upstream, not a live provider or a real Claude Code client session; server-executed declarations and multi-provider routing were not exercised.
Known issues
- Discovery history without an active
ToolSearchdeclaration is rejected rather than rewritten, because dropping the search round can leave later calls to tools that are no longer declared; such a turn must declareToolSearchagain. - A
tool_resultthat mixestool_referencewith text, image or error blocks remains unsupported and is rejected with422, because no contract preserves every component. - Anthropic server-executed declarations such as
tool_search_tool_regex_20251119are forwarded as ordinary functions and are not executed by the gateway.
Release assets
CLIProxyAPI_<version>_linux_<arch>.tar.gzis the default Linux build. It supports dynamic library plugins and targets a GLIBC 2.17 baseline.CLIProxyAPI_<version>_linux_<arch>_no-plugin.tar.gzis the portable Linux build for musl-based or older systems such as OpenWrt. It does not support dynamic library plugins.CLIProxyAPI_<version>_freebsd_aarch64_no-plugin.tar.gzis the FreeBSD arm64 build. It is built without CGO and does not support dynamic library plugins.
Full changelog
v1.3.4-upstream8.0.35
v1.3.4-upstream8.0.35 - 2026-10-24
Summary
- Add an opt-in
requests.streaming.bootstrap-timeoutthat bounds one streaming attempt's request-to-first-frame wait, so an upstream that accepts a request and never writes a frame is retried within the existingbootstrap-retriesbudget or rejected with504instead of holding the client's response open indefinitely. - Include the three upstream repairs merged after
v1.3.3-upstream8.0.35: Codex multi-line SSE event assembly, Interactions fallback item IDs, and the model-template fallback. - Compatibility: the new option defaults to
0(unbounded), so an existing configuration behaves exactly as before until an operator opts in; no credential, provider or protocol behaviour changes.
Upstream alignment
- Upstream release:
v8.0.35 - Previous baseline:
v8.0.35 - Intake record: absorbed.md
- Ported: The three repairs already recorded in the intake ledger: upstream
7795de19ca80940adeafe45ebe7c5dbfc4931cc5(Codex HTTP execute and stream paths assemble multi-line SSE data events with the upstream scanner and its raw-line budget accounting), upstreamb0db5448e8f8cce9b58e5d02eab23d32d4ec5dca(Interactions fallback item IDs become per-response UUID-prefixed) and upstreame240bd84321c55b96b226d43fa557c9a8be55a00(Codex and multi-agent templates fall back to the first valid model template whengpt-5.5is absent, still preferring it when present). The bootstrap timeout is fork-local and ports no upstream work. - Skipped: The exclusions recorded for those ports remain in force: the separate upstream
apply_patchpipeline and its tests, synthesized fetch entries and visibility changes, and catalog or prompt snapshots. Broader upstream feature and concurrency chains reviewed in the intake decisions remain excluded.
Breaking changes
- None.
requests.streaming.bootstrap-timeoutis new and defaults to0, which keeps the previous unbounded bootstrap wait; only an explicit positive value changes runtime behaviour.
Added
requests.streaming.bootstrap-timeoutbounds how long one streaming attempt may wait for its first upstream frame. It accepts a duration (90s,1m30s) or whole seconds (90); an empty value and0,none,off,never,unlimited,disabledor an unparsable value mean unbounded, which is also the default.- When the bound expires, the attempt is cancelled and either retried within
requests.streaming.bootstrap-retriesor answered with504and the messageupstream produced no frame within bootstrap timeout <duration>, written before any SSE byte is sent.
Changed
- A streaming attempt that produced no client-visible frame now releases its derived context and its deadline timer, while an attempt that delivered a frame keeps its context for the rest of the stream.
- Retries consumed by the bootstrap deadline share the same counter as retries triggered by an upstream error, so
bootstrap-retriesremains the single budget, and the Home dispatcher still forces zero retries.
Fixed
- A silent upstream no longer holds the streaming chat completions endpoints open with zero bytes until the client times out. In an observed incident the gateway held the request for exactly 300 s, its keep-alive ticker could not run because SSE headers are committed only after the first upstream chunk, and the failure surfaced only as a client-side idle timeout. With
bootstrap-timeoutconfigured the gateway abandons the attempt, retries it when the budget allows, and otherwise answers504before the client's own deadline. - Codex streaming and buffered responses assemble multi-line SSE
data:events with the upstream scanner instead of dropping them, while the raw bootstrap budgets, replay, responses-tools and cancellation paths are retained. - Interactions fallback item IDs are scoped to each response, so two responses no longer collide on the same fallback ID; supplied IDs and namespaced custom tools keep their existing handling.
- Codex and multi-agent templates fall back to the first valid model template when
gpt-5.5is absent, instead of rejecting the catalog entry;gpt-5.5is still preferred when present.
Security
- None. The option adds no endpoint, reads no new credential and logs no request content.
Validation
- Regression gate PASS on the release candidate with Go 1.26.0:
gofmt, the tracked catalog validation,go vet ./...,go test ./... -count=1and a server build. - Focused evidence for the bootstrap timeout:
gofmtclean on both Go 1.26.0 and Go 1.27.2,go vet ./...clean, and new tests covering a deadline-abandoned attempt retried to success,504when the retry budget is exhausted, a silent upstream consuming exactly one retry, the configuration parsing table and the accessor. - Measured end-to-end evidence with a locally built binary on isolated ports (
127.0.0.1:18317-18319) against a local upstream that accepts a request and never writes a byte: the default configuration stayed silent with no bytes for 8 s;bootstrap-timeout: 3swithbootstrap-retries: 1answered504in 6.00 s after exactly two upstream requests; and an upstream that stalled once and then served returned HTTP200with real SSE content in 3.0 s. - The three ported repairs carry their own recorded evidence in the intake ledger: behavioural replay fails on the baseline and passes on the candidate, package tests and the server build pass, and each commit received an independent read-only review.
- Coverage limit: the end-to-end checks use a deterministic local upstream, not a live provider or a desktop client; multi-provider performance was not measured.
Known issues
- Plugin-executor routes (
streamWithPluginExecutor) do not use this bootstrap path, so a routed plugin executor can still stay silent during bootstrap. - Silence after the first frame remains unbounded by design: the option intentionally bounds only the wait for the first frame and does not replace a general stream idle timeout.
- One initial unrelated Antigravity credits assertion was recorded during the ported-repair validation and is preserved in the intake evidence; its cause was not established and no stage was waived.
Release assets
CLIProxyAPI_<version>_linux_<arch>.tar.gzis the default Linux build. It supports dynamic library plugins and targets a GLIBC 2.17 baseline.CLIProxyAPI_<version>_linux_<arch>_no-plugin.tar.gzis the portable Linux build for musl-based or older systems such as OpenWrt. It does not support dynamic library plugins.CLIProxyAPI_<version>_freebsd_aarch64_no-plugin.tar.gzis the FreeBSD arm64 build. It is built without CGO and does not support dynamic library plugins.
Full changelog
v1.3.3-upstream8.0.35
v1.3.3-upstream8.0.35 - 2026-10-23
Summary
- Improve tool-call replay, Gemini/Vertex request compatibility, credential recovery and streaming responses through 25 selectively reviewed upstream repairs.
- Prevent plaintext management secrets from entering newly seeded remote configuration and escape access-log paths.
- Preserve existing configuration, public translator signatures and the fork's responses-tools pipeline. No operator configuration migration is required.
Upstream alignment
- Upstream release:
v8.0.35 - Previous baseline:
v8.0.23 - Intake record: absorbed.md
- Ported: 25 individually reviewed repairs from v8.0.23 through v8.0.35, integrated by PR #32 at
6efd7088. The intake report and 232-SHA decision manifest retain the exact mapping and adaptations. - Skipped: 144 other mature commits, including 18 merge wrappers, and 63 later commits through v8.0.39. Broad features, partial auth/watcher/config concurrency chains, schema cleaners with confirmed defects and the later toolchain/dependency bump remain deferred. Alignment is selective, not the whole upstream release.
Breaking changes
- None for supported requests and configuration. Existing local config and authentication material are retained during installation; no service manager or listener configuration change is required.
Added
- Focused compatibility coverage for Kimi namespaced/input tool lists and Vertex API-key resource prefixes, retaining existing API contracts.
Changed
- Meta subscription telemetry is filtered from downstream responses, SSE and WebSocket forwarding while normal output, usage and completion handling remain with the fork pipeline.
- Claude explicit per-minute limits with a short Retry-After use the narrow cooldown; HTTP status errors retain precedence over textual transport-error classification.
- Empty Home catalogs succeed while error envelopes and malformed records still fail. No Home wire shape changes.
Fixed
- Shorten overlong Codex call IDs without losing output associations or colliding with existing IDs; preserve exact wrapped MCP tool names and unique Gemini-to-Claude tool-use IDs.
- Remove mathematically integral schema bounds outside int64 while preserving valid fractional bounds, schema literals and exact limits.
- Normalize Gemini media function-response boundaries and remove replayed trailing thought-only turns before Vertex payload overrides, retaining the existing post-rule boundary normalization.
- Correct cache-aware Antigravity token accounting and Devin stream estimates; omit absent tool_calls fields and ignore invalid/null Claude cache controls.
- Honor complete Vertex publisher/version prefixes for execution, streaming and token counting, and omit unsupported xAI web_search options.
- Recover expired Antigravity negative-credit hints, preserve plugin auth identity with relative configured paths, and use active Devin/Meta model getters with credential-quota availability handling.
- Treat closed HTTP/2 connections as transient lifecycle failures without penalizing healthy credentials.
Security
- Hash management secrets before newly seeded Git/object/SQL configuration persistence. Invalid YAML or aliases retaining plaintext refuse the seed. This protects newly seeded configurations; it does not rewrite previously published remote history or rotate secrets.
- Escape request paths in access logs to prevent injected line breaks. Existing authentication, authorization and listener policies remain unchanged.
Validation
- The clean baseline and intake candidate passed the complete Go 1.26.4 maintenance gate, including maintenance fixtures, pinned formatting, vet, responses-tools invariants, full Go tests, seven race-sensitive packages and server build. Offline tracked Codex catalog validation passed separately.
- All 25 ports have observed behavioral failures before their repair and passing affected packages afterward. Complete-source replay with identical inputs produced 16 expected failures and 5 passing controls on the baseline, and 21 passes on the candidate, without compilation failures.
- Additional race checks passed for config, store, pluginhost, API and OpenAI handlers. Cache-control and int64 predicate mutations are rejected by regression tests.
- Independent whole-branch review approved the intake with no blocking findings. PR #32's exact-head build passed, and its protected squash tree matched the verified head.
- Release preparation changes release documentation only. Release CI repeats the complete gate, builds ten platform archives, and checks downloaded asset hashes before publishing. Cross-platform builds do not establish live client/provider compatibility on every target.
Known issues
- Existing auth stale-success cooldown, uncertain watcher scans and config-publication concurrency risks remain outside this conservative intake; their complete upstream chains require a separate review.
- Confirmed upstream schema defects are tracked as router-for-me#6897 and router-for-me#6898; affected cleaners were excluded.
- A direct WebSocket-forward telemetry regression is an optional test follow-up. Meta executor/SSE tests pass; independent review found no current implementation defect in that filter.
- No new live official-client/provider performance measurement, task success-rate or cost-saving claim is made. The fork integral-float canonicalizer, recursive local-ref flattening and responses-tools pipeline remain necessary.
Release assets
CLIProxyAPI_<version>_linux_<arch>.tar.gzis the default Linux build. It supports dynamic library plugins and targets a GLIBC 2.17 baseline.CLIProxyAPI_<version>_linux_<arch>_no-plugin.tar.gzis the portable Linux build for musl-based or older systems such as OpenWrt. It does not support dynamic library plugins.CLIProxyAPI_<version>_freebsd_aarch64_no-plugin.tar.gzis the FreeBSD arm64 build. It is built without CGO and does not support dynamic library plugins.
Full changelog
v1.3.2-upstream8.0.23
v1.3.2-upstream8.0.23 - 2026-10-14
Summary
- Improve cross-provider compatibility and credential concurrency through selective absorption of upstream v8.0.23, preserving the fork's responses-tools authorization and exact tool identity handling.
- Correct tool-call ID replay, image-model routing, stream termination and usage reporting without a configuration migration or public request-converter signature change.
- Publishing this release does not install a binary, update operator configuration or restart a running service.
Upstream alignment
- Upstream release:
v8.0.23 - Previous baseline:
v8.0.16 - Intake record: absorbed.md
- Ported: 26 individually reviewed upstream commits from v8.0.16 through v8.0.23, including 25 ports with production changes and one regression port for an equivalent existing xAI fix. PR #28 merged the verified intake into main at
63aa6004. - Skipped: 15 non-merge commits were deferred or inapplicable, and six merge wrappers had no independent behavior. The ledger records every SHA and reason. Deferred work includes the attachment/error-converter chain, public converter signature migration, TTS, global GitHub credentials, the npm version updater, Vertex native Interactions, Responses WebSocket interrupt and Claude Responses compaction. This is selective alignment, not incorporation of the whole upstream release.
Breaking changes
- None for supported requests and configurations. Existing converter signatures, configuration fields and installed services are retained.
Added
- No new public API endpoint or configuration option. Package-level regression tests cover the compatibility fixes and retained fork contracts.
Changed
- xAI keepalive test fixtures wait for the complete request after Pong delivery before sending the terminal response, removing a premature-close race without changing production WebSocket behavior.
- Claude system-instruction placement follows OAuth and conversation layout while retaining fork CLI detection, session-date pinning, cache behavior and OAuth tool aliases.
- OpenAI-compatible streaming TTFT observes effective token frames before translation or downstream backpressure, rather than counting an early empty or role-only frame as a token.
- Disabled or unselected plugins are detached during configuration application. The v8 configuration API renders collections and mapping keys consistently in YAML.
Fixed
- In-flight token refreshes and late execution results no longer overwrite or penalize credentials updated concurrently; active quota cooldowns survive successful refreshes, and batch model registration reconciles concurrent auth changes.
- Gemini-to-Claude translation preserves camelCase system instructions, refusal reasons and signed visible-text/tool-call carriers while retaining exact tool-name restoration.
- Vertex streams do not record client cancellation as failure after a terminal chunk has actually been delivered. Real read failures still cannot synthesize successful completion.
- Muse Responses requests preserve foreign reasoning ciphertext. Claude missing-thread errors support plain and structured bodies, JSON SSE errors remain on one line, and model output defaults respect registered limits.
- Claude rate-limit parsing excludes overage billing reset times, and trailing stream usage remains authoritative. Antigravity completion-token counts include thinking tokens.
- Devin tool-call IDs are encoded reversibly and restored for upstream history. Claude repairs non-portable legacy call/result IDs with collision handling before final generation payload rules; explicit overrides and filters remain authoritative. Native and local token-count paths also repair ID pairs.
- Direct OpenAI image requests preserve resolved upstream model identities across JSON and multipart requests; payload rules are applied once after normalization.
- Home-dispatched credentials bypass redundant local availability filtering. Existing Home protocol fields remain unchanged.
- xAI replacement-connection terminal cleanup matches upstream; the upstream regression test now covers the existing equivalent fork fix without adding a second implementation.
Security
- Preserve final outbound tool-contract checks, exact identity restoration and availability-neutral handling of preparation failures. Credential-version and registration guards also cover fork-specific stream failure paths.
- Gateway protocol validation continues to complement client and MCP execution authorization; it does not replace those permissions. No new credential source or default permission is introduced.
Validation
- The final
v1.3.2candidate passed the full seven-stage Go 1.26.4 maintenance gate after the fixture fix, including the full Go suite, all seven race-sensitive packages and the server build. - The unpublished
v1.3.1-upstream8.0.23release gate exposed a sessionless xAI keepalive fixture race. The unchanged test reproduced locally in 100 runs. Both corrected xAI keepalive tests passed 100 repetitions each, with and without the race detector; their assertions still require Pong delivery while the payload write is held. The failed tag remains unchanged. - The clean baseline
5349958cand production candidate439e9f12passedGOTOOLCHAIN=go1.26.4 bash ops/upstream-intake/verify-absorb.sh: maintenance tooling, pinned gofmt, vet, responses-tools invariants, the full Go suite, seven race-sensitive packages and server build. - PR #28 CI and post-merge main CI passed. The intake merged with the verified PR tree. Subsequent release preparation changes only the two xAI keepalive fixtures and release notes; production source remains unchanged.
- Identical frozen inputs on complete baseline and candidate source trees cover four leaf cases: camelCase Gemini system instructions, JSON SSE errors, and Antigravity token accounting with and without visible output tokens. All four fail on the expected baseline assertions and pass on the candidate.
- A temporary mutation removing pre-policy Claude ID repair makes both Execute and ExecuteStream ordering regressions fail; the unmodified candidate passes. Vertex API-key/service-account and Home dispatch tests use isolated local fixtures.
- Release CI repeats the full maintenance gate and publishes only after all ten platform archives and the downloaded assets' SHA256 checksums are verified. Platform builds do not certify real client behavior on every operating system.
Known issues
- This intake adds no live official-client/provider performance run or new task success-rate, token-saving or cost-saving claim. Earlier tool-loading reports retain their original versions and measurement limits.
- Responses WebSocket interrupt, Claude Responses compaction, native Vertex Interactions and the deferred attachment-rejection/error-converter contracts are not included. The existing public request-converter return type is retained.
- Finalizer-only payload-rule behavior for Devin and count_tokens, live Home deployment behavior, complete dynamic permission revocation and broad cancellation coverage are not certified by this release. See the intake ledger for the exact deferred dependencies and replay boundary.
Release assets
CLIProxyAPI_<version>_linux_<arch>.tar.gzis the default Linux build. It supports dynamic library plugins and targets a GLIBC 2.17 baseline.CLIProxyAPI_<version>_linux_<arch>_no-plugin.tar.gzis the portable Linux build for musl-based or older systems such as OpenWrt. It does not support dynamic library plugins.CLIProxyAPI_<version>_freebsd_aarch64_no-plugin.tar.gzis the FreeBSD arm64 build. It is built without CGO and does not support dynamic library plugins.
Full changelog
v1.3.0-upstream8.0.16
v1.3.0-upstream8.0.16 - 2026-10-14
Summary
- Improve cross-provider deferred tool loading for official Codex and Claude Code through CLIProxyAPI, with stricter declaration, identity, replay, and terminal-state handling.
- Ship reusable performance reproduction tools and consolidated implementation, compatibility, and per-request token reports. Client and model coverage remains explicitly bounded.
- No configuration migration or automatic installation is required; existing operator configuration and running services are not changed by this release.
Upstream alignment
- Upstream release:
v8.0.16 - Previous baseline:
v8.0.16 - Intake record: absorbed.md
- Ported: No new upstream work. This release contains fork fixes and compatible additions on the baseline already shipped in
v1.2.0-upstream8.0.16. - Skipped: No newer upstream release was assessed or absorbed for this release; prior intake exclusions remain unchanged.
Breaking changes
- None for supported requests and configurations. Previously tolerated malformed or over-budget requests can now be rejected before upstream dispatch.
Added
- Unified handling of Claude deferred declarations and Responses Lite
additional_tools, including cumulative activation and active declaration budgets. - Structured preparation, replay, and failure diagnostics, plus SDK observers for controlled HTTP-attempt accounting.
- Reusable tools for installed official Codex and Claude Code, real stdio MCP coding tasks, bounded eager/lazy comparisons, and numeric usage export; no client source build is required.
Changed
- Active declaration budgets are checked after pruning and across discovery rounds; tools announced as active must have valid declarations.
- Protocol handling uses actual declaration and history positions, preserving ordinary schema and argument data that resembles tool protocol markers.
- Final tool-loading evidence is consolidated into three reports; one-off probes and private runtime artifacts are excluded from repository deliverables.
Fixed
- GPT Responses Lite search call formatting, Muse activation and aliases, and Lite additional-tool promotion, namespace merging, and description recovery.
- Tool identity collisions, Unicode information loss, escaped custom-tool handling, buffered bridge-alias restoration, and native multi-result argument/replay validation.
- Final outbound declaration checks for Claude routes, forced tool choices, hosted identities, retries, and WebSocket preparation/error ordering.
- Reasoning-only responses with an explicit source finish now terminate correctly; genuinely truncated streams or missing source termination still fail instead of fabricating completion.
- CI fixtures now synchronize WebSocket upload completion, match TTFT usage to the correct execution, and reserve retry connection order before the upgrade handshake. The performance dependency manifest no longer recursively includes itself.
Security
- Invalid tool declarations, choices, identities, and replay arguments are rejected before dispatch in the covered paths. Gateway declaration validation does not replace client or MCP execution authorization.
- No credential, default operator configuration, or deprecated management endpoint migration is included.
Validation
- The post-merge
mainCI passed on9269d6c2: maintenance checks, offline accounting and model catalog checks, tracked formatting,go vet, full Go tests, and server build with Go1.26.4(CI run). - The local
GOTOOLCHAIN=go1.26.4 bash ops/upstream-intake/verify-absorb.shgate passed on the merged runtime source, including all seven race-sensitive packages; release preparation changes only documentation. - Official Codex
0.160.0and Claude Code2.1.289were tested against fixed GPT, Muse, GLM, and Gemini routes on the documented frozen candidate: 15 cases finished, 7 strictly passed, and 10 passed independent code checks. Three successful comparable pairs reduced cumulative input, including cached input, by 71.84%–91.02%; these are fixed-task observations, not a reliability or billing guarantee. All failures, retries, unknown usage, and budget stops remain in the reports. - Publication is gated on the full maintenance regression gate, including race-sensitive packages, and successful verification of all ten platform archives and their checksums. Platform archive builds do not certify live behavior on every operating system.
Known issues
- Compatibility depends on client version, effective mode, model, and route. Gemini/Antigravity Code Mode history and authoritative usage remain unverified; Claude/Gemini encountered upstream HTTP 429. Muse/Codex lazy loading order and GLM tool execution did not satisfy all acceptance checks, and one planned case was not started after the budget was exhausted.
- Complete dynamic permission revocation, all cancellation entry points, hosted execution authorization, broad live WebSocket coverage, and representative long-task quality/cost benefits are not certified. The documented official Codex cancellation propagation gap remains a client boundary.
- See the implementation report, verification and compatibility report, and complete token report for exact versions, route results, metric definitions, and all 76 final physical attempts.
Release assets
CLIProxyAPI_<version>_linux_<arch>.tar.gzis the default Linux build. It supports dynamic library plugins and targets a GLIBC 2.17 baseline.CLIProxyAPI_<version>_linux_<arch>_no-plugin.tar.gzis the portable Linux build for musl-based or older systems such as OpenWrt. It does not support dynamic library plugins.CLIProxyAPI_<version>_freebsd_aarch64_no-plugin.tar.gzis the FreeBSD arm64 build. It is built without CGO and does not support dynamic library plugins.
Full changelog
v1.2.0-upstream8.0.16
v1.2.0-upstream8.0.16 - 2026-10-09
Summary
- Absorb deferred upstream v8.0.13 maintenance work and selective upstream v8.0.16 fixes on top of v1.1.2.
- Restore Claude 4.6 model definitions (operator-confirmed still live on Antigravity) and add Claude 5.5 CAQS thinking-signature replay support.
- Complete the upstream websocket-disconnect propagation port for xAI connections so a stale terminal error cannot leak across retry dials.
- No configuration migration, module-path change, or deprecated management-endpoint change.
Upstream alignment
- Upstream release:
v8.0.16 - Previous baseline:
v8.0.7 - Intake record: absorbed.md
- Ported: deferred v8.0.13 auth locking, model lifecycle/cooldown, probe coalescing, shared upstream configuration with historical aliases, comment-preserving updates, transient v8 credential indexes, AI Studio buffered completion fixes, plus v8.0.16 responses/Claude/Codex translation fixes, websocket disconnect propagation (with xAI follow-up), OAuth tool-alias sharing, reasoning-effort reporting, Claude 5.5 CAQS replay, per-account entitlement refresh, and Claude 4.6 restoration.
- Skipped: promotional README additions, catalog-sources subsystem, payload-finalizer architecture, shell-tool translation, session-continuation/error-flush/EOF-synthesis/terminal-disconnect refactors, prompt-cache options, and merge wrappers; reasons recorded in the intake ledger.
Breaking changes
- None.
Added
- Client/shared upstream configuration with historical aliases, comment-preserving updates, and old SDK source compatibility (from deferred v8.0.13).
- Transient v8 credential indexes for management config, with isolated plugin OAuth sessions across repeated runs.
- Debug connection tracing and plugin cooldown-reset callback.
- Action sources in Claude web search translation and URL-citation preservation in OpenAI response translation (upstream v8.0.16).
- Claude 5.5 CAQS thinking-signature replay support with ambiguous-wrapper rejection and per-account model entitlement refresh.
- Claude 4.6 model definitions (
claude-opus-4-6-thinking,claude-sonnet-4-6), restored after operator confirmation that 4.6 remains live on Antigravity.
Changed
- Shared settings now apply to API keys; OAuth-only headers keep their scope.
- AI Studio buffered response completion and error handling now keep DONE-tail translation on the original request.
- Websocket session activation propagates upstream disconnect errors; xAI connections reset the recorded terminal error on each new connection, matching Codex behavior.
- OAuth tool aliases are shared across scoped executor copies and preserved across thread continuations.
- Model reporting and replay logs use the unified upstream format.
- The fork maintenance direction is now documented: same-problem conflicts prefer upstream, fork-only deltas stay only for uncovered behavior.
Fixed
- Unknown encrypted content is preserved in OpenAI responses compatibility mode.
- Gemini schema nodes with properties enforce object type; document blocks are supported in Claude request translation.
- Truncated streams missing
finish_reasonnow report an error instead of silently ending. - Missing Claude thread-state errors are marked for client replay; cache breakpoints are reserved for thread continuation; system messages stay top level for terminal user turns.
- Model version parsing for assistant prefill rejection is refined.
- Reasoning effort is recorded from finalized upstream payloads after caching.
- Antigravity probes are coalesced with plugin model ownership respected; model lifecycle and cooldown state are preserved.
- Auth mutation locking with persistence delta merging prevents unsafe concurrent updates; terminal unauthorized state blocks refresh retry.
- Context-hash rejection logging with batch retry logic improves Antigravity failure diagnosis.
Security
- None.
Validation
GOTOOLCHAIN=go1.26.4 bash ops/upstream-intake/verify-absorb.shpassed on the #19 candidate, the v8.0.16 intake branch, and the xAI follow-up head: maintenance fixtures, gofmt, vet, responses-tools invariants, full suite, race-sensitive packages, and server build.- PR #22 CI (
pr-test-build.yml) passed on the merged head after the xAI terminal-error reset fix; the same websocket retry test failed twice before the fix. - Offline tracked Codex catalog validation passed.
- Release CI builds the platform archives. Client acceptance covers targeted fixtures rather than all providers, model output patterns, or Codex versions.
- Replays for the v8.0.13 deferred work used identical AI Studio and custom-tool fixtures failing on baseline and passing on candidate; v8.0.16 protocol changes rely on unit coverage without a baseline-vs-candidate fixture replay.
Known issues
- Local
-count=100runs of the websocket retry test pass with and without the xAI fix; the fix is justified by inspection against upstreamd31b61cb, not by a local red-to-green run. Filed upstream asrouter-for-me/CLIProxyAPI#6480. - Upstream
configureXAIWebsocketConnstill misses the terminal-error reset; the fork carries the one-line completion until upstream responds. - Deprecated
/v0/managementendpoints remain unmaintained and untouched.
Release assets
CLIProxyAPI_<version>_linux_<arch>.tar.gzis the default Linux build. It supports dynamic library plugins and targets a GLIBC 2.17 baseline.CLIProxyAPI_<version>_linux_<arch>_no-plugin.tar.gzis the portable Linux build for musl-based or older systems such as OpenWrt. It does not support dynamic library plugins.CLIProxyAPI_<version>_freebsd_aarch64_no-plugin.tar.gzis the FreeBSD arm64 build. It is built without CGO and does not support dynamic library plugins.
Full changelog
v1.1.2-upstream8.0.7
v1.1.2-upstream8.0.7 - 2026-10-03
Summary
- Keep Codex integer tool arguments usable without changing patch text, code, commands, or ordinary Responses clients.
- Make complete function arguments consistent across item-done, argument-done, terminal snapshots, and non-stream responses.
- Direct SDK callers that need the Codex workaround must explicitly enable it on their request context.
Upstream alignment
- Upstream release:
v8.0.7 - Previous baseline:
v8.0.7 - Intake record: absorbed.md
- Ported: none (fork-only release). This release retains the existing upstream baseline.
- Skipped: no new upstream release was assessed or absorbed in this release.
Breaking changes
- No API signatures or configuration keys changed. Direct SDK consumers previously receiving implicit Responses normalization must now call
translator.WithCodexToolArgumentNormalization(ctx, true)to retain that workaround.
Added
- A request-scoped SDK helper to explicitly enable or disable Codex tool argument normalization.
Changed
- HTTP and downstream WebSocket request contexts select the workaround using the existing Codex User-Agent matcher. Other clients, including requests with no User-Agent, retain their original numeric representation.
- Initial items, argument deltas, malformed or incomplete JSON, exponent numbers, and non-integral fractions remain unchanged.
Fixed
- Custom tool inputs are preserved as opaque content, including JSON-looking text and
apply_patchlines containing values such as2500.0. - Complete function arguments use the same exact lexical rewrite in argument-done, item-done, and completed/incomplete/failed response snapshots. Large integer digits remain exact without a float64 conversion.
- Native downstream Codex WebSocket output now applies the same request-scoped policy in direct, buffered, and duplex streams.
- Multiple SSE events in one translator output are handled without changing their envelope or CRLF bytes.
- Example plugin modules now use the v8 module path and pass the plugin build check (fork PR #16, merged before this repair).
Security
- None.
Validation
- Go 1.26.4 focused translator and handler tests, server build, and the complete
ops/upstream-intake/verify-absorb.shgate passed, including maintenance tooling, formatting, vet, the full test suite, and race-sensitive packages. - Real Codex CLI 0.160.0 connected over both HTTP/SSE and native WebSocket to an isolated server built from this branch. A deterministic local upstream fixture emitted decimal integer arguments and a custom patch. The CLI executed the command successfully and wrote exactly
timeout = 2500.0to a scratch file. - Against pre-fix base
be01c2f1, the HTTP fixture wrotetimeout = 2500and the native WebSocket fixture rejected2500.0as a floating-point value where u64 was required. The candidate executed the command and preserved2500.0on both transports. - The acceptance fixture used test-only model metadata to expose the command and freeform patch tools. It exercised the actual client and server, without a remote model, production credentials, or an installed-service change.
- Request-context tests cover both Responses endpoint paths, Codex/curl/missing User-Agent, HTTP and WebSocket upgrade headers, and explicit SDK policies. Network WebSocket regression tests cover direct, buffered, and duplex output with the policy enabled and disabled. The real CLI replay also verified the native WebSocket transport without an HTTP fallback.
- The local gate ran on macOS arm64; release CI builds the platform archives. Client acceptance covers the targeted fixture rather than all providers, model output patterns, or Codex versions.
Known issues
- The workaround intentionally leaves streamed fragments unchanged and does not assemble argument JSON across chunks. It handles complete raw JSON events and complete JSON SSE data lines; multiline or fragmented SSE payloads remain outside this targeted repair.
- Exponent notation such as
2500.0e2is intentionally preserved.
Release assets
CLIProxyAPI_<version>_linux_<arch>.tar.gzis the default Linux build. It supports dynamic library plugins and targets a GLIBC 2.17 baseline.CLIProxyAPI_<version>_linux_<arch>_no-plugin.tar.gzis the portable Linux build for musl-based or older systems such as OpenWrt. It does not support dynamic library plugins.CLIProxyAPI_<version>_freebsd_aarch64_no-plugin.tar.gzis the FreeBSD arm64 build. It is built without CGO and does not support dynamic library plugins.
Full changelog
v1.1.1-upstream8.0.7
v1.1.1-upstream8.0.7 - 2026-10-01
Summary
- Documentation-only release. It ships the same binaries as
v1.1.0-upstream8.0.7and adds no code, configuration or dependency
change. - Records the standing decision that
codex/codex-tool-search-shimis a
permanent read-only archive branch that is never merged intomainand is
never built on. - No configuration migration is required, and no compatibility impact is
expected.
Upstream alignment
- Upstream release:
v8.0.7 - Previous baseline:
v8.0.7 - Intake record: absorbed.md
- Ported: none. This release ports no new upstream work. It is built directly
on thev8.0.7baseline thatv1.1.0-upstream8.0.7established, and it
keeps that release's-upstream8.0.7suffix because it is still built on
the same baseline. The only commit sincev1.1.0-upstream8.0.7is
9ce07aef, which changesAGENTS.mdonly. - Skipped: none. No upstream commit was assessed or excluded for this
release.
Breaking changes
- None.
Added
- None.
Changed
AGENTS.mdnow states thatcodex/codex-tool-search-shimis never merged
intomainand must not be built on, and that the tool-search capability it
explored shipped through the responses-tools pipeline instead. The previous
wording kept the branch only "while it holds work worth recovering", which
left room to merge it later.
Fixed
- None.
Security
- None.
Validation
ops/upstream-intake/verify-absorb.shwas run on this release candidate
withGOTOOLCHAIN=go1.26.4, the version both CI workflows pin, so the
gofmtstage matches CI. It covers the maintenance tooling tests,gofmt
over tracked sources,go vet ./..., the Responses-tools package tests, the
fullgo test ./... -count=1suite,-raceruns of the
concurrency-sensitive packages, and a server build.- Client replay coverage: not performed, and not applicable. This release
changes no runtime code, so no Codex, Gemini, Vertex or AI Studio client
turn was replayed against it. The gate result covers the automated checks
only. - Cross-platform behavior is covered only by the release workflow's asset
build and checksum verification; no artifact was exercised on a non-macOS
platform. The binaries are byte-for-byte equivalent in source terms to
v1.1.0-upstream8.0.7.
Known issues
- None. This release inherits the open items listed in
v1.1.0-upstream8.0.7, notably the Meta executor's unscope-aware
tool-integer normalization
(router-for-me/CLIProxyAPI#6255)
and the unmapped GeminiFinishReasonvalues.
Release assets
CLIProxyAPI_<version>_linux_<arch>.tar.gzis the default Linux build. It supports dynamic library plugins and targets a GLIBC 2.17 baseline.CLIProxyAPI_<version>_linux_<arch>_no-plugin.tar.gzis the portable Linux build for musl-based or older systems such as OpenWrt. It does not support dynamic library plugins.CLIProxyAPI_<version>_freebsd_aarch64_no-plugin.tar.gzis the FreeBSD arm64 build. It is built without CGO and does not support dynamic library plugins.
Full changelog
v1.1.0-upstream8.0.7
v1.1.0-upstream8.0.7 - 2026-10-01
Summary
- Absorbs upstream
v8.0.7(all five commits) on top of the previousv8.0.5
baseline, including the negotiated-ALPN uTLS transport fix and three Codex
tool-schema / stream-disconnect fixes. - Adds a
flattenmode to the Responses toolslocal-refsschema handling, so
self-referencing$defsfrom clients such as Codex desktop and OpenCode Go no
longer fail with400 Recursive JSON schemas are not currently supported. - Canonicalizes integral float literals in Responses tool-call arguments and
custom tool-call inputs, so strict Codex clients no longer reject
2500.0where an integer is expected. - Fixes several Gemini / Vertex / AI Studio streaming paths on the Responses
surface that returned502, dropped usage, or reported a truncated answer as
completed. - No configuration migration is required: the new
flattenmode is opt-in and
the defaultlocal-refs: "preserve"behavior is unchanged.
Upstream alignment
- Upstream release:
v8.0.7 - Previous baseline:
v8.0.5 - Intake record: absorbed.md
- Ported: the complete
v8.0.5..v8.0.7range, cherry-picked individually with
-x: negotiated ALPN support in the uTLS client (router-for-me#6223), skipping tool
parameter integer normalization for Codex executor targets (router-for-me#6244),
determining that normalization by target executor identity (router-for-me#6244), handling
an upstream Codex stream disconnect before the first payload as a bad gateway
with credential failover (router-for-me#6247), and passing the target executor to
compatibility translation and token counting (router-for-me#6244). - Skipped: none. Every commit in the range was ported;
67cb32b6and
97f244b8revisea8ffd5a8, so all three were taken together.
Breaking changes
- None.
Added
- A new
local-refs: "flatten"value for the Responses tools
responses-tools.routes[].schemablock (config.example.yaml, documented in
docs/responses-tools.md). It replaces only cycle-closing$refs with an
unconstrained schema and keeps acyclic$defsintact, so recursive tool
schemas are accepted by upstreams that reject recursion.preserveand
inlinekeep their current behavior, andpreserveremains the default. - Support for negotiated TLS ALPN protocols in the uTLS client: HTTP/2 and
HTTP/1.1 transports are selected from the handshake, empty-ALPN and HTTP/1.1
requests reuse the handshaken connection over a dedicated non-pooled
transport, and uTLS connections are closed cleanly when a response completes
or fails.
Changed
- Codex token counting and xAI compatibility translation now receive the target
executor identity, so tool parameter schemas keep theirnumbertype for
non-Codex targets while Codex targets keep their reserved schemas strictly
validated. - HTTP 408 Request Timeout from an upstream is mapped to
server_errorin the
base error response handlers.
Fixed
- Responses tool-call arguments and custom tool-call inputs emitted towards
Responses clients now rewrite integral float literals (2500.0->2500).
The rewrite is value-preserving, covers every tool and parameter rather than a
fixed whitelist, and leaves tool schemas untouched. Delta events are
deliberately unchanged because Codex clients parse arguments from the
complete item. - A Codex upstream stream that closes before emitting any payload now returns
502 Bad Gatewayand fails over to the next credential instead of surfacing
a truncated success. - AI Studio relayed streams now synthesize the terminal event on stream end, so
a normally finished Gemini stream no longer answers502 upstream stream closed before a terminal eventon the Responses surface. - Gemini and Vertex streaming no longer emit a synthetic completion when the
upstream read fails or the request is cancelled; the terminal event is
synthesized only on a clean end of stream. - Gemini usage is preserved when the finish reason and
usageMetadataarrive
in separate chunks; cumulative counts are replaced per field rather than
summed. - Gemini
MAX_TOKENStermination is now reported asincompleteon both the
streaming and non-streaming Responses paths, while already finalized messages
and complete function calls staycompleted. OnlySTOPandMAX_TOKENS
are mapped.
Security
- None.
Validation
ops/upstream-intake/verify-absorb.shwas run on this release candidate with
GOTOOLCHAIN=go1.26.4, matching the version both CI workflows pin. It covers
the maintenance tooling tests,gofmtover tracked sources,go vet ./...,
the Responses-tools package tests, the fullgo test ./... -count=1suite,
-raceruns of the concurrency-sensitive packages, and a server build.- Client replay coverage: not performed. No live Codex, Gemini, Vertex or
AI Studio client turn was replayed against this build, so the gate result
covers the automated checks only and does not establish live streaming
behavior. - Cross-platform behavior is covered only by the release workflow's asset build
and checksum verification; no artifact was exercised on a non-macOS platform.
Known issues
- The upstream fix for tool-parameter integer normalization is scoped to Codex
executor targets. The Meta executor still calls the unscope-aware path and
normalizes unconditionally, so a Meta-hosted Muse request can still produce an
integral float literal in a schema-bound position. The response-side
canonicalizer in this release covers the clients that consume those
arguments; the upstream gap is tracked as
router-for-me/CLIProxyAPI#6255. - Gemini
FinishReasonvalues other thanSTOPandMAX_TOKENSare not yet
mapped to a Responses terminal status.
Release assets
CLIProxyAPI_<version>_linux_<arch>.tar.gzis the default Linux build. It supports dynamic library plugins and targets a GLIBC 2.17 baseline.CLIProxyAPI_<version>_linux_<arch>_no-plugin.tar.gzis the portable Linux build for musl-based or older systems such as OpenWrt. It does not support dynamic library plugins.CLIProxyAPI_<version>_freebsd_aarch64_no-plugin.tar.gzis the FreeBSD arm64 build. It is built without CGO and does not support dynamic library plugins.
Full changelog
v1.0.1
Linux release assets
CLIProxyAPI_<version>_linux_<arch>.tar.gzis the default Linux build. It supports dynamic library plugins and is built against a GLIBC 2.17 baseline.CLIProxyAPI_<version>_linux_<arch>_no-plugin.tar.gzis the portable Linux build for musl-based or older systems such as OpenWrt. It does not support dynamic library plugins.
FreeBSD release assets
CLIProxyAPI_<version>_freebsd_aarch64_no-plugin.tar.gzis the FreeBSD arm64 build. It is built without CGO and does not support dynamic library plugins.
Changelog
- chore(homebrew): pin cli-proxy-api 1.0.0 release checksums (59fbe10)
- fix(claude): read setup-token metadata under the metadata lock (fa955ec)
- chore: move fork-upstream-sync skill into the repo, satisfy brew audit (750abc6)
Full Changelog: v1.0.0...v1.0.1