{"slug": "show-hn-use-kimi-and-openai-subscriptions-in-claude-code", "title": "Show HN: Use Kimi and OpenAI Subscriptions in Claude Code", "summary": "A developer released an open-source proxy tool called `claude-code-proxy` that lets users run Anthropic's Claude Code terminal harness using their ChatGPT Plus/Pro subscription or Kimi Code account instead of a direct Anthropic API key. The tool, available via Homebrew and as a prebuilt binary, routes Claude Code's requests through a local proxy server that authenticates with the chosen provider's OAuth or device-code flow. The project addresses growing frustration with Anthropic's tightening usage limits by allowing developers to leverage OpenAI's more generous subscription plans while retaining Claude Code's interface.", "body_md": "`claude-code-proxy`\n\nlets you use\n[Claude Code](https://www.anthropic.com/claude-code) with your **ChatGPT\nPlus/Pro** subscription or your **Kimi Code** (kimi.com) account.\n\n[Quick start](#quick-start) · [Providers](#providers) ·\n[How it works](#how-it-works) · [Configuration](#configuration) ·\n[Limitations](#limitations)\n\nI feel Claude Code is still the best harness around, despite occasional frustrations caused by updates. However, Anthropic keeps tightening the usage limits, while OpenAI is still much more generous.\n\nIf you want to use OpenAI plans, your best options seem to be OpenCode and Codex. I tried OpenCode, but the UX has many rough edges, especially around skills feeling like a second-class feature. Fortunately it's open source and I ended up forking it and applying some patches, but would much rather not do it.\n\n**Homebrew** (macOS and Linux):\n\n```\nbrew install raine/claude-code-proxy/claude-code-proxy\n```\n\n**Install script** (macOS and Linux):\n\n```\ncurl -fsSL https://raw.githubusercontent.com/raine/claude-code-proxy/main/scripts/install.sh | bash\n```\n\n**Manual:** download a prebuilt binary for your platform from the\n[releases page](https://github.com/raine/claude-code-proxy/releases). Windows\nartifacts are published as `claude-code-proxy-windows-amd64.zip`\n\nand\n`claude-code-proxy-windows-arm64.zip`\n\n; extract the `.exe`\n\nsomewhere on your\n`PATH`\n\n.\n\nThe proxy supports two upstream providers. Pick one and run its login flow; the proxy will refuse to start traffic until a token is stored.\n\n**Codex (ChatGPT Plus/Pro):**\n\n```\nclaude-code-proxy codex auth login     # browser OAuth (PKCE)\n# or, on a headless machine:\nclaude-code-proxy codex auth device    # device-code flow\n```\n\nSign in with your **ChatGPT Plus/Pro account**, not an OpenAI API account.\n\n**Kimi (kimi.com Kimi Code):**\n\n```\nclaude-code-proxy kimi auth login      # device-code flow (prints URL + code)\n```\n\nSign in with your **kimi.com account**. The verification URL is displayed; open\nit in any browser, confirm the code, and the CLI polls until done.\n\nOn macOS credentials go to Keychain. On Windows they are written under\n`%APPDATA%\\claude-code-proxy\\<provider>\\auth.json`\n\n; on Linux they are written\nunder `${XDG_CONFIG_HOME:-$HOME/.config}/claude-code-proxy/<provider>/auth.json`\n\n(mode 0600 where supported).\n\nVerify:\n\n```\nclaude-code-proxy codex auth status\nclaude-code-proxy kimi auth status\nclaude-code-proxy serve                # listens on 127.0.0.1:18765\nPORT=11435 claude-code-proxy serve     # change the listen port\n```\n\nBinds to `127.0.0.1`\n\nonly. One `serve`\n\nprocess handles all providers — the\nupstream for each request is chosen from `ANTHROPIC_MODEL`\n\n.\n\n`ANTHROPIC_MODEL`\n\nselects the provider:\n\n`gpt-5.5`\n\n,`gpt-5.4`\n\n,`gpt-5.3-codex`\n\n,`gpt-5.3-codex-spark`\n\n,`gpt-5.4-mini`\n\n,`gpt-5.2`\n\n→**codex**`kimi-for-coding`\n\n,`kimi-k2.6`\n\n,`k2.6`\n\n→**kimi**\n\nAn unknown model returns a 400 listing the supported ids. There is no implicit default provider.\n\nClaude Code also issues background requests (session title generation, token\ncounts) against its built-in \"small/fast\" haiku model id. Those requests\nwould 400 because no provider claims it, so set\n`ANTHROPIC_SMALL_FAST_MODEL`\n\nto a concrete id too (the same value as\n`ANTHROPIC_MODEL`\n\nis usually fine):\n\n```\n# Codex\nANTHROPIC_BASE_URL=http://localhost:18765 \\\nANTHROPIC_AUTH_TOKEN=unused \\\nANTHROPIC_MODEL=gpt-5.4[1m] \\\nANTHROPIC_SMALL_FAST_MODEL=gpt-5.4-mini[1m] \\\nCLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 \\\nCLAUDE_CODE_DISABLE_NONSTREAMING_FALLBACK=1 \\\n  claude\n\n# Kimi\nANTHROPIC_BASE_URL=http://localhost:18765 \\\nANTHROPIC_AUTH_TOKEN=unused \\\nANTHROPIC_MODEL=kimi-for-coding[1m] \\\nANTHROPIC_SMALL_FAST_MODEL=kimi-for-coding[1m] \\\nCLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 \\\nCLAUDE_CODE_DISABLE_NONSTREAMING_FALLBACK=1 \\\n  claude\n```\n\n`CLAUDE_CODE_DISABLE_NONSTREAMING_FALLBACK=1`\n\nis recommended because the\nproxy always talks to upstream providers with streaming requests, even when it\naccumulates a non-streaming Anthropic response for Claude Code. Disabling Claude\nCode's streaming-to-non-streaming fallback avoids retrying a partially completed\nstream in a way that can duplicate tool calls.\n\nOr set it persistently in `~/.claude/settings.json`\n\n:\n\n```\n{\n  \"env\": {\n    \"ANTHROPIC_BASE_URL\": \"http://127.0.0.1:18765\",\n    \"ANTHROPIC_AUTH_TOKEN\": \"unused\",\n    \"ANTHROPIC_MODEL\": \"gpt-5.4[1m]\",\n    \"ANTHROPIC_SMALL_FAST_MODEL\": \"gpt-5.4-mini[1m]\",\n    \"CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC\": 1,\n    \"CLAUDE_CODE_DISABLE_NONSTREAMING_FALLBACK\": 1\n  }\n}\n```\n\nClaude Code decides auto-compaction based on the model's context window. For unknown models (like the ones the proxy uses) it defaults to 200K tokens, which is smaller than what the upstream models actually support (GPT-5.4: 400K+, Kimi: 256K). This causes auto-compact to fire earlier than necessary.\n\nThe `[1m]`\n\nsuffix on the model name (shown in the examples above) is a Claude\nCode convention that tells it to use a 1M-token context window instead. This\nraises the auto-compact threshold without disabling it entirely.\n\nIf you'd rather disable auto-compact completely, set\n`DISABLE_AUTO_COMPACT=1`\n\nin your env or `~/.claude/settings.json`\n\n. Manual\n`/compact`\n\nstill works, but you risk hitting real upstream limits before\nClaude Code can compact for you.\n\nIf you still have an Anthropic subscription you want to fall back to, you can\nput a small wrapper in front of `claude`\n\nthat only injects the proxy env vars\nwhen a flag file exists, plus a toggle script to flip the flag. Leave\n`~/.claude/settings.json`\n\nfree of proxy env vars so direct-to-Anthropic remains\nthe default.\n\n`~/.local/bin/claude`\n\n(ahead of the real `claude`\n\non `PATH`\n\n):\n\n``` bash\n#!/bin/bash\n# Wrapper that optionally routes to claude-code-proxy.\n# Active when ~/.claude/claude-code-proxy-enabled exists.\n\nif [ -f \"$HOME/.claude/claude-code-proxy-enabled\" ]; then\n    export ANTHROPIC_BASE_URL=\"http://localhost:18765\"\n    export ANTHROPIC_AUTH_TOKEN=\"unused\"\n    export ANTHROPIC_MODEL=\"gpt-5.4[1m]\"\n    export ANTHROPIC_SMALL_FAST_MODEL=\"gpt-5.4-mini[1m]\"\n    export CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=\"1\"\n    export CLAUDE_CODE_DISABLE_NONSTREAMING_FALLBACK=\"1\"\nfi\n\nexec \"$HOME/.local/bin/claude\" \"$@\"\n```\n\nAdjust the exec path if the real `claude`\n\nbinary lives elsewhere on your\nsystem (e.g. `$(bun pm bin -g)/claude`\n\n, `$HOME/.claude/local/claude`\n\n).\n\n`claude-proxy-toggle`\n\n(anywhere on your `PATH`\n\n):\n\n``` bash\n#!/bin/bash\n# Toggle claude-code-proxy routing for the claude wrapper.\nset -euo pipefail\n\nflag=\"$HOME/.claude/claude-code-proxy-enabled\"\n\nif [ -f \"$flag\" ]; then\n    rm \"$flag\"\n    echo \"proxy: off\"\nelse\n    mkdir -p \"$(dirname \"$flag\")\"\n    touch \"$flag\"\n    echo \"proxy: on\"\nfi\n```\n\nRun `claude-proxy-toggle`\n\nto flip between routing through the proxy (Codex /\nKimi) and talking to Anthropic directly. New or continued `claude`\n\nsessions pick up\nthe change immediately; existing sessions keep whatever they started with.\n\nUpstream: `https://chatgpt.com/backend-api/codex/responses`\n\n(Responses API).\n\nSet `ANTHROPIC_MODEL`\n\nto a model your ChatGPT subscription is allowed to use.\nAppend `-fast`\n\nto a Codex model name to request Codex fast mode for that request\nwithout restarting the proxy. For example, `gpt-5.4-fast[1m]`\n\nis sent upstream as\nmodel `gpt-5.4`\n\nwith `service_tier: \"priority\"`\n\n. An explicit\n`codex.serviceTier`\n\n/ `CCP_CODEX_SERVICE_TIER`\n\noverride still takes precedence.\n\nReasoning effort: Claude Code's `output_config.effort`\n\nvalue (the one you see in\nthe UI as `◐ medium · /effort`\n\n) is forwarded as Codex `reasoning.effort`\n\n(`low`\n\n/ `medium`\n\n/ `high`\n\n/ `xhigh`\n\n). Claude Code's `max`\n\nvalue is sent upstream as\n`xhigh`\n\n. An explicit `codex.effort`\n\n/ `CCP_CODEX_EFFORT`\n\noverride still takes\nprecedence and can also force `none`\n\n.\n\nConfirmed working on **Plus**:\n\n`gpt-5.4`\n\n`gpt-5.3-codex`\n\nAlso verified:\n\n`gpt-5.2`\n\n`gpt-5.4-mini`\n\nIf the resolved model isn't supported by your account, upstream returns a 400\nlike\n`\"The 'gpt-4.1' model is not supported when using Codex with a ChatGPT account.\"`\n\n.\nThe proxy surfaces that verbatim.\n\nAuth:\n\n| Command | What it does |\n|---|---|\n`codex auth login` |\nBrowser OAuth (PKCE) via `auth.openai.com` |\n`codex auth device` |\nDevice-code OAuth for headless machines |\n`codex auth status` |\nShow account ID + token expiry |\n`codex auth logout` |\nDelete stored credentials |\n\nUpstream: `https://api.kimi.com/coding/v1/chat/completions`\n\n(OpenAI-style\nchat-completions).\n\nOnly one wire model is exposed: `kimi-for-coding`\n\n(its display name in kimi-cli\nis **Kimi-k2.6**, 256k context, supports reasoning + image input + video input).\n`kimi-k2.6`\n\nand `k2.6`\n\nare accepted as aliases for the same wire id.\n\nReasoning effort: Claude Code's `output_config.effort`\n\nvalue (the one you see in\nthe UI as `◐ medium · /effort`\n\n) is forwarded as Kimi's `reasoning_effort`\n\n(`low`\n\n/ `medium`\n\n/ `high`\n\n). Thinking blocks from the upstream model are forwarded to\nClaude Code and rendered as thinking content. If Claude Code disables thinking,\nthe proxy drops both `reasoning_effort`\n\nand the `thinking: {type: \"enabled\"}`\n\nflag before forwarding.\n\nAuth:\n\n| Command | What it does |\n|---|---|\n`kimi auth login` |\nDevice-code OAuth via `auth.kimi.com` |\n`kimi auth status` |\nShow user ID + token expiry |\n`kimi auth logout` |\nDelete stored credentials |\n\n```\nsequenceDiagram\n    autonumber\n    participant CC as Claude Code\n    participant P as claude-code-proxy\n    participant AUTH as OAuth host<br/>(auth.openai.com or<br/>auth.kimi.com)\n    participant U as Upstream API<br/>(chatgpt.com/codex or<br/>api.kimi.com)\n\n    Note over P,AUTH: One-time: PKCE / device OAuth<br/>tokens cached locally for reuse\n\n    CC->>P: POST /v1/messages (Anthropic shape, stream: true)\n\n    alt access token expiring\n        P->>AUTH: POST /oauth/token (refresh_token)\n        AUTH-->>P: new access (+ rotated refresh)\n    end\n\n    P->>P: translate request<br/>• strip Anthropic-only fields<br/>• system blocks → instructions / system message<br/>• tool_use / tool_result ↔ provider-specific shapes<br/>• prompt_cache_key = session id\n    P->>U: POST upstream<br/>Bearer + provider-specific headers\n    U-->>P: provider SSE<br/>(Codex: output_item.*, output_text.delta, …)<br/>(Kimi: chat.completion.chunk, reasoning_content, …)\n    P->>P: reducer: typed events<br/>(thinking / text / tool start/delta/stop, finish)\n    P-->>CC: Anthropic SSE<br/>(message_start, content_block_*, message_delta, message_stop)\n```\n\n| Command | Description |\n|---|---|\n`serve` |\n\n`PORT`\n\n`codex auth login`\n\n/ `device`\n\n/ `status`\n\n/ `logout`\n\n`kimi auth login`\n\n/ `status`\n\n/ `logout`\n\nStarts the HTTP proxy and blocks. Binds to `127.0.0.1`\n\nonly. Logs to the\nplatform state directory (rotated at 20 MiB). Set `CCP_LOG_STDERR=1`\n\nto mirror\nlog lines to stderr while running.\n\n```\nclaude-code-proxy serve\nPORT=11435 claude-code-proxy serve\nCCP_LOG_STDERR=1 claude-code-proxy serve\n```\n\nPrints the supported model → provider mapping on startup. One `serve`\n\nprocess\ndispatches to any provider based on the `model`\n\nfield in each request.\nRequests whose model isn't registered with any provider are rejected with\nHTTP 400 listing the supported ids.\n\nRuns the PKCE browser flow against `auth.openai.com`\n\nusing the Codex CLI's\nclient ID. Prints a URL, opens a local callback listener on port 1455, waits for\nthe browser to redirect back, and stores the resulting access / refresh tokens\nin Keychain on macOS or locally on other platforms. The process exits\nautomatically once the tokens are saved.\n\n```\nclaude-code-proxy codex auth login\n```\n\nSign in with your **ChatGPT Plus/Pro account**, not an OpenAI API account. The\ntoken file includes the extracted `chatgpt_account_id`\n\nso the proxy can set the\n`ChatGPT-Account-Id`\n\nheader on every upstream call.\n\nSame OAuth flow, but for headless machines. Prints a short user code and a URL;\nyou enter the code from any browser on any other device, and the CLI polls\n`auth.openai.com`\n\nuntil you authorize, then stores the token.\n\n```\nclaude-code-proxy codex auth device\n```\n\nUseful over SSH, inside a container, or on any host that can't open a browser.\n\nShows whether credentials are stored, the account ID, and how long until the access token expires. Non-zero exit if no auth is present.\n\n```\nclaude-code-proxy codex auth status\n```\n\nExample output:\n\n```\nAccount: 79342a5e-57b7-44ea-bfdc-a83ba070dad6\nExpires: 2026-04-28T16:46:04.827Z (in 863946s)\nStorage: macOS Keychain\n```\n\nThe proxy refreshes the access token 5 minutes before expiry with a single-flight guard, so concurrent requests never trigger stampedes of refresh calls.\n\nRemoves stored auth credentials. On macOS this deletes the Keychain entry. No server call is needed; the refresh token just becomes dead.\n\n```\nclaude-code-proxy codex auth logout\n```\n\nRun `codex auth login`\n\nagain to re-authenticate.\n\nRuns a device-code OAuth flow (RFC 8628) against `auth.kimi.com`\n\nusing the\nkimi-cli client ID. Prints a verification URL and a short user code; open the\nURL in any browser, confirm the code, and the CLI polls until the tokens are\nissued. Tokens are stored in Keychain on macOS or a mode-0600 file elsewhere.\n\n```\nclaude-code-proxy kimi auth login\n```\n\nSign in with your **kimi.com account**. The access token has a ~15 minute\nlifetime; the proxy refreshes it 5 minutes before expiry with a single-flight\nguard and persists the rotated refresh token.\n\nA persistent device ID is generated on first login next to the Kimi auth file and reused forever — it's bound into the issued JWT, so rotating it would invalidate your token.\n\n```\nclaude-code-proxy kimi auth status\n```\n\nShows the user ID extracted from the token, expiry time, scope, and storage backend. Non-zero exit if no auth is present.\n\n```\nclaude-code-proxy kimi auth logout\n```\n\nRemoves stored auth credentials (Keychain entry on macOS, file elsewhere). Run\n`kimi auth login`\n\nagain to re-authenticate.\n\nThe proxy speaks enough of the Anthropic API for Claude Code:\n\n`POST /v1/messages`\n\n: the main turn endpoint (streaming and non-streaming)`POST /v1/messages?beta=true`\n\n: same (Claude Code always sends`?beta=true`\n\n)`POST /v1/messages/count_tokens`\n\n: local token count via`gpt-tokenizer`\n\n(o200k_base); used by Claude Code's compaction logic`GET /healthz`\n\n: liveness check\n\nSettings can come from either environment variables or a `config.json`\n\nfile.\nPrecedence per setting: **env var > config file > built-in default**. The\nconfig file is optional — env-var-only setups continue to work unchanged.\n\nThe file lives at `~/.config/claude-code-proxy/config.json`\n\non macOS\n(deliberately not `~/Library`\n\n), at `%APPDATA%\\claude-code-proxy\\config.json`\n\non\nWindows, and at\n`${XDG_CONFIG_HOME:-$HOME/.config}/claude-code-proxy/config.json`\n\non Linux.\n\n```\n{\n  \"port\": 18765,\n  \"aliasProvider\": \"codex\",\n  \"codex\": {\n    \"originator\": \"claude-code-proxy\",\n    \"userAgent\": \"claude-code-proxy/dev\",\n    \"model\": \"gpt-5.4\",\n    \"effort\": \"medium\",\n    \"serviceTier\": \"fast\",\n    \"baseUrl\": \"https://chatgpt.com/backend-api/codex/responses\"\n  },\n  \"kimi\": {\n    \"userAgent\": \"KimiCLI/1.37.0\",\n    \"oauthHost\": \"https://auth.kimi.com\",\n    \"baseUrl\": \"https://api.kimi.com/coding/v1\"\n  },\n  \"log\": {\n    \"stderr\": false,\n    \"verbose\": false\n  }\n}\n```\n\n| Variable | Config key | Default | Purpose |\n|---|---|---|---|\n`PORT` |\n`port` |\n`18765` |\nProxy listen port |\n`XDG_STATE_HOME` |\n— | `~/.local/state` |\nLinux/macOS base dir for `proxy.log` |\n`CCP_LOG_STDERR` |\n`log.stderr` |\nunset | Also mirror log lines to stderr |\n`CCP_LOG_VERBOSE` |\n`log.verbose` |\nunset | Log full request/response bodies + every SSE event |\n`CCP_ALIAS_PROVIDER` |\n`aliasProvider` |\n`codex` |\nRoute Anthropic-style aliases (`haiku` , `sonnet` , `opus` , `claude-*` ) through `codex` or `kimi` |\n`CCP_KIMI_OAUTH_HOST` |\n`kimi.oauthHost` |\n`https://auth.kimi.com` |\nOverride Kimi's OAuth host (debugging only) |\n`CCP_KIMI_BASE_URL` |\n`kimi.baseUrl` |\n`https://api.kimi.com/coding/v1` |\nOverride Kimi's API base URL |\n`CCP_CODEX_MODEL` |\n`codex.model` |\nunset | Force all Codex requests to this model (`gpt-5.2` , `gpt-5.3-codex` , `gpt-5.3-codex-spark` , `gpt-5.4` , `gpt-5.4-mini` , `gpt-5.5` ) |\n`CCP_CODEX_EFFORT` |\n`codex.effort` |\nunset | Force all Codex requests to this reasoning effort (`none` , `low` , `medium` , `high` , `xhigh` ) |\n`CCP_CODEX_SERVICE_TIER` |\n`codex.serviceTier` |\nunset | Force all Codex requests to this service tier (`fast` /`priority` , `flex` ; `fast` is sent upstream as `priority` ) |\n`CCP_CODEX_BASE_URL` |\n`codex.baseUrl` |\n`https://chatgpt.com/backend-api/codex/responses` |\nOverride the Codex Responses endpoint |\n`CCP_CODEX_ORIGINATOR` |\n`codex.originator` |\n`claude-code-proxy` |\nOverride the `originator` header sent to Codex |\n`CCP_CODEX_USER_AGENT` |\n`codex.userAgent` |\n`claude-code-proxy/<version>` |\nOverride the `User-Agent` header sent to Codex |\n`CCP_KIMI_USER_AGENT` |\n`kimi.userAgent` |\n`KimiCLI/1.37.0` |\nOverride the `User-Agent` header sent to Kimi |\n`CCP_ORIGINATOR` |\n— | `claude-code-proxy` |\nFallback for `CCP_CODEX_ORIGINATOR` |\n`CCP_USER_AGENT` |\n— | unset | Fallback for `CCP_CODEX_USER_AGENT` and `CCP_KIMI_USER_AGENT` |\n\nA malformed `config.json`\n\nis reported on stderr and ignored; defaults are used\nin its place. Invalid types for individual keys are warned and skipped without\naffecting other keys.\n\n`proxy.log`\n\n— JSON-lines log, rotated at 20 MiB. It lives at`$XDG_STATE_HOME/claude-code-proxy/proxy.log`\n\non macOS/Linux and at`%LOCALAPPDATA%\\claude-code-proxy\\proxy.log`\n\non Windows (falling back to`%USERPROFILE%\\AppData\\Local`\n\n). Secrets (`authorization`\n\n,`access`\n\n,`refresh`\n\n,`id_token`\n\n,`ChatGPT-Account-Id`\n\n, …) are redacted before write.`config.json`\n\n— optional configuration file (see table above). It lives at`~/.config/claude-code-proxy/config.json`\n\non macOS,`${XDG_CONFIG_HOME:-$HOME/.config}/claude-code-proxy/config.json`\n\non Linux, and`%APPDATA%\\claude-code-proxy\\config.json`\n\non Windows.- Codex tokens — macOS uses Keychain under service\n`claude-code-proxy.codex`\n\n. Linux uses`${XDG_CONFIG_HOME:-$HOME/.config}/claude-code-proxy/codex/auth.json`\n\n. Windows uses`%APPDATA%\\claude-code-proxy\\codex\\auth.json`\n\n. - Kimi tokens — macOS uses Keychain under service\n`claude-code-proxy.kimi`\n\n. Linux uses`${XDG_CONFIG_HOME:-$HOME/.config}/claude-code-proxy/kimi/auth.json`\n\n. Windows uses`%APPDATA%\\claude-code-proxy\\kimi\\auth.json`\n\n. - Kimi device ID — persistent UUID bound into the Kimi JWT at login. Linux uses\n`${XDG_CONFIG_HOME:-$HOME/.config}/claude-code-proxy/kimi/device_id`\n\n; Windows uses`%APPDATA%\\claude-code-proxy\\kimi\\device_id`\n\n. Reused for the lifetime of the install.\n\n**Terms of service:** using the Codex or Kimi backends from a non-official client is a gray area. Use at your own risk.**Rate limits:** shared across all clients of your upstream account. Codex's`codex.rate_limits.limit_reached`\n\nand Kimi's HTTP 429 are both surfaced as HTTP 429 with`retry-after`\n\n.**Codex — image inputs in tool results:** Responses API`function_call_output`\n\nonly takes a string, so image blocks nested inside`tool_result`\n\nare replaced with a`[image omitted: <media_type>]`\n\nplaceholder. Top-level user-message images pass through.**Kimi — image inputs in tool results:** pass through as`image_url`\n\nparts (Kimi accepts them in`role:\"tool\"`\n\ncontent).**Codex — reasoning blocks:** not forwarded to Claude Code (dropped), even if the upstream model produced them.**Kimi — reasoning blocks:** forwarded as Anthropic`thinking`\n\ncontent blocks and rendered by Claude Code. Disable by setting`thinking: {\"type\":\"disabled\"}`\n\nin your Anthropic request.**Session title generation:** Claude Code's parallel title-gen request is forwarded upstream like any other structured-output request. This costs a handful of tokens per session rather than being stubbed.**Codex —** translated to Responses API`output_config.format`\n\n:`text.format`\n\n(json_schema with`strict: true`\n\n); other Anthropic-specific`output_config`\n\nfields are dropped.\n\n```\nbunx tsc --noEmit                          # typecheck\nbun src/cli.ts serve                       # run locally (routes all providers)\ntail -f ~/.local/state/claude-code-proxy/proxy.log | jq .\n```\n\n**Install a compiled dev build globally:** compile the current working tree to a\nbinary and place it on your `PATH`\n\nwithout linking:\n\n```\nmkdir -p ~/.local/bin\nbun build ./src/cli.ts --compile --outfile ~/.local/bin/claude-code-proxy\n```\n\n[claude-history](https://github.com/raine/claude-history): search Claude Code conversation history from the terminal[git-surgeon](https://github.com/raine/git-surgeon): non-interactive hunk-level git staging for AI agents[workmux](https://github.com/raine/workmux): manage parallel AI coding tasks in separate git worktrees with tmux[consult-llm](https://github.com/raine/consult-llm): Consult other AI models from your agent workflow", "url": "https://wpnews.pro/news/show-hn-use-kimi-and-openai-subscriptions-in-claude-code", "canonical_source": "https://github.com/raine/claude-code-proxy", "published_at": "2026-05-30 19:23:51+00:00", "updated_at": "2026-05-30 19:46:17.321748+00:00", "lang": "en", "topics": ["ai-tools", "large-language-models", "ai-products"], "entities": ["Claude Code", "Anthropic", "OpenAI", "ChatGPT Plus", "Kimi Code", "OpenCode", "Codex", "Homebrew"], "alternates": {"html": "https://wpnews.pro/news/show-hn-use-kimi-and-openai-subscriptions-in-claude-code", "markdown": "https://wpnews.pro/news/show-hn-use-kimi-and-openai-subscriptions-in-claude-code.md", "text": "https://wpnews.pro/news/show-hn-use-kimi-and-openai-subscriptions-in-claude-code.txt", "jsonld": "https://wpnews.pro/news/show-hn-use-kimi-and-openai-subscriptions-in-claude-code.jsonld"}}