Local branch had diverged from origin/master (sibling commits on the same base). Rewrote local history linearly on top of origin/master, folding in all local content: exa/hot-platform discovery hunters, leaks ledger, nightly sweep orchestrator, updated .gitignore and skill docs, plus the latest hunt output and vault state. Remote-only files (vault keys, channel scripts) were restored rather than dropped, so the resulting tree is a full union of both sides.
1 line
501 KiB
JSON
1 line
501 KiB
JSON
{"repo": "ahoo-wang/godex", "files": {"README.md": {"9efb5d28b803166fc52e46da8d469512befd054b": {"t": 1785595198.5481348, "n": 12669, "h": "26353555bff64e0a", "c": "<div align=\"center\">\n\n<img src=\"design/assets/01-logo-system/png/godex-logo-horizontal-transparent-800x233.png\" alt=\"GodeX\" width=\"480\" />\n\n**Make every model a Codex engine.**\n\nOpenAI-compatible Responses API gateway for Codex, CLI tools and developer agents.\n\n[](https://www.npmjs.com/package/@ahoo-wang/godex)\n[](https://codecov.io/gh/Ahoo-Wang/GodeX)\n[](https://bun.sh)\n[](https://www.typescriptlang.org/)\n\n[**English Documentation**](https://godex.ahoo.me/) · [**中文文档**](https://godex.ahoo.me/zh/)\n</div>\n\nGodeX lets clients that speak the OpenAI Responses API use providers such as DeepSeek, Xiaomi, MiniMax, and Zhipu through one local server.\n\n\n\n## Highlights\n\n- OpenAI-compatible `POST /v1/responses` endpoint with sync and streaming responses.\n- `GET /v1/models` aliases so clients can use stable model names while GodeX routes to provider/model targets.\n- Built-in bridge providers for DeepSeek, Xiaomi, MiniMax, and Zhipu.\n- Provider capability planning for request parameters, tools, `tool_choice`, structured output formats, reasoning, and stream usage.\n- Hybrid web search support with provider-native declarations for Zhipu/Xiaomi and GodeX-managed hosted search through the Zhipu Web Search API.\n- Responses `previous_response_id` session chains backed by memory or SQLite.\n- Trace recording for provider requests, provider responses, stream events, usage, and errors.\n- Native Bun runtime, TypeScript source, and compiled platform binaries for releases.\n\n## Built-in Providers\n\n| Provider | Reasoning | GodeX Input | Tool Choice | Response Format | Cached Tokens | Default Model |\n|----------|-----------|-------------|-------------|-----------------|---------------|---------------|\n| DeepSeek | native | text | auto, none, required, function | text, json_object | ✅ | `deepseek-v4-pro` |\n| Xiaomi | boolean | text | auto | text, json_object | ✅ | `mimo-v2.5-pro` |\n| MiniMax | boolean | text, image, video | auto, none, required, function | text, json_object | ✅ | `MiniMax-M3` |\n| Zhipu | boolean | text | auto, none | text, json_object | ✅ | `glm-5.2` |\n\n## Architecture\n\n\n\n## Component Interaction\n\n\n\n## Install\n\nFor local development:\n\n```bash\ngit clone https://github.com/Ahoo-Wang/GodeX.git\ncd GodeX\nbun install\n```\n\nFor package use, install the published package and run the `godex` binary:\n\n```bash\nnpm install -g @ahoo-wang/godex\ngodex --help\n```\n\n### Docker\n\nPre-built images are published to Docker Hub and GitHub Container Registry:\n\n```bash\ndocker pull ahoowang/godex:latest\n# or\ndocker pull ghcr.io/ahoo-wang/godex:latest\n```\n\nRun with a config file:\n\n```bash\ndocker run -d \\\n --name godex \\\n -p 5678:5678 \\\n -e ZHIPU_API_KEY=your-key \\\n -e DEEPSEEK_API_KEY=your-key \\\n -e MINIMAX_API_KEY=your-key \\\n -e MIMO_API_KEY=your-key \\\n -v ./godex.yaml:/etc/godex/godex.yaml:ro \\\n -v godex-data:/data \\\n ahoowang/godex:latest\n```\n\nThe image supports `linux/amd64` and `linux/arm64`.\n\n- Config file: `/etc/godex/godex.yaml`\n- Data directory (sessions, trace): `/data`\n- Default port: `5678`\n\n## Quick Start\n\nCreate a config and start the server:\n\n```bash\ngodex init\ngodex serve --config ./godex.yaml\n```\n\nThe interactive wizard walks you through selecting providers, entering base URLs and API keys, and writes the config file automatically.\n\nAlternatively, create `godex.yaml` manually:\n\n```yaml\nserver:\n port: 5678\n host: 0.0.0.0\n\ndefault_provider: deepseek\n\nmodels:\n aliases:\n # -------------------------------------------------------------------------\n # Codex-compatible model aliases\n #\n # 这些 alias 是 GodeX routing policy,不代表与 OpenAI 原模型能力等价。\n # 依据优先级:公开 benchmark > 官方模型定位 > Provider 产品说明。\n # -------------------------------------------------------------------------\n\n # Codex 默认主力:复杂编码 / computer use / research workflows\n # 依据:DeepSeek V4-Pro 在 SWE / Terminal / Codeforces / GDPval-AA 上公开成绩强。\n gpt-5.5: \"deepseek/deepseek-v4-pro\"\n\n # Codex 旗舰:coding + reasoning + tool use + agentic workflows\n # 依据:DeepSeek V4-Pro 有更完整的公开 coding/agentic benchmark 覆盖。\n gpt-5.4: \"deepseek/deepseek-v4-pro\"\n\n # Codex mini:subagents\n gpt-5.4-mini: \"zhipu/glm-5.1\"\n\n # Codex 编码专用:复杂软件工程\n # 依据:DeepSeek V4-Pro 的 SWE Verified / SWE Pro / Terminal Bench 表现。\n gpt-5.3-codex: \"deepseek/deepseek-v4-pro\"\n\n # Codex spark:近实时编码迭代\n gpt-5.3-codex-spark: \"zhipu/glm-5.1\"\n\n # 上一代通用 coding / agentic fallback\n # 严谨起见仍走 DeepSeek;不强行映射到 Zhipu。\n gpt-5.2: \"deepseek/deepseek-v4-pro\"\n\n # -------------------------------------------------------------------------\n # Provider native models\n # -------------------------------------------------------------------------\n\n deepseek-v4-pro: \"deepseek/deepseek-v4-pro\"\n deepseek-v4-flash: \"deepseek/deepseek-v4-flash\"\n\n mimo-v2.5-pro: \"xiaomi/mimo-v2.5-pro\"\n mimo-v2.5: \"xiaomi/mimo-v2.5\"\n\n glm-5.1: \"zhipu/glm-5.1\"\n glm-5-turbo: \"zhipu/glm-5-turbo\"\n glm-4.7: \"zhipu/glm-4.7\"\n glm-4.5-air: \"zhipu/glm-4.5-air\"\n\n MiniMax-M3: \"minimax/MiniMax-M3\"\n\n # Fallback for unknown bare model names\n \"*\": \"deepseek/deepseek-v4-pro\"\n\nproviders:\n deepseek:\n spec: deepseek\n credentials:\n api_key: ${DEEPSEEK_API_KEY}\n endpoint:\n base_url: https://api.deepseek.com\n zhipu:\n spec: zhipu\n credentials:\n api_key: ${ZHIPU_API_KEY}\n endpoint:\n base_url: https://open.bigmodel.cn/api/coding/paas/v4\n minimax:\n spec: minimax\n credentials:\n api_key: ${MINIMAX_API_KEY}\n endpoint:\n base_url: https://api.minimaxi.com/v1\n xiaomi:\n spec: xiaomi\n credentials:\n api_key: ${MIMO_API_KEY}\n endpoint:\n base_url: https://api.xiaomimimo.com/v1\n\nweb_search:\n enabled: true\n mode: auto\n provider: zhipu\n on_unavailable: client_tool_call\n max_iterations: 2\n\nsession:\n backend: sqlite\n\nlogging:\n level: info\n\ntrace:\n enabled: true\n path: ./data/trace.db\n capture_payload: false\n```\n\nStart the server:\n\n```bash\ngodex serve --config ./godex.yaml\n```\n\nThe dev command starts GodeX on port `13145`; the default runtime config port is `5678`.\n\n## API\n\n### Health\n\n```bash\ncurl http://localhost:5678/health\n```\n\n### Models\n\n```bash\ncurl http://localhost:5678/v1/models\n```\n\n`/v1/models` lists configured aliases, excluding the wildcard alias `*`.\n\n### Responses\n\n```bash\ncurl http://localhost:5678/v1/responses \\\n -H 'content-type: application/json' \\\n -d '{\n \"model\": \"gpt-5.5\",\n \"input\": \"Write a short TypeScript function that adds two numbers.\"\n }'\n```\n\nStreaming uses standard Responses SSE event names:\n\n```bash\ncurl -N http://localhost:5678/v1/responses \\\n -H 'content-type: application/json' \\\n -d '{\n \"model\": \"gpt-5.5\",\n \"stream\": true,\n \"input\": \"Explain Bun streams in two sentences.\"\n }'\n```\n\n## Model Routing\n\nClients may pass either:\n\n- A provider-qualified selector such as `deepseek/deepseek-v4-pro`\n- A configured alias such as `gpt-5.5`\n- A bare model name, which resolves through `default_provider` when no alias matches\n\nAliases must map to `provider/model` values, and the provider must exist in `providers`.\n\n\n## Codex Integration\n\nConnect the Codex desktop app to GodeX by adding a custom provider in `~/.codex/config.toml`:\n\n```toml\nmodel = \"gpt-5.5\"\nmodel_provider = \"godex\"\n\n[model_providers.godex]\nname = \"GodeX\"\nbase_url = \"http://127.0.0.1:5678/v1\"\nwire_api = \"responses\"\nrequires_openai_auth = false\nsupports_websockets = false\n```\n\nModel aliases (`gpt-5.5`, `gpt-5.4`, `gpt-5.4-mini`, etc.) are resolved by GodeX using the `models.aliases` map in `godex.yaml` — Codex itself only needs the alias name.\n\n\n## Provider Bridge Behavior\n\nGodeX builds a provider request in three steps:\n\n1. Resolve the client model selector to a configured provider and upstream model.\n2. Plan compatibility from the provider `ProviderSpec`, including request parameters, tool declarations, `tool_choice`, response format, reasoning, and stream usage.\n3. Convert Responses input and session history into Chat Completions messages, call the upstream provider, and reconstruct a Responses object or Responses SSE stream.\n\nProvider-specific differences belong in each provider's `spec.ts`, `hooks.ts`, protocol types, and HTTP client. Shared Responses-to-Chat policy belongs under `src/bridge`.\n\n## Structured Output\n\nWhen a provider supports `json_object` but not native `json_schema`, GodeX can degrade strict `json_schema` requests to `json_object`.\n\nFor strict downgraded schemas:\n\n- The schema instruction is added to the provider prompt preamble for the current request.\n- The provider receives `response_format: { \"type\": \"json_object\" }`.\n- GodeX validates that the final output is valid JSON.\n- Invalid sync output fails the response; invalid stream output is rewritten to a terminal `response.failed` event.\n\nThe validator checks JSON syntax, not full JSON Schema conformance.\n\n## Sessions\n\nResponses can be stored and replayed with `previous_response_id`.\n\n- `session.backend: memory` keeps history in process memory.\n- `session.backend: sqlite` persists history to SQLite.\n- Requests with `store: false` are not saved.\n- The session chain stores request snapshots and response output items, then rebuilds provider-neutral history on the next turn.\n\n## Trace Database\n\nTracing is enabled by default and writes SQLite rows to `./data/trace.db` unless configured otherwise.\n\nTrace records include:\n\n- Provider request metadata and final patched request payload summaries\n- Provider request lifecycle events without duplicating full request bodies\n- Sync provider response bodies as summarized payloads\n- Raw and transformed stream events\n- Usage details, including cached tokens when provided by the upstream\n- Route and provider errors\n\nSet `trace.capture_payload: true` to persist payload JSON up to `trace.payload_max_bytes` for trace rows that carry payloads. Keep it disabled for sensitive environments.\n\n## Development\n\n```bash\nbun install # Install dependencies\nbun run dev # Dev server with hot reload on port 13145\nbun run start # Start server from source\nbun run build # Build a binary for the current platform\nbun run compile:all # Cross-compile all supported platform packages\n```\n\nQuality gates:\n\n```bash\nbun run typecheck # TypeScript\nbun run lint # Biome check\nbun run lint:fix # Biome autofix\nbun run format # Biome format\nbun run test # Unit and integration tests, excluding src/e2e\nbun run test:e2e # Mocked end-to-end tests\nbun run test:zhipu # Live Zhipu tests; requires ZHIPU_API_KEY\nbun run test:deepseek # Live DeepSeek tests; requires DEEPSEEK_API_KEY\nbun run test:minimax # Live MiniMax tests; requires MINIMAX_API_KEY\nbun run test:xiaomi # Live Xiaomi tests; requires MIMO_API_KEY\nbun run check # typecheck + lint + test\nbun run ci # typecheck + biome ci + test + e2e\n```\n\n## Source Map\n\n```text\nsrc/\n cli/ Commander CLI, init wizard, runtime config loading\n config/ godex.yaml schema, defaults, env interpolation\n context/ ApplicationContext and per-request ResponsesContext\n bridge/ Provider-agnostic Responses-to-Chat planning and reconstruction\n providers/ Built-in provider specs, hooks, clients, and registry\n responses/ Sync and stream request pipelines\n server/ Bun routes for /health, /v1/models, /v1/responses\n session/ Memory and SQLite response session stores\n trace/ SQLite trace recorder and usage/error/event mappers\n protocol/ OpenAI protocol type definitions\n error/ GodeXError hierarchy and domain codes\n```\n\n## Provider Development\n\nProvider folders follow this shape:\n\n```text\nsrc/providers/<name>/\n spec.ts ProviderSpec declaration\n client.ts ProviderEdge construction with ChatProviderClient\n hooks.ts Provider-specific patching, accessors, usage, stream deltas\n protocol/ Provider DTOs when needed\n index.ts Public exports\n```\n\nAdd shared compatibility policy to `src/bridge`; add shared provider transport or protocol helpers to `src/providers/shared`.\n\n## License\n\nApache-2.0. See [LICENSE](./LICENSE).\n"}, "65e82bfe593cda21c1ea3f408546df5519d939a1": {"t": 1785746651.2833636, "n": 12669, "h": "26353555bff64e0a", "c": "<div align=\"center\">\n\n<img src=\"design/assets/01-logo-system/png/godex-logo-horizontal-transparent-800x233.png\" alt=\"GodeX\" width=\"480\" />\n\n**Make every model a Codex engine.**\n\nOpenAI-compatible Responses API gateway for Codex, CLI tools and developer agents.\n\n[](https://www.npmjs.com/package/@ahoo-wang/godex)\n[](https://codecov.io/gh/Ahoo-Wang/GodeX)\n[](https://bun.sh)\n[](https://www.typescriptlang.org/)\n\n[**English Documentation**](https://godex.ahoo.me/) · [**中文文档**](https://godex.ahoo.me/zh/)\n</div>\n\nGodeX lets clients that speak the OpenAI Responses API use providers such as DeepSeek, Xiaomi, MiniMax, and Zhipu through one local server.\n\n\n\n## Highlights\n\n- OpenAI-compatible `POST /v1/responses` endpoint with sync and streaming responses.\n- `GET /v1/models` aliases so clients can use stable model names while GodeX routes to provider/model targets.\n- Built-in bridge providers for DeepSeek, Xiaomi, MiniMax, and Zhipu.\n- Provider capability planning for request parameters, tools, `tool_choice`, structured output formats, reasoning, and stream usage.\n- Hybrid web search support with provider-native declarations for Zhipu/Xiaomi and GodeX-managed hosted search through the Zhipu Web Search API.\n- Responses `previous_response_id` session chains backed by memory or SQLite.\n- Trace recording for provider requests, provider responses, stream events, usage, and errors.\n- Native Bun runtime, TypeScript source, and compiled platform binaries for releases.\n\n## Built-in Providers\n\n| Provider | Reasoning | GodeX Input | Tool Choice | Response Format | Cached Tokens | Default Model |\n|----------|-----------|-------------|-------------|-----------------|---------------|---------------|\n| DeepSeek | native | text | auto, none, required, function | text, json_object | ✅ | `deepseek-v4-pro` |\n| Xiaomi | boolean | text | auto | text, json_object | ✅ | `mimo-v2.5-pro` |\n| MiniMax | boolean | text, image, video | auto, none, required, function | text, json_object | ✅ | `MiniMax-M3` |\n| Zhipu | boolean | text | auto, none | text, json_object | ✅ | `glm-5.2` |\n\n## Architecture\n\n\n\n## Component Interaction\n\n\n\n## Install\n\nFor local development:\n\n```bash\ngit clone https://github.com/Ahoo-Wang/GodeX.git\ncd GodeX\nbun install\n```\n\nFor package use, install the published package and run the `godex` binary:\n\n```bash\nnpm install -g @ahoo-wang/godex\ngodex --help\n```\n\n### Docker\n\nPre-built images are published to Docker Hub and GitHub Container Registry:\n\n```bash\ndocker pull ahoowang/godex:latest\n# or\ndocker pull ghcr.io/ahoo-wang/godex:latest\n```\n\nRun with a config file:\n\n```bash\ndocker run -d \\\n --name godex \\\n -p 5678:5678 \\\n -e ZHIPU_API_KEY=your-key \\\n -e DEEPSEEK_API_KEY=your-key \\\n -e MINIMAX_API_KEY=your-key \\\n -e MIMO_API_KEY=your-key \\\n -v ./godex.yaml:/etc/godex/godex.yaml:ro \\\n -v godex-data:/data \\\n ahoowang/godex:latest\n```\n\nThe image supports `linux/amd64` and `linux/arm64`.\n\n- Config file: `/etc/godex/godex.yaml`\n- Data directory (sessions, trace): `/data`\n- Default port: `5678`\n\n## Quick Start\n\nCreate a config and start the server:\n\n```bash\ngodex init\ngodex serve --config ./godex.yaml\n```\n\nThe interactive wizard walks you through selecting providers, entering base URLs and API keys, and writes the config file automatically.\n\nAlternatively, create `godex.yaml` manually:\n\n```yaml\nserver:\n port: 5678\n host: 0.0.0.0\n\ndefault_provider: deepseek\n\nmodels:\n aliases:\n # -------------------------------------------------------------------------\n # Codex-compatible model aliases\n #\n # 这些 alias 是 GodeX routing policy,不代表与 OpenAI 原模型能力等价。\n # 依据优先级:公开 benchmark > 官方模型定位 > Provider 产品说明。\n # -------------------------------------------------------------------------\n\n # Codex 默认主力:复杂编码 / computer use / research workflows\n # 依据:DeepSeek V4-Pro 在 SWE / Terminal / Codeforces / GDPval-AA 上公开成绩强。\n gpt-5.5: \"deepseek/deepseek-v4-pro\"\n\n # Codex 旗舰:coding + reasoning + tool use + agentic workflows\n # 依据:DeepSeek V4-Pro 有更完整的公开 coding/agentic benchmark 覆盖。\n gpt-5.4: \"deepseek/deepseek-v4-pro\"\n\n # Codex mini:subagents\n gpt-5.4-mini: \"zhipu/glm-5.1\"\n\n # Codex 编码专用:复杂软件工程\n # 依据:DeepSeek V4-Pro 的 SWE Verified / SWE Pro / Terminal Bench 表现。\n gpt-5.3-codex: \"deepseek/deepseek-v4-pro\"\n\n # Codex spark:近实时编码迭代\n gpt-5.3-codex-spark: \"zhipu/glm-5.1\"\n\n # 上一代通用 coding / agentic fallback\n # 严谨起见仍走 DeepSeek;不强行映射到 Zhipu。\n gpt-5.2: \"deepseek/deepseek-v4-pro\"\n\n # -------------------------------------------------------------------------\n # Provider native models\n # -------------------------------------------------------------------------\n\n deepseek-v4-pro: \"deepseek/deepseek-v4-pro\"\n deepseek-v4-flash: \"deepseek/deepseek-v4-flash\"\n\n mimo-v2.5-pro: \"xiaomi/mimo-v2.5-pro\"\n mimo-v2.5: \"xiaomi/mimo-v2.5\"\n\n glm-5.1: \"zhipu/glm-5.1\"\n glm-5-turbo: \"zhipu/glm-5-turbo\"\n glm-4.7: \"zhipu/glm-4.7\"\n glm-4.5-air: \"zhipu/glm-4.5-air\"\n\n MiniMax-M3: \"minimax/MiniMax-M3\"\n\n # Fallback for unknown bare model names\n \"*\": \"deepseek/deepseek-v4-pro\"\n\nproviders:\n deepseek:\n spec: deepseek\n credentials:\n api_key: ${DEEPSEEK_API_KEY}\n endpoint:\n base_url: https://api.deepseek.com\n zhipu:\n spec: zhipu\n credentials:\n api_key: ${ZHIPU_API_KEY}\n endpoint:\n base_url: https://open.bigmodel.cn/api/coding/paas/v4\n minimax:\n spec: minimax\n credentials:\n api_key: ${MINIMAX_API_KEY}\n endpoint:\n base_url: https://api.minimaxi.com/v1\n xiaomi:\n spec: xiaomi\n credentials:\n api_key: ${MIMO_API_KEY}\n endpoint:\n base_url: https://api.xiaomimimo.com/v1\n\nweb_search:\n enabled: true\n mode: auto\n provider: zhipu\n on_unavailable: client_tool_call\n max_iterations: 2\n\nsession:\n backend: sqlite\n\nlogging:\n level: info\n\ntrace:\n enabled: true\n path: ./data/trace.db\n capture_payload: false\n```\n\nStart the server:\n\n```bash\ngodex serve --config ./godex.yaml\n```\n\nThe dev command starts GodeX on port `13145`; the default runtime config port is `5678`.\n\n## API\n\n### Health\n\n```bash\ncurl http://localhost:5678/health\n```\n\n### Models\n\n```bash\ncurl http://localhost:5678/v1/models\n```\n\n`/v1/models` lists configured aliases, excluding the wildcard alias `*`.\n\n### Responses\n\n```bash\ncurl http://localhost:5678/v1/responses \\\n -H 'content-type: application/json' \\\n -d '{\n \"model\": \"gpt-5.5\",\n \"input\": \"Write a short TypeScript function that adds two numbers.\"\n }'\n```\n\nStreaming uses standard Responses SSE event names:\n\n```bash\ncurl -N http://localhost:5678/v1/responses \\\n -H 'content-type: application/json' \\\n -d '{\n \"model\": \"gpt-5.5\",\n \"stream\": true,\n \"input\": \"Explain Bun streams in two sentences.\"\n }'\n```\n\n## Model Routing\n\nClients may pass either:\n\n- A provider-qualified selector such as `deepseek/deepseek-v4-pro`\n- A configured alias such as `gpt-5.5`\n- A bare model name, which resolves through `default_provider` when no alias matches\n\nAliases must map to `provider/model` values, and the provider must exist in `providers`.\n\n\n## Codex Integration\n\nConnect the Codex desktop app to GodeX by adding a custom provider in `~/.codex/config.toml`:\n\n```toml\nmodel = \"gpt-5.5\"\nmodel_provider = \"godex\"\n\n[model_providers.godex]\nname = \"GodeX\"\nbase_url = \"http://127.0.0.1:5678/v1\"\nwire_api = \"responses\"\nrequires_openai_auth = false\nsupports_websockets = false\n```\n\nModel aliases (`gpt-5.5`, `gpt-5.4`, `gpt-5.4-mini`, etc.) are resolved by GodeX using the `models.aliases` map in `godex.yaml` — Codex itself only needs the alias name.\n\n\n## Provider Bridge Behavior\n\nGodeX builds a provider request in three steps:\n\n1. Resolve the client model selector to a configured provider and upstream model.\n2. Plan compatibility from the provider `ProviderSpec`, including request parameters, tool declarations, `tool_choice`, response format, reasoning, and stream usage.\n3. Convert Responses input and session history into Chat Completions messages, call the upstream provider, and reconstruct a Responses object or Responses SSE stream.\n\nProvider-specific differences belong in each provider's `spec.ts`, `hooks.ts`, protocol types, and HTTP client. Shared Responses-to-Chat policy belongs under `src/bridge`.\n\n## Structured Output\n\nWhen a provider supports `json_object` but not native `json_schema`, GodeX can degrade strict `json_schema` requests to `json_object`.\n\nFor strict downgraded schemas:\n\n- The schema instruction is added to the provider prompt preamble for the current request.\n- The provider receives `response_format: { \"type\": \"json_object\" }`.\n- GodeX validates that the final output is valid JSON.\n- Invalid sync output fails the response; invalid stream output is rewritten to a terminal `response.failed` event.\n\nThe validator checks JSON syntax, not full JSON Schema conformance.\n\n## Sessions\n\nResponses can be stored and replayed with `previous_response_id`.\n\n- `session.backend: memory` keeps history in process memory.\n- `session.backend: sqlite` persists history to SQLite.\n- Requests with `store: false` are not saved.\n- The session chain stores request snapshots and response output items, then rebuilds provider-neutral history on the next turn.\n\n## Trace Database\n\nTracing is enabled by default and writes SQLite rows to `./data/trace.db` unless configured otherwise.\n\nTrace records include:\n\n- Provider request metadata and final patched request payload summaries\n- Provider request lifecycle events without duplicating full request bodies\n- Sync provider response bodies as summarized payloads\n- Raw and transformed stream events\n- Usage details, including cached tokens when provided by the upstream\n- Route and provider errors\n\nSet `trace.capture_payload: true` to persist payload JSON up to `trace.payload_max_bytes` for trace rows that carry payloads. Keep it disabled for sensitive environments.\n\n## Development\n\n```bash\nbun install # Install dependencies\nbun run dev # Dev server with hot reload on port 13145\nbun run start # Start server from source\nbun run build # Build a binary for the current platform\nbun run compile:all # Cross-compile all supported platform packages\n```\n\nQuality gates:\n\n```bash\nbun run typecheck # TypeScript\nbun run lint # Biome check\nbun run lint:fix # Biome autofix\nbun run format # Biome format\nbun run test # Unit and integration tests, excluding src/e2e\nbun run test:e2e # Mocked end-to-end tests\nbun run test:zhipu # Live Zhipu tests; requires ZHIPU_API_KEY\nbun run test:deepseek # Live DeepSeek tests; requires DEEPSEEK_API_KEY\nbun run test:minimax # Live MiniMax tests; requires MINIMAX_API_KEY\nbun run test:xiaomi # Live Xiaomi tests; requires MIMO_API_KEY\nbun run check # typecheck + lint + test\nbun run ci # typecheck + biome ci + test + e2e\n```\n\n## Source Map\n\n```text\nsrc/\n cli/ Commander CLI, init wizard, runtime config loading\n config/ godex.yaml schema, defaults, env interpolation\n context/ ApplicationContext and per-request ResponsesContext\n bridge/ Provider-agnostic Responses-to-Chat planning and reconstruction\n providers/ Built-in provider specs, hooks, clients, and registry\n responses/ Sync and stream request pipelines\n server/ Bun routes for /health, /v1/models, /v1/responses\n session/ Memory and SQLite response session stores\n trace/ SQLite trace recorder and usage/error/event mappers\n protocol/ OpenAI protocol type definitions\n error/ GodeXError hierarchy and domain codes\n```\n\n## Provider Development\n\nProvider folders follow this shape:\n\n```text\nsrc/providers/<name>/\n spec.ts ProviderSpec declaration\n client.ts ProviderEdge construction with ChatProviderClient\n hooks.ts Provider-specific patching, accessors, usage, stream deltas\n protocol/ Provider DTOs when needed\n index.ts Public exports\n```\n\nAdd shared compatibility policy to `src/bridge`; add shared provider transport or protocol helpers to `src/providers/shared`.\n\n## License\n\nApache-2.0. See [LICENSE](./LICENSE).\n"}, "73dc7f9db96e952601047e466be3730d0cc8886c": {"t": 1785748565.482432, "n": 12669, "h": "26353555bff64e0a", "c": "<div align=\"center\">\n\n<img src=\"design/assets/01-logo-system/png/godex-logo-horizontal-transparent-800x233.png\" alt=\"GodeX\" width=\"480\" />\n\n**Make every model a Codex engine.**\n\nOpenAI-compatible Responses API gateway for Codex, CLI tools and developer agents.\n\n[](https://www.npmjs.com/package/@ahoo-wang/godex)\n[](https://codecov.io/gh/Ahoo-Wang/GodeX)\n[](https://bun.sh)\n[](https://www.typescriptlang.org/)\n\n[**English Documentation**](https://godex.ahoo.me/) · [**中文文档**](https://godex.ahoo.me/zh/)\n</div>\n\nGodeX lets clients that speak the OpenAI Responses API use providers such as DeepSeek, Xiaomi, MiniMax, and Zhipu through one local server.\n\n\n\n## Highlights\n\n- OpenAI-compatible `POST /v1/responses` endpoint with sync and streaming responses.\n- `GET /v1/models` aliases so clients can use stable model names while GodeX routes to provider/model targets.\n- Built-in bridge providers for DeepSeek, Xiaomi, MiniMax, and Zhipu.\n- Provider capability planning for request parameters, tools, `tool_choice`, structured output formats, reasoning, and stream usage.\n- Hybrid web search support with provider-native declarations for Zhipu/Xiaomi and GodeX-managed hosted search through the Zhipu Web Search API.\n- Responses `previous_response_id` session chains backed by memory or SQLite.\n- Trace recording for provider requests, provider responses, stream events, usage, and errors.\n- Native Bun runtime, TypeScript source, and compiled platform binaries for releases.\n\n## Built-in Providers\n\n| Provider | Reasoning | GodeX Input | Tool Choice | Response Format | Cached Tokens | Default Model |\n|----------|-----------|-------------|-------------|-----------------|---------------|---------------|\n| DeepSeek | native | text | auto, none, required, function | text, json_object | ✅ | `deepseek-v4-pro` |\n| Xiaomi | boolean | text | auto | text, json_object | ✅ | `mimo-v2.5-pro` |\n| MiniMax | boolean | text, image, video | auto, none, required, function | text, json_object | ✅ | `MiniMax-M3` |\n| Zhipu | boolean | text | auto, none | text, json_object | ✅ | `glm-5.2` |\n\n## Architecture\n\n\n\n## Component Interaction\n\n\n\n## Install\n\nFor local development:\n\n```bash\ngit clone https://github.com/Ahoo-Wang/GodeX.git\ncd GodeX\nbun install\n```\n\nFor package use, install the published package and run the `godex` binary:\n\n```bash\nnpm install -g @ahoo-wang/godex\ngodex --help\n```\n\n### Docker\n\nPre-built images are published to Docker Hub and GitHub Container Registry:\n\n```bash\ndocker pull ahoowang/godex:latest\n# or\ndocker pull ghcr.io/ahoo-wang/godex:latest\n```\n\nRun with a config file:\n\n```bash\ndocker run -d \\\n --name godex \\\n -p 5678:5678 \\\n -e ZHIPU_API_KEY=your-key \\\n -e DEEPSEEK_API_KEY=your-key \\\n -e MINIMAX_API_KEY=your-key \\\n -e MIMO_API_KEY=your-key \\\n -v ./godex.yaml:/etc/godex/godex.yaml:ro \\\n -v godex-data:/data \\\n ahoowang/godex:latest\n```\n\nThe image supports `linux/amd64` and `linux/arm64`.\n\n- Config file: `/etc/godex/godex.yaml`\n- Data directory (sessions, trace): `/data`\n- Default port: `5678`\n\n## Quick Start\n\nCreate a config and start the server:\n\n```bash\ngodex init\ngodex serve --config ./godex.yaml\n```\n\nThe interactive wizard walks you through selecting providers, entering base URLs and API keys, and writes the config file automatically.\n\nAlternatively, create `godex.yaml` manually:\n\n```yaml\nserver:\n port: 5678\n host: 0.0.0.0\n\ndefault_provider: deepseek\n\nmodels:\n aliases:\n # -------------------------------------------------------------------------\n # Codex-compatible model aliases\n #\n # 这些 alias 是 GodeX routing policy,不代表与 OpenAI 原模型能力等价。\n # 依据优先级:公开 benchmark > 官方模型定位 > Provider 产品说明。\n # -------------------------------------------------------------------------\n\n # Codex 默认主力:复杂编码 / computer use / research workflows\n # 依据:DeepSeek V4-Pro 在 SWE / Terminal / Codeforces / GDPval-AA 上公开成绩强。\n gpt-5.5: \"deepseek/deepseek-v4-pro\"\n\n # Codex 旗舰:coding + reasoning + tool use + agentic workflows\n # 依据:DeepSeek V4-Pro 有更完整的公开 coding/agentic benchmark 覆盖。\n gpt-5.4: \"deepseek/deepseek-v4-pro\"\n\n # Codex mini:subagents\n gpt-5.4-mini: \"zhipu/glm-5.1\"\n\n # Codex 编码专用:复杂软件工程\n # 依据:DeepSeek V4-Pro 的 SWE Verified / SWE Pro / Terminal Bench 表现。\n gpt-5.3-codex: \"deepseek/deepseek-v4-pro\"\n\n # Codex spark:近实时编码迭代\n gpt-5.3-codex-spark: \"zhipu/glm-5.1\"\n\n # 上一代通用 coding / agentic fallback\n # 严谨起见仍走 DeepSeek;不强行映射到 Zhipu。\n gpt-5.2: \"deepseek/deepseek-v4-pro\"\n\n # -------------------------------------------------------------------------\n # Provider native models\n # -------------------------------------------------------------------------\n\n deepseek-v4-pro: \"deepseek/deepseek-v4-pro\"\n deepseek-v4-flash: \"deepseek/deepseek-v4-flash\"\n\n mimo-v2.5-pro: \"xiaomi/mimo-v2.5-pro\"\n mimo-v2.5: \"xiaomi/mimo-v2.5\"\n\n glm-5.1: \"zhipu/glm-5.1\"\n glm-5-turbo: \"zhipu/glm-5-turbo\"\n glm-4.7: \"zhipu/glm-4.7\"\n glm-4.5-air: \"zhipu/glm-4.5-air\"\n\n MiniMax-M3: \"minimax/MiniMax-M3\"\n\n # Fallback for unknown bare model names\n \"*\": \"deepseek/deepseek-v4-pro\"\n\nproviders:\n deepseek:\n spec: deepseek\n credentials:\n api_key: ${DEEPSEEK_API_KEY}\n endpoint:\n base_url: https://api.deepseek.com\n zhipu:\n spec: zhipu\n credentials:\n api_key: ${ZHIPU_API_KEY}\n endpoint:\n base_url: https://open.bigmodel.cn/api/coding/paas/v4\n minimax:\n spec: minimax\n credentials:\n api_key: ${MINIMAX_API_KEY}\n endpoint:\n base_url: https://api.minimaxi.com/v1\n xiaomi:\n spec: xiaomi\n credentials:\n api_key: ${MIMO_API_KEY}\n endpoint:\n base_url: https://api.xiaomimimo.com/v1\n\nweb_search:\n enabled: true\n mode: auto\n provider: zhipu\n on_unavailable: client_tool_call\n max_iterations: 2\n\nsession:\n backend: sqlite\n\nlogging:\n level: info\n\ntrace:\n enabled: true\n path: ./data/trace.db\n capture_payload: false\n```\n\nStart the server:\n\n```bash\ngodex serve --config ./godex.yaml\n```\n\nThe dev command starts GodeX on port `13145`; the default runtime config port is `5678`.\n\n## API\n\n### Health\n\n```bash\ncurl http://localhost:5678/health\n```\n\n### Models\n\n```bash\ncurl http://localhost:5678/v1/models\n```\n\n`/v1/models` lists configured aliases, excluding the wildcard alias `*`.\n\n### Responses\n\n```bash\ncurl http://localhost:5678/v1/responses \\\n -H 'content-type: application/json' \\\n -d '{\n \"model\": \"gpt-5.5\",\n \"input\": \"Write a short TypeScript function that adds two numbers.\"\n }'\n```\n\nStreaming uses standard Responses SSE event names:\n\n```bash\ncurl -N http://localhost:5678/v1/responses \\\n -H 'content-type: application/json' \\\n -d '{\n \"model\": \"gpt-5.5\",\n \"stream\": true,\n \"input\": \"Explain Bun streams in two sentences.\"\n }'\n```\n\n## Model Routing\n\nClients may pass either:\n\n- A provider-qualified selector such as `deepseek/deepseek-v4-pro`\n- A configured alias such as `gpt-5.5`\n- A bare model name, which resolves through `default_provider` when no alias matches\n\nAliases must map to `provider/model` values, and the provider must exist in `providers`.\n\n\n## Codex Integration\n\nConnect the Codex desktop app to GodeX by adding a custom provider in `~/.codex/config.toml`:\n\n```toml\nmodel = \"gpt-5.5\"\nmodel_provider = \"godex\"\n\n[model_providers.godex]\nname = \"GodeX\"\nbase_url = \"http://127.0.0.1:5678/v1\"\nwire_api = \"responses\"\nrequires_openai_auth = false\nsupports_websockets = false\n```\n\nModel aliases (`gpt-5.5`, `gpt-5.4`, `gpt-5.4-mini`, etc.) are resolved by GodeX using the `models.aliases` map in `godex.yaml` — Codex itself only needs the alias name.\n\n\n## Provider Bridge Behavior\n\nGodeX builds a provider request in three steps:\n\n1. Resolve the client model selector to a configured provider and upstream model.\n2. Plan compatibility from the provider `ProviderSpec`, including request parameters, tool declarations, `tool_choice`, response format, reasoning, and stream usage.\n3. Convert Responses input and session history into Chat Completions messages, call the upstream provider, and reconstruct a Responses object or Responses SSE stream.\n\nProvider-specific differences belong in each provider's `spec.ts`, `hooks.ts`, protocol types, and HTTP client. Shared Responses-to-Chat policy belongs under `src/bridge`.\n\n## Structured Output\n\nWhen a provider supports `json_object` but not native `json_schema`, GodeX can degrade strict `json_schema` requests to `json_object`.\n\nFor strict downgraded schemas:\n\n- The schema instruction is added to the provider prompt preamble for the current request.\n- The provider receives `response_format: { \"type\": \"json_object\" }`.\n- GodeX validates that the final output is valid JSON.\n- Invalid sync output fails the response; invalid stream output is rewritten to a terminal `response.failed` event.\n\nThe validator checks JSON syntax, not full JSON Schema conformance.\n\n## Sessions\n\nResponses can be stored and replayed with `previous_response_id`.\n\n- `session.backend: memory` keeps history in process memory.\n- `session.backend: sqlite` persists history to SQLite.\n- Requests with `store: false` are not saved.\n- The session chain stores request snapshots and response output items, then rebuilds provider-neutral history on the next turn.\n\n## Trace Database\n\nTracing is enabled by default and writes SQLite rows to `./data/trace.db` unless configured otherwise.\n\nTrace records include:\n\n- Provider request metadata and final patched request payload summaries\n- Provider request lifecycle events without duplicating full request bodies\n- Sync provider response bodies as summarized payloads\n- Raw and transformed stream events\n- Usage details, including cached tokens when provided by the upstream\n- Route and provider errors\n\nSet `trace.capture_payload: true` to persist payload JSON up to `trace.payload_max_bytes` for trace rows that carry payloads. Keep it disabled for sensitive environments.\n\n## Development\n\n```bash\nbun install # Install dependencies\nbun run dev # Dev server with hot reload on port 13145\nbun run start # Start server from source\nbun run build # Build a binary for the current platform\nbun run compile:all # Cross-compile all supported platform packages\n```\n\nQuality gates:\n\n```bash\nbun run typecheck # TypeScript\nbun run lint # Biome check\nbun run lint:fix # Biome autofix\nbun run format # Biome format\nbun run test # Unit and integration tests, excluding src/e2e\nbun run test:e2e # Mocked end-to-end tests\nbun run test:zhipu # Live Zhipu tests; requires ZHIPU_API_KEY\nbun run test:deepseek # Live DeepSeek tests; requires DEEPSEEK_API_KEY\nbun run test:minimax # Live MiniMax tests; requires MINIMAX_API_KEY\nbun run test:xiaomi # Live Xiaomi tests; requires MIMO_API_KEY\nbun run check # typecheck + lint + test\nbun run ci # typecheck + biome ci + test + e2e\n```\n\n## Source Map\n\n```text\nsrc/\n cli/ Commander CLI, init wizard, runtime config loading\n config/ godex.yaml schema, defaults, env interpolation\n context/ ApplicationContext and per-request ResponsesContext\n bridge/ Provider-agnostic Responses-to-Chat planning and reconstruction\n providers/ Built-in provider specs, hooks, clients, and registry\n responses/ Sync and stream request pipelines\n server/ Bun routes for /health, /v1/models, /v1/responses\n session/ Memory and SQLite response session stores\n trace/ SQLite trace recorder and usage/error/event mappers\n protocol/ OpenAI protocol type definitions\n error/ GodeXError hierarchy and domain codes\n```\n\n## Provider Development\n\nProvider folders follow this shape:\n\n```text\nsrc/providers/<name>/\n spec.ts ProviderSpec declaration\n client.ts ProviderEdge construction with ChatProviderClient\n hooks.ts Provider-specific patching, accessors, usage, stream deltas\n protocol/ Provider DTOs when needed\n index.ts Public exports\n```\n\nAdd shared compatibility policy to `src/bridge`; add shared provider transport or protocol helpers to `src/providers/shared`.\n\n## License\n\nApache-2.0. See [LICENSE](./LICENSE).\n"}, "ee1306ba5f586c26a0f546ced1c67fbb7509e6ff": {"t": 1785748566.5837085, "n": 12409, "h": "1446fc061e5e0042", "c": "<div align=\"center\">\n\n<img src=\"design/assets/01-logo-system/png/godex-logo-horizontal-transparent-800x233.png\" alt=\"GodeX\" width=\"480\" />\n\n**Make every model a Codex engine.**\n\nOpenAI-compatible Responses API gateway for Codex, CLI tools and developer agents.\n\n[](https://www.npmjs.com/package/@ahoo-wang/godex)\n[](https://codecov.io/gh/Ahoo-Wang/GodeX)\n[](https://bun.sh)\n[](https://www.typescriptlang.org/)\n\n[**English Documentation**](https://godex.ahoo.me/) · [**中文文档**](https://godex.ahoo.me/zh/)\n</div>\n\nGodeX lets clients that speak the OpenAI Responses API use providers such as DeepSeek, Xiaomi, MiniMax, and Zhipu through one local server.\n\n\n\n## Highlights\n\n- OpenAI-compatible `POST /v1/responses` endpoint with sync and streaming responses.\n- `GET /v1/models` aliases so clients can use stable model names while GodeX routes to provider/model targets.\n- Built-in bridge providers for DeepSeek, Xiaomi, MiniMax, and Zhipu.\n- Provider capability planning for request parameters, tools, `tool_choice`, structured output formats, reasoning, and stream usage.\n- Responses `previous_response_id` session chains backed by memory or SQLite.\n- Trace recording for provider requests, provider responses, stream events, usage, and errors.\n- Native Bun runtime, TypeScript source, and compiled platform binaries for releases.\n\n## Built-in Providers\n\n| Provider | Reasoning | GodeX Input | Tool Choice | Response Format | Cached Tokens | Default Model |\n|----------|-----------|-------------|-------------|-----------------|---------------|---------------|\n| DeepSeek | native | text | auto, none, required, function | text, json_object | ✅ | `deepseek-v4-pro` |\n| Xiaomi | boolean | text | auto | text, json_object | ✅ | `mimo-v2.5-pro` |\n| MiniMax | boolean | text, image, video | auto, none, required, function | text, json_object | ✅ | `MiniMax-M3` |\n| Zhipu | boolean | text | auto, none | text, json_object | ✅ | `glm-5.2` |\n\n## Architecture\n\n\n\n## Component Interaction\n\n\n\n## Install\n\nFor local development:\n\n```bash\ngit clone https://github.com/Ahoo-Wang/GodeX.git\ncd GodeX\nbun install\n```\n\nFor package use, install the published package and run the `godex` binary:\n\n```bash\nnpm install -g @ahoo-wang/godex\ngodex --help\n```\n\n### Docker\n\nPre-built images are published to Docker Hub and GitHub Container Registry:\n\n```bash\ndocker pull ahoowang/godex:latest\n# or\ndocker pull ghcr.io/ahoo-wang/godex:latest\n```\n\nRun with a config file:\n\n```bash\ndocker run -d \\\n --name godex \\\n -p 5678:5678 \\\n -e ZHIPU_API_KEY=your-key \\\n -e DEEPSEEK_API_KEY=your-key \\\n -e MINIMAX_API_KEY=your-key \\\n -e MIMO_API_KEY=your-key \\\n -v ./godex.yaml:/etc/godex/godex.yaml:ro \\\n -v godex-data:/data \\\n ahoowang/godex:latest\n```\n\nThe image supports `linux/amd64` and `linux/arm64`.\n\n- Config file: `/etc/godex/godex.yaml`\n- Data directory (sessions, trace): `/data`\n- Default port: `5678`\n\n## Quick Start\n\nCreate a config and start the server:\n\n```bash\ngodex init\ngodex serve --config ./godex.yaml\n```\n\nThe interactive wizard walks you through selecting providers, entering base URLs and API keys, and writes the config file automatically.\n\nAlternatively, create `godex.yaml` manually:\n\n```yaml\nserver:\n port: 5678\n host: 0.0.0.0\n\ndefault_provider: deepseek\n\nmodels:\n aliases:\n # -------------------------------------------------------------------------\n # Codex-compatible model aliases\n #\n # 这些 alias 是 GodeX routing policy,不代表与 OpenAI 原模型能力等价。\n # 依据优先级:公开 benchmark > 官方模型定位 > Provider 产品说明。\n # -------------------------------------------------------------------------\n\n # Codex 默认主力:复杂编码 / computer use / research workflows\n # 依据:DeepSeek V4-Pro 在 SWE / Terminal / Codeforces / GDPval-AA 上公开成绩强。\n gpt-5.5: \"deepseek/deepseek-v4-pro\"\n\n # Codex 旗舰:coding + reasoning + tool use + agentic workflows\n # 依据:DeepSeek V4-Pro 有更完整的公开 coding/agentic benchmark 覆盖。\n gpt-5.4: \"deepseek/deepseek-v4-pro\"\n\n # Codex mini:subagents\n gpt-5.4-mini: \"zhipu/glm-5.1\"\n\n # Codex 编码专用:复杂软件工程\n # 依据:DeepSeek V4-Pro 的 SWE Verified / SWE Pro / Terminal Bench 表现。\n gpt-5.3-codex: \"deepseek/deepseek-v4-pro\"\n\n # Codex spark:近实时编码迭代\n gpt-5.3-codex-spark: \"zhipu/glm-5.1\"\n\n # 上一代通用 coding / agentic fallback\n # 严谨起见仍走 DeepSeek;不强行映射到 Zhipu。\n gpt-5.2: \"deepseek/deepseek-v4-pro\"\n\n # -------------------------------------------------------------------------\n # Provider native models\n # -------------------------------------------------------------------------\n\n deepseek-v4-pro: \"deepseek/deepseek-v4-pro\"\n deepseek-v4-flash: \"deepseek/deepseek-v4-flash\"\n\n mimo-v2.5-pro: \"xiaomi/mimo-v2.5-pro\"\n mimo-v2.5: \"xiaomi/mimo-v2.5\"\n\n glm-5.1: \"zhipu/glm-5.1\"\n glm-5-turbo: \"zhipu/glm-5-turbo\"\n glm-4.7: \"zhipu/glm-4.7\"\n glm-4.5-air: \"zhipu/glm-4.5-air\"\n\n MiniMax-M3: \"minimax/MiniMax-M3\"\n\n # Fallback for unknown bare model names\n \"*\": \"deepseek/deepseek-v4-pro\"\n\nproviders:\n deepseek:\n spec: deepseek\n credentials:\n api_key: ${DEEPSEEK_API_KEY}\n endpoint:\n base_url: https://api.deepseek.com\n zhipu:\n spec: zhipu\n credentials:\n api_key: ${ZHIPU_API_KEY}\n endpoint:\n base_url: https://open.bigmodel.cn/api/coding/paas/v4\n minimax:\n spec: minimax\n credentials:\n api_key: ${MINIMAX_API_KEY}\n endpoint:\n base_url: https://api.minimaxi.com/v1\n xiaomi:\n spec: xiaomi\n credentials:\n api_key: ${MIMO_API_KEY}\n endpoint:\n base_url: https://api.xiaomimimo.com/v1\n\nsession:\n backend: sqlite\n\nlogging:\n level: info\n\ntrace:\n enabled: true\n path: ./data/trace.db\n capture_payload: false\n```\n\nStart the server:\n\n```bash\ngodex serve --config ./godex.yaml\n```\n\nThe dev command starts GodeX on port `13145`; the default runtime config port is `5678`.\n\n## API\n\n### Health\n\n```bash\ncurl http://localhost:5678/health\n```\n\n### Models\n\n```bash\ncurl http://localhost:5678/v1/models\n```\n\n`/v1/models` lists configured aliases, excluding the wildcard alias `*`.\n\n### Responses\n\n```bash\ncurl http://localhost:5678/v1/responses \\\n -H 'content-type: application/json' \\\n -d '{\n \"model\": \"gpt-5.5\",\n \"input\": \"Write a short TypeScript function that adds two numbers.\"\n }'\n```\n\nStreaming uses standard Responses SSE event names:\n\n```bash\ncurl -N http://localhost:5678/v1/responses \\\n -H 'content-type: application/json' \\\n -d '{\n \"model\": \"gpt-5.5\",\n \"stream\": true,\n \"input\": \"Explain Bun streams in two sentences.\"\n }'\n```\n\n## Model Routing\n\nClients may pass either:\n\n- A provider-qualified selector such as `deepseek/deepseek-v4-pro`\n- A configured alias such as `gpt-5.5`\n- A bare model name, which resolves through `default_provider` when no alias matches\n\nAliases must map to `provider/model` values, and the provider must exist in `providers`.\n\n\n## Codex Integration\n\nConnect the Codex desktop app to GodeX by adding a custom provider in `~/.codex/config.toml`:\n\n```toml\nmodel = \"gpt-5.5\"\nmodel_provider = \"godex\"\n\n[model_providers.godex]\nname = \"GodeX\"\nbase_url = \"http://127.0.0.1:5678/v1\"\nwire_api = \"responses\"\nrequires_openai_auth = false\nsupports_websockets = false\n```\n\nModel aliases (`gpt-5.5`, `gpt-5.4`, `gpt-5.4-mini`, etc.) are resolved by GodeX using the `models.aliases` map in `godex.yaml` — Codex itself only needs the alias name.\n\n\n## Provider Bridge Behavior\n\nGodeX builds a provider request in three steps:\n\n1. Resolve the client model selector to a configured provider and upstream model.\n2. Plan compatibility from the provider `ProviderSpec`, including request parameters, tool declarations, `tool_choice`, response format, reasoning, and stream usage.\n3. Convert Responses input and session history into Chat Completions messages, call the upstream provider, and reconstruct a Responses object or Responses SSE stream.\n\nProvider-specific differences belong in each provider's `spec.ts`, `hooks.ts`, protocol types, and HTTP client. Shared Responses-to-Chat policy belongs under `src/bridge`.\n\n## Structured Output\n\nWhen a provider supports `json_object` but not native `json_schema`, GodeX can degrade strict `json_schema` requests to `json_object`.\n\nFor strict downgraded schemas:\n\n- The schema instruction is added to the provider prompt preamble for the current request.\n- The provider receives `response_format: { \"type\": \"json_object\" }`.\n- GodeX validates that the final output is valid JSON.\n- Invalid sync output fails the response; invalid stream output is rewritten to a terminal `response.failed` event.\n\nThe validator checks JSON syntax, not full JSON Schema conformance.\n\n## Sessions\n\nResponses can be stored and replayed with `previous_response_id`.\n\n- `session.backend: memory` keeps history in process memory.\n- `session.backend: sqlite` persists history to SQLite.\n- Requests with `store: false` are not saved.\n- The session chain stores request snapshots and response output items, then rebuilds provider-neutral history on the next turn.\n\n## Trace Database\n\nTracing is enabled by default and writes SQLite rows to `./data/trace.db` unless configured otherwise.\n\nTrace records include:\n\n- Provider request metadata and final patched request payload summaries\n- Provider request lifecycle events without duplicating full request bodies\n- Sync provider response bodies as summarized payloads\n- Raw and transformed stream events\n- Usage details, including cached tokens when provided by the upstream\n- Route and provider errors\n\nSet `trace.capture_payload: true` to persist payload JSON up to `trace.payload_max_bytes` for trace rows that carry payloads. Keep it disabled for sensitive environments.\n\n## Development\n\n```bash\nbun install # Install dependencies\nbun run dev # Dev server with hot reload on port 13145\nbun run start # Start server from source\nbun run build # Build a binary for the current platform\nbun run compile:all # Cross-compile all supported platform packages\n```\n\nQuality gates:\n\n```bash\nbun run typecheck # TypeScript\nbun run lint # Biome check\nbun run lint:fix # Biome autofix\nbun run format # Biome format\nbun run test # Unit and integration tests, excluding src/e2e\nbun run test:e2e # Mocked end-to-end tests\nbun run test:zhipu # Live Zhipu tests; requires ZHIPU_API_KEY\nbun run test:deepseek # Live DeepSeek tests; requires DEEPSEEK_API_KEY\nbun run test:minimax # Live MiniMax tests; requires MINIMAX_API_KEY\nbun run test:xiaomi # Live Xiaomi tests; requires MIMO_API_KEY\nbun run check # typecheck + lint + test\nbun run ci # typecheck + biome ci + test + e2e\n```\n\n## Source Map\n\n```text\nsrc/\n cli/ Commander CLI, init wizard, runtime config loading\n config/ godex.yaml schema, defaults, env interpolation\n context/ ApplicationContext and per-request ResponsesContext\n bridge/ Provider-agnostic Responses-to-Chat planning and reconstruction\n providers/ Built-in provider specs, hooks, clients, and registry\n responses/ Sync and stream request pipelines\n server/ Bun routes for /health, /v1/models, /v1/responses\n session/ Memory and SQLite response session stores\n trace/ SQLite trace recorder and usage/error/event mappers\n protocol/ OpenAI protocol type definitions\n error/ GodeXError hierarchy and domain codes\n```\n\n## Provider Development\n\nProvider folders follow this shape:\n\n```text\nsrc/providers/<name>/\n spec.ts ProviderSpec declaration\n client.ts ProviderEdge construction with ChatProviderClient\n hooks.ts Provider-specific patching, accessors, usage, stream deltas\n protocol/ Provider DTOs when needed\n index.ts Public exports\n```\n\nAdd shared compatibility policy to `src/bridge`; add shared provider transport or protocol helpers to `src/providers/shared`.\n\n## License\n\nApache-2.0. See [LICENSE](./LICENSE).\n"}, "1e5b993622690d731ddb202f06d5436796fbe69f": {"t": 1785748567.7279484, "n": 12409, "h": "c2f0b6c57fb19839", "c": "<div align=\"center\">\n\n<img src=\"design/assets/01-logo-system/png/godex-logo-horizontal-transparent-800x233.png\" alt=\"GodeX\" width=\"480\" />\n\n**Make every model a Codex engine.**\n\nOpenAI-compatible Responses API gateway for Codex, CLI tools and developer agents.\n\n[](https://www.npmjs.com/package/@ahoo-wang/godex)\n[](https://codecov.io/gh/Ahoo-Wang/GodeX)\n[](https://bun.sh)\n[](https://www.typescriptlang.org/)\n\n[**English Documentation**](https://godex.ahoo.me/) · [**中文文档**](https://godex.ahoo.me/zh/)\n</div>\n\nGodeX lets clients that speak the OpenAI Responses API use providers such as DeepSeek, Xiaomi, MiniMax, and Zhipu through one local server.\n\n\n\n## Highlights\n\n- OpenAI-compatible `POST /v1/responses` endpoint with sync and streaming responses.\n- `GET /v1/models` aliases so clients can use stable model names while GodeX routes to provider/model targets.\n- Built-in bridge providers for DeepSeek, Xiaomi, MiniMax, and Zhipu.\n- Provider capability planning for request parameters, tools, `tool_choice`, structured output formats, reasoning, and stream usage.\n- Responses `previous_response_id` session chains backed by memory or SQLite.\n- Trace recording for provider requests, provider responses, stream events, usage, and errors.\n- Native Bun runtime, TypeScript source, and compiled platform binaries for releases.\n\n## Built-in Providers\n\n| Provider | Reasoning | GodeX Input | Tool Choice | Response Format | Cached Tokens | Default Model |\n|----------|-----------|-------------|-------------|-----------------|---------------|---------------|\n| DeepSeek | native | text | auto, none, required, function | text, json_object | ✅ | `deepseek-v4-pro` |\n| Xiaomi | boolean | text | auto | text, json_object | ✅ | `mimo-v2.5-pro` |\n| MiniMax | boolean | text, image, video | auto, none, required, function | text, json_object | ✅ | `MiniMax-M3` |\n| Zhipu | boolean | text | auto, none | text, json_object | ✅ | `glm-5.1` |\n\n## Architecture\n\n\n\n## Component Interaction\n\n\n\n## Install\n\nFor local development:\n\n```bash\ngit clone https://github.com/Ahoo-Wang/GodeX.git\ncd GodeX\nbun install\n```\n\nFor package use, install the published package and run the `godex` binary:\n\n```bash\nnpm install -g @ahoo-wang/godex\ngodex --help\n```\n\n### Docker\n\nPre-built images are published to Docker Hub and GitHub Container Registry:\n\n```bash\ndocker pull ahoowang/godex:latest\n# or\ndocker pull ghcr.io/ahoo-wang/godex:latest\n```\n\nRun with a config file:\n\n```bash\ndocker run -d \\\n --name godex \\\n -p 5678:5678 \\\n -e ZHIPU_API_KEY=your-key \\\n -e DEEPSEEK_API_KEY=your-key \\\n -e MINIMAX_API_KEY=your-key \\\n -e MIMO_API_KEY=your-key \\\n -v ./godex.yaml:/etc/godex/godex.yaml:ro \\\n -v godex-data:/data \\\n ahoowang/godex:latest\n```\n\nThe image supports `linux/amd64` and `linux/arm64`.\n\n- Config file: `/etc/godex/godex.yaml`\n- Data directory (sessions, trace): `/data`\n- Default port: `5678`\n\n## Quick Start\n\nCreate a config and start the server:\n\n```bash\ngodex init\ngodex serve --config ./godex.yaml\n```\n\nThe interactive wizard walks you through selecting providers, entering base URLs and API keys, and writes the config file automatically.\n\nAlternatively, create `godex.yaml` manually:\n\n```yaml\nserver:\n port: 5678\n host: 0.0.0.0\n\ndefault_provider: deepseek\n\nmodels:\n aliases:\n # -------------------------------------------------------------------------\n # Codex-compatible model aliases\n #\n # 这些 alias 是 GodeX routing policy,不代表与 OpenAI 原模型能力等价。\n # 依据优先级:公开 benchmark > 官方模型定位 > Provider 产品说明。\n # -------------------------------------------------------------------------\n\n # Codex 默认主力:复杂编码 / computer use / research workflows\n # 依据:DeepSeek V4-Pro 在 SWE / Terminal / Codeforces / GDPval-AA 上公开成绩强。\n gpt-5.5: \"deepseek/deepseek-v4-pro\"\n\n # Codex 旗舰:coding + reasoning + tool use + agentic workflows\n # 依据:DeepSeek V4-Pro 有更完整的公开 coding/agentic benchmark 覆盖。\n gpt-5.4: \"deepseek/deepseek-v4-pro\"\n\n # Codex mini:subagents\n gpt-5.4-mini: \"zhipu/glm-5.1\"\n\n # Codex 编码专用:复杂软件工程\n # 依据:DeepSeek V4-Pro 的 SWE Verified / SWE Pro / Terminal Bench 表现。\n gpt-5.3-codex: \"deepseek/deepseek-v4-pro\"\n\n # Codex spark:近实时编码迭代\n gpt-5.3-codex-spark: \"zhipu/glm-5.1\"\n\n # 上一代通用 coding / agentic fallback\n # 严谨起见仍走 DeepSeek;不强行映射到 Zhipu。\n gpt-5.2: \"deepseek/deepseek-v4-pro\"\n\n # -------------------------------------------------------------------------\n # Provider native models\n # -------------------------------------------------------------------------\n\n deepseek-v4-pro: \"deepseek/deepseek-v4-pro\"\n deepseek-v4-flash: \"deepseek/deepseek-v4-flash\"\n\n mimo-v2.5-pro: \"xiaomi/mimo-v2.5-pro\"\n mimo-v2.5: \"xiaomi/mimo-v2.5\"\n\n glm-5.1: \"zhipu/glm-5.1\"\n glm-5-turbo: \"zhipu/glm-5-turbo\"\n glm-4.7: \"zhipu/glm-4.7\"\n glm-4.5-air: \"zhipu/glm-4.5-air\"\n\n MiniMax-M3: \"minimax/MiniMax-M3\"\n\n # Fallback for unknown bare model names\n \"*\": \"deepseek/deepseek-v4-pro\"\n\nproviders:\n deepseek:\n spec: deepseek\n credentials:\n api_key: ${DEEPSEEK_API_KEY}\n endpoint:\n base_url: https://api.deepseek.com\n zhipu:\n spec: zhipu\n credentials:\n api_key: ${ZHIPU_API_KEY}\n endpoint:\n base_url: https://open.bigmodel.cn/api/coding/paas/v4\n minimax:\n spec: minimax\n credentials:\n api_key: ${MINIMAX_API_KEY}\n endpoint:\n base_url: https://api.minimaxi.com/v1\n xiaomi:\n spec: xiaomi\n credentials:\n api_key: ${MIMO_API_KEY}\n endpoint:\n base_url: https://api.xiaomimimo.com/v1\n\nsession:\n backend: sqlite\n\nlogging:\n level: info\n\ntrace:\n enabled: true\n path: ./data/trace.db\n capture_payload: false\n```\n\nStart the server:\n\n```bash\ngodex serve --config ./godex.yaml\n```\n\nThe dev command starts GodeX on port `13145`; the default runtime config port is `5678`.\n\n## API\n\n### Health\n\n```bash\ncurl http://localhost:5678/health\n```\n\n### Models\n\n```bash\ncurl http://localhost:5678/v1/models\n```\n\n`/v1/models` lists configured aliases, excluding the wildcard alias `*`.\n\n### Responses\n\n```bash\ncurl http://localhost:5678/v1/responses \\\n -H 'content-type: application/json' \\\n -d '{\n \"model\": \"gpt-5.5\",\n \"input\": \"Write a short TypeScript function that adds two numbers.\"\n }'\n```\n\nStreaming uses standard Responses SSE event names:\n\n```bash\ncurl -N http://localhost:5678/v1/responses \\\n -H 'content-type: application/json' \\\n -d '{\n \"model\": \"gpt-5.5\",\n \"stream\": true,\n \"input\": \"Explain Bun streams in two sentences.\"\n }'\n```\n\n## Model Routing\n\nClients may pass either:\n\n- A provider-qualified selector such as `deepseek/deepseek-v4-pro`\n- A configured alias such as `gpt-5.5`\n- A bare model name, which resolves through `default_provider` when no alias matches\n\nAliases must map to `provider/model` values, and the provider must exist in `providers`.\n\n\n## Codex Integration\n\nConnect the Codex desktop app to GodeX by adding a custom provider in `~/.codex/config.toml`:\n\n```toml\nmodel = \"gpt-5.5\"\nmodel_provider = \"godex\"\n\n[model_providers.godex]\nname = \"GodeX\"\nbase_url = \"http://127.0.0.1:5678/v1\"\nwire_api = \"responses\"\nrequires_openai_auth = false\nsupports_websockets = false\n```\n\nModel aliases (`gpt-5.5`, `gpt-5.4`, `gpt-5.4-mini`, etc.) are resolved by GodeX using the `models.aliases` map in `godex.yaml` — Codex itself only needs the alias name.\n\n\n## Provider Bridge Behavior\n\nGodeX builds a provider request in three steps:\n\n1. Resolve the client model selector to a configured provider and upstream model.\n2. Plan compatibility from the provider `ProviderSpec`, including request parameters, tool declarations, `tool_choice`, response format, reasoning, and stream usage.\n3. Convert Responses input and session history into Chat Completions messages, call the upstream provider, and reconstruct a Responses object or Responses SSE stream.\n\nProvider-specific differences belong in each provider's `spec.ts`, `hooks.ts`, protocol types, and HTTP client. Shared Responses-to-Chat policy belongs under `src/bridge`.\n\n## Structured Output\n\nWhen a provider supports `json_object` but not native `json_schema`, GodeX can degrade strict `json_schema` requests to `json_object`.\n\nFor strict downgraded schemas:\n\n- The schema instruction is added to the provider prompt preamble for the current request.\n- The provider receives `response_format: { \"type\": \"json_object\" }`.\n- GodeX validates that the final output is valid JSON.\n- Invalid sync output fails the response; invalid stream output is rewritten to a terminal `response.failed` event.\n\nThe validator checks JSON syntax, not full JSON Schema conformance.\n\n## Sessions\n\nResponses can be stored and replayed with `previous_response_id`.\n\n- `session.backend: memory` keeps history in process memory.\n- `session.backend: sqlite` persists history to SQLite.\n- Requests with `store: false` are not saved.\n- The session chain stores request snapshots and response output items, then rebuilds provider-neutral history on the next turn.\n\n## Trace Database\n\nTracing is enabled by default and writes SQLite rows to `./data/trace.db` unless configured otherwise.\n\nTrace records include:\n\n- Provider request metadata and final patched request payload summaries\n- Provider request lifecycle events without duplicating full request bodies\n- Sync provider response bodies as summarized payloads\n- Raw and transformed stream events\n- Usage details, including cached tokens when provided by the upstream\n- Route and provider errors\n\nSet `trace.capture_payload: true` to persist payload JSON up to `trace.payload_max_bytes` for trace rows that carry payloads. Keep it disabled for sensitive environments.\n\n## Development\n\n```bash\nbun install # Install dependencies\nbun run dev # Dev server with hot reload on port 13145\nbun run start # Start server from source\nbun run build # Build a binary for the current platform\nbun run compile:all # Cross-compile all supported platform packages\n```\n\nQuality gates:\n\n```bash\nbun run typecheck # TypeScript\nbun run lint # Biome check\nbun run lint:fix # Biome autofix\nbun run format # Biome format\nbun run test # Unit and integration tests, excluding src/e2e\nbun run test:e2e # Mocked end-to-end tests\nbun run test:zhipu # Live Zhipu tests; requires ZHIPU_API_KEY\nbun run test:deepseek # Live DeepSeek tests; requires DEEPSEEK_API_KEY\nbun run test:minimax # Live MiniMax tests; requires MINIMAX_API_KEY\nbun run test:xiaomi # Live Xiaomi tests; requires MIMO_API_KEY\nbun run check # typecheck + lint + test\nbun run ci # typecheck + biome ci + test + e2e\n```\n\n## Source Map\n\n```text\nsrc/\n cli/ Commander CLI, init wizard, runtime config loading\n config/ godex.yaml schema, defaults, env interpolation\n context/ ApplicationContext and per-request ResponsesContext\n bridge/ Provider-agnostic Responses-to-Chat planning and reconstruction\n providers/ Built-in provider specs, hooks, clients, and registry\n responses/ Sync and stream request pipelines\n server/ Bun routes for /health, /v1/models, /v1/responses\n session/ Memory and SQLite response session stores\n trace/ SQLite trace recorder and usage/error/event mappers\n protocol/ OpenAI protocol type definitions\n error/ GodeXError hierarchy and domain codes\n```\n\n## Provider Development\n\nProvider folders follow this shape:\n\n```text\nsrc/providers/<name>/\n spec.ts ProviderSpec declaration\n client.ts ProviderEdge construction with ChatProviderClient\n hooks.ts Provider-specific patching, accessors, usage, stream deltas\n protocol/ Provider DTOs when needed\n index.ts Public exports\n```\n\nAdd shared compatibility policy to `src/bridge`; add shared provider transport or protocol helpers to `src/providers/shared`.\n\n## License\n\nApache-2.0. See [LICENSE](./LICENSE).\n"}, "b5919b8cc0b14163d1e96f13664f0c5ff7da294c": {"t": 1785748568.849063, "n": 12404, "h": "da60e24d89395d19", "c": "<div align=\"center\">\n\n<img src=\"design/assets/01-logo-system/png/godex-logo-horizontal-transparent-800x233.png\" alt=\"GodeX\" width=\"480\" />\n\n**Make every model a Codex engine.**\n\nOpenAI-compatible Responses API gateway for Codex, CLI tools and developer agents.\n\n[](https://www.npmjs.com/package/@ahoo-wang/godex)\n[](https://codecov.io/gh/Ahoo-Wang/GodeX)\n[](https://bun.sh)\n[](https://www.typescriptlang.org/)\n\n[**English Documentation**](https://godex.ahoo.me/) · [**中文文档**](https://godex.ahoo.me/zh/)\n</div>\n\nGodeX lets clients that speak the OpenAI Responses API use providers such as DeepSeek, Xiaomi, MiniMax, and Zhipu through one local server.\n\n\n\n## Highlights\n\n- OpenAI-compatible `POST /v1/responses` endpoint with sync and streaming responses.\n- `GET /v1/models` aliases so clients can use stable model names while GodeX routes to provider/model targets.\n- Built-in bridge providers for DeepSeek, Xiaomi, MiniMax, and Zhipu.\n- Provider capability planning for request parameters, tools, `tool_choice`, structured output formats, reasoning, and stream usage.\n- Responses `previous_response_id` session chains backed by memory or SQLite.\n- Trace recording for provider requests, provider responses, stream events, usage, and errors.\n- Native Bun runtime, TypeScript source, and compiled platform binaries for releases.\n\n## Built-in Providers\n\n| Provider | Reasoning | Tool Choice | Response Format | Cached Tokens | Default Model |\n|----------|-----------|-------------|-----------------|---------------|---------------|\n| DeepSeek | native | auto, none, required, function | text, json_object | ✅ | `deepseek-v4-pro` |\n| Xiaomi | boolean | auto | text, json_object | ✅ | `mimo-v2.5-pro` |\n| MiniMax | none | auto, none, required, function | text, json_object | ✅ | `MiniMax-M2.7` |\n| Zhipu | boolean | auto, none | text, json_object | ✅ | `glm-5.1` |\n\n## Architecture\n\n\n\n## Component Interaction\n\n\n\n## Install\n\nFor local development:\n\n```bash\ngit clone https://github.com/Ahoo-Wang/GodeX.git\ncd GodeX\nbun install\n```\n\nFor package use, install the published package and run the `godex` binary:\n\n```bash\nnpm install -g @ahoo-wang/godex\ngodex --help\n```\n\n### Docker\n\nPre-built images are published to Docker Hub and GitHub Container Registry:\n\n```bash\ndocker pull ahoowang/godex:latest\n# or\ndocker pull ghcr.io/ahoo-wang/godex:latest\n```\n\nRun with a config file:\n\n```bash\ndocker run -d \\\n --name godex \\\n -p 5678:5678 \\\n -e ZHIPU_API_KEY=your-key \\\n -e DEEPSEEK_API_KEY=your-key \\\n -e MINIMAX_API_KEY=your-key \\\n -e MIMO_API_KEY=your-key \\\n -v ./godex.yaml:/etc/godex/godex.yaml:ro \\\n -v godex-data:/data \\\n ahoowang/godex:latest\n```\n\nThe image supports `linux/amd64` and `linux/arm64`.\n\n- Config file: `/etc/godex/godex.yaml`\n- Data directory (sessions, trace): `/data`\n- Default port: `5678`\n\n## Quick Start\n\nCreate a config and start the server:\n\n```bash\ngodex init\ngodex serve --config ./godex.yaml\n```\n\nThe interactive wizard walks you through selecting providers, entering base URLs and API keys, and writes the config file automatically.\n\nAlternatively, create `godex.yaml` manually:\n\n```yaml\nserver:\n port: 5678\n host: 0.0.0.0\n\ndefault_provider: deepseek\n\nmodels:\n aliases:\n # -------------------------------------------------------------------------\n # Codex-compatible model aliases\n #\n # 这些 alias 是 GodeX routing policy,不代表与 OpenAI 原模型能力等价。\n # 依据优先级:公开 benchmark > 官方模型定位 > Provider 产品说明。\n # -------------------------------------------------------------------------\n\n # Codex 默认主力:复杂编码 / computer use / research workflows\n # 依据:DeepSeek V4-Pro 在 SWE / Terminal / Codeforces / GDPval-AA 上公开成绩强。\n gpt-5.5: \"deepseek/deepseek-v4-pro\"\n\n # Codex 旗舰:coding + reasoning + tool use + agentic workflows\n # 依据:DeepSeek V4-Pro 有更完整的公开 coding/agentic benchmark 覆盖。\n gpt-5.4: \"deepseek/deepseek-v4-pro\"\n\n # Codex mini:subagents\n gpt-5.4-mini: \"zhipu/glm-5.1\"\n\n # Codex 编码专用:复杂软件工程\n # 依据:DeepSeek V4-Pro 的 SWE Verified / SWE Pro / Terminal Bench 表现。\n gpt-5.3-codex: \"deepseek/deepseek-v4-pro\"\n\n # Codex spark:近实时编码迭代\n gpt-5.3-codex-spark: \"zhipu/glm-5.1\"\n\n # 上一代通用 coding / agentic fallback\n # 严谨起见仍走 DeepSeek;不强行映射到 Zhipu。\n gpt-5.2: \"deepseek/deepseek-v4-pro\"\n\n # -------------------------------------------------------------------------\n # Provider native models\n # -------------------------------------------------------------------------\n\n deepseek-v4-pro: \"deepseek/deepseek-v4-pro\"\n deepseek-v4-flash: \"deepseek/deepseek-v4-flash\"\n\n mimo-v2.5-pro: \"xiaomi/mimo-v2.5-pro\"\n mimo-v2.5: \"xiaomi/mimo-v2.5\"\n\n glm-5.1: \"zhipu/glm-5.1\"\n glm-5-turbo: \"zhipu/glm-5-turbo\"\n glm-4.7: \"zhipu/glm-4.7\"\n glm-4.5-air: \"zhipu/glm-4.5-air\"\n\n MiniMax-M2.7: \"minimax/MiniMax-M2.7\"\n MiniMax-M2.7-highspeed: \"minimax/MiniMax-M2.7-highspeed\"\n\n # Fallback for unknown bare model names\n \"*\": \"deepseek/deepseek-v4-pro\"\n\nproviders:\n deepseek:\n spec: deepseek\n credentials:\n api_key: ${DEEPSEEK_API_KEY}\n endpoint:\n base_url: https://api.deepseek.com\n zhipu:\n spec: zhipu\n credentials:\n api_key: ${ZHIPU_API_KEY}\n endpoint:\n base_url: https://open.bigmodel.cn/api/coding/paas/v4\n minimax:\n spec: minimax\n credentials:\n api_key: ${MINIMAX_API_KEY}\n endpoint:\n base_url: https://api.minimaxi.com/v1\n xiaomi:\n spec: xiaomi\n credentials:\n api_key: ${MIMO_API_KEY}\n endpoint:\n base_url: https://api.xiaomimimo.com/v1\n\nsession:\n backend: sqlite\n\nlogging:\n level: info\n\ntrace:\n enabled: true\n path: ./data/trace.db\n capture_payload: false\n```\n\nStart the server:\n\n```bash\ngodex serve --config ./godex.yaml\n```\n\nThe dev command starts GodeX on port `13145`; the default runtime config port is `5678`.\n\n## API\n\n### Health\n\n```bash\ncurl http://localhost:5678/health\n```\n\n### Models\n\n```bash\ncurl http://localhost:5678/v1/models\n```\n\n`/v1/models` lists configured aliases, excluding the wildcard alias `*`.\n\n### Responses\n\n```bash\ncurl http://localhost:5678/v1/responses \\\n -H 'content-type: application/json' \\\n -d '{\n \"model\": \"gpt-5.5\",\n \"input\": \"Write a short TypeScript function that adds two numbers.\"\n }'\n```\n\nStreaming uses standard Responses SSE event names:\n\n```bash\ncurl -N http://localhost:5678/v1/responses \\\n -H 'content-type: application/json' \\\n -d '{\n \"model\": \"gpt-5.5\",\n \"stream\": true,\n \"input\": \"Explain Bun streams in two sentences.\"\n }'\n```\n\n## Model Routing\n\nClients may pass either:\n\n- A provider-qualified selector such as `deepseek/deepseek-v4-pro`\n- A configured alias such as `gpt-5.5`\n- A bare model name, which resolves through `default_provider` when no alias matches\n\nAliases must map to `provider/model` values, and the provider must exist in `providers`.\n\n\n## Codex Integration\n\nConnect the Codex desktop app to GodeX by adding a custom provider in `~/.codex/config.toml`:\n\n```toml\nmodel = \"gpt-5.5\"\nmodel_provider = \"godex\"\n\n[model_providers.godex]\nname = \"GodeX\"\nbase_url = \"http://127.0.0.1:5678/v1\"\nwire_api = \"responses\"\nrequires_openai_auth = false\nsupports_websockets = false\n```\n\nModel aliases (`gpt-5.5`, `gpt-5.4`, `gpt-5.4-mini`, etc.) are resolved by GodeX using the `models.aliases` map in `godex.yaml` — Codex itself only needs the alias name.\n\n\n## Provider Bridge Behavior\n\nGodeX builds a provider request in three steps:\n\n1. Resolve the client model selector to a configured provider and upstream model.\n2. Plan compatibility from the provider `ProviderSpec`, including request parameters, tool declarations, `tool_choice`, response format, reasoning, and stream usage.\n3. Convert Responses input and session history into Chat Completions messages, call the upstream provider, and reconstruct a Responses object or Responses SSE stream.\n\nProvider-specific differences belong in each provider's `spec.ts`, `hooks.ts`, protocol types, and HTTP client. Shared Responses-to-Chat policy belongs under `src/bridge`.\n\n## Structured Output\n\nWhen a provider supports `json_object` but not native `json_schema`, GodeX can degrade strict `json_schema` requests to `json_object`.\n\nFor strict downgraded schemas:\n\n- The schema instruction is added to the provider prompt preamble for the current request.\n- The provider receives `response_format: { \"type\": \"json_object\" }`.\n- GodeX validates that the final output is valid JSON.\n- Invalid sync output fails the response; invalid stream output is rewritten to a terminal `response.failed` event.\n\nThe validator checks JSON syntax, not full JSON Schema conformance.\n\n## Sessions\n\nResponses can be stored and replayed with `previous_response_id`.\n\n- `session.backend: memory` keeps history in process memory.\n- `session.backend: sqlite` persists history to SQLite.\n- Requests with `store: false` are not saved.\n- The session chain stores request snapshots and response output items, then rebuilds provider-neutral history on the next turn.\n\n## Trace Database\n\nTracing is enabled by default and writes SQLite rows to `./data/trace.db` unless configured otherwise.\n\nTrace records include:\n\n- Provider request metadata and final patched request payload summaries\n- Provider request lifecycle events without duplicating full request bodies\n- Sync provider response bodies as summarized payloads\n- Raw and transformed stream events\n- Usage details, including cached tokens when provided by the upstream\n- Route and provider errors\n\nSet `trace.capture_payload: true` to persist payload JSON up to `trace.payload_max_bytes` for trace rows that carry payloads. Keep it disabled for sensitive environments.\n\n## Development\n\n```bash\nbun install # Install dependencies\nbun run dev # Dev server with hot reload on port 13145\nbun run start # Start server from source\nbun run build # Build a binary for the current platform\nbun run compile:all # Cross-compile all supported platform packages\n```\n\nQuality gates:\n\n```bash\nbun run typecheck # TypeScript\nbun run lint # Biome check\nbun run lint:fix # Biome autofix\nbun run format # Biome format\nbun run test # Unit and integration tests, excluding src/e2e\nbun run test:e2e # Mocked end-to-end tests\nbun run test:zhipu # Live Zhipu tests; requires ZHIPU_API_KEY\nbun run test:deepseek # Live DeepSeek tests; requires DEEPSEEK_API_KEY\nbun run test:minimax # Live MiniMax tests; requires MINIMAX_API_KEY\nbun run test:xiaomi # Live Xiaomi tests; requires MIMO_API_KEY\nbun run check # typecheck + lint + test\nbun run ci # typecheck + biome ci + test + e2e\n```\n\n## Source Map\n\n```text\nsrc/\n cli/ Commander CLI, init wizard, runtime config loading\n config/ godex.yaml schema, defaults, env interpolation\n context/ ApplicationContext and per-request ResponsesContext\n bridge/ Provider-agnostic Responses-to-Chat planning and reconstruction\n providers/ Built-in provider specs, hooks, clients, and registry\n responses/ Sync and stream request pipelines\n server/ Bun routes for /health, /v1/models, /v1/responses\n session/ Memory and SQLite response session stores\n trace/ SQLite trace recorder and usage/error/event mappers\n protocol/ OpenAI protocol type definitions\n error/ GodeXError hierarchy and domain codes\n```\n\n## Provider Development\n\nProvider folders follow this shape:\n\n```text\nsrc/providers/<name>/\n spec.ts ProviderSpec declaration\n client.ts ProviderEdge construction with ChatProviderClient\n hooks.ts Provider-specific patching, accessors, usage, stream deltas\n protocol/ Provider DTOs when needed\n index.ts Public exports\n```\n\nAdd shared compatibility policy to `src/bridge`; add shared provider transport or protocol helpers to `src/providers/shared`.\n\n## License\n\nApache-2.0. See [LICENSE](./LICENSE).\n"}, "cf99c27bcfe9add2fdf0f24baaf8198375af1014": {"t": 1785748569.9500813, "n": 15738, "h": "ba80dc0b64bf9f5a", "c": "<div align=\"center\">\n\n<img src=\"design/assets/01-logo-system/png/godex-logo-horizontal-transparent-800x233.png\" alt=\"GodeX\" width=\"480\" />\n\n**Make every model a Codex engine.**\n\nOpenAI-compatible Responses API gateway for Codex, CLI tools and developer agents.\n\n[](https://www.npmjs.com/package/@ahoo-wang/godex)\n[](https://codecov.io/gh/Ahoo-Wang/GodeX)\n[](https://bun.sh)\n[](https://www.typescriptlang.org/)\n\n[**English Documentation**](https://godex.ahoo.me/) · [**中文文档**](https://godex.ahoo.me/zh/)\n</div>\n\nGodeX lets clients that speak the OpenAI Responses API use providers such as DeepSeek, Xiaomi, MiniMax, and Zhipu through one local server.\n\n\n\n## Highlights\n\n- OpenAI-compatible `POST /v1/responses` endpoint with sync and streaming responses.\n- `GET /v1/models` aliases so clients can use stable model names while GodeX routes to provider/model targets.\n- Built-in bridge providers for DeepSeek, Xiaomi, MiniMax, and Zhipu.\n- Provider capability planning for request parameters, tools, `tool_choice`, structured output formats, reasoning, and stream usage.\n- Responses `previous_response_id` session chains backed by memory or SQLite.\n- Trace recording for provider requests, provider responses, stream events, usage, and errors.\n- Native Bun runtime, TypeScript source, and compiled platform binaries for releases.\n\n## Built-in Providers\n\n| Provider | Reasoning | Tool Choice | Response Format | Cached Tokens | Default Model |\n|----------|-----------|-------------|-----------------|---------------|---------------|\n| DeepSeek | native | auto, none, required, function | text, json_object | ✅ | `deepseek-v4-pro` |\n| Xiaomi | boolean | auto | text, json_object | ✅ | `mimo-v2.5-pro` |\n| MiniMax | none | auto, none, required, function | text, json_object | ✅ | `MiniMax-M2.7` |\n| Zhipu | boolean | auto, none | text, json_object | ✅ | `glm-5.1` |\n\n## Architecture\n\n```mermaid\nflowchart TB\n Client[\"Client<br>Codex, SDK, CLI, IDE\"] --> Routes[\"Bun server routes<br>/health<br>/v1/models<br>/v1/responses\"]\n Routes --> Ctx[\"ResponsesContext<br>request id, response id, resolved model,<br>provider, session, diagnostics\"]\n\n Ctx --> Resolver[\"ModelResolver<br>alias and provider/model selection\"]\n Ctx --> Session[\"ResponseSessionStore<br>memory or SQLite<br>previous_response_id chains\"]\n Ctx --> Registrar[\"Registrar<br>built-in ProviderEdge factories\"]\n Ctx --> Runtime[\"ResponsesBridgeRuntime\"]\n\n Runtime --> Sync[\"SyncRequestPipeline\"]\n Runtime --> Stream[\"StreamPipeline\"]\n Sync --> Exchange[\"ProviderExchange\"]\n Stream --> Exchange\n\n Exchange --> Builder[\"bridge/request<br>buildChatCompletionRequest\"]\n Builder --> Compat[\"bridge/compatibility<br>parameter and response-format decisions\"]\n Builder --> Tools[\"bridge/tools<br>tool declarations, tool_choice,<br>identity restoration\"]\n Builder --> Output[\"bridge/output<br>structured-output contract\"]\n\n Exchange --> Edge[\"ProviderEdge<br>ProviderSpec + hooks\"]\n Edge --> ClientHttp[\"ChatProviderClient<br>Fetcher HTTP boundary\"]\n ClientHttp --> Upstream[\"Chat Completions upstream<br>DeepSeek, Xiaomi, MiniMax, Zhipu, custom\"]\n\n Upstream --> SyncRecon[\"bridge/response<br>reconstructResponseObject\"]\n Upstream --> StreamRecon[\"bridge/stream<br>ResponseStreamStateMachine\"]\n SyncRecon --> ResponseJson[\"ResponseObject JSON\"]\n StreamRecon --> StreamTransforms[\"stream transforms<br>validate, trace, log, persist, diagnostics\"]\n StreamTransforms --> Sse[\"Responses SSE\"]\n\n Ctx --> Trace[\"trace recorder<br>request, usage, event, error rows\"]\n Ctx --> Logger[\"structured logger\"]\n```\n\n## Component Interaction\n\n```mermaid\nsequenceDiagram\n autonumber\n actor Client\n participant Server as /v1/responses route\n participant Context as ResponsesContext factory\n participant Resolver as ModelResolver\n participant Store as ResponseSessionStore\n participant Registrar\n participant Runtime as ResponsesBridgeRuntime\n participant Exchange as ProviderExchange\n participant Bridge as bridge/request\n participant Provider as ProviderEdge\n participant Upstream as Chat Completions API\n\n Client->>Server: POST /v1/responses\n Server->>Server: parse and validate JSON envelope\n Server->>Context: create(app, body)\n Context->>Resolver: resolve(body.model)\n Resolver-->>Context: provider + upstream model\n opt previous_response_id\n Context->>Store: resolveChain(previous_response_id)\n Store-->>Context: ordered session snapshot\n end\n Context->>Registrar: resolve(provider)\n Registrar-->>Context: ProviderEdge\n Server->>Runtime: request(ctx) or stream(ctx)\n Runtime->>Exchange: build and send provider request\n Exchange->>Bridge: buildChatCompletionRequest(ctx)\n Bridge-->>Exchange: chat request + compatibility/tool/output plans\n Exchange->>Provider: request(body) or stream(body)\n Provider->>Upstream: POST /chat/completions\n Upstream-->>Provider: JSON response or SSE chunks\n alt sync\n Provider-->>Exchange: provider response\n Exchange-->>Runtime: provider response + plans\n Runtime->>Store: save completed response unless store=false\n Runtime-->>Server: ResponseObject\n Server-->>Client: JSON\n else stream\n Provider-->>Exchange: provider SSE stream\n Exchange-->>Runtime: stream + plans\n Runtime->>Runtime: bridge deltas, validate output, trace, log, persist\n Runtime-->>Server: ResponseStreamEvent stream\n Server-->>Client: text/event-stream\n end\n```\n\n## Install\n\nFor local development:\n\n```bash\ngit clone https://github.com/Ahoo-Wang/GodeX.git\ncd GodeX\nbun install\n```\n\nFor package use, install the published package and run the `godex` binary:\n\n```bash\nnpm install -g @ahoo-wang/godex\ngodex --help\n```\n\n### Docker\n\nPre-built images are published to Docker Hub and GitHub Container Registry:\n\n```bash\ndocker pull ahoowang/godex:latest\n# or\ndocker pull ghcr.io/ahoo-wang/godex:latest\n```\n\nRun with a config file:\n\n```bash\ndocker run -d \\\n --name godex \\\n -p 5678:5678 \\\n -e ZHIPU_API_KEY=your-key \\\n -e DEEPSEEK_API_KEY=your-key \\\n -e MINIMAX_API_KEY=your-key \\\n -e MIMO_API_KEY=your-key \\\n -v ./godex.yaml:/etc/godex/godex.yaml:ro \\\n -v godex-data:/data \\\n ahoowang/godex:latest\n```\n\nThe image supports `linux/amd64` and `linux/arm64`.\n\n- Config file: `/etc/godex/godex.yaml`\n- Data directory (sessions, trace): `/data`\n- Default port: `5678`\n\n## Quick Start\n\nCreate a config and start the server:\n\n```bash\ngodex init\ngodex serve --config ./godex.yaml\n```\n\nThe interactive wizard walks you through selecting providers, entering base URLs and API keys, and writes the config file automatically.\n\nAlternatively, create `godex.yaml` manually:\n\n```yaml\nserver:\n port: 5678\n host: 0.0.0.0\n\ndefault_provider: deepseek\n\nmodels:\n aliases:\n # -------------------------------------------------------------------------\n # Codex-compatible model aliases\n #\n # 这些 alias 是 GodeX routing policy,不代表与 OpenAI 原模型能力等价。\n # 依据优先级:公开 benchmark > 官方模型定位 > Provider 产品说明。\n # -------------------------------------------------------------------------\n\n # Codex 默认主力:复杂编码 / computer use / research workflows\n # 依据:DeepSeek V4-Pro 在 SWE / Terminal / Codeforces / GDPval-AA 上公开成绩强。\n gpt-5.5: \"deepseek/deepseek-v4-pro\"\n\n # Codex 旗舰:coding + reasoning + tool use + agentic workflows\n # 依据:DeepSeek V4-Pro 有更完整的公开 coding/agentic benchmark 覆盖。\n gpt-5.4: \"deepseek/deepseek-v4-pro\"\n\n # Codex mini:subagents\n gpt-5.4-mini: \"zhipu/glm-5.1\"\n\n # Codex 编码专用:复杂软件工程\n # 依据:DeepSeek V4-Pro 的 SWE Verified / SWE Pro / Terminal Bench 表现。\n gpt-5.3-codex: \"deepseek/deepseek-v4-pro\"\n\n # Codex spark:近实时编码迭代\n gpt-5.3-codex-spark: \"zhipu/glm-5.1\"\n\n # 上一代通用 coding / agentic fallback\n # 严谨起见仍走 DeepSeek;不强行映射到 Zhipu。\n gpt-5.2: \"deepseek/deepseek-v4-pro\"\n\n # -------------------------------------------------------------------------\n # Provider native models\n # -------------------------------------------------------------------------\n\n deepseek-v4-pro: \"deepseek/deepseek-v4-pro\"\n deepseek-v4-flash: \"deepseek/deepseek-v4-flash\"\n\n mimo-v2.5-pro: \"xiaomi/mimo-v2.5-pro\"\n mimo-v2.5: \"xiaomi/mimo-v2.5\"\n\n glm-5.1: \"zhipu/glm-5.1\"\n glm-5-turbo: \"zhipu/glm-5-turbo\"\n glm-4.7: \"zhipu/glm-4.7\"\n glm-4.5-air: \"zhipu/glm-4.5-air\"\n\n MiniMax-M2.7: \"minimax/MiniMax-M2.7\"\n MiniMax-M2.7-highspeed: \"minimax/MiniMax-M2.7-highspeed\"\n\n # Fallback for unknown bare model names\n \"*\": \"deepseek/deepseek-v4-pro\"\n\nproviders:\n deepseek:\n spec: deepseek\n credentials:\n api_key: ${DEEPSEEK_API_KEY}\n endpoint:\n base_url: https://api.deepseek.com\n zhipu:\n spec: zhipu\n credentials:\n api_key: ${ZHIPU_API_KEY}\n endpoint:\n base_url: https://open.bigmodel.cn/api/coding/paas/v4\n minimax:\n spec: minimax\n credentials:\n api_key: ${MINIMAX_API_KEY}\n endpoint:\n base_url: https://api.minimaxi.com/v1\n xiaomi:\n spec: xiaomi\n credentials:\n api_key: ${MIMO_API_KEY}\n endpoint:\n base_url: https://api.xiaomimimo.com/v1\n\nsession:\n backend: sqlite\n\nlogging:\n level: info\n\ntrace:\n enabled: true\n path: ./data/trace.db\n capture_payload: false\n```\n\nStart the server:\n\n```bash\ngodex serve --config ./godex.yaml\n```\n\nThe dev command starts GodeX on port `13145`; the default runtime config port is `5678`.\n\n## API\n\n### Health\n\n```bash\ncurl http://localhost:5678/health\n```\n\n### Models\n\n```bash\ncurl http://localhost:5678/v1/models\n```\n\n`/v1/models` lists configured aliases, excluding the wildcard alias `*`.\n\n### Responses\n\n```bash\ncurl http://localhost:5678/v1/responses \\\n -H 'content-type: application/json' \\\n -d '{\n \"model\": \"gpt-5.5\",\n \"input\": \"Write a short TypeScript function that adds two numbers.\"\n }'\n```\n\nStreaming uses standard Responses SSE event names:\n\n```bash\ncurl -N http://localhost:5678/v1/responses \\\n -H 'content-type: application/json' \\\n -d '{\n \"model\": \"gpt-5.5\",\n \"stream\": true,\n \"input\": \"Explain Bun streams in two sentences.\"\n }'\n```\n\n## Model Routing\n\nClients may pass either:\n\n- A provider-qualified selector such as `deepseek/deepseek-v4-pro`\n- A configured alias such as `gpt-5.5`\n- A bare model name, which resolves through `default_provider` when no alias matches\n\nAliases must map to `provider/model` values, and the provider must exist in `providers`.\n\n\n## Codex Integration\n\nConnect the Codex desktop app to GodeX by adding a custom provider in `~/.codex/config.toml`:\n\n```toml\nmodel = \"gpt-5.5\"\nmodel_provider = \"godex\"\n\n[model_providers.godex]\nname = \"GodeX\"\nbase_url = \"http://127.0.0.1:5678/v1\"\nwire_api = \"responses\"\nrequires_openai_auth = false\nsupports_websockets = false\n```\n\nModel aliases (`gpt-5.5`, `gpt-5.4`, `gpt-5.4-mini`, etc.) are resolved by GodeX using the `models.aliases` map in `godex.yaml` — Codex itself only needs the alias name.\n\n\n## Provider Bridge Behavior\n\nGodeX builds a provider request in three steps:\n\n1. Resolve the client model selector to a configured provider and upstream model.\n2. Plan compatibility from the provider `ProviderSpec`, including request parameters, tool declarations, `tool_choice`, response format, reasoning, and stream usage.\n3. Convert Responses input and session history into Chat Completions messages, call the upstream provider, and reconstruct a Responses object or Responses SSE stream.\n\nProvider-specific differences belong in each provider's `spec.ts`, `hooks.ts`, protocol types, and HTTP client. Shared Responses-to-Chat policy belongs under `src/bridge`.\n\n## Structured Output\n\nWhen a provider supports `json_object` but not native `json_schema`, GodeX can degrade strict `json_schema` requests to `json_object`.\n\nFor strict downgraded schemas:\n\n- The schema instruction is added to the provider prompt preamble for the current request.\n- The provider receives `response_format: { \"type\": \"json_object\" }`.\n- GodeX validates that the final output is valid JSON.\n- Invalid sync output fails the response; invalid stream output is rewritten to a terminal `response.failed` event.\n\nThe validator checks JSON syntax, not full JSON Schema conformance.\n\n## Sessions\n\nResponses can be stored and replayed with `previous_response_id`.\n\n- `session.backend: memory` keeps history in process memory.\n- `session.backend: sqlite` persists history to SQLite.\n- Requests with `store: false` are not saved.\n- The session chain stores request snapshots and response output items, then rebuilds provider-neutral history on the next turn.\n\n## Trace Database\n\nTracing is enabled by default and writes SQLite rows to `./data/trace.db` unless configured otherwise.\n\nTrace records include:\n\n- Provider request metadata and final patched request payload summaries\n- Provider request lifecycle events without duplicating full request bodies\n- Sync provider response bodies as summarized payloads\n- Raw and transformed stream events\n- Usage details, including cached tokens when provided by the upstream\n- Route and provider errors\n\nSet `trace.capture_payload: true` to persist payload JSON up to `trace.payload_max_bytes` for trace rows that carry payloads. Keep it disabled for sensitive environments.\n\n## Development\n\n```bash\nbun install # Install dependencies\nbun run dev # Dev server with hot reload on port 13145\nbun run start # Start server from source\nbun run build # Build a binary for the current platform\nbun run compile:all # Cross-compile all supported platform packages\n```\n\nQuality gates:\n\n```bash\nbun run typecheck # TypeScript\nbun run lint # Biome check\nbun run lint:fix # Biome autofix\nbun run format # Biome format\nbun run test # Unit and integration tests, excluding src/e2e\nbun run test:e2e # Mocked end-to-end tests\nbun run test:zhipu # Live Zhipu tests; requires ZHIPU_API_KEY\nbun run test:deepseek # Live DeepSeek tests; requires DEEPSEEK_API_KEY\nbun run test:minimax # Live MiniMax tests; requires MINIMAX_API_KEY\nbun run test:xiaomi # Live Xiaomi tests; requires MIMO_API_KEY\nbun run check # typecheck + lint + test\nbun run ci # typecheck + biome ci + test + e2e\n```\n\n## Source Map\n\n```text\nsrc/\n cli/ Commander CLI, init wizard, runtime config loading\n config/ godex.yaml schema, defaults, env interpolation\n context/ ApplicationContext and per-request ResponsesContext\n bridge/ Provider-agnostic Responses-to-Chat planning and reconstruction\n providers/ Built-in provider specs, hooks, clients, and registry\n responses/ Sync and stream request pipelines\n server/ Bun routes for /health, /v1/models, /v1/responses\n session/ Memory and SQLite response session stores\n trace/ SQLite trace recorder and usage/error/event mappers\n protocol/ OpenAI protocol type definitions\n error/ GodeXError hierarchy and domain codes\n```\n\n## Provider Development\n\nProvider folders follow this shape:\n\n```text\nsrc/providers/<name>/\n spec.ts ProviderSpec declaration\n client.ts ProviderEdge construction with ChatProviderClient\n hooks.ts Provider-specific patching, accessors, usage, stream deltas\n protocol/ Provider DTOs when needed\n index.ts Public exports\n```\n\nAdd shared compatibility policy to `src/bridge`; add shared provider transport or protocol helpers to `src/providers/shared`.\n\n## License\n\nApache-2.0. See [LICENSE](./LICENSE).\n"}, "326fc89bd7cd353c1c11b6786594a3809be29115": {"t": 1785748571.086064, "n": 15644, "h": "2f27882cf1815286", "c": "<div align=\"center\">\n\n<img src=\"design/assets/01-logo-system/png/godex-logo-horizontal-transparent-800x233.png\" alt=\"GodeX\" width=\"480\" />\n\n**Make every model a Codex engine.**\n\nOpenAI-compatible Responses API gateway for Codex, CLI tools and developer agents.\n\n[](https://www.npmjs.com/package/@ahoo-wang/godex)\n[](https://codecov.io/gh/Ahoo-Wang/GodeX)\n[](https://bun.sh)\n[](https://www.typescriptlang.org/)\n\n</div>\n\nGodeX lets clients that speak the OpenAI Responses API use providers such as DeepSeek, Xiaomi, MiniMax, and Zhipu through one local server.\n\n## Highlights\n\n- OpenAI-compatible `POST /v1/responses` endpoint with sync and streaming responses.\n- `GET /v1/models` aliases so clients can use stable model names while GodeX routes to provider/model targets.\n- Built-in bridge providers for DeepSeek, Xiaomi, MiniMax, and Zhipu.\n- Provider capability planning for request parameters, tools, `tool_choice`, structured output formats, reasoning, and stream usage.\n- Responses `previous_response_id` session chains backed by memory or SQLite.\n- Trace recording for provider requests, provider responses, stream events, usage, and errors.\n- Native Bun runtime, TypeScript source, and compiled platform binaries for releases.\n\n## Built-in Providers\n\n| Provider | Reasoning | Tool Choice | Response Format | Cached Tokens | Default Model |\n|----------|-----------|-------------|-----------------|---------------|---------------|\n| DeepSeek | native | auto, none, required, function | text, json_object | ✅ | `deepseek-v4-pro` |\n| Xiaomi | boolean | auto | text, json_object | ✅ | `mimo-v2.5-pro` |\n| MiniMax | none | auto, none, required, function | text, json_object | ✅ | `MiniMax-M2.7` |\n| Zhipu | boolean | auto, none | text, json_object | ✅ | `glm-5.1` |\n\n## Architecture\n\n```mermaid\nflowchart TB\n Client[\"Client<br>Codex, SDK, CLI, IDE\"] --> Routes[\"Bun server routes<br>/health<br>/v1/models<br>/v1/responses\"]\n Routes --> Ctx[\"ResponsesContext<br>request id, response id, resolved model,<br>provider, session, diagnostics\"]\n\n Ctx --> Resolver[\"ModelResolver<br>alias and provider/model selection\"]\n Ctx --> Session[\"ResponseSessionStore<br>memory or SQLite<br>previous_response_id chains\"]\n Ctx --> Registrar[\"Registrar<br>built-in ProviderEdge factories\"]\n Ctx --> Runtime[\"ResponsesBridgeRuntime\"]\n\n Runtime --> Sync[\"SyncRequestPipeline\"]\n Runtime --> Stream[\"StreamPipeline\"]\n Sync --> Exchange[\"ProviderExchange\"]\n Stream --> Exchange\n\n Exchange --> Builder[\"bridge/request<br>buildChatCompletionRequest\"]\n Builder --> Compat[\"bridge/compatibility<br>parameter and response-format decisions\"]\n Builder --> Tools[\"bridge/tools<br>tool declarations, tool_choice,<br>identity restoration\"]\n Builder --> Output[\"bridge/output<br>structured-output contract\"]\n\n Exchange --> Edge[\"ProviderEdge<br>ProviderSpec + hooks\"]\n Edge --> ClientHttp[\"ChatProviderClient<br>Fetcher HTTP boundary\"]\n ClientHttp --> Upstream[\"Chat Completions upstream<br>DeepSeek, Xiaomi, MiniMax, Zhipu, custom\"]\n\n Upstream --> SyncRecon[\"bridge/response<br>reconstructResponseObject\"]\n Upstream --> StreamRecon[\"bridge/stream<br>ResponseStreamStateMachine\"]\n SyncRecon --> ResponseJson[\"ResponseObject JSON\"]\n StreamRecon --> StreamTransforms[\"stream transforms<br>validate, trace, log, persist, diagnostics\"]\n StreamTransforms --> Sse[\"Responses SSE\"]\n\n Ctx --> Trace[\"trace recorder<br>request, usage, event, error rows\"]\n Ctx --> Logger[\"structured logger\"]\n```\n\n## Component Interaction\n\n```mermaid\nsequenceDiagram\n autonumber\n actor Client\n participant Server as /v1/responses route\n participant Context as ResponsesContext factory\n participant Resolver as ModelResolver\n participant Store as ResponseSessionStore\n participant Registrar\n participant Runtime as ResponsesBridgeRuntime\n participant Exchange as ProviderExchange\n participant Bridge as bridge/request\n participant Provider as ProviderEdge\n participant Upstream as Chat Completions API\n\n Client->>Server: POST /v1/responses\n Server->>Server: parse and validate JSON envelope\n Server->>Context: create(app, body)\n Context->>Resolver: resolve(body.model)\n Resolver-->>Context: provider + upstream model\n opt previous_response_id\n Context->>Store: resolveChain(previous_response_id)\n Store-->>Context: ordered session snapshot\n end\n Context->>Registrar: resolve(provider)\n Registrar-->>Context: ProviderEdge\n Server->>Runtime: request(ctx) or stream(ctx)\n Runtime->>Exchange: build and send provider request\n Exchange->>Bridge: buildChatCompletionRequest(ctx)\n Bridge-->>Exchange: chat request + compatibility/tool/output plans\n Exchange->>Provider: request(body) or stream(body)\n Provider->>Upstream: POST /chat/completions\n Upstream-->>Provider: JSON response or SSE chunks\n alt sync\n Provider-->>Exchange: provider response\n Exchange-->>Runtime: provider response + plans\n Runtime->>Store: save completed response unless store=false\n Runtime-->>Server: ResponseObject\n Server-->>Client: JSON\n else stream\n Provider-->>Exchange: provider SSE stream\n Exchange-->>Runtime: stream + plans\n Runtime->>Runtime: bridge deltas, validate output, trace, log, persist\n Runtime-->>Server: ResponseStreamEvent stream\n Server-->>Client: text/event-stream\n end\n```\n\n## Install\n\nFor local development:\n\n```bash\ngit clone https://github.com/Ahoo-Wang/GodeX.git\ncd GodeX\nbun install\n```\n\nFor package use, install the published package and run the `godex` binary:\n\n```bash\nnpm install -g @ahoo-wang/godex\ngodex --help\n```\n\n### Docker\n\nPre-built images are published to Docker Hub and GitHub Container Registry:\n\n```bash\ndocker pull ahoowang/godex:latest\n# or\ndocker pull ghcr.io/ahoo-wang/godex:latest\n```\n\nRun with a config file:\n\n```bash\ndocker run -d \\\n --name godex \\\n -p 5678:5678 \\\n -e ZHIPU_API_KEY=your-key \\\n -e DEEPSEEK_API_KEY=your-key \\\n -e MINIMAX_API_KEY=your-key \\\n -e MIMO_API_KEY=your-key \\\n -v ./godex.yaml:/etc/godex/godex.yaml:ro \\\n -v godex-data:/data \\\n ahoowang/godex:latest\n```\n\nThe image supports `linux/amd64` and `linux/arm64`.\n\n- Config file: `/etc/godex/godex.yaml`\n- Data directory (sessions, trace): `/data`\n- Default port: `5678`\n\n## Quick Start\n\nCreate a config and start the server:\n\n```bash\ngodex init\ngodex serve --config ./godex.yaml\n```\n\nThe interactive wizard walks you through selecting providers, entering base URLs and API keys, and writes the config file automatically.\n\nAlternatively, create `godex.yaml` manually:\n\n```yaml\nserver:\n port: 5678\n host: 0.0.0.0\n\ndefault_provider: deepseek\n\nmodels:\n aliases:\n # -------------------------------------------------------------------------\n # Codex-compatible model aliases\n #\n # 这些 alias 是 GodeX routing policy,不代表与 OpenAI 原模型能力等价。\n # 依据优先级:公开 benchmark > 官方模型定位 > Provider 产品说明。\n # -------------------------------------------------------------------------\n\n # Codex 默认主力:复杂编码 / computer use / research workflows\n # 依据:DeepSeek V4-Pro 在 SWE / Terminal / Codeforces / GDPval-AA 上公开成绩强。\n gpt-5.5: \"deepseek/deepseek-v4-pro\"\n\n # Codex 旗舰:coding + reasoning + tool use + agentic workflows\n # 依据:DeepSeek V4-Pro 有更完整的公开 coding/agentic benchmark 覆盖。\n gpt-5.4: \"deepseek/deepseek-v4-pro\"\n\n # Codex mini:subagents\n gpt-5.4-mini: \"zhipu/glm-5.1\"\n\n # Codex 编码专用:复杂软件工程\n # 依据:DeepSeek V4-Pro 的 SWE Verified / SWE Pro / Terminal Bench 表现。\n gpt-5.3-codex: \"deepseek/deepseek-v4-pro\"\n\n # Codex spark:近实时编码迭代\n gpt-5.3-codex-spark: \"zhipu/glm-5.1\"\n\n # 上一代通用 coding / agentic fallback\n # 严谨起见仍走 DeepSeek;不强行映射到 Zhipu。\n gpt-5.2: \"deepseek/deepseek-v4-pro\"\n\n # -------------------------------------------------------------------------\n # Provider native models\n # -------------------------------------------------------------------------\n\n deepseek-v4-pro: \"deepseek/deepseek-v4-pro\"\n deepseek-v4-flash: \"deepseek/deepseek-v4-flash\"\n\n mimo-v2.5-pro: \"xiaomi/mimo-v2.5-pro\"\n mimo-v2.5: \"xiaomi/mimo-v2.5\"\n\n glm-5.1: \"zhipu/glm-5.1\"\n glm-5-turbo: \"zhipu/glm-5-turbo\"\n glm-4.7: \"zhipu/glm-4.7\"\n glm-4.5-air: \"zhipu/glm-4.5-air\"\n\n MiniMax-M2.7: \"minimax/MiniMax-M2.7\"\n MiniMax-M2.7-highspeed: \"minimax/MiniMax-M2.7-highspeed\"\n\n # Fallback for unknown bare model names\n \"*\": \"deepseek/deepseek-v4-pro\"\n\nproviders:\n deepseek:\n spec: deepseek\n credentials:\n api_key: ${DEEPSEEK_API_KEY}\n endpoint:\n base_url: https://api.deepseek.com\n zhipu:\n spec: zhipu\n credentials:\n api_key: ${ZHIPU_API_KEY}\n endpoint:\n base_url: https://open.bigmodel.cn/api/coding/paas/v4\n minimax:\n spec: minimax\n credentials:\n api_key: ${MINIMAX_API_KEY}\n endpoint:\n base_url: https://api.minimaxi.com/v1\n xiaomi:\n spec: xiaomi\n credentials:\n api_key: ${MIMO_API_KEY}\n endpoint:\n base_url: https://api.xiaomimimo.com/v1\n\nsession:\n backend: sqlite\n\nlogging:\n level: info\n\ntrace:\n enabled: true\n path: ./data/trace.db\n capture_payload: false\n```\n\nStart the server:\n\n```bash\ngodex serve --config ./godex.yaml\n```\n\nThe dev command starts GodeX on port `13145`; the default runtime config port is `5678`.\n\n## API\n\n### Health\n\n```bash\ncurl http://localhost:5678/health\n```\n\n### Models\n\n```bash\ncurl http://localhost:5678/v1/models\n```\n\n`/v1/models` lists configured aliases, excluding the wildcard alias `*`.\n\n### Responses\n\n```bash\ncurl http://localhost:5678/v1/responses \\\n -H 'content-type: application/json' \\\n -d '{\n \"model\": \"gpt-5.5\",\n \"input\": \"Write a short TypeScript function that adds two numbers.\"\n }'\n```\n\nStreaming uses standard Responses SSE event names:\n\n```bash\ncurl -N http://localhost:5678/v1/responses \\\n -H 'content-type: application/json' \\\n -d '{\n \"model\": \"gpt-5.5\",\n \"stream\": true,\n \"input\": \"Explain Bun streams in two sentences.\"\n }'\n```\n\n## Model Routing\n\nClients may pass either:\n\n- A provider-qualified selector such as `deepseek/deepseek-v4-pro`\n- A configured alias such as `gpt-5.5`\n- A bare model name, which resolves through `default_provider` when no alias matches\n\nAliases must map to `provider/model` values, and the provider must exist in `providers`.\n\n\n## Codex Integration\n\nConnect the Codex desktop app to GodeX by adding a custom provider in `~/.codex/config.toml`:\n\n```toml\nmodel = \"gpt-5.5\"\nmodel_provider = \"godex\"\n\n[model_providers.godex]\nname = \"GodeX\"\nbase_url = \"http://127.0.0.1:5678/v1\"\nwire_api = \"responses\"\nrequires_openai_auth = false\nsupports_websockets = false\n```\n\nModel aliases (`gpt-5.5`, `gpt-5.4`, `gpt-5.4-mini`, etc.) are resolved by GodeX using the `models.aliases` map in `godex.yaml` — Codex itself only needs the alias name.\n\n\n## Provider Bridge Behavior\n\nGodeX builds a provider request in three steps:\n\n1. Resolve the client model selector to a configured provider and upstream model.\n2. Plan compatibility from the provider `ProviderSpec`, including request parameters, tool declarations, `tool_choice`, response format, reasoning, and stream usage.\n3. Convert Responses input and session history into Chat Completions messages, call the upstream provider, and reconstruct a Responses object or Responses SSE stream.\n\nProvider-specific differences belong in each provider's `spec.ts`, `hooks.ts`, protocol types, and HTTP client. Shared Responses-to-Chat policy belongs under `src/bridge`.\n\n## Structured Output\n\nWhen a provider supports `json_object` but not native `json_schema`, GodeX can degrade strict `json_schema` requests to `json_object`.\n\nFor strict downgraded schemas:\n\n- The schema instruction is added to the provider prompt preamble for the current request.\n- The provider receives `response_format: { \"type\": \"json_object\" }`.\n- GodeX validates that the final output is valid JSON.\n- Invalid sync output fails the response; invalid stream output is rewritten to a terminal `response.failed` event.\n\nThe validator checks JSON syntax, not full JSON Schema conformance.\n\n## Sessions\n\nResponses can be stored and replayed with `previous_response_id`.\n\n- `session.backend: memory` keeps history in process memory.\n- `session.backend: sqlite` persists history to SQLite.\n- Requests with `store: false` are not saved.\n- The session chain stores request snapshots and response output items, then rebuilds provider-neutral history on the next turn.\n\n## Trace Database\n\nTracing is enabled by default and writes SQLite rows to `./data/trace.db` unless configured otherwise.\n\nTrace records include:\n\n- Provider request metadata and final patched request payload summaries\n- Provider request lifecycle events without duplicating full request bodies\n- Sync provider response bodies as summarized payloads\n- Raw and transformed stream events\n- Usage details, including cached tokens when provided by the upstream\n- Route and provider errors\n\nSet `trace.capture_payload: true` to persist payload JSON up to `trace.payload_max_bytes` for trace rows that carry payloads. Keep it disabled for sensitive environments.\n\n## Development\n\n```bash\nbun install # Install dependencies\nbun run dev # Dev server with hot reload on port 13145\nbun run start # Start server from source\nbun run build # Build a binary for the current platform\nbun run compile:all # Cross-compile all supported platform packages\n```\n\nQuality gates:\n\n```bash\nbun run typecheck # TypeScript\nbun run lint # Biome check\nbun run lint:fix # Biome autofix\nbun run format # Biome format\nbun run test # Unit and integration tests, excluding src/e2e\nbun run test:e2e # Mocked end-to-end tests\nbun run test:zhipu # Live Zhipu tests; requires ZHIPU_API_KEY\nbun run test:deepseek # Live DeepSeek tests; requires DEEPSEEK_API_KEY\nbun run test:minimax # Live MiniMax tests; requires MINIMAX_API_KEY\nbun run test:xiaomi # Live Xiaomi tests; requires MIMO_API_KEY\nbun run check # typecheck + lint + test\nbun run ci # typecheck + biome ci + test + e2e\n```\n\n## Source Map\n\n```text\nsrc/\n cli/ Commander CLI, init wizard, runtime config loading\n config/ godex.yaml schema, defaults, env interpolation\n context/ ApplicationContext and per-request ResponsesContext\n bridge/ Provider-agnostic Responses-to-Chat planning and reconstruction\n providers/ Built-in provider specs, hooks, clients, and registry\n responses/ Sync and stream request pipelines\n server/ Bun routes for /health, /v1/models, /v1/responses\n session/ Memory and SQLite response session stores\n trace/ SQLite trace recorder and usage/error/event mappers\n protocol/ OpenAI protocol type definitions\n error/ GodeXError hierarchy and domain codes\n```\n\n## Provider Development\n\nProvider folders follow this shape:\n\n```text\nsrc/providers/<name>/\n spec.ts ProviderSpec declaration\n client.ts ProviderEdge construction with ChatProviderClient\n hooks.ts Provider-specific patching, accessors, usage, stream deltas\n protocol/ Provider DTOs when needed\n index.ts Public exports\n```\n\nAdd shared compatibility policy to `src/bridge`; add shared provider transport or protocol helpers to `src/providers/shared`.\n\n## License\n\nApache-2.0. See [LICENSE](./LICENSE).\n"}, "0f8625a01787149798873fab739909abd4b59446": {"t": 1785748572.6611516, "n": 15698, "h": "bf8b95da945ed8f2", "c": "<div align=\"center\">\n\n<img src=\"design/assets/01-logo-system/png/godex-logo-horizontal-transparent-800x233.png\" alt=\"GodeX\" width=\"480\" />\n\n**Make every model a Codex engine.**\n\nOpenAI-compatible Responses API gateway for Codex, CLI tools and developer agents.\n\n[](https://www.npmjs.com/package/@ahoo-wang/godex)\n[](https://codecov.io/gh/Ahoo-Wang/GodeX)\n[](https://bun.sh)\n[](https://www.typescriptlang.org/)\n\n</div>\n\nGodeX lets clients that speak the OpenAI Responses API use providers such as DeepSeek, Xiaomi, MiniMax, and Zhipu through one local server.\n\n## Highlights\n\n- OpenAI-compatible `POST /v1/responses` endpoint with sync and streaming responses.\n- `GET /v1/models` aliases so clients can use stable model names while GodeX routes to provider/model targets.\n- Built-in bridge providers for DeepSeek, Xiaomi, MiniMax, and Zhipu.\n- Provider capability planning for request parameters, tools, `tool_choice`, structured output formats, reasoning, and stream usage.\n- Responses `previous_response_id` session chains backed by memory or SQLite.\n- Trace recording for provider requests, provider responses, stream events, usage, and errors.\n- Native Bun runtime, TypeScript source, and compiled platform binaries for releases.\n\n## Built-in Providers\n\n| Provider | Reasoning | Tool Choice | Response Format | Cached Tokens | Default Model |\n|----------|-----------|-------------|-----------------|---------------|---------------|\n| DeepSeek | native | auto, none, required, function | text, json_object | ✅ | `deepseek-v4-pro` |\n| Xiaomi | boolean | auto | text, json_object | ✅ | `mimo-v2.5-pro` |\n| MiniMax | none | auto, none, required, function | text, json_object | ✅ | `MiniMax-M2.7` |\n| Zhipu | boolean | auto, none | text, json_object | ✅ | `glm-5.1` |\n\n## Architecture\n\n```mermaid\nflowchart TB\n Client[\"Client<br>Codex, SDK, CLI, IDE\"] --> Routes[\"Bun server routes<br>/health<br>/v1/models<br>/v1/responses\"]\n Routes --> Ctx[\"ResponsesContext<br>request id, response id, resolved model,<br>provider, session, diagnostics\"]\n\n Ctx --> Resolver[\"ModelResolver<br>alias and provider/model selection\"]\n Ctx --> Session[\"ResponseSessionStore<br>memory or SQLite<br>previous_response_id chains\"]\n Ctx --> Registrar[\"Registrar<br>built-in ProviderEdge factories\"]\n Ctx --> Runtime[\"ResponsesBridgeRuntime\"]\n\n Runtime --> Sync[\"SyncRequestPipeline\"]\n Runtime --> Stream[\"StreamPipeline\"]\n Sync --> Exchange[\"ProviderExchange\"]\n Stream --> Exchange\n\n Exchange --> Builder[\"bridge/request<br>buildChatCompletionRequest\"]\n Builder --> Compat[\"bridge/compatibility<br>parameter and response-format decisions\"]\n Builder --> Tools[\"bridge/tools<br>tool declarations, tool_choice,<br>identity restoration\"]\n Builder --> Output[\"bridge/output<br>structured-output contract\"]\n\n Exchange --> Edge[\"ProviderEdge<br>ProviderSpec + hooks\"]\n Edge --> ClientHttp[\"ChatProviderClient<br>Fetcher HTTP boundary\"]\n ClientHttp --> Upstream[\"Chat Completions upstream<br>DeepSeek, Xiaomi, MiniMax, Zhipu, custom\"]\n\n Upstream --> SyncRecon[\"bridge/response<br>reconstructResponseObject\"]\n Upstream --> StreamRecon[\"bridge/stream<br>ResponseStreamStateMachine\"]\n SyncRecon --> ResponseJson[\"ResponseObject JSON\"]\n StreamRecon --> StreamTransforms[\"stream transforms<br>validate, trace, log, persist, diagnostics\"]\n StreamTransforms --> Sse[\"Responses SSE\"]\n\n Ctx --> Trace[\"trace recorder<br>request, usage, event, error rows\"]\n Ctx --> Logger[\"structured logger\"]\n```\n\n## Component Interaction\n\n```mermaid\nsequenceDiagram\n autonumber\n actor Client\n participant Server as /v1/responses route\n participant Context as ResponsesContext factory\n participant Resolver as ModelResolver\n participant Store as ResponseSessionStore\n participant Registrar\n participant Runtime as ResponsesBridgeRuntime\n participant Exchange as ProviderExchange\n participant Bridge as bridge/request\n participant Provider as ProviderEdge\n participant Upstream as Chat Completions API\n\n Client->>Server: POST /v1/responses\n Server->>Server: parse and validate JSON envelope\n Server->>Context: create(app, body)\n Context->>Resolver: resolve(body.model)\n Resolver-->>Context: provider + upstream model\n opt previous_response_id\n Context->>Store: resolveChain(previous_response_id)\n Store-->>Context: ordered session snapshot\n end\n Context->>Registrar: resolve(provider)\n Registrar-->>Context: ProviderEdge\n Server->>Runtime: request(ctx) or stream(ctx)\n Runtime->>Exchange: build and send provider request\n Exchange->>Bridge: buildChatCompletionRequest(ctx)\n Bridge-->>Exchange: chat request + compatibility/tool/output plans\n Exchange->>Provider: request(body) or stream(body)\n Provider->>Upstream: POST /chat/completions\n Upstream-->>Provider: JSON response or SSE chunks\n alt sync\n Provider-->>Exchange: provider response\n Exchange-->>Runtime: provider response + plans\n Runtime->>Store: save completed response unless store=false\n Runtime-->>Server: ResponseObject\n Server-->>Client: JSON\n else stream\n Provider-->>Exchange: provider SSE stream\n Exchange-->>Runtime: stream + plans\n Runtime->>Runtime: bridge deltas, validate output, trace, log, persist\n Runtime-->>Server: ResponseStreamEvent stream\n Server-->>Client: text/event-stream\n end\n```\n\n## Install\n\nFor local development:\n\n```bash\ngit clone https://github.com/Ahoo-Wang/GodeX.git\ncd GodeX\nbun install\n```\n\nFor package use, install the published package and run the `godex` binary:\n\n```bash\nnpm install -g @ahoo-wang/godex\ngodex --help\n```\n\n### Docker\n\nPre-built images are published to Docker Hub and GitHub Container Registry:\n\n```bash\ndocker pull ahoowang/godex:latest\n# or\ndocker pull ghcr.io/ahoo-wang/godex:latest\n```\n\nRun with a config file:\n\n```bash\ndocker run -d \\\n --name godex \\\n -p 5678:5678 \\\n -e ZHIPU_API_KEY=your-key \\\n -e DEEPSEEK_API_KEY=your-key \\\n -e MINIMAX_API_KEY=your-key \\\n -e MIMO_API_KEY=your-key \\\n -v ./godex.yaml:/etc/godex/godex.yaml:ro \\\n -v godex-data:/data \\\n ahoowang/godex:latest\n```\n\nThe image supports `linux/amd64` and `linux/arm64`.\n\n- Config file: `/etc/godex/godex.yaml`\n- Data directory (sessions, trace): `/data`\n- Default port: `5678`\n\n## Quick Start\n\nCreate a config and start the server:\n\n```bash\ngodex init\ngodex serve --config ./godex.yaml\n```\n\nThe interactive wizard walks you through selecting providers, entering base URLs and API keys, and writes the config file automatically.\n\nAlternatively, create `godex.yaml` manually:\n\n```yaml\nserver:\n port: 5678\n host: 0.0.0.0\n\ndefault_provider: deepseek\n\nmodels:\n aliases:\n # -------------------------------------------------------------------------\n # Codex-compatible model aliases\n #\n # 这些 alias 是 GodeX routing policy,不代表与 OpenAI 原模型能力等价。\n # 依据优先级:公开 benchmark > 官方模型定位 > Provider 产品说明。\n # -------------------------------------------------------------------------\n\n # Codex 默认主力:复杂编码 / computer use / research workflows\n # 依据:DeepSeek V4-Pro 在 SWE / Terminal / Codeforces / GDPval-AA 上公开成绩强。\n gpt-5.5: \"deepseek/deepseek-v4-pro\"\n\n # Codex 旗舰:coding + reasoning + tool use + agentic workflows\n # 依据:DeepSeek V4-Pro 有更完整的公开 coding/agentic benchmark 覆盖。\n gpt-5.4: \"deepseek/deepseek-v4-pro\"\n\n # Codex mini:subagents\n gpt-5.4-mini: \"zhipu/glm-5.1\"\n\n # Codex 编码专用:复杂软件工程\n # 依据:DeepSeek V4-Pro 的 SWE Verified / SWE Pro / Terminal Bench 表现。\n gpt-5.3-codex: \"deepseek/deepseek-v4-pro\"\n\n # Codex spark:近实时编码迭代\n gpt-5.3-codex-spark: \"zhipu/glm-5.1\"\n\n # 上一代通用 coding / agentic fallback\n # 严谨起见仍走 DeepSeek;不强行映射到 Zhipu。\n gpt-5.2: \"deepseek/deepseek-v4-pro\"\n\n # -------------------------------------------------------------------------\n # Provider native models\n # -------------------------------------------------------------------------\n\n deepseek-v4-pro: \"deepseek/deepseek-v4-pro\"\n deepseek-v4-flash: \"deepseek/deepseek-v4-flash\"\n\n mimo-v2.5-pro: \"xiaomi/mimo-v2.5-pro\"\n mimo-v2.5: \"xiaomi/mimo-v2.5\"\n\n glm-5.1: \"zhipu/glm-5.1\"\n glm-5-turbo: \"zhipu/glm-5-turbo\"\n glm-4.7: \"zhipu/glm-4.7\"\n glm-4.5-air: \"zhipu/glm-4.5-air\"\n\n MiniMax-M2.7: \"minimax/MiniMax-M2.7\"\n MiniMax-M2.7-highspeed: \"minimax/MiniMax-M2.7-highspeed\"\n\n # Fallback for unknown bare model names\n \"*\": \"deepseek/deepseek-v4-pro\"\n\nproviders:\n deepseek:\n spec: deepseek\n credentials:\n api_key: ${DEEPSEEK_API_KEY}\n endpoint:\n base_url: https://api.deepseek.com\n zhipu:\n spec: zhipu\n credentials:\n api_key: ${ZHIPU_API_KEY}\n endpoint:\n base_url: https://open.bigmodel.cn/api/coding/paas/v4\n minimax:\n spec: minimax\n credentials:\n api_key: ${MINIMAX_API_KEY}\n endpoint:\n base_url: https://api.minimaxi.com/v1\n xiaomi:\n spec: xiaomi\n credentials:\n api_key: ${MIMO_API_KEY}\n endpoint:\n base_url: https://api.xiaomimimo.com/v1\n\nsession:\n backend: sqlite\n\nlogging:\n level: info\n\ntrace:\n enabled: true\n path: ./data/trace.db\n capture_payload: false\n```\n\nStart the server:\n\n```bash\ngodex serve --config ./godex.yaml\n```\n\nThe dev command starts GodeX on port `13145`; the default runtime config port is `5678`.\n\n## API\n\n### Health\n\n```bash\ncurl http://localhost:5678/health\n```\n\n### Models\n\n```bash\ncurl http://localhost:5678/v1/models\n```\n\n`/v1/models` lists configured aliases, excluding the wildcard alias `*`.\n\n### Responses\n\n```bash\ncurl http://localhost:5678/v1/responses \\\n -H 'content-type: application/json' \\\n -d '{\n \"model\": \"gpt-5.5\",\n \"input\": \"Write a short TypeScript function that adds two numbers.\"\n }'\n```\n\nStreaming uses standard Responses SSE event names:\n\n```bash\ncurl -N http://localhost:5678/v1/responses \\\n -H 'content-type: application/json' \\\n -d '{\n \"model\": \"gpt-5.5\",\n \"stream\": true,\n \"input\": \"Explain Bun streams in two sentences.\"\n }'\n```\n\n## Model Routing\n\nClients may pass either:\n\n- A provider-qualified selector such as `deepseek/deepseek-v4-pro`\n- A configured alias such as `gpt-5.5`\n- A bare model name, which resolves through `default_provider` when no alias matches\n\nAliases must map to `provider/model` values, and the provider must exist in `providers`.\n\n\n## Codex Integration\n\nConnect the Codex desktop app to GodeX by adding a custom provider in `~/.codex/config.toml`:\n\n```toml\nmodel = \"gpt-5.5\"\nmodel_provider = \"godex\"\n\n[model_providers.godex]\nname = \"GodeX\"\nbase_url = \"http://127.0.0.1:5678/v1\"\nwire_api = \"responses\"\nsupports_websockets = false\n```\n\nModel aliases (`gpt-5.5`, `gpt-5.4`, `gpt-5.4-mini`, etc.) are resolved by GodeX using the `models.aliases` map in `godex.yaml` — Codex itself only needs the alias name. See [Codex 集成配置](docs/references/codex/configuration.md) for the full setup guide.\n\n\n## Provider Bridge Behavior\n\nGodeX builds a provider request in three steps:\n\n1. Resolve the client model selector to a configured provider and upstream model.\n2. Plan compatibility from the provider `ProviderSpec`, including request parameters, tool declarations, `tool_choice`, response format, reasoning, and stream usage.\n3. Convert Responses input and session history into Chat Completions messages, call the upstream provider, and reconstruct a Responses object or Responses SSE stream.\n\nProvider-specific differences belong in each provider's `spec.ts`, `hooks.ts`, protocol types, and HTTP client. Shared Responses-to-Chat policy belongs under `src/bridge`.\n\n## Structured Output\n\nWhen a provider supports `json_object` but not native `json_schema`, GodeX can degrade strict `json_schema` requests to `json_object`.\n\nFor strict downgraded schemas:\n\n- The schema instruction is added to the provider prompt preamble for the current request.\n- The provider receives `response_format: { \"type\": \"json_object\" }`.\n- GodeX validates that the final output is valid JSON.\n- Invalid sync output fails the response; invalid stream output is rewritten to a terminal `response.failed` event.\n\nThe validator checks JSON syntax, not full JSON Schema conformance.\n\n## Sessions\n\nResponses can be stored and replayed with `previous_response_id`.\n\n- `session.backend: memory` keeps history in process memory.\n- `session.backend: sqlite` persists history to SQLite.\n- Requests with `store: false` are not saved.\n- The session chain stores request snapshots and response output items, then rebuilds provider-neutral history on the next turn.\n\n## Trace Database\n\nTracing is enabled by default and writes SQLite rows to `./data/trace.db` unless configured otherwise.\n\nTrace records include:\n\n- Provider request metadata and final patched request payload summaries\n- Provider request lifecycle events without duplicating full request bodies\n- Sync provider response bodies as summarized payloads\n- Raw and transformed stream events\n- Usage details, including cached tokens when provided by the upstream\n- Route and provider errors\n\nSet `trace.capture_payload: true` to persist payload JSON up to `trace.payload_max_bytes` for trace rows that carry payloads. Keep it disabled for sensitive environments.\n\n## Development\n\n```bash\nbun install # Install dependencies\nbun run dev # Dev server with hot reload on port 13145\nbun run start # Start server from source\nbun run build # Build a binary for the current platform\nbun run compile:all # Cross-compile all supported platform packages\n```\n\nQuality gates:\n\n```bash\nbun run typecheck # TypeScript\nbun run lint # Biome check\nbun run lint:fix # Biome autofix\nbun run format # Biome format\nbun run test # Unit and integration tests, excluding src/e2e\nbun run test:e2e # Mocked end-to-end tests\nbun run test:zhipu # Live Zhipu tests; requires ZHIPU_API_KEY\nbun run test:deepseek # Live DeepSeek tests; requires DEEPSEEK_API_KEY\nbun run test:minimax # Live MiniMax tests; requires MINIMAX_API_KEY\nbun run test:xiaomi # Live Xiaomi tests; requires MIMO_API_KEY\nbun run check # typecheck + lint + test\nbun run ci # typecheck + biome ci + test + e2e\n```\n\n## Source Map\n\n```text\nsrc/\n cli/ Commander CLI, init wizard, runtime config loading\n config/ godex.yaml schema, defaults, env interpolation\n context/ ApplicationContext and per-request ResponsesContext\n bridge/ Provider-agnostic Responses-to-Chat planning and reconstruction\n providers/ Built-in provider specs, hooks, clients, and registry\n responses/ Sync and stream request pipelines\n server/ Bun routes for /health, /v1/models, /v1/responses\n session/ Memory and SQLite response session stores\n trace/ SQLite trace recorder and usage/error/event mappers\n protocol/ OpenAI protocol type definitions\n error/ GodeXError hierarchy and domain codes\n```\n\n## Provider Development\n\nProvider folders follow this shape:\n\n```text\nsrc/providers/<name>/\n spec.ts ProviderSpec declaration\n client.ts ProviderEdge construction with ChatProviderClient\n hooks.ts Provider-specific patching, accessors, usage, stream deltas\n protocol/ Provider DTOs when needed\n index.ts Public exports\n```\n\nAdd shared compatibility policy to `src/bridge`; add shared provider transport or protocol helpers to `src/providers/shared`.\n\n## License\n\nApache-2.0. See [LICENSE](./LICENSE).\n"}, "693b08e5dc5a378238043924e122b99c64e486b8": {"t": 1785748573.7888095, "n": 15140, "h": "c90bc68e3d3a18a6", "c": "<div align=\"center\">\n\n<img src=\"design/assets/01-logo-system/png/godex-logo-horizontal-transparent-800x233.png\" alt=\"GodeX\" width=\"480\" />\n\n**Make every model a Codex engine.**\n\nOpenAI-compatible Responses API gateway for Codex, CLI tools and developer agents.\n\n[](https://www.npmjs.com/package/@ahoo-wang/godex)\n[](https://codecov.io/gh/Ahoo-Wang/GodeX)\n[](https://bun.sh)\n[](https://www.typescriptlang.org/)\n\n</div>\n\nGodeX lets clients that speak the OpenAI Responses API use providers such as DeepSeek, Xiaomi, MiniMax, and Zhipu through one local server.\n\n## Highlights\n\n- OpenAI-compatible `POST /v1/responses` endpoint with sync and streaming responses.\n- `GET /v1/models` aliases so clients can use stable model names while GodeX routes to provider/model targets.\n- Built-in bridge providers for DeepSeek, Xiaomi, MiniMax, and Zhipu.\n- Provider capability planning for request parameters, tools, `tool_choice`, structured output formats, reasoning, and stream usage.\n- Responses `previous_response_id` session chains backed by memory or SQLite.\n- Trace recording for provider requests, provider responses, stream events, usage, and errors.\n- Native Bun runtime, TypeScript source, and compiled platform binaries for releases.\n\n## Built-in Providers\n\n| Provider | Reasoning | Tool Choice | Response Format | Cached Tokens | Default Model |\n|----------|-----------|-------------|-----------------|---------------|---------------|\n| DeepSeek | native | auto, none, required, function | text, json_object | ✅ | `deepseek-v4-pro` |\n| Xiaomi | boolean | auto | text, json_object | ✅ | `mimo-v2.5-pro` |\n| MiniMax | none | auto, none, required, function | text, json_object | ✅ | `MiniMax-M2.7` |\n| Zhipu | boolean | auto, none | text, json_object | ✅ | `glm-5.1` |\n\n## Architecture\n\n```mermaid\nflowchart TB\n Client[\"Client<br>Codex, SDK, CLI, IDE\"] --> Routes[\"Bun server routes<br>/health<br>/v1/models<br>/v1/responses\"]\n Routes --> Ctx[\"ResponsesContext<br>request id, response id, resolved model,<br>provider, session, diagnostics\"]\n\n Ctx --> Resolver[\"ModelResolver<br>alias and provider/model selection\"]\n Ctx --> Session[\"ResponseSessionStore<br>memory or SQLite<br>previous_response_id chains\"]\n Ctx --> Registrar[\"Registrar<br>built-in ProviderEdge factories\"]\n Ctx --> Runtime[\"ResponsesBridgeRuntime\"]\n\n Runtime --> Sync[\"SyncRequestPipeline\"]\n Runtime --> Stream[\"StreamPipeline\"]\n Sync --> Exchange[\"ProviderExchange\"]\n Stream --> Exchange\n\n Exchange --> Builder[\"bridge/request<br>buildChatCompletionRequest\"]\n Builder --> Compat[\"bridge/compatibility<br>parameter and response-format decisions\"]\n Builder --> Tools[\"bridge/tools<br>tool declarations, tool_choice,<br>identity restoration\"]\n Builder --> Output[\"bridge/output<br>structured-output contract\"]\n\n Exchange --> Edge[\"ProviderEdge<br>ProviderSpec + hooks\"]\n Edge --> ClientHttp[\"ChatProviderClient<br>Fetcher HTTP boundary\"]\n ClientHttp --> Upstream[\"Chat Completions upstream<br>DeepSeek, Xiaomi, MiniMax, Zhipu, custom\"]\n\n Upstream --> SyncRecon[\"bridge/response<br>reconstructResponseObject\"]\n Upstream --> StreamRecon[\"bridge/stream<br>ResponseStreamStateMachine\"]\n SyncRecon --> ResponseJson[\"ResponseObject JSON\"]\n StreamRecon --> StreamTransforms[\"stream transforms<br>validate, trace, log, persist, diagnostics\"]\n StreamTransforms --> Sse[\"Responses SSE\"]\n\n Ctx --> Trace[\"trace recorder<br>request, usage, event, error rows\"]\n Ctx --> Logger[\"structured logger\"]\n```\n\n## Component Interaction\n\n```mermaid\nsequenceDiagram\n autonumber\n actor Client\n participant Server as /v1/responses route\n participant Context as ResponsesContext factory\n participant Resolver as ModelResolver\n participant Store as ResponseSessionStore\n participant Registrar\n participant Runtime as ResponsesBridgeRuntime\n participant Exchange as ProviderExchange\n participant Bridge as bridge/request\n participant Provider as ProviderEdge\n participant Upstream as Chat Completions API\n\n Client->>Server: POST /v1/responses\n Server->>Server: parse and validate JSON envelope\n Server->>Context: create(app, body)\n Context->>Resolver: resolve(body.model)\n Resolver-->>Context: provider + upstream model\n opt previous_response_id\n Context->>Store: resolveChain(previous_response_id)\n Store-->>Context: ordered session snapshot\n end\n Context->>Registrar: resolve(provider)\n Registrar-->>Context: ProviderEdge\n Server->>Runtime: request(ctx) or stream(ctx)\n Runtime->>Exchange: build and send provider request\n Exchange->>Bridge: buildChatCompletionRequest(ctx)\n Bridge-->>Exchange: chat request + compatibility/tool/output plans\n Exchange->>Provider: request(body) or stream(body)\n Provider->>Upstream: POST /chat/completions\n Upstream-->>Provider: JSON response or SSE chunks\n alt sync\n Provider-->>Exchange: provider response\n Exchange-->>Runtime: provider response + plans\n Runtime->>Store: save completed response unless store=false\n Runtime-->>Server: ResponseObject\n Server-->>Client: JSON\n else stream\n Provider-->>Exchange: provider SSE stream\n Exchange-->>Runtime: stream + plans\n Runtime->>Runtime: bridge deltas, validate output, trace, log, persist\n Runtime-->>Server: ResponseStreamEvent stream\n Server-->>Client: text/event-stream\n end\n```\n\n## Install\n\nFor local development:\n\n```bash\ngit clone https://github.com/Ahoo-Wang/GodeX.git\ncd GodeX\nbun install\n```\n\nFor package use, install the published package and run the `godex` binary:\n\n```bash\nnpm install -g @ahoo-wang/godex\ngodex --help\n```\n\n### Docker\n\nPre-built images are published to Docker Hub and GitHub Container Registry:\n\n```bash\ndocker pull ahoowang/godex:latest\n# or\ndocker pull ghcr.io/ahoo-wang/godex:latest\n```\n\nRun with a config file:\n\n```bash\ndocker run -d \\\n --name godex \\\n -p 5678:5678 \\\n -e ZHIPU_API_KEY=your-key \\\n -e DEEPSEEK_API_KEY=your-key \\\n -e MINIMAX_API_KEY=your-key \\\n -e MIMO_API_KEY=your-key \\\n -v ./godex.yaml:/etc/godex/godex.yaml:ro \\\n -v godex-data:/data \\\n ahoowang/godex:latest\n```\n\nThe image supports `linux/amd64` and `linux/arm64`.\n\n- Config file: `/etc/godex/godex.yaml`\n- Data directory (sessions, trace): `/data`\n- Default port: `5678`\n\n## Quick Start\n\nCreate a config and start the server:\n\n```bash\ngodex init\ngodex serve --config ./godex.yaml\n```\n\nThe interactive wizard walks you through selecting providers, entering base URLs and API keys, and writes the config file automatically.\n\nAlternatively, create `godex.yaml` manually:\n\n```yaml\nserver:\n port: 5678\n host: 0.0.0.0\n\ndefault_provider: deepseek\n\nmodels:\n aliases:\n # -------------------------------------------------------------------------\n # Codex-compatible model aliases\n #\n # 这些 alias 是 GodeX routing policy,不代表与 OpenAI 原模型能力等价。\n # 依据优先级:公开 benchmark > 官方模型定位 > Provider 产品说明。\n # -------------------------------------------------------------------------\n\n # Codex 默认主力:复杂编码 / computer use / research workflows\n # 依据:DeepSeek V4-Pro 在 SWE / Terminal / Codeforces / GDPval-AA 上公开成绩强。\n gpt-5.5: \"deepseek/deepseek-v4-pro\"\n\n # Codex 旗舰:coding + reasoning + tool use + agentic workflows\n # 依据:DeepSeek V4-Pro 有更完整的公开 coding/agentic benchmark 覆盖。\n gpt-5.4: \"deepseek/deepseek-v4-pro\"\n\n # Codex mini:subagents\n gpt-5.4-mini: \"zhipu/glm-5.1\"\n\n # Codex 编码专用:复杂软件工程\n # 依据:DeepSeek V4-Pro 的 SWE Verified / SWE Pro / Terminal Bench 表现。\n gpt-5.3-codex: \"deepseek/deepseek-v4-pro\"\n\n # Codex spark:近实时编码迭代\n gpt-5.3-codex-spark: \"zhipu/glm-5.1\"\n\n # 上一代通用 coding / agentic fallback\n # 严谨起见仍走 DeepSeek;不强行映射到 Zhipu。\n gpt-5.2: \"deepseek/deepseek-v4-pro\"\n\n # -------------------------------------------------------------------------\n # Provider native models\n # -------------------------------------------------------------------------\n\n deepseek-v4-pro: \"deepseek/deepseek-v4-pro\"\n deepseek-v4-flash: \"deepseek/deepseek-v4-flash\"\n\n mimo-v2.5-pro: \"xiaomi/mimo-v2.5-pro\"\n mimo-v2.5: \"xiaomi/mimo-v2.5\"\n\n glm-5.1: \"zhipu/glm-5.1\"\n glm-5-turbo: \"zhipu/glm-5-turbo\"\n glm-4.7: \"zhipu/glm-4.7\"\n glm-4.5-air: \"zhipu/glm-4.5-air\"\n\n MiniMax-M2.7: \"minimax/MiniMax-M2.7\"\n MiniMax-M2.7-highspeed: \"minimax/MiniMax-M2.7-highspeed\"\n\n # Fallback for unknown bare model names\n \"*\": \"deepseek/deepseek-v4-pro\"\n\nproviders:\n deepseek:\n spec: deepseek\n credentials:\n api_key: ${DEEPSEEK_API_KEY}\n endpoint:\n base_url: https://api.deepseek.com\n zhipu:\n spec: zhipu\n credentials:\n api_key: ${ZHIPU_API_KEY}\n endpoint:\n base_url: https://open.bigmodel.cn/api/coding/paas/v4\n minimax:\n spec: minimax\n credentials:\n api_key: ${MINIMAX_API_KEY}\n endpoint:\n base_url: https://api.minimaxi.com/v1\n xiaomi:\n spec: xiaomi\n credentials:\n api_key: ${MIMO_API_KEY}\n endpoint:\n base_url: https://api.xiaomimimo.com/v1\n\nsession:\n backend: sqlite\n\nlogging:\n level: info\n\ntrace:\n enabled: true\n path: ./data/trace.db\n capture_payload: false\n```\n\nStart the server:\n\n```bash\ngodex serve --config ./godex.yaml\n```\n\nThe dev command starts GodeX on port `13145`; the default runtime config port is `5678`.\n\n## API\n\n### Health\n\n```bash\ncurl http://localhost:5678/health\n```\n\n### Models\n\n```bash\ncurl http://localhost:5678/v1/models\n```\n\n`/v1/models` lists configured aliases, excluding the wildcard alias `*`.\n\n### Responses\n\n```bash\ncurl http://localhost:5678/v1/responses \\\n -H 'content-type: application/json' \\\n -d '{\n \"model\": \"gpt-5.5\",\n \"input\": \"Write a short TypeScript function that adds two numbers.\"\n }'\n```\n\nStreaming uses standard Responses SSE event names:\n\n```bash\ncurl -N http://localhost:5678/v1/responses \\\n -H 'content-type: application/json' \\\n -d '{\n \"model\": \"gpt-5.5\",\n \"stream\": true,\n \"input\": \"Explain Bun streams in two sentences.\"\n }'\n```\n\n## Model Routing\n\nClients may pass either:\n\n- A provider-qualified selector such as `deepseek/deepseek-v4-pro`\n- A configured alias such as `gpt-5.5`\n- A bare model name, which resolves through `default_provider` when no alias matches\n\nAliases must map to `provider/model` values, and the provider must exist in `providers`.\n\n## Provider Bridge Behavior\n\nGodeX builds a provider request in three steps:\n\n1. Resolve the client model selector to a configured provider and upstream model.\n2. Plan compatibility from the provider `ProviderSpec`, including request parameters, tool declarations, `tool_choice`, response format, reasoning, and stream usage.\n3. Convert Responses input and session history into Chat Completions messages, call the upstream provider, and reconstruct a Responses object or Responses SSE stream.\n\nProvider-specific differences belong in each provider's `spec.ts`, `hooks.ts`, protocol types, and HTTP client. Shared Responses-to-Chat policy belongs under `src/bridge`.\n\n## Structured Output\n\nWhen a provider supports `json_object` but not native `json_schema`, GodeX can degrade strict `json_schema` requests to `json_object`.\n\nFor strict downgraded schemas:\n\n- The schema instruction is added to the provider prompt preamble for the current request.\n- The provider receives `response_format: { \"type\": \"json_object\" }`.\n- GodeX validates that the final output is valid JSON.\n- Invalid sync output fails the response; invalid stream output is rewritten to a terminal `response.failed` event.\n\nThe validator checks JSON syntax, not full JSON Schema conformance.\n\n## Sessions\n\nResponses can be stored and replayed with `previous_response_id`.\n\n- `session.backend: memory` keeps history in process memory.\n- `session.backend: sqlite` persists history to SQLite.\n- Requests with `store: false` are not saved.\n- The session chain stores request snapshots and response output items, then rebuilds provider-neutral history on the next turn.\n\n## Trace Database\n\nTracing is enabled by default and writes SQLite rows to `./data/trace.db` unless configured otherwise.\n\nTrace records include:\n\n- Provider request metadata and final patched request payload summaries\n- Provider request lifecycle events without duplicating full request bodies\n- Sync provider response bodies as summarized payloads\n- Raw and transformed stream events\n- Usage details, including cached tokens when provided by the upstream\n- Route and provider errors\n\nSet `trace.capture_payload: true` to persist payload JSON up to `trace.payload_max_bytes` for trace rows that carry payloads. Keep it disabled for sensitive environments.\n\n## Development\n\n```bash\nbun install # Install dependencies\nbun run dev # Dev server with hot reload on port 13145\nbun run start # Start server from source\nbun run build # Build a binary for the current platform\nbun run compile:all # Cross-compile all supported platform packages\n```\n\nQuality gates:\n\n```bash\nbun run typecheck # TypeScript\nbun run lint # Biome check\nbun run lint:fix # Biome autofix\nbun run format # Biome format\nbun run test # Unit and integration tests, excluding src/e2e\nbun run test:e2e # Mocked end-to-end tests\nbun run test:zhipu # Live Zhipu tests; requires ZHIPU_API_KEY\nbun run test:deepseek # Live DeepSeek tests; requires DEEPSEEK_API_KEY\nbun run test:minimax # Live MiniMax tests; requires MINIMAX_API_KEY\nbun run test:xiaomi # Live Xiaomi tests; requires MIMO_API_KEY\nbun run check # typecheck + lint + test\nbun run ci # typecheck + biome ci + test + e2e\n```\n\n## Source Map\n\n```text\nsrc/\n cli/ Commander CLI, init wizard, runtime config loading\n config/ godex.yaml schema, defaults, env interpolation\n context/ ApplicationContext and per-request ResponsesContext\n bridge/ Provider-agnostic Responses-to-Chat planning and reconstruction\n providers/ Built-in provider specs, hooks, clients, and registry\n responses/ Sync and stream request pipelines\n server/ Bun routes for /health, /v1/models, /v1/responses\n session/ Memory and SQLite response session stores\n trace/ SQLite trace recorder and usage/error/event mappers\n protocol/ OpenAI protocol type definitions\n error/ GodeXError hierarchy and domain codes\n```\n\n## Provider Development\n\nProvider folders follow this shape:\n\n```text\nsrc/providers/<name>/\n spec.ts ProviderSpec declaration\n client.ts ProviderEdge construction with ChatProviderClient\n hooks.ts Provider-specific patching, accessors, usage, stream deltas\n protocol/ Provider DTOs when needed\n index.ts Public exports\n```\n\nAdd shared compatibility policy to `src/bridge`; add shared provider transport or protocol helpers to `src/providers/shared`.\n\n## License\n\nApache-2.0. See [LICENSE](./LICENSE).\n"}, "9b1dbc05bde791a28764f040524ad7b9fb40b1f1": {"t": 1785748574.903143, "n": 15282, "h": "f322d03397bcec1f", "c": "<div align=\"center\">\n\n<img src=\"design/assets/01-logo-system/png/godex-logo-horizontal-transparent-800x233.png\" alt=\"GodeX\" width=\"480\" />\n\n**Make every model a Codex engine.**\n\nOpenAI-compatible Responses API gateway for Codex, CLI tools and developer agents.\n\n[](https://www.npmjs.com/package/@ahoo-wang/godex)\n[](https://codecov.io/gh/Ahoo-Wang/GodeX)\n[](https://bun.sh)\n[](https://www.typescriptlang.org/)\n\n</div>\n\nGodeX lets clients that speak the OpenAI Responses API use providers such as DeepSeek, Xiaomi, MiniMax, and Zhipu through one local server.\n\n## Highlights\n\n- OpenAI-compatible `POST /v1/responses` endpoint with sync and streaming responses.\n- `GET /v1/models` aliases so clients can use stable model names while GodeX routes to provider/model targets.\n- Built-in bridge providers for DeepSeek, Xiaomi, MiniMax, and Zhipu.\n- Provider capability planning for request parameters, tools, `tool_choice`, structured output formats, reasoning, and stream usage.\n- Responses `previous_response_id` session chains backed by memory or SQLite.\n- Trace recording for provider requests, provider responses, stream events, usage, and errors.\n- Native Bun runtime, TypeScript source, and compiled platform binaries for releases.\n\n## Built-in Providers\n\n| Provider | Reasoning | Tool Choice | Response Format | Cached Tokens | Default Model |\n|----------|-----------|-------------|-----------------|---------------|---------------|\n| DeepSeek | native | auto, none, required, function | text, json_object | ✅ | `deepseek-v4-pro` |\n| Xiaomi | boolean | auto | text, json_object | ✅ | `mimo-v2.5-pro` |\n| MiniMax | none | auto, none, required, function | text, json_object | ✅ | `MiniMax-M2.7` |\n| Zhipu | boolean | auto, none | text, json_object | ✅ | `glm-5.1` |\n\n## Architecture\n\n```mermaid\nflowchart TB\n Client[\"Client<br>Codex, SDK, CLI, IDE\"] --> Routes[\"Bun server routes<br>/health<br>/v1/models<br>/v1/responses\"]\n Routes --> Ctx[\"ResponsesContext<br>request id, response id, resolved model,<br>provider, session, diagnostics\"]\n\n Ctx --> Resolver[\"ModelResolver<br>alias and provider/model selection\"]\n Ctx --> Session[\"ResponseSessionStore<br>memory or SQLite<br>previous_response_id chains\"]\n Ctx --> Registrar[\"Registrar<br>built-in ProviderEdge factories\"]\n Ctx --> Runtime[\"ResponsesBridgeRuntime\"]\n\n Runtime --> Sync[\"SyncRequestPipeline\"]\n Runtime --> Stream[\"StreamPipeline\"]\n Sync --> Exchange[\"ProviderExchange\"]\n Stream --> Exchange\n\n Exchange --> Builder[\"bridge/request<br>buildChatCompletionRequest\"]\n Builder --> Compat[\"bridge/compatibility<br>parameter and response-format decisions\"]\n Builder --> Tools[\"bridge/tools<br>tool declarations, tool_choice,<br>identity restoration\"]\n Builder --> Output[\"bridge/output<br>structured-output contract\"]\n\n Exchange --> Edge[\"ProviderEdge<br>ProviderSpec + hooks\"]\n Edge --> ClientHttp[\"ChatProviderClient<br>Fetcher HTTP boundary\"]\n ClientHttp --> Upstream[\"Chat Completions upstream<br>DeepSeek, Xiaomi, MiniMax, Zhipu, custom\"]\n\n Upstream --> SyncRecon[\"bridge/response<br>reconstructResponseObject\"]\n Upstream --> StreamRecon[\"bridge/stream<br>ResponseStreamStateMachine\"]\n SyncRecon --> ResponseJson[\"ResponseObject JSON\"]\n StreamRecon --> StreamTransforms[\"stream transforms<br>validate, trace, log, persist, diagnostics\"]\n StreamTransforms --> Sse[\"Responses SSE\"]\n\n Ctx --> Trace[\"trace recorder<br>request, usage, event, error rows\"]\n Ctx --> Logger[\"structured logger\"]\n```\n\n## Component Interaction\n\n```mermaid\nsequenceDiagram\n autonumber\n actor Client\n participant Server as /v1/responses route\n participant Context as ResponsesContext factory\n participant Resolver as ModelResolver\n participant Store as ResponseSessionStore\n participant Registrar\n participant Runtime as ResponsesBridgeRuntime\n participant Exchange as ProviderExchange\n participant Bridge as bridge/request\n participant Provider as ProviderEdge\n participant Upstream as Chat Completions API\n\n Client->>Server: POST /v1/responses\n Server->>Server: parse and validate JSON envelope\n Server->>Context: create(app, body)\n Context->>Resolver: resolve(body.model)\n Resolver-->>Context: provider + upstream model\n opt previous_response_id\n Context->>Store: resolveChain(previous_response_id)\n Store-->>Context: ordered session snapshot\n end\n Context->>Registrar: resolve(provider)\n Registrar-->>Context: ProviderEdge\n Server->>Runtime: request(ctx) or stream(ctx)\n Runtime->>Exchange: build and send provider request\n Exchange->>Bridge: buildChatCompletionRequest(ctx)\n Bridge-->>Exchange: chat request + compatibility/tool/output plans\n Exchange->>Provider: request(body) or stream(body)\n Provider->>Upstream: POST /chat/completions\n Upstream-->>Provider: JSON response or SSE chunks\n alt sync\n Provider-->>Exchange: provider response\n Exchange-->>Runtime: provider response + plans\n Runtime->>Store: save completed response unless store=false\n Runtime-->>Server: ResponseObject\n Server-->>Client: JSON\n else stream\n Provider-->>Exchange: provider SSE stream\n Exchange-->>Runtime: stream + plans\n Runtime->>Runtime: bridge deltas, validate output, trace, log, persist\n Runtime-->>Server: ResponseStreamEvent stream\n Server-->>Client: text/event-stream\n end\n```\n\n## Install\n\nFor local development:\n\n```bash\ngit clone https://github.com/Ahoo-Wang/GodeX.git\ncd GodeX\nbun install\n```\n\nFor package use, install the published package and run the `godex` binary:\n\n```bash\nnpm install -g @ahoo-wang/godex\ngodex --help\n```\n\n### Docker\n\nPre-built images are published to Docker Hub and GitHub Container Registry:\n\n```bash\ndocker pull ahoowang/godex:latest\n# or\ndocker pull ghcr.io/ahoo-wang/godex:latest\n```\n\nRun with a config file:\n\n```bash\ndocker run -d \\\n --name godex \\\n -p 5678:5678 \\\n -e ZHIPU_API_KEY=your-key \\\n -e DEEPSEEK_API_KEY=your-key \\\n -e MINIMAX_API_KEY=your-key \\\n -e MIMO_API_KEY=your-key \\\n -v ./godex.yaml:/etc/godex/godex.yaml:ro \\\n -v godex-data:/data \\\n ahoowang/godex:latest\n```\n\nThe image supports `linux/amd64` and `linux/arm64`.\n\n- Config file: `/etc/godex/godex.yaml`\n- Data directory (sessions, trace): `/data`\n- Default port: `5678`\n\n## Quick Start\n\nCreate a config and start the server:\n\n```bash\ngodex init\ngodex serve --config ./godex.yaml\n```\n\nThe interactive wizard walks you through selecting providers, entering base URLs and API keys, and writes the config file automatically.\n\nAlternatively, create `godex.yaml` manually:\n\n```yaml\nserver:\n port: 5678\n host: 0.0.0.0\n\ndefault_provider: deepseek\n\nmodels:\n aliases:\n # -------------------------------------------------------------------------\n # Codex-compatible model aliases\n #\n # 这些 alias 是 GodeX routing policy,不代表与 OpenAI 原模型能力等价。\n # 依据优先级:公开 benchmark > 官方模型定位 > Provider 产品说明。\n # -------------------------------------------------------------------------\n\n # Codex 默认主力:复杂编码 / computer use / research workflows\n # 依据:DeepSeek V4-Pro 在 SWE / Terminal / Codeforces / GDPval-AA 上公开成绩强。\n gpt-5.5: \"deepseek/deepseek-v4-pro\"\n\n # Codex 旗舰:coding + reasoning + tool use + agentic workflows\n # 依据:DeepSeek V4-Pro 有更完整的公开 coding/agentic benchmark 覆盖。\n gpt-5.4: \"deepseek/deepseek-v4-pro\"\n\n # Codex mini:快速、低成本、轻量编码、subagents\n # 依据:MiniMax M2.7-highspeed 与 M2.7 结果一致但速度更快。\n gpt-5.4-mini: \"minimax/MiniMax-M2.7-highspeed\"\n\n # Codex 编码专用:复杂软件工程\n # 依据:DeepSeek V4-Pro 的 SWE Verified / SWE Pro / Terminal Bench 表现。\n gpt-5.3-codex: \"deepseek/deepseek-v4-pro\"\n\n # Codex spark:近实时编码迭代\n # 依据:MiniMax highspeed 版本更贴合 spark 的速度定位。\n gpt-5.3-codex-spark: \"minimax/MiniMax-M2.7-highspeed\"\n\n # 上一代通用 coding / agentic fallback\n # 严谨起见仍走 DeepSeek;不强行映射到 Zhipu。\n gpt-5.2: \"deepseek/deepseek-v4-pro\"\n\n # -------------------------------------------------------------------------\n # Provider native models\n # -------------------------------------------------------------------------\n\n deepseek-v4-pro: \"deepseek/deepseek-v4-pro\"\n deepseek-v4-flash: \"deepseek/deepseek-v4-flash\"\n\n mimo-v2.5-pro: \"xiaomi/mimo-v2.5-pro\"\n mimo-v2.5: \"xiaomi/mimo-v2.5\"\n\n glm-5.1: \"zhipu/glm-5.1\"\n glm-5-turbo: \"zhipu/glm-5-turbo\"\n glm-4.7: \"zhipu/glm-4.7\"\n glm-4.5-air: \"zhipu/glm-4.5-air\"\n\n MiniMax-M2.7: \"minimax/MiniMax-M2.7\"\n MiniMax-M2.7-highspeed: \"minimax/MiniMax-M2.7-highspeed\"\n\n # Fallback for unknown bare model names\n \"*\": \"deepseek/deepseek-v4-pro\"\n\nproviders:\n deepseek:\n spec: deepseek\n credentials:\n api_key: ${DEEPSEEK_API_KEY}\n endpoint:\n base_url: https://api.deepseek.com\n zhipu:\n spec: zhipu\n credentials:\n api_key: ${ZHIPU_API_KEY}\n endpoint:\n base_url: https://open.bigmodel.cn/api/coding/paas/v4\n minimax:\n spec: minimax\n credentials:\n api_key: ${MINIMAX_API_KEY}\n endpoint:\n base_url: https://api.minimaxi.com/v1\n xiaomi:\n spec: xiaomi\n credentials:\n api_key: ${MIMO_API_KEY}\n endpoint:\n base_url: https://api.xiaomimimo.com/v1\n\nsession:\n backend: sqlite\n\nlogging:\n level: info\n\ntrace:\n enabled: true\n path: ./data/trace.db\n capture_payload: false\n```\n\nStart the server:\n\n```bash\ngodex serve --config ./godex.yaml\n```\n\nThe dev command starts GodeX on port `13145`; the default runtime config port is `5678`.\n\n## API\n\n### Health\n\n```bash\ncurl http://localhost:5678/health\n```\n\n### Models\n\n```bash\ncurl http://localhost:5678/v1/models\n```\n\n`/v1/models` lists configured aliases, excluding the wildcard alias `*`.\n\n### Responses\n\n```bash\ncurl http://localhost:5678/v1/responses \\\n -H 'content-type: application/json' \\\n -d '{\n \"model\": \"gpt-5.5\",\n \"input\": \"Write a short TypeScript function that adds two numbers.\"\n }'\n```\n\nStreaming uses standard Responses SSE event names:\n\n```bash\ncurl -N http://localhost:5678/v1/responses \\\n -H 'content-type: application/json' \\\n -d '{\n \"model\": \"gpt-5.5\",\n \"stream\": true,\n \"input\": \"Explain Bun streams in two sentences.\"\n }'\n```\n\n## Model Routing\n\nClients may pass either:\n\n- A provider-qualified selector such as `deepseek/deepseek-v4-pro`\n- A configured alias such as `gpt-5.5`\n- A bare model name, which resolves through `default_provider` when no alias matches\n\nAliases must map to `provider/model` values, and the provider must exist in `providers`.\n\n## Provider Bridge Behavior\n\nGodeX builds a provider request in three steps:\n\n1. Resolve the client model selector to a configured provider and upstream model.\n2. Plan compatibility from the provider `ProviderSpec`, including request parameters, tool declarations, `tool_choice`, response format, reasoning, and stream usage.\n3. Convert Responses input and session history into Chat Completions messages, call the upstream provider, and reconstruct a Responses object or Responses SSE stream.\n\nProvider-specific differences belong in each provider's `spec.ts`, `hooks.ts`, protocol types, and HTTP client. Shared Responses-to-Chat policy belongs under `src/bridge`.\n\n## Structured Output\n\nWhen a provider supports `json_object` but not native `json_schema`, GodeX can degrade strict `json_schema` requests to `json_object`.\n\nFor strict downgraded schemas:\n\n- The schema instruction is added to the provider prompt preamble for the current request.\n- The provider receives `response_format: { \"type\": \"json_object\" }`.\n- GodeX validates that the final output is valid JSON.\n- Invalid sync output fails the response; invalid stream output is rewritten to a terminal `response.failed` event.\n\nThe validator checks JSON syntax, not full JSON Schema conformance.\n\n## Sessions\n\nResponses can be stored and replayed with `previous_response_id`.\n\n- `session.backend: memory` keeps history in process memory.\n- `session.backend: sqlite` persists history to SQLite.\n- Requests with `store: false` are not saved.\n- The session chain stores request snapshots and response output items, then rebuilds provider-neutral history on the next turn.\n\n## Trace Database\n\nTracing is enabled by default and writes SQLite rows to `./data/trace.db` unless configured otherwise.\n\nTrace records include:\n\n- Provider request metadata and final patched request payload summaries\n- Provider request lifecycle events without duplicating full request bodies\n- Sync provider response bodies as summarized payloads\n- Raw and transformed stream events\n- Usage details, including cached tokens when provided by the upstream\n- Route and provider errors\n\nSet `trace.capture_payload: true` to persist payload JSON up to `trace.payload_max_bytes` for trace rows that carry payloads. Keep it disabled for sensitive environments.\n\n## Development\n\n```bash\nbun install # Install dependencies\nbun run dev # Dev server with hot reload on port 13145\nbun run start # Start server from source\nbun run build # Build a binary for the current platform\nbun run compile:all # Cross-compile all supported platform packages\n```\n\nQuality gates:\n\n```bash\nbun run typecheck # TypeScript\nbun run lint # Biome check\nbun run lint:fix # Biome autofix\nbun run format # Biome format\nbun run test # Unit and integration tests, excluding src/e2e\nbun run test:e2e # Mocked end-to-end tests\nbun run test:zhipu # Live Zhipu tests; requires ZHIPU_API_KEY\nbun run test:deepseek # Live DeepSeek tests; requires DEEPSEEK_API_KEY\nbun run test:minimax # Live MiniMax tests; requires MINIMAX_API_KEY\nbun run test:xiaomi # Live Xiaomi tests; requires MIMO_API_KEY\nbun run check # typecheck + lint + test\nbun run ci # typecheck + biome ci + test + e2e\n```\n\n## Source Map\n\n```text\nsrc/\n cli/ Commander CLI, init wizard, runtime config loading\n config/ godex.yaml schema, defaults, env interpolation\n context/ ApplicationContext and per-request ResponsesContext\n bridge/ Provider-agnostic Responses-to-Chat planning and reconstruction\n providers/ Built-in provider specs, hooks, clients, and registry\n responses/ Sync and stream request pipelines\n server/ Bun routes for /health, /v1/models, /v1/responses\n session/ Memory and SQLite response session stores\n trace/ SQLite trace recorder and usage/error/event mappers\n protocol/ OpenAI protocol type definitions\n error/ GodeXError hierarchy and domain codes\n```\n\n## Provider Development\n\nProvider folders follow this shape:\n\n```text\nsrc/providers/<name>/\n spec.ts ProviderSpec declaration\n client.ts ProviderEdge construction with ChatProviderClient\n hooks.ts Provider-specific patching, accessors, usage, stream deltas\n protocol/ Provider DTOs when needed\n index.ts Public exports\n```\n\nAdd shared compatibility policy to `src/bridge`; add shared provider transport or protocol helpers to `src/providers/shared`.\n\n## License\n\nApache-2.0. See [LICENSE](./LICENSE).\n"}, "987f4ae12bd1372136723ad78a3ac73587783fbc": {"t": 1785748576.0401459, "n": 15134, "h": "e62612fe6397904d", "c": "<div align=\"center\">\n\n<img src=\"design/assets/01-logo-system/png/godex-logo-horizontal-transparent-800x233.png\" alt=\"GodeX\" width=\"480\" />\n\n**Make every model a Codex engine.**\n\nOpenAI-compatible Responses API gateway for Codex, CLI tools and developer agents.\n\n[](https://www.npmjs.com/package/@ahoo-wang/godex)\n[](https://codecov.io/gh/Ahoo-Wang/GodeX)\n[](https://bun.sh)\n[](https://www.typescriptlang.org/)\n\n</div>\n\nGodeX lets clients that speak the OpenAI Responses API use providers such as DeepSeek, Xiaomi, MiniMax, and Zhipu through one local server.\n\n## Highlights\n\n- OpenAI-compatible `POST /v1/responses` endpoint with sync and streaming responses.\n- `GET /v1/models` aliases so clients can use stable model names while GodeX routes to provider/model targets.\n- Built-in bridge providers for DeepSeek, Xiaomi, MiniMax, and Zhipu.\n- Provider capability planning for request parameters, tools, `tool_choice`, structured output formats, reasoning, and stream usage.\n- Responses `previous_response_id` session chains backed by memory or SQLite.\n- Trace recording for provider requests, provider responses, stream events, usage, and errors.\n- Native Bun runtime, TypeScript source, and compiled platform binaries for releases.\n\n## Built-in Providers\n\n| Provider | Reasoning | Tool Choice | Response Format | Cached Tokens | Default Model |\n|----------|-----------|-------------|-----------------|---------------|---------------|\n| DeepSeek | native | auto, none, required, function | text, json_object | ✅ | `deepseek-v4-pro` |\n| Xiaomi | boolean | auto | text, json_object | ✅ | `mimo-v2.5-pro` |\n| MiniMax | none | auto, none, required, function | text, json_object | ✅ | `MiniMax-M2.7` |\n| Zhipu | boolean | auto, none | text, json_object | ✅ | `glm-5.1` |\n\n## Architecture\n\n```mermaid\nflowchart TB\n Client[\"Client<br>Codex, SDK, CLI, IDE\"] --> Routes[\"Bun server routes<br>/health<br>/v1/models<br>/v1/responses\"]\n Routes --> Ctx[\"ResponsesContext<br>request id, response id, resolved model,<br>provider, session, diagnostics\"]\n\n Ctx --> Resolver[\"ModelResolver<br>alias and provider/model selection\"]\n Ctx --> Session[\"ResponseSessionStore<br>memory or SQLite<br>previous_response_id chains\"]\n Ctx --> Registrar[\"Registrar<br>built-in ProviderEdge factories\"]\n Ctx --> Runtime[\"ResponsesBridgeRuntime\"]\n\n Runtime --> Sync[\"SyncRequestPipeline\"]\n Runtime --> Stream[\"StreamPipeline\"]\n Sync --> Exchange[\"ProviderExchange\"]\n Stream --> Exchange\n\n Exchange --> Builder[\"bridge/request<br>buildChatCompletionRequest\"]\n Builder --> Compat[\"bridge/compatibility<br>parameter and response-format decisions\"]\n Builder --> Tools[\"bridge/tools<br>tool declarations, tool_choice,<br>identity restoration\"]\n Builder --> Output[\"bridge/output<br>structured-output contract\"]\n\n Exchange --> Edge[\"ProviderEdge<br>ProviderSpec + hooks\"]\n Edge --> ClientHttp[\"ChatProviderClient<br>Fetcher HTTP boundary\"]\n ClientHttp --> Upstream[\"Chat Completions upstream<br>DeepSeek, Xiaomi, MiniMax, Zhipu, custom\"]\n\n Upstream --> SyncRecon[\"bridge/response<br>reconstructResponseObject\"]\n Upstream --> StreamRecon[\"bridge/stream<br>ResponseStreamStateMachine\"]\n SyncRecon --> ResponseJson[\"ResponseObject JSON\"]\n StreamRecon --> StreamTransforms[\"stream transforms<br>validate, trace, log, persist, diagnostics\"]\n StreamTransforms --> Sse[\"Responses SSE\"]\n\n Ctx --> Trace[\"trace recorder<br>request, usage, event, error rows\"]\n Ctx --> Logger[\"structured logger\"]\n```\n\n## Component Interaction\n\n```mermaid\nsequenceDiagram\n autonumber\n actor Client\n participant Server as /v1/responses route\n participant Context as ResponsesContext factory\n participant Resolver as ModelResolver\n participant Store as ResponseSessionStore\n participant Registrar\n participant Runtime as ResponsesBridgeRuntime\n participant Exchange as ProviderExchange\n participant Bridge as bridge/request\n participant Provider as ProviderEdge\n participant Upstream as Chat Completions API\n\n Client->>Server: POST /v1/responses\n Server->>Server: parse and validate JSON envelope\n Server->>Context: create(app, body)\n Context->>Resolver: resolve(body.model)\n Resolver-->>Context: provider + upstream model\n opt previous_response_id\n Context->>Store: resolveChain(previous_response_id)\n Store-->>Context: ordered session snapshot\n end\n Context->>Registrar: resolve(provider)\n Registrar-->>Context: ProviderEdge\n Server->>Runtime: request(ctx) or stream(ctx)\n Runtime->>Exchange: build and send provider request\n Exchange->>Bridge: buildChatCompletionRequest(ctx)\n Bridge-->>Exchange: chat request + compatibility/tool/output plans\n Exchange->>Provider: request(body) or stream(body)\n Provider->>Upstream: POST /chat/completions\n Upstream-->>Provider: JSON response or SSE chunks\n alt sync\n Provider-->>Exchange: provider response\n Exchange-->>Runtime: provider response + plans\n Runtime->>Store: save completed response unless store=false\n Runtime-->>Server: ResponseObject\n Server-->>Client: JSON\n else stream\n Provider-->>Exchange: provider SSE stream\n Exchange-->>Runtime: stream + plans\n Runtime->>Runtime: bridge deltas, validate output, trace, log, persist\n Runtime-->>Server: ResponseStreamEvent stream\n Server-->>Client: text/event-stream\n end\n```\n\n## Install\n\nFor local development:\n\n```bash\ngit clone https://github.com/Ahoo-Wang/GodeX.git\ncd GodeX\nbun install\n```\n\nFor package use, install the published package and run the `godex` binary:\n\n```bash\nnpm install -g @ahoo-wang/godex\ngodex --help\n```\n\n### Docker\n\nPre-built images are published to Docker Hub and GitHub Container Registry:\n\n```bash\ndocker pull ahoowang/godex:latest\n# or\ndocker pull ghcr.io/ahoo-wang/godex:latest\n```\n\nRun with a config file:\n\n```bash\ndocker run -d \\\n --name godex \\\n -p 5678:5678 \\\n -e ZHIPU_API_KEY=your-key \\\n -e DEEPSEEK_API_KEY=your-key \\\n -e MINIMAX_API_KEY=your-key \\\n -e MIMO_API_KEY=your-key \\\n -v ./godex.yaml:/etc/godex/godex.yaml:ro \\\n -v godex-data:/data \\\n ahoowang/godex:latest\n```\n\nThe image supports `linux/amd64` and `linux/arm64`.\n\n- Config file: `/etc/godex/godex.yaml`\n- Data directory (sessions, trace): `/data`\n- Default port: `5678`\n\n## Quick Start\n\nCreate a config and start the server:\n\n```bash\ngodex init\ngodex serve --config ./godex.yaml\n```\n\nThe interactive wizard walks you through selecting providers, entering base URLs and API keys, and writes the config file automatically.\n\nAlternatively, create `godex.yaml` manually:\n\n```yaml\nserver:\n port: 5678\n host: 0.0.0.0\n\ndefault_provider: deepseek\n\nmodels:\n aliases:\n # -------------------------------------------------------------------------\n # Codex-compatible model aliases\n #\n # 这些 alias 是 GodeX routing policy,不代表与 OpenAI 原模型能力等价。\n # 依据优先级:公开 benchmark > 官方模型定位 > Provider 产品说明。\n # -------------------------------------------------------------------------\n\n # Codex 默认主力:复杂编码 / computer use / research workflows\n # 依据:DeepSeek V4-Pro 在 SWE / Terminal / Codeforces / GDPval-AA 上公开成绩强。\n gpt-5.5: \"deepseek/deepseek-v4-pro\"\n\n # Codex 旗舰:coding + reasoning + tool use + agentic workflows\n # 依据:DeepSeek V4-Pro 有更完整的公开 coding/agentic benchmark 覆盖。\n gpt-5.4: \"deepseek/deepseek-v4-pro\"\n\n # Codex mini:快速、低成本、轻量编码、subagents\n # 依据:MiniMax M2.7-highspeed 与 M2.7 结果一致但速度更快。\n gpt-5.4-mini: \"minimax/MiniMax-M2.7-highspeed\"\n\n # Codex 编码专用:复杂软件工程\n # 依据:DeepSeek V4-Pro 的 SWE Verified / SWE Pro / Terminal Bench 表现。\n gpt-5.3-codex: \"deepseek/deepseek-v4-pro\"\n\n # Codex spark:近实时编码迭代\n # 依据:MiniMax highspeed 版本更贴合 spark 的速度定位。\n gpt-5.3-codex-spark: \"minimax/MiniMax-M2.7-highspeed\"\n\n # 上一代通用 coding / agentic fallback\n # 严谨起见仍走 DeepSeek;不强行映射到 Zhipu。\n gpt-5.2: \"deepseek/deepseek-v4-pro\"\n\n # -------------------------------------------------------------------------\n # Provider native models\n # -------------------------------------------------------------------------\n\n deepseek-v4-pro: \"deepseek/deepseek-v4-pro\"\n deepseek-v4-flash: \"deepseek/deepseek-v4-flash\"\n\n mimo-v2.5-pro: \"xiaomi/mimo-v2.5-pro\"\n mimo-v2.5: \"xiaomi/mimo-v2.5\"\n\n glm-5.1: \"zhipu/glm-5.1\"\n glm-5-turbo: \"zhipu/glm-5-turbo\"\n glm-4.7: \"zhipu/glm-4.7\"\n glm-4.5-air: \"zhipu/glm-4.5-air\"\n\n MiniMax-M2.7: \"minimax/MiniMax-M2.7\"\n MiniMax-M2.7-highspeed: \"minimax/MiniMax-M2.7-highspeed\"\n\n # Fallback for unknown bare model names\n \"*\": \"deepseek/deepseek-v4-pro\"\n\nproviders:\n deepseek:\n spec: deepseek\n credentials:\n api_key: ${DEEPSEEK_API_KEY}\n endpoint:\n base_url: https://api.deepseek.com\n zhipu:\n spec: zhipu\n credentials:\n api_key: ${ZHIPU_API_KEY}\n endpoint:\n base_url: https://open.bigmodel.cn/api/coding/paas/v4\n minimax:\n spec: minimax\n credentials:\n api_key: ${MINIMAX_API_KEY}\n endpoint:\n base_url: https://api.minimaxi.com/v1\n xiaomi:\n spec: xiaomi\n credentials:\n api_key: ${MIMO_API_KEY}\n endpoint:\n base_url: https://api.xiaomimimo.com/v1\n\nsession:\n backend: sqlite\n\nlogging:\n level: info\n\ntrace:\n enabled: true\n path: ./data/trace.db\n capture_payload: false\n```\n\nStart the server:\n\n```bash\ngodex serve --config ./godex.yaml\n```\n\nThe dev command starts GodeX on port `13145`; the default runtime config port is `5678`.\n\n## API\n\n### Health\n\n```bash\ncurl http://localhost:5678/health\n```\n\n### Models\n\n```bash\ncurl http://localhost:5678/v1/models\n```\n\n`/v1/models` lists configured aliases, excluding the wildcard alias `*`.\n\n### Responses\n\n```bash\ncurl http://localhost:5678/v1/responses \\\n -H 'content-type: application/json' \\\n -d '{\n \"model\": \"gpt-5.5\",\n \"input\": \"Write a short TypeScript function that adds two numbers.\"\n }'\n```\n\nStreaming uses standard Responses SSE event names:\n\n```bash\ncurl -N http://localhost:5678/v1/responses \\\n -H 'content-type: application/json' \\\n -d '{\n \"model\": \"gpt-5.5\",\n \"stream\": true,\n \"input\": \"Explain Bun streams in two sentences.\"\n }'\n```\n\n## Model Routing\n\nClients may pass either:\n\n- A provider-qualified selector such as `deepseek/deepseek-v4-pro`\n- A configured alias such as `gpt-5.5`\n- A bare model name, which resolves through `default_provider` when no alias matches\n\nAliases must map to `provider/model` values, and the provider must exist in `providers`.\n\n## Provider Bridge Behavior\n\nGodeX builds a provider request in three steps:\n\n1. Resolve the client model selector to a configured provider and upstream model.\n2. Plan compatibility from the provider `ProviderSpec`, including request parameters, tool declarations, `tool_choice`, response format, reasoning, and stream usage.\n3. Convert Responses input and session history into Chat Completions messages, call the upstream provider, and reconstruct a Responses object or Responses SSE stream.\n\nProvider-specific differences belong in each provider's `spec.ts`, `hooks.ts`, protocol types, and HTTP client. Shared Responses-to-Chat policy belongs under `src/bridge`.\n\n## Structured Output\n\nWhen a provider supports `json_object` but not native `json_schema`, GodeX can degrade strict `json_schema` requests to `json_object`.\n\nFor strict downgraded schemas:\n\n- The schema instruction is added to the provider prompt preamble for the current request.\n- The provider receives `response_format: { \"type\": \"json_object\" }`.\n- GodeX validates that the final output is valid JSON.\n- Invalid sync output fails the response; invalid stream output is rewritten to a terminal `response.failed` event.\n\nThe validator checks JSON syntax, not full JSON Schema conformance.\n\n## Sessions\n\nResponses can be stored and replayed with `previous_response_id`.\n\n- `session.backend: memory` keeps history in process memory.\n- `session.backend: sqlite` persists history to SQLite.\n- Requests with `store: false` are not saved.\n- The session chain stores request snapshots and response output items, then rebuilds provider-neutral history on the next turn.\n\n## Trace Database\n\nTracing is enabled by default and writes SQLite rows to `./data/trace.db` unless configured otherwise.\n\nTrace records include:\n\n- Provider request metadata\n- Provider request and response bodies as summarized payloads\n- Raw and transformed stream events\n- Usage details, including cached tokens when provided by the upstream\n- Route and provider errors\n\nSet `trace.capture_payload: true` to persist payload JSON up to `trace.payload_max_bytes`. Keep it disabled for sensitive environments.\n\n## Development\n\n```bash\nbun install # Install dependencies\nbun run dev # Dev server with hot reload on port 13145\nbun run start # Start server from source\nbun run build # Build a binary for the current platform\nbun run compile:all # Cross-compile all supported platform packages\n```\n\nQuality gates:\n\n```bash\nbun run typecheck # TypeScript\nbun run lint # Biome check\nbun run lint:fix # Biome autofix\nbun run format # Biome format\nbun run test # Unit and integration tests, excluding src/e2e\nbun run test:e2e # Mocked end-to-end tests\nbun run test:zhipu # Live Zhipu tests; requires ZHIPU_API_KEY\nbun run test:deepseek # Live DeepSeek tests; requires DEEPSEEK_API_KEY\nbun run test:minimax # Live MiniMax tests; requires MINIMAX_API_KEY\nbun run test:xiaomi # Live Xiaomi tests; requires MIMO_API_KEY\nbun run check # typecheck + lint + test\nbun run ci # typecheck + biome ci + test + e2e\n```\n\n## Source Map\n\n```text\nsrc/\n cli/ Commander CLI, init wizard, runtime config loading\n config/ godex.yaml schema, defaults, env interpolation\n context/ ApplicationContext and per-request ResponsesContext\n bridge/ Provider-agnostic Responses-to-Chat planning and reconstruction\n providers/ Built-in provider specs, hooks, clients, and registry\n responses/ Sync and stream request pipelines\n server/ Bun routes for /health, /v1/models, /v1/responses\n session/ Memory and SQLite response session stores\n trace/ SQLite trace recorder and usage/error/event mappers\n protocol/ OpenAI protocol type definitions\n error/ GodeXError hierarchy and domain codes\n```\n\n## Provider Development\n\nProvider folders follow this shape:\n\n```text\nsrc/providers/<name>/\n spec.ts ProviderSpec declaration\n client.ts ProviderEdge construction with ChatProviderClient\n hooks.ts Provider-specific patching, accessors, usage, stream deltas\n protocol/ Provider DTOs when needed\n index.ts Public exports\n```\n\nAdd shared compatibility policy to `src/bridge`; add shared provider transport or protocol helpers to `src/providers/shared`.\n\n## License\n\nApache-2.0. See [LICENSE](./LICENSE).\n"}, "16c3a630764b4abd2230bb1b7bd9195e9454b939": {"t": 1785748577.2231011, "n": 13362, "h": "1c5463d1a6c659ea", "c": "<div align=\"center\">\n\n<img src=\"design/assets/01-logo-system/png/godex-logo-horizontal-transparent-800x233.png\" alt=\"GodeX\" width=\"480\" />\n\n**Make every model a Codex engine.**\n\nOpenAI-compatible Responses API gateway for Codex, CLI tools and developer agents.\n\n[](https://www.npmjs.com/package/@ahoo-wang/godex)\n[](https://codecov.io/gh/Ahoo-Wang/GodeX)\n[](https://bun.sh)\n[](https://www.typescriptlang.org/)\n\n</div>\n\nGodeX lets clients that speak the OpenAI Responses API use providers such as DeepSeek, Xiaomi, MiniMax, and Zhipu through one local server.\n\n## Highlights\n\n- OpenAI-compatible `POST /v1/responses` endpoint with sync and streaming responses.\n- `GET /v1/models` aliases so clients can use stable model names while GodeX routes to provider/model targets.\n- Built-in bridge providers for DeepSeek, Xiaomi, MiniMax, and Zhipu.\n- Provider capability planning for request parameters, tools, `tool_choice`, structured output formats, reasoning, and stream usage.\n- Responses `previous_response_id` session chains backed by memory or SQLite.\n- Trace recording for provider requests, provider responses, stream events, usage, and errors.\n- Native Bun runtime, TypeScript source, and compiled platform binaries for releases.\n\n## Built-in Providers\n\n| Provider | Reasoning | Tool Choice | Response Format | Cached Tokens | Default Model |\n|----------|-----------|-------------|-----------------|---------------|---------------|\n| DeepSeek | native | auto, none, required, function | text, json_object | ✅ | `deepseek-v4-pro` |\n| Xiaomi | boolean | auto | text, json_object | ✅ | `mimo-v2.5-pro` |\n| MiniMax | none | auto, none, required, function | text, json_object | ✅ | `MiniMax-M2.7` |\n| Zhipu | boolean | auto, none | text, json_object | ✅ | `glm-5.1` |\n\n## Architecture\n\n```mermaid\nflowchart TB\n Client[\"Client<br>Codex, SDK, CLI, IDE\"] --> Routes[\"Bun server routes<br>/health<br>/v1/models<br>/v1/responses\"]\n Routes --> Ctx[\"ResponsesContext<br>request id, response id, resolved model,<br>provider, session, diagnostics\"]\n\n Ctx --> Resolver[\"ModelResolver<br>alias and provider/model selection\"]\n Ctx --> Session[\"ResponseSessionStore<br>memory or SQLite<br>previous_response_id chains\"]\n Ctx --> Registrar[\"Registrar<br>built-in ProviderEdge factories\"]\n Ctx --> Runtime[\"ResponsesBridgeRuntime\"]\n\n Runtime --> Sync[\"SyncRequestPipeline\"]\n Runtime --> Stream[\"StreamPipeline\"]\n Sync --> Exchange[\"ProviderExchange\"]\n Stream --> Exchange\n\n Exchange --> Builder[\"bridge/request<br>buildChatCompletionRequest\"]\n Builder --> Compat[\"bridge/compatibility<br>parameter and response-format decisions\"]\n Builder --> Tools[\"bridge/tools<br>tool declarations, tool_choice,<br>identity restoration\"]\n Builder --> Output[\"bridge/output<br>structured-output contract\"]\n\n Exchange --> Edge[\"ProviderEdge<br>ProviderSpec + hooks\"]\n Edge --> ClientHttp[\"ChatProviderClient<br>Fetcher HTTP boundary\"]\n ClientHttp --> Upstream[\"Chat Completions upstream<br>DeepSeek, Xiaomi, MiniMax, Zhipu, custom\"]\n\n Upstream --> SyncRecon[\"bridge/response<br>reconstructResponseObject\"]\n Upstream --> StreamRecon[\"bridge/stream<br>ResponseStreamStateMachine\"]\n SyncRecon --> ResponseJson[\"ResponseObject JSON\"]\n StreamRecon --> StreamTransforms[\"stream transforms<br>validate, trace, log, persist, diagnostics\"]\n StreamTransforms --> Sse[\"Responses SSE\"]\n\n Ctx --> Trace[\"trace recorder<br>request, usage, event, error rows\"]\n Ctx --> Logger[\"structured logger\"]\n```\n\n## Component Interaction\n\n```mermaid\nsequenceDiagram\n autonumber\n actor Client\n participant Server as /v1/responses route\n participant Context as ResponsesContext factory\n participant Resolver as ModelResolver\n participant Store as ResponseSessionStore\n participant Registrar\n participant Runtime as ResponsesBridgeRuntime\n participant Exchange as ProviderExchange\n participant Bridge as bridge/request\n participant Provider as ProviderEdge\n participant Upstream as Chat Completions API\n\n Client->>Server: POST /v1/responses\n Server->>Server: parse and validate JSON envelope\n Server->>Context: create(app, body)\n Context->>Resolver: resolve(body.model)\n Resolver-->>Context: provider + upstream model\n opt previous_response_id\n Context->>Store: resolveChain(previous_response_id)\n Store-->>Context: ordered session snapshot\n end\n Context->>Registrar: resolve(provider)\n Registrar-->>Context: ProviderEdge\n Server->>Runtime: request(ctx) or stream(ctx)\n Runtime->>Exchange: build and send provider request\n Exchange->>Bridge: buildChatCompletionRequest(ctx)\n Bridge-->>Exchange: chat request + compatibility/tool/output plans\n Exchange->>Provider: request(body) or stream(body)\n Provider->>Upstream: POST /chat/completions\n Upstream-->>Provider: JSON response or SSE chunks\n alt sync\n Provider-->>Exchange: provider response\n Exchange-->>Runtime: provider response + plans\n Runtime->>Store: save completed response unless store=false\n Runtime-->>Server: ResponseObject\n Server-->>Client: JSON\n else stream\n Provider-->>Exchange: provider SSE stream\n Exchange-->>Runtime: stream + plans\n Runtime->>Runtime: bridge deltas, validate output, trace, log, persist\n Runtime-->>Server: ResponseStreamEvent stream\n Server-->>Client: text/event-stream\n end\n```\n\n## Install\n\nFor local development:\n\n```bash\ngit clone https://github.com/Ahoo-Wang/GodeX.git\ncd GodeX\nbun install\n```\n\nFor package use, install the published package and run the `godex` binary:\n\n```bash\nnpm install -g @ahoo-wang/godex\ngodex --help\n```\n\n### Docker\n\nPre-built images are published to Docker Hub and GitHub Container Registry:\n\n```bash\ndocker pull ahoowang/godex:latest\n# or\ndocker pull ghcr.io/ahoo-wang/godex:latest\n```\n\nRun with a config file:\n\n```bash\ndocker run -d \\\n --name godex \\\n -p 5678:5678 \\\n -e ZHIPU_API_KEY=your-key \\\n -e DEEPSEEK_API_KEY=your-key \\\n -e MINIMAX_API_KEY=your-key \\\n -e MIMO_API_KEY=your-key \\\n -v ./godex.yaml:/etc/godex/godex.yaml:ro \\\n -v godex-data:/data \\\n ahoowang/godex:latest\n```\n\nThe image supports `linux/amd64` and `linux/arm64`.\n\n- Config file: `/etc/godex/godex.yaml`\n- Data directory (sessions, trace): `/data`\n- Default port: `5678`\n\n## Quick Start\n\nCreate a config and start the server:\n\n```bash\ngodex init\ngodex serve --config ./godex.yaml\n```\n\nThe interactive wizard walks you through selecting providers, entering base URLs and API keys, and writes the config file automatically.\n\nAlternatively, create `godex.yaml` manually:\n\n```yaml\nserver:\n port: 5678\n host: 0.0.0.0\n\ndefault_provider: deepseek\n\nmodels:\n aliases:\n gpt-5.5: deepseek/deepseek-v4-pro\n glm: zhipu/glm-5.1\n \"*\": deepseek/deepseek-v4-flash\n\nproviders:\n deepseek:\n spec: deepseek\n credentials:\n api_key: ${DEEPSEEK_API_KEY}\n endpoint:\n base_url: https://api.deepseek.com\n zhipu:\n spec: zhipu\n credentials:\n api_key: ${ZHIPU_API_KEY}\n endpoint:\n base_url: https://open.bigmodel.cn/api/coding/paas/v4\n minimax:\n spec: minimax\n credentials:\n api_key: ${MINIMAX_API_KEY}\n endpoint:\n base_url: https://api.minimaxi.com/v1\n xiaomi:\n spec: xiaomi\n credentials:\n api_key: ${MIMO_API_KEY}\n endpoint:\n base_url: https://api.xiaomimimo.com/v1\n\nsession:\n backend: sqlite\n\nlogging:\n level: info\n\ntrace:\n enabled: true\n path: ./data/trace.db\n capture_payload: false\n```\n\nStart the server:\n\n```bash\ngodex serve --config ./godex.yaml\n```\n\nThe dev command starts GodeX on port `13145`; the default runtime config port is `5678`.\n\n## API\n\n### Health\n\n```bash\ncurl http://localhost:5678/health\n```\n\n### Models\n\n```bash\ncurl http://localhost:5678/v1/models\n```\n\n`/v1/models` lists configured aliases, excluding the wildcard alias `*`.\n\n### Responses\n\n```bash\ncurl http://localhost:5678/v1/responses \\\n -H 'content-type: application/json' \\\n -d '{\n \"model\": \"gpt-5.5\",\n \"input\": \"Write a short TypeScript function that adds two numbers.\"\n }'\n```\n\nStreaming uses standard Responses SSE event names:\n\n```bash\ncurl -N http://localhost:5678/v1/responses \\\n -H 'content-type: application/json' \\\n -d '{\n \"model\": \"gpt-5.5\",\n \"stream\": true,\n \"input\": \"Explain Bun streams in two sentences.\"\n }'\n```\n\n## Model Routing\n\nClients may pass either:\n\n- A provider-qualified selector such as `deepseek/deepseek-v4-pro`\n- A configured alias such as `gpt-5.5`\n- A bare model name, which resolves through `default_provider` when no alias matches\n\nAliases must map to `provider/model` values, and the provider must exist in `providers`.\n\n## Provider Bridge Behavior\n\nGodeX builds a provider request in three steps:\n\n1. Resolve the client model selector to a configured provider and upstream model.\n2. Plan compatibility from the provider `ProviderSpec`, including request parameters, tool declarations, `tool_choice`, response format, reasoning, and stream usage.\n3. Convert Responses input and session history into Chat Completions messages, call the upstream provider, and reconstruct a Responses object or Responses SSE stream.\n\nProvider-specific differences belong in each provider's `spec.ts`, `hooks.ts`, protocol types, and HTTP client. Shared Responses-to-Chat policy belongs under `src/bridge`.\n\n## Structured Output\n\nWhen a provider supports `json_object` but not native `json_schema`, GodeX can degrade strict `json_schema` requests to `json_object`.\n\nFor strict downgraded schemas:\n\n- The schema instruction is added to the provider prompt preamble for the current request.\n- The provider receives `response_format: { \"type\": \"json_object\" }`.\n- GodeX validates that the final output is valid JSON.\n- Invalid sync output fails the response; invalid stream output is rewritten to a terminal `response.failed` event.\n\nThe validator checks JSON syntax, not full JSON Schema conformance.\n\n## Sessions\n\nResponses can be stored and replayed with `previous_response_id`.\n\n- `session.backend: memory` keeps history in process memory.\n- `session.backend: sqlite` persists history to SQLite.\n- Requests with `store: false` are not saved.\n- The session chain stores request snapshots and response output items, then rebuilds provider-neutral history on the next turn.\n\n## Trace Database\n\nTracing is enabled by default and writes SQLite rows to `./data/trace.db` unless configured otherwise.\n\nTrace records include:\n\n- Provider request metadata\n- Provider request and response bodies as summarized payloads\n- Raw and transformed stream events\n- Usage details, including cached tokens when provided by the upstream\n- Route and provider errors\n\nSet `trace.capture_payload: true` to persist payload JSON up to `trace.payload_max_bytes`. Keep it disabled for sensitive environments.\n\n## Development\n\n```bash\nbun install # Install dependencies\nbun run dev # Dev server with hot reload on port 13145\nbun run start # Start server from source\nbun run build # Build a binary for the current platform\nbun run compile:all # Cross-compile all supported platform packages\n```\n\nQuality gates:\n\n```bash\nbun run typecheck # TypeScript\nbun run lint # Biome check\nbun run lint:fix # Biome autofix\nbun run format # Biome format\nbun run test # Unit and integration tests, excluding src/e2e\nbun run test:e2e # Mocked end-to-end tests\nbun run test:zhipu # Live Zhipu tests; requires ZHIPU_API_KEY\nbun run test:deepseek # Live DeepSeek tests; requires DEEPSEEK_API_KEY\nbun run test:minimax # Live MiniMax tests; requires MINIMAX_API_KEY\nbun run test:xiaomi # Live Xiaomi tests; requires MIMO_API_KEY\nbun run check # typecheck + lint + test\nbun run ci # typecheck + biome ci + test + e2e\n```\n\n## Source Map\n\n```text\nsrc/\n cli/ Commander CLI, init wizard, runtime config loading\n config/ godex.yaml schema, defaults, env interpolation\n context/ ApplicationContext and per-request ResponsesContext\n bridge/ Provider-agnostic Responses-to-Chat planning and reconstruction\n providers/ Built-in provider specs, hooks, clients, and registry\n responses/ Sync and stream request pipelines\n server/ Bun routes for /health, /v1/models, /v1/responses\n session/ Memory and SQLite response session stores\n trace/ SQLite trace recorder and usage/error/event mappers\n protocol/ OpenAI protocol type definitions\n error/ GodeXError hierarchy and domain codes\n```\n\n## Provider Development\n\nProvider folders follow this shape:\n\n```text\nsrc/providers/<name>/\n spec.ts ProviderSpec declaration\n client.ts ProviderEdge construction with ChatProviderClient\n hooks.ts Provider-specific patching, accessors, usage, stream deltas\n protocol/ Provider DTOs when needed\n index.ts Public exports\n```\n\nAdd shared compatibility policy to `src/bridge`; add shared provider transport or protocol helpers to `src/providers/shared`.\n\n## License\n\nApache-2.0. See [LICENSE](./LICENSE).\n"}, "66be6680ad170f6f28c22c6d45770cc6eae746a3": {"t": 1785748578.5245593, "n": 13372, "h": "7ebf4f36c3ac72a8", "c": "<div align=\"center\">\n\n<img src=\"design/assets/01-logo-system/png/godex-logo-horizontal-transparent-800x233.png\" alt=\"GodeX\" width=\"480\" />\n\n**Make every model a Codex engine.**\n\nOpenAI-compatible Responses API gateway for coding models that expose Chat Completions APIs.\n\n[](https://www.npmjs.com/package/@ahoo-wang/godex)\n[](https://codecov.io/gh/Ahoo-Wang/GodeX)\n[](https://bun.sh)\n[](https://www.typescriptlang.org/)\n\n</div>\n\nGodeX lets clients that speak the OpenAI Responses API use providers such as DeepSeek, Xiaomi, MiniMax, and Zhipu through one local server.\n\n## Highlights\n\n- OpenAI-compatible `POST /v1/responses` endpoint with sync and streaming responses.\n- `GET /v1/models` aliases so clients can use stable model names while GodeX routes to provider/model targets.\n- Built-in bridge providers for DeepSeek, Xiaomi, MiniMax, and Zhipu.\n- Provider capability planning for request parameters, tools, `tool_choice`, structured output formats, reasoning, and stream usage.\n- Responses `previous_response_id` session chains backed by memory or SQLite.\n- Trace recording for provider requests, provider responses, stream events, usage, and errors.\n- Native Bun runtime, TypeScript source, and compiled platform binaries for releases.\n\n## Built-in Providers\n\n| Provider | Reasoning | Tool Choice | Response Format | Cached Tokens | Default Model |\n|----------|-----------|-------------|-----------------|---------------|---------------|\n| DeepSeek | native | auto, none, required, function | text, json_object | ✅ | `deepseek-v4-pro` |\n| Xiaomi | boolean | auto | text, json_object | ✅ | `mimo-v2.5-pro` |\n| MiniMax | none | auto, none, required, function | text, json_object | ✅ | `MiniMax-M2.7` |\n| Zhipu | boolean | auto, none | text, json_object | ✅ | `glm-5.1` |\n\n## Architecture\n\n```mermaid\nflowchart TB\n Client[\"Client<br>Codex, SDK, CLI, IDE\"] --> Routes[\"Bun server routes<br>/health<br>/v1/models<br>/v1/responses\"]\n Routes --> Ctx[\"ResponsesContext<br>request id, response id, resolved model,<br>provider, session, diagnostics\"]\n\n Ctx --> Resolver[\"ModelResolver<br>alias and provider/model selection\"]\n Ctx --> Session[\"ResponseSessionStore<br>memory or SQLite<br>previous_response_id chains\"]\n Ctx --> Registrar[\"Registrar<br>built-in ProviderEdge factories\"]\n Ctx --> Runtime[\"ResponsesBridgeRuntime\"]\n\n Runtime --> Sync[\"SyncRequestPipeline\"]\n Runtime --> Stream[\"StreamPipeline\"]\n Sync --> Exchange[\"ProviderExchange\"]\n Stream --> Exchange\n\n Exchange --> Builder[\"bridge/request<br>buildChatCompletionRequest\"]\n Builder --> Compat[\"bridge/compatibility<br>parameter and response-format decisions\"]\n Builder --> Tools[\"bridge/tools<br>tool declarations, tool_choice,<br>identity restoration\"]\n Builder --> Output[\"bridge/output<br>structured-output contract\"]\n\n Exchange --> Edge[\"ProviderEdge<br>ProviderSpec + hooks\"]\n Edge --> ClientHttp[\"ChatProviderClient<br>Fetcher HTTP boundary\"]\n ClientHttp --> Upstream[\"Chat Completions upstream<br>DeepSeek, Xiaomi, MiniMax, Zhipu, custom\"]\n\n Upstream --> SyncRecon[\"bridge/response<br>reconstructResponseObject\"]\n Upstream --> StreamRecon[\"bridge/stream<br>ResponseStreamStateMachine\"]\n SyncRecon --> ResponseJson[\"ResponseObject JSON\"]\n StreamRecon --> StreamTransforms[\"stream transforms<br>validate, trace, log, persist, diagnostics\"]\n StreamTransforms --> Sse[\"Responses SSE\"]\n\n Ctx --> Trace[\"trace recorder<br>request, usage, event, error rows\"]\n Ctx --> Logger[\"structured logger\"]\n```\n\n## Component Interaction\n\n```mermaid\nsequenceDiagram\n autonumber\n actor Client\n participant Server as /v1/responses route\n participant Context as ResponsesContext factory\n participant Resolver as ModelResolver\n participant Store as ResponseSessionStore\n participant Registrar\n participant Runtime as ResponsesBridgeRuntime\n participant Exchange as ProviderExchange\n participant Bridge as bridge/request\n participant Provider as ProviderEdge\n participant Upstream as Chat Completions API\n\n Client->>Server: POST /v1/responses\n Server->>Server: parse and validate JSON envelope\n Server->>Context: create(app, body)\n Context->>Resolver: resolve(body.model)\n Resolver-->>Context: provider + upstream model\n opt previous_response_id\n Context->>Store: resolveChain(previous_response_id)\n Store-->>Context: ordered session snapshot\n end\n Context->>Registrar: resolve(provider)\n Registrar-->>Context: ProviderEdge\n Server->>Runtime: request(ctx) or stream(ctx)\n Runtime->>Exchange: build and send provider request\n Exchange->>Bridge: buildChatCompletionRequest(ctx)\n Bridge-->>Exchange: chat request + compatibility/tool/output plans\n Exchange->>Provider: request(body) or stream(body)\n Provider->>Upstream: POST /chat/completions\n Upstream-->>Provider: JSON response or SSE chunks\n alt sync\n Provider-->>Exchange: provider response\n Exchange-->>Runtime: provider response + plans\n Runtime->>Store: save completed response unless store=false\n Runtime-->>Server: ResponseObject\n Server-->>Client: JSON\n else stream\n Provider-->>Exchange: provider SSE stream\n Exchange-->>Runtime: stream + plans\n Runtime->>Runtime: bridge deltas, validate output, trace, log, persist\n Runtime-->>Server: ResponseStreamEvent stream\n Server-->>Client: text/event-stream\n end\n```\n\n## Install\n\nFor local development:\n\n```bash\ngit clone https://github.com/Ahoo-Wang/GodeX.git\ncd GodeX\nbun install\n```\n\nFor package use, install the published package and run the `godex` binary:\n\n```bash\nnpm install -g @ahoo-wang/godex\ngodex --help\n```\n\n### Docker\n\nPre-built images are published to Docker Hub and GitHub Container Registry:\n\n```bash\ndocker pull ahoowang/godex:latest\n# or\ndocker pull ghcr.io/ahoo-wang/godex:latest\n```\n\nRun with a config file:\n\n```bash\ndocker run -d \\\n --name godex \\\n -p 5678:5678 \\\n -e ZHIPU_API_KEY=your-key \\\n -e DEEPSEEK_API_KEY=your-key \\\n -e MINIMAX_API_KEY=your-key \\\n -e MIMO_API_KEY=your-key \\\n -v ./godex.yaml:/etc/godex/godex.yaml:ro \\\n -v godex-data:/data \\\n ahoowang/godex:latest\n```\n\nThe image supports `linux/amd64` and `linux/arm64`.\n\n- Config file: `/etc/godex/godex.yaml`\n- Data directory (sessions, trace): `/data`\n- Default port: `5678`\n\n## Quick Start\n\nCreate a config and start the server:\n\n```bash\ngodex init\ngodex serve --config ./godex.yaml\n```\n\nThe interactive wizard walks you through selecting providers, entering base URLs and API keys, and writes the config file automatically.\n\nAlternatively, create `godex.yaml` manually:\n\n```yaml\nserver:\n port: 5678\n host: 0.0.0.0\n\ndefault_provider: deepseek\n\nmodels:\n aliases:\n gpt-5.5: deepseek/deepseek-v4-pro\n glm: zhipu/glm-5.1\n \"*\": deepseek/deepseek-v4-flash\n\nproviders:\n deepseek:\n spec: deepseek\n credentials:\n api_key: ${DEEPSEEK_API_KEY}\n endpoint:\n base_url: https://api.deepseek.com\n zhipu:\n spec: zhipu\n credentials:\n api_key: ${ZHIPU_API_KEY}\n endpoint:\n base_url: https://open.bigmodel.cn/api/coding/paas/v4\n minimax:\n spec: minimax\n credentials:\n api_key: ${MINIMAX_API_KEY}\n endpoint:\n base_url: https://api.minimaxi.com/v1\n xiaomi:\n spec: xiaomi\n credentials:\n api_key: ${MIMO_API_KEY}\n endpoint:\n base_url: https://api.xiaomimimo.com/v1\n\nsession:\n backend: sqlite\n\nlogging:\n level: info\n\ntrace:\n enabled: true\n path: ./data/trace.db\n capture_payload: false\n```\n\nStart the server:\n\n```bash\ngodex serve --config ./godex.yaml\n```\n\nThe dev command starts GodeX on port `13145`; the default runtime config port is `5678`.\n\n## API\n\n### Health\n\n```bash\ncurl http://localhost:5678/health\n```\n\n### Models\n\n```bash\ncurl http://localhost:5678/v1/models\n```\n\n`/v1/models` lists configured aliases, excluding the wildcard alias `*`.\n\n### Responses\n\n```bash\ncurl http://localhost:5678/v1/responses \\\n -H 'content-type: application/json' \\\n -d '{\n \"model\": \"gpt-5.5\",\n \"input\": \"Write a short TypeScript function that adds two numbers.\"\n }'\n```\n\nStreaming uses standard Responses SSE event names:\n\n```bash\ncurl -N http://localhost:5678/v1/responses \\\n -H 'content-type: application/json' \\\n -d '{\n \"model\": \"gpt-5.5\",\n \"stream\": true,\n \"input\": \"Explain Bun streams in two sentences.\"\n }'\n```\n\n## Model Routing\n\nClients may pass either:\n\n- A provider-qualified selector such as `deepseek/deepseek-v4-pro`\n- A configured alias such as `gpt-5.5`\n- A bare model name, which resolves through `default_provider` when no alias matches\n\nAliases must map to `provider/model` values, and the provider must exist in `providers`.\n\n## Provider Bridge Behavior\n\nGodeX builds a provider request in three steps:\n\n1. Resolve the client model selector to a configured provider and upstream model.\n2. Plan compatibility from the provider `ProviderSpec`, including request parameters, tool declarations, `tool_choice`, response format, reasoning, and stream usage.\n3. Convert Responses input and session history into Chat Completions messages, call the upstream provider, and reconstruct a Responses object or Responses SSE stream.\n\nProvider-specific differences belong in each provider's `spec.ts`, `hooks.ts`, protocol types, and HTTP client. Shared Responses-to-Chat policy belongs under `src/bridge`.\n\n## Structured Output\n\nWhen a provider supports `json_object` but not native `json_schema`, GodeX can degrade strict `json_schema` requests to `json_object`.\n\nFor strict downgraded schemas:\n\n- The schema instruction is added to the provider prompt preamble for the current request.\n- The provider receives `response_format: { \"type\": \"json_object\" }`.\n- GodeX validates that the final output is valid JSON.\n- Invalid sync output fails the response; invalid stream output is rewritten to a terminal `response.failed` event.\n\nThe validator checks JSON syntax, not full JSON Schema conformance.\n\n## Sessions\n\nResponses can be stored and replayed with `previous_response_id`.\n\n- `session.backend: memory` keeps history in process memory.\n- `session.backend: sqlite` persists history to SQLite.\n- Requests with `store: false` are not saved.\n- The session chain stores request snapshots and response output items, then rebuilds provider-neutral history on the next turn.\n\n## Trace Database\n\nTracing is enabled by default and writes SQLite rows to `./data/trace.db` unless configured otherwise.\n\nTrace records include:\n\n- Provider request metadata\n- Provider request and response bodies as summarized payloads\n- Raw and transformed stream events\n- Usage details, including cached tokens when provided by the upstream\n- Route and provider errors\n\nSet `trace.capture_payload: true` to persist payload JSON up to `trace.payload_max_bytes`. Keep it disabled for sensitive environments.\n\n## Development\n\n```bash\nbun install # Install dependencies\nbun run dev # Dev server with hot reload on port 13145\nbun run start # Start server from source\nbun run build # Build a binary for the current platform\nbun run compile:all # Cross-compile all supported platform packages\n```\n\nQuality gates:\n\n```bash\nbun run typecheck # TypeScript\nbun run lint # Biome check\nbun run lint:fix # Biome autofix\nbun run format # Biome format\nbun run test # Unit and integration tests, excluding src/e2e\nbun run test:e2e # Mocked end-to-end tests\nbun run test:zhipu # Live Zhipu tests; requires ZHIPU_API_KEY\nbun run test:deepseek # Live DeepSeek tests; requires DEEPSEEK_API_KEY\nbun run test:minimax # Live MiniMax tests; requires MINIMAX_API_KEY\nbun run test:xiaomi # Live Xiaomi tests; requires MIMO_API_KEY\nbun run check # typecheck + lint + test\nbun run ci # typecheck + biome ci + test + e2e\n```\n\n## Source Map\n\n```text\nsrc/\n cli/ Commander CLI, init wizard, runtime config loading\n config/ godex.yaml schema, defaults, env interpolation\n context/ ApplicationContext and per-request ResponsesContext\n bridge/ Provider-agnostic Responses-to-Chat planning and reconstruction\n providers/ Built-in provider specs, hooks, clients, and registry\n responses/ Sync and stream request pipelines\n server/ Bun routes for /health, /v1/models, /v1/responses\n session/ Memory and SQLite response session stores\n trace/ SQLite trace recorder and usage/error/event mappers\n protocol/ OpenAI protocol type definitions\n error/ GodeXError hierarchy and domain codes\n```\n\n## Provider Development\n\nProvider folders follow this shape:\n\n```text\nsrc/providers/<name>/\n spec.ts ProviderSpec declaration\n client.ts ProviderEdge construction with ChatProviderClient\n hooks.ts Provider-specific patching, accessors, usage, stream deltas\n protocol/ Provider DTOs when needed\n index.ts Public exports\n```\n\nAdd shared compatibility policy to `src/bridge`; add shared provider transport or protocol helpers to `src/providers/shared`.\n\n## License\n\nApache-2.0. See [LICENSE](./LICENSE).\n"}, "23c3f87dc2600740b2011b31249d6799d3fecd1a": {"t": 1785748580.6654832, "n": 13290, "h": "91744e0a7e522393", "c": "<div align=\"center\">\n\n<img src=\"design/assets/01-logo-system/png/godex-logo-horizontal-transparent-800x233.png\" alt=\"GodeX\" width=\"480\" />\n\n**Make every model a Codex engine.**\n\nOpenAI-compatible Responses API gateway for coding models that expose Chat Completions APIs.\n\n[](https://www.npmjs.com/package/@ahoo-wang/godex)\n[](https://codecov.io/gh/Ahoo-Wang/GodeX)\n[](https://bun.sh)\n[](https://www.typescriptlang.org/)\n\n</div>\n\nGodeX lets clients that speak the OpenAI Responses API use providers such as DeepSeek, Xiaomi, MiniMax, and Zhipu through one local server.\n\n## Highlights\n\n- OpenAI-compatible `POST /v1/responses` endpoint with sync and streaming responses.\n- `GET /v1/models` aliases so clients can use stable model names while GodeX routes to provider/model targets.\n- Built-in bridge providers for DeepSeek, Xiaomi, MiniMax, and Zhipu.\n- Provider capability planning for request parameters, tools, `tool_choice`, structured output formats, reasoning, and stream usage.\n- Responses `previous_response_id` session chains backed by memory or SQLite.\n- Trace recording for provider requests, provider responses, stream events, usage, and errors.\n- Native Bun runtime, TypeScript source, and compiled platform binaries for releases.\n\n## Built-in Providers\n\n| Provider | Reasoning | Tool Choice | Response Format | Cached Tokens | Default Model |\n|----------|-----------|-------------|-----------------|---------------|---------------|\n| DeepSeek | native | auto, none, required, function | text, json_object | ✅ | `deepseek-v4-pro` |\n| Xiaomi | boolean | auto | text, json_object | ✅ | `mimo-v2.5-pro` |\n| MiniMax | none | auto, none, required, function | text, json_object | ✅ | `MiniMax-M2.7` |\n| Zhipu | boolean | auto, none | text, json_object | ✅ | `glm-5.1` |\n\n## Architecture\n\n```mermaid\nflowchart TB\n Client[\"Client<br>Codex, SDK, CLI, IDE\"] --> Routes[\"Bun server routes<br>/health<br>/v1/models<br>/v1/responses\"]\n Routes --> Ctx[\"ResponsesContext<br>request id, response id, resolved model,<br>provider, session, diagnostics\"]\n\n Ctx --> Resolver[\"ModelResolver<br>alias and provider/model selection\"]\n Ctx --> Session[\"ResponseSessionStore<br>memory or SQLite<br>previous_response_id chains\"]\n Ctx --> Registrar[\"Registrar<br>built-in ProviderEdge factories\"]\n Ctx --> Runtime[\"ResponsesBridgeRuntime\"]\n\n Runtime --> Sync[\"SyncRequestPipeline\"]\n Runtime --> Stream[\"StreamPipeline\"]\n Sync --> Exchange[\"ProviderExchange\"]\n Stream --> Exchange\n\n Exchange --> Builder[\"bridge/request<br>buildChatCompletionRequest\"]\n Builder --> Compat[\"bridge/compatibility<br>parameter and response-format decisions\"]\n Builder --> Tools[\"bridge/tools<br>tool declarations, tool_choice,<br>identity restoration\"]\n Builder --> Output[\"bridge/output<br>structured-output contract\"]\n\n Exchange --> Edge[\"ProviderEdge<br>ProviderSpec + hooks\"]\n Edge --> ClientHttp[\"ChatProviderClient<br>Fetcher HTTP boundary\"]\n ClientHttp --> Upstream[\"Chat Completions upstream<br>DeepSeek, Xiaomi, MiniMax, Zhipu, custom\"]\n\n Upstream --> SyncRecon[\"bridge/response<br>reconstructResponseObject\"]\n Upstream --> StreamRecon[\"bridge/stream<br>ResponseStreamStateMachine\"]\n SyncRecon --> ResponseJson[\"ResponseObject JSON\"]\n StreamRecon --> StreamTransforms[\"stream transforms<br>validate, trace, log, persist, diagnostics\"]\n StreamTransforms --> Sse[\"Responses SSE\"]\n\n Ctx --> Trace[\"trace recorder<br>request, usage, event, error rows\"]\n Ctx --> Logger[\"structured logger\"]\n```\n\n## Component Interaction\n\n```mermaid\nsequenceDiagram\n autonumber\n actor Client\n participant Server as /v1/responses route\n participant Context as ResponsesContext factory\n participant Resolver as ModelResolver\n participant Store as ResponseSessionStore\n participant Registrar\n participant Runtime as ResponsesBridgeRuntime\n participant Exchange as ProviderExchange\n participant Bridge as bridge/request\n participant Provider as ProviderEdge\n participant Upstream as Chat Completions API\n\n Client->>Server: POST /v1/responses\n Server->>Server: parse and validate JSON envelope\n Server->>Context: create(app, body)\n Context->>Resolver: resolve(body.model)\n Resolver-->>Context: provider + upstream model\n opt previous_response_id\n Context->>Store: resolveChain(previous_response_id)\n Store-->>Context: ordered session snapshot\n end\n Context->>Registrar: resolve(provider)\n Registrar-->>Context: ProviderEdge\n Server->>Runtime: request(ctx) or stream(ctx)\n Runtime->>Exchange: build and send provider request\n Exchange->>Bridge: buildChatCompletionRequest(ctx)\n Bridge-->>Exchange: chat request + compatibility/tool/output plans\n Exchange->>Provider: request(body) or stream(body)\n Provider->>Upstream: POST /chat/completions\n Upstream-->>Provider: JSON response or SSE chunks\n alt sync\n Provider-->>Exchange: provider response\n Exchange-->>Runtime: provider response + plans\n Runtime->>Store: save completed response unless store=false\n Runtime-->>Server: ResponseObject\n Server-->>Client: JSON\n else stream\n Provider-->>Exchange: provider SSE stream\n Exchange-->>Runtime: stream + plans\n Runtime->>Runtime: bridge deltas, validate output, trace, log, persist\n Runtime-->>Server: ResponseStreamEvent stream\n Server-->>Client: text/event-stream\n end\n```\n\n## Install\n\nFor local development:\n\n```bash\ngit clone https://github.com/Ahoo-Wang/GodeX.git\ncd GodeX\nbun install\n```\n\nFor package use, install the published package and run the `godex` binary:\n\n```bash\nnpm install -g @ahoo-wang/godex\ngodex --help\n```\n\n### Docker\n\nPre-built images are published to Docker Hub and GitHub Container Registry:\n\n```bash\ndocker pull ahoowang/godex:latest\n# or\ndocker pull ghcr.io/ahoo-wang/godex:latest\n```\n\nRun with a config file:\n\n```bash\ndocker run -d \\\n --name godex \\\n -p 5678:5678 \\\n -e ZHIPU_API_KEY=your-key \\\n -e DEEPSEEK_API_KEY=your-key \\\n -e MINIMAX_API_KEY=your-key \\\n -e MIMO_API_KEY=your-key \\\n -v ./godex.yaml:/etc/godex/godex.yaml:ro \\\n -v godex-data:/data \\\n ahoowang/godex:latest\n```\n\nThe image supports `linux/amd64` and `linux/arm64`.\n\n- Config file: `/etc/godex/godex.yaml`\n- Data directory (sessions, trace): `/data`\n- Default port: `5678`\n\n## Quick Start\n\nCreate a config interactively:\n\n```bash\ngodex init\n```\n\nOr create `godex.yaml` manually:\n\n```yaml\nserver:\n port: 5678\n host: 0.0.0.0\n\ndefault_provider: deepseek\n\nmodels:\n aliases:\n gpt-5.5: deepseek/deepseek-v4-pro\n glm: zhipu/glm-5.1\n \"*\": deepseek/deepseek-v4-flash\n\nproviders:\n deepseek:\n spec: deepseek\n credentials:\n api_key: ${DEEPSEEK_API_KEY}\n endpoint:\n base_url: https://api.deepseek.com\n zhipu:\n spec: zhipu\n credentials:\n api_key: ${ZHIPU_API_KEY}\n endpoint:\n base_url: https://open.bigmodel.cn/api/coding/paas/v4\n minimax:\n spec: minimax\n credentials:\n api_key: ${MINIMAX_API_KEY}\n endpoint:\n base_url: https://api.minimaxi.com/v1\n xiaomi:\n spec: xiaomi\n credentials:\n api_key: ${MIMO_API_KEY}\n endpoint:\n base_url: https://api.xiaomimimo.com/v1\n\nsession:\n backend: sqlite\n sqlite:\n path: ./data/sessions.db\n\nlogging:\n level: info\n\ntrace:\n enabled: true\n path: ./data/trace.db\n capture_payload: false\n```\n\nStart the server:\n\n```bash\ngodex serve --config ./godex.yaml\n```\n\nDuring development you can run from source:\n\n```bash\nbun run dev\n```\n\nThe dev command starts GodeX on port `13145`; the default runtime config port is `5678`.\n\n## API\n\n### Health\n\n```bash\ncurl http://localhost:5678/health\n```\n\n### Models\n\n```bash\ncurl http://localhost:5678/v1/models\n```\n\n`/v1/models` lists configured aliases, excluding the wildcard alias `*`.\n\n### Responses\n\n```bash\ncurl http://localhost:5678/v1/responses \\\n -H 'content-type: application/json' \\\n -d '{\n \"model\": \"gpt-5.5\",\n \"input\": \"Write a short TypeScript function that adds two numbers.\"\n }'\n```\n\nStreaming uses standard Responses SSE event names:\n\n```bash\ncurl -N http://localhost:5678/v1/responses \\\n -H 'content-type: application/json' \\\n -d '{\n \"model\": \"gpt-5.5\",\n \"stream\": true,\n \"input\": \"Explain Bun streams in two sentences.\"\n }'\n```\n\n## Model Routing\n\nClients may pass either:\n\n- A provider-qualified selector such as `deepseek/deepseek-v4-pro`\n- A configured alias such as `gpt-5.5`\n- A bare model name, which resolves through `default_provider` when no alias matches\n\nAliases must map to `provider/model` values, and the provider must exist in `providers`.\n\n## Provider Bridge Behavior\n\nGodeX builds a provider request in three steps:\n\n1. Resolve the client model selector to a configured provider and upstream model.\n2. Plan compatibility from the provider `ProviderSpec`, including request parameters, tool declarations, `tool_choice`, response format, reasoning, and stream usage.\n3. Convert Responses input and session history into Chat Completions messages, call the upstream provider, and reconstruct a Responses object or Responses SSE stream.\n\nProvider-specific differences belong in each provider's `spec.ts`, `hooks.ts`, protocol types, and HTTP client. Shared Responses-to-Chat policy belongs under `src/bridge`.\n\n## Structured Output\n\nWhen a provider supports `json_object` but not native `json_schema`, GodeX can degrade strict `json_schema` requests to `json_object`.\n\nFor strict downgraded schemas:\n\n- The schema instruction is added to the provider prompt preamble for the current request.\n- The provider receives `response_format: { \"type\": \"json_object\" }`.\n- GodeX validates that the final output is valid JSON.\n- Invalid sync output fails the response; invalid stream output is rewritten to a terminal `response.failed` event.\n\nThe validator checks JSON syntax, not full JSON Schema conformance.\n\n## Sessions\n\nResponses can be stored and replayed with `previous_response_id`.\n\n- `session.backend: memory` keeps history in process memory.\n- `session.backend: sqlite` persists history to SQLite.\n- Requests with `store: false` are not saved.\n- The session chain stores request snapshots and response output items, then rebuilds provider-neutral history on the next turn.\n\n## Trace Database\n\nTracing is enabled by default and writes SQLite rows to `./data/trace.db` unless configured otherwise.\n\nTrace records include:\n\n- Provider request metadata\n- Provider request and response bodies as summarized payloads\n- Raw and transformed stream events\n- Usage details, including cached tokens when provided by the upstream\n- Route and provider errors\n\nSet `trace.capture_payload: true` to persist payload JSON up to `trace.payload_max_bytes`. Keep it disabled for sensitive environments.\n\n## Development\n\n```bash\nbun install # Install dependencies\nbun run dev # Dev server with hot reload on port 13145\nbun run start # Start server from source\nbun run build # Build a binary for the current platform\nbun run compile:all # Cross-compile all supported platform packages\n```\n\nQuality gates:\n\n```bash\nbun run typecheck # TypeScript\nbun run lint # Biome check\nbun run lint:fix # Biome autofix\nbun run format # Biome format\nbun run test # Unit and integration tests, excluding src/e2e\nbun run test:e2e # Mocked end-to-end tests\nbun run test:zhipu # Live Zhipu tests; requires ZHIPU_API_KEY\nbun run test:deepseek # Live DeepSeek tests; requires DEEPSEEK_API_KEY\nbun run test:minimax # Live MiniMax tests; requires MINIMAX_API_KEY\nbun run test:xiaomi # Live Xiaomi tests; requires MIMO_API_KEY\nbun run check # typecheck + lint + test\nbun run ci # typecheck + biome ci + test + e2e\n```\n\n## Source Map\n\n```text\nsrc/\n cli/ Commander CLI, init wizard, runtime config loading\n config/ godex.yaml schema, defaults, env interpolation\n context/ ApplicationContext and per-request ResponsesContext\n bridge/ Provider-agnostic Responses-to-Chat planning and reconstruction\n providers/ Built-in provider specs, hooks, clients, and registry\n responses/ Sync and stream request pipelines\n server/ Bun routes for /health, /v1/models, /v1/responses\n session/ Memory and SQLite response session stores\n trace/ SQLite trace recorder and usage/error/event mappers\n protocol/ OpenAI protocol type definitions\n error/ GodeXError hierarchy and domain codes\n```\n\n## Provider Development\n\nProvider folders follow this shape:\n\n```text\nsrc/providers/<name>/\n spec.ts ProviderSpec declaration\n client.ts ProviderEdge construction with ChatProviderClient\n hooks.ts Provider-specific patching, accessors, usage, stream deltas\n protocol/ Provider DTOs when needed\n index.ts Public exports\n```\n\nAdd shared compatibility policy to `src/bridge`; add shared provider transport or protocol helpers to `src/providers/shared`.\n\n## License\n\nApache-2.0. See [LICENSE](./LICENSE).\n"}, "101ceb263ea68ea8a1ea28820902fadc5442f283": {"t": 1785748581.7574787, "n": 12959, "h": "d76fa2965cde857b", "c": "<div align=\"center\">\n\n<img src=\"design/assets/01-logo-system/png/godex-logo-horizontal-transparent-800x233.png\" alt=\"GodeX\" width=\"480\" />\n\n**Make every model a Codex engine.**\n\nOpenAI-compatible Responses API gateway for coding models that expose Chat Completions APIs.\n\n[](https://www.npmjs.com/package/@ahoo-wang/godex)\n[](https://codecov.io/gh/Ahoo-Wang/GodeX)\n[](https://bun.sh)\n[](https://www.typescriptlang.org/)\n\n</div>\n\nGodeX lets clients that speak the OpenAI Responses API use providers such as DeepSeek, MiniMax, and Zhipu through one local server.\n\n## Highlights\n\n- OpenAI-compatible `POST /v1/responses` endpoint with sync and streaming responses.\n- `GET /v1/models` aliases so clients can use stable model names while GodeX routes to provider/model targets.\n- Built-in bridge providers for DeepSeek, MiniMax, and Zhipu.\n- Provider capability planning for request parameters, tools, `tool_choice`, structured output formats, reasoning, and stream usage.\n- Responses `previous_response_id` session chains backed by memory or SQLite.\n- Trace recording for provider requests, provider responses, stream events, usage, and errors.\n- Native Bun runtime, TypeScript source, and compiled platform binaries for releases.\n\n## Built-in Providers\n\n| Provider | Reasoning | Tool Choice | Response Format | Cached Tokens | Default Model |\n|----------|-----------|-------------|-----------------|---------------|---------------|\n| DeepSeek | native | auto, none, required, function | text, json_object | ✅ | `deepseek-v4-pro` |\n| MiniMax | none | auto, none, required, function | text, json_object | ✅ | `MiniMax-M2.7` |\n| Zhipu | boolean | auto, none | text, json_object | ✅ | `glm-5.1` |\n\n## Architecture\n\n```mermaid\nflowchart TB\n Client[\"Client<br>Codex, SDK, CLI, IDE\"] --> Routes[\"Bun server routes<br>/health<br>/v1/models<br>/v1/responses\"]\n Routes --> Ctx[\"ResponsesContext<br>request id, response id, resolved model,<br>provider, session, diagnostics\"]\n\n Ctx --> Resolver[\"ModelResolver<br>alias and provider/model selection\"]\n Ctx --> Session[\"ResponseSessionStore<br>memory or SQLite<br>previous_response_id chains\"]\n Ctx --> Registrar[\"Registrar<br>built-in ProviderEdge factories\"]\n Ctx --> Runtime[\"ResponsesBridgeRuntime\"]\n\n Runtime --> Sync[\"SyncRequestPipeline\"]\n Runtime --> Stream[\"StreamPipeline\"]\n Sync --> Exchange[\"ProviderExchange\"]\n Stream --> Exchange\n\n Exchange --> Builder[\"bridge/request<br>buildChatCompletionRequest\"]\n Builder --> Compat[\"bridge/compatibility<br>parameter and response-format decisions\"]\n Builder --> Tools[\"bridge/tools<br>tool declarations, tool_choice,<br>identity restoration\"]\n Builder --> Output[\"bridge/output<br>structured-output contract\"]\n\n Exchange --> Edge[\"ProviderEdge<br>ProviderSpec + hooks\"]\n Edge --> ClientHttp[\"ChatProviderClient<br>Fetcher HTTP boundary\"]\n ClientHttp --> Upstream[\"Chat Completions upstream<br>DeepSeek, MiniMax, Zhipu, custom\"]\n\n Upstream --> SyncRecon[\"bridge/response<br>reconstructResponseObject\"]\n Upstream --> StreamRecon[\"bridge/stream<br>ResponseStreamStateMachine\"]\n SyncRecon --> ResponseJson[\"ResponseObject JSON\"]\n StreamRecon --> StreamTransforms[\"stream transforms<br>validate, trace, log, persist, diagnostics\"]\n StreamTransforms --> Sse[\"Responses SSE\"]\n\n Ctx --> Trace[\"trace recorder<br>request, usage, event, error rows\"]\n Ctx --> Logger[\"structured logger\"]\n```\n\n## Component Interaction\n\n```mermaid\nsequenceDiagram\n autonumber\n actor Client\n participant Server as /v1/responses route\n participant Context as ResponsesContext factory\n participant Resolver as ModelResolver\n participant Store as ResponseSessionStore\n participant Registrar\n participant Runtime as ResponsesBridgeRuntime\n participant Exchange as ProviderExchange\n participant Bridge as bridge/request\n participant Provider as ProviderEdge\n participant Upstream as Chat Completions API\n\n Client->>Server: POST /v1/responses\n Server->>Server: parse and validate JSON envelope\n Server->>Context: create(app, body)\n Context->>Resolver: resolve(body.model)\n Resolver-->>Context: provider + upstream model\n opt previous_response_id\n Context->>Store: resolveChain(previous_response_id)\n Store-->>Context: ordered session snapshot\n end\n Context->>Registrar: resolve(provider)\n Registrar-->>Context: ProviderEdge\n Server->>Runtime: request(ctx) or stream(ctx)\n Runtime->>Exchange: build and send provider request\n Exchange->>Bridge: buildChatCompletionRequest(ctx)\n Bridge-->>Exchange: chat request + compatibility/tool/output plans\n Exchange->>Provider: request(body) or stream(body)\n Provider->>Upstream: POST /chat/completions\n Upstream-->>Provider: JSON response or SSE chunks\n alt sync\n Provider-->>Exchange: provider response\n Exchange-->>Runtime: provider response + plans\n Runtime->>Store: save completed response unless store=false\n Runtime-->>Server: ResponseObject\n Server-->>Client: JSON\n else stream\n Provider-->>Exchange: provider SSE stream\n Exchange-->>Runtime: stream + plans\n Runtime->>Runtime: bridge deltas, validate output, trace, log, persist\n Runtime-->>Server: ResponseStreamEvent stream\n Server-->>Client: text/event-stream\n end\n```\n\n## Install\n\nFor local development:\n\n```bash\ngit clone https://github.com/Ahoo-Wang/GodeX.git\ncd GodeX\nbun install\n```\n\nFor package use, install the published package and run the `godex` binary:\n\n```bash\nnpm install -g @ahoo-wang/godex\ngodex --help\n```\n\n### Docker\n\nPre-built images are published to Docker Hub and GitHub Container Registry:\n\n```bash\ndocker pull ahoowang/godex:latest\n# or\ndocker pull ghcr.io/ahoo-wang/godex:latest\n```\n\nRun with a config file:\n\n```bash\ndocker run -d \\\n --name godex \\\n -p 5678:5678 \\\n -e ZHIPU_API_KEY=your-key \\\n -e DEEPSEEK_API_KEY=your-key \\\n -e MINIMAX_API_KEY=your-key \\\n -v ./godex.yaml:/etc/godex/godex.yaml:ro \\\n -v godex-data:/data \\\n ahoowang/godex:latest\n```\n\nThe image supports `linux/amd64` and `linux/arm64`.\n\n- Config file: `/etc/godex/godex.yaml`\n- Data directory (sessions, trace): `/data`\n- Default port: `5678`\n\n## Quick Start\n\nCreate a config interactively:\n\n```bash\ngodex init\n```\n\nOr create `godex.yaml` manually:\n\n```yaml\nserver:\n port: 5678\n host: 0.0.0.0\n\ndefault_provider: deepseek\n\nmodels:\n aliases:\n gpt-5.5: deepseek/deepseek-v4-pro\n glm: zhipu/glm-5.1\n \"*\": deepseek/deepseek-v4-flash\n\nproviders:\n deepseek:\n spec: deepseek\n credentials:\n api_key: ${DEEPSEEK_API_KEY}\n endpoint:\n base_url: https://api.deepseek.com\n zhipu:\n spec: zhipu\n credentials:\n api_key: ${ZHIPU_API_KEY}\n endpoint:\n base_url: https://open.bigmodel.cn/api/coding/paas/v4\n minimax:\n spec: minimax\n credentials:\n api_key: ${MINIMAX_API_KEY}\n endpoint:\n base_url: https://api.minimaxi.com/v1\n\nsession:\n backend: sqlite\n sqlite:\n path: ./data/sessions.db\n\nlogging:\n level: info\n\ntrace:\n enabled: true\n path: ./data/trace.db\n capture_payload: false\n```\n\nStart the server:\n\n```bash\ngodex serve --config ./godex.yaml\n```\n\nDuring development you can run from source:\n\n```bash\nbun run dev\n```\n\nThe dev command starts GodeX on port `13145`; the default runtime config port is `5678`.\n\n## API\n\n### Health\n\n```bash\ncurl http://localhost:5678/health\n```\n\n### Models\n\n```bash\ncurl http://localhost:5678/v1/models\n```\n\n`/v1/models` lists configured aliases, excluding the wildcard alias `*`.\n\n### Responses\n\n```bash\ncurl http://localhost:5678/v1/responses \\\n -H 'content-type: application/json' \\\n -d '{\n \"model\": \"gpt-5.5\",\n \"input\": \"Write a short TypeScript function that adds two numbers.\"\n }'\n```\n\nStreaming uses standard Responses SSE event names:\n\n```bash\ncurl -N http://localhost:5678/v1/responses \\\n -H 'content-type: application/json' \\\n -d '{\n \"model\": \"gpt-5.5\",\n \"stream\": true,\n \"input\": \"Explain Bun streams in two sentences.\"\n }'\n```\n\n## Model Routing\n\nClients may pass either:\n\n- A provider-qualified selector such as `deepseek/deepseek-v4-pro`\n- A configured alias such as `gpt-5.5`\n- A bare model name, which resolves through `default_provider` when no alias matches\n\nAliases must map to `provider/model` values, and the provider must exist in `providers`.\n\n## Provider Bridge Behavior\n\nGodeX builds a provider request in three steps:\n\n1. Resolve the client model selector to a configured provider and upstream model.\n2. Plan compatibility from the provider `ProviderSpec`, including request parameters, tool declarations, `tool_choice`, response format, reasoning, and stream usage.\n3. Convert Responses input and session history into Chat Completions messages, call the upstream provider, and reconstruct a Responses object or Responses SSE stream.\n\nProvider-specific differences belong in each provider's `spec.ts`, `hooks.ts`, protocol types, and HTTP client. Shared Responses-to-Chat policy belongs under `src/bridge`.\n\n## Structured Output\n\nWhen a provider supports `json_object` but not native `json_schema`, GodeX can degrade strict `json_schema` requests to `json_object`.\n\nFor strict downgraded schemas:\n\n- The schema instruction is added to the provider prompt preamble for the current request.\n- The provider receives `response_format: { \"type\": \"json_object\" }`.\n- GodeX validates that the final output is valid JSON.\n- Invalid sync output fails the response; invalid stream output is rewritten to a terminal `response.failed` event.\n\nThe validator checks JSON syntax, not full JSON Schema conformance.\n\n## Sessions\n\nResponses can be stored and replayed with `previous_response_id`.\n\n- `session.backend: memory` keeps history in process memory.\n- `session.backend: sqlite` persists history to SQLite.\n- Requests with `store: false` are not saved.\n- The session chain stores request snapshots and response output items, then rebuilds provider-neutral history on the next turn.\n\n## Trace Database\n\nTracing is enabled by default and writes SQLite rows to `./data/trace.db` unless configured otherwise.\n\nTrace records include:\n\n- Provider request metadata\n- Provider request and response bodies as summarized payloads\n- Raw and transformed stream events\n- Usage details, including cached tokens when provided by the upstream\n- Route and provider errors\n\nSet `trace.capture_payload: true` to persist payload JSON up to `trace.payload_max_bytes`. Keep it disabled for sensitive environments.\n\n## Development\n\n```bash\nbun install # Install dependencies\nbun run dev # Dev server with hot reload on port 13145\nbun run start # Start server from source\nbun run build # Build a binary for the current platform\nbun run compile:all # Cross-compile all supported platform packages\n```\n\nQuality gates:\n\n```bash\nbun run typecheck # TypeScript\nbun run lint # Biome check\nbun run lint:fix # Biome autofix\nbun run format # Biome format\nbun run test # Unit and integration tests, excluding src/e2e\nbun run test:e2e # Mocked end-to-end tests\nbun run test:zhipu # Live Zhipu tests; requires ZHIPU_API_KEY\nbun run test:deepseek # Live DeepSeek tests; requires DEEPSEEK_API_KEY\nbun run test:minimax # Live MiniMax tests; requires MINIMAX_API_KEY\nbun run check # typecheck + lint + test\nbun run ci # typecheck + biome ci + test + e2e\n```\n\n## Source Map\n\n```text\nsrc/\n cli/ Commander CLI, init wizard, runtime config loading\n config/ godex.yaml schema, defaults, env interpolation\n context/ ApplicationContext and per-request ResponsesContext\n bridge/ Provider-agnostic Responses-to-Chat planning and reconstruction\n providers/ Built-in provider specs, hooks, clients, and registry\n responses/ Sync and stream request pipelines\n server/ Bun routes for /health, /v1/models, /v1/responses\n session/ Memory and SQLite response session stores\n trace/ SQLite trace recorder and usage/error/event mappers\n protocol/ OpenAI protocol type definitions\n error/ GodeXError hierarchy and domain codes\n```\n\n## Provider Development\n\nProvider folders follow this shape:\n\n```text\nsrc/providers/<name>/\n spec.ts ProviderSpec declaration\n client.ts ProviderEdge construction with ChatProviderClient\n hooks.ts Provider-specific patching, accessors, usage, stream deltas\n protocol/ Provider DTOs when needed\n index.ts Public exports\n```\n\nAdd shared compatibility policy to `src/bridge`; add shared provider transport or protocol helpers to `src/providers/shared`.\n\n## License\n\nApache-2.0. See [LICENSE](./LICENSE).\n"}, "a8af5f8b9bdb48050a26dbb64721c2d81f8431ba": {"t": 1785748582.8205948, "n": 12491, "h": "872159e1493a16e9", "c": "<div align=\"center\">\n\n<img src=\"design/assets/01-logo-system/png/godex-logo-horizontal-transparent-800x233.png\" alt=\"GodeX\" width=\"480\" />\n\n**Make every model a Codex engine.**\n\nOpenAI-compatible Responses API gateway for coding models that expose Chat Completions APIs.\n\n[](https://www.npmjs.com/package/@ahoo-wang/godex)\n[](https://codecov.io/gh/Ahoo-Wang/GodeX)\n[](https://bun.sh)\n[](https://www.typescriptlang.org/)\n\n</div>\n\nGodeX lets clients that speak the OpenAI Responses API use providers such as DeepSeek, MiniMax, and Zhipu through one local server.\n\n## Highlights\n\n- OpenAI-compatible `POST /v1/responses` endpoint with sync and streaming responses.\n- `GET /v1/models` aliases so clients can use stable model names while GodeX routes to provider/model targets.\n- Built-in bridge providers for DeepSeek, MiniMax, and Zhipu.\n- Provider capability planning for request parameters, tools, `tool_choice`, structured output formats, reasoning, and stream usage.\n- Responses `previous_response_id` session chains backed by memory or SQLite.\n- Trace recording for provider requests, provider responses, stream events, usage, and errors.\n- Native Bun runtime, TypeScript source, and compiled platform binaries for releases.\n\n## Architecture\n\n```mermaid\nflowchart TB\n Client[\"Client<br>Codex, SDK, CLI, IDE\"] --> Routes[\"Bun server routes<br>/health<br>/v1/models<br>/v1/responses\"]\n Routes --> Ctx[\"ResponsesContext<br>request id, response id, resolved model,<br>provider, session, diagnostics\"]\n\n Ctx --> Resolver[\"ModelResolver<br>alias and provider/model selection\"]\n Ctx --> Session[\"ResponseSessionStore<br>memory or SQLite<br>previous_response_id chains\"]\n Ctx --> Registrar[\"Registrar<br>built-in ProviderEdge factories\"]\n Ctx --> Runtime[\"ResponsesBridgeRuntime\"]\n\n Runtime --> Sync[\"SyncRequestPipeline\"]\n Runtime --> Stream[\"StreamPipeline\"]\n Sync --> Exchange[\"ProviderExchange\"]\n Stream --> Exchange\n\n Exchange --> Builder[\"bridge/request<br>buildChatCompletionRequest\"]\n Builder --> Compat[\"bridge/compatibility<br>parameter and response-format decisions\"]\n Builder --> Tools[\"bridge/tools<br>tool declarations, tool_choice,<br>identity restoration\"]\n Builder --> Output[\"bridge/output<br>structured-output contract\"]\n\n Exchange --> Edge[\"ProviderEdge<br>ProviderSpec + hooks\"]\n Edge --> ClientHttp[\"ChatProviderClient<br>Fetcher HTTP boundary\"]\n ClientHttp --> Upstream[\"Chat Completions upstream<br>DeepSeek, MiniMax, Zhipu, custom\"]\n\n Upstream --> SyncRecon[\"bridge/response<br>reconstructResponseObject\"]\n Upstream --> StreamRecon[\"bridge/stream<br>ResponseStreamStateMachine\"]\n SyncRecon --> ResponseJson[\"ResponseObject JSON\"]\n StreamRecon --> StreamTransforms[\"stream transforms<br>validate, trace, log, persist, diagnostics\"]\n StreamTransforms --> Sse[\"Responses SSE\"]\n\n Ctx --> Trace[\"trace recorder<br>request, usage, event, error rows\"]\n Ctx --> Logger[\"structured logger\"]\n```\n\n## Component Interaction\n\n```mermaid\nsequenceDiagram\n autonumber\n actor Client\n participant Server as /v1/responses route\n participant Context as ResponsesContext factory\n participant Resolver as ModelResolver\n participant Store as ResponseSessionStore\n participant Registrar\n participant Runtime as ResponsesBridgeRuntime\n participant Exchange as ProviderExchange\n participant Bridge as bridge/request\n participant Provider as ProviderEdge\n participant Upstream as Chat Completions API\n\n Client->>Server: POST /v1/responses\n Server->>Server: parse and validate JSON envelope\n Server->>Context: create(app, body)\n Context->>Resolver: resolve(body.model)\n Resolver-->>Context: provider + upstream model\n opt previous_response_id\n Context->>Store: resolveChain(previous_response_id)\n Store-->>Context: ordered session snapshot\n end\n Context->>Registrar: resolve(provider)\n Registrar-->>Context: ProviderEdge\n Server->>Runtime: request(ctx) or stream(ctx)\n Runtime->>Exchange: build and send provider request\n Exchange->>Bridge: buildChatCompletionRequest(ctx)\n Bridge-->>Exchange: chat request + compatibility/tool/output plans\n Exchange->>Provider: request(body) or stream(body)\n Provider->>Upstream: POST /chat/completions\n Upstream-->>Provider: JSON response or SSE chunks\n alt sync\n Provider-->>Exchange: provider response\n Exchange-->>Runtime: provider response + plans\n Runtime->>Store: save completed response unless store=false\n Runtime-->>Server: ResponseObject\n Server-->>Client: JSON\n else stream\n Provider-->>Exchange: provider SSE stream\n Exchange-->>Runtime: stream + plans\n Runtime->>Runtime: bridge deltas, validate output, trace, log, persist\n Runtime-->>Server: ResponseStreamEvent stream\n Server-->>Client: text/event-stream\n end\n```\n\n## Install\n\nFor local development:\n\n```bash\ngit clone https://github.com/Ahoo-Wang/GodeX.git\ncd GodeX\nbun install\n```\n\nFor package use, install the published package and run the `godex` binary:\n\n```bash\nnpm install -g @ahoo-wang/godex\ngodex --help\n```\n\n### Docker\n\nPre-built images are published to Docker Hub and GitHub Container Registry:\n\n```bash\ndocker pull ahoowang/godex:latest\n# or\ndocker pull ghcr.io/ahoo-wang/godex:latest\n```\n\nRun with a config file:\n\n```bash\ndocker run -d \\\n --name godex \\\n -p 5678:5678 \\\n -e ZHIPU_API_KEY=your-key \\\n -e DEEPSEEK_API_KEY=your-key \\\n -e MINIMAX_API_KEY=your-key \\\n -v ./godex.yaml:/etc/godex/godex.yaml:ro \\\n -v godex-data:/data \\\n ahoowang/godex:latest\n```\n\nThe image supports `linux/amd64` and `linux/arm64`.\n\n- Config file: `/etc/godex/godex.yaml`\n- Data directory (sessions, trace): `/data`\n- Default port: `5678`\n\n## Quick Start\n\nCreate a config interactively:\n\n```bash\ngodex init\n```\n\nOr create `godex.yaml` manually:\n\n```yaml\nserver:\n port: 5678\n host: 0.0.0.0\n\ndefault_provider: deepseek\n\nmodels:\n aliases:\n gpt-5.5: deepseek/deepseek-v4-pro\n glm: zhipu/glm-5.1\n \"*\": deepseek/deepseek-v4-flash\n\nproviders:\n deepseek:\n spec: deepseek\n credentials:\n api_key: ${DEEPSEEK_API_KEY}\n endpoint:\n base_url: https://api.deepseek.com\n zhipu:\n spec: zhipu\n credentials:\n api_key: ${ZHIPU_API_KEY}\n endpoint:\n base_url: https://open.bigmodel.cn/api/coding/paas/v4\n minimax:\n spec: minimax\n credentials:\n api_key: ${MINIMAX_API_KEY}\n endpoint:\n base_url: https://api.minimaxi.com/v1\n\nsession:\n backend: sqlite\n sqlite:\n path: ./data/sessions.db\n\nlogging:\n level: info\n\ntrace:\n enabled: true\n path: ./data/trace.db\n capture_payload: false\n```\n\nStart the server:\n\n```bash\ngodex serve --config ./godex.yaml\n```\n\nDuring development you can run from source:\n\n```bash\nbun run dev\n```\n\nThe dev command starts GodeX on port `13145`; the default runtime config port is `5678`.\n\n## API\n\n### Health\n\n```bash\ncurl http://localhost:5678/health\n```\n\n### Models\n\n```bash\ncurl http://localhost:5678/v1/models\n```\n\n`/v1/models` lists configured aliases, excluding the wildcard alias `*`.\n\n### Responses\n\n```bash\ncurl http://localhost:5678/v1/responses \\\n -H 'content-type: application/json' \\\n -d '{\n \"model\": \"gpt-5.5\",\n \"input\": \"Write a short TypeScript function that adds two numbers.\"\n }'\n```\n\nStreaming uses standard Responses SSE event names:\n\n```bash\ncurl -N http://localhost:5678/v1/responses \\\n -H 'content-type: application/json' \\\n -d '{\n \"model\": \"gpt-5.5\",\n \"stream\": true,\n \"input\": \"Explain Bun streams in two sentences.\"\n }'\n```\n\n## Model Routing\n\nClients may pass either:\n\n- A provider-qualified selector such as `deepseek/deepseek-v4-pro`\n- A configured alias such as `gpt-5.5`\n- A bare model name, which resolves through `default_provider` when no alias matches\n\nAliases must map to `provider/model` values, and the provider must exist in `providers`.\n\n## Provider Bridge Behavior\n\nGodeX builds a provider request in three steps:\n\n1. Resolve the client model selector to a configured provider and upstream model.\n2. Plan compatibility from the provider `ProviderSpec`, including request parameters, tool declarations, `tool_choice`, response format, reasoning, and stream usage.\n3. Convert Responses input and session history into Chat Completions messages, call the upstream provider, and reconstruct a Responses object or Responses SSE stream.\n\nProvider-specific differences belong in each provider's `spec.ts`, `hooks.ts`, protocol types, and HTTP client. Shared Responses-to-Chat policy belongs under `src/bridge`.\n\n## Structured Output\n\nWhen a provider supports `json_object` but not native `json_schema`, GodeX can degrade strict `json_schema` requests to `json_object`.\n\nFor strict downgraded schemas:\n\n- The schema instruction is added to the provider prompt preamble for the current request.\n- The provider receives `response_format: { \"type\": \"json_object\" }`.\n- GodeX validates that the final output is valid JSON.\n- Invalid sync output fails the response; invalid stream output is rewritten to a terminal `response.failed` event.\n\nThe validator checks JSON syntax, not full JSON Schema conformance.\n\n## Sessions\n\nResponses can be stored and replayed with `previous_response_id`.\n\n- `session.backend: memory` keeps history in process memory.\n- `session.backend: sqlite` persists history to SQLite.\n- Requests with `store: false` are not saved.\n- The session chain stores request snapshots and response output items, then rebuilds provider-neutral history on the next turn.\n\n## Trace Database\n\nTracing is enabled by default and writes SQLite rows to `./data/trace.db` unless configured otherwise.\n\nTrace records include:\n\n- Provider request metadata\n- Provider request and response bodies as summarized payloads\n- Raw and transformed stream events\n- Usage details, including cached tokens when provided by the upstream\n- Route and provider errors\n\nSet `trace.capture_payload: true` to persist payload JSON up to `trace.payload_max_bytes`. Keep it disabled for sensitive environments.\n\n## Development\n\n```bash\nbun install # Install dependencies\nbun run dev # Dev server with hot reload on port 13145\nbun run start # Start server from source\nbun run build # Build a binary for the current platform\nbun run compile:all # Cross-compile all supported platform packages\n```\n\nQuality gates:\n\n```bash\nbun run typecheck # TypeScript\nbun run lint # Biome check\nbun run lint:fix # Biome autofix\nbun run format # Biome format\nbun run test # Unit and integration tests, excluding src/e2e\nbun run test:e2e # Mocked end-to-end tests\nbun run test:zhipu # Live Zhipu tests; requires ZHIPU_API_KEY\nbun run test:deepseek # Live DeepSeek tests; requires DEEPSEEK_API_KEY\nbun run test:minimax # Live MiniMax tests; requires MINIMAX_API_KEY\nbun run check # typecheck + lint + test\nbun run ci # typecheck + biome ci + test + e2e\n```\n\n## Source Map\n\n```text\nsrc/\n cli/ Commander CLI, init wizard, runtime config loading\n config/ godex.yaml schema, defaults, env interpolation\n context/ ApplicationContext and per-request ResponsesContext\n bridge/ Provider-agnostic Responses-to-Chat planning and reconstruction\n providers/ Built-in provider specs, hooks, clients, and registry\n responses/ Sync and stream request pipelines\n server/ Bun routes for /health, /v1/models, /v1/responses\n session/ Memory and SQLite response session stores\n trace/ SQLite trace recorder and usage/error/event mappers\n protocol/ OpenAI protocol type definitions\n error/ GodeXError hierarchy and domain codes\n```\n\n## Provider Development\n\nProvider folders follow this shape:\n\n```text\nsrc/providers/<name>/\n spec.ts ProviderSpec declaration\n client.ts ProviderEdge construction with ChatProviderClient\n hooks.ts Provider-specific patching, accessors, usage, stream deltas\n protocol/ Provider DTOs when needed\n index.ts Public exports\n```\n\nAdd shared compatibility policy to `src/bridge`; add shared provider transport or protocol helpers to `src/providers/shared`.\n\n## License\n\nApache-2.0. See [LICENSE](./LICENSE).\n"}, "ee20581d84f68699f28688ba8a6cd23a47e1d258": {"t": 1785748584.0912974, "n": 12138, "h": "934dfcb3df0fd697", "c": "<div align=\"center\">\n\n<img src=\"design/assets/01-logo-system/png/godex-logo-horizontal-transparent-800x233.png\" alt=\"GodeX\" width=\"480\" />\n\n**Make every model a Codex engine.**\n\nOpenAI-compatible Responses API gateway for coding models that expose Chat Completions APIs.\n\n[](https://www.npmjs.com/package/@ahoo-wang/godex)\n[](https://codecov.io/gh/Ahoo-Wang/GodeX)\n[](https://bun.sh)\n[](https://www.typescriptlang.org/)\n\n</div>\n\nGodeX lets clients that speak the OpenAI Responses API use providers such as DeepSeek and Zhipu through one local server.\n\n## Highlights\n\n- OpenAI-compatible `POST /v1/responses` endpoint with sync and streaming responses.\n- `GET /v1/models` aliases so clients can use stable model names while GodeX routes to provider/model targets.\n- Built-in bridge providers for DeepSeek and Zhipu.\n- Provider capability planning for request parameters, tools, `tool_choice`, structured output formats, reasoning, and stream usage.\n- Responses `previous_response_id` session chains backed by memory or SQLite.\n- Trace recording for provider requests, provider responses, stream events, usage, and errors.\n- Native Bun runtime, TypeScript source, and compiled platform binaries for releases.\n\n## Architecture\n\n```mermaid\nflowchart TB\n Client[\"Client<br>Codex, SDK, CLI, IDE\"] --> Routes[\"Bun server routes<br>/health<br>/v1/models<br>/v1/responses\"]\n Routes --> Ctx[\"ResponsesContext<br>request id, response id, resolved model,<br>provider, session, diagnostics\"]\n\n Ctx --> Resolver[\"ModelResolver<br>alias and provider/model selection\"]\n Ctx --> Session[\"ResponseSessionStore<br>memory or SQLite<br>previous_response_id chains\"]\n Ctx --> Registrar[\"Registrar<br>built-in ProviderEdge factories\"]\n Ctx --> Runtime[\"ResponsesBridgeRuntime\"]\n\n Runtime --> Sync[\"SyncRequestPipeline\"]\n Runtime --> Stream[\"StreamPipeline\"]\n Sync --> Exchange[\"ProviderExchange\"]\n Stream --> Exchange\n\n Exchange --> Builder[\"bridge/request<br>buildChatCompletionRequest\"]\n Builder --> Compat[\"bridge/compatibility<br>parameter and response-format decisions\"]\n Builder --> Tools[\"bridge/tools<br>tool declarations, tool_choice,<br>identity restoration\"]\n Builder --> Output[\"bridge/output<br>structured-output contract\"]\n\n Exchange --> Edge[\"ProviderEdge<br>ProviderSpec + hooks\"]\n Edge --> ClientHttp[\"ChatProviderClient<br>Fetcher HTTP boundary\"]\n ClientHttp --> Upstream[\"Chat Completions upstream<br>DeepSeek, Zhipu, custom\"]\n\n Upstream --> SyncRecon[\"bridge/response<br>reconstructResponseObject\"]\n Upstream --> StreamRecon[\"bridge/stream<br>ResponseStreamStateMachine\"]\n SyncRecon --> ResponseJson[\"ResponseObject JSON\"]\n StreamRecon --> StreamTransforms[\"stream transforms<br>validate, trace, log, persist, diagnostics\"]\n StreamTransforms --> Sse[\"Responses SSE\"]\n\n Ctx --> Trace[\"trace recorder<br>request, usage, event, error rows\"]\n Ctx --> Logger[\"structured logger\"]\n```\n\n## Component Interaction\n\n```mermaid\nsequenceDiagram\n autonumber\n actor Client\n participant Server as /v1/responses route\n participant Context as ResponsesContext factory\n participant Resolver as ModelResolver\n participant Store as ResponseSessionStore\n participant Registrar\n participant Runtime as ResponsesBridgeRuntime\n participant Exchange as ProviderExchange\n participant Bridge as bridge/request\n participant Provider as ProviderEdge\n participant Upstream as Chat Completions API\n\n Client->>Server: POST /v1/responses\n Server->>Server: parse and validate JSON envelope\n Server->>Context: create(app, body)\n Context->>Resolver: resolve(body.model)\n Resolver-->>Context: provider + upstream model\n opt previous_response_id\n Context->>Store: resolveChain(previous_response_id)\n Store-->>Context: ordered session snapshot\n end\n Context->>Registrar: resolve(provider)\n Registrar-->>Context: ProviderEdge\n Server->>Runtime: request(ctx) or stream(ctx)\n Runtime->>Exchange: build and send provider request\n Exchange->>Bridge: buildChatCompletionRequest(ctx)\n Bridge-->>Exchange: chat request + compatibility/tool/output plans\n Exchange->>Provider: request(body) or stream(body)\n Provider->>Upstream: POST /chat/completions\n Upstream-->>Provider: JSON response or SSE chunks\n alt sync\n Provider-->>Exchange: provider response\n Exchange-->>Runtime: provider response + plans\n Runtime->>Store: save completed response unless store=false\n Runtime-->>Server: ResponseObject\n Server-->>Client: JSON\n else stream\n Provider-->>Exchange: provider SSE stream\n Exchange-->>Runtime: stream + plans\n Runtime->>Runtime: bridge deltas, validate output, trace, log, persist\n Runtime-->>Server: ResponseStreamEvent stream\n Server-->>Client: text/event-stream\n end\n```\n\n## Install\n\nFor local development:\n\n```bash\ngit clone https://github.com/Ahoo-Wang/GodeX.git\ncd GodeX\nbun install\n```\n\nFor package use, install the published package and run the `godex` binary:\n\n```bash\nnpm install -g @ahoo-wang/godex\ngodex --help\n```\n\n### Docker\n\nPre-built images are published to Docker Hub and GitHub Container Registry:\n\n```bash\ndocker pull ahoowang/godex:latest\n# or\ndocker pull ghcr.io/ahoo-wang/godex:latest\n```\n\nRun with a config file:\n\n```bash\ndocker run -d \\\n --name godex \\\n -p 5678:5678 \\\n -e ZHIPU_API_KEY=your-key \\\n -e DEEPSEEK_API_KEY=your-key \\\n -v ./godex.yaml:/etc/godex/godex.yaml:ro \\\n -v godex-data:/data \\\n ahoowang/godex:latest\n```\n\nThe image supports `linux/amd64` and `linux/arm64`.\n\n- Config file: `/etc/godex/godex.yaml`\n- Data directory (sessions, trace): `/data`\n- Default port: `5678`\n\n## Quick Start\n\nCreate a config interactively:\n\n```bash\ngodex init\n```\n\nOr create `godex.yaml` manually:\n\n```yaml\nserver:\n port: 5678\n host: 0.0.0.0\n\ndefault_provider: deepseek\n\nmodels:\n aliases:\n gpt-5.5: deepseek/deepseek-v4-pro\n glm: zhipu/glm-5.1\n \"*\": deepseek/deepseek-v4-flash\n\nproviders:\n deepseek:\n spec: deepseek\n credentials:\n api_key: ${DEEPSEEK_API_KEY}\n endpoint:\n base_url: https://api.deepseek.com\n zhipu:\n spec: zhipu\n credentials:\n api_key: ${ZHIPU_API_KEY}\n endpoint:\n base_url: https://open.bigmodel.cn/api/coding/paas/v4\n\nsession:\n backend: sqlite\n sqlite:\n path: ./data/sessions.db\n\nlogging:\n level: info\n\ntrace:\n enabled: true\n path: ./data/trace.db\n capture_payload: false\n```\n\nStart the server:\n\n```bash\ngodex serve --config ./godex.yaml\n```\n\nDuring development you can run from source:\n\n```bash\nbun run dev\n```\n\nThe dev command starts GodeX on port `13145`; the default runtime config port is `5678`.\n\n## API\n\n### Health\n\n```bash\ncurl http://localhost:5678/health\n```\n\n### Models\n\n```bash\ncurl http://localhost:5678/v1/models\n```\n\n`/v1/models` lists configured aliases, excluding the wildcard alias `*`.\n\n### Responses\n\n```bash\ncurl http://localhost:5678/v1/responses \\\n -H 'content-type: application/json' \\\n -d '{\n \"model\": \"gpt-5.5\",\n \"input\": \"Write a short TypeScript function that adds two numbers.\"\n }'\n```\n\nStreaming uses standard Responses SSE event names:\n\n```bash\ncurl -N http://localhost:5678/v1/responses \\\n -H 'content-type: application/json' \\\n -d '{\n \"model\": \"gpt-5.5\",\n \"stream\": true,\n \"input\": \"Explain Bun streams in two sentences.\"\n }'\n```\n\n## Model Routing\n\nClients may pass either:\n\n- A provider-qualified selector such as `deepseek/deepseek-v4-pro`\n- A configured alias such as `gpt-5.5`\n- A bare model name, which resolves through `default_provider` when no alias matches\n\nAliases must map to `provider/model` values, and the provider must exist in `providers`.\n\n## Provider Bridge Behavior\n\nGodeX builds a provider request in three steps:\n\n1. Resolve the client model selector to a configured provider and upstream model.\n2. Plan compatibility from the provider `ProviderSpec`, including request parameters, tool declarations, `tool_choice`, response format, reasoning, and stream usage.\n3. Convert Responses input and session history into Chat Completions messages, call the upstream provider, and reconstruct a Responses object or Responses SSE stream.\n\nProvider-specific differences belong in each provider's `spec.ts`, `hooks.ts`, protocol types, and HTTP client. Shared Responses-to-Chat policy belongs under `src/bridge`.\n\n## Structured Output\n\nWhen a provider supports `json_object` but not native `json_schema`, GodeX can degrade strict `json_schema` requests to `json_object`.\n\nFor strict downgraded schemas:\n\n- The schema instruction is added to the provider prompt preamble for the current request.\n- The provider receives `response_format: { \"type\": \"json_object\" }`.\n- GodeX validates that the final output is valid JSON.\n- Invalid sync output fails the response; invalid stream output is rewritten to a terminal `response.failed` event.\n\nThe validator checks JSON syntax, not full JSON Schema conformance.\n\n## Sessions\n\nResponses can be stored and replayed with `previous_response_id`.\n\n- `session.backend: memory` keeps history in process memory.\n- `session.backend: sqlite` persists history to SQLite.\n- Requests with `store: false` are not saved.\n- The session chain stores request snapshots and response output items, then rebuilds provider-neutral history on the next turn.\n\n## Trace Database\n\nTracing is enabled by default and writes SQLite rows to `./data/trace.db` unless configured otherwise.\n\nTrace records include:\n\n- Provider request metadata\n- Provider request and response bodies as summarized payloads\n- Raw and transformed stream events\n- Usage details, including cached tokens when provided by the upstream\n- Route and provider errors\n\nSet `trace.capture_payload: true` to persist payload JSON up to `trace.payload_max_bytes`. Keep it disabled for sensitive environments.\n\n## Development\n\n```bash\nbun install # Install dependencies\nbun run dev # Dev server with hot reload on port 13145\nbun run start # Start server from source\nbun run build # Build a binary for the current platform\nbun run compile:all # Cross-compile all supported platform packages\n```\n\nQuality gates:\n\n```bash\nbun run typecheck # TypeScript\nbun run lint # Biome check\nbun run lint:fix # Biome autofix\nbun run format # Biome format\nbun run test # Unit and integration tests, excluding src/e2e\nbun run test:e2e # Mocked end-to-end tests\nbun run test:zhipu # Live Zhipu tests; requires ZHIPU_API_KEY\nbun run check # typecheck + lint + test\nbun run ci # typecheck + biome ci + test + e2e\n```\n\n## Source Map\n\n```text\nsrc/\n cli/ Commander CLI, init wizard, runtime config loading\n config/ godex.yaml schema, defaults, env interpolation\n context/ ApplicationContext and per-request ResponsesContext\n bridge/ Provider-agnostic Responses-to-Chat planning and reconstruction\n providers/ Built-in provider specs, hooks, clients, and registry\n responses/ Sync and stream request pipelines\n server/ Bun routes for /health, /v1/models, /v1/responses\n session/ Memory and SQLite response session stores\n trace/ SQLite trace recorder and usage/error/event mappers\n protocol/ OpenAI protocol type definitions\n error/ GodeXError hierarchy and domain codes\n```\n\n## Provider Development\n\nProvider folders follow this shape:\n\n```text\nsrc/providers/<name>/\n spec.ts ProviderSpec declaration\n client.ts ProviderEdge construction with ChatProviderClient\n hooks.ts Provider-specific patching, accessors, usage, stream deltas\n protocol/ Provider DTOs when needed\n index.ts Public exports\n```\n\nAdd shared compatibility policy to `src/bridge`; add shared provider transport or protocol helpers to `src/providers/shared`.\n\n## License\n\nApache-2.0. See [LICENSE](./LICENSE).\n"}, "f2212a8595ffadf31d446bb3acb5e4a95bfa90e1": {"t": 1785748585.1749413, "n": 11550, "h": "c8ccb6cbc589a9a1", "c": "<div align=\"center\">\n\n<img src=\"design/assets/01-logo-system/png/godex-logo-horizontal-transparent-800x233.png\" alt=\"GodeX\" width=\"480\" />\n\n**Make every model a Codex engine.**\n\nOpenAI-compatible Responses API gateway for coding models that expose Chat Completions APIs.\n\n[](https://www.npmjs.com/package/@ahoo-wang/godex)\n[](https://codecov.io/gh/Ahoo-Wang/GodeX)\n[](https://bun.sh)\n[](https://www.typescriptlang.org/)\n\n</div>\n\nGodeX lets clients that speak the OpenAI Responses API use providers such as DeepSeek and Zhipu through one local server.\n\n## Highlights\n\n- OpenAI-compatible `POST /v1/responses` endpoint with sync and streaming responses.\n- `GET /v1/models` aliases so clients can use stable model names while GodeX routes to provider/model targets.\n- Built-in bridge providers for DeepSeek and Zhipu.\n- Provider capability planning for request parameters, tools, `tool_choice`, structured output formats, reasoning, and stream usage.\n- Responses `previous_response_id` session chains backed by memory or SQLite.\n- Trace recording for provider requests, provider responses, stream events, usage, and errors.\n- Native Bun runtime, TypeScript source, and compiled platform binaries for releases.\n\n## Architecture\n\n```mermaid\nflowchart TB\n Client[\"Client<br>Codex, SDK, CLI, IDE\"] --> Routes[\"Bun server routes<br>/health<br>/v1/models<br>/v1/responses\"]\n Routes --> Ctx[\"ResponsesContext<br>request id, response id, resolved model,<br>provider, session, diagnostics\"]\n\n Ctx --> Resolver[\"ModelResolver<br>alias and provider/model selection\"]\n Ctx --> Session[\"ResponseSessionStore<br>memory or SQLite<br>previous_response_id chains\"]\n Ctx --> Registrar[\"Registrar<br>built-in ProviderEdge factories\"]\n Ctx --> Runtime[\"ResponsesBridgeRuntime\"]\n\n Runtime --> Sync[\"SyncRequestPipeline\"]\n Runtime --> Stream[\"StreamPipeline\"]\n Sync --> Exchange[\"ProviderExchange\"]\n Stream --> Exchange\n\n Exchange --> Builder[\"bridge/request<br>buildChatCompletionRequest\"]\n Builder --> Compat[\"bridge/compatibility<br>parameter and response-format decisions\"]\n Builder --> Tools[\"bridge/tools<br>tool declarations, tool_choice,<br>identity restoration\"]\n Builder --> Output[\"bridge/output<br>structured-output contract\"]\n\n Exchange --> Edge[\"ProviderEdge<br>ProviderSpec + hooks\"]\n Edge --> ClientHttp[\"ChatProviderClient<br>Fetcher HTTP boundary\"]\n ClientHttp --> Upstream[\"Chat Completions upstream<br>DeepSeek, Zhipu, custom\"]\n\n Upstream --> SyncRecon[\"bridge/response<br>reconstructResponseObject\"]\n Upstream --> StreamRecon[\"bridge/stream<br>ResponseStreamStateMachine\"]\n SyncRecon --> ResponseJson[\"ResponseObject JSON\"]\n StreamRecon --> StreamTransforms[\"stream transforms<br>validate, trace, log, persist, diagnostics\"]\n StreamTransforms --> Sse[\"Responses SSE\"]\n\n Ctx --> Trace[\"trace recorder<br>request, usage, event, error rows\"]\n Ctx --> Logger[\"structured logger\"]\n```\n\n## Component Interaction\n\n```mermaid\nsequenceDiagram\n autonumber\n actor Client\n participant Server as /v1/responses route\n participant Context as ResponsesContext factory\n participant Resolver as ModelResolver\n participant Store as ResponseSessionStore\n participant Registrar\n participant Runtime as ResponsesBridgeRuntime\n participant Exchange as ProviderExchange\n participant Bridge as bridge/request\n participant Provider as ProviderEdge\n participant Upstream as Chat Completions API\n\n Client->>Server: POST /v1/responses\n Server->>Server: parse and validate JSON envelope\n Server->>Context: create(app, body)\n Context->>Resolver: resolve(body.model)\n Resolver-->>Context: provider + upstream model\n opt previous_response_id\n Context->>Store: resolveChain(previous_response_id)\n Store-->>Context: ordered session snapshot\n end\n Context->>Registrar: resolve(provider)\n Registrar-->>Context: ProviderEdge\n Server->>Runtime: request(ctx) or stream(ctx)\n Runtime->>Exchange: build and send provider request\n Exchange->>Bridge: buildChatCompletionRequest(ctx)\n Bridge-->>Exchange: chat request + compatibility/tool/output plans\n Exchange->>Provider: request(body) or stream(body)\n Provider->>Upstream: POST /chat/completions\n Upstream-->>Provider: JSON response or SSE chunks\n alt sync\n Provider-->>Exchange: provider response\n Exchange-->>Runtime: provider response + plans\n Runtime->>Store: save completed response unless store=false\n Runtime-->>Server: ResponseObject\n Server-->>Client: JSON\n else stream\n Provider-->>Exchange: provider SSE stream\n Exchange-->>Runtime: stream + plans\n Runtime->>Runtime: bridge deltas, validate output, trace, log, persist\n Runtime-->>Server: ResponseStreamEvent stream\n Server-->>Client: text/event-stream\n end\n```\n\n## Install\n\nFor local development:\n\n```bash\ngit clone https://github.com/Ahoo-Wang/GodeX.git\ncd GodeX\nbun install\n```\n\nFor package use, install the published package and run the `godex` binary:\n\n```bash\nnpm install -g @ahoo-wang/godex\ngodex --help\n```\n\n## Quick Start\n\nCreate a config interactively:\n\n```bash\ngodex init\n```\n\nOr create `godex.yaml` manually:\n\n```yaml\nserver:\n port: 5678\n host: 0.0.0.0\n\ndefault_provider: deepseek\n\nmodels:\n aliases:\n gpt-5.5: deepseek/deepseek-v4-pro\n glm: zhipu/glm-5.1\n \"*\": deepseek/deepseek-v4-flash\n\nproviders:\n deepseek:\n spec: deepseek\n credentials:\n api_key: ${DEEPSEEK_API_KEY}\n endpoint:\n base_url: https://api.deepseek.com\n zhipu:\n spec: zhipu\n credentials:\n api_key: ${ZHIPU_API_KEY}\n endpoint:\n base_url: https://open.bigmodel.cn/api/coding/paas/v4\n\nsession:\n backend: sqlite\n sqlite:\n path: ./data/sessions.db\n\nlogging:\n level: info\n\ntrace:\n enabled: true\n path: ./data/trace.db\n capture_payload: false\n```\n\nStart the server:\n\n```bash\ngodex serve --config ./godex.yaml\n```\n\nDuring development you can run from source:\n\n```bash\nbun run dev\n```\n\nThe dev command starts GodeX on port `13145`; the default runtime config port is `5678`.\n\n## API\n\n### Health\n\n```bash\ncurl http://localhost:5678/health\n```\n\n### Models\n\n```bash\ncurl http://localhost:5678/v1/models\n```\n\n`/v1/models` lists configured aliases, excluding the wildcard alias `*`.\n\n### Responses\n\n```bash\ncurl http://localhost:5678/v1/responses \\\n -H 'content-type: application/json' \\\n -d '{\n \"model\": \"gpt-5.5\",\n \"input\": \"Write a short TypeScript function that adds two numbers.\"\n }'\n```\n\nStreaming uses standard Responses SSE event names:\n\n```bash\ncurl -N http://localhost:5678/v1/responses \\\n -H 'content-type: application/json' \\\n -d '{\n \"model\": \"gpt-5.5\",\n \"stream\": true,\n \"input\": \"Explain Bun streams in two sentences.\"\n }'\n```\n\n## Model Routing\n\nClients may pass either:\n\n- A provider-qualified selector such as `deepseek/deepseek-v4-pro`\n- A configured alias such as `gpt-5.5`\n- A bare model name, which resolves through `default_provider` when no alias matches\n\nAliases must map to `provider/model` values, and the provider must exist in `providers`.\n\n## Provider Bridge Behavior\n\nGodeX builds a provider request in three steps:\n\n1. Resolve the client model selector to a configured provider and upstream model.\n2. Plan compatibility from the provider `ProviderSpec`, including request parameters, tool declarations, `tool_choice`, response format, reasoning, and stream usage.\n3. Convert Responses input and session history into Chat Completions messages, call the upstream provider, and reconstruct a Responses object or Responses SSE stream.\n\nProvider-specific differences belong in each provider's `spec.ts`, `hooks.ts`, protocol types, and HTTP client. Shared Responses-to-Chat policy belongs under `src/bridge`.\n\n## Structured Output\n\nWhen a provider supports `json_object` but not native `json_schema`, GodeX can degrade strict `json_schema` requests to `json_object`.\n\nFor strict downgraded schemas:\n\n- The schema instruction is added to the provider prompt preamble for the current request.\n- The provider receives `response_format: { \"type\": \"json_object\" }`.\n- GodeX validates that the final output is valid JSON.\n- Invalid sync output fails the response; invalid stream output is rewritten to a terminal `response.failed` event.\n\nThe validator checks JSON syntax, not full JSON Schema conformance.\n\n## Sessions\n\nResponses can be stored and replayed with `previous_response_id`.\n\n- `session.backend: memory` keeps history in process memory.\n- `session.backend: sqlite` persists history to SQLite.\n- Requests with `store: false` are not saved.\n- The session chain stores request snapshots and response output items, then rebuilds provider-neutral history on the next turn.\n\n## Trace Database\n\nTracing is enabled by default and writes SQLite rows to `./data/trace.db` unless configured otherwise.\n\nTrace records include:\n\n- Provider request metadata\n- Provider request and response bodies as summarized payloads\n- Raw and transformed stream events\n- Usage details, including cached tokens when provided by the upstream\n- Route and provider errors\n\nSet `trace.capture_payload: true` to persist payload JSON up to `trace.payload_max_bytes`. Keep it disabled for sensitive environments.\n\n## Development\n\n```bash\nbun install # Install dependencies\nbun run dev # Dev server with hot reload on port 13145\nbun run start # Start server from source\nbun run build # Build a binary for the current platform\nbun run compile:all # Cross-compile all supported platform packages\n```\n\nQuality gates:\n\n```bash\nbun run typecheck # TypeScript\nbun run lint # Biome check\nbun run lint:fix # Biome autofix\nbun run format # Biome format\nbun run test # Unit and integration tests, excluding src/e2e\nbun run test:e2e # Mocked end-to-end tests\nbun run test:zhipu # Live Zhipu tests; requires ZHIPU_API_KEY\nbun run check # typecheck + lint + test\nbun run ci # typecheck + biome ci + test + e2e\n```\n\n## Source Map\n\n```text\nsrc/\n cli/ Commander CLI, init wizard, runtime config loading\n config/ godex.yaml schema, defaults, env interpolation\n context/ ApplicationContext and per-request ResponsesContext\n bridge/ Provider-agnostic Responses-to-Chat planning and reconstruction\n providers/ Built-in provider specs, hooks, clients, and registry\n responses/ Sync and stream request pipelines\n server/ Bun routes for /health, /v1/models, /v1/responses\n session/ Memory and SQLite response session stores\n trace/ SQLite trace recorder and usage/error/event mappers\n protocol/ OpenAI protocol type definitions\n error/ GodeXError hierarchy and domain codes\n```\n\n## Provider Development\n\nProvider folders follow this shape:\n\n```text\nsrc/providers/<name>/\n spec.ts ProviderSpec declaration\n client.ts ProviderEdge construction with ChatProviderClient\n hooks.ts Provider-specific patching, accessors, usage, stream deltas\n protocol/ Provider DTOs when needed\n index.ts Public exports\n```\n\nAdd shared compatibility policy to `src/bridge`; add shared provider transport or protocol helpers to `src/providers/shared`.\n\n## License\n\nApache-2.0. See [LICENSE](./LICENSE).\n"}, "bbd9ffb5bef87e569356ff8938f16b79f1f4603d": {"t": 1785748586.4339979, "n": 14483, "h": "dacc02b25ff80a32", "c": "<div align=\"center\">\n\n<img src=\"design/assets/01-logo-system/png/godex-logo-horizontal-transparent-800x233.png\" alt=\"GodeX\" width=\"480\" />\n\n**Make every model a Codex engine.**\n\nOpenAI-compatible Responses API gateway — translates `/v1/responses` into upstream Chat Completions API calls, connecting Codex, CLI, IDE, and automation tools with any model provider.\n\n[](https://www.npmjs.com/package/@ahoo-wang/godex)\n[](https://codecov.io/gh/Ahoo-Wang/GodeX)\n[](https://bun.sh)\n[](https://www.typescriptlang.org/)\n\n[Getting Started](https://godex.ahoo.me/01-getting-started/overview) · [Architecture](https://godex.ahoo.me/02-architecture/overview) · [Configuration](https://godex.ahoo.me/07-configuration/config-schema) · [Documentation](https://godex.ahoo.me)\n\n</div>\n\n## Features\n\n| | Feature | Description |\n|---|---------|-------------|\n| 🔄 | **Protocol Translation** | Bridges OpenAI Responses API and provider-specific Chat Completions APIs |\n| 🔌 | **Provider-agnostic** | Plugin-based adapter system — add providers by implementing a small set of interfaces |\n| ⚡ | **Streaming-first** | `TransformStream` pipeline with trace, validation, logging, session persistence, and SSE delivery |\n| 💾 | **Session History** | Built-in `previous_response_id` chain resolution (SQLite / in-memory) |\n| 🛡️ | **Structured Errors** | Domain-specific error hierarchy with structured codes and diagnostic context |\n| 🔧 | **Built-in Tools** | `local_shell`, `shell`, `apply_patch` — Codex-compatible function tools |\n| 📦 | **Standalone Binary** | Zero runtime dependencies, 6 platform builds via GitHub Actions |\n\n## Quick Start\n\n```bash\n# Install — no Bun required at runtime\nnpm install -g @ahoo-wang/godex\n\n# Create config interactively\ngodex init\n\n# Start the gateway\ngodex serve\n```\n\nPoint Codex CLI at your GodeX instance:\n\n```bash\nexport OPENAI_BASE_URL=http://localhost:5678/v1\nexport OPENAI_API_KEY=any-value # not validated by GodeX, must be set\ncodex\n```\n\nOr use the OpenAI SDK:\n\n```ts\nimport OpenAI from \"openai\";\n\nconst client = new OpenAI({\n baseURL: \"http://localhost:5678/v1\",\n apiKey: \"any-value\",\n});\n\nconst response = await client.responses.create({\n model: \"gpt-4o\", // resolved via models.aliases → zhipu/glm-4.7\n input: \"Hello!\",\n});\n```\n\n## How It Works\n\n```\nCodex / CLI / IDE\n │\n ▼ POST /v1/responses\n┌─────────────────────────────────────────┐\n│ GodeX Gateway │\n│ │\n│ Bun.serve → handleResponses() │\n│ → ResponsesContext.create() │\n│ → ModelResolver.resolve() │\n│ → Registrar.resolve() │\n│ → DefaultAdapter.stream/request() │\n│ → ProviderMapper.map() │\n│ → ChatClient.streamChat() │\n│ → TransformStream pipeline │\n│ → Response (JSON or SSE) │\n└──────────────┬──────────────────────────┘\n │ Provider Adapter\n ▼\n┌─────────────────────────────────────────┐\n│ Chat Completions-compatible API │\n│ (Zhipu, DeepSeek, or custom) │\n└─────────────────────────────────────────┘\n```\n\nResponses-native upstreams already speak the target API; point clients at them directly instead of configuring them as GodeX providers.\n\n## Architecture\n\n```mermaid\nC4Context\n title GodeX — System Context\n\n Person(user, \"Developer / Codex CLI\", \"Sends Responses API requests<br/>via the OpenAI-compatible endpoint\")\n System(godex_svr, \"GodeX Server\", \"Translates Responses API → Chat Completions API<br/>Bun.serve on configurable port\")\n SystemDb(sessions, \"Session Store\", \"Stores response history for<br/>previous_response_id chain resolution<br/>SQLite (persistent) or In-Memory\")\n System_Ext(zhipu, \"Zhipu (智谱)\", \"Chat Completions API provider\")\n System_Ext(deepseek, \"DeepSeek\", \"Chat Completions API provider\")\n System_Ext(other, \"Custom Provider\", \"Any Chat Completions<br/>compatible backend\")\n\n Rel(user, godex_svr, \"POST /v1/responses, GET /v1/models, GET /health\", \"HTTP/SSE\")\n Rel(godex_svr, sessions, \"save / resolve chains\")\n Rel(godex_svr, zhipu, \"POST /chat/completions\", \"HTTPS\")\n Rel(godex_svr, deepseek, \"POST /chat/completions\", \"HTTPS\")\n Rel(godex_svr, other, \"POST /chat/completions\", \"HTTPS\")\n```\n\n## Component Model\n\n```mermaid\nclassDiagram\n direction TB\n\n class ApplicationContext {\n +config: GodeXConfig\n +logger: Logger\n +resolver: ModelResolver\n +registrar: Registrar\n +adapter: Adapter\n +sessionStore: ResponseSessionStore\n }\n\n class ResponsesContext {\n +app: ApplicationContext\n +request: ResponseCreateRequest\n +session: ResponseSessionSnapshot\n +resolved: ResolvedModel\n +provider: Provider\n +responseId: string\n +requestId: string\n +attributes: Map\n +create(app, body)$ Promise~ResponsesContext~\n }\n\n class ModelResolver {\n -defaultProvider: string\n -providerConfigs: Record\n +resolve(model) ResolvedModel\n }\n\n class Registrar {\n -factories: Map~string, ProviderFactory~\n +registerFactory(name, factory)\n +build(providers)\n +resolve(name) Provider\n }\n\n class Adapter {\n <<interface>>\n +request(ctx) Promise~ResponseObject~\n +stream(ctx) Promise~ReadableStream~\n }\n\n class DefaultAdapter {\n +request(ctx) Promise~ResponseObject~\n +stream(ctx) Promise~ReadableStream~\n }\n\n class Provider {\n <<interface>>\n +name: string\n +mapper: ProviderMapper\n +chatClient: ChatClient\n +capabilities: ProviderCapabilities\n }\n\n class ProviderMapper {\n <<interface>>\n +request: RequestMapper\n +response: ResponseMapper\n +stream: StreamMapper\n }\n\n class ChatClient {\n <<interface>>\n +chat(req) Promise~TRes~\n +streamChat(req) Promise~ReadableStream~\n }\n\n class ResponseSessionStore {\n <<interface>>\n +get(id) StoredResponseSession\n +save(session, opts)\n +resolveChain(id, opts) ResponseSessionSnapshot\n +delete(id)\n +close()\n }\n\n ApplicationContext --> ResponsesContext : creates\n ApplicationContext --> ModelResolver\n ApplicationContext --> Registrar\n ApplicationContext --> Adapter\n ApplicationContext --> ResponseSessionStore\n ResponsesContext --> Provider : uses\n Provider --> ProviderMapper\n Provider --> ChatClient\n Adapter <|.. DefaultAdapter\n DefaultAdapter --> ProviderMapper : calls\n DefaultAdapter --> ChatClient : calls\n DefaultAdapter --> ResponseSessionStore : saves\n```\n\n## Request Flow\n\n```mermaid\nsequenceDiagram\n actor C as Client (Codex CLI)\n participant H as handleResponses\n participant RC as ResponsesContext\n participant MR as ModelResolver\n participant SS as SessionStore\n participant REG as Registrar\n participant A as DefaultAdapter\n participant PM as ProviderMapper\n participant CC as ChatClient\n participant UP as Upstream API\n\n C->>H: POST /v1/responses\n H->>RC: ResponsesContext.create(app, body)\n activate RC\n RC->>MR: resolve(model)\n MR-->>RC: { provider, model }\n opt previous_response_id\n RC->>SS: resolveChain(id)\n SS-->>RC: session snapshot\n end\n RC->>REG: resolve(provider)\n REG-->>RC: Provider instance\n deactivate RC\n\n alt stream = true\n H->>A: adapter.stream(ctx)\n activate A\n A->>PM: mapper.request.map(ctx)\n A->>CC: chatClient.streamChat(req)\n CC->>UP: POST (SSE)\n UP-->>CC: SSE chunks\n A->>A: pipeTransform → ProviderEventToResponse\n A->>A: pipeTransform → ResponseLog\n A->>A: pipeTransform → ResponseSessionPersistence\n deactivate A\n H->>H: pipeTransform → ResponseSseEncode\n H-->>C: SSE byte stream\n else stream = false\n H->>A: adapter.request(ctx)\n activate A\n A->>PM: mapper.request.map(ctx)\n A->>CC: chatClient.chat(req)\n CC->>UP: POST\n UP-->>A: upstream response\n A->>PM: mapper.response.map(ctx, res)\n A->>SS: save(session)\n deactivate A\n H-->>C: JSON response\n end\n```\n\n## Stream Pipeline\n\n```mermaid\nflowchart LR\n subgraph upstream[\"Upstream Provider\"]\n SSE[\"SSE Chunks\"]\n end\n\n subgraph godex[\"GodeX Stream Pipeline\"]\n T1[\"① ProviderEventToResponse\"]\n T2[\"② OutputContractValidation\"]\n T3[\"③ ResponseLog\"]\n T4[\"④ SessionPersistence\"]\n T5[\"⑤ CompatibilityLog\"]\n end\n\n subgraph server[\"HTTP Response\"]\n T6[\"⑥ SseEncode\"]\n end\n\n subgraph client[\"Client\"]\n BYTES[\"SSE Bytes\"]\n end\n\n SSE -->|pipeThrough| T1\n T1 -->|map per event| T2\n T2 -->|validate terminal response| T3\n T3 -->|log + pass through| T4\n T4 -->|accumulate + save session| T5\n T5 -->|emit compatibility diagnostics| T6\n T6 -->|serialize SSE wire format| BYTES\n\n style upstream fill:#1a1a2e,stroke:#16213e,color:#e0e0e0\n style godex fill:#0f3460,stroke:#16213e,color:#e0e0e0\n style server fill:#1c2333,stroke:#16213e,color:#e0e0e0\n style client fill:#1a1a2e,stroke:#16213e,color:#e0e0e0\n```\n\n| Stage | Transformer | Input | Output | Role |\n|-------|------------|-------|--------|------|\n| ① | `ProviderEventToResponseTransformer` | `JsonServerSentEvent` | `ResponseStreamEvent` | Maps upstream SSE chunks via `StreamMapper.map()` |\n| ② | `ResponseOutputContractValidationTransformer` | `ResponseStreamEvent` | `ResponseStreamEvent` | Converts invalid strict downgraded JSON terminals into `response.failed` |\n| ③ | `ResponseLogTransformer` | `ResponseStreamEvent` | `ResponseStreamEvent` | Logs stream events and usage for observability |\n| ④ | `ResponseSessionPersistenceTransformer` | `ResponseStreamEvent` | `ResponseStreamEvent` | Accumulates `StreamState`, saves session on terminal event |\n| ⑤ | `CompatibilityLogTransformer` | `ResponseStreamEvent` | `ResponseStreamEvent` | Emits compatibility diagnostics once per stream |\n| ⑥ | `ResponseSseEncodeTransformer` | `ResponseStreamEvent` | `Uint8Array` | Serializes to `event:` / `data:` wire format |\n\n## Project Structure\n\n```\nsrc/\n├── cli/ Commander CLI (serve, config, init)\n├── config/ godex.yaml schema, env interpolation, defaults\n├── context/ ApplicationContext (DI), ResponsesContext (per-request)\n├── bridge/ Provider-agnostic Responses→Chat planning kernel\n│ ├── compatibility/ CompatibilityPlan and diagnostics planning\n│ ├── tools/ Tool/tool_choice planning and downgrade decisions\n│ └── output/ Output-format contracts and strict JSON validation\n├── adapter/ Adapter interface, DefaultAdapter, stream transformers\n│ ├── mapper/ RequestMapper / ResponseMapper / StreamMapper contracts\n│ └── transformers/ Stream pipeline (map → validate → log → persist → diagnostics)\n├── providers/ Provider registry + builtin factories\n│ ├── deepseek/ DeepSeek Chat Completions bridge provider\n│ └── zhipu/ Zhipu Chat Completions bridge provider\n├── resolver/ ModelResolver (model selector → provider + model)\n├── server/ Bun.serve, routes (/v1/responses, /health, /v1/models)\n├── session/ ResponseSessionStore (Memory + SQLite), chain resolution\n├── error/ GodeXError hierarchy with domain codes\n├── tools/ Built-in function tools (local_shell, shell, apply_patch)\n├── protocol/openai/ OpenAI-compatible type definitions\n├── logger/ Structured JSON logger\n└── e2e/ End-to-end tests with mocked upstream\n```\n\n## Configuration\n\n### godex.yaml\n\n```yaml\nserver:\n port: 5678\n\ndefault_provider: zhipu\n\nmodels:\n aliases:\n \"gpt-4o\": zhipu/glm-4.7 # model name mapping\n \"*\": zhipu/glm-5.1 # catch-all fallback\n\nproviders:\n zhipu:\n api_key: ${ZHIPU_API_KEY}\n base_url: https://open.bigmodel.cn/api/coding/paas/v4\n deepseek:\n api_key: ${DEEPSEEK_API_KEY}\n base_url: https://api.deepseek.com\n\nsession:\n backend: sqlite # or \"memory\"\n sqlite:\n path: ./data/sessions.db\n\ntrace:\n enabled: true # records request/event/usage rows by default\n path: ./data/trace.db\n capture_payload: false # false keeps only payload hash + byte size\n\nlogging:\n level: info # trace | debug | info | warn | error\n```\n\n### Model Selection\n\n```\nmodel: \"gpt-4o\" → resolved via default_provider model mapping\nmodel: \"zhipu/glm-4.7\" → explicit provider/model selector\nmodel: \"deepseek/deepseek-v4-pro\" → routes to configured DeepSeek provider\n```\n\n### Health Check\n\n```bash\ncurl http://localhost:5678/health\n# {\"status\":\"ok\",\"providers\":[\"zhipu\",\"deepseek\"],\"unsupported_providers\":[]}\n```\n\n### Adding a Provider\n\nImplement a focused Chat Completions bridge provider in `src/providers/<name>/`:\n\n| Interface | Purpose |\n|-----------|---------|\n| `Provider` | Bundles mapper + chatClient + capabilities |\n| `ProviderMapper` | request / response / stream mapping functions |\n| `ChatClient` | `chat()` and `streamChat()` HTTP calls |\n\nKeep provider-specific files focused on protocol rendering. Shared compatibility decisions belong in `src/bridge/compatibility`, tool availability and `tool_choice` decisions in `src/bridge/tools`, and terminal output checks in `src/bridge/output`.\n\nRegister the factory in `src/providers/builtin.ts`:\n\n```ts\nregistrar.registerFactory(\"myprovider\", (config) =>\n createMyProvider(config) as Provider<unknown, unknown, unknown>\n);\n```\n\n## Development\n\n```bash\nbun install # Install dependencies\nbun run dev # Dev server with hot reload (port 13145)\nbun run test # Unit + integration tests\nbun run test:e2e # E2E tests with mocked upstream\nbun run build # Build standalone binary for current platform\nbun run check # typecheck + lint + test\nbun run ci # Full CI pipeline\n```\n\n## Publishing\n\n`@ahoo-wang/godex` is a lightweight npm wrapper. Native binaries ship as platform-specific optional dependencies:\n\n```\n@ahoo-wang/godex\n├── @ahoo-wang/godex-darwin-arm64 ← macOS Apple Silicon\n├── @ahoo-wang/godex-darwin-x64 ← macOS Intel\n├── @ahoo-wang/godex-linux-x64 ← Linux x86_64\n├── @ahoo-wang/godex-linux-arm64 ← Linux ARM64\n├── @ahoo-wang/godex-win32-x64 ← Windows x86_64\n└── @ahoo-wang/godex-win32-arm64 ← Windows ARM64\n```\n\n## License\n\n[Apache License 2.0](LICENSE)\n"}, "818bd39bf92e74dddb995c46f47feef9a3339a23": {"t": 1785748588.7649689, "n": 13284, "h": "4a3e2be3ebb02421", "c": "<div align=\"center\">\n\n<img src=\"design/assets/01-logo-system/png/godex-logo-horizontal-transparent-800x233.png\" alt=\"GodeX\" width=\"480\" />\n\n**Make every model a Codex engine.**\n\nOpenAI-compatible Responses API gateway — translates `/v1/responses` into upstream Chat Completions API calls, connecting Codex, CLI, IDE, and automation tools with any model provider.\n\n[](https://www.npmjs.com/package/@ahoo-wang/godex)\n[](https://codecov.io/gh/Ahoo-Wang/GodeX)\n[](https://bun.sh)\n[](https://www.typescriptlang.org/)\n\n[Getting Started](https://godex.ahoo.me/01-getting-started/overview) · [Architecture](https://godex.ahoo.me/02-architecture/overview) · [Configuration](https://godex.ahoo.me/07-configuration/config-schema) · [Documentation](https://godex.ahoo.me)\n\n</div>\n\n## Features\n\n| | Feature | Description |\n|---|---------|-------------|\n| 🔄 | **Protocol Translation** | Bridges OpenAI Responses API and provider-specific Chat Completions APIs |\n| 🔌 | **Provider-agnostic** | Plugin-based adapter system — add providers by implementing a small set of interfaces |\n| ⚡ | **Streaming-first** | 4-stage `TransformStream` pipeline for low-latency SSE delivery |\n| 💾 | **Session History** | Built-in `previous_response_id` chain resolution (SQLite / in-memory) |\n| 🛡️ | **Structured Errors** | Domain-specific error hierarchy with structured codes and diagnostic context |\n| 🔧 | **Built-in Tools** | `local_shell`, `shell`, `apply_patch` — Codex-compatible function tools |\n| 📦 | **Standalone Binary** | Zero runtime dependencies, 6 platform builds via GitHub Actions |\n\n## Quick Start\n\n```bash\n# Install — no Bun required at runtime\nnpm install -g @ahoo-wang/godex\n\n# Create config interactively\ngodex init\n\n# Start the gateway\ngodex serve\n```\n\nPoint Codex CLI at your GodeX instance:\n\n```bash\nexport OPENAI_BASE_URL=http://localhost:5678/v1\nexport OPENAI_API_KEY=any-value # not validated by GodeX, must be set\ncodex\n```\n\nOr use the OpenAI SDK:\n\n```ts\nimport OpenAI from \"openai\";\n\nconst client = new OpenAI({\n baseURL: \"http://localhost:5678/v1\",\n apiKey: \"any-value\",\n});\n\nconst response = await client.responses.create({\n model: \"gpt-4o\", // resolved via models.aliases → zhipu/glm-4.7\n input: \"Hello!\",\n});\n```\n\n## How It Works\n\n```\nCodex / CLI / IDE\n │\n ▼ POST /v1/responses\n┌─────────────────────────────────────────┐\n│ GodeX Gateway │\n│ │\n│ Bun.serve → handleResponses() │\n│ → ResponsesContext.create() │\n│ → ModelResolver.resolve() │\n│ → Registrar.resolve() │\n│ → DefaultAdapter.stream/request() │\n│ → ProviderMapper.map() │\n│ → ChatClient.streamChat() │\n│ → 4-stage TransformStream │\n│ → Response (JSON or SSE) │\n└──────────────┬──────────────────────────┘\n │ Provider Adapter\n ▼\n┌─────────────────────────────────────────┐\n│ Chat Completions-compatible API │\n│ (Zhipu, OpenAI, or custom) │\n└─────────────────────────────────────────┘\n```\n\n## Architecture\n\n```mermaid\nC4Context\n title GodeX — System Context\n\n Person(user, \"Developer / Codex CLI\", \"Sends Responses API requests<br/>via the OpenAI-compatible endpoint\")\n System(godex_svr, \"GodeX Server\", \"Translates Responses API → Chat Completions API<br/>Bun.serve on configurable port\")\n SystemDb(sessions, \"Session Store\", \"Stores response history for<br/>previous_response_id chain resolution<br/>SQLite (persistent) or In-Memory\")\n System_Ext(zhipu, \"Zhipu (智谱)\", \"Chat Completions API provider\")\n System_Ext(openai, \"OpenAI\", \"Chat Completions API provider\")\n System_Ext(other, \"Custom Provider\", \"Any Chat Completions<br/>compatible backend\")\n\n Rel(user, godex_svr, \"POST /v1/responses, GET /v1/models, GET /health\", \"HTTP/SSE\")\n Rel(godex_svr, sessions, \"save / resolve chains\")\n Rel(godex_svr, zhipu, \"POST /chat/completions\", \"HTTPS\")\n Rel(godex_svr, openai, \"POST /chat/completions\", \"HTTPS\")\n Rel(godex_svr, other, \"POST /chat/completions\", \"HTTPS\")\n```\n\n## Component Model\n\n```mermaid\nclassDiagram\n direction TB\n\n class ApplicationContext {\n +config: GodeXConfig\n +logger: Logger\n +resolver: ModelResolver\n +registrar: Registrar\n +adapter: Adapter\n +sessionStore: ResponseSessionStore\n }\n\n class ResponsesContext {\n +app: ApplicationContext\n +request: ResponseCreateRequest\n +session: ResponseSessionSnapshot\n +resolved: ResolvedModel\n +provider: Provider\n +responseId: string\n +requestId: string\n +attributes: Map\n +create(app, body)$ Promise~ResponsesContext~\n }\n\n class ModelResolver {\n -defaultProvider: string\n -providerConfigs: Record\n +resolve(model) ResolvedModel\n }\n\n class Registrar {\n -factories: Map~string, ProviderFactory~\n +registerFactory(name, factory)\n +build(providers)\n +resolve(name) Provider\n }\n\n class Adapter {\n <<interface>>\n +request(ctx) Promise~ResponseObject~\n +stream(ctx) Promise~ReadableStream~\n }\n\n class DefaultAdapter {\n +request(ctx) Promise~ResponseObject~\n +stream(ctx) Promise~ReadableStream~\n }\n\n class Provider {\n <<interface>>\n +name: string\n +mapper: ProviderMapper\n +chatClient: ChatClient\n +capabilities: ProviderCapabilities\n }\n\n class ProviderMapper {\n <<interface>>\n +request: RequestMapper\n +response: ResponseMapper\n +stream: StreamMapper\n }\n\n class ChatClient {\n <<interface>>\n +chat(req) Promise~TRes~\n +streamChat(req) Promise~ReadableStream~\n }\n\n class ResponseSessionStore {\n <<interface>>\n +get(id) StoredResponseSession\n +save(session, opts)\n +resolveChain(id, opts) ResponseSessionSnapshot\n +delete(id)\n +close()\n }\n\n ApplicationContext --> ResponsesContext : creates\n ApplicationContext --> ModelResolver\n ApplicationContext --> Registrar\n ApplicationContext --> Adapter\n ApplicationContext --> ResponseSessionStore\n ResponsesContext --> Provider : uses\n Provider --> ProviderMapper\n Provider --> ChatClient\n Adapter <|.. DefaultAdapter\n DefaultAdapter --> ProviderMapper : calls\n DefaultAdapter --> ChatClient : calls\n DefaultAdapter --> ResponseSessionStore : saves\n```\n\n## Request Flow\n\n```mermaid\nsequenceDiagram\n actor C as Client (Codex CLI)\n participant H as handleResponses\n participant RC as ResponsesContext\n participant MR as ModelResolver\n participant SS as SessionStore\n participant REG as Registrar\n participant A as DefaultAdapter\n participant PM as ProviderMapper\n participant CC as ChatClient\n participant UP as Upstream API\n\n C->>H: POST /v1/responses\n H->>RC: ResponsesContext.create(app, body)\n activate RC\n RC->>MR: resolve(model)\n MR-->>RC: { provider, model }\n opt previous_response_id\n RC->>SS: resolveChain(id)\n SS-->>RC: session snapshot\n end\n RC->>REG: resolve(provider)\n REG-->>RC: Provider instance\n deactivate RC\n\n alt stream = true\n H->>A: adapter.stream(ctx)\n activate A\n A->>PM: mapper.request.map(ctx)\n A->>CC: chatClient.streamChat(req)\n CC->>UP: POST (SSE)\n UP-->>CC: SSE chunks\n A->>A: pipeTransform → ProviderEventToResponse\n A->>A: pipeTransform → ResponseLog\n A->>A: pipeTransform → ResponseSessionPersistence\n deactivate A\n H->>H: pipeTransform → ResponseSseEncode\n H-->>C: SSE byte stream\n else stream = false\n H->>A: adapter.request(ctx)\n activate A\n A->>PM: mapper.request.map(ctx)\n A->>CC: chatClient.chat(req)\n CC->>UP: POST\n UP-->>A: upstream response\n A->>PM: mapper.response.map(ctx, res)\n A->>SS: save(session)\n deactivate A\n H-->>C: JSON response\n end\n```\n\n## Stream Pipeline\n\n```mermaid\nflowchart LR\n subgraph upstream[\"Upstream Provider\"]\n SSE[\"SSE Chunks\"]\n end\n\n subgraph godex[\"GodeX Stream Pipeline\"]\n T1[\"① ProviderEventToResponse\"]\n T2[\"② ResponseLog\"]\n T3[\"③ SessionPersistence\"]\n end\n\n subgraph server[\"HTTP Response\"]\n T4[\"④ SseEncode\"]\n end\n\n subgraph client[\"Client\"]\n BYTES[\"SSE Bytes\"]\n end\n\n SSE -->|pipeThrough| T1\n T1 -->|map per event| T2\n T2 -->|log + pass through| T3\n T3 -->|accumulate + save session| T4\n T4 -->|serialize SSE wire format| BYTES\n\n style upstream fill:#1a1a2e,stroke:#16213e,color:#e0e0e0\n style godex fill:#0f3460,stroke:#16213e,color:#e0e0e0\n style server fill:#1c2333,stroke:#16213e,color:#e0e0e0\n style client fill:#1a1a2e,stroke:#16213e,color:#e0e0e0\n```\n\n| Stage | Transformer | Input | Output | Role |\n|-------|------------|-------|--------|------|\n| ① | `ProviderEventToResponseTransformer` | `JsonServerSentEvent` | `ResponseStreamEvent` | Maps upstream SSE chunks via `StreamMapper.map()` |\n| ② | `ResponseLogTransformer` | `ResponseStreamEvent` | `ResponseStreamEvent` | Logs stream events for observability |\n| ③ | `ResponseSessionPersistenceTransformer` | `ResponseStreamEvent` | `ResponseStreamEvent` | Accumulates `StreamState`, saves session on terminal event |\n| ④ | `ResponseSseEncodeTransformer` | `ResponseStreamEvent` | `Uint8Array` | Serializes to `event:` / `data:` wire format |\n\n## Project Structure\n\n```\nsrc/\n├── cli/ Commander CLI (serve, config, init)\n├── config/ godex.yaml schema, env interpolation, defaults\n├── context/ ApplicationContext (DI), ResponsesContext (per-request)\n├── adapter/ Adapter interface, DefaultAdapter, stream transformers\n│ ├── mapper/ RequestMapper / ResponseMapper / StreamMapper contracts\n│ └── transformers/ 4-stage stream pipeline (map → log → persist → encode)\n├── providers/ Provider registry + builtin factories\n│ └── zhipu/ Reference provider: mapper, chat-client, tools, messages\n├── resolver/ ModelResolver (model selector → provider + model)\n├── server/ Bun.serve, routes (/v1/responses, /health, /v1/models)\n├── session/ ResponseSessionStore (Memory + SQLite), chain resolution\n├── error/ GodeXError hierarchy with domain codes\n├── tools/ Built-in function tools (local_shell, shell, apply_patch)\n├── protocol/openai/ OpenAI-compatible type definitions\n├── logger/ Structured JSON logger\n└── e2e/ End-to-end tests with mocked upstream\n```\n\n## Configuration\n\n### godex.yaml\n\n```yaml\nserver:\n port: 5678\n\ndefault_provider: zhipu\n\nmodels:\n aliases:\n \"gpt-4o\": zhipu/glm-4.7 # model name mapping\n \"*\": zhipu/glm-5.1 # catch-all fallback\n\nproviders:\n zhipu:\n api_key: ${ZHIPU_API_KEY}\n base_url: https://open.bigmodel.cn/api/coding/paas/v4\n deepseek:\n api_key: ${DEEPSEEK_API_KEY}\n base_url: https://api.deepseek.com\n\nsession:\n backend: sqlite # or \"memory\"\n sqlite:\n path: ./data/sessions.db\n\ntrace:\n enabled: true # records request/event/usage rows by default\n path: ./data/trace.db\n capture_payload: false # false keeps only payload hash + byte size\n\nlogging:\n level: info # trace | debug | info | warn | error\n```\n\n### Model Selection\n\n```\nmodel: \"gpt-4o\" → resolved via default_provider model mapping\nmodel: \"zhipu/glm-4.7\" → explicit provider/model selector\nmodel: \"deepseek/deepseek-v4-pro\" → routes to configured DeepSeek provider\nmodel: \"openai/gpt-4o\" → routes to configured openai provider\n```\n\n### Health Check\n\n```bash\ncurl http://localhost:5678/health\n# {\"status\":\"ok\",\"providers\":[\"zhipu\",\"deepseek\"],\"unsupported_providers\":[]}\n```\n\n### Adding a Provider\n\nImplement three interfaces in `src/providers/<name>/`:\n\n| Interface | Purpose |\n|-----------|---------|\n| `Provider` | Bundles mapper + chatClient + capabilities |\n| `ProviderMapper` | request / response / stream mapping functions |\n| `ChatClient` | `chat()` and `streamChat()` HTTP calls |\n\nRegister the factory in `src/providers/builtin.ts`:\n\n```ts\nregistrar.registerFactory(\"myprovider\", (config) =>\n createMyProvider(config) as Provider<unknown, unknown, unknown>\n);\n```\n\n## Development\n\n```bash\nbun install # Install dependencies\nbun run dev # Dev server with hot reload (port 13145)\nbun run test # Unit + integration tests\nbun run test:e2e # E2E tests with mocked upstream\nbun run build # Build standalone binary for current platform\nbun run check # typecheck + lint + test\nbun run ci # Full CI pipeline\n```\n\n## Publishing\n\n`@ahoo-wang/godex` is a lightweight npm wrapper. Native binaries ship as platform-specific optional dependencies:\n\n```\n@ahoo-wang/godex\n├── @ahoo-wang/godex-darwin-arm64 ← macOS Apple Silicon\n├── @ahoo-wang/godex-darwin-x64 ← macOS Intel\n├── @ahoo-wang/godex-linux-x64 ← Linux x86_64\n├── @ahoo-wang/godex-linux-arm64 ← Linux ARM64\n├── @ahoo-wang/godex-win32-x64 ← Windows x86_64\n└── @ahoo-wang/godex-win32-arm64 ← Windows ARM64\n```\n\n## License\n\n[Apache License 2.0](LICENSE)\n"}, "49620042afbb8aa691fe404cad0446fe9c08b7f7": {"t": 1785748589.8711302, "n": 12928, "h": "0ceba93ee44794d4", "c": "<div align=\"center\">\n\n<img src=\"design/assets/01-logo-system/png/godex-logo-horizontal-transparent-800x233.png\" alt=\"GodeX\" width=\"480\" />\n\n**Make every model a Codex engine.**\n\nOpenAI-compatible Responses API gateway — translates `/v1/responses` into upstream Chat Completions API calls, connecting Codex, CLI, IDE, and automation tools with any model provider.\n\n[](https://www.npmjs.com/package/@ahoo-wang/godex)\n[](https://codecov.io/gh/Ahoo-Wang/GodeX)\n[](https://bun.sh)\n[](https://www.typescriptlang.org/)\n\n[Getting Started](https://godex.ahoo.me/01-getting-started/overview) · [Architecture](https://godex.ahoo.me/02-architecture/overview) · [Configuration](https://godex.ahoo.me/07-configuration/config-schema) · [Documentation](https://godex.ahoo.me)\n\n</div>\n\n## Features\n\n| | Feature | Description |\n|---|---------|-------------|\n| 🔄 | **Protocol Translation** | Bridges OpenAI Responses API and provider-specific Chat Completions APIs |\n| 🔌 | **Provider-agnostic** | Plugin-based adapter system — add providers by implementing a small set of interfaces |\n| ⚡ | **Streaming-first** | 4-stage `TransformStream` pipeline for low-latency SSE delivery |\n| 💾 | **Session History** | Built-in `previous_response_id` chain resolution (SQLite / in-memory) |\n| 🛡️ | **Structured Errors** | Domain-specific error hierarchy with structured codes and diagnostic context |\n| 🔧 | **Built-in Tools** | `local_shell`, `shell`, `apply_patch` — Codex-compatible function tools |\n| 📦 | **Standalone Binary** | Zero runtime dependencies, 6 platform builds via GitHub Actions |\n\n## Quick Start\n\n```bash\n# Install — no Bun required at runtime\nnpm install -g @ahoo-wang/godex\n\n# Create config interactively\ngodex init\n\n# Start the gateway\ngodex serve\n```\n\nPoint Codex CLI at your GodeX instance:\n\n```bash\nexport OPENAI_BASE_URL=http://localhost:5678/v1\nexport OPENAI_API_KEY=any-value # not validated by GodeX, must be set\ncodex\n```\n\nOr use the OpenAI SDK:\n\n```ts\nimport OpenAI from \"openai\";\n\nconst client = new OpenAI({\n baseURL: \"http://localhost:5678/v1\",\n apiKey: \"any-value\",\n});\n\nconst response = await client.responses.create({\n model: \"gpt-4o\", // resolved via models.aliases → zhipu/glm-4.7\n input: \"Hello!\",\n});\n```\n\n## How It Works\n\n```\nCodex / CLI / IDE\n │\n ▼ POST /v1/responses\n┌─────────────────────────────────────────┐\n│ GodeX Gateway │\n│ │\n│ Bun.serve → handleResponses() │\n│ → ResponsesContext.create() │\n│ → ModelResolver.resolve() │\n│ → Registrar.resolve() │\n│ → DefaultAdapter.stream/request() │\n│ → ProviderMapper.map() │\n│ → ChatClient.streamChat() │\n│ → 4-stage TransformStream │\n│ → Response (JSON or SSE) │\n└──────────────┬──────────────────────────┘\n │ Provider Adapter\n ▼\n┌─────────────────────────────────────────┐\n│ Chat Completions-compatible API │\n│ (Zhipu, OpenAI, or custom) │\n└─────────────────────────────────────────┘\n```\n\n## Architecture\n\n```mermaid\nC4Context\n title GodeX — System Context\n\n Person(user, \"Developer / Codex CLI\", \"Sends Responses API requests<br/>via the OpenAI-compatible endpoint\")\n System(godex_svr, \"GodeX Server\", \"Translates Responses API → Chat Completions API<br/>Bun.serve on configurable port\")\n SystemDb(sessions, \"Session Store\", \"Stores response history for<br/>previous_response_id chain resolution<br/>SQLite (persistent) or In-Memory\")\n System_Ext(zhipu, \"Zhipu (智谱)\", \"Chat Completions API provider\")\n System_Ext(openai, \"OpenAI\", \"Chat Completions API provider\")\n System_Ext(other, \"Custom Provider\", \"Any Chat Completions<br/>compatible backend\")\n\n Rel(user, godex_svr, \"POST /v1/responses, GET /v1/models, GET /health\", \"HTTP/SSE\")\n Rel(godex_svr, sessions, \"save / resolve chains\")\n Rel(godex_svr, zhipu, \"POST /chat/completions\", \"HTTPS\")\n Rel(godex_svr, openai, \"POST /chat/completions\", \"HTTPS\")\n Rel(godex_svr, other, \"POST /chat/completions\", \"HTTPS\")\n```\n\n## Component Model\n\n```mermaid\nclassDiagram\n direction TB\n\n class ApplicationContext {\n +config: GodeXConfig\n +logger: Logger\n +resolver: ModelResolver\n +registrar: Registrar\n +adapter: Adapter\n +sessionStore: ResponseSessionStore\n }\n\n class ResponsesContext {\n +app: ApplicationContext\n +request: ResponseCreateRequest\n +session: ResponseSessionSnapshot\n +resolved: ResolvedModel\n +provider: Provider\n +responseId: string\n +requestId: string\n +attributes: Map\n +create(app, body)$ Promise~ResponsesContext~\n }\n\n class ModelResolver {\n -defaultProvider: string\n -providerConfigs: Record\n +resolve(model) ResolvedModel\n }\n\n class Registrar {\n -factories: Map~string, ProviderFactory~\n +registerFactory(name, factory)\n +build(providers)\n +resolve(name) Provider\n }\n\n class Adapter {\n <<interface>>\n +request(ctx) Promise~ResponseObject~\n +stream(ctx) Promise~ReadableStream~\n }\n\n class DefaultAdapter {\n +request(ctx) Promise~ResponseObject~\n +stream(ctx) Promise~ReadableStream~\n }\n\n class Provider {\n <<interface>>\n +name: string\n +mapper: ProviderMapper\n +chatClient: ChatClient\n +capabilities: ProviderCapabilities\n }\n\n class ProviderMapper {\n <<interface>>\n +request: RequestMapper\n +response: ResponseMapper\n +stream: StreamMapper\n }\n\n class ChatClient {\n <<interface>>\n +chat(req) Promise~TRes~\n +streamChat(req) Promise~ReadableStream~\n }\n\n class ResponseSessionStore {\n <<interface>>\n +get(id) StoredResponseSession\n +save(session, opts)\n +resolveChain(id, opts) ResponseSessionSnapshot\n +delete(id)\n +close()\n }\n\n ApplicationContext --> ResponsesContext : creates\n ApplicationContext --> ModelResolver\n ApplicationContext --> Registrar\n ApplicationContext --> Adapter\n ApplicationContext --> ResponseSessionStore\n ResponsesContext --> Provider : uses\n Provider --> ProviderMapper\n Provider --> ChatClient\n Adapter <|.. DefaultAdapter\n DefaultAdapter --> ProviderMapper : calls\n DefaultAdapter --> ChatClient : calls\n DefaultAdapter --> ResponseSessionStore : saves\n```\n\n## Request Flow\n\n```mermaid\nsequenceDiagram\n actor C as Client (Codex CLI)\n participant H as handleResponses\n participant RC as ResponsesContext\n participant MR as ModelResolver\n participant SS as SessionStore\n participant REG as Registrar\n participant A as DefaultAdapter\n participant PM as ProviderMapper\n participant CC as ChatClient\n participant UP as Upstream API\n\n C->>H: POST /v1/responses\n H->>RC: ResponsesContext.create(app, body)\n activate RC\n RC->>MR: resolve(model)\n MR-->>RC: { provider, model }\n opt previous_response_id\n RC->>SS: resolveChain(id)\n SS-->>RC: session snapshot\n end\n RC->>REG: resolve(provider)\n REG-->>RC: Provider instance\n deactivate RC\n\n alt stream = true\n H->>A: adapter.stream(ctx)\n activate A\n A->>PM: mapper.request.map(ctx)\n A->>CC: chatClient.streamChat(req)\n CC->>UP: POST (SSE)\n UP-->>CC: SSE chunks\n A->>A: pipeTransform → ProviderEventToResponse\n A->>A: pipeTransform → ResponseLog\n A->>A: pipeTransform → ResponseSessionPersistence\n deactivate A\n H->>H: pipeTransform → ResponseSseEncode\n H-->>C: SSE byte stream\n else stream = false\n H->>A: adapter.request(ctx)\n activate A\n A->>PM: mapper.request.map(ctx)\n A->>CC: chatClient.chat(req)\n CC->>UP: POST\n UP-->>A: upstream response\n A->>PM: mapper.response.map(ctx, res)\n A->>SS: save(session)\n deactivate A\n H-->>C: JSON response\n end\n```\n\n## Stream Pipeline\n\n```mermaid\nflowchart LR\n subgraph upstream[\"Upstream Provider\"]\n SSE[\"SSE Chunks\"]\n end\n\n subgraph godex[\"GodeX Stream Pipeline\"]\n T1[\"① ProviderEventToResponse\"]\n T2[\"② ResponseLog\"]\n T3[\"③ SessionPersistence\"]\n end\n\n subgraph server[\"HTTP Response\"]\n T4[\"④ SseEncode\"]\n end\n\n subgraph client[\"Client\"]\n BYTES[\"SSE Bytes\"]\n end\n\n SSE -->|pipeThrough| T1\n T1 -->|map per event| T2\n T2 -->|log + pass through| T3\n T3 -->|accumulate + save session| T4\n T4 -->|serialize SSE wire format| BYTES\n\n style upstream fill:#1a1a2e,stroke:#16213e,color:#e0e0e0\n style godex fill:#0f3460,stroke:#16213e,color:#e0e0e0\n style server fill:#1c2333,stroke:#16213e,color:#e0e0e0\n style client fill:#1a1a2e,stroke:#16213e,color:#e0e0e0\n```\n\n| Stage | Transformer | Input | Output | Role |\n|-------|------------|-------|--------|------|\n| ① | `ProviderEventToResponseTransformer` | `JsonServerSentEvent` | `ResponseStreamEvent` | Maps upstream SSE chunks via `StreamMapper.map()` |\n| ② | `ResponseLogTransformer` | `ResponseStreamEvent` | `ResponseStreamEvent` | Logs stream events for observability |\n| ③ | `ResponseSessionPersistenceTransformer` | `ResponseStreamEvent` | `ResponseStreamEvent` | Accumulates `StreamState`, saves session on terminal event |\n| ④ | `ResponseSseEncodeTransformer` | `ResponseStreamEvent` | `Uint8Array` | Serializes to `event:` / `data:` wire format |\n\n## Project Structure\n\n```\nsrc/\n├── cli/ Commander CLI (serve, config, init)\n├── config/ godex.yaml schema, env interpolation, defaults\n├── context/ ApplicationContext (DI), ResponsesContext (per-request)\n├── adapter/ Adapter interface, DefaultAdapter, stream transformers\n│ ├── mapper/ RequestMapper / ResponseMapper / StreamMapper contracts\n│ └── transformers/ 4-stage stream pipeline (map → log → persist → encode)\n├── providers/ Provider registry + builtin factories\n│ └── zhipu/ Reference provider: mapper, chat-client, tools, messages\n├── resolver/ ModelResolver (model selector → provider + model)\n├── server/ Bun.serve, routes (/v1/responses, /health, /v1/models)\n├── session/ ResponseSessionStore (Memory + SQLite), chain resolution\n├── error/ GodeXError hierarchy with domain codes\n├── tools/ Built-in function tools (local_shell, shell, apply_patch)\n├── protocol/openai/ OpenAI-compatible type definitions\n├── logger/ Structured JSON logger\n└── e2e/ End-to-end tests with mocked upstream\n```\n\n## Configuration\n\n### godex.yaml\n\n```yaml\nserver:\n port: 5678\n\ndefault_provider: zhipu\n\nmodels:\n aliases:\n \"gpt-4o\": zhipu/glm-4.7 # model name mapping\n \"*\": zhipu/glm-5.1 # catch-all fallback\n\nproviders:\n zhipu:\n api_key: ${ZHIPU_API_KEY}\n base_url: https://open.bigmodel.cn/api/coding/paas/v4\n\nsession:\n backend: sqlite # or \"memory\"\n sqlite:\n path: ./data/sessions.db\n\nlogging:\n level: info # trace | debug | info | warn | error\n```\n\n### Model Selection\n\n```\nmodel: \"gpt-4o\" → resolved via default_provider model mapping\nmodel: \"zhipu/glm-4.7\" → explicit provider/model selector\nmodel: \"openai/gpt-4o\" → routes to configured openai provider\n```\n\n### Health Check\n\n```bash\ncurl http://localhost:5678/health\n# {\"status\":\"ok\",\"providers\":[\"zhipu\"],\"unsupported_providers\":[]}\n```\n\n### Adding a Provider\n\nImplement three interfaces in `src/providers/<name>/`:\n\n| Interface | Purpose |\n|-----------|---------|\n| `Provider` | Bundles mapper + chatClient + capabilities |\n| `ProviderMapper` | request / response / stream mapping functions |\n| `ChatClient` | `chat()` and `streamChat()` HTTP calls |\n\nRegister the factory in `src/providers/builtin.ts`:\n\n```ts\nregistrar.registerFactory(\"myprovider\", (config) =>\n createMyProvider(config) as Provider<unknown, unknown, unknown>\n);\n```\n\n## Development\n\n```bash\nbun install # Install dependencies\nbun run dev # Dev server with hot reload (port 13145)\nbun run test # Unit + integration tests\nbun run test:e2e # E2E tests with mocked upstream\nbun run build # Build standalone binary for current platform\nbun run check # typecheck + lint + test\nbun run ci # Full CI pipeline\n```\n\n## Publishing\n\n`@ahoo-wang/godex` is a lightweight npm wrapper. Native binaries ship as platform-specific optional dependencies:\n\n```\n@ahoo-wang/godex\n├── @ahoo-wang/godex-darwin-arm64 ← macOS Apple Silicon\n├── @ahoo-wang/godex-darwin-x64 ← macOS Intel\n├── @ahoo-wang/godex-linux-x64 ← Linux x86_64\n├── @ahoo-wang/godex-linux-arm64 ← Linux ARM64\n├── @ahoo-wang/godex-win32-x64 ← Windows x86_64\n└── @ahoo-wang/godex-win32-arm64 ← Windows ARM64\n```\n\n## License\n\n[Apache License 2.0](LICENSE)\n"}, "84800165cfcb9a1ebf98bf398850bb4ad8db8e5d": {"t": 1785748591.6599681, "n": 12925, "h": "ddf92e9847779922", "c": "<div align=\"center\">\n\n<img src=\"design/assets/01-logo-system/png/godex-logo-horizontal-transparent-800x233.png\" alt=\"GodeX\" width=\"480\" />\n\n**Make every model a Codex engine.**\n\nOpenAI-compatible Responses API gateway — translates `/v1/responses` into upstream Chat Completions API calls, connecting Codex, CLI, IDE, and automation tools with any model provider.\n\n[](https://www.npmjs.com/package/@ahoo-wang/godex)\n[](https://codecov.io/gh/Ahoo-Wang/GodeX)\n[](https://bun.sh)\n[](https://www.typescriptlang.org/)\n\n[Getting Started](https://godex.ahoo.me/01-getting-started/overview) · [Architecture](https://godex.ahoo.me/02-architecture/overview) · [Configuration](https://godex.ahoo.me/07-configuration/config-schema) · [Documentation](https://godex.ahoo.me)\n\n</div>\n\n## Features\n\n| | Feature | Description |\n|---|---------|-------------|\n| 🔄 | **Protocol Translation** | Bridges OpenAI Responses API and provider-specific Chat Completions APIs |\n| 🔌 | **Provider-agnostic** | Plugin-based adapter system — add providers by implementing a small set of interfaces |\n| ⚡ | **Streaming-first** | 4-stage `TransformStream` pipeline for low-latency SSE delivery |\n| 💾 | **Session History** | Built-in `previous_response_id` chain resolution (SQLite / in-memory) |\n| 🛡️ | **Structured Errors** | Domain-specific error hierarchy with structured codes and diagnostic context |\n| 🔧 | **Built-in Tools** | `local_shell`, `shell`, `apply_patch` — Codex-compatible function tools |\n| 📦 | **Standalone Binary** | Zero runtime dependencies, 6 platform builds via GitHub Actions |\n\n## Quick Start\n\n```bash\n# Install — no Bun required at runtime\nnpm install -g @ahoo-wang/godex\n\n# Create config interactively\ngodex init\n\n# Start the gateway\ngodex serve\n```\n\nPoint Codex CLI at your GodeX instance:\n\n```bash\nexport OPENAI_BASE_URL=http://localhost:5678/v1\nexport OPENAI_API_KEY=any-value # not validated by GodeX, must be set\ncodex\n```\n\nOr use the OpenAI SDK:\n\n```ts\nimport OpenAI from \"openai\";\n\nconst client = new OpenAI({\n baseURL: \"http://localhost:5678/v1\",\n apiKey: \"any-value\",\n});\n\nconst response = await client.responses.create({\n model: \"gpt-4o\", // mapped to glm-4.7 via godex.yaml models table\n input: \"Hello!\",\n});\n```\n\n## How It Works\n\n```\nCodex / CLI / IDE\n │\n ▼ POST /v1/responses\n┌─────────────────────────────────────────┐\n│ GodeX Gateway │\n│ │\n│ Bun.serve → handleResponses() │\n│ → ResponsesContext.create() │\n│ → ModelResolver.resolve() │\n│ → Registrar.resolve() │\n│ → DefaultAdapter.stream/request() │\n│ → ProviderMapper.map() │\n│ → ChatClient.streamChat() │\n│ → 4-stage TransformStream │\n│ → Response (JSON or SSE) │\n└──────────────┬──────────────────────────┘\n │ Provider Adapter\n ▼\n┌─────────────────────────────────────────┐\n│ Chat Completions-compatible API │\n│ (Zhipu, OpenAI, or custom) │\n└─────────────────────────────────────────┘\n```\n\n## Architecture\n\n```mermaid\nC4Context\n title GodeX — System Context\n\n Person(user, \"Developer / Codex CLI\", \"Sends Responses API requests<br/>via the OpenAI-compatible endpoint\")\n System(godex_svr, \"GodeX Server\", \"Translates Responses API → Chat Completions API<br/>Bun.serve on configurable port\")\n SystemDb(sessions, \"Session Store\", \"Stores response history for<br/>previous_response_id chain resolution<br/>SQLite (persistent) or In-Memory\")\n System_Ext(zhipu, \"Zhipu (智谱)\", \"Chat Completions API provider\")\n System_Ext(openai, \"OpenAI\", \"Chat Completions API provider\")\n System_Ext(other, \"Custom Provider\", \"Any Chat Completions<br/>compatible backend\")\n\n Rel(user, godex_svr, \"POST /v1/responses, GET /v1/models, GET /health\", \"HTTP/SSE\")\n Rel(godex_svr, sessions, \"save / resolve chains\")\n Rel(godex_svr, zhipu, \"POST /chat/completions\", \"HTTPS\")\n Rel(godex_svr, openai, \"POST /chat/completions\", \"HTTPS\")\n Rel(godex_svr, other, \"POST /chat/completions\", \"HTTPS\")\n```\n\n## Component Model\n\n```mermaid\nclassDiagram\n direction TB\n\n class ApplicationContext {\n +config: GodeXConfig\n +logger: Logger\n +resolver: ModelResolver\n +registrar: Registrar\n +adapter: Adapter\n +sessionStore: ResponseSessionStore\n }\n\n class ResponsesContext {\n +app: ApplicationContext\n +request: ResponseCreateRequest\n +session: ResponseSessionSnapshot\n +resolved: ResolvedModel\n +provider: Provider\n +responseId: string\n +requestId: string\n +attributes: Map\n +create(app, body)$ Promise~ResponsesContext~\n }\n\n class ModelResolver {\n -defaultProvider: string\n -providerConfigs: Record\n +resolve(model) ResolvedModel\n }\n\n class Registrar {\n -factories: Map~string, ProviderFactory~\n +registerFactory(name, factory)\n +build(providers)\n +resolve(name) Provider\n }\n\n class Adapter {\n <<interface>>\n +request(ctx) Promise~ResponseObject~\n +stream(ctx) Promise~ReadableStream~\n }\n\n class DefaultAdapter {\n +request(ctx) Promise~ResponseObject~\n +stream(ctx) Promise~ReadableStream~\n }\n\n class Provider {\n <<interface>>\n +name: string\n +mapper: ProviderMapper\n +chatClient: ChatClient\n +capabilities: ProviderCapabilities\n }\n\n class ProviderMapper {\n <<interface>>\n +request: RequestMapper\n +response: ResponseMapper\n +stream: StreamMapper\n }\n\n class ChatClient {\n <<interface>>\n +chat(req) Promise~TRes~\n +streamChat(req) Promise~ReadableStream~\n }\n\n class ResponseSessionStore {\n <<interface>>\n +get(id) StoredResponseSession\n +save(session, opts)\n +resolveChain(id, opts) ResponseSessionSnapshot\n +delete(id)\n +close()\n }\n\n ApplicationContext --> ResponsesContext : creates\n ApplicationContext --> ModelResolver\n ApplicationContext --> Registrar\n ApplicationContext --> Adapter\n ApplicationContext --> ResponseSessionStore\n ResponsesContext --> Provider : uses\n Provider --> ProviderMapper\n Provider --> ChatClient\n Adapter <|.. DefaultAdapter\n DefaultAdapter --> ProviderMapper : calls\n DefaultAdapter --> ChatClient : calls\n DefaultAdapter --> ResponseSessionStore : saves\n```\n\n## Request Flow\n\n```mermaid\nsequenceDiagram\n actor C as Client (Codex CLI)\n participant H as handleResponses\n participant RC as ResponsesContext\n participant MR as ModelResolver\n participant SS as SessionStore\n participant REG as Registrar\n participant A as DefaultAdapter\n participant PM as ProviderMapper\n participant CC as ChatClient\n participant UP as Upstream API\n\n C->>H: POST /v1/responses\n H->>RC: ResponsesContext.create(app, body)\n activate RC\n RC->>MR: resolve(model)\n MR-->>RC: { provider, model }\n opt previous_response_id\n RC->>SS: resolveChain(id)\n SS-->>RC: session snapshot\n end\n RC->>REG: resolve(provider)\n REG-->>RC: Provider instance\n deactivate RC\n\n alt stream = true\n H->>A: adapter.stream(ctx)\n activate A\n A->>PM: mapper.request.map(ctx)\n A->>CC: chatClient.streamChat(req)\n CC->>UP: POST (SSE)\n UP-->>CC: SSE chunks\n A->>A: pipeTransform → ProviderEventToResponse\n A->>A: pipeTransform → ResponseLog\n A->>A: pipeTransform → ResponseSessionPersistence\n deactivate A\n H->>H: pipeTransform → ResponseSseEncode\n H-->>C: SSE byte stream\n else stream = false\n H->>A: adapter.request(ctx)\n activate A\n A->>PM: mapper.request.map(ctx)\n A->>CC: chatClient.chat(req)\n CC->>UP: POST\n UP-->>A: upstream response\n A->>PM: mapper.response.map(ctx, res)\n A->>SS: save(session)\n deactivate A\n H-->>C: JSON response\n end\n```\n\n## Stream Pipeline\n\n```mermaid\nflowchart LR\n subgraph upstream[\"Upstream Provider\"]\n SSE[\"SSE Chunks\"]\n end\n\n subgraph godex[\"GodeX Stream Pipeline\"]\n T1[\"① ProviderEventToResponse\"]\n T2[\"② ResponseLog\"]\n T3[\"③ SessionPersistence\"]\n end\n\n subgraph server[\"HTTP Response\"]\n T4[\"④ SseEncode\"]\n end\n\n subgraph client[\"Client\"]\n BYTES[\"SSE Bytes\"]\n end\n\n SSE -->|pipeThrough| T1\n T1 -->|map per event| T2\n T2 -->|log + pass through| T3\n T3 -->|accumulate + save session| T4\n T4 -->|serialize SSE wire format| BYTES\n\n style upstream fill:#1a1a2e,stroke:#16213e,color:#e0e0e0\n style godex fill:#0f3460,stroke:#16213e,color:#e0e0e0\n style server fill:#1c2333,stroke:#16213e,color:#e0e0e0\n style client fill:#1a1a2e,stroke:#16213e,color:#e0e0e0\n```\n\n| Stage | Transformer | Input | Output | Role |\n|-------|------------|-------|--------|------|\n| ① | `ProviderEventToResponseTransformer` | `JsonServerSentEvent` | `ResponseStreamEvent` | Maps upstream SSE chunks via `StreamMapper.map()` |\n| ② | `ResponseLogTransformer` | `ResponseStreamEvent` | `ResponseStreamEvent` | Logs stream events for observability |\n| ③ | `ResponseSessionPersistenceTransformer` | `ResponseStreamEvent` | `ResponseStreamEvent` | Accumulates `StreamState`, saves session on terminal event |\n| ④ | `ResponseSseEncodeTransformer` | `ResponseStreamEvent` | `Uint8Array` | Serializes to `event:` / `data:` wire format |\n\n## Project Structure\n\n```\nsrc/\n├── cli/ Commander CLI (serve, config, init)\n├── config/ godex.yaml schema, env interpolation, defaults\n├── context/ ApplicationContext (DI), ResponsesContext (per-request)\n├── adapter/ Adapter interface, DefaultAdapter, stream transformers\n│ ├── mapper/ RequestMapper / ResponseMapper / StreamMapper contracts\n│ └── transformers/ 4-stage stream pipeline (map → log → persist → encode)\n├── providers/ Provider registry + builtin factories\n│ └── zhipu/ Reference provider: mapper, chat-client, tools, messages\n├── resolver/ ModelResolver (model selector → provider + model)\n├── server/ Bun.serve, routes (/v1/responses, /health, /v1/models)\n├── session/ ResponseSessionStore (Memory + SQLite), chain resolution\n├── error/ GodeXError hierarchy with domain codes\n├── tools/ Built-in function tools (local_shell, shell, apply_patch)\n├── protocol/openai/ OpenAI-compatible type definitions\n├── logger/ Structured JSON logger\n└── e2e/ End-to-end tests with mocked upstream\n```\n\n## Configuration\n\n### godex.yaml\n\n```yaml\nserver:\n port: 5678\n\ndefault_provider: zhipu\n\nproviders:\n zhipu:\n api_key: ${ZHIPU_API_KEY}\n base_url: https://open.bigmodel.cn/api/coding/paas/v4\n models:\n \"gpt-4o\": glm-4.7 # model name mapping\n \"*\": glm-5.1 # catch-all fallback\n\nsession:\n backend: sqlite # or \"memory\"\n sqlite:\n path: ./data/sessions.db\n\nlogging:\n level: info # trace | debug | info | warn | error\n```\n\n### Model Selection\n\n```\nmodel: \"gpt-4o\" → resolved via default_provider model mapping\nmodel: \"zhipu/glm-4.7\" → explicit provider/model selector\nmodel: \"openai/gpt-4o\" → routes to configured openai provider\n```\n\n### Health Check\n\n```bash\ncurl http://localhost:5678/health\n# {\"status\":\"ok\",\"providers\":[\"zhipu\"],\"unsupported_providers\":[]}\n```\n\n### Adding a Provider\n\nImplement three interfaces in `src/providers/<name>/`:\n\n| Interface | Purpose |\n|-----------|---------|\n| `Provider` | Bundles mapper + chatClient + capabilities |\n| `ProviderMapper` | request / response / stream mapping functions |\n| `ChatClient` | `chat()` and `streamChat()` HTTP calls |\n\nRegister the factory in `src/providers/builtin.ts`:\n\n```ts\nregistrar.registerFactory(\"myprovider\", (config) =>\n createMyProvider(config) as Provider<unknown, unknown, unknown>\n);\n```\n\n## Development\n\n```bash\nbun install # Install dependencies\nbun run dev # Dev server with hot reload (port 13145)\nbun run test # Unit + integration tests\nbun run test:e2e # E2E tests with mocked upstream\nbun run build # Build standalone binary for current platform\nbun run check # typecheck + lint + test\nbun run ci # Full CI pipeline\n```\n\n## Publishing\n\n`@ahoo-wang/godex` is a lightweight npm wrapper. Native binaries ship as platform-specific optional dependencies:\n\n```\n@ahoo-wang/godex\n├── @ahoo-wang/godex-darwin-arm64 ← macOS Apple Silicon\n├── @ahoo-wang/godex-darwin-x64 ← macOS Intel\n├── @ahoo-wang/godex-linux-x64 ← Linux x86_64\n├── @ahoo-wang/godex-linux-arm64 ← Linux ARM64\n├── @ahoo-wang/godex-win32-x64 ← Windows x86_64\n└── @ahoo-wang/godex-win32-arm64 ← Windows ARM64\n```\n\n## License\n\n[Apache License 2.0](LICENSE)\n"}, "b04d6a3e641ed72890736e63efae173b348a4110": {"t": 1785748593.4695933, "n": 9796, "h": "ea631e6b31a6ba9d", "c": "<div align=\"center\">\n\n<img src=\"design/assets/01-logo-system/png/godex-logo-horizontal-transparent-800x233.png\" alt=\"GodeX\" width=\"480\" />\n\n**Make every model a Codex engine.**\n\nOpenAI-compatible Responses API gateway — translates `/v1/responses` into upstream Chat Completions API calls, connecting Codex, CLI, IDE, and automation tools with any model provider.\n\n[](https://codecov.io/gh/Ahoo-Wang/GodeX)\n[](https://bun.sh)\n[](https://www.typescriptlang.org/)\n\n[Getting Started](https://godex.ahoo.me/01-getting-started/overview) · [Architecture](https://godex.ahoo.me/02-architecture/overview) · [Configuration](https://godex.ahoo.me/07-configuration/config-schema) · [API Reference](https://godex.ahoo.me/01-getting-started/quick-reference) · [Documentation](https://godex.ahoo.me)\n\n</div>\n\n---\n\n## Quick Start\n\n```bash\n# Install — no Bun required at runtime\nnpm install -g @ahoo-wang/godex\n\n# Create config interactively\ngodex init\n\n# Start the gateway\ngodex serve\n```\n\nPoint Codex CLI at your GodeX instance:\n\n```bash\nexport OPENAI_BASE_URL=http://localhost:5678/v1\nexport OPENAI_API_KEY=any-value # not validated by GodeX, must be set\ncodex\n```\n\nOr use the OpenAI SDK:\n\n```ts\nimport OpenAI from \"openai\";\n\nconst client = new OpenAI({\n baseURL: \"http://localhost:5678/v1\",\n apiKey: \"any-value\",\n});\n\nconst response = await client.responses.create({\n model: \"gpt-4o\", // mapped to glm-4.7 via godex.yaml models table\n input: \"Hello!\",\n});\n```\n\n## How It Works\n\n```\nCodex / CLI / IDE\n │\n ▼ POST /v1/responses\n┌─────────────────┐\n│ GodeX Gateway │\n└────────┬────────┘\n │ Provider Adapter\n ▼\n┌─────────────────────────┐\n│ Chat Completions API │\n│ (any compatible model) │\n└─────────────────────────┘\n```\n\n## Architecture\n\n```mermaid\nC4Context\n title GodeX — System Context\n\n Person(user, \"Developer / Codex CLI\", \"Sends Responses API requests<br/>via the OpenAI-compatible endpoint\")\n System(godex_svr, \"GodeX Server\", \"Translates Responses API → Chat Completions API<br/>Bun HTTP server on configurable port\")\n SystemDb(sessions, \"Session Store\", \"Stores response history for<br/>previous_response_id chain resolution<br/>SQLite (persistent) or In-Memory\")\n System_Ext(zhipu, \"Zhipu (智谱)\", \"Chat Completions API provider\")\n System_Ext(openai, \"OpenAI\", \"Chat Completions API provider\")\n System_Ext(other, \"Custom Provider\", \"Any Chat Completions<br/>compatible backend\")\n\n Rel(user, godex_svr, \"POST /v1/responses, GET /v1/models, GET /health\", \"HTTP/SSE\")\n Rel(godex_svr, sessions, \"save / resolve chains\")\n Rel(godex_svr, zhipu, \"POST /chat/completions\", \"HTTPS\")\n Rel(godex_svr, openai, \"POST /chat/completions\", \"HTTPS\")\n Rel(godex_svr, other, \"POST /chat/completions\", \"HTTPS\")\n```\n\n## Request Flow\n\n```mermaid\nsequenceDiagram\n actor C as Client (Codex CLI)\n participant R as Router\n participant AC as ApplicationContext\n participant RC as ResponsesContext\n participant MR as ModelResolver\n participant SS as SessionStore\n participant REG as Registrar\n participant A as Adapter (DefaultAdapter)\n participant PM as ProviderMapper\n participant CC as ChatClient\n participant UP as Upstream API\n\n C->>R: POST /v1/responses\n R->>RC: ResponsesContext.create(app, body)\n\n activate RC\n RC->>MR: resolve(model)\n MR-->>RC: { provider, model }\n RC->>RC: validate provider config\n\n opt previous_response_id\n RC->>SS: resolveChain(id)\n SS-->>RC: session snapshot\n end\n\n RC->>REG: resolve(provider)\n REG-->>RC: Provider instance\n deactivate RC\n\n alt stream = true\n R->>A: adapter.stream(ctx)\n activate A\n A->>PM: request.map(ctx)\n PM-->>A: upstream request\n A->>CC: streamChat(req)\n CC->>UP: POST (SSE)\n UP-->>CC: SSE chunks\n CC-->>A: ReadableStream<SSE>\n A->>A: pipeTransform → ProviderEventToResponseTransformer\n A->>A: pipeTransform → ResponseSessionPersistenceTransformer\n A-->>R: ReadableStream<ResponseStreamEvent>\n deactivate A\n R->>R: pipeTransform → ResponseSseEncodeTransformer\n R-->>C: SSE byte stream\n else stream = false\n R->>A: adapter.request(ctx)\n activate A\n A->>PM: request.map(ctx)\n PM-->>A: upstream request\n A->>CC: chat(req)\n CC->>UP: POST\n UP-->>CC: JSON response\n CC-->>A: upstream response\n A->>PM: response.map(ctx, res)\n PM-->>A: ResponseObject\n A->>SS: save(session)\n A-->>R: ResponseObject\n deactivate A\n R-->>C: JSON response\n end\n```\n\n## Stream Pipeline\n\n```mermaid\nflowchart LR\n subgraph upstream[\"Upstream Provider\"]\n SSE[\"SSE Chunks<br/>(JsonServerSentEvent)\"]\n end\n\n subgraph godex[\"GodeX Stream Pipeline\"]\n T1[\"ProviderEventTo<br/>ResponseTransformer\"]\n T2[\"ResponseSession<br/>PersistenceTransformer\"]\n T3[\"ResponseSse<br/>EncodeTransformer\"]\n end\n\n subgraph client[\"Client\"]\n BYTES[\"SSE Bytes<br/>(text/event-stream)\"]\n end\n\n SSE -->|\"pipeThrough(TransformStream)\"| T1\n T1 -->|\"per-event map()<br/>SSE chunk → ResponseStreamEvent[]\"| T2\n T2 -->|\"accumulate StreamState<br/>intercept terminal event<br/>buildResponseObject()<br/>save session\"| T3\n T3 -->|\"serialize to SSE wire format<br/>event: xxx\\ndata: {...}\\n\\n\"| BYTES\n\n style upstream fill:#1a1a2e,stroke:#16213e,color:#e0e0e0\n style godex fill:#0f3460,stroke:#16213e,color:#e0e0e0\n style client fill:#1a1a2e,stroke:#16213e,color:#e0e0e0\n```\n\n| Stage | Transformer | Input | Output | Side Effects |\n|-------|------------|-------|--------|-------------|\n| 1 | `ProviderEventToResponseTransformer` | `JsonServerSentEvent<TChunk>` | `ResponseStreamEvent` | Calls `StreamMapper.map()` per event |\n| 2 | `ResponseSessionPersistenceTransformer` | `ResponseStreamEvent` | `ResponseStreamEvent` | Accumulates `StreamState`, on terminal event calls `buildResponseObject()` + saves session |\n| 3 | `ResponseSseEncodeTransformer` | `ResponseStreamEvent` | `Uint8Array` (SSE wire format) | Serializes to `event:` / `data:` lines |\n\n## Project Structure\n\n```\nsrc/\n├── cli/ Commander CLI (serve, config check, init)\n├── config/ godex.yaml schema, env interpolation, defaults\n├── context/ ApplicationContext (DI container), ResponsesContext (per-request)\n├── adapter/ Adapter interface, DefaultAdapter, stream transformers\n│ ├── mapper/ RequestMapper / ResponseMapper / StreamMapper contracts\n│ └── transformers/ ProviderEvent → Response → SSE encode pipeline\n├── providers/ Provider registry + builtin factories\n│ └── zhipu/ Reference provider: mapper, chat-client, tools, messages\n├── resolver/ ModelResolver (model selector → provider + model)\n├── server/ Bun HTTP server, Router, routes (/v1/responses, /health, /v1/models)\n├── session/ ResponseSessionStore (Memory + SQLite), chain resolution\n├── error/ GodeXError hierarchy with domain codes\n├── protocol/openai/ OpenAI-compatible type definitions\n├── logger/ Structured JSON logger\n└── e2e/ End-to-end tests with mocked upstream\n```\n\n## Configuration\n\n### godex.yaml\n\n```yaml\nserver:\n port: 5678\n\ndefault_provider: zhipu\n\nproviders:\n zhipu:\n api_key: ${ZHIPU_API_KEY}\n base_url: https://open.bigmodel.cn/api/coding/paas/v4\n models:\n \"gpt-4o\": glm-4.7 # model name mapping\n \"*\": glm-5.1 # catch-all fallback\n\nsession:\n backend: sqlite # or \"memory\"\n sqlite:\n path: ./data/sessions.db\n\nlogging:\n level: info # trace | debug | info | warn | error\n```\n\n### Model Selection\n\n```\nmodel: \"gpt-4o\" → resolved via default_provider model mapping\nmodel: \"zhipu/glm-4.7\" → explicit provider/model selector\nmodel: \"openai/gpt-4o\" → routes to configured openai provider\n```\n\n### Adding a Provider\n\nImplement these interfaces in `src/providers/<name>/`:\n\n| Interface | Purpose |\n|-----------|---------|\n| `Provider<TReq, TRes, TChunk>` | Bundles mapper + chatClient + capabilities |\n| `ProviderMapper<TReq, TRes, TChunk>` | request / response / stream mapping functions |\n| `ChatClient<TReq, TRes, TChunk>` | `chat()` and `streamChat()` HTTP calls |\n\nRegister the factory in `src/providers/builtin.ts`:\n\n```ts\nregistrar.registerFactory(\"myprovider\", (config) =>\n createMyProvider(config) as Provider<unknown, unknown, unknown>\n);\n```\n\n## Commands\n\n```bash\nbun run dev # Hot-reload dev server on port 13145\nbun run build # Compile native binary for current platform\nbun run compile:all # Cross-compile all 6 platforms locally\nbun run test # Unit + integration tests\nbun run test:e2e # E2E with mocked upstream\nbun run typecheck # tsc --noEmit\nbun run lint # Biome check\nbun run ci # Full CI pipeline\n```\n\n## Publishing\n\nThe main `@ahoo-wang/godex` npm package is a lightweight shell. Native binaries are shipped as platform-specific optional dependencies:\n\n```\n@ahoo-wang/godex (wrapper package, 0 runtime deps)\n├── engines: { node: \">=18.0.0\" } ← only for postinstall\n├── postinstall: scripts/install.cjs ← detects platform, links binary\n└── optionalDependencies:\n ├── @ahoo-wang/godex-darwin-arm64 ← macOS Apple Silicon\n ├── @ahoo-wang/godex-darwin-x64 ← macOS Intel\n ├── @ahoo-wang/godex-linux-x64 ← Linux x86_64\n ├── @ahoo-wang/godex-linux-arm64 ← Linux ARM64\n ├── @ahoo-wang/godex-win32-x64 ← Windows x86_64\n └── @ahoo-wang/godex-win32-arm64 ← Windows ARM64\n```\n\n## License\n\n[Apache License 2.0](LICENSE)\n"}, "29cb3a87490dc075b5d879b8e171099c84e8981f": {"t": 1785748594.8727396, "n": 14090, "h": "48b00c3034ad1e39", "c": "# GodeX\n\n**Make every model a Codex engine.**\n\nOpenAI-compatible Responses API gateway — translates `/v1/responses` into upstream Chat Completions API calls, connecting Codex, CLI, IDE, and automation tools with any model provider.\n\n[](https://codecov.io/gh/Ahoo-Wang/GodeX)\n[](https://bun.sh)\n[](https://www.typescriptlang.org/)\n\n## Architecture\n\n```mermaid\nC4Context\n title GodeX — System Context\n\n Person(user, \"Developer / Codex CLI\", \"Sends Responses API requests<br/>via the OpenAI-compatible endpoint\")\n System(godex_svr, \"GodeX Server\", \"Translates Responses API → Chat Completions API<br/>Bun HTTP server on configurable port\")\n SystemDb(sessions, \"Session Store\", \"Stores response history for<br/>previous_response_id chain resolution<br/>SQLite (persistent) or In-Memory\")\n System_Ext(zhipu, \"Zhipu (智谱)\", \"Chat Completions API provider\")\n System_Ext(openai, \"OpenAI\", \"Chat Completions API provider\")\n System_Ext(other, \"Custom Provider\", \"Any Chat Completions<br/>compatible backend\")\n\n Rel(user, godex_svr, \"POST /v1/responses, GET /v1/models, GET /health\", \"HTTP/SSE\")\n Rel(godex_svr, sessions, \"save / resolve chains\")\n Rel(godex_svr, zhipu, \"POST /chat/completions\", \"HTTPS\")\n Rel(godex_svr, openai, \"POST /chat/completions\", \"HTTPS\")\n Rel(godex_svr, other, \"POST /chat/completions\", \"HTTPS\")\n```\n\n## Request Flow\n\n```mermaid\nsequenceDiagram\n actor C as Client (Codex CLI)\n participant R as Router\n participant AC as ApplicationContext\n participant RC as ResponsesContext\n participant MR as ModelResolver\n participant SS as SessionStore\n participant REG as Registrar\n participant A as Adapter (DefaultAdapter)\n participant PM as ProviderMapper\n participant CC as ChatClient\n participant UP as Upstream API\n\n C->>R: POST /v1/responses\n R->>RC: ResponsesContext.create(app, body)\n\n activate RC\n RC->>MR: resolve(model)\n MR-->>RC: { provider, model }\n RC->>RC: validate provider config\n\n opt previous_response_id\n RC->>SS: resolveChain(id)\n SS-->>RC: session snapshot\n end\n\n RC->>REG: resolve(provider)\n REG-->>RC: Provider instance\n deactivate RC\n\n alt stream = true\n R->>A: adapter.stream(ctx)\n activate A\n A->>PM: request.map(ctx)\n PM-->>A: upstream request\n A->>CC: streamChat(req)\n CC->>UP: POST (SSE)\n UP-->>CC: SSE chunks\n CC-->>A: ReadableStream<SSE>\n A->>A: pipeTransform → ProviderEventToResponseTransformer\n A->>A: pipeTransform → ResponseSessionPersistenceTransformer\n A-->>R: ReadableStream<ResponseStreamEvent>\n deactivate A\n R->>R: pipeTransform → ResponseSseEncodeTransformer\n R-->>C: SSE byte stream\n else stream = false\n R->>A: adapter.request(ctx)\n activate A\n A->>PM: request.map(ctx)\n PM-->>A: upstream request\n A->>CC: chat(req)\n CC->>UP: POST\n UP-->>CC: JSON response\n CC-->>A: upstream response\n A->>PM: response.map(ctx, res)\n PM-->>A: ResponseObject\n A->>SS: save(session)\n A-->>R: ResponseObject\n deactivate A\n R-->>C: JSON response\n end\n```\n\n## Component Model\n\n```mermaid\nclassDiagram\n direction TB\n\n class ApplicationContext {\n +config: GodeXConfig\n +logger: Logger\n +resolver: ModelResolver\n +registrar: Registrar\n +adapter: Adapter\n +sessionStore: ResponseSessionStore\n }\n\n class ResponsesContext {\n +app: ApplicationContext\n +request: ResponseCreateRequest\n +session: ResponseSessionSnapshot\n +resolved: ResolvedModel\n +provider: Provider\n +responseId: string\n +requestId: string\n +logger: Logger\n +create(app, body)$ Promise~ResponsesContext~\n }\n\n class ModelResolver {\n -defaultProvider: string\n -providerConfigs: Record\n +resolve(model) ResolvedModel\n }\n\n class Registrar {\n -factories: Map~string, ProviderFactory~\n +registerFactory(name, factory)\n +build(providers)\n +resolve(name) Provider\n +list() string[]\n }\n\n class Adapter {\n <<interface>>\n +request(ctx) Promise~ResponseObject~\n +stream(ctx) Promise~ReadableStream~\n }\n\n class DefaultAdapter {\n +request(ctx) Promise~ResponseObject~\n +stream(ctx) Promise~ReadableStream~\n }\n\n class Provider {\n <<interface>>\n +name: string\n +mapper: ProviderMapper\n +chatClient: ChatClient\n +capabilities: ProviderCapabilities\n }\n\n class ProviderMapper {\n <<interface>>\n +request: RequestMapper\n +response: ResponseMapper\n +stream: StreamMapper\n }\n\n class ChatClient {\n <<interface>>\n +chat(req) Promise~TRes~\n +streamChat(req) Promise~ReadableStream~\n }\n\n class RequestMapper {\n <<interface>>\n +map(ctx) TReq\n }\n\n class ResponseMapper {\n <<interface>>\n +map(ctx, result) ResponseObject\n }\n\n class StreamMapper {\n <<interface>>\n +map(ctx, event) ResponseStreamEvent[]\n +buildResponseObject(ctx, state) ResponseObject\n }\n\n class ResponseSessionStore {\n <<interface>>\n +get(id) StoredResponseSession\n +save(session, opts)\n +resolveChain(id, opts) ResponseSessionSnapshot\n +delete(id)\n +close()\n }\n\n class Router {\n -routes: Route[]\n +register(route)\n +dispatch(req) Promise~Response~\n }\n\n ApplicationContext --> ResponsesContext : creates\n ApplicationContext --> ModelResolver\n ApplicationContext --> Registrar\n ApplicationContext --> Adapter\n ApplicationContext --> ResponseSessionStore\n ResponsesContext --> Provider : uses\n Provider --> ProviderMapper\n Provider --> ChatClient\n ProviderMapper --> RequestMapper\n ProviderMapper --> ResponseMapper\n ProviderMapper --> StreamMapper\n Adapter <|.. DefaultAdapter\n DefaultAdapter --> ProviderMapper : calls\n DefaultAdapter --> ChatClient : calls\n DefaultAdapter --> ResponseSessionStore : saves\n Router --> ResponsesContext : dispatches to\n```\n\n## Stream Pipeline\n\n```mermaid\nflowchart LR\n subgraph upstream[\"Upstream Provider\"]\n SSE[\"SSE Chunks<br/>(JsonServerSentEvent)\"]\n end\n\n subgraph godex[\"GodeX Stream Pipeline\"]\n T1[\"ProviderEventTo<br/>ResponseTransformer\"]\n T2[\"ResponseSession<br/>PersistenceTransformer\"]\n T3[\"ResponseSse<br/>EncodeTransformer\"]\n end\n\n subgraph client[\"Client\"]\n BYTES[\"SSE Bytes<br/>(text/event-stream)\"]\n end\n\n SSE -->|\"pipeThrough(TransformStream)\"| T1\n T1 -->|\"per-event map()<br/>SSE chunk → ResponseStreamEvent[]\"| T2\n T2 -->|\"accumulate StreamState<br/>intercept terminal event<br/>buildResponseObject()<br/>save session\"| T3\n T3 -->|\"serialize to SSE wire format<br/>event: xxx\\ndata: {...}\\n\\n\"| BYTES\n\n style upstream fill:#1a1a2e,stroke:#16213e,color:#e0e0e0\n style godex fill:#0f3460,stroke:#16213e,color:#e0e0e0\n style client fill:#1a1a2e,stroke:#16213e,color:#e0e0e0\n```\n\n### Transformer Roles\n\n| Stage | Transformer | Input | Output | Side Effects |\n|-------|------------|-------|--------|-------------|\n| 1 | `ProviderEventToResponseTransformer` | `JsonServerSentEvent<TChunk>` | `ResponseStreamEvent` | Calls `StreamMapper.map()` per event |\n| 2 | `ResponseSessionPersistenceTransformer` | `ResponseStreamEvent` | `ResponseStreamEvent` | Accumulates `StreamState`, on terminal event calls `buildResponseObject()` + saves session (skipped when `store=false`) |\n| 3 | `ResponseSseEncodeTransformer` | `ResponseStreamEvent` | `Uint8Array` (SSE wire format) | Serializes to `event:` / `data:` lines |\n\n## Error Hierarchy\n\n```mermaid\nclassDiagram\n direction TB\n\n class GodeXError {\n +name: string\n +code: string\n +status: number\n +context: object\n +toLogEntry() object\n }\n\n class ServerError {\n +status: 400-499\n +context: object\n }\n\n class AdapterError {\n +status: 400-499\n +context: unsupported parameters / tools / input items\n }\n\n class ProviderError {\n +status: 502\n +context: upstream status / body / headers\n }\n\n class SessionError {\n +status: 400-409\n +context: chain metadata\n }\n\n GodeXError <|-- ServerError\n GodeXError <|-- AdapterError\n GodeXError <|-- ProviderError\n GodeXError <|-- SessionError\n\n note for GodeXError \"Base error with structured logging support.<br/>All errors carry domain codes (e.g. server.request.invalid_json).\"\n note for ProviderError \"Wraps upstream HTTP failures:<br/>rate limits, timeouts, 5xx.\"\n note for SessionError \"Chain resolution failures:<br/>not found, cycles, depth exceeded.\"\n```\n\n## Project Structure\n\n```\nsrc/\n├── cli/ Commander CLI (serve, config check, init)\n├── config/ godex.yaml schema, env interpolation, defaults\n├── context/ ApplicationContext (DI container), ResponsesContext (per-request)\n├── adapter/ Adapter interface, DefaultAdapter, stream transformers\n│ ├── mapper/ RequestMapper / ResponseMapper / StreamMapper contracts\n│ └── transformers/ ProviderEvent → Response → SSE encode pipeline\n├── providers/ Provider registry + builtin factories\n│ └── zhipu/ Reference provider: mapper, chat-client, tools, messages\n├── resolver/ ModelResolver (model selector → provider + model)\n├── server/ Bun HTTP server, Router, routes (/v1/responses, /health, /v1/models)\n├── session/ ResponseSessionStore (Memory + SQLite), chain resolution\n├── error/ GodeXError hierarchy with domain codes\n├── protocol/openai/ OpenAI-compatible type definitions\n├── logger/ Structured JSON logger\n└── e2e/ End-to-end tests with mocked upstream\n```\n\n## Quick Start\n\n```bash\n# Install dependencies\nbun install\n\n# Build standalone binary (current platform)\nbun run build\n\n# Create config interactively\nbun run start -- init\n\n# Start server (default port 5678)\nbun run dev\n\n# Or run the compiled binary directly\n./platforms/darwin-arm64/bin/godex serve\n```\n\n### godex.yaml\n\n```yaml\nserver:\n port: 5678\n\ndefault_provider: zhipu\n\nproviders:\n zhipu:\n api_key: ${ZHIPU_API_KEY}\n base_url: https://open.bigmodel.cn/api/coding/paas/v4\n models:\n \"gpt-4o\": glm-4.7 # model name mapping\n \"*\": glm-5.1 # catch-all fallback\n\nsession:\n backend: sqlite # or \"memory\"\n sqlite:\n path: ./data/sessions.db\n\nlogging:\n level: info # trace | debug | info | warn | error\n```\n\n### Adding a Provider\n\nImplement these interfaces in `src/providers/<name>/`:\n\n| Interface | Purpose |\n|-----------|---------|\n| `Provider<TReq, TRes, TChunk>` | Bundles mapper + chatClient + capabilities |\n| `ProviderMapper<TReq, TRes, TChunk>` | request / response / stream mapping functions |\n| `ChatClient<TReq, TRes, TChunk>` | `chat()` and `streamChat()` HTTP calls |\n\nRegister the factory in `src/providers/builtin.ts`:\n\n```ts\nregistrar.registerFactory(\"myprovider\", (config) =>\n createMyProvider(config) as Provider<unknown, unknown, unknown>\n);\n```\n\n## Usage\n\n```bash\n# Install — no Bun required at runtime\nnpm install -g @ahoo-wang/godex\n\n# Create config interactively\ngodex init\n\n# Start the gateway\ngodex serve\n```\n\nGodeX ships as a **standalone native binary** with zero runtime dependencies. npm's `postinstall` automatically selects the correct binary for your platform. The only prerequisite is Node.js >= 18 (needed only during `npm install`).\n\nGodeX exposes an **OpenAI-compatible Responses API** at `http://localhost:5678` (port is configurable). Point any tool that speaks the OpenAI protocol at this endpoint:\n\n### With Codex CLI\n\n```bash\nexport OPENAI_BASE_URL=http://localhost:5678/v1\nexport OPENAI_API_KEY=any-value # not validated by GodeX, must be set\ncodex\n```\n\n### With OpenAI SDK\n\n```ts\nimport OpenAI from \"openai\";\n\nconst client = new OpenAI({\n baseURL: \"http://localhost:5678/v1\",\n apiKey: \"any-value\", // passed through, not validated\n});\n\nconst response = await client.responses.create({\n model: \"gpt-4o\", // mapped to glm-4.7 via godex.yaml models table\n input: \"Hello!\",\n});\n```\n\n### Model selection\n\n```\nmodel: \"gpt-4o\" → resolved via default_provider model mapping\nmodel: \"zhipu/glm-4.7\" → explicit provider/model selector\nmodel: \"openai/gpt-4o\" → routes to configured openai provider\n```\n\nThe `models` map in `godex.yaml` lets you translate standard model names into provider-native ones — no code changes needed in the client.\n\n### Health check\n\n```bash\ncurl http://localhost:5678/health\n# {\"status\":\"ok\",\"providers\":[\"zhipu\"],\"unsupported_providers\":[]}\n```\n\n## Publishing\n\nThe main `@ahoo-wang/godex` npm package is a lightweight shell. Native binaries are shipped as platform-specific optional dependencies:\n\n```\n@ahoo-wang/godex (wrapper package, 0 runtime deps)\n├── engines: { node: \">=18.0.0\" } ← only for postinstall\n├── postinstall: scripts/install.cjs ← detects platform, links binary\n└── optionalDependencies:\n ├── @ahoo-wang/godex-darwin-arm64 ← macOS Apple Silicon\n ├── @ahoo-wang/godex-darwin-x64 ← macOS Intel\n ├── @ahoo-wang/godex-linux-x64 ← Linux x86_64\n ├── @ahoo-wang/godex-linux-arm64 ← Linux ARM64\n ├── @ahoo-wang/godex-win32-x64 ← Windows x86_64\n └── @ahoo-wang/godex-win32-arm64 ← Windows ARM64\n\n# Publishing flow:\n# 1. Make the GitHub repository public, configure NPM_TOKEN, then push the release commit.\n# 2. Create a GitHub Release tagged vX.Y.Z.\n# 3. The Release workflow builds all platform binaries.\n# 4. The Release workflow uploads binary archives and SHA256SUMS to Release Assets.\n# 5. The Release workflow publishes platform packages first, then @ahoo-wang/godex.\n```\n\n## Commands\n\n```bash\nbun run dev # Hot-reload dev server on port 13145\nbun run build # Compile native binary for current platform\nbun run compile:all # Cross-compile all 6 platforms locally\nbun run test # Unit + integration tests\nbun run test:e2e # E2E with mocked upstream\nbun run typecheck # tsc --noEmit\nbun run lint # Biome check\nbun run ci # Full CI pipeline\n```\n"}, "4efdae266f9afddefd1bb315f1ce0ca0eec2bc37": {"t": 1785748595.9668593, "n": 14008, "h": "68bfa99d01237efe", "c": "# Godex\n\nOpenAI Responses API gateway — translates `/v1/responses` into upstream Chat Completions API calls, so **any LLM provider can drive Codex**.\n\n[](https://codecov.io/gh/Ahoo-Wang/Godex)\n[](https://bun.sh)\n[](https://www.typescriptlang.org/)\n\n## Architecture\n\n```mermaid\nC4Context\n title Godex — System Context\n\n Person(user, \"Developer / Codex CLI\", \"Sends Responses API requests<br/>via the OpenAI-compatible endpoint\")\n System(godex_svr, \"Godex Server\", \"Translates Responses API → Chat Completions API<br/>Bun HTTP server on configurable port\")\n SystemDb(sessions, \"Session Store\", \"Stores response history for<br/>previous_response_id chain resolution<br/>SQLite (persistent) or In-Memory\")\n System_Ext(zhipu, \"Zhipu (智谱)\", \"Chat Completions API provider\")\n System_Ext(openai, \"OpenAI\", \"Chat Completions API provider\")\n System_Ext(other, \"Custom Provider\", \"Any Chat Completions<br/>compatible backend\")\n\n Rel(user, godex_svr, \"POST /v1/responses, GET /v1/models, GET /health\", \"HTTP/SSE\")\n Rel(godex_svr, sessions, \"save / resolve chains\")\n Rel(godex_svr, zhipu, \"POST /chat/completions\", \"HTTPS\")\n Rel(godex_svr, openai, \"POST /chat/completions\", \"HTTPS\")\n Rel(godex_svr, other, \"POST /chat/completions\", \"HTTPS\")\n```\n\n## Request Flow\n\n```mermaid\nsequenceDiagram\n actor C as Client (Codex CLI)\n participant R as Router\n participant AC as ApplicationContext\n participant RC as ResponsesContext\n participant MR as ModelResolver\n participant SS as SessionStore\n participant REG as Registrar\n participant A as Adapter (DefaultAdapter)\n participant PM as ProviderMapper\n participant CC as ChatClient\n participant UP as Upstream API\n\n C->>R: POST /v1/responses\n R->>RC: ResponsesContext.create(app, body)\n\n activate RC\n RC->>MR: resolve(model)\n MR-->>RC: { provider, model }\n RC->>RC: validate provider config\n\n opt previous_response_id\n RC->>SS: resolveChain(id)\n SS-->>RC: session snapshot\n end\n\n RC->>REG: resolve(provider)\n REG-->>RC: Provider instance\n deactivate RC\n\n alt stream = true\n R->>A: adapter.stream(ctx)\n activate A\n A->>PM: request.map(ctx)\n PM-->>A: upstream request\n A->>CC: streamChat(req)\n CC->>UP: POST (SSE)\n UP-->>CC: SSE chunks\n CC-->>A: ReadableStream<SSE>\n A->>A: pipeTransform → ProviderEventToResponseTransformer\n A->>A: pipeTransform → ResponseSessionPersistenceTransformer\n A-->>R: ReadableStream<ResponseStreamEvent>\n deactivate A\n R->>R: pipeTransform → ResponseSseEncodeTransformer\n R-->>C: SSE byte stream\n else stream = false\n R->>A: adapter.request(ctx)\n activate A\n A->>PM: request.map(ctx)\n PM-->>A: upstream request\n A->>CC: chat(req)\n CC->>UP: POST\n UP-->>CC: JSON response\n CC-->>A: upstream response\n A->>PM: response.map(ctx, res)\n PM-->>A: ResponseObject\n A->>SS: save(session)\n A-->>R: ResponseObject\n deactivate A\n R-->>C: JSON response\n end\n```\n\n## Component Model\n\n```mermaid\nclassDiagram\n direction TB\n\n class ApplicationContext {\n +config: GodexConfig\n +logger: Logger\n +resolver: ModelResolver\n +registrar: Registrar\n +adapter: Adapter\n +sessionStore: ResponseSessionStore\n }\n\n class ResponsesContext {\n +app: ApplicationContext\n +request: ResponseCreateRequest\n +session: ResponseSessionSnapshot\n +resolved: ResolvedModel\n +provider: Provider\n +responseId: string\n +requestId: string\n +logger: Logger\n +create(app, body)$ Promise~ResponsesContext~\n }\n\n class ModelResolver {\n -defaultProvider: string\n -providerConfigs: Record\n +resolve(model) ResolvedModel\n }\n\n class Registrar {\n -factories: Map~string, ProviderFactory~\n +registerFactory(name, factory)\n +build(providers)\n +resolve(name) Provider\n +list() string[]\n }\n\n class Adapter {\n <<interface>>\n +request(ctx) Promise~ResponseObject~\n +stream(ctx) Promise~ReadableStream~\n }\n\n class DefaultAdapter {\n +request(ctx) Promise~ResponseObject~\n +stream(ctx) Promise~ReadableStream~\n }\n\n class Provider {\n <<interface>>\n +name: string\n +mapper: ProviderMapper\n +chatClient: ChatClient\n +capabilities: ProviderCapabilities\n }\n\n class ProviderMapper {\n <<interface>>\n +request: RequestMapper\n +response: ResponseMapper\n +stream: StreamMapper\n }\n\n class ChatClient {\n <<interface>>\n +chat(req) Promise~TRes~\n +streamChat(req) Promise~ReadableStream~\n }\n\n class RequestMapper {\n <<interface>>\n +map(ctx) TReq\n }\n\n class ResponseMapper {\n <<interface>>\n +map(ctx, result) ResponseObject\n }\n\n class StreamMapper {\n <<interface>>\n +map(ctx, event) ResponseStreamEvent[]\n +buildResponseObject(ctx, state) ResponseObject\n }\n\n class ResponseSessionStore {\n <<interface>>\n +get(id) StoredResponseSession\n +save(session, opts)\n +resolveChain(id, opts) ResponseSessionSnapshot\n +delete(id)\n +close()\n }\n\n class Router {\n -routes: Route[]\n +register(route)\n +dispatch(req) Promise~Response~\n }\n\n ApplicationContext --> ResponsesContext : creates\n ApplicationContext --> ModelResolver\n ApplicationContext --> Registrar\n ApplicationContext --> Adapter\n ApplicationContext --> ResponseSessionStore\n ResponsesContext --> Provider : uses\n Provider --> ProviderMapper\n Provider --> ChatClient\n ProviderMapper --> RequestMapper\n ProviderMapper --> ResponseMapper\n ProviderMapper --> StreamMapper\n Adapter <|.. DefaultAdapter\n DefaultAdapter --> ProviderMapper : calls\n DefaultAdapter --> ChatClient : calls\n DefaultAdapter --> ResponseSessionStore : saves\n Router --> ResponsesContext : dispatches to\n```\n\n## Stream Pipeline\n\n```mermaid\nflowchart LR\n subgraph upstream[\"Upstream Provider\"]\n SSE[\"SSE Chunks<br/>(JsonServerSentEvent)\"]\n end\n\n subgraph godex[\"Godex Stream Pipeline\"]\n T1[\"ProviderEventTo<br/>ResponseTransformer\"]\n T2[\"ResponseSession<br/>PersistenceTransformer\"]\n T3[\"ResponseSse<br/>EncodeTransformer\"]\n end\n\n subgraph client[\"Client\"]\n BYTES[\"SSE Bytes<br/>(text/event-stream)\"]\n end\n\n SSE -->|\"pipeThrough(TransformStream)\"| T1\n T1 -->|\"per-event map()<br/>SSE chunk → ResponseStreamEvent[]\"| T2\n T2 -->|\"accumulate StreamState<br/>intercept terminal event<br/>buildResponseObject()<br/>save session\"| T3\n T3 -->|\"serialize to SSE wire format<br/>event: xxx\\ndata: {...}\\n\\n\"| BYTES\n\n style upstream fill:#1a1a2e,stroke:#16213e,color:#e0e0e0\n style godex fill:#0f3460,stroke:#16213e,color:#e0e0e0\n style client fill:#1a1a2e,stroke:#16213e,color:#e0e0e0\n```\n\n### Transformer Roles\n\n| Stage | Transformer | Input | Output | Side Effects |\n|-------|------------|-------|--------|-------------|\n| 1 | `ProviderEventToResponseTransformer` | `JsonServerSentEvent<TChunk>` | `ResponseStreamEvent` | Calls `StreamMapper.map()` per event |\n| 2 | `ResponseSessionPersistenceTransformer` | `ResponseStreamEvent` | `ResponseStreamEvent` | Accumulates `StreamState`, on terminal event calls `buildResponseObject()` + saves session (skipped when `store=false`) |\n| 3 | `ResponseSseEncodeTransformer` | `ResponseStreamEvent` | `Uint8Array` (SSE wire format) | Serializes to `event:` / `data:` lines |\n\n## Error Hierarchy\n\n```mermaid\nclassDiagram\n direction TB\n\n class GodexError {\n +name: string\n +code: string\n +status: number\n +context: object\n +toLogEntry() object\n }\n\n class ServerError {\n +status: 400-499\n +context: object\n }\n\n class AdapterError {\n +status: 400-499\n +context: unsupported parameters / tools / input items\n }\n\n class ProviderError {\n +status: 502\n +context: upstream status / body / headers\n }\n\n class SessionError {\n +status: 400-409\n +context: chain metadata\n }\n\n GodexError <|-- ServerError\n GodexError <|-- AdapterError\n GodexError <|-- ProviderError\n GodexError <|-- SessionError\n\n note for GodexError \"Base error with structured logging support.<br/>All errors carry domain codes (e.g. server.request.invalid_json).\"\n note for ProviderError \"Wraps upstream HTTP failures:<br/>rate limits, timeouts, 5xx.\"\n note for SessionError \"Chain resolution failures:<br/>not found, cycles, depth exceeded.\"\n```\n\n## Project Structure\n\n```\nsrc/\n├── cli/ Commander CLI (serve, config check, init)\n├── config/ godex.yaml schema, env interpolation, defaults\n├── context/ ApplicationContext (DI container), ResponsesContext (per-request)\n├── adapter/ Adapter interface, DefaultAdapter, stream transformers\n│ ├── mapper/ RequestMapper / ResponseMapper / StreamMapper contracts\n│ └── transformers/ ProviderEvent → Response → SSE encode pipeline\n├── providers/ Provider registry + builtin factories\n│ └── zhipu/ Reference provider: mapper, chat-client, tools, messages\n├── resolver/ ModelResolver (model selector → provider + model)\n├── server/ Bun HTTP server, Router, routes (/v1/responses, /health, /v1/models)\n├── session/ ResponseSessionStore (Memory + SQLite), chain resolution\n├── error/ GodexError hierarchy with domain codes\n├── protocol/openai/ OpenAI-compatible type definitions\n├── logger/ Structured JSON logger\n└── e2e/ End-to-end tests with mocked upstream\n```\n\n## Quick Start\n\n```bash\n# Install dependencies\nbun install\n\n# Build standalone binary (current platform)\nbun run build\n\n# Create config interactively\nbun run start -- init\n\n# Start server (default port 5678)\nbun run dev\n\n# Or run the compiled binary directly\n./platforms/darwin-arm64/bin/godex serve\n```\n\n### godex.yaml\n\n```yaml\nserver:\n port: 5678\n\ndefault_provider: zhipu\n\nproviders:\n zhipu:\n api_key: ${ZHIPU_API_KEY}\n base_url: https://open.bigmodel.cn/api/coding/paas/v4\n models:\n \"gpt-4o\": glm-4.7 # model name mapping\n \"*\": glm-5.1 # catch-all fallback\n\nsession:\n backend: sqlite # or \"memory\"\n sqlite:\n path: ./data/sessions.db\n\nlogging:\n level: info # trace | debug | info | warn | error\n```\n\n### Adding a Provider\n\nImplement these interfaces in `src/providers/<name>/`:\n\n| Interface | Purpose |\n|-----------|---------|\n| `Provider<TReq, TRes, TChunk>` | Bundles mapper + chatClient + capabilities |\n| `ProviderMapper<TReq, TRes, TChunk>` | request / response / stream mapping functions |\n| `ChatClient<TReq, TRes, TChunk>` | `chat()` and `streamChat()` HTTP calls |\n\nRegister the factory in `src/providers/builtin.ts`:\n\n```ts\nregistrar.registerFactory(\"myprovider\", (config) =>\n createMyProvider(config) as Provider<unknown, unknown, unknown>\n);\n```\n\n## Usage\n\n```bash\n# Install — no Bun required at runtime\nnpm install -g @ahoo-wang/godex\n\n# Create config interactively\ngodex init\n\n# Start the gateway\ngodex serve\n```\n\nGodex ships as a **standalone native binary** with zero runtime dependencies. npm's `postinstall` automatically selects the correct binary for your platform. The only prerequisite is Node.js >= 18 (needed only during `npm install`).\n\nGodex exposes an **OpenAI-compatible Responses API** at `http://localhost:5678` (port is configurable). Point any tool that speaks the OpenAI protocol at this endpoint:\n\n### With Codex CLI\n\n```bash\nexport OPENAI_BASE_URL=http://localhost:5678/v1\nexport OPENAI_API_KEY=any-value # not validated by Godex, must be set\ncodex\n```\n\n### With OpenAI SDK\n\n```ts\nimport OpenAI from \"openai\";\n\nconst client = new OpenAI({\n baseURL: \"http://localhost:5678/v1\",\n apiKey: \"any-value\", // passed through, not validated\n});\n\nconst response = await client.responses.create({\n model: \"gpt-4o\", // mapped to glm-4.7 via godex.yaml models table\n input: \"Hello!\",\n});\n```\n\n### Model selection\n\n```\nmodel: \"gpt-4o\" → resolved via default_provider model mapping\nmodel: \"zhipu/glm-4.7\" → explicit provider/model selector\nmodel: \"openai/gpt-4o\" → routes to configured openai provider\n```\n\nThe `models` map in `godex.yaml` lets you translate standard model names into provider-native ones — no code changes needed in the client.\n\n### Health check\n\n```bash\ncurl http://localhost:5678/health\n# {\"status\":\"ok\",\"providers\":[\"zhipu\"],\"unsupported_providers\":[]}\n```\n\n## Publishing\n\nThe main `@ahoo-wang/godex` npm package is a lightweight shell. Native binaries are shipped as platform-specific optional dependencies:\n\n```\n@ahoo-wang/godex (wrapper package, 0 runtime deps)\n├── engines: { node: \">=18.0.0\" } ← only for postinstall\n├── postinstall: scripts/install.cjs ← detects platform, links binary\n└── optionalDependencies:\n ├── @ahoo-wang/godex-darwin-arm64 ← macOS Apple Silicon\n ├── @ahoo-wang/godex-darwin-x64 ← macOS Intel\n ├── @ahoo-wang/godex-linux-x64 ← Linux x86_64\n ├── @ahoo-wang/godex-linux-arm64 ← Linux ARM64\n ├── @ahoo-wang/godex-win32-x64 ← Windows x86_64\n └── @ahoo-wang/godex-win32-arm64 ← Windows ARM64\n\n# Publishing flow:\n# 1. Make the GitHub repository public, configure NPM_TOKEN, then push the release commit.\n# 2. Create a GitHub Release tagged vX.Y.Z.\n# 3. The Release workflow builds all platform binaries.\n# 4. The Release workflow uploads binary archives and SHA256SUMS to Release Assets.\n# 5. The Release workflow publishes platform packages first, then @ahoo-wang/godex.\n```\n\n## Commands\n\n```bash\nbun run dev # Hot-reload dev server on port 13145\nbun run build # Compile native binary for current platform\nbun run compile:all # Cross-compile all 6 platforms locally\nbun run test # Unit + integration tests\nbun run test:e2e # E2E with mocked upstream\nbun run typecheck # tsc --noEmit\nbun run lint # Biome check\nbun run ci # Full CI pipeline\n```\n"}, "c5fd6efd9acc242e7d855f8cc3bcdb2cd0c34ac3": {"t": 1785748600.2031837, "n": 14001, "h": "f439ea7839c6a250", "c": "# Godex\n\nOpenAI Responses API gateway — translates `/v1/responses` into upstream Chat Completions API calls, so **any LLM provider can drive Codex**.\n\n[](https://codecov.io/gh/Ahoo-Wang/Godex)\n[](https://bun.sh)\n[](https://www.typescriptlang.org/)\n\n## Architecture\n\n```mermaid\nC4Context\n title Godex — System Context\n\n Person(user, \"Developer / Codex CLI\", \"Sends Responses API requests<br/>via the OpenAI-compatible endpoint\")\n System(godex_svr, \"Godex Server\", \"Translates Responses API → Chat Completions API<br/>Bun HTTP server on configurable port\")\n SystemDb(sessions, \"Session Store\", \"Stores response history for<br/>previous_response_id chain resolution<br/>SQLite (persistent) or In-Memory\")\n System_Ext(zhipu, \"Zhipu (智谱)\", \"Chat Completions API provider\")\n System_Ext(openai, \"OpenAI\", \"Chat Completions API provider\")\n System_Ext(other, \"Custom Provider\", \"Any Chat Completions<br/>compatible backend\")\n\n Rel(user, godex_svr, \"POST /v1/responses, GET /v1/models, GET /health\", \"HTTP/SSE\")\n Rel(godex_svr, sessions, \"save / resolve chains\")\n Rel(godex_svr, zhipu, \"POST /chat/completions\", \"HTTPS\")\n Rel(godex_svr, openai, \"POST /chat/completions\", \"HTTPS\")\n Rel(godex_svr, other, \"POST /chat/completions\", \"HTTPS\")\n```\n\n## Request Flow\n\n```mermaid\nsequenceDiagram\n actor C as Client (Codex CLI)\n participant R as Router\n participant AC as ApplicationContext\n participant RC as ResponsesContext\n participant MR as ModelResolver\n participant SS as SessionStore\n participant REG as Registrar\n participant A as Adapter (DefaultAdapter)\n participant PM as ProviderMapper\n participant CC as ChatClient\n participant UP as Upstream API\n\n C->>R: POST /v1/responses\n R->>RC: ResponsesContext.create(app, body)\n\n activate RC\n RC->>MR: resolve(model)\n MR-->>RC: { provider, model }\n RC->>RC: validate provider config\n\n opt previous_response_id\n RC->>SS: resolveChain(id)\n SS-->>RC: session snapshot\n end\n\n RC->>REG: resolve(provider)\n REG-->>RC: Provider instance\n deactivate RC\n\n alt stream = true\n R->>A: adapter.stream(ctx)\n activate A\n A->>PM: request.map(ctx)\n PM-->>A: upstream request\n A->>CC: streamChat(req)\n CC->>UP: POST (SSE)\n UP-->>CC: SSE chunks\n CC-->>A: ReadableStream<SSE>\n A->>A: pipeTransform → ProviderEventToResponseTransformer\n A->>A: pipeTransform → ResponseSessionPersistenceTransformer\n A-->>R: ReadableStream<ResponseStreamEvent>\n deactivate A\n R->>R: pipeTransform → ResponseSseEncodeTransformer\n R-->>C: SSE byte stream\n else stream = false\n R->>A: adapter.request(ctx)\n activate A\n A->>PM: request.map(ctx)\n PM-->>A: upstream request\n A->>CC: chat(req)\n CC->>UP: POST\n UP-->>CC: JSON response\n CC-->>A: upstream response\n A->>PM: response.map(ctx, res)\n PM-->>A: ResponseObject\n A->>SS: save(session)\n A-->>R: ResponseObject\n deactivate A\n R-->>C: JSON response\n end\n```\n\n## Component Model\n\n```mermaid\nclassDiagram\n direction TB\n\n class ApplicationContext {\n +config: GodexConfig\n +logger: Logger\n +resolver: ModelResolver\n +registrar: Registrar\n +adapter: Adapter\n +sessionStore: ResponseSessionStore\n }\n\n class ResponsesContext {\n +app: ApplicationContext\n +request: ResponseCreateRequest\n +session: ResponseSessionSnapshot\n +resolved: ResolvedModel\n +provider: Provider\n +responseId: string\n +requestId: string\n +logger: Logger\n +create(app, body)$ Promise~ResponsesContext~\n }\n\n class ModelResolver {\n -defaultProvider: string\n -providerConfigs: Record\n +resolve(model) ResolvedModel\n }\n\n class Registrar {\n -factories: Map~string, ProviderFactory~\n +registerFactory(name, factory)\n +build(providers)\n +resolve(name) Provider\n +list() string[]\n }\n\n class Adapter {\n <<interface>>\n +request(ctx) Promise~ResponseObject~\n +stream(ctx) Promise~ReadableStream~\n }\n\n class DefaultAdapter {\n +request(ctx) Promise~ResponseObject~\n +stream(ctx) Promise~ReadableStream~\n }\n\n class Provider {\n <<interface>>\n +name: string\n +mapper: ProviderMapper\n +chatClient: ChatClient\n +capabilities: ProviderCapabilities\n }\n\n class ProviderMapper {\n <<interface>>\n +request: RequestMapper\n +response: ResponseMapper\n +stream: StreamMapper\n }\n\n class ChatClient {\n <<interface>>\n +chat(req) Promise~TRes~\n +streamChat(req) Promise~ReadableStream~\n }\n\n class RequestMapper {\n <<interface>>\n +map(ctx) TReq\n }\n\n class ResponseMapper {\n <<interface>>\n +map(ctx, result) ResponseObject\n }\n\n class StreamMapper {\n <<interface>>\n +map(ctx, event) ResponseStreamEvent[]\n +buildResponseObject(ctx, state) ResponseObject\n }\n\n class ResponseSessionStore {\n <<interface>>\n +get(id) StoredResponseSession\n +save(session, opts)\n +resolveChain(id, opts) ResponseSessionSnapshot\n +delete(id)\n +close()\n }\n\n class Router {\n -routes: Route[]\n +register(route)\n +dispatch(req) Promise~Response~\n }\n\n ApplicationContext --> ResponsesContext : creates\n ApplicationContext --> ModelResolver\n ApplicationContext --> Registrar\n ApplicationContext --> Adapter\n ApplicationContext --> ResponseSessionStore\n ResponsesContext --> Provider : uses\n Provider --> ProviderMapper\n Provider --> ChatClient\n ProviderMapper --> RequestMapper\n ProviderMapper --> ResponseMapper\n ProviderMapper --> StreamMapper\n Adapter <|.. DefaultAdapter\n DefaultAdapter --> ProviderMapper : calls\n DefaultAdapter --> ChatClient : calls\n DefaultAdapter --> ResponseSessionStore : saves\n Router --> ResponsesContext : dispatches to\n```\n\n## Stream Pipeline\n\n```mermaid\nflowchart LR\n subgraph upstream[\"Upstream Provider\"]\n SSE[\"SSE Chunks<br/>(JsonServerSentEvent)\"]\n end\n\n subgraph godex[\"Godex Stream Pipeline\"]\n T1[\"ProviderEventTo<br/>ResponseTransformer\"]\n T2[\"ResponseSession<br/>PersistenceTransformer\"]\n T3[\"ResponseSse<br/>EncodeTransformer\"]\n end\n\n subgraph client[\"Client\"]\n BYTES[\"SSE Bytes<br/>(text/event-stream)\"]\n end\n\n SSE -->|\"pipeThrough(TransformStream)\"| T1\n T1 -->|\"per-event map()<br/>SSE chunk → ResponseStreamEvent[]\"| T2\n T2 -->|\"accumulate StreamState<br/>intercept terminal event<br/>buildResponseObject()<br/>save session\"| T3\n T3 -->|\"serialize to SSE wire format<br/>event: xxx\\ndata: {...}\\n\\n\"| BYTES\n\n style upstream fill:#1a1a2e,stroke:#16213e,color:#e0e0e0\n style godex fill:#0f3460,stroke:#16213e,color:#e0e0e0\n style client fill:#1a1a2e,stroke:#16213e,color:#e0e0e0\n```\n\n### Transformer Roles\n\n| Stage | Transformer | Input | Output | Side Effects |\n|-------|------------|-------|--------|-------------|\n| 1 | `ProviderEventToResponseTransformer` | `JsonServerSentEvent<TChunk>` | `ResponseStreamEvent` | Calls `StreamMapper.map()` per event |\n| 2 | `ResponseSessionPersistenceTransformer` | `ResponseStreamEvent` | `ResponseStreamEvent` | Accumulates `StreamState`, on terminal event calls `buildResponseObject()` + saves session (skipped when `store=false`) |\n| 3 | `ResponseSseEncodeTransformer` | `ResponseStreamEvent` | `Uint8Array` (SSE wire format) | Serializes to `event:` / `data:` lines |\n\n## Error Hierarchy\n\n```mermaid\nclassDiagram\n direction TB\n\n class GodexError {\n +name: string\n +code: string\n +status: number\n +context: object\n +toLogEntry() object\n }\n\n class ServerError {\n +status: 400-499\n +context: object\n }\n\n class AdapterError {\n +status: 400-499\n +context: unsupported parameters / tools / input items\n }\n\n class ProviderError {\n +status: 502\n +context: upstream status / body / headers\n }\n\n class SessionError {\n +status: 400-409\n +context: chain metadata\n }\n\n GodexError <|-- ServerError\n GodexError <|-- AdapterError\n GodexError <|-- ProviderError\n GodexError <|-- SessionError\n\n note for GodexError \"Base error with structured logging support.<br/>All errors carry domain codes (e.g. server.request.invalid_json).\"\n note for ProviderError \"Wraps upstream HTTP failures:<br/>rate limits, timeouts, 5xx.\"\n note for SessionError \"Chain resolution failures:<br/>not found, cycles, depth exceeded.\"\n```\n\n## Project Structure\n\n```\nsrc/\n├── cli/ Commander CLI (serve, config check, init)\n├── config/ godex.yaml schema, env interpolation, defaults\n├── context/ ApplicationContext (DI container), ResponsesContext (per-request)\n├── adapter/ Adapter interface, DefaultAdapter, stream transformers\n│ ├── mapper/ RequestMapper / ResponseMapper / StreamMapper contracts\n│ └── transformers/ ProviderEvent → Response → SSE encode pipeline\n├── providers/ Provider registry + builtin factories\n│ └── zhipu/ Reference provider: mapper, chat-client, tools, messages\n├── resolver/ ModelResolver (model selector → provider + model)\n├── server/ Bun HTTP server, Router, routes (/v1/responses, /health, /v1/models)\n├── session/ ResponseSessionStore (Memory + SQLite), chain resolution\n├── error/ GodexError hierarchy with domain codes\n├── protocol/openai/ OpenAI-compatible type definitions\n├── logger/ Structured JSON logger\n└── e2e/ End-to-end tests with mocked upstream\n```\n\n## Quick Start\n\n```bash\n# Install dependencies\nbun install\n\n# Build standalone binary (current platform)\nbun run build\n\n# Create config interactively\nbun run start -- init\n\n# Start server (default port 5678)\nbun run dev\n\n# Or run the compiled binary directly\n./platforms/darwin-arm64/bin/godex serve\n```\n\n### godex.yaml\n\n```yaml\nserver:\n port: 5678\n\ndefault_provider: zhipu\n\nproviders:\n zhipu:\n api_key: ${ZHIPU_API_KEY}\n base_url: https://open.bigmodel.cn/api/paas/v4\n models:\n \"gpt-4o\": glm-4.7 # model name mapping\n \"*\": glm-5.1 # catch-all fallback\n\nsession:\n backend: sqlite # or \"memory\"\n sqlite:\n path: ./data/sessions.db\n\nlogging:\n level: info # trace | debug | info | warn | error\n```\n\n### Adding a Provider\n\nImplement these interfaces in `src/providers/<name>/`:\n\n| Interface | Purpose |\n|-----------|---------|\n| `Provider<TReq, TRes, TChunk>` | Bundles mapper + chatClient + capabilities |\n| `ProviderMapper<TReq, TRes, TChunk>` | request / response / stream mapping functions |\n| `ChatClient<TReq, TRes, TChunk>` | `chat()` and `streamChat()` HTTP calls |\n\nRegister the factory in `src/providers/builtin.ts`:\n\n```ts\nregistrar.registerFactory(\"myprovider\", (config) =>\n createMyProvider(config) as Provider<unknown, unknown, unknown>\n);\n```\n\n## Usage\n\n```bash\n# Install — no Bun required at runtime\nnpm install -g @ahoo-wang/godex\n\n# Create config interactively\ngodex init\n\n# Start the gateway\ngodex serve\n```\n\nGodex ships as a **standalone native binary** with zero runtime dependencies. npm's `postinstall` automatically selects the correct binary for your platform. The only prerequisite is Node.js >= 18 (needed only during `npm install`).\n\nGodex exposes an **OpenAI-compatible Responses API** at `http://localhost:5678` (port is configurable). Point any tool that speaks the OpenAI protocol at this endpoint:\n\n### With Codex CLI\n\n```bash\nexport OPENAI_BASE_URL=http://localhost:5678/v1\nexport OPENAI_API_KEY=any-value # not validated by Godex, must be set\ncodex\n```\n\n### With OpenAI SDK\n\n```ts\nimport OpenAI from \"openai\";\n\nconst client = new OpenAI({\n baseURL: \"http://localhost:5678/v1\",\n apiKey: \"any-value\", // passed through, not validated\n});\n\nconst response = await client.responses.create({\n model: \"gpt-4o\", // mapped to glm-4.7 via godex.yaml models table\n input: \"Hello!\",\n});\n```\n\n### Model selection\n\n```\nmodel: \"gpt-4o\" → resolved via default_provider model mapping\nmodel: \"zhipu/glm-4.7\" → explicit provider/model selector\nmodel: \"openai/gpt-4o\" → routes to configured openai provider\n```\n\nThe `models` map in `godex.yaml` lets you translate standard model names into provider-native ones — no code changes needed in the client.\n\n### Health check\n\n```bash\ncurl http://localhost:5678/health\n# {\"status\":\"ok\",\"providers\":[\"zhipu\"],\"unsupported_providers\":[]}\n```\n\n## Publishing\n\nThe main `@ahoo-wang/godex` npm package is a lightweight shell. Native binaries are shipped as platform-specific optional dependencies:\n\n```\n@ahoo-wang/godex (wrapper package, 0 runtime deps)\n├── engines: { node: \">=18.0.0\" } ← only for postinstall\n├── postinstall: scripts/install.cjs ← detects platform, links binary\n└── optionalDependencies:\n ├── @ahoo-wang/godex-darwin-arm64 ← macOS Apple Silicon\n ├── @ahoo-wang/godex-darwin-x64 ← macOS Intel\n ├── @ahoo-wang/godex-linux-x64 ← Linux x86_64\n ├── @ahoo-wang/godex-linux-arm64 ← Linux ARM64\n ├── @ahoo-wang/godex-win32-x64 ← Windows x86_64\n └── @ahoo-wang/godex-win32-arm64 ← Windows ARM64\n\n# Publishing flow:\n# 1. Make the GitHub repository public, configure NPM_TOKEN, then push the release commit.\n# 2. Create a GitHub Release tagged vX.Y.Z.\n# 3. The Release workflow builds all platform binaries.\n# 4. The Release workflow uploads binary archives and SHA256SUMS to Release Assets.\n# 5. The Release workflow publishes platform packages first, then @ahoo-wang/godex.\n```\n\n## Commands\n\n```bash\nbun run dev # Hot-reload dev server on port 13145\nbun run build # Compile native binary for current platform\nbun run compile:all # Cross-compile all 6 platforms locally\nbun run test # Unit + integration tests\nbun run test:e2e # E2E with mocked upstream\nbun run typecheck # tsc --noEmit\nbun run lint # Biome check\nbun run ci # Full CI pipeline\n```\n"}, "9810874f9f6a26da6104ad12014ad184dec39781": {"t": 1785748601.3320577, "n": 13877, "h": "81173767ff437d51", "c": "# Godex\n\nOpenAI Responses API gateway — translates `/v1/responses` into upstream Chat Completions API calls, so **any LLM provider can drive Codex**.\n\n[](https://bun.sh)\n[](https://www.typescriptlang.org/)\n\n## Architecture\n\n```mermaid\nC4Context\n title Godex — System Context\n\n Person(user, \"Developer / Codex CLI\", \"Sends Responses API requests<br/>via the OpenAI-compatible endpoint\")\n System(godex_svr, \"Godex Server\", \"Translates Responses API → Chat Completions API<br/>Bun HTTP server on configurable port\")\n SystemDb(sessions, \"Session Store\", \"Stores response history for<br/>previous_response_id chain resolution<br/>SQLite (persistent) or In-Memory\")\n System_Ext(zhipu, \"Zhipu (智谱)\", \"Chat Completions API provider\")\n System_Ext(openai, \"OpenAI\", \"Chat Completions API provider\")\n System_Ext(other, \"Custom Provider\", \"Any Chat Completions<br/>compatible backend\")\n\n Rel(user, godex_svr, \"POST /v1/responses, GET /v1/models, GET /health\", \"HTTP/SSE\")\n Rel(godex_svr, sessions, \"save / resolve chains\")\n Rel(godex_svr, zhipu, \"POST /chat/completions\", \"HTTPS\")\n Rel(godex_svr, openai, \"POST /chat/completions\", \"HTTPS\")\n Rel(godex_svr, other, \"POST /chat/completions\", \"HTTPS\")\n```\n\n## Request Flow\n\n```mermaid\nsequenceDiagram\n actor C as Client (Codex CLI)\n participant R as Router\n participant AC as ApplicationContext\n participant RC as ResponsesContext\n participant MR as ModelResolver\n participant SS as SessionStore\n participant REG as Registrar\n participant A as Adapter (DefaultAdapter)\n participant PM as ProviderMapper\n participant CC as ChatClient\n participant UP as Upstream API\n\n C->>R: POST /v1/responses\n R->>RC: ResponsesContext.create(app, body)\n\n activate RC\n RC->>MR: resolve(model)\n MR-->>RC: { provider, model }\n RC->>RC: validate provider config\n\n opt previous_response_id\n RC->>SS: resolveChain(id)\n SS-->>RC: session snapshot\n end\n\n RC->>REG: resolve(provider)\n REG-->>RC: Provider instance\n deactivate RC\n\n alt stream = true\n R->>A: adapter.stream(ctx)\n activate A\n A->>PM: request.map(ctx)\n PM-->>A: upstream request\n A->>CC: streamChat(req)\n CC->>UP: POST (SSE)\n UP-->>CC: SSE chunks\n CC-->>A: ReadableStream<SSE>\n A->>A: pipeTransform → ProviderEventToResponseTransformer\n A->>A: pipeTransform → ResponseSessionPersistenceTransformer\n A-->>R: ReadableStream<ResponseStreamEvent>\n deactivate A\n R->>R: pipeTransform → ResponseSseEncodeTransformer\n R-->>C: SSE byte stream\n else stream = false\n R->>A: adapter.request(ctx)\n activate A\n A->>PM: request.map(ctx)\n PM-->>A: upstream request\n A->>CC: chat(req)\n CC->>UP: POST\n UP-->>CC: JSON response\n CC-->>A: upstream response\n A->>PM: response.map(ctx, res)\n PM-->>A: ResponseObject\n A->>SS: save(session)\n A-->>R: ResponseObject\n deactivate A\n R-->>C: JSON response\n end\n```\n\n## Component Model\n\n```mermaid\nclassDiagram\n direction TB\n\n class ApplicationContext {\n +config: GodexConfig\n +logger: Logger\n +resolver: ModelResolver\n +registrar: Registrar\n +adapter: Adapter\n +sessionStore: ResponseSessionStore\n }\n\n class ResponsesContext {\n +app: ApplicationContext\n +request: ResponseCreateRequest\n +session: ResponseSessionSnapshot\n +resolved: ResolvedModel\n +provider: Provider\n +responseId: string\n +requestId: string\n +logger: Logger\n +create(app, body)$ Promise~ResponsesContext~\n }\n\n class ModelResolver {\n -defaultProvider: string\n -providerConfigs: Record\n +resolve(model) ResolvedModel\n }\n\n class Registrar {\n -factories: Map~string, ProviderFactory~\n +registerFactory(name, factory)\n +build(providers)\n +resolve(name) Provider\n +list() string[]\n }\n\n class Adapter {\n <<interface>>\n +request(ctx) Promise~ResponseObject~\n +stream(ctx) Promise~ReadableStream~\n }\n\n class DefaultAdapter {\n +request(ctx) Promise~ResponseObject~\n +stream(ctx) Promise~ReadableStream~\n }\n\n class Provider {\n <<interface>>\n +name: string\n +mapper: ProviderMapper\n +chatClient: ChatClient\n +capabilities: ProviderCapabilities\n }\n\n class ProviderMapper {\n <<interface>>\n +request: RequestMapper\n +response: ResponseMapper\n +stream: StreamMapper\n }\n\n class ChatClient {\n <<interface>>\n +chat(req) Promise~TRes~\n +streamChat(req) Promise~ReadableStream~\n }\n\n class RequestMapper {\n <<interface>>\n +map(ctx) TReq\n }\n\n class ResponseMapper {\n <<interface>>\n +map(ctx, result) ResponseObject\n }\n\n class StreamMapper {\n <<interface>>\n +map(ctx, event) ResponseStreamEvent[]\n +buildResponseObject(ctx, state) ResponseObject\n }\n\n class ResponseSessionStore {\n <<interface>>\n +get(id) StoredResponseSession\n +save(session, opts)\n +resolveChain(id, opts) ResponseSessionSnapshot\n +delete(id)\n +close()\n }\n\n class Router {\n -routes: Route[]\n +register(route)\n +dispatch(req) Promise~Response~\n }\n\n ApplicationContext --> ResponsesContext : creates\n ApplicationContext --> ModelResolver\n ApplicationContext --> Registrar\n ApplicationContext --> Adapter\n ApplicationContext --> ResponseSessionStore\n ResponsesContext --> Provider : uses\n Provider --> ProviderMapper\n Provider --> ChatClient\n ProviderMapper --> RequestMapper\n ProviderMapper --> ResponseMapper\n ProviderMapper --> StreamMapper\n Adapter <|.. DefaultAdapter\n DefaultAdapter --> ProviderMapper : calls\n DefaultAdapter --> ChatClient : calls\n DefaultAdapter --> ResponseSessionStore : saves\n Router --> ResponsesContext : dispatches to\n```\n\n## Stream Pipeline\n\n```mermaid\nflowchart LR\n subgraph upstream[\"Upstream Provider\"]\n SSE[\"SSE Chunks<br/>(JsonServerSentEvent)\"]\n end\n\n subgraph godex[\"Godex Stream Pipeline\"]\n T1[\"ProviderEventTo<br/>ResponseTransformer\"]\n T2[\"ResponseSession<br/>PersistenceTransformer\"]\n T3[\"ResponseSse<br/>EncodeTransformer\"]\n end\n\n subgraph client[\"Client\"]\n BYTES[\"SSE Bytes<br/>(text/event-stream)\"]\n end\n\n SSE -->|\"pipeThrough(TransformStream)\"| T1\n T1 -->|\"per-event map()<br/>SSE chunk → ResponseStreamEvent[]\"| T2\n T2 -->|\"accumulate StreamState<br/>intercept terminal event<br/>buildResponseObject()<br/>save session\"| T3\n T3 -->|\"serialize to SSE wire format<br/>event: xxx\\ndata: {...}\\n\\n\"| BYTES\n\n style upstream fill:#1a1a2e,stroke:#16213e,color:#e0e0e0\n style godex fill:#0f3460,stroke:#16213e,color:#e0e0e0\n style client fill:#1a1a2e,stroke:#16213e,color:#e0e0e0\n```\n\n### Transformer Roles\n\n| Stage | Transformer | Input | Output | Side Effects |\n|-------|------------|-------|--------|-------------|\n| 1 | `ProviderEventToResponseTransformer` | `JsonServerSentEvent<TChunk>` | `ResponseStreamEvent` | Calls `StreamMapper.map()` per event |\n| 2 | `ResponseSessionPersistenceTransformer` | `ResponseStreamEvent` | `ResponseStreamEvent` | Accumulates `StreamState`, on terminal event calls `buildResponseObject()` + saves session (skipped when `store=false`) |\n| 3 | `ResponseSseEncodeTransformer` | `ResponseStreamEvent` | `Uint8Array` (SSE wire format) | Serializes to `event:` / `data:` lines |\n\n## Error Hierarchy\n\n```mermaid\nclassDiagram\n direction TB\n\n class GodexError {\n +name: string\n +code: string\n +status: number\n +context: object\n +toLogEntry() object\n }\n\n class ServerError {\n +status: 400-499\n +context: object\n }\n\n class AdapterError {\n +status: 400-499\n +context: unsupported parameters / tools / input items\n }\n\n class ProviderError {\n +status: 502\n +context: upstream status / body / headers\n }\n\n class SessionError {\n +status: 400-409\n +context: chain metadata\n }\n\n GodexError <|-- ServerError\n GodexError <|-- AdapterError\n GodexError <|-- ProviderError\n GodexError <|-- SessionError\n\n note for GodexError \"Base error with structured logging support.<br/>All errors carry domain codes (e.g. server.request.invalid_json).\"\n note for ProviderError \"Wraps upstream HTTP failures:<br/>rate limits, timeouts, 5xx.\"\n note for SessionError \"Chain resolution failures:<br/>not found, cycles, depth exceeded.\"\n```\n\n## Project Structure\n\n```\nsrc/\n├── cli/ Commander CLI (serve, config check, init)\n├── config/ godex.yaml schema, env interpolation, defaults\n├── context/ ApplicationContext (DI container), ResponsesContext (per-request)\n├── adapter/ Adapter interface, DefaultAdapter, stream transformers\n│ ├── mapper/ RequestMapper / ResponseMapper / StreamMapper contracts\n│ └── transformers/ ProviderEvent → Response → SSE encode pipeline\n├── providers/ Provider registry + builtin factories\n│ └── zhipu/ Reference provider: mapper, chat-client, tools, messages\n├── resolver/ ModelResolver (model selector → provider + model)\n├── server/ Bun HTTP server, Router, routes (/v1/responses, /health, /v1/models)\n├── session/ ResponseSessionStore (Memory + SQLite), chain resolution\n├── error/ GodexError hierarchy with domain codes\n├── protocol/openai/ OpenAI-compatible type definitions\n├── logger/ Structured JSON logger\n└── e2e/ End-to-end tests with mocked upstream\n```\n\n## Quick Start\n\n```bash\n# Install dependencies\nbun install\n\n# Build standalone binary (current platform)\nbun run build\n\n# Create config interactively\nbun run start -- init\n\n# Start server (default port 5678)\nbun run dev\n\n# Or run the compiled binary directly\n./platforms/darwin-arm64/bin/godex serve\n```\n\n### godex.yaml\n\n```yaml\nserver:\n port: 5678\n\ndefault_provider: zhipu\n\nproviders:\n zhipu:\n api_key: ${ZHIPU_API_KEY}\n base_url: https://open.bigmodel.cn/api/paas/v4\n models:\n \"gpt-4o\": glm-4.7 # model name mapping\n \"*\": glm-5.1 # catch-all fallback\n\nsession:\n backend: sqlite # or \"memory\"\n sqlite:\n path: ./data/sessions.db\n\nlogging:\n level: info # trace | debug | info | warn | error\n```\n\n### Adding a Provider\n\nImplement these interfaces in `src/providers/<name>/`:\n\n| Interface | Purpose |\n|-----------|---------|\n| `Provider<TReq, TRes, TChunk>` | Bundles mapper + chatClient + capabilities |\n| `ProviderMapper<TReq, TRes, TChunk>` | request / response / stream mapping functions |\n| `ChatClient<TReq, TRes, TChunk>` | `chat()` and `streamChat()` HTTP calls |\n\nRegister the factory in `src/providers/builtin.ts`:\n\n```ts\nregistrar.registerFactory(\"myprovider\", (config) =>\n createMyProvider(config) as Provider<unknown, unknown, unknown>\n);\n```\n\n## Usage\n\n```bash\n# Install — no Bun required at runtime\nnpm install -g @ahoo-wang/godex\n\n# Create config interactively\ngodex init\n\n# Start the gateway\ngodex serve\n```\n\nGodex ships as a **standalone native binary** with zero runtime dependencies. npm's `postinstall` automatically selects the correct binary for your platform. The only prerequisite is Node.js >= 18 (needed only during `npm install`).\n\nGodex exposes an **OpenAI-compatible Responses API** at `http://localhost:5678` (port is configurable). Point any tool that speaks the OpenAI protocol at this endpoint:\n\n### With Codex CLI\n\n```bash\nexport OPENAI_BASE_URL=http://localhost:5678/v1\nexport OPENAI_API_KEY=any-value # not validated by Godex, must be set\ncodex\n```\n\n### With OpenAI SDK\n\n```ts\nimport OpenAI from \"openai\";\n\nconst client = new OpenAI({\n baseURL: \"http://localhost:5678/v1\",\n apiKey: \"any-value\", // passed through, not validated\n});\n\nconst response = await client.responses.create({\n model: \"gpt-4o\", // mapped to glm-4.7 via godex.yaml models table\n input: \"Hello!\",\n});\n```\n\n### Model selection\n\n```\nmodel: \"gpt-4o\" → resolved via default_provider model mapping\nmodel: \"zhipu/glm-4.7\" → explicit provider/model selector\nmodel: \"openai/gpt-4o\" → routes to configured openai provider\n```\n\nThe `models` map in `godex.yaml` lets you translate standard model names into provider-native ones — no code changes needed in the client.\n\n### Health check\n\n```bash\ncurl http://localhost:5678/health\n# {\"status\":\"ok\",\"providers\":[\"zhipu\"],\"unsupported_providers\":[]}\n```\n\n## Publishing\n\nThe main `@ahoo-wang/godex` npm package is a lightweight shell. Native binaries are shipped as platform-specific optional dependencies:\n\n```\n@ahoo-wang/godex (wrapper package, 0 runtime deps)\n├── engines: { node: \">=18.0.0\" } ← only for postinstall\n├── postinstall: scripts/install.cjs ← detects platform, links binary\n└── optionalDependencies:\n ├── @ahoo-wang/godex-darwin-arm64 ← macOS Apple Silicon\n ├── @ahoo-wang/godex-darwin-x64 ← macOS Intel\n ├── @ahoo-wang/godex-linux-x64 ← Linux x86_64\n ├── @ahoo-wang/godex-linux-arm64 ← Linux ARM64\n ├── @ahoo-wang/godex-win32-x64 ← Windows x86_64\n └── @ahoo-wang/godex-win32-arm64 ← Windows ARM64\n\n# Publishing flow:\n# 1. Make the GitHub repository public, configure NPM_TOKEN, then push the release commit.\n# 2. Create a GitHub Release tagged vX.Y.Z.\n# 3. The Release workflow builds all platform binaries.\n# 4. The Release workflow uploads binary archives and SHA256SUMS to Release Assets.\n# 5. The Release workflow publishes platform packages first, then @ahoo-wang/godex.\n```\n\n## Commands\n\n```bash\nbun run dev # Hot-reload dev server on port 13145\nbun run build # Compile native binary for current platform\nbun run compile:all # Cross-compile all 6 platforms locally\nbun run test # Unit + integration tests\nbun run test:e2e # E2E with mocked upstream\nbun run typecheck # tsc --noEmit\nbun run lint # Biome check\nbun run ci # Full CI pipeline\n```\n"}, "e4b02fa899c22db59bd7a257edccad7d2aae168d": {"t": 1786068485.0977347, "n": 12669, "h": "26353555bff64e0a", "c": "<div align=\"center\">\n\n<img src=\"design/assets/01-logo-system/png/godex-logo-horizontal-transparent-800x233.png\" alt=\"GodeX\" width=\"480\" />\n\n**Make every model a Codex engine.**\n\nOpenAI-compatible Responses API gateway for Codex, CLI tools and developer agents.\n\n[](https://www.npmjs.com/package/@ahoo-wang/godex)\n[](https://codecov.io/gh/Ahoo-Wang/GodeX)\n[](https://bun.sh)\n[](https://www.typescriptlang.org/)\n\n[**English Documentation**](https://godex.ahoo.me/) · [**中文文档**](https://godex.ahoo.me/zh/)\n</div>\n\nGodeX lets clients that speak the OpenAI Responses API use providers such as DeepSeek, Xiaomi, MiniMax, and Zhipu through one local server.\n\n\n\n## Highlights\n\n- OpenAI-compatible `POST /v1/responses` endpoint with sync and streaming responses.\n- `GET /v1/models` aliases so clients can use stable model names while GodeX routes to provider/model targets.\n- Built-in bridge providers for DeepSeek, Xiaomi, MiniMax, and Zhipu.\n- Provider capability planning for request parameters, tools, `tool_choice`, structured output formats, reasoning, and stream usage.\n- Hybrid web search support with provider-native declarations for Zhipu/Xiaomi and GodeX-managed hosted search through the Zhipu Web Search API.\n- Responses `previous_response_id` session chains backed by memory or SQLite.\n- Trace recording for provider requests, provider responses, stream events, usage, and errors.\n- Native Bun runtime, TypeScript source, and compiled platform binaries for releases.\n\n## Built-in Providers\n\n| Provider | Reasoning | GodeX Input | Tool Choice | Response Format | Cached Tokens | Default Model |\n|----------|-----------|-------------|-------------|-----------------|---------------|---------------|\n| DeepSeek | native | text | auto, none, required, function | text, json_object | ✅ | `deepseek-v4-pro` |\n| Xiaomi | boolean | text | auto | text, json_object | ✅ | `mimo-v2.5-pro` |\n| MiniMax | boolean | text, image, video | auto, none, required, function | text, json_object | ✅ | `MiniMax-M3` |\n| Zhipu | boolean | text | auto, none | text, json_object | ✅ | `glm-5.2` |\n\n## Architecture\n\n\n\n## Component Interaction\n\n\n\n## Install\n\nFor local development:\n\n```bash\ngit clone https://github.com/Ahoo-Wang/GodeX.git\ncd GodeX\nbun install\n```\n\nFor package use, install the published package and run the `godex` binary:\n\n```bash\nnpm install -g @ahoo-wang/godex\ngodex --help\n```\n\n### Docker\n\nPre-built images are published to Docker Hub and GitHub Container Registry:\n\n```bash\ndocker pull ahoowang/godex:latest\n# or\ndocker pull ghcr.io/ahoo-wang/godex:latest\n```\n\nRun with a config file:\n\n```bash\ndocker run -d \\\n --name godex \\\n -p 5678:5678 \\\n -e ZHIPU_API_KEY=your-key \\\n -e DEEPSEEK_API_KEY=your-key \\\n -e MINIMAX_API_KEY=your-key \\\n -e MIMO_API_KEY=your-key \\\n -v ./godex.yaml:/etc/godex/godex.yaml:ro \\\n -v godex-data:/data \\\n ahoowang/godex:latest\n```\n\nThe image supports `linux/amd64` and `linux/arm64`.\n\n- Config file: `/etc/godex/godex.yaml`\n- Data directory (sessions, trace): `/data`\n- Default port: `5678`\n\n## Quick Start\n\nCreate a config and start the server:\n\n```bash\ngodex init\ngodex serve --config ./godex.yaml\n```\n\nThe interactive wizard walks you through selecting providers, entering base URLs and API keys, and writes the config file automatically.\n\nAlternatively, create `godex.yaml` manually:\n\n```yaml\nserver:\n port: 5678\n host: 0.0.0.0\n\ndefault_provider: deepseek\n\nmodels:\n aliases:\n # -------------------------------------------------------------------------\n # Codex-compatible model aliases\n #\n # 这些 alias 是 GodeX routing policy,不代表与 OpenAI 原模型能力等价。\n # 依据优先级:公开 benchmark > 官方模型定位 > Provider 产品说明。\n # -------------------------------------------------------------------------\n\n # Codex 默认主力:复杂编码 / computer use / research workflows\n # 依据:DeepSeek V4-Pro 在 SWE / Terminal / Codeforces / GDPval-AA 上公开成绩强。\n gpt-5.5: \"deepseek/deepseek-v4-pro\"\n\n # Codex 旗舰:coding + reasoning + tool use + agentic workflows\n # 依据:DeepSeek V4-Pro 有更完整的公开 coding/agentic benchmark 覆盖。\n gpt-5.4: \"deepseek/deepseek-v4-pro\"\n\n # Codex mini:subagents\n gpt-5.4-mini: \"zhipu/glm-5.1\"\n\n # Codex 编码专用:复杂软件工程\n # 依据:DeepSeek V4-Pro 的 SWE Verified / SWE Pro / Terminal Bench 表现。\n gpt-5.3-codex: \"deepseek/deepseek-v4-pro\"\n\n # Codex spark:近实时编码迭代\n gpt-5.3-codex-spark: \"zhipu/glm-5.1\"\n\n # 上一代通用 coding / agentic fallback\n # 严谨起见仍走 DeepSeek;不强行映射到 Zhipu。\n gpt-5.2: \"deepseek/deepseek-v4-pro\"\n\n # -------------------------------------------------------------------------\n # Provider native models\n # -------------------------------------------------------------------------\n\n deepseek-v4-pro: \"deepseek/deepseek-v4-pro\"\n deepseek-v4-flash: \"deepseek/deepseek-v4-flash\"\n\n mimo-v2.5-pro: \"xiaomi/mimo-v2.5-pro\"\n mimo-v2.5: \"xiaomi/mimo-v2.5\"\n\n glm-5.1: \"zhipu/glm-5.1\"\n glm-5-turbo: \"zhipu/glm-5-turbo\"\n glm-4.7: \"zhipu/glm-4.7\"\n glm-4.5-air: \"zhipu/glm-4.5-air\"\n\n MiniMax-M3: \"minimax/MiniMax-M3\"\n\n # Fallback for unknown bare model names\n \"*\": \"deepseek/deepseek-v4-pro\"\n\nproviders:\n deepseek:\n spec: deepseek\n credentials:\n api_key: ${DEEPSEEK_API_KEY}\n endpoint:\n base_url: https://api.deepseek.com\n zhipu:\n spec: zhipu\n credentials:\n api_key: ${ZHIPU_API_KEY}\n endpoint:\n base_url: https://open.bigmodel.cn/api/coding/paas/v4\n minimax:\n spec: minimax\n credentials:\n api_key: ${MINIMAX_API_KEY}\n endpoint:\n base_url: https://api.minimaxi.com/v1\n xiaomi:\n spec: xiaomi\n credentials:\n api_key: ${MIMO_API_KEY}\n endpoint:\n base_url: https://api.xiaomimimo.com/v1\n\nweb_search:\n enabled: true\n mode: auto\n provider: zhipu\n on_unavailable: client_tool_call\n max_iterations: 2\n\nsession:\n backend: sqlite\n\nlogging:\n level: info\n\ntrace:\n enabled: true\n path: ./data/trace.db\n capture_payload: false\n```\n\nStart the server:\n\n```bash\ngodex serve --config ./godex.yaml\n```\n\nThe dev command starts GodeX on port `13145`; the default runtime config port is `5678`.\n\n## API\n\n### Health\n\n```bash\ncurl http://localhost:5678/health\n```\n\n### Models\n\n```bash\ncurl http://localhost:5678/v1/models\n```\n\n`/v1/models` lists configured aliases, excluding the wildcard alias `*`.\n\n### Responses\n\n```bash\ncurl http://localhost:5678/v1/responses \\\n -H 'content-type: application/json' \\\n -d '{\n \"model\": \"gpt-5.5\",\n \"input\": \"Write a short TypeScript function that adds two numbers.\"\n }'\n```\n\nStreaming uses standard Responses SSE event names:\n\n```bash\ncurl -N http://localhost:5678/v1/responses \\\n -H 'content-type: application/json' \\\n -d '{\n \"model\": \"gpt-5.5\",\n \"stream\": true,\n \"input\": \"Explain Bun streams in two sentences.\"\n }'\n```\n\n## Model Routing\n\nClients may pass either:\n\n- A provider-qualified selector such as `deepseek/deepseek-v4-pro`\n- A configured alias such as `gpt-5.5`\n- A bare model name, which resolves through `default_provider` when no alias matches\n\nAliases must map to `provider/model` values, and the provider must exist in `providers`.\n\n\n## Codex Integration\n\nConnect the Codex desktop app to GodeX by adding a custom provider in `~/.codex/config.toml`:\n\n```toml\nmodel = \"gpt-5.5\"\nmodel_provider = \"godex\"\n\n[model_providers.godex]\nname = \"GodeX\"\nbase_url = \"http://127.0.0.1:5678/v1\"\nwire_api = \"responses\"\nrequires_openai_auth = false\nsupports_websockets = false\n```\n\nModel aliases (`gpt-5.5`, `gpt-5.4`, `gpt-5.4-mini`, etc.) are resolved by GodeX using the `models.aliases` map in `godex.yaml` — Codex itself only needs the alias name.\n\n\n## Provider Bridge Behavior\n\nGodeX builds a provider request in three steps:\n\n1. Resolve the client model selector to a configured provider and upstream model.\n2. Plan compatibility from the provider `ProviderSpec`, including request parameters, tool declarations, `tool_choice`, response format, reasoning, and stream usage.\n3. Convert Responses input and session history into Chat Completions messages, call the upstream provider, and reconstruct a Responses object or Responses SSE stream.\n\nProvider-specific differences belong in each provider's `spec.ts`, `hooks.ts`, protocol types, and HTTP client. Shared Responses-to-Chat policy belongs under `src/bridge`.\n\n## Structured Output\n\nWhen a provider supports `json_object` but not native `json_schema`, GodeX can degrade strict `json_schema` requests to `json_object`.\n\nFor strict downgraded schemas:\n\n- The schema instruction is added to the provider prompt preamble for the current request.\n- The provider receives `response_format: { \"type\": \"json_object\" }`.\n- GodeX validates that the final output is valid JSON.\n- Invalid sync output fails the response; invalid stream output is rewritten to a terminal `response.failed` event.\n\nThe validator checks JSON syntax, not full JSON Schema conformance.\n\n## Sessions\n\nResponses can be stored and replayed with `previous_response_id`.\n\n- `session.backend: memory` keeps history in process memory.\n- `session.backend: sqlite` persists history to SQLite.\n- Requests with `store: false` are not saved.\n- The session chain stores request snapshots and response output items, then rebuilds provider-neutral history on the next turn.\n\n## Trace Database\n\nTracing is enabled by default and writes SQLite rows to `./data/trace.db` unless configured otherwise.\n\nTrace records include:\n\n- Provider request metadata and final patched request payload summaries\n- Provider request lifecycle events without duplicating full request bodies\n- Sync provider response bodies as summarized payloads\n- Raw and transformed stream events\n- Usage details, including cached tokens when provided by the upstream\n- Route and provider errors\n\nSet `trace.capture_payload: true` to persist payload JSON up to `trace.payload_max_bytes` for trace rows that carry payloads. Keep it disabled for sensitive environments.\n\n## Development\n\n```bash\nbun install # Install dependencies\nbun run dev # Dev server with hot reload on port 13145\nbun run start # Start server from source\nbun run build # Build a binary for the current platform\nbun run compile:all # Cross-compile all supported platform packages\n```\n\nQuality gates:\n\n```bash\nbun run typecheck # TypeScript\nbun run lint # Biome check\nbun run lint:fix # Biome autofix\nbun run format # Biome format\nbun run test # Unit and integration tests, excluding src/e2e\nbun run test:e2e # Mocked end-to-end tests\nbun run test:zhipu # Live Zhipu tests; requires ZHIPU_API_KEY\nbun run test:deepseek # Live DeepSeek tests; requires DEEPSEEK_API_KEY\nbun run test:minimax # Live MiniMax tests; requires MINIMAX_API_KEY\nbun run test:xiaomi # Live Xiaomi tests; requires MIMO_API_KEY\nbun run check # typecheck + lint + test\nbun run ci # typecheck + biome ci + test + e2e\n```\n\n## Source Map\n\n```text\nsrc/\n cli/ Commander CLI, init wizard, runtime config loading\n config/ godex.yaml schema, defaults, env interpolation\n context/ ApplicationContext and per-request ResponsesContext\n bridge/ Provider-agnostic Responses-to-Chat planning and reconstruction\n providers/ Built-in provider specs, hooks, clients, and registry\n responses/ Sync and stream request pipelines\n server/ Bun routes for /health, /v1/models, /v1/responses\n session/ Memory and SQLite response session stores\n trace/ SQLite trace recorder and usage/error/event mappers\n protocol/ OpenAI protocol type definitions\n error/ GodeXError hierarchy and domain codes\n```\n\n## Provider Development\n\nProvider folders follow this shape:\n\n```text\nsrc/providers/<name>/\n spec.ts ProviderSpec declaration\n client.ts ProviderEdge construction with ChatProviderClient\n hooks.ts Provider-specific patching, accessors, usage, stream deltas\n protocol/ Provider DTOs when needed\n index.ts Public exports\n```\n\nAdd shared compatibility policy to `src/bridge`; add shared provider transport or protocol helpers to `src/providers/shared`.\n\n## License\n\nApache-2.0. See [LICENSE](./LICENSE).\n"}}, "wiki/zh/onboarding/executive-guide.md": {"9efb5d28b803166fc52e46da8d469512befd054b": {"t": 1785595263.5417087, "n": 13316, "h": "f28c1bfcdb2e21ba", "c": "---\ntitle: \"高管指南\"\ndescription: \"面向 VP/总监级工程领导者的战略概览 -- 能力、风险、成本模型和投资逻辑。\"\nkeywords: \"GodeX, 高管指南, 战略, 风险评估, 成本模型, 架构\"\n---\n\n# 高管指南\n\n> **受众**:评估 GodeX 用于组织采纳、成本优化或战略 AI 基础设施决策的 VP/总监级工程领导者。\n>\n> **阅读时间**:约 15 分钟。\n>\n> **无代码片段** -- 本指南仅使用服务级图表和表格。\n\n---\n\n## GodeX 是什么\n\nGodeX 是一个兼容 OpenAI 的 Responses API 网关。它位于 AI 编程代理(Codex CLI、Claude Code、Cursor)和非 OpenAI LLM 提供商(DeepSeek、Xiaomi、Zhipu/ChatGLM、MiniMax)之间,在两种协议之间透明地转换请求和响应。\n\n代理以 OpenAI 的 Responses API 格式发出请求。GodeX 将这些请求转换为每个提供商的 Chat Completions API 格式,调用上游提供商,再将响应转换回来。代理完全感知不到它并非在与 OpenAI 对话。\n\n这之所以重要,是因为 Responses API 正在成为下一代 AI 编程工具的标准协议。没有 GodeX,每个非 OpenAI 提供商都需要针对每个代理进行定制集成工作。有了 GodeX,一个网关就能处理所有提供商。\n\n---\n\n## 能力矩阵\n\n### 核心服务能力\n\n| 能力 | 描述 | 商业价值 |\n|-----------|-------------|----------------|\n| **协议转换** | 将 OpenAI Responses API 请求转换为提供商特定的 Chat Completions API 调用,并反向转换 | 客户端零代码改动 |\n| **多提供商路由** | 通过单一配置文件支持 DeepSeek、Xiaomi、Zhipu/ChatGLM 和 MiniMax | 供应商多元化而无需碎片化 |\n| **流式支持** | 实时透传服务器发送事件(SSE) | 代理获得与 OpenAI 无异的流式响应 |\n| **会话管理** | 通过 `previous_response_id` 链式解析实现多轮对话 | 代理在多轮之间保持对话上下文 |\n| **模型别名** | 将友好的模型名称(如 `gpt-5.5`)映射到实际的提供商/模型组合 | 团队切换提供商无需更改代理配置 |\n| **工具调用** | 将 Codex 工具声明(shell、apply_patch、function)转换为提供商等价物 | 代理在非 OpenAI 提供商上执行工具 |\n| **结构化输出** | 当提供商不支持时,将 JSON Schema 降级为 JSON Object | 跨提供商一致的输出格式保证 |\n| **请求追踪** | 基于 SQLite 的请求、用量、事件和错误的追踪记录 | 完整的审计追踪和调试能力 |\n| **用量追踪** | 跟踪每个请求的输入令牌、输出令牌、缓存令牌和推理令牌 | 成本可见性和费用分摊能力 |\n| **Docker 部署** | 预构建的 linux/amd64 和 linux/arm64 镜像 | 标准化容器部署 |\n\n### 能力成熟度\n\n| 能力 | 成熟度 | 备注 |\n|-----------|----------|-------|\n| 协议转换(同步) | 稳定 | 核心路径,经过充分测试 |\n| 协议转换(流式) | 稳定 | 基于状态机的 SSE 重建 |\n| 工具调用降级 | 稳定 | 内置 Codex 工具映射到所有提供商的 `function` |\n| JSON Schema 结构化输出 | Beta | 降级为 `json_object` 并带校验 |\n| 推理/思维令牌 | Beta | DeepSeek:原生支持。Xiaomi:布尔开关。Zhipu:布尔开关。MiniMax:布尔 adaptive/disabled thinking |\n| 缓存令牌追踪 | 稳定 | 当提供商返回缓存元数据时报告 |\n| 会话链式解析 | 稳定 | 循环检测、深度限制、未完成响应处理 |\n| 网页搜索 | 稳定 | 提供商原生透传(智谱、小米)和通过智谱 Web Search API 的 GodeX 托管搜索 |\n| 多租户隔离 | 未建设 | 目前为单租户 |\n| 自动提供商故障转移 | 未建设 | 目标提供商宕机时请求失败 |\n\n---\n\n## 技术投资逻辑\n\n### 为什么存在这个项目\n\nAI 编程代理正在向 OpenAI Responses API 收敛为标准协议。但最好和最便宜的模型并不总是来自 OpenAI。团队面临选择:锁定 OpenAI,或者为每个替代提供商构建和维护定制集成。\n\nGodeX 消除了这种权衡。一个网关,一个配置文件,任意支持的提供商。\n\n### 商业价值驱动因素\n\n| 驱动因素 | 说明 |\n|--------|-------------|\n| **成本优化** | DeepSeek 和 MiniMax 模型比 GPT-4 级别模型便宜得多。GodeX 让团队使用这些更便宜的提供商,无需重写代理代码或维护提供商特定的 SDK 集成。 |\n| **供应商多元化** | 依赖单一 LLM 提供商是战略风险。GodeX 让路由到多个提供商变得轻而易举,减少锁定并提供谈判筹码。 |\n| **中国市场接入** | Xiaomi、Zhipu(ChatGLM)和 MiniMax 是领先的中国市场 LLM 提供商。GodeX 使在中国部署 AI 编程工具的团队能够使用国内提供商而无需定制集成工作。Zhipu 编程端点已预配置。 |\n| **协议面向未来** | Responses API 是 OpenAI 面向代理式 AI 交互的较新标准。随着更多工具采纳它,GodeX 使组织能够使用任何 Chat Completions 提供商,无需等待原生的 Responses API 支持。 |\n| **运维简单性** | 单个二进制文件或 Docker 容器。无外部数据库。无消息队列。SQLite 用于会话和追踪。一个 YAML 配置文件。 |\n\n### 战略定位\n\n```mermaid\ngraph LR\n subgraph agents[\"代理层\"]\n CODEX[\"Codex CLI\"]\n CLAUDE[\"Claude Code\"]\n CURSOR[\"Cursor\"]\n end\n\n subgraph Gateway Layer\n GODEX[\"GodeX<br>协议转换<br>会话管理<br>请求追踪\"]\n end\n\n subgraph providers[\"提供商层\"]\n DEEPSEEK[\"DeepSeek<br>高性价比编程\"]\n XIAOMI[\"Xiaomi / MiMo<br>推理与中国市场\"]\n ZHIPU[\"Zhipu / ChatGLM<br>中国市场\"]\n MINIMAX[\"MiniMax<br>快速响应\"]\n FUTURE[\"未来提供商<br>可扩展规约模式\"]\n end\n\n CODEX -->|\"Responses API\"| GODEX\n CLAUDE -->|\"Responses API\"| GODEX\n CURSOR -->|\"Responses API\"| GODEX\n GODEX -->|\"Chat Completions API\"| DEEPSEEK\n GODEX -->|\"Chat Completions API\"| XIAOMI\n GODEX -->|\"Chat Completions API\"| ZHIPU\n GODEX -->|\"Chat Completions API\"| MINIMAX\n GODEX -->|\"Chat Completions API\"| FUTURE\n\n style GODEX fill:#161b22,stroke:#6d5dfc,color:#e6edf3\n style CODEX fill:#2d333b,stroke:#6d5dfc,color:#e6edf3\n style CLAUDE fill:#2d333b,stroke:#6d5dfc,color:#e6edf3\n style CURSOR fill:#2d333b,stroke:#6d5dfc,color:#e6edf3\n style DEEPSEEK fill:#2d333b,stroke:#6d5dfc,color:#e6edf3\n style XIAOMI fill:#2d333b,stroke:#6d5dfc,color:#e6edf3\n style ZHIPU fill:#2d333b,stroke:#6d5dfc,color:#e6edf3\n style MINIMAX fill:#2d333b,stroke:#6d5dfc,color:#e6edf3\n style FUTURE fill:#2d333b,stroke:#30363d,color:#e6edf3\n```\n\nGodeX 占据代理工具和模型提供商之间的转换层。添加新提供商只需实现一个规约接口 -- 无需更改代理,无需更改桥接内核。\n\n---\n\n## 架构概览\n\n### 服务图\n\n下图展示了从 AI 编程代理经 GodeX 到上游提供商再返回的请求流程。\n\n```mermaid\nsequenceDiagram\n autonumber\n participant Agent as AI 编程代理\n participant GodeX as GodeX 网关\n participant Resolver as 模型解析器\n participant Session as 会话存储\n participant Bridge as 桥接内核\n participant Provider as 上游提供商\n\n Agent->>GodeX: POST /v1/responses(OpenAI 格式)\n GodeX->>Resolver: 解析模型名称为 provider/model\n Resolver-->>GodeX: 提供商 + 上游模型 ID\n\n alt 多轮对话\n GodeX->>Session: 查找 previous_response_id 链\n Session-->>GodeX: 对话历史\n end\n\n GodeX->>Bridge: 转换为 Chat Completions 格式\n Bridge->>Bridge: 兼容性规划(工具、输出格式、推理)\n Bridge-->>GodeX: 提供商就绪的请求\n\n GodeX->>Provider: POST /chat/completions\n Provider-->>GodeX: 响应(JSON 或 SSE 流)\n GodeX->>Bridge: 重建 Responses API 格式\n Bridge-->>GodeX: OpenAI Responses 对象\n\n GodeX->>Session: 持久化响应(如果 store=true)\n GodeX->>GodeX: 记录追踪(请求、用量、事件)\n\n GodeX-->>Agent: ResponseObject JSON 或 SSE 流\n```\n\n### 组件职责\n\n| 组件 | 职责 |\n|-----------|---------------|\n| **服务器路由** | 接受 `/v1/responses`、`/v1/models` 和 `/health` HTTP 请求 |\n| **模型解析器** | 将模型名称和别名转换为提供商/模型对 |\n| **会话存储** | 持久化和检索多轮对话链 |\n| **桥接内核** | 在 Responses API 和 Chat Completions API 之间转换;规划兼容性;处理工具映射、输出契约和流式状态 |\n| **提供商规约** | 声明每个提供商的能力、端点配置和协议特性 |\n| **追踪记录器** | 将请求元数据、用量、事件和错误记录到 SQLite |\n| **错误层级** | 面向服务器、桥接、提供商和会话失败的领域特定错误码 |\n\n### 提供商规约模式\n\n每个提供商由一个精简的规约定义,声明其能力而非实现。桥接内核读取这些声明并自动规划兼容性。\n\n```mermaid\ngraph TB\n subgraph ProviderSpec[\"提供商规约\"]\n CAPS[\"能力<br>参数、工具、格式、推理\"]\n ENDPOINT[\"端点<br>基础 URL、认证方案\"]\n HOOKS[\"钩子<br>请求修补、用量映射、流增量\"]\n ACCESSORS[\"访问器<br>响应文本、结束原因、用量\"]\n end\n\n subgraph BridgeKernel[\"桥接内核\"]\n COMPAT[\"兼容性规划器\"]\n TOOLS[\"工具规划器\"]\n OUTPUT[\"输出契约\"]\n STREAM[\"流状态机\"]\n end\n\n CAPS --> COMPAT\n CAPS --> TOOLS\n CAPS --> OUTPUT\n CAPS --> STREAM\n HOOKS --> COMPAT\n ACCESSORS --> STREAM\n\n style ProviderSpec fill:#161b22,stroke:#30363d,color:#e6edf3\n style BridgeKernel fill:#161b22,stroke:#6d5dfc,color:#e6edf3\n style CAPS fill:#2d333b,stroke:#6d5dfc,color:#e6edf3\n style ENDPOINT fill:#2d333b,stroke:#6d5dfc,color:#e6edf3\n style HOOKS fill:#2d333b,stroke:#6d5dfc,color:#e6edf3\n style ACCESSORS fill:#2d333b,stroke:#6d5dfc,color:#e6edf3\n style COMPAT fill:#2d333b,stroke:#8b949e,color:#e6edf3\n style TOOLS fill:#2d333b,stroke:#8b949e,color:#e6edf3\n style OUTPUT fill:#2d333b,stroke:#8b949e,color:#e6edf3\n style STREAM fill:#2d333b,stroke:#8b949e,color:#e6edf3\n```\n\n这种分离意味着添加新提供商不需要修改桥接内核。新提供商声明其支持的能力,内核自动适配。\n\n---\n\n## 风险评估\n\n### 技术风险\n\n| 风险 | 可能性 | 影响 | 缓解措施 |\n|------|-----------|--------|------------|\n| **协议漂移** -- OpenAI 以 GodeX 尚不支持的方式更改 Responses API | 中 | 高 | GodeX 将变更隔离在桥接内核内。代理代码和提供商规约不受影响。社区更新通常在 OpenAI 发布后数天内跟进。 |\n| **提供商 API 变更** -- 上游提供商修改其 Chat Completions 端点 | 中 | 中 | 提供商抽象将变更隔离到各个提供商钩子中。其他提供商不受影响。每个提供商规约是独立的。 |\n| **流式复杂性** -- SSE 状态机边界情况(不完整块、乱序事件、缺失终止事件) | 低 | 中 | 状态机具有明确的转换和终止状态验证。无效的流输出被重写为 `response.failed` 事件,而非静默损坏。 |\n| **结构化输出降级差距** -- JSON Schema 降级损失校验精度 | 低 | 低 | GodeX 验证输出是否为有效 JSON。不执行完整的 JSON Schema 一致性检查,但对大多数用例已足够。 |\n| **会话链损坏** -- 具有缺失父节点或循环的长链 | 低 | 中 | 内置循环检测、深度溢出保护和未完成响应处理。损坏的链返回结构化错误,而非静默失败。 |\n\n### 运维风险\n\n| 风险 | 可能性 | 影响 | 缓解措施 |\n|------|-----------|--------|------------|\n| **单点故障** -- GodeX 是单进程网关 | 中 | 高 | 在负载均衡器后部署多个实例。对于会话连续性,使用 SQLite 后端和粘性会话,或迁移到共享会话存储。 |\n| **延迟开销** -- GodeX 在代理和提供商之间增加处理 | 低 | 低 | 实测开销约为每请求 10-50ms,包括转换、兼容性规划和会话解析。远小于上游提供商延迟。 |\n| **会话存储扩展** -- 高并发下 SQLite 写入争用 | 低 | 中 | SQLite 能很好地处理并发读取。写入争用可通过 WAL 模式和批量追踪写入来缓解。对于非常高吞吐量,将会话迁移到外部数据库。 |\n| **配置错误** -- 无效的 godex.yaml 阻止启动 | 中 | 低 | 配置校验在启动时运行并给出清晰的错误消息。`godex config check` 可在不启动服务器的情况下验证配置。没有 `spec` 的旧版提供商配置会被明确拒绝。 |\n| **提供商凭证轮换** -- API 密钥过期或被撤销 | 中 | 中 | 环境变量插值(`${DEEPSEEK_API_KEY}`)支持标准密钥管理。目前密钥轮换需要重启。 |\n\n### 安全风险\n\n| 风险 | 可能性 | 影响 | 缓解措施 |\n|------|-----------|--------|------------|\n| **配置文件中 API 密钥泄露** | 中 | 高 | 使用环境变量插值。切勿将包含硬编码密钥的 `godex.yaml` 提交到版本控制。CI 管道应在部署时注入密钥。 |\n| **追踪载荷敏感性** -- 捕获的载荷包含完整的请求/响应文本 | 低 | 高 | 载荷捕获默认禁用(`trace.capture_payload: false`)。启用后,应将追踪数据库视为敏感数据。限制保留期限和访问权限。 |\n| **无客户端认证** -- 任何网络可达的客户端都可以使用网关 | 高 | 中 | 部署在带认证的反向代理之后。不要直接暴露在互联网上。这是生产部署中最高优先级的安全缺口。 |\n| **无速率限制** -- 网关接受无限制的请求 | 高 | 低 | 部署在带速率限制的反向代理之后。对于内部团队使用,风险较低。对于共享环境,添加外部速率限制。 |\n| **透传数据** -- GodeX 将所有请求内容转发给上游提供商 | 设计如此 | 取决于上下文 | GodeX 不检查、记录或修改超出协议转换范围的请求内容。组织必须信任其配置的上游提供商。 |\n\n---\n\n## 成本与扩展模型\n\n### 资源需求\n\nGodeX 被设计为轻量级单进程网关。与上游 LLM 提供商相比,资源消耗极少。\n\n| 资源 | 基线 | 每请求 | 扩展因子 |\n|----------|----------|-------------|----------------|\n| **CPU** | 空闲 <5% | 约 10-50ms 转换开销 | 与并发请求数成正比(事件循环模型) |\n| **内存** | 约 50MB 基础 | 每活跃会话约 1KB | 与会话存储大小和并发流连接数成正比 |\n| **磁盘** | 极少 | SQLite 写入用于会话和追踪 | 与请求量和追踪保留策略成正比 |\n| **网络** | 透传 | 与上游请求/响应相同 | 取决于上游提供商载荷大小 |\n\n### 延迟特征\n\n| 操作 | GodeX 开销 | 总计(典型) |\n|-----------|---------------|-----------------|\n| 请求解析和验证 | <1ms | -- |\n| 模型解析 | <1ms | -- |\n| 会话链查找(SQLite) | <10ms | -- |\n| 兼容性规划和请求构建 | <5ms | -- |\n| 提供商调用(网络) | 0ms(透传) | 500ms - 10s(取决于提供商) |\n| 响应重建 | <5ms | -- |\n| 追踪记录(异步批量) | 0ms(非阻塞) | -- |\n| **GodeX 总开销** | **约 10-50ms** | **远小于上游** |\n\n### 扩展限制\n\n| 维度 | 限制 | 策略 |\n|-----------|-------|----------|\n| 并发连接 | 单进程事件循环 | 垂直扩展足以满足单团队使用 |\n| 会话存储 | SQLite 单写入者 | WAL 模式用于读取并发;迁移到外部数据库以支持多写入者 |\n| 追踪吞吐量 | 批量异步写入 | 队列 + 刷新间隔(可配置) |\n| 水平扩展 | 实例间无共享状态 | 部署在带粘性会话的负载均衡器后;需要共享会话存储 |\n\n### 成本对比\n\n主要成本节省来自使用更便宜的提供商。GodeX 本身增加的基础设施成本可忽略不计。\n\n| 场景 | 没有 GodeX | 有 GodeX |\n|----------|--------------|------------|\n| 代理使用 OpenAI GPT-4 | 仅 OpenAI 定价 | -- |\n| 代理改用 DeepSeek | 定制集成工程成本 | 一次性 GodeX 设置 + DeepSeek 定价 |\n| 切换提供商 | 每个代理的代码更改 + 测试 | 更新 `godex.yaml` 中的一行配置 |\n| 多提供商支持 | N 倍集成工作量 | 单一网关,N 个提供商配置 |\n\n---\n\n## 技术栈\n\n| 技术 | 角色 | 选择理由 |\n|-----------|------|---------------|\n| **Bun 运行时** | 执行环境 | 原生 TypeScript、快速启动、单二进制编译、Web Streams API 支持 |\n| **TypeScript** | 编程语言 | 跨提供商规约的类型安全;严格模式搭配 `verbatimModuleSyntax` |\n| **SQLite (bun:sqlite)** | 会话和追踪持久化 | 零外部依赖、ACID 事务、进程内嵌入 |\n| **Web Streams API** | 流式管道 | 用于可组合 SSE 转换阶段的原生平台 API |\n| **Biome** | 代码检查和格式化 | 单一工具替代 ESLint + Prettier;基于 Rust 的高性能工具 |\n| **LogTape** | 结构化日志 | JSON 结构化日志,可配置级别和文件输出 |\n| **Commander.js** | CLI 框架 | 支持 `godex init`、`godex serve`、`godex config check` 命令 |\n| **Docker** | 容器化部署 | Docker Hub 和 GHCR 上的多架构镜像(amd64、arm64) |\n\n### 关键架构决策\n\n| 决策 | 理由 |\n|----------|-----------|\n| 基于规约的提供商模型 | 提供商声明能力而非实现。桥接内核集中规划兼容性。这防止了每个提供商的映射器丛林,保持代码库可维护。 |\n| 集中式桥接内核 | 所有 Responses 到 Chat 的策略都在 `src/bridge/` 中。提供商钩子仅暴露协议差异。这消除了跨提供商的重复兼容性决策。 |\n| SQLite 持久化 | 无外部数据库依赖。适合单网关部署。可替换为外部存储以支持水平扩展。 |\n| 领域错误层级 | 结构化错误码(server、bridge、provider、session)替代原始错误。每个预期失败都有领域码,使监控和告警更可靠。 |\n\n---\n\n## 提供商覆盖\n\n### 已支持的提供商\n\n| 提供商 | 默认模型 | 推理 | 工具选择 | 响应格式 | 缓存令牌 | 特别说明 |\n|----------|--------------|-----------|-------------|----------------|---------------|---------------|\n| **DeepSeek** | `deepseek-v4-pro` | 原生(high、max) | auto、none、required、function | text、json_object | 是 | 最适合高性价比编程。原生推理支持。 |\n| **Xiaomi / MiMo** | `mimo-v2.5-pro` | 布尔开关 | auto | text、json_object | 是 | 推理 via thinking 开关。最多 128 个工具。 |\n| **MiniMax** | `MiniMax-M3` | 布尔开关 | auto、none、required、function | text、json_object | 是 | 快速响应、图片/视频理解,以及完整的工具选择支持。 |\n| **Zhipu / ChatGLM** | `glm-5.2` | 布尔开关 | auto、none | text、json_object | 是 | 中国市场提供商。预配置编程端点。网页搜索工具支持。 |\n\n### 添加新提供商\n\n提供商规约模式专为可扩展性设计。新提供商需要:\n\n1. 一个 `ProviderSpec` 声明能力、端点和认证方案\n2. 用于请求修补和响应/流访问器的钩子\n3. 如果提供商的 Chat Completions 格式不同,需要协议特定的 DTO\n\n无需更改桥接内核、代理代码或其他提供商规约。\n\n---\n\n## 可观测性\n\n### 内置可观测性\n\n| 信号 | 来源 | 配置 |\n|--------|--------|---------------|\n| **健康端点** | `GET /health` | 始终可用。返回已注册和不支持的提供商。 |\n| **结构化日志** | LogTape JSON 日志器 | 级别可通过 `godex.yaml` 配置。控制台和文件输出。 |\n| **请求追踪** | SQLite 追踪数据库 | 默认启用。记录请求元数据、用量、事件和错误。 |\n| **载荷捕获** | 追踪子系统 | 默认禁用。启用 `trace.capture_payload: true` 用于调试。视为敏感数据。 |\n| **错误领域码** | GodeXError 层级 | 每个预期失败映射到领域码:`server.*`、`bridge.*`、`provider.*`、`session.*` |\n| **用量追踪** | 每响应 `usage` 字段 | 输入令牌、输出令牌、缓存令牌、推理令牌。 |\n\n### 尚未建设的部分\n\n| 缺口 | 影响 | 优先级 |\n|-----|--------|----------|\n| 无 Prometheus/OpenTelemetry 指标 | 无法与标准可观测性栈集成 | 中 |\n| 无用于配置重载的管理 API | 提供商变更需要重启 | 中 |\n| 无仪表板或 UI | 追踪数据需要直接查询 SQLite | 低 |\n\n---\n\n## 团队上手\n\n### 产出价值所需时间\n\n| 角色 | 首次产出价值时间 | 路径 |\n|------|-------------------|------|\n| 使用 GodeX 的开发者 | 15 分钟 | 安装、运行 `godex init`、配置一个提供商、将代理指向 GodeX |\n| 部署 GodeX 的运维人员 | 30 分钟 | Docker 拉取、创建 `godex.yaml`、使用环境变量部署 API 密钥 |\n| 添加提供商的贡献者 | 2-4 小时 | 研究现有提供商规约模式,实现规约 + 钩子 + 测试 |\n| 修改桥接内核的贡献者 | 1-2 天 | 理解兼容性规划器、工具规划器、流状态机 |\n\n### 上手路径\n\n| 如果你是... | 阅读这个... |\n|---------------|-------------|\n| 为团队设置 GodeX 的开发者 | Getting Started 指南 |\n| 加入项目的贡献者 | [贡献者指南](./contributor-guide.md) |\n| 评估架构决策的主任工程师 | [主任工程师指南](./staff-engineer-guide.md) |\n| 了解功能的产品经理 | [产品经理指南](./product-manager-guide.md) |\n\n---\n\n## 建议\n\n基于 GodeX 的当前状态,以下建议按优先级排列供领导层参考:\n\n### 1. 在面向生产环境之前添加客户端认证\n\nGodeX 没有内置认证。在将网关暴露到受信任的内部网络之外之前,至少实现一个 API 密钥检查。这是最高优先级的安全缺口。带认证的反向代理是可接受的临时解决方案。\n\n### 2. 添加 Prometheus 指标以实现生产可观测性\n\n标准指标 -- 请求延迟直方图、按提供商的错误率、上游延迟、会话存储大小、追踪队列深度 -- 将无需定制工具即可实现生产监控。这是最高优先级的可观测性缺口。\n\n### 3. 实现速率限制\n\n在多团队或外部访问之前,添加速率限制。这可以防止单个配置错误的代理消耗所有网关容量。通过反向代理的外部速率限制是可接受的。\n\n### 4. 规划水平扩展\n\n目前,GodeX 是带有本地会话存储的单进程网关。对于多团队部署,规划共享会话存储(Redis 或 PostgreSQL)以在负载均衡器后实现水平扩展,无需粘性会话。\n\n### 5. 主动扩展提供商覆盖\n\n基于规约的架构使添加提供商变得低成本。随着采纳增长,主动添加团队请求的提供商。每个新提供商都在不增加消费者集成复杂度的情况下提升网关价值。\n\n---\n\n## 总结\n\nGodeX 提供了一项聚焦的高价值能力:让 AI 编程代理通过单一 OpenAI 兼容网关使用任何 Chat Completions 提供商。架构清晰,提供商模型可扩展,运维开销最小。\n\n主要风险是运维层面的(单点故障、无认证、无速率限制)而非技术层面的。这些可以通过标准基础设施模式解决,无需更改 GodeX 本身。\n\n投资逻辑直截了当:减少供应商锁定、实现成本优化、提供中国市场接入 -- 所有这些都无需修改代理代码。\n\n---\n\n[贡献者指南](./contributor-guide.md) · [主任工程师指南](./staff-engineer-guide.md) · [产品经理指南](./product-manager-guide.md) · [上手索引](./index.md)\n"}}, "godex.deepseek.yaml": {"e43ccea40d40691f1fbd146fd356f5b0d79b5eb7": {"t": 1785745199.3039432, "n": 1225, "h": "0dfbfb10b42234f9", "c": "# =============================================================================\n# GodeX Configuration — DeepSeek Provider\n# =============================================================================\n# 快速启动: godex serve --config ./godex.deepseek.yaml\n# 环境变量: export DEEPSEEK_API_KEY=<your-key>\n\ndefault_provider: deepseek\n\nmodels:\n aliases:\n # -------------------------------------------------------------------------\n # Codex-compatible model aliases\n # -------------------------------------------------------------------------\n gpt-5.5: \"deepseek/deepseek-v4-pro\"\n gpt-5.4: \"deepseek/deepseek-v4-pro\"\n gpt-5.4-mini: \"deepseek/deepseek-v4-flash\"\n gpt-5.3-codex: \"deepseek/deepseek-v4-pro\"\n gpt-5.3-codex-spark: \"deepseek/deepseek-v4-flash\"\n gpt-5.2: \"deepseek/deepseek-v4-pro\"\n\n # Fallback for unknown bare model names\n \"*\": \"deepseek/deepseek-v4-pro\"\n\nproviders:\n deepseek:\n spec: deepseek\n credentials:\n api_key: ${DEEPSEEK_API_KEY}\n endpoint:\n base_url: https://api.deepseek.com\n\nsession:\n backend: sqlite\n sqlite:\n path: ./data/sessions.deepseek.db\n\ntrace:\n enabled: true\n path: ./data/trace.deepseek.db\n capture_payload: true\n payload_max_bytes: 1048576\n"}, "987f4ae12bd1372136723ad78a3ac73587783fbc": {"t": 1785748563.4681735, "n": 1225, "h": "0dfbfb10b42234f9", "c": "# =============================================================================\n# GodeX Configuration — DeepSeek Provider\n# =============================================================================\n# 快速启动: godex serve --config ./godex.deepseek.yaml\n# 环境变量: export DEEPSEEK_API_KEY=<your-key>\n\ndefault_provider: deepseek\n\nmodels:\n aliases:\n # -------------------------------------------------------------------------\n # Codex-compatible model aliases\n # -------------------------------------------------------------------------\n gpt-5.5: \"deepseek/deepseek-v4-pro\"\n gpt-5.4: \"deepseek/deepseek-v4-pro\"\n gpt-5.4-mini: \"deepseek/deepseek-v4-flash\"\n gpt-5.3-codex: \"deepseek/deepseek-v4-pro\"\n gpt-5.3-codex-spark: \"deepseek/deepseek-v4-flash\"\n gpt-5.2: \"deepseek/deepseek-v4-pro\"\n\n # Fallback for unknown bare model names\n \"*\": \"deepseek/deepseek-v4-pro\"\n\nproviders:\n deepseek:\n spec: deepseek\n credentials:\n api_key: ${DEEPSEEK_API_KEY}\n endpoint:\n base_url: https://api.deepseek.com\n\nsession:\n backend: sqlite\n sqlite:\n path: ./data/sessions.deepseek.db\n\ntrace:\n enabled: true\n path: ./data/trace.deepseek.db\n capture_payload: true\n payload_max_bytes: 1048576\n"}, "a8af5f8b9bdb48050a26dbb64721c2d81f8431ba": {"t": 1785748564.5124085, "n": 714, "h": "7c19f2b47d82bf0c", "c": "# =============================================================================\n# GodeX Configuration — DeepSeek Provider\n# =============================================================================\n# 快速启动: godex serve --config ./godex.deepseek.yaml\n# 环境变量: export DEEPSEEK_API_KEY=<your-key>\n\ndefault_provider: deepseek\n\nmodels:\n aliases:\n \"*\": deepseek/deepseek-v4-pro\n\nproviders:\n deepseek:\n spec: deepseek\n credentials:\n api_key: ${DEEPSEEK_API_KEY}\n endpoint:\n base_url: https://api.deepseek.com\n\nsession:\n backend: sqlite\n sqlite:\n path: ./data/sessions.deepseek.db\n\ntrace:\n enabled: true\n path: ./data/trace.deepseek.db\n capture_payload: true\n payload_max_bytes: 1048576\n"}, "9efb5d28b803166fc52e46da8d469512befd054b": {"t": 1786067306.526842, "n": 1225, "h": "0dfbfb10b42234f9", "c": "# =============================================================================\n# GodeX Configuration — DeepSeek Provider\n# =============================================================================\n# 快速启动: godex serve --config ./godex.deepseek.yaml\n# 环境变量: export DEEPSEEK_API_KEY=<your-key>\n\ndefault_provider: deepseek\n\nmodels:\n aliases:\n # -------------------------------------------------------------------------\n # Codex-compatible model aliases\n # -------------------------------------------------------------------------\n gpt-5.5: \"deepseek/deepseek-v4-pro\"\n gpt-5.4: \"deepseek/deepseek-v4-pro\"\n gpt-5.4-mini: \"deepseek/deepseek-v4-flash\"\n gpt-5.3-codex: \"deepseek/deepseek-v4-pro\"\n gpt-5.3-codex-spark: \"deepseek/deepseek-v4-flash\"\n gpt-5.2: \"deepseek/deepseek-v4-pro\"\n\n # Fallback for unknown bare model names\n \"*\": \"deepseek/deepseek-v4-pro\"\n\nproviders:\n deepseek:\n spec: deepseek\n credentials:\n api_key: ${DEEPSEEK_API_KEY}\n endpoint:\n base_url: https://api.deepseek.com\n\nsession:\n backend: sqlite\n sqlite:\n path: ./data/sessions.deepseek.db\n\ntrace:\n enabled: true\n path: ./data/trace.deepseek.db\n capture_payload: true\n payload_max_bytes: 1048576\n"}, "e4b02fa899c22db59bd7a257edccad7d2aae168d": {"t": 1786068205.6284347, "n": 1225, "h": "0dfbfb10b42234f9", "c": "# =============================================================================\n# GodeX Configuration — DeepSeek Provider\n# =============================================================================\n# 快速启动: godex serve --config ./godex.deepseek.yaml\n# 环境变量: export DEEPSEEK_API_KEY=<your-key>\n\ndefault_provider: deepseek\n\nmodels:\n aliases:\n # -------------------------------------------------------------------------\n # Codex-compatible model aliases\n # -------------------------------------------------------------------------\n gpt-5.5: \"deepseek/deepseek-v4-pro\"\n gpt-5.4: \"deepseek/deepseek-v4-pro\"\n gpt-5.4-mini: \"deepseek/deepseek-v4-flash\"\n gpt-5.3-codex: \"deepseek/deepseek-v4-pro\"\n gpt-5.3-codex-spark: \"deepseek/deepseek-v4-flash\"\n gpt-5.2: \"deepseek/deepseek-v4-pro\"\n\n # Fallback for unknown bare model names\n \"*\": \"deepseek/deepseek-v4-pro\"\n\nproviders:\n deepseek:\n spec: deepseek\n credentials:\n api_key: ${DEEPSEEK_API_KEY}\n endpoint:\n base_url: https://api.deepseek.com\n\nsession:\n backend: sqlite\n sqlite:\n path: ./data/sessions.deepseek.db\n\ntrace:\n enabled: true\n path: ./data/trace.deepseek.db\n capture_payload: true\n payload_max_bytes: 1048576\n"}}, "wiki/07-configuration/config-schema.md": {"65e82bfe593cda21c1ea3f408546df5519d939a1": {"t": 1785746654.0215466, "n": 10744, "h": "f36cdc59376ddb81", "c": "---\ntitle: \"Config Schema\"\ndescription: \"Complete reference for godex.yaml configuration options.\"\nkeywords: \"GodeX, config schema, godex.yaml, YAML, server, providers, session\"\n---\n\n# Config Schema\n\nGodeX is configured via a `godex.yaml` file, typically created by `godex init`. Environment variables are interpolated using `${VAR_NAME}` syntax.\n\n## Full Schema\n\n```yaml\nserver:\n port: 5678 # HTTP listen port\n host: \"0.0.0.0\" # Listen address\n idle_timeout: 30000 # Idle connection timeout (ms)\n # Default: 0 (disabled)\n\ndefault_provider: deepseek # Provider used when model has no slash prefix\n\nmodels:\n aliases:\n \"gpt-5.5\": deepseek/deepseek-v4-pro # Maps alias to provider/model\n \"glm\": zhipu/glm-5.1 # Maps alias to provider/model\n \"*\": deepseek/deepseek-v4-flash # Catch-all fallback\n\nproviders:\n deepseek:\n spec: deepseek # Provider spec name (required)\n credentials:\n api_key: ${DEEPSEEK_API_KEY}\n endpoint:\n base_url: https://api.deepseek.com\n timeout_ms: 30000\n\n zhipu:\n spec: zhipu # Provider spec name (required)\n credentials:\n api_key: ${ZHIPU_API_KEY}\n endpoint:\n base_url: https://open.bigmodel.cn/api/coding/paas/v4\n timeout_ms: 30000\n\n minimax:\n spec: minimax # Provider spec name (required)\n credentials:\n api_key: ${MINIMAX_API_KEY}\n endpoint:\n base_url: https://api.minimaxi.com/v1\n timeout_ms: 30000\n\nsession:\n backend: sqlite # \"sqlite\" or \"memory\"\n sqlite:\n path: ./data/sessions.db\n\nlogging:\n level: info # trace | debug | info | warn | error\n console:\n enabled: true\n level: info\n file:\n enabled: false\n level: debug\n dir: ./logs\n filename: godex.log\n max_size: 10485760 # 10MB\n max_files: 5\n\nweb_search: # Built-in web search (default: enabled, no provider)\n enabled: true # Master switch\n mode: auto # auto | provider_native | godex_managed | disabled\n provider: none # none | mock | zhipu (search backend for godex_managed)\n on_unavailable: client_tool_call # client_tool_call | fail | ignore\n max_iterations: 2 # Max managed search rounds per request\n timeout_ms: 10000 # Per-search timeout\n\ntrace:\n enabled: true\n path: ./data/trace.db\n max_queue_size: 10000\n flush_interval_ms: 1000\n batch_size: 100\n capture_payload: false\n payload_max_bytes: 65536\n```\n\n## Type Definitions\n\n```mermaid\nclassDiagram\n\n class GodeXConfig {\n +server: ServerConfig\n +default_provider: string\n +models: ModelsConfig\n +providers: Record~string, ProviderConfig~\n +session: SessionConfig\n +logging: LoggingConfig\n +web_search: WebSearchConfig\n +trace: TraceConfig\n }\n\n class ServerConfig {\n +port: number\n +host: string\n +idle_timeout: number\n }\n\n class ProviderConfig {\n +spec: string\n +credentials: CredentialsConfig\n +endpoint: EndpointConfig\n +timeout_ms: number\n }\n\n class CredentialsConfig {\n +api_key: string\n }\n\n class EndpointConfig {\n +base_url: string\n }\n\n class ModelsConfig {\n +aliases: Record~string, string~\n }\n\n class SessionConfig {\n +backend: string\n +sqlite: SQLiteConfig\n }\n\n class LoggingConfig {\n +level: LogLevel\n +console: ConsoleLoggingConfig\n +file: FileLoggingConfig\n }\n\n class TraceConfig {\n +enabled: boolean\n +path: string\n +max_queue_size: number\n +flush_interval_ms: number\n +batch_size: number\n +capture_payload: boolean\n +payload_max_bytes: number\n }\n\n class WebSearchConfig {\n +enabled: boolean\n +mode: WebSearchMode\n +provider: WebSearchProvider\n +on_unavailable: WebSearchOnUnavailable\n +max_iterations: number\n +timeout_ms: number\n }\n\n GodeXConfig --> ServerConfig\n GodeXConfig --> ModelsConfig\n GodeXConfig --> ProviderConfig\n GodeXConfig --> SessionConfig\n GodeXConfig --> LoggingConfig\n GodeXConfig --> WebSearchConfig\n GodeXConfig --> TraceConfig\n ProviderConfig --> CredentialsConfig\n ProviderConfig --> EndpointConfig\n```\n\n## Provider Config\n\nEach provider entry must include a `spec` field that matches a registered provider definition name. Legacy provider config without `spec` is rejected at startup.\n\n```yaml\nproviders:\n myprovider:\n spec: myprovider # Required: matches registered definition\n credentials:\n api_key: ${MY_API_KEY}\n endpoint:\n base_url: https://api.example.com/v1\n timeout_ms: 30000\n```\n\n## Web Search\n\nGodeX can run web search in two ways: let the provider handle it natively, or run the search itself (\"GodeX-managed\" / \"hosted\") and feed results back into a continuation request. The `web_search` block ([src/config/sections/web-search.ts:10](https://github.com/Ahoo-Wang/GodeX/blob/main/src/config/sections/web-search.ts#L10)) controls this.\n\n::: warning Important: native providers always use native search\nFor providers whose tool set already includes `web_search` as a native tool (Zhipu, Xiaomi), the planner returns the tool as natively supported **before** consulting `mode`. This means `mode: godex_managed` and `mode: disabled` have **no effect** on those providers — they always get native `web_search`. The `mode` settings below govern how `web_search` is handled for providers that do **not** support it natively (DeepSeek, MiniMax), or when you want GodeX to host the search loop. See [tool-plan.ts:129](https://github.com/Ahoo-Wang/GodeX/blob/main/src/bridge/tools/tool-plan.ts#L129) for the precedence (native → degraded → web-search planning).\n:::\n\n| Field | Default | Description |\n|-------|---------|-------------|\n| `enabled` | `true` | Master switch. When `false`, the effective `mode` becomes `disabled` and `available` is `false`. |\n| `mode` | `auto` | Execution strategy — see the table below (applies to non-native providers). |\n| `provider` | `none` | The search backend GodeX uses in `godex_managed` mode. |\n| `on_unavailable` | `client_tool_call` | What to do when managed search is selected but no backend is available. |\n| `max_iterations` | `2` | Maximum number of managed search rounds per request. |\n| `timeout_ms` | `10000` | Per-search timeout in milliseconds. |\n\n### `mode` — execution strategy\n\nThese modes apply to providers that do **not** support `web_search` natively. The planner ([tool-plan.ts:164](https://github.com/Ahoo-Wang/GodeX/blob/main/src/bridge/tools/tool-plan.ts#L164)) reaches web-search planning only after the native and degraded checks, so for native providers the tool is always handled by the provider regardless of `mode`.\n\n| Mode | Behavior (non-native providers) |\n|------|----------|\n| `auto` | If a search `provider` backend is `available`, GodeX hosts the search loop (managed); otherwise the `on_unavailable` policy applies. |\n| `provider_native` | Declares the tool with provider-native execution. For providers without native `web_search`, this falls through to web-search planning like `auto`. |\n| `godex_managed` | GodeX intercepts the `web_search` function call, runs the search itself via the configured `provider` backend, emits the `web_search_call` lifecycle (`in_progress` → `searching` → `completed` / failed), and submits a continuation request with the results. Up to `max_iterations` rounds. If no backend is `available`, the `on_unavailable` policy applies. |\n| `disabled` | The managed loop is not offered. For non-native providers the `on_unavailable` policy still applies (default `client_tool_call`), so a search tool may still be exposed as a client-visible function call — set `on_unavailable: ignore` (or `fail`) to suppress it entirely. |\n\n### `provider` — managed search backend\n\n| Provider | Description |\n|----------|-------------|\n| `none` | No backend. Managed search is unavailable (`available` is `false`); the `on_unavailable` policy then applies. |\n| `mock` | Returns canned results; used for testing. |\n| `zhipu` | [Zhipu Web Search API](https://open.bigmodel.cn/dev/api/search-tool/websearch). |\n\n::: warning The Zhipu search backend reads the provider config, not just env\nSelecting `provider: zhipu` makes the backend `available` only when a `providers.zhipu` block with a `credentials.api_key` exists in `godex.yaml` — `createSearchService` reads `config.providers.zhipu.credentials.api_key` ([search/registry.ts:16-17](https://github.com/Ahoo-Wang/GodeX/blob/main/src/search/registry.ts#L16-L17)) and falls back to a no-op provider when it is absent. So on a DeepSeek/MiniMax-only config, exporting `ZHIPU_API_KEY` alone is **not** enough; add a full `providers.zhipu` entry (env interpolation works, e.g. `api_key: ${ZHIPU_API_KEY}`), or GodeX will take the `on_unavailable` path instead of hosting search.\n:::\n\n### `on_unavailable` — fallback policy\n\nApplies when the managed search loop is selected (`mode` is `auto`/`godex_managed`) but no backend is `available`, as well as when `mode` is `disabled` for a non-native provider.\n\n| Policy | Behavior |\n|--------|----------|\n| `client_tool_call` | Forward the `web_search` call to the client as a normal function call (the client handles it). |\n| `fail` | Fail the request with a `BridgeError`. |\n| `ignore` | Silently drop the search call. |\n\n::: tip\nWith the shipped defaults (`mode: auto`, `provider: none`), providers that support native web search (Zhipu, Xiaomi) use it directly, while other providers forward `web_search` calls to the client. To enable GodeX-managed search for **non-native** providers, set `provider: zhipu` **and** add a `providers.zhipu` block (with `credentials.api_key`) to `godex.yaml` — see the warning above.\n:::\n\nThe managed search loop is implemented by `HostedWebSearchStreamRunner` / `HostedWebSearchSyncRunner` in `src/responses/web-search/`. See [Streaming Pipeline](../02-architecture/streaming-pipeline.md) for how it integrates into the event production stage.\n\n## Environment Interpolation\n\nValues like `${DEEPSEEK_API_KEY}` are resolved at load time from environment variables. Missing variables produce a startup error.\n\n## Environment Variable Overrides\n\nBESIDES YAML interpolation, these environment variables directly override config fields at load time (CLI flags take precedence over both):\n\n| Variable | Config Field | Notes |\n|----------|-------------|-------|\n| `GODEX_PORT` | `server.port` | Overrides the listen port |\n| `GODEX_HOST` | `server.host` | Overrides the bind address |\n| `GODEX_LOG_LEVEL` | `logging.level` | Overrides the log level |\n| `GODEX_DEFAULT_PROVIDER` | `default_provider` | Falls back to `deepseek` if both are unset |\n\n[CLI Commands](/07-configuration/cli-commands)\n\n"}, "c217c43a4664eb50c292f8d9f3a9aaa4b24ccbe2": {"t": 1785748564.2147558, "n": 10744, "h": "f36cdc59376ddb81", "c": "---\ntitle: \"Config Schema\"\ndescription: \"Complete reference for godex.yaml configuration options.\"\nkeywords: \"GodeX, config schema, godex.yaml, YAML, server, providers, session\"\n---\n\n# Config Schema\n\nGodeX is configured via a `godex.yaml` file, typically created by `godex init`. Environment variables are interpolated using `${VAR_NAME}` syntax.\n\n## Full Schema\n\n```yaml\nserver:\n port: 5678 # HTTP listen port\n host: \"0.0.0.0\" # Listen address\n idle_timeout: 30000 # Idle connection timeout (ms)\n # Default: 0 (disabled)\n\ndefault_provider: deepseek # Provider used when model has no slash prefix\n\nmodels:\n aliases:\n \"gpt-5.5\": deepseek/deepseek-v4-pro # Maps alias to provider/model\n \"glm\": zhipu/glm-5.1 # Maps alias to provider/model\n \"*\": deepseek/deepseek-v4-flash # Catch-all fallback\n\nproviders:\n deepseek:\n spec: deepseek # Provider spec name (required)\n credentials:\n api_key: ${DEEPSEEK_API_KEY}\n endpoint:\n base_url: https://api.deepseek.com\n timeout_ms: 30000\n\n zhipu:\n spec: zhipu # Provider spec name (required)\n credentials:\n api_key: ${ZHIPU_API_KEY}\n endpoint:\n base_url: https://open.bigmodel.cn/api/coding/paas/v4\n timeout_ms: 30000\n\n minimax:\n spec: minimax # Provider spec name (required)\n credentials:\n api_key: ${MINIMAX_API_KEY}\n endpoint:\n base_url: https://api.minimaxi.com/v1\n timeout_ms: 30000\n\nsession:\n backend: sqlite # \"sqlite\" or \"memory\"\n sqlite:\n path: ./data/sessions.db\n\nlogging:\n level: info # trace | debug | info | warn | error\n console:\n enabled: true\n level: info\n file:\n enabled: false\n level: debug\n dir: ./logs\n filename: godex.log\n max_size: 10485760 # 10MB\n max_files: 5\n\nweb_search: # Built-in web search (default: enabled, no provider)\n enabled: true # Master switch\n mode: auto # auto | provider_native | godex_managed | disabled\n provider: none # none | mock | zhipu (search backend for godex_managed)\n on_unavailable: client_tool_call # client_tool_call | fail | ignore\n max_iterations: 2 # Max managed search rounds per request\n timeout_ms: 10000 # Per-search timeout\n\ntrace:\n enabled: true\n path: ./data/trace.db\n max_queue_size: 10000\n flush_interval_ms: 1000\n batch_size: 100\n capture_payload: false\n payload_max_bytes: 65536\n```\n\n## Type Definitions\n\n```mermaid\nclassDiagram\n\n class GodeXConfig {\n +server: ServerConfig\n +default_provider: string\n +models: ModelsConfig\n +providers: Record~string, ProviderConfig~\n +session: SessionConfig\n +logging: LoggingConfig\n +web_search: WebSearchConfig\n +trace: TraceConfig\n }\n\n class ServerConfig {\n +port: number\n +host: string\n +idle_timeout: number\n }\n\n class ProviderConfig {\n +spec: string\n +credentials: CredentialsConfig\n +endpoint: EndpointConfig\n +timeout_ms: number\n }\n\n class CredentialsConfig {\n +api_key: string\n }\n\n class EndpointConfig {\n +base_url: string\n }\n\n class ModelsConfig {\n +aliases: Record~string, string~\n }\n\n class SessionConfig {\n +backend: string\n +sqlite: SQLiteConfig\n }\n\n class LoggingConfig {\n +level: LogLevel\n +console: ConsoleLoggingConfig\n +file: FileLoggingConfig\n }\n\n class TraceConfig {\n +enabled: boolean\n +path: string\n +max_queue_size: number\n +flush_interval_ms: number\n +batch_size: number\n +capture_payload: boolean\n +payload_max_bytes: number\n }\n\n class WebSearchConfig {\n +enabled: boolean\n +mode: WebSearchMode\n +provider: WebSearchProvider\n +on_unavailable: WebSearchOnUnavailable\n +max_iterations: number\n +timeout_ms: number\n }\n\n GodeXConfig --> ServerConfig\n GodeXConfig --> ModelsConfig\n GodeXConfig --> ProviderConfig\n GodeXConfig --> SessionConfig\n GodeXConfig --> LoggingConfig\n GodeXConfig --> WebSearchConfig\n GodeXConfig --> TraceConfig\n ProviderConfig --> CredentialsConfig\n ProviderConfig --> EndpointConfig\n```\n\n## Provider Config\n\nEach provider entry must include a `spec` field that matches a registered provider definition name. Legacy provider config without `spec` is rejected at startup.\n\n```yaml\nproviders:\n myprovider:\n spec: myprovider # Required: matches registered definition\n credentials:\n api_key: ${MY_API_KEY}\n endpoint:\n base_url: https://api.example.com/v1\n timeout_ms: 30000\n```\n\n## Web Search\n\nGodeX can run web search in two ways: let the provider handle it natively, or run the search itself (\"GodeX-managed\" / \"hosted\") and feed results back into a continuation request. The `web_search` block ([src/config/sections/web-search.ts:10](https://github.com/Ahoo-Wang/GodeX/blob/main/src/config/sections/web-search.ts#L10)) controls this.\n\n::: warning Important: native providers always use native search\nFor providers whose tool set already includes `web_search` as a native tool (Zhipu, Xiaomi), the planner returns the tool as natively supported **before** consulting `mode`. This means `mode: godex_managed` and `mode: disabled` have **no effect** on those providers — they always get native `web_search`. The `mode` settings below govern how `web_search` is handled for providers that do **not** support it natively (DeepSeek, MiniMax), or when you want GodeX to host the search loop. See [tool-plan.ts:129](https://github.com/Ahoo-Wang/GodeX/blob/main/src/bridge/tools/tool-plan.ts#L129) for the precedence (native → degraded → web-search planning).\n:::\n\n| Field | Default | Description |\n|-------|---------|-------------|\n| `enabled` | `true` | Master switch. When `false`, the effective `mode` becomes `disabled` and `available` is `false`. |\n| `mode` | `auto` | Execution strategy — see the table below (applies to non-native providers). |\n| `provider` | `none` | The search backend GodeX uses in `godex_managed` mode. |\n| `on_unavailable` | `client_tool_call` | What to do when managed search is selected but no backend is available. |\n| `max_iterations` | `2` | Maximum number of managed search rounds per request. |\n| `timeout_ms` | `10000` | Per-search timeout in milliseconds. |\n\n### `mode` — execution strategy\n\nThese modes apply to providers that do **not** support `web_search` natively. The planner ([tool-plan.ts:164](https://github.com/Ahoo-Wang/GodeX/blob/main/src/bridge/tools/tool-plan.ts#L164)) reaches web-search planning only after the native and degraded checks, so for native providers the tool is always handled by the provider regardless of `mode`.\n\n| Mode | Behavior (non-native providers) |\n|------|----------|\n| `auto` | If a search `provider` backend is `available`, GodeX hosts the search loop (managed); otherwise the `on_unavailable` policy applies. |\n| `provider_native` | Declares the tool with provider-native execution. For providers without native `web_search`, this falls through to web-search planning like `auto`. |\n| `godex_managed` | GodeX intercepts the `web_search` function call, runs the search itself via the configured `provider` backend, emits the `web_search_call` lifecycle (`in_progress` → `searching` → `completed` / failed), and submits a continuation request with the results. Up to `max_iterations` rounds. If no backend is `available`, the `on_unavailable` policy applies. |\n| `disabled` | The managed loop is not offered. For non-native providers the `on_unavailable` policy still applies (default `client_tool_call`), so a search tool may still be exposed as a client-visible function call — set `on_unavailable: ignore` (or `fail`) to suppress it entirely. |\n\n### `provider` — managed search backend\n\n| Provider | Description |\n|----------|-------------|\n| `none` | No backend. Managed search is unavailable (`available` is `false`); the `on_unavailable` policy then applies. |\n| `mock` | Returns canned results; used for testing. |\n| `zhipu` | [Zhipu Web Search API](https://open.bigmodel.cn/dev/api/search-tool/websearch). |\n\n::: warning The Zhipu search backend reads the provider config, not just env\nSelecting `provider: zhipu` makes the backend `available` only when a `providers.zhipu` block with a `credentials.api_key` exists in `godex.yaml` — `createSearchService` reads `config.providers.zhipu.credentials.api_key` ([search/registry.ts:16-17](https://github.com/Ahoo-Wang/GodeX/blob/main/src/search/registry.ts#L16-L17)) and falls back to a no-op provider when it is absent. So on a DeepSeek/MiniMax-only config, exporting `ZHIPU_API_KEY` alone is **not** enough; add a full `providers.zhipu` entry (env interpolation works, e.g. `api_key: ${ZHIPU_API_KEY}`), or GodeX will take the `on_unavailable` path instead of hosting search.\n:::\n\n### `on_unavailable` — fallback policy\n\nApplies when the managed search loop is selected (`mode` is `auto`/`godex_managed`) but no backend is `available`, as well as when `mode` is `disabled` for a non-native provider.\n\n| Policy | Behavior |\n|--------|----------|\n| `client_tool_call` | Forward the `web_search` call to the client as a normal function call (the client handles it). |\n| `fail` | Fail the request with a `BridgeError`. |\n| `ignore` | Silently drop the search call. |\n\n::: tip\nWith the shipped defaults (`mode: auto`, `provider: none`), providers that support native web search (Zhipu, Xiaomi) use it directly, while other providers forward `web_search` calls to the client. To enable GodeX-managed search for **non-native** providers, set `provider: zhipu` **and** add a `providers.zhipu` block (with `credentials.api_key`) to `godex.yaml` — see the warning above.\n:::\n\nThe managed search loop is implemented by `HostedWebSearchStreamRunner` / `HostedWebSearchSyncRunner` in `src/responses/web-search/`. See [Streaming Pipeline](../02-architecture/streaming-pipeline.md) for how it integrates into the event production stage.\n\n## Environment Interpolation\n\nValues like `${DEEPSEEK_API_KEY}` are resolved at load time from environment variables. Missing variables produce a startup error.\n\n## Environment Variable Overrides\n\nBESIDES YAML interpolation, these environment variables directly override config fields at load time (CLI flags take precedence over both):\n\n| Variable | Config Field | Notes |\n|----------|-------------|-------|\n| `GODEX_PORT` | `server.port` | Overrides the listen port |\n| `GODEX_HOST` | `server.host` | Overrides the bind address |\n| `GODEX_LOG_LEVEL` | `logging.level` | Overrides the log level |\n| `GODEX_DEFAULT_PROVIDER` | `default_provider` | Falls back to `deepseek` if both are unset |\n\n[CLI Commands](/07-configuration/cli-commands)\n\n"}, "99a9b18d2a91596af8525a615eb05796344e813f": {"t": 1785748565.3487267, "n": 4586, "h": "f7040cf9a4cd92d1", "c": "---\ntitle: \"Config Schema\"\ndescription: \"Complete reference for godex.yaml configuration options.\"\nkeywords: \"GodeX, config schema, godex.yaml, YAML, server, providers, session\"\n---\n\n# Config Schema\n\nGodeX is configured via a `godex.yaml` file, typically created by `godex init`. Environment variables are interpolated using `${VAR_NAME}` syntax.\n\n## Full Schema\n\n```yaml\nserver:\n port: 5678 # HTTP listen port\n host: \"0.0.0.0\" # Listen address\n idle_timeout: 30000 # Idle connection timeout (ms)\n # Default: 0 (disabled)\n\ndefault_provider: deepseek # Provider used when model has no slash prefix\n\nmodels:\n aliases:\n \"gpt-5.5\": deepseek/deepseek-v4-pro # Maps alias to provider/model\n \"glm\": zhipu/glm-5.1 # Maps alias to provider/model\n \"*\": deepseek/deepseek-v4-flash # Catch-all fallback\n\nproviders:\n deepseek:\n spec: deepseek # Provider spec name (required)\n credentials:\n api_key: ${DEEPSEEK_API_KEY}\n endpoint:\n base_url: https://api.deepseek.com\n timeout_ms: 30000\n\n zhipu:\n spec: zhipu # Provider spec name (required)\n credentials:\n api_key: ${ZHIPU_API_KEY}\n endpoint:\n base_url: https://open.bigmodel.cn/api/coding/paas/v4\n timeout_ms: 30000\n\n minimax:\n spec: minimax # Provider spec name (required)\n credentials:\n api_key: ${MINIMAX_API_KEY}\n endpoint:\n base_url: https://api.minimaxi.com/v1\n timeout_ms: 30000\n\nsession:\n backend: sqlite # \"sqlite\" or \"memory\"\n sqlite:\n path: ./data/sessions.db\n\nlogging:\n level: info # trace | debug | info | warn | error\n console:\n enabled: true\n level: info\n file:\n enabled: false\n level: debug\n dir: ./logs\n filename: godex.log\n max_size: 10485760 # 10MB\n max_files: 5\n\ntrace:\n enabled: true\n path: ./data/trace.db\n max_queue_size: 10000\n flush_interval_ms: 1000\n batch_size: 100\n capture_payload: false\n payload_max_bytes: 65536\n```\n\n## Type Definitions\n\n```mermaid\nclassDiagram\n\n class GodeXConfig {\n +server: ServerConfig\n +default_provider: string\n +models: ModelsConfig\n +providers: Record~string, ProviderConfig~\n +session: SessionConfig\n +logging: LoggingConfig\n +trace: TraceConfig\n }\n\n class ServerConfig {\n +port: number\n +host: string\n +idle_timeout: number\n }\n\n class ProviderConfig {\n +spec: string\n +credentials: CredentialsConfig\n +endpoint: EndpointConfig\n +timeout_ms: number\n }\n\n class CredentialsConfig {\n +api_key: string\n }\n\n class EndpointConfig {\n +base_url: string\n }\n\n class ModelsConfig {\n +aliases: Record~string, string~\n }\n\n class SessionConfig {\n +backend: string\n +sqlite: SQLiteConfig\n }\n\n class LoggingConfig {\n +level: LogLevel\n +console: ConsoleLoggingConfig\n +file: FileLoggingConfig\n }\n\n class TraceConfig {\n +enabled: boolean\n +path: string\n +max_queue_size: number\n +flush_interval_ms: number\n +batch_size: number\n +capture_payload: boolean\n +payload_max_bytes: number\n }\n\n GodeXConfig --> ServerConfig\n GodeXConfig --> ModelsConfig\n GodeXConfig --> ProviderConfig\n GodeXConfig --> SessionConfig\n GodeXConfig --> LoggingConfig\n GodeXConfig --> TraceConfig\n ProviderConfig --> CredentialsConfig\n ProviderConfig --> EndpointConfig\n```\n\n## Provider Config\n\nEach provider entry must include a `spec` field that matches a registered provider definition name. Legacy provider config without `spec` is rejected at startup.\n\n```yaml\nproviders:\n myprovider:\n spec: myprovider # Required: matches registered definition\n credentials:\n api_key: ${MY_API_KEY}\n endpoint:\n base_url: https://api.example.com/v1\n timeout_ms: 30000\n```\n\n## Environment Interpolation\n\nValues like `${DEEPSEEK_API_KEY}` are resolved at load time from environment variables. Missing variables produce a startup error.\n\n## Environment Variable Overrides\n\nBESIDES YAML interpolation, these environment variables directly override config fields at load time (CLI flags take precedence over both):\n\n| Variable | Config Field | Notes |\n|----------|-------------|-------|\n| `GODEX_PORT` | `server.port` | Overrides the listen port |\n| `GODEX_HOST` | `server.host` | Overrides the bind address |\n| `GODEX_LOG_LEVEL` | `logging.level` | Overrides the log level |\n| `GODEX_DEFAULT_PROVIDER` | `default_provider` | Falls back to `deepseek` if both are unset |\n\n[CLI Commands](/07-configuration/cli-commands)\n\n"}, "a8af5f8b9bdb48050a26dbb64721c2d81f8431ba": {"t": 1785748566.4075866, "n": 4600, "h": "fd54e5799f19c89b", "c": "---\ntitle: \"Config Schema\"\ndescription: \"Complete reference for godex.yaml configuration options.\"\nkeywords: \"GodeX, config schema, godex.yaml, YAML, server, providers, session\"\n---\n\n# Config Schema\n\nGodeX is configured via a `godex.yaml` file, typically created by `godex init`. Environment variables are interpolated using `${VAR_NAME}` syntax.\n\n## Full Schema\n\n```yaml\nserver:\n port: 5678 # HTTP listen port\n host: \"0.0.0.0\" # Listen address\n idle_timeout: 30000 # Idle connection timeout (ms)\n # Default: 0 (disabled)\n\ndefault_provider: deepseek # Provider used when model has no slash prefix\n\nmodels:\n aliases:\n \"gpt-5.5\": deepseek/deepseek-v4-pro # Maps alias to provider/model\n \"glm\": zhipu/glm-5.1 # Maps alias to provider/model\n \"*\": deepseek/deepseek-v4-flash # Catch-all fallback\n\nproviders:\n deepseek:\n spec: deepseek # Provider spec name (required)\n credentials:\n api_key: ${DEEPSEEK_API_KEY}\n endpoint:\n base_url: https://api.deepseek.com\n timeout_ms: 30000\n\n zhipu:\n spec: zhipu # Provider spec name (required)\n credentials:\n api_key: ${ZHIPU_API_KEY}\n endpoint:\n base_url: https://open.bigmodel.cn/api/coding/paas/v4\n timeout_ms: 30000\n\n minimax:\n spec: minimax # Provider spec name (required)\n credentials:\n api_key: ${MINIMAX_API_KEY}\n endpoint:\n base_url: https://api.minimaxi.com/v1\n timeout_ms: 30000\n\nsession:\n backend: sqlite # \"sqlite\" or \"memory\"\n sqlite:\n path: ./data/sessions.db\n\nlogging:\n level: info # trace | debug | info | warn | error\n console:\n enabled: true\n level: info\n file:\n enabled: false\n level: debug\n dir: ./logs\n filename: godex.log\n max_size: 10485760 # 10MB\n max_files: 5\n\ntrace:\n enabled: true\n path: ./data/trace.db\n max_queue_size: 10000\n flush_interval_ms: 1000\n batch_size: 100\n capture_payload: false\n payload_max_bytes: 65536\n```\n\n## Type Definitions\n\n```mermaid\nclassDiagram\n direction TB\n\n class GodeXConfig {\n +server: ServerConfig\n +default_provider: string\n +models: ModelsConfig\n +providers: Record~string, ProviderConfig~\n +session: SessionConfig\n +logging: LoggingConfig\n +trace: TraceConfig\n }\n\n class ServerConfig {\n +port: number\n +host: string\n +idle_timeout: number\n }\n\n class ProviderConfig {\n +spec: string\n +credentials: CredentialsConfig\n +endpoint: EndpointConfig\n +timeout_ms: number\n }\n\n class CredentialsConfig {\n +api_key: string\n }\n\n class EndpointConfig {\n +base_url: string\n }\n\n class ModelsConfig {\n +aliases: Record~string, string~\n }\n\n class SessionConfig {\n +backend: string\n +sqlite: SQLiteConfig\n }\n\n class LoggingConfig {\n +level: LogLevel\n +console: ConsoleLoggingConfig\n +file: FileLoggingConfig\n }\n\n class TraceConfig {\n +enabled: boolean\n +path: string\n +max_queue_size: number\n +flush_interval_ms: number\n +batch_size: number\n +capture_payload: boolean\n +payload_max_bytes: number\n }\n\n GodeXConfig --> ServerConfig\n GodeXConfig --> ModelsConfig\n GodeXConfig --> ProviderConfig\n GodeXConfig --> SessionConfig\n GodeXConfig --> LoggingConfig\n GodeXConfig --> TraceConfig\n ProviderConfig --> CredentialsConfig\n ProviderConfig --> EndpointConfig\n```\n\n## Provider Config\n\nEach provider entry must include a `spec` field that matches a registered provider definition name. Legacy provider config without `spec` is rejected at startup.\n\n```yaml\nproviders:\n myprovider:\n spec: myprovider # Required: matches registered definition\n credentials:\n api_key: ${MY_API_KEY}\n endpoint:\n base_url: https://api.example.com/v1\n timeout_ms: 30000\n```\n\n## Environment Interpolation\n\nValues like `${DEEPSEEK_API_KEY}` are resolved at load time from environment variables. Missing variables produce a startup error.\n\n## Environment Variable Overrides\n\nBESIDES YAML interpolation, these environment variables directly override config fields at load time (CLI flags take precedence over both):\n\n| Variable | Config Field | Notes |\n|----------|-------------|-------|\n| `GODEX_PORT` | `server.port` | Overrides the listen port |\n| `GODEX_HOST` | `server.host` | Overrides the bind address |\n| `GODEX_LOG_LEVEL` | `logging.level` | Overrides the log level |\n| `GODEX_DEFAULT_PROVIDER` | `default_provider` | Falls back to `deepseek` if both are unset |\n\n[CLI Commands](/07-configuration/cli-commands)\n"}, "7a896165151c1b7d2f8822f102bdda120500d8f3": {"t": 1785748567.4840298, "n": 4381, "h": "9cbce00df922cc9c", "c": "---\ntitle: \"Config Schema\"\ndescription: \"Complete reference for godex.yaml configuration options.\"\nkeywords: \"GodeX, config schema, godex.yaml, YAML, server, providers, session\"\n---\n\n# Config Schema\n\nGodeX is configured via a `godex.yaml` file, typically created by `godex init`. Environment variables are interpolated using `${VAR_NAME}` syntax.\n\n## Full Schema\n\n```yaml\nserver:\n port: 5678 # HTTP listen port\n host: \"0.0.0.0\" # Listen address\n idle_timeout: 30000 # Idle connection timeout (ms)\n # Default: 0 (disabled)\n\ndefault_provider: deepseek # Provider used when model has no slash prefix\n\nmodels:\n aliases:\n \"gpt-5.5\": deepseek/deepseek-v4-pro # Maps alias to provider/model\n \"glm\": zhipu/glm-5.1 # Maps alias to provider/model\n \"*\": deepseek/deepseek-v4-flash # Catch-all fallback\n\nproviders:\n deepseek:\n spec: deepseek # Provider spec name (required)\n credentials:\n api_key: ${DEEPSEEK_API_KEY}\n endpoint:\n base_url: https://api.deepseek.com\n timeout_ms: 30000\n\n zhipu:\n spec: zhipu # Provider spec name (required)\n credentials:\n api_key: ${ZHIPU_API_KEY}\n endpoint:\n base_url: https://open.bigmodel.cn/api/coding/paas/v4\n timeout_ms: 30000\n\nsession:\n backend: sqlite # \"sqlite\" or \"memory\"\n sqlite:\n path: ./data/sessions.db\n\nlogging:\n level: info # trace | debug | info | warn | error\n console:\n enabled: true\n level: info\n file:\n enabled: false\n level: debug\n dir: ./logs\n filename: godex.log\n max_size: 10485760 # 10MB\n max_files: 5\n\ntrace:\n enabled: true\n path: ./data/trace.db\n max_queue_size: 10000\n flush_interval_ms: 1000\n batch_size: 100\n capture_payload: false\n payload_max_bytes: 65536\n```\n\n## Type Definitions\n\n```mermaid\nclassDiagram\n direction TB\n\n class GodeXConfig {\n +server: ServerConfig\n +default_provider: string\n +models: ModelsConfig\n +providers: Record~string, ProviderConfig~\n +session: SessionConfig\n +logging: LoggingConfig\n +trace: TraceConfig\n }\n\n class ServerConfig {\n +port: number\n +host: string\n +idle_timeout: number\n }\n\n class ProviderConfig {\n +spec: string\n +credentials: CredentialsConfig\n +endpoint: EndpointConfig\n +timeout_ms: number\n }\n\n class CredentialsConfig {\n +api_key: string\n }\n\n class EndpointConfig {\n +base_url: string\n }\n\n class ModelsConfig {\n +aliases: Record~string, string~\n }\n\n class SessionConfig {\n +backend: string\n +sqlite: SQLiteConfig\n }\n\n class LoggingConfig {\n +level: LogLevel\n +console: ConsoleLoggingConfig\n +file: FileLoggingConfig\n }\n\n class TraceConfig {\n +enabled: boolean\n +path: string\n +max_queue_size: number\n +flush_interval_ms: number\n +batch_size: number\n +capture_payload: boolean\n +payload_max_bytes: number\n }\n\n GodeXConfig --> ServerConfig\n GodeXConfig --> ModelsConfig\n GodeXConfig --> ProviderConfig\n GodeXConfig --> SessionConfig\n GodeXConfig --> LoggingConfig\n GodeXConfig --> TraceConfig\n ProviderConfig --> CredentialsConfig\n ProviderConfig --> EndpointConfig\n```\n\n## Provider Config\n\nEach provider entry must include a `spec` field that matches a registered provider definition name. Legacy provider config without `spec` is rejected at startup.\n\n```yaml\nproviders:\n myprovider:\n spec: myprovider # Required: matches registered definition\n credentials:\n api_key: ${MY_API_KEY}\n endpoint:\n base_url: https://api.example.com/v1\n timeout_ms: 30000\n```\n\n## Environment Interpolation\n\nValues like `${DEEPSEEK_API_KEY}` are resolved at load time from environment variables. Missing variables produce a startup error.\n\n## Environment Variable Overrides\n\nBESIDES YAML interpolation, these environment variables directly override config fields at load time (CLI flags take precedence over both):\n\n| Variable | Config Field | Notes |\n|----------|-------------|-------|\n| `GODEX_PORT` | `server.port` | Overrides the listen port |\n| `GODEX_HOST` | `server.host` | Overrides the bind address |\n| `GODEX_LOG_LEVEL` | `logging.level` | Overrides the log level |\n| `GODEX_DEFAULT_PROVIDER` | `default_provider` | Falls back to `zhipu` if both are unset |\n\n[CLI Commands](/07-configuration/cli-commands)\n"}, "11869bda14585d5a812d6e629ea86a668edfdf47": {"t": 1785748568.569239, "n": 3802, "h": "758f54bba3c1d0cb", "c": "---\ntitle: \"Config Schema\"\ndescription: \"Complete reference for godex.yaml configuration options.\"\nkeywords: \"GodeX, config schema, godex.yaml, YAML, server, providers, session\"\n---\n\n# Config Schema\n\nGodeX is configured via a `godex.yaml` file, typically created by `godex init`. Environment variables are interpolated using `${VAR_NAME}` syntax.\n\n## Full Schema\n\n```yaml\nserver:\n port: 5678 # HTTP listen port\n host: \"0.0.0.0\" # Listen address\n idle_timeout: 30000 # Idle connection timeout (ms)\n\ndefault_provider: deepseek # Provider used when model has no slash prefix\n\nmodels:\n aliases:\n \"gpt-5.5\": deepseek/deepseek-v4-pro # Maps alias to provider/model\n \"glm\": zhipu/glm-5.1 # Maps alias to provider/model\n \"*\": deepseek/deepseek-v4-flash # Catch-all fallback\n\nproviders:\n deepseek:\n spec: deepseek # Provider spec name (required)\n credentials:\n api_key: ${DEEPSEEK_API_KEY}\n endpoint:\n base_url: https://api.deepseek.com\n timeout_ms: 30000\n\n zhipu:\n spec: zhipu # Provider spec name (required)\n credentials:\n api_key: ${ZHIPU_API_KEY}\n endpoint:\n base_url: https://open.bigmodel.cn/api/coding/paas/v4\n timeout_ms: 30000\n\nsession:\n backend: sqlite # \"sqlite\" or \"memory\"\n sqlite:\n path: ./data/sessions.db\n\nlogging:\n level: info # trace | debug | info | warn | error\n console:\n enabled: true\n level: info\n file:\n enabled: false\n level: debug\n dir: ./logs\n filename: godex.log\n max_size: 10485760 # 10MB\n max_files: 5\n\ntrace:\n enabled: true\n path: ./data/trace.db\n max_queue_size: 1000\n flush_interval_ms: 1000\n batch_size: 50\n capture_payload: false\n payload_max_bytes: 102400\n```\n\n## Type Definitions\n\n```mermaid\nclassDiagram\n direction TB\n\n class GodeXConfig {\n +server: ServerConfig\n +default_provider: string\n +models: ModelsConfig\n +providers: Record~string, ProviderConfig~\n +session: SessionConfig\n +logging: LoggingConfig\n +trace: TraceConfig\n }\n\n class ServerConfig {\n +port: number\n +host: string\n +idle_timeout: number\n }\n\n class ProviderConfig {\n +spec: string\n +credentials: CredentialsConfig\n +endpoint: EndpointConfig\n +timeout_ms: number\n }\n\n class CredentialsConfig {\n +api_key: string\n }\n\n class EndpointConfig {\n +base_url: string\n }\n\n class ModelsConfig {\n +aliases: Record~string, string~\n }\n\n class SessionConfig {\n +backend: string\n +sqlite: SQLiteConfig\n }\n\n class LoggingConfig {\n +level: LogLevel\n +console: ConsoleLoggingConfig\n +file: FileLoggingConfig\n }\n\n class TraceConfig {\n +enabled: boolean\n +path: string\n +max_queue_size: number\n +flush_interval_ms: number\n +batch_size: number\n +capture_payload: boolean\n +payload_max_bytes: number\n }\n\n GodeXConfig --> ServerConfig\n GodeXConfig --> ModelsConfig\n GodeXConfig --> ProviderConfig\n GodeXConfig --> SessionConfig\n GodeXConfig --> LoggingConfig\n GodeXConfig --> TraceConfig\n ProviderConfig --> CredentialsConfig\n ProviderConfig --> EndpointConfig\n```\n\n## Provider Config\n\nEach provider entry must include a `spec` field that matches a registered provider definition name. Legacy provider config without `spec` is rejected at startup.\n\n```yaml\nproviders:\n myprovider:\n spec: myprovider # Required: matches registered definition\n credentials:\n api_key: ${MY_API_KEY}\n endpoint:\n base_url: https://api.example.com/v1\n timeout_ms: 30000\n```\n\n## Environment Interpolation\n\nValues like `${DEEPSEEK_API_KEY}` are resolved at load time from environment variables. Missing variables produce a startup error.\n\n[CLI Commands](/07-configuration/cli-commands)\n"}, "49620042afbb8aa691fe404cad0446fe9c08b7f7": {"t": 1785748569.6518888, "n": 2260, "h": "83d486dee5ba995d", "c": "---\ntitle: \"Config Schema\"\ndescription: \"Complete reference for godex.yaml configuration options.\"\nkeywords: \"GodeX, config schema, godex.yaml, YAML, server, providers, session\"\n---\n\n# Config Schema\n\nGodeX is configured via a `godex.yaml` file, typically created by `godex init`. Environment variables are interpolated using `${VAR_NAME}` syntax.\n\n## Full Schema\n\n```yaml\nserver:\n port: 5678 # HTTP listen port\n host: \"0.0.0.0\" # Listen address\n idle_timeout: 30000 # Idle connection timeout (ms)\n\ndefault_provider: zhipu # Provider used when model has no slash prefix\n\nmodels:\n aliases:\n \"gpt-4o\": zhipu/glm-4.7 # Maps gpt-4o to provider-native glm-4.7\n \"*\": zhipu/glm-5.1 # Catch-all fallback\n\nproviders:\n zhipu:\n api_key: ${ZHIPU_API_KEY}\n base_url: https://open.bigmodel.cn/api/coding/paas/v4\n\nsession:\n backend: sqlite # \"sqlite\" or \"memory\"\n sqlite:\n path: ./data/sessions.db\n\nlogging:\n level: info # trace | debug | info | warn | error\n console:\n enabled: true\n level: info\n file:\n enabled: false\n level: debug\n dir: ./logs\n filename: godex.log\n max_size: 10485760 # 10MB\n max_files: 5\n```\n\n## Type Definitions\n\n```mermaid\nclassDiagram\n direction TB\n\n class GodeXConfig {\n +server: ServerConfig\n +default_provider: string\n +models: ModelsConfig\n +providers: Record~string, ProviderConfig~\n +session: SessionConfig\n +logging: LoggingConfig\n }\n\n class ServerConfig {\n +port: number\n +host: string\n +idle_timeout: number\n }\n\n class ProviderConfig {\n +api_key: string\n +base_url: string\n }\n\n class ModelsConfig {\n +aliases: Record~string, string~\n }\n\n class SessionConfig {\n +backend: string\n +sqlite: SQLiteConfig\n }\n\n class LoggingConfig {\n +level: LogLevel\n +console: ConsoleLoggingConfig\n +file: FileLoggingConfig\n }\n\n GodeXConfig --> ServerConfig\n GodeXConfig --> ModelsConfig\n GodeXConfig --> ProviderConfig\n GodeXConfig --> SessionConfig\n GodeXConfig --> LoggingConfig\n```\n\n## Environment Interpolation\n\nValues like `${ZHIPU_API_KEY}` are resolved at load time from `process.env`. Missing variables produce a startup error.\n\n[CLI Commands](/07-configuration/cli-commands)\n"}, "65ab216ae876c7c09e193f4d7266a36f639aa92c": {"t": 1785748570.787158, "n": 2198, "h": "c9dd1970fe82be9c", "c": "---\ntitle: \"Config Schema\"\ndescription: \"Complete reference for godex.yaml configuration options.\"\nkeywords: \"GodeX, config schema, godex.yaml, YAML, server, providers, session\"\n---\n\n# Config Schema\n\nGodeX is configured via a `godex.yaml` file, typically created by `godex init`. Environment variables are interpolated using `${VAR_NAME}` syntax.\n\n## Full Schema\n\n```yaml\nserver:\n port: 5678 # HTTP listen port\n host: \"0.0.0.0\" # Listen address\n idle_timeout: 30000 # Idle connection timeout (ms)\n\ndefault_provider: zhipu # Provider used when model has no slash prefix\n\nproviders:\n zhipu:\n api_key: ${ZHIPU_API_KEY}\n base_url: https://open.bigmodel.cn/api/coding/paas/v4\n models: # Model name mapping table\n \"gpt-4o\": glm-4.7 # Maps gpt-4o to provider-native glm-4.7\n \"*\": glm-5.1 # Catch-all fallback\n\nsession:\n backend: sqlite # \"sqlite\" or \"memory\"\n sqlite:\n path: ./data/sessions.db\n\nlogging:\n level: info # trace | debug | info | warn | error\n console:\n enabled: true\n level: info\n file:\n enabled: false\n level: debug\n dir: ./logs\n filename: godex.log\n max_size: 10485760 # 10MB\n max_files: 5\n```\n\n## Type Definitions\n\n```mermaid\nclassDiagram\n direction TB\n\n class GodeXConfig {\n +server: ServerConfig\n +default_provider: string\n +providers: Record~string, ProviderConfig~\n +session: SessionConfig\n +logging: LoggingConfig\n }\n\n class ServerConfig {\n +port: number\n +host: string\n +idle_timeout: number\n }\n\n class ProviderConfig {\n +api_key: string\n +base_url: string\n +models: Record~string, string~\n }\n\n class SessionConfig {\n +backend: string\n +sqlite: SQLiteConfig\n }\n\n class LoggingConfig {\n +level: LogLevel\n +console: ConsoleLoggingConfig\n +file: FileLoggingConfig\n }\n\n GodeXConfig --> ServerConfig\n GodeXConfig --> ProviderConfig\n GodeXConfig --> SessionConfig\n GodeXConfig --> LoggingConfig\n```\n\n## Environment Interpolation\n\nValues like `${ZHIPU_API_KEY}` are resolved at load time from `process.env`. Missing variables produce a startup error.\n\n[CLI Commands](/07-configuration/cli-commands)\n"}, "29cb3a87490dc075b5d879b8e171099c84e8981f": {"t": 1785748571.9047074, "n": 2119, "h": "3f4309fcb9fa51b3", "c": "---\ntitle: \"Config Schema\"\ndescription: \"Complete reference for godex.yaml configuration options.\"\n---\n\n# Config Schema\n\nGodeX is configured via a `godex.yaml` file, typically created by `godex init`. Environment variables are interpolated using `${VAR_NAME}` syntax.\n\n## Full Schema\n\n```yaml\nserver:\n port: 5678 # HTTP listen port\n host: \"0.0.0.0\" # Listen address\n idle_timeout: 30000 # Idle connection timeout (ms)\n\ndefault_provider: zhipu # Provider used when model has no slash prefix\n\nproviders:\n zhipu:\n api_key: ${ZHIPU_API_KEY}\n base_url: https://open.bigmodel.cn/api/coding/paas/v4\n models: # Model name mapping table\n \"gpt-4o\": glm-4.7 # Maps gpt-4o to provider-native glm-4.7\n \"*\": glm-5.1 # Catch-all fallback\n\nsession:\n backend: sqlite # \"sqlite\" or \"memory\"\n sqlite:\n path: ./data/sessions.db\n\nlogging:\n level: info # trace | debug | info | warn | error\n console:\n enabled: true\n level: info\n file:\n enabled: false\n level: debug\n dir: ./logs\n filename: godex.log\n max_size: 10485760 # 10MB\n max_files: 5\n```\n\n## Type Definitions\n\n```mermaid\nclassDiagram\n direction TB\n\n class GodeXConfig {\n +server: ServerConfig\n +default_provider: string\n +providers: Record~string, ProviderConfig~\n +session: SessionConfig\n +logging: LoggingConfig\n }\n\n class ServerConfig {\n +port: number\n +host: string\n +idle_timeout: number\n }\n\n class ProviderConfig {\n +api_key: string\n +base_url: string\n +models: Record~string, string~\n }\n\n class SessionConfig {\n +backend: string\n +sqlite: SQLiteConfig\n }\n\n class LoggingConfig {\n +level: LogLevel\n +console: ConsoleLoggingConfig\n +file: FileLoggingConfig\n }\n\n GodeXConfig --> ServerConfig\n GodeXConfig --> ProviderConfig\n GodeXConfig --> SessionConfig\n GodeXConfig --> LoggingConfig\n```\n\n## Environment Interpolation\n\nValues like `${ZHIPU_API_KEY}` are resolved at load time from `process.env`. Missing variables produce a startup error.\n\n[CLI Commands](/07-configuration/cli-commands)\n"}, "f6b3168d68a00be5ba80b0d259ab8d648d4e9691": {"t": 1785748573.0048952, "n": 2119, "h": "769ef1cb9b2b4c23", "c": "---\ntitle: \"Config Schema\"\ndescription: \"Complete reference for godex.yaml configuration options.\"\n---\n\n# Config Schema\n\nGodex is configured via a `godex.yaml` file, typically created by `godex init`. Environment variables are interpolated using `${VAR_NAME}` syntax.\n\n## Full Schema\n\n```yaml\nserver:\n port: 5678 # HTTP listen port\n host: \"0.0.0.0\" # Listen address\n idle_timeout: 30000 # Idle connection timeout (ms)\n\ndefault_provider: zhipu # Provider used when model has no slash prefix\n\nproviders:\n zhipu:\n api_key: ${ZHIPU_API_KEY}\n base_url: https://open.bigmodel.cn/api/coding/paas/v4\n models: # Model name mapping table\n \"gpt-4o\": glm-4.7 # Maps gpt-4o to provider-native glm-4.7\n \"*\": glm-5.1 # Catch-all fallback\n\nsession:\n backend: sqlite # \"sqlite\" or \"memory\"\n sqlite:\n path: ./data/sessions.db\n\nlogging:\n level: info # trace | debug | info | warn | error\n console:\n enabled: true\n level: info\n file:\n enabled: false\n level: debug\n dir: ./logs\n filename: godex.log\n max_size: 10485760 # 10MB\n max_files: 5\n```\n\n## Type Definitions\n\n```mermaid\nclassDiagram\n direction TB\n\n class GodexConfig {\n +server: ServerConfig\n +default_provider: string\n +providers: Record~string, ProviderConfig~\n +session: SessionConfig\n +logging: LoggingConfig\n }\n\n class ServerConfig {\n +port: number\n +host: string\n +idle_timeout: number\n }\n\n class ProviderConfig {\n +api_key: string\n +base_url: string\n +models: Record~string, string~\n }\n\n class SessionConfig {\n +backend: string\n +sqlite: SQLiteConfig\n }\n\n class LoggingConfig {\n +level: LogLevel\n +console: ConsoleLoggingConfig\n +file: FileLoggingConfig\n }\n\n GodexConfig --> ServerConfig\n GodexConfig --> ProviderConfig\n GodexConfig --> SessionConfig\n GodexConfig --> LoggingConfig\n```\n\n## Environment Interpolation\n\nValues like `${ZHIPU_API_KEY}` are resolved at load time from `process.env`. Missing variables produce a startup error.\n\n[CLI Commands](/07-configuration/cli-commands)\n"}, "9efb5d28b803166fc52e46da8d469512befd054b": {"t": 1786067854.4240422, "n": 10744, "h": "f36cdc59376ddb81", "c": "---\ntitle: \"Config Schema\"\ndescription: \"Complete reference for godex.yaml configuration options.\"\nkeywords: \"GodeX, config schema, godex.yaml, YAML, server, providers, session\"\n---\n\n# Config Schema\n\nGodeX is configured via a `godex.yaml` file, typically created by `godex init`. Environment variables are interpolated using `${VAR_NAME}` syntax.\n\n## Full Schema\n\n```yaml\nserver:\n port: 5678 # HTTP listen port\n host: \"0.0.0.0\" # Listen address\n idle_timeout: 30000 # Idle connection timeout (ms)\n # Default: 0 (disabled)\n\ndefault_provider: deepseek # Provider used when model has no slash prefix\n\nmodels:\n aliases:\n \"gpt-5.5\": deepseek/deepseek-v4-pro # Maps alias to provider/model\n \"glm\": zhipu/glm-5.1 # Maps alias to provider/model\n \"*\": deepseek/deepseek-v4-flash # Catch-all fallback\n\nproviders:\n deepseek:\n spec: deepseek # Provider spec name (required)\n credentials:\n api_key: ${DEEPSEEK_API_KEY}\n endpoint:\n base_url: https://api.deepseek.com\n timeout_ms: 30000\n\n zhipu:\n spec: zhipu # Provider spec name (required)\n credentials:\n api_key: ${ZHIPU_API_KEY}\n endpoint:\n base_url: https://open.bigmodel.cn/api/coding/paas/v4\n timeout_ms: 30000\n\n minimax:\n spec: minimax # Provider spec name (required)\n credentials:\n api_key: ${MINIMAX_API_KEY}\n endpoint:\n base_url: https://api.minimaxi.com/v1\n timeout_ms: 30000\n\nsession:\n backend: sqlite # \"sqlite\" or \"memory\"\n sqlite:\n path: ./data/sessions.db\n\nlogging:\n level: info # trace | debug | info | warn | error\n console:\n enabled: true\n level: info\n file:\n enabled: false\n level: debug\n dir: ./logs\n filename: godex.log\n max_size: 10485760 # 10MB\n max_files: 5\n\nweb_search: # Built-in web search (default: enabled, no provider)\n enabled: true # Master switch\n mode: auto # auto | provider_native | godex_managed | disabled\n provider: none # none | mock | zhipu (search backend for godex_managed)\n on_unavailable: client_tool_call # client_tool_call | fail | ignore\n max_iterations: 2 # Max managed search rounds per request\n timeout_ms: 10000 # Per-search timeout\n\ntrace:\n enabled: true\n path: ./data/trace.db\n max_queue_size: 10000\n flush_interval_ms: 1000\n batch_size: 100\n capture_payload: false\n payload_max_bytes: 65536\n```\n\n## Type Definitions\n\n```mermaid\nclassDiagram\n\n class GodeXConfig {\n +server: ServerConfig\n +default_provider: string\n +models: ModelsConfig\n +providers: Record~string, ProviderConfig~\n +session: SessionConfig\n +logging: LoggingConfig\n +web_search: WebSearchConfig\n +trace: TraceConfig\n }\n\n class ServerConfig {\n +port: number\n +host: string\n +idle_timeout: number\n }\n\n class ProviderConfig {\n +spec: string\n +credentials: CredentialsConfig\n +endpoint: EndpointConfig\n +timeout_ms: number\n }\n\n class CredentialsConfig {\n +api_key: string\n }\n\n class EndpointConfig {\n +base_url: string\n }\n\n class ModelsConfig {\n +aliases: Record~string, string~\n }\n\n class SessionConfig {\n +backend: string\n +sqlite: SQLiteConfig\n }\n\n class LoggingConfig {\n +level: LogLevel\n +console: ConsoleLoggingConfig\n +file: FileLoggingConfig\n }\n\n class TraceConfig {\n +enabled: boolean\n +path: string\n +max_queue_size: number\n +flush_interval_ms: number\n +batch_size: number\n +capture_payload: boolean\n +payload_max_bytes: number\n }\n\n class WebSearchConfig {\n +enabled: boolean\n +mode: WebSearchMode\n +provider: WebSearchProvider\n +on_unavailable: WebSearchOnUnavailable\n +max_iterations: number\n +timeout_ms: number\n }\n\n GodeXConfig --> ServerConfig\n GodeXConfig --> ModelsConfig\n GodeXConfig --> ProviderConfig\n GodeXConfig --> SessionConfig\n GodeXConfig --> LoggingConfig\n GodeXConfig --> WebSearchConfig\n GodeXConfig --> TraceConfig\n ProviderConfig --> CredentialsConfig\n ProviderConfig --> EndpointConfig\n```\n\n## Provider Config\n\nEach provider entry must include a `spec` field that matches a registered provider definition name. Legacy provider config without `spec` is rejected at startup.\n\n```yaml\nproviders:\n myprovider:\n spec: myprovider # Required: matches registered definition\n credentials:\n api_key: ${MY_API_KEY}\n endpoint:\n base_url: https://api.example.com/v1\n timeout_ms: 30000\n```\n\n## Web Search\n\nGodeX can run web search in two ways: let the provider handle it natively, or run the search itself (\"GodeX-managed\" / \"hosted\") and feed results back into a continuation request. The `web_search` block ([src/config/sections/web-search.ts:10](https://github.com/Ahoo-Wang/GodeX/blob/main/src/config/sections/web-search.ts#L10)) controls this.\n\n::: warning Important: native providers always use native search\nFor providers whose tool set already includes `web_search` as a native tool (Zhipu, Xiaomi), the planner returns the tool as natively supported **before** consulting `mode`. This means `mode: godex_managed` and `mode: disabled` have **no effect** on those providers — they always get native `web_search`. The `mode` settings below govern how `web_search` is handled for providers that do **not** support it natively (DeepSeek, MiniMax), or when you want GodeX to host the search loop. See [tool-plan.ts:129](https://github.com/Ahoo-Wang/GodeX/blob/main/src/bridge/tools/tool-plan.ts#L129) for the precedence (native → degraded → web-search planning).\n:::\n\n| Field | Default | Description |\n|-------|---------|-------------|\n| `enabled` | `true` | Master switch. When `false`, the effective `mode` becomes `disabled` and `available` is `false`. |\n| `mode` | `auto` | Execution strategy — see the table below (applies to non-native providers). |\n| `provider` | `none` | The search backend GodeX uses in `godex_managed` mode. |\n| `on_unavailable` | `client_tool_call` | What to do when managed search is selected but no backend is available. |\n| `max_iterations` | `2` | Maximum number of managed search rounds per request. |\n| `timeout_ms` | `10000` | Per-search timeout in milliseconds. |\n\n### `mode` — execution strategy\n\nThese modes apply to providers that do **not** support `web_search` natively. The planner ([tool-plan.ts:164](https://github.com/Ahoo-Wang/GodeX/blob/main/src/bridge/tools/tool-plan.ts#L164)) reaches web-search planning only after the native and degraded checks, so for native providers the tool is always handled by the provider regardless of `mode`.\n\n| Mode | Behavior (non-native providers) |\n|------|----------|\n| `auto` | If a search `provider` backend is `available`, GodeX hosts the search loop (managed); otherwise the `on_unavailable` policy applies. |\n| `provider_native` | Declares the tool with provider-native execution. For providers without native `web_search`, this falls through to web-search planning like `auto`. |\n| `godex_managed` | GodeX intercepts the `web_search` function call, runs the search itself via the configured `provider` backend, emits the `web_search_call` lifecycle (`in_progress` → `searching` → `completed` / failed), and submits a continuation request with the results. Up to `max_iterations` rounds. If no backend is `available`, the `on_unavailable` policy applies. |\n| `disabled` | The managed loop is not offered. For non-native providers the `on_unavailable` policy still applies (default `client_tool_call`), so a search tool may still be exposed as a client-visible function call — set `on_unavailable: ignore` (or `fail`) to suppress it entirely. |\n\n### `provider` — managed search backend\n\n| Provider | Description |\n|----------|-------------|\n| `none` | No backend. Managed search is unavailable (`available` is `false`); the `on_unavailable` policy then applies. |\n| `mock` | Returns canned results; used for testing. |\n| `zhipu` | [Zhipu Web Search API](https://open.bigmodel.cn/dev/api/search-tool/websearch). |\n\n::: warning The Zhipu search backend reads the provider config, not just env\nSelecting `provider: zhipu` makes the backend `available` only when a `providers.zhipu` block with a `credentials.api_key` exists in `godex.yaml` — `createSearchService` reads `config.providers.zhipu.credentials.api_key` ([search/registry.ts:16-17](https://github.com/Ahoo-Wang/GodeX/blob/main/src/search/registry.ts#L16-L17)) and falls back to a no-op provider when it is absent. So on a DeepSeek/MiniMax-only config, exporting `ZHIPU_API_KEY` alone is **not** enough; add a full `providers.zhipu` entry (env interpolation works, e.g. `api_key: ${ZHIPU_API_KEY}`), or GodeX will take the `on_unavailable` path instead of hosting search.\n:::\n\n### `on_unavailable` — fallback policy\n\nApplies when the managed search loop is selected (`mode` is `auto`/`godex_managed`) but no backend is `available`, as well as when `mode` is `disabled` for a non-native provider.\n\n| Policy | Behavior |\n|--------|----------|\n| `client_tool_call` | Forward the `web_search` call to the client as a normal function call (the client handles it). |\n| `fail` | Fail the request with a `BridgeError`. |\n| `ignore` | Silently drop the search call. |\n\n::: tip\nWith the shipped defaults (`mode: auto`, `provider: none`), providers that support native web search (Zhipu, Xiaomi) use it directly, while other providers forward `web_search` calls to the client. To enable GodeX-managed search for **non-native** providers, set `provider: zhipu` **and** add a `providers.zhipu` block (with `credentials.api_key`) to `godex.yaml` — see the warning above.\n:::\n\nThe managed search loop is implemented by `HostedWebSearchStreamRunner` / `HostedWebSearchSyncRunner` in `src/responses/web-search/`. See [Streaming Pipeline](../02-architecture/streaming-pipeline.md) for how it integrates into the event production stage.\n\n## Environment Interpolation\n\nValues like `${DEEPSEEK_API_KEY}` are resolved at load time from environment variables. Missing variables produce a startup error.\n\n## Environment Variable Overrides\n\nBESIDES YAML interpolation, these environment variables directly override config fields at load time (CLI flags take precedence over both):\n\n| Variable | Config Field | Notes |\n|----------|-------------|-------|\n| `GODEX_PORT` | `server.port` | Overrides the listen port |\n| `GODEX_HOST` | `server.host` | Overrides the bind address |\n| `GODEX_LOG_LEVEL` | `logging.level` | Overrides the log level |\n| `GODEX_DEFAULT_PROVIDER` | `default_provider` | Falls back to `deepseek` if both are unset |\n\n[CLI Commands](/07-configuration/cli-commands)\n\n"}}, "wiki/03-provider-development/deepseek-reference.md": {"e4b02fa899c22db59bd7a257edccad7d2aae168d": {"t": 1786068485.467974, "n": 5061, "h": "63c1a089f9b59210", "c": "---\ntitle: \"DeepSeek Reference Implementation\"\ndescription: \"Walkthrough of the DeepSeek provider — demonstrating native reasoning effort, cached token usage, and content array handling.\"\nkeywords: \"GodeX, DeepSeek, provider reference, implementation\"\n---\n\n# DeepSeek Reference Implementation\n\nThe DeepSeek provider is one of the bundled reference implementations in GodeX. It demonstrates native reasoning effort support, cached token usage reporting, and defensive content array text extraction.\n\n## Module Structure\n\n```\nsrc/providers/deepseek/\n├── spec.ts # DEEPSEEK_PROVIDER_SPEC declaration with capabilities and accessors\n├── client.ts # createDeepSeekProviderEdge() factory\n├── hooks.ts # Provider-specific hooks (patchRequest, usage mapping, deltas)\n├── protocol/ # DeepSeek-specific type definitions\n│ ├── completions.ts # Request/response DTOs including thinking types\n│ └── index.ts # Barrel exports\n└── index.ts # Public exports\n```\n\n## Spec Declaration\n\nThe `DEEPSEEK_PROVIDER_SPEC` in `spec.ts` declares all capabilities, accessors, and hooks:\n\n```ts\nexport const DEEPSEEK_PROVIDER_SPEC: ProviderSpec<\n BridgeChatCompletionCreateRequest,\n ChatCompletion,\n ChatCompletionChunk,\n ChatCompletionRequest\n> = {\n name: DEEPSEEK_PROVIDER_NAME,\n protocol: CHAT_COMPLETIONS_PROTOCOL,\n capabilities: DEEPSEEK_SPEC_CAPABILITIES,\n endpoint: { defaultBaseURL: DEFAULT_DEEPSEEK_BASE_URL },\n auth: BEARER_AUTH,\n toolName: DEFAULT_TOOL_NAME_CODEC,\n response: {\n firstChoice: deepSeekFirstChoice,\n finishReason: deepSeekFinishReason,\n outputText: deepSeekOutputText,\n usage: deepSeekResponseUsage,\n },\n stream: { deltas: deepSeekStreamDeltas },\n hooks: { patchRequest: deepSeekPatchRequest },\n};\n```\n\n## Capabilities\n\n```ts\nconst DEEPSEEK_SPEC_CAPABILITIES: ProviderCapabilities = {\n parameters: {\n supported: new Set([\n \"stream\", \"temperature\", \"top_p\", \"max_output_tokens\",\n \"safety_identifier\", \"user\", \"reasoning\", \"text.format\",\n ]),\n },\n tools: {\n supported: new Set([\n \"function\", \"local_shell\", \"shell\", \"apply_patch\",\n \"custom\", \"namespace\",\n ]),\n degraded: new Map([\n [\"local_shell\", \"function\"],\n [\"shell\", \"function\"],\n [\"apply_patch\", \"function\"],\n [\"custom\", \"function\"],\n [\"namespace\", \"function\"],\n ]),\n maxTools: 128,\n },\n toolChoice: { supported: new Set([\"auto\", \"none\", \"required\", \"function\"]) },\n responseFormats: { supported: new Set([\"text\", \"json_object\"]) },\n reasoning: { effort: \"native\" },\n streaming: { usage: true },\n};\n```\n\nNotable capability details:\n\n- **Native reasoning effort**: DeepSeek supports `reasoning.effort: \"native\"`, meaning the bridge maps Responses API effort values to DeepSeek's native `reasoning_effort` parameter.\n- **Tool degradation**: Codex built-in tools (`local_shell`, `shell`, `apply_patch`, `custom`, `namespace`) are degraded to `function` type.\n- **Max 128 tools**: DeepSeek accepts up to 128 tools per request.\n- **Cached tokens**: DeepSeek reports `prompt_cache_hit_tokens` which are mapped to `input_tokens_details.cached_tokens`.\n\n## Hooks\n\n### `deepSeekPatchRequest`\n\nTransforms the bridge's Chat Completions request for DeepSeek-specific behavior:\n\n1. Maps `reasoning_effort` values: `high` → `high`, `xhigh` → `max`.\n2. Sets `thinking: { type: \"enabled\" }` when reasoning is active or when historical messages contain `reasoning_content`.\n3. Sets `thinking: { type: \"disabled\" }` when no reasoning is needed.\n\n### `deepSeekStreamDeltas`\n\nExtracts typed deltas from DeepSeek's SSE chunks:\n\n- `content` → text delta\n- `reasoning_content` → reasoning delta\n- `tool_calls` → tool call deltas (via shared `mapCommonChatStreamDelta`)\n- `usage` → usage delta (with cached token mapping)\n- `finish_reason` → finish reason delta\n\n### `mapDeepSeekSpecUsage`\n\nMaps DeepSeek's usage format to the standard `ResponseUsage` type, including:\n\n- `prompt_cache_hit_tokens` → `input_tokens_details.cached_tokens`\n- `completion_tokens_details.reasoning_tokens` → `output_tokens_details.reasoning_tokens`\n\n## Client Construction\n\nThe `createDeepSeekProviderEdge()` function in `client.ts` builds the `ProviderEdge`:\n\n1. Creates a `ChatProviderClient` with the provider's base URL, API key, and timeout.\n2. Uses `createProviderEdge()` from the bridge kernel to wrap the spec, config, and HTTP methods.\n\n## Registration\n\nThe provider is registered in `src/providers/builtin.ts`:\n\n```ts\nexport const DEEPSEEK_PROVIDER_DEFINITION = createProviderDefinition(\n DEEPSEEK_PROVIDER_NAME,\n createDeepSeekProviderEdge,\n);\n```\n\nThe default DeepSeek base URL is `https://api.deepseek.com`. The default model is `deepseek-v4-pro`.\n\n## Content Handling\n\nDeepSeek may return `message.content` as either a string or an array of content parts. The `deepSeekOutputText` accessor handles both cases, extracting text from `type: \"text\"` parts in array content.\n\n[MiniMax Reference](/03-provider-development/minimax-reference)\n[Zhipu Reference](/03-provider-development/zhipu-reference)\n"}}}} |