All notable changes to amp-proxy are documented in this file. The format is loosely based on Keep a Changelog and this project adheres to Semantic Versioning.
0.1.1 - 2026-04-16
amp-proxy initsubcommand — interactive wizard that prompts for the custom provider URL and Bearer token, generates a random local API key, and writes a complete ready-to-runconfig.yaml. The full 9-entry Amp CLI model mapping table,force-model-mappings: true,gemini-route-mode: "translate", and localhost-only management are baked into the generated file so operators only have to answer two questions to get a working proxy. Pass-forceto overwrite an existing config and-config <path>to write to a non-default path.- README bilingual quickstart update — both READMEs now lead with
amp-proxy initas the recommended first-run flow, with the manualconfig.example.yamlpath kept below for operators who prefer to hand-edit YAML.
0.1.0 - 2026-04-16
First tagged release. Binaries for macOS (Intel + Apple Silicon), Linux (x86_64 + arm64) and Windows (x86_64 + arm64) are attached to the GitHub release; grab the archive matching your platform and see the README for setup.
customproxypackage — model-keyed routing to any OpenAI-compatible endpoint. A request whose (possibly remapped)modelfield is claimed by acustom-providersentry inconfig.yamlis forwarded to that upstream with the provider's Bearer token.- Anthropic
/v1/messagesstream upgrade — non-streaming Amp CLI requests (used by thelibrariansubagent) are silently upgraded to SSE on the wire and collapsed back into a single JSON body downstream. Works around an upstream content-loss bug where the non-streaming response comes back with an emptycontentarray despite non-zerousage.output_tokens. - Gemini ↔ OpenAI Responses translator — new
gemini-route-mode: "translate"config switch rewrites Amp CLI'sfindersubagent's Googlev1beta1 generateContentrequests into OpenAI Responses API calls, forwards them through the custom provider, and translates the reply back into Gemini JSON before the client reads it. Covers both single-turn and multi-turn conversations, drops upstream-opaquethoughtSignaturebytes, synthesisescall_ids forfunctionCall↔functionResponsealignment, and lowercases Gemini's uppercase JSON-schema type values. Ships with unit and integration tests. - Model mappings — rewrite the
modelfield pre-routing so that, for example,claude-opus-4-6can be redirected togpt-5.4(high)on a local endpoint.force-model-mappings: truemakes mappings win over local OAuth providers when both match. - Ready-to-use Amp CLI routing defaults —
config.example.yamlships pre-filled with the full 9-entry mapping table covering the claude / gpt / gemini model families Amp CLI actually requests. Operators only need to pointcustom-providersat their gateway URL. scripts/restart.ps1— Windows helper that kills any staleamp-proxy.exe, relaunches the server, and redirects stdout/stderr torun.log.scripts/test_gemini_translate.js— Node.js end-to-end smoke test that drives the Gemini translate path against a running amp-proxy instance and verifies the response shape.- Debug body capture middleware — opt-in via
debug.capture-path-substringin config. Writes raw request/response bytes for matching URL paths to./capture/*.log. Intended for local development only. - Bilingual README — Chinese is the primary
README.md; English lives alongside atREADME_en.md, with language-toggle links at the top of both files. - GitHub Actions CI — runs
go build,go vet, andgo test ./internal/customproxy/...on every push and PR tomain. - GoReleaser pipeline — tagged commits trigger a release workflow that produces cross-platform archives, checksums, and a GitHub release with auto-grouped changelog notes.
- Empty output array warning on
/v1/responses—sseRewriternow injects the accumulatedresponse.output_item.doneitems intoresponse.completedwhen the upstream sends an empty array, keeping Amp CLI's Stainless SDK from silently discarding the reply. - Windows NTFS filename collision in bodyCapture — URL paths
containing
:(Google v1betagenerateContentcalls) previously wrote zero-byte files because:is an alternate-data-stream separator on NTFS. Replaced with_so capture files stay portable. restart.ps1stderr loss — stdout and stderr are now both redirected intorun.log; therun.log.errsibling file is kept for legacy callers but no longer receives content by default.- Amp CLI
ContentLengthmismatch afterrewriteModelInRequest— custom provider forwarding now realigns both thec.Request.ContentLengthfield and theContent-Lengthheader with the rewritten body length, preventing thenet/http: ContentLength=X with Body length Ypanic on the next hop. pre-existing logAmpRoutingnoise — theRouteTypeAmpCreditspath is now logged atErrorfwith an explicit message telling the operator the model leaked past the routing table and is billable.
sdk/access/moved tointernal/access/— amp-proxy has no external SDK consumers, so thesdk/root directory was flattened intointernal/. Import aliassdkaccessis preserved in the three call sites so future cherry-picks from upstream stay diff-friendly.internal/amp/fallback_handlers.go— the custom-provider routing hook now skips Google v1beta native paths unlessgemini-route-mode: translateis on; otherwise it falls through to the ampcode.com proxy to preserve protocol fidelity.
- amp-proxy is a derivative of CLIProxyAPI. Every file that diverges from the upstream baseline is listed in NOTICE.md with a short rationale.
- The extraction deliberately excludes upstream's OAuth login flows
for ChatGPT / Claude Code / Gemini CLI. For OAuth-backed providers,
run a separate bridge that terminates the OAuth flow and exposes a
plain Bearer endpoint, then point a
custom-providersentry at it.