Skip to content

Releases: hrygo/CLIProxyAPI

v1.3.5-upstream8.0.35

Choose a tag to compare

@github-actions github-actions released this 28 Oct 10:09
415b853

v1.3.5-upstream8.0.35 - 2026-10-28

Summary

  • /v1/messages turns that keep the reserved DeferredToolPlaceholder but no longer declare a ToolSearch function are now forwarded instead of being rejected locally with 422 deferred bridge requires an active client ToolSearch declaration.
  • Routes configured with client-search: disabled now reject every turn that declares ToolSearch, 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.35 baseline, so the tag keeps the previous suffix.
  • Skipped: The exclusions recorded for the v8.0.35 intake remain in force: the separate upstream apply_patch pipeline 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_loading is stripped before the non-Anthropic translator runs.
  • client-search: disabled now rejects every turn that declares ToolSearch, 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 DeferredToolPlaceholder with defer_loading: true and no ToolSearch declaration no longer fails in a few milliseconds with 422 unsupported_protocol. Such a turn is forwarded with its remaining declarations, so an eager conversation that still advertises deferred support completes.
  • A forced tool_choice that names a dropped declaration is still rejected with 422 forced tool is not active after discovery, and a history containing a search call or a tool_reference result without an active ToolSearch declaration is still rejected with 422 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: main before the fix answered 422 in 1.5 ms without contacting the upstream; this candidate answered 200 in 1.9 ms and the upstream received Glob, Grep and Read only, without the placeholder or defer_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 ToolSearch declaration 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 declare ToolSearch again.
  • A tool_result that mixes tool_reference with text, image or error blocks remains unsupported and is rejected with 422, because no contract preserves every component.
  • Anthropic server-executed declarations such as tool_search_tool_regex_20251119 are forwarded as ordinary functions and are not executed by the gateway.

Release assets

  • CLIProxyAPI_<version>_linux_<arch>.tar.gz is the default Linux build. It supports dynamic library plugins and targets a GLIBC 2.17 baseline.
  • CLIProxyAPI_<version>_linux_<arch>_no-plugin.tar.gz is 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.gz is the FreeBSD arm64 build. It is built without CGO and does not support dynamic library plugins.

Full changelog

Compare v1.3.4-upstream8.0.35...v1.3.5-upstream8.0.35

v1.3.4-upstream8.0.35

Choose a tag to compare

@github-actions github-actions released this 23 Oct 17:45
c3d0fc6

v1.3.4-upstream8.0.35 - 2026-10-24

Summary

  • Add an opt-in requests.streaming.bootstrap-timeout that 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 existing bootstrap-retries budget or rejected with 504 instead 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), upstream b0db5448e8f8cce9b58e5d02eab23d32d4ec5dca (Interactions fallback item IDs become per-response UUID-prefixed) and upstream e240bd84321c55b96b226d43fa557c9a8be55a00 (Codex and multi-agent templates fall back to the first valid model template when gpt-5.5 is 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_patch pipeline 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-timeout is new and defaults to 0, which keeps the previous unbounded bootstrap wait; only an explicit positive value changes runtime behaviour.

Added

  • requests.streaming.bootstrap-timeout bounds 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 and 0, none, off, never, unlimited, disabled or 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-retries or answered with 504 and the message upstream 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-retries remains 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-timeout configured the gateway abandons the attempt, retries it when the budget allows, and otherwise answers 504 before 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.5 is absent, instead of rejecting the catalog entry; gpt-5.5 is 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=1 and a server build.
  • Focused evidence for the bootstrap timeout: gofmt clean 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, 504 when 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: 3s with bootstrap-retries: 1 answered 504 in 6.00 s after exactly two upstream requests; and an upstream that stalled once and then served returned HTTP 200 with 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.gz is the default Linux build. It supports dynamic library plugins and targets a GLIBC 2.17 baseline.
  • CLIProxyAPI_<version>_linux_<arch>_no-plugin.tar.gz is 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.gz is the FreeBSD arm64 build. It is built without CGO and does not support dynamic library plugins.

Full changelog

Compare v1.3.3-upstream8.0.35...v1.3.4-upstream8.0.35

v1.3.3-upstream8.0.35

Choose a tag to compare

@github-actions github-actions released this 23 Oct 01:01
5cc1929

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.gz is the default Linux build. It supports dynamic library plugins and targets a GLIBC 2.17 baseline.
  • CLIProxyAPI_<version>_linux_<arch>_no-plugin.tar.gz is 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.gz is the FreeBSD arm64 build. It is built without CGO and does not support dynamic library plugins.

Full changelog

Compare v1.3.2-upstream8.0.23...v1.3.3-upstream8.0.35

v1.3.2-upstream8.0.23

Choose a tag to compare

@github-actions github-actions released this 14 Oct 05:46
4edf1ea

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.2 candidate 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.23 release 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 5349958c and production candidate 439e9f12 passed GOTOOLCHAIN=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.gz is the default Linux build. It supports dynamic library plugins and targets a GLIBC 2.17 baseline.
  • CLIProxyAPI_<version>_linux_<arch>_no-plugin.tar.gz is 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.gz is the FreeBSD arm64 build. It is built without CGO and does not support dynamic library plugins.

Full changelog

Compare v1.3.0-upstream8.0.16...v1.3.2-upstream8.0.23

v1.3.0-upstream8.0.16

Choose a tag to compare

@github-actions github-actions released this 14 Oct 02:12
a7c1c71

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 main CI passed on 9269d6c2: maintenance checks, offline accounting and model catalog checks, tracked formatting, go vet, full Go tests, and server build with Go 1.26.4 (CI run).
  • The local GOTOOLCHAIN=go1.26.4 bash ops/upstream-intake/verify-absorb.sh gate passed on the merged runtime source, including all seven race-sensitive packages; release preparation changes only documentation.
  • Official Codex 0.160.0 and Claude Code 2.1.289 were 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.gz is the default Linux build. It supports dynamic library plugins and targets a GLIBC 2.17 baseline.
  • CLIProxyAPI_<version>_linux_<arch>_no-plugin.tar.gz is 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.gz is the FreeBSD arm64 build. It is built without CGO and does not support dynamic library plugins.

Full changelog

Compare v1.2.0-upstream8.0.16...v1.3.0-upstream8.0.16

v1.2.0-upstream8.0.16

Choose a tag to compare

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_reason now 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.sh passed 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=100 runs of the websocket retry test pass with and without the xAI fix; the fix is justified by inspection against upstream d31b61cb, not by a local red-to-green run. Filed upstream as router-for-me/CLIProxyAPI#6480.
  • Upstream configureXAIWebsocketConn still misses the terminal-error reset; the fork carries the one-line completion until upstream responds.
  • Deprecated /v0/management endpoints remain unmaintained and untouched.

Release assets

  • CLIProxyAPI_<version>_linux_<arch>.tar.gz is the default Linux build. It supports dynamic library plugins and targets a GLIBC 2.17 baseline.
  • CLIProxyAPI_<version>_linux_<arch>_no-plugin.tar.gz is 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.gz is the FreeBSD arm64 build. It is built without CGO and does not support dynamic library plugins.

Full changelog

Compare v1.1.2-upstream8.0.7...v1.2.0-upstream8.0.16

v1.1.2-upstream8.0.7

Choose a tag to compare

@github-actions github-actions released this 03 Oct 07:05
ceccde5

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_patch lines containing values such as 2500.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.sh gate 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.0 to a scratch file.
  • Against pre-fix base be01c2f1, the HTTP fixture wrote timeout = 2500 and the native WebSocket fixture rejected 2500.0 as a floating-point value where u64 was required. The candidate executed the command and preserved 2500.0 on 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.0e2 is intentionally preserved.

Release assets

  • CLIProxyAPI_<version>_linux_<arch>.tar.gz is the default Linux build. It supports dynamic library plugins and targets a GLIBC 2.17 baseline.
  • CLIProxyAPI_<version>_linux_<arch>_no-plugin.tar.gz is 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.gz is the FreeBSD arm64 build. It is built without CGO and does not support dynamic library plugins.

Full changelog

Compare v1.1.1-upstream8.0.7...v1.1.2-upstream8.0.7

v1.1.1-upstream8.0.7

Choose a tag to compare

v1.1.1-upstream8.0.7 - 2026-10-01

Summary

  • Documentation-only release. It ships the same binaries as
    v1.1.0-upstream8.0.7 and adds no code, configuration or dependency
    change.
  • Records the standing decision that codex/codex-tool-search-shim is a
    permanent read-only archive branch that is never merged into main and 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 the v8.0.7 baseline that v1.1.0-upstream8.0.7 established, and it
    keeps that release's -upstream8.0.7 suffix because it is still built on
    the same baseline. The only commit since v1.1.0-upstream8.0.7 is
    9ce07aef, which changes AGENTS.md only.
  • Skipped: none. No upstream commit was assessed or excluded for this
    release.

Breaking changes

  • None.

Added

  • None.

Changed

  • AGENTS.md now states that codex/codex-tool-search-shim is never merged
    into main and 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.sh was run on this release candidate
    with GOTOOLCHAIN=go1.26.4, the version both CI workflows pin, so the
    gofmt stage matches CI. It covers the maintenance tooling tests, gofmt
    over tracked sources, go vet ./..., the Responses-tools package tests, the
    full go test ./... -count=1 suite, -race runs 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 Gemini FinishReason values.

Release assets

  • CLIProxyAPI_<version>_linux_<arch>.tar.gz is the default Linux build. It supports dynamic library plugins and targets a GLIBC 2.17 baseline.
  • CLIProxyAPI_<version>_linux_<arch>_no-plugin.tar.gz is 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.gz is the FreeBSD arm64 build. It is built without CGO and does not support dynamic library plugins.

Full changelog

Compare v1.1.0-upstream8.0.7...v1.1.1-upstream8.0.7

v1.1.0-upstream8.0.7

Choose a tag to compare

v1.1.0-upstream8.0.7 - 2026-10-01

Summary

  • Absorbs upstream v8.0.7 (all five commits) on top of the previous v8.0.5
    baseline, including the negotiated-ALPN uTLS transport fix and three Codex
    tool-schema / stream-disconnect fixes.
  • Adds a flatten mode to the Responses tools local-refs schema handling, so
    self-referencing $defs from clients such as Codex desktop and OpenCode Go no
    longer fail with 400 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.0 where an integer is expected.
  • Fixes several Gemini / Vertex / AI Studio streaming paths on the Responses
    surface that returned 502, dropped usage, or reported a truncated answer as
    completed.
  • No configuration migration is required: the new flatten mode is opt-in and
    the default local-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.7 range, 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; 67cb32b6 and
    97f244b8 revise a8ffd5a8, so all three were taken together.

Breaking changes

  • None.

Added

  • A new local-refs: "flatten" value for the Responses tools
    responses-tools.routes[].schema block (config.example.yaml, documented in
    docs/responses-tools.md). It replaces only cycle-closing $refs with an
    unconstrained schema and keeps acyclic $defs intact, so recursive tool
    schemas are accepted by upstreams that reject recursion. preserve and
    inline keep their current behavior, and preserve remains 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 their number type for
    non-Codex targets while Codex targets keep their reserved schemas strictly
    validated.
  • HTTP 408 Request Timeout from an upstream is mapped to server_error in 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 Gateway and 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 answers 502 upstream stream closed before a terminal event on 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 usageMetadata arrive
    in separate chunks; cumulative counts are replaced per field rather than
    summed.
  • Gemini MAX_TOKENS termination is now reported as incomplete on both the
    streaming and non-streaming Responses paths, while already finalized messages
    and complete function calls stay completed. Only STOP and MAX_TOKENS
    are mapped.

Security

  • None.

Validation

  • ops/upstream-intake/verify-absorb.sh was run on this release candidate with
    GOTOOLCHAIN=go1.26.4, matching the version both CI workflows pin. It covers
    the maintenance tooling tests, gofmt over tracked sources, go vet ./...,
    the Responses-tools package tests, the full go test ./... -count=1 suite,
    -race runs 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 FinishReason values other than STOP and MAX_TOKENS are not yet
    mapped to a Responses terminal status.

Release assets

  • CLIProxyAPI_<version>_linux_<arch>.tar.gz is the default Linux build. It supports dynamic library plugins and targets a GLIBC 2.17 baseline.
  • CLIProxyAPI_<version>_linux_<arch>_no-plugin.tar.gz is 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.gz is the FreeBSD arm64 build. It is built without CGO and does not support dynamic library plugins.

Full changelog

Compare v1.0.1-upstream8.0.5...v1.1.0-upstream8.0.7

v1.0.1

Choose a tag to compare

Linux release assets

  • CLIProxyAPI_<version>_linux_<arch>.tar.gz is 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.gz is 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.gz is 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