Last active
May 16, 2026 21:25
-
-
Save sshh12/f2c402db02eb00982100f645519bd8c3 to your computer and use it in GitHub Desktop.
Use Claude Code CLI via OpenAI/Codex Config
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/env bash | |
| # | |
| # Run Claude Code through a local LiteLLM gateway backed by your Codex OpenAI key. | |
| # | |
| # Usage: | |
| # ./claude-through-codex -p hi | |
| # ./claude-through-codex | |
| # | |
| # Requirements: | |
| # - claude on PATH | |
| # - uv/uvx or litellm on PATH | |
| # - OPENAI_API_KEY in the environment, or an API-key Codex login at ~/.codex/auth.json | |
| # | |
| # Configuration: | |
| # CLAUDE_THROUGH_CODEX_MODEL=gpt-5.5 OpenAI model LiteLLM routes to | |
| # CLAUDE_THROUGH_CODEX_PORT=4000 local LiteLLM port | |
| # CLAUDE_THROUGH_CODEX_HOST=127.0.0.1 local LiteLLM bind host | |
| # CLAUDE_THROUGH_CODEX_ALIAS=claude-through-codex | |
| # CLAUDE_THROUGH_CODEX_GATEWAY_KEY=sk-claude-through-codex | |
| # CLAUDE_THROUGH_CODEX_LITELLM_SPEC='litellm[proxy]!=1.82.7,!=1.82.8' | |
| # | |
| # Example: | |
| # CLAUDE_THROUGH_CODEX_MODEL=gpt-5.4 ./claude-through-codex -p "summarize this repo" | |
| set -euo pipefail | |
| PORT="${CLAUDE_THROUGH_CODEX_PORT:-4000}" | |
| HOST="${CLAUDE_THROUGH_CODEX_HOST:-127.0.0.1}" | |
| MODEL="${CLAUDE_THROUGH_CODEX_MODEL:-gpt-5.5}" | |
| LITELLM_SPEC="${CLAUDE_THROUGH_CODEX_LITELLM_SPEC:-litellm[proxy]!=1.82.7,!=1.82.8}" | |
| CLAUDE_MODEL_ALIAS="${CLAUDE_THROUGH_CODEX_ALIAS:-claude-through-codex}" | |
| GATEWAY_KEY="${CLAUDE_THROUGH_CODEX_GATEWAY_KEY:-sk-claude-through-codex}" | |
| BASE_URL="http://${HOST}:${PORT}" | |
| CONFIG_FILE="${TMPDIR:-/tmp}/claude-through-codex-litellm.yaml" | |
| LOG_FILE="${TMPDIR:-/tmp}/claude-through-codex-litellm.log" | |
| if ! command -v claude >/dev/null 2>&1; then | |
| echo "claude-through-codex: claude CLI not found on PATH" >&2 | |
| exit 127 | |
| fi | |
| if command -v litellm >/dev/null 2>&1; then | |
| LITELLM=(litellm) | |
| elif command -v uvx >/dev/null 2>&1; then | |
| LITELLM=(uvx --from "$LITELLM_SPEC" litellm) | |
| elif command -v uv >/dev/null 2>&1; then | |
| LITELLM=(uv tool run --from "$LITELLM_SPEC" litellm) | |
| else | |
| echo "claude-through-codex: install uv or litellm first. Recommended: brew install uv" >&2 | |
| exit 127 | |
| fi | |
| if [[ -z "${OPENAI_API_KEY:-}" ]]; then | |
| if [[ -r "${CODEX_HOME:-$HOME/.codex}/auth.json" ]]; then | |
| OPENAI_API_KEY="$( | |
| jq -er '.OPENAI_API_KEY // empty' "${CODEX_HOME:-$HOME/.codex}/auth.json" | |
| )" | |
| export OPENAI_API_KEY | |
| fi | |
| fi | |
| if [[ -z "${OPENAI_API_KEY:-}" ]]; then | |
| echo "claude-through-codex: no OPENAI_API_KEY found in env or ${CODEX_HOME:-$HOME/.codex}/auth.json" >&2 | |
| exit 1 | |
| fi | |
| cat >"$CONFIG_FILE" <<EOF | |
| model_list: | |
| - model_name: ${CLAUDE_MODEL_ALIAS} | |
| litellm_params: | |
| model: openai/${MODEL} | |
| api_key: os.environ/OPENAI_API_KEY | |
| litellm_settings: | |
| drop_params: true | |
| general_settings: | |
| master_key: ${GATEWAY_KEY} | |
| EOF | |
| if ! curl -fsS "${BASE_URL}/health/liveliness" >/dev/null 2>&1; then | |
| "${LITELLM[@]}" --config "$CONFIG_FILE" --host "$HOST" --port "$PORT" >"$LOG_FILE" 2>&1 & | |
| LITELLM_PID="$!" | |
| trap 'kill "$LITELLM_PID" >/dev/null 2>&1 || true' EXIT | |
| READY=0 | |
| for _ in {1..60}; do | |
| if curl -fsS "${BASE_URL}/health/liveliness" >/dev/null 2>&1; then | |
| READY=1 | |
| break | |
| fi | |
| if ! kill -0 "$LITELLM_PID" >/dev/null 2>&1; then | |
| echo "claude-through-codex: litellm exited early. See $LOG_FILE" >&2 | |
| exit 1 | |
| fi | |
| sleep 0.25 | |
| done | |
| if [[ "$READY" != 1 ]]; then | |
| echo "claude-through-codex: litellm did not become ready. See $LOG_FILE" >&2 | |
| exit 1 | |
| fi | |
| fi | |
| export ANTHROPIC_BASE_URL="$BASE_URL" | |
| export ANTHROPIC_AUTH_TOKEN="$GATEWAY_KEY" | |
| export ANTHROPIC_MODEL="${ANTHROPIC_MODEL:-$CLAUDE_MODEL_ALIAS}" | |
| export ANTHROPIC_DEFAULT_OPUS_MODEL="${ANTHROPIC_DEFAULT_OPUS_MODEL:-$CLAUDE_MODEL_ALIAS}" | |
| export ANTHROPIC_DEFAULT_SONNET_MODEL="${ANTHROPIC_DEFAULT_SONNET_MODEL:-$CLAUDE_MODEL_ALIAS}" | |
| export ANTHROPIC_DEFAULT_HAIKU_MODEL="${ANTHROPIC_DEFAULT_HAIKU_MODEL:-$CLAUDE_MODEL_ALIAS}" | |
| export CLAUDE_CODE_SUBAGENT_MODEL="${CLAUDE_CODE_SUBAGENT_MODEL:-$CLAUDE_MODEL_ALIAS}" | |
| export CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS="${CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS:-1}" | |
| exec claude "$@" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment