# dsh-codex-connect

> 通过 ChatGPT OAuth 在 DSH 中使用 OpenAI Codex 模型，可选启用独立搜索、读图、生图能力。

## Metadata

- Author: [@franksong2702](https://github.com/franksong2702)
- Repo: <https://github.com/franksong2702/dsh-codex-connect.git>
- GitHub: [franksong2702/dsh-codex-connect](https://github.com/franksong2702/dsh-codex-connect)
- Stars: 34
- Language: TypeScript
- License: [Apache-2.0](https://spdx.org/licenses/Apache-2.0.html)
- Homepage: <https://www.npmjs.com/package/dsh-codex-connect>
- Topics: `chatgpt`, `codex`, `deepseek-harness`, `dsh`, `dsh-plugin`, `gpt-image-2`, `oauth`
- Forks: 7
- Open Issues: 3
- Last push: 2026-08-21T03:39:35.000Z
- Added: 2026-08-14T00:00:00.000Z

## Install

```bash
dsh plugin --profile web add github:franksong2702/dsh-codex-connect
```

## Wiki

## 一句话定位
让用户在 DeepSeek Harness 中用 ChatGPT 订阅登录，把 OpenAI Codex 模型（含独立搜索、读图、生图）作为一种 LLM 选项使用，不替换默认模型与全局搜索路由。

## 核心能力
- 在 **Settings → Plugins → Plugin configuration → Codex Connect** 卡片中用 ChatGPT OAuth 账户登录，凭据单独存到 `$DSH_HOME/.openai-codex-auth.json`，与 Codex CLI/Desktop 不互通
- 在模型选择器中以 **OpenAI Codex** 分类使用 Codex 模型，保留 Harness 原生的流式输出、工具调用、推理回放、会话压缩与权限审批
- 启用可选的独立网络搜索，将 Codex 注册为搜索提供者，但不会自动接管 profile 的全局搜索路由
- 启用可选的 `view_image` 工具，让支持视觉的 Codex 模型读取本地文件与公网图片（DNS 解析与跳转目标全程校验并锁定为公网地址）
- 启用可选的 `codex_connect_image_generate` 工具，调用 GPT Image 生成的图片直接保存为 DSH 附件并在会话内显示
- 提供 `dsh-codex-connect` 独立 CLI，用于登录/登出、状态、doctor、历史迁移、按需放行远端浏览器 origin

## 技术实现
- **语言**: TypeScript (ESM，使用 tsdown 打包)
- **关键依赖**: `@deepseek-ai/cordis`（插件注册与 fiber 注入）、`@earendil-works/pi-ai@0.82.1`（OpenAI Codex provider 与 OAuth 流）、`@deepseek-ai/dsh-llm-pi-ai`（复用通用 Adapter）、`@deepseek-ai/dsh-settings`（settings-section 编辑）
- **架构模式**: 通过 `cordis.patch.yml` 注入 `llm-openai-codex` 行（3 个 capability 全部为 false）；Host 端 `apply()` 一次性注册 OAuth store、Transport、Adapter、可配置 Provider；capability 在 `installSettingsSection` 的 `onChange` 中通过 `ctx.effect` + `reconcileXxx()` 动态挂载/卸载 `search` / `view_image` / `image_generate` 三组功能 fiber；Browser 端通过 `slots` 在 `settings.plugin.item` 注入卡片，在 `conversation.input.right` 注入 Fast Mode 开关与配额指示器
- **入口文件**: `src/index.ts`（Host 插件主体，`name = "llm-openai-codex"`，`inject = ["llm"]`）、`src/client/index.tsx`（Browser 端，`name = "dsh-codex-connect-client"`）、`src/bin.ts`（独立 CLI：`doctor | login | logout | status | migrate-history | trust-origin` 等）

## 适用场景
已经在为 ChatGPT Plus/Pro 付费、希望把 Codex 当作 DSH 中一种可选 LLM 的用户；既想用 Codex 模型，又不愿放弃 Harness 的会话持久化、压缩、子代理、工具审批、附件、MCP、技能等机制的人。当前的 Codex Connect 也承担从旧的 `dsh-codex` 平滑迁移、并保留搜索/读图/生图三组可选能力的角色。

## 前置依赖与兼容性
| 依赖 | 最低版本 | 说明 |
|---|---|---|
| DeepSeek Harness Plugin API | `0.1.0-rc.7` | 一组 `@deepseek-ai/dsh-*` 包必须同时升级，详见 `compatibility.json` |
| `@earendil-works/pi-ai` | `0.82.1` | OpenAI Codex provider 上游，需与 DSH 包同步升级 |
| Node.js | `^22.19.0 || >=24.0.0` | `package.json#engines` 声明 |
| 平台 | macOS / Windows / Linux | macOS、Linux 会对 OAuth 文件强制 owner-only 权限（chmod 600），Windows 自动跳过此检查 |
| 原生模块 | — | 无（仅依赖 `node:http` / `node:https` / `node:net.BlockList` 等内置模块） |

## 安装方式
```bash
dsh plugin --profile web add github:franksong2702/dsh-codex-connect
```

## 配置项
| 配置 | 类型 | 说明 | 默认值 |
|---|---|---|---|
| `enableSearch` | boolean | 把 Codex 注册为独立的网络搜索提供者；不会自动选中作为全局搜索 | `false` |
| `enableImageTool` | boolean | 启用 `view_image` 工具：让视觉模型读取本地文件与公网图片 | `false` |
| `enableImageGeneration` | boolean | 启用 `codex_connect_image_generate` 工具：通过 GPT Image 生成图片，结果存为 DSH 附件 | `false` |
| `searchModel` | string | 用于独立搜索的 Codex 模型 ID | `gpt-5.6-sol` |
| `searchMode` | `cached` / `indexed` / `live` | 搜索模式：使用 OpenAI 缓存 / 索引 / 实时抓取 | `cached` |
| `searchContextSize` | `low` / `medium` / `high` | 搜索接口返回的上下文体量 | `medium` |
| `searchMaxOutputTokens` | 正整数 | 搜索接口最大输出 token 数 | `10000` |

## 常见问题

**Q: 安装 Codex Connect 之后，原来配置的默认模型和搜索会被改掉吗？**

A: 不会。`cordis.patch.yml` 只插入一行 `llm-openai-codex`，且 3 个 capability 默认都是 `false`，profile 的 `agent-default-model` 与 `web.searchProvider` 必须由你显式写入才会生效。

**Q: OAuth 凭据放哪里？跟 Codex CLI/Desktop 是同一份吗？**

A: 凭据存放在 `$DSH_HOME/.openai-codex-auth.json`（默认 `~/.dsh`）。这是独立文件，不会读取或修改 `~/.codex/auth.json`；想换台机器迁移账号，就在目标机器重新走一遍 ChatGPT 授权。

**Q: 必须有 OpenAI Platform 的 API Key 才能用吗？**

A: 不需要。Codex Connect 只用 ChatGPT 订阅的 OAuth bearer token，私有 OpenAI Platform 凭据既不读取也不代理——价格、限速、配额都以 ChatGPT 订阅为准。

**Q: 哪些信息是不该贴到 issue、日志或配置文件里的？**

A: 任何 OAuth 授权 URL、device code、refresh/access token、account id 都不要贴；遇到问题时贴 `dsh-codex-connect doctor --json` 的脱敏输出就够了。

**Q: 升级 DSH 到 `0.1.0-rc.7` 之后，从前用 Alpha 4.10 跑出来的 Codex 搜索历史读不出来了，怎么办？**

A: 先 `dsh plugin --profile web exec dsh-codex-connect migrate-history --json` 扫一遍；看到命中事件后停掉所有会写该 session 根目录的 DSH 进程，再带 `--apply --confirm-stopped --json` 真正修复；修复前会先在同目录生成 `.pre-codex-search-history-migration` 备份。

**Q: doctor / status 命令会不会输出密钥？**

A: 不会。`doctor` 只读取 `lstat` 元数据并输出 schema v1 的脱敏 JSON（包含密码文件状态、能力开关、兼容性状态、provider 冲突、提示语），不打印绝对路径或 OAuth 字段；`status --json` 只回报 `signed-in` / `signed-out`。

**Q: 我同时还装着老的 `dsh-codex` 包，会发生什么？**

A: 启动会因 provider id 冲突被拒（Harness 不允许两个 adapter 注册 `openai-codex`），并提示先卸载冲突方或删除 `profile` 中多余的 `llm-openai-codex` 行，再装 Codex Connect。

## 上手难度
入门 — 安装后只需进入设置卡片点一次 Sign in with ChatGPT，再到模型选择器挑一个 `openai-codex` 模型即可使用；capability 默认关闭，几乎不会改变现有配置。

## 已知问题与限制
- Codex 端点不强制 Responses 接口的 `max_output_tokens`，因此 Harness 压缩总结的服务端 token 上限无法在该路由施加（README.md:186）
- POSIX 平台对 OAuth 文件做严格的 owner-only 校验，模式位放宽到组/其他可读会被拒绝启动，需 `chmod 600` 后再试（src/store.ts:32-50）
- 历史修复命令在 Windows 上仅支持 dry-run，`--apply` 模式会被代码层主动拒绝（src/history-migration.ts:295-297）
- `view_image` 远程 URL 强制走公网校验：每个跳转目标都要重新解析并把 socket 钉到验证后的地址，否则被拒；本地回环、私网、链路本地、云元数据端点全部不可达（src/public-http.ts:59-103 / src/public-http.ts:167-173）
- 卸载本包不会自动删除 OAuth 凭据，必须显式 `dsh-codex-connect logout`，否则 `$DSH_HOME/.openai-codex-auth.json` 会保留（README.md:179）
- 独立搜索工具启用后不会在 Session 内写入 plugin 私有 required 事件，因此不能跨独立的 `@deepseek-ai/dsh-session` 实例保留遥测；但 Harness 自身的 web Tool 记录照常落入历史（docs/design.md:19）

---

This document is auto-generated by [deepseek-plugin.org](https://deepseek-plugin.org). HTML page: [dsh-codex-connect](https://deepseek-plugin.org/plugins/franksong2702/dsh-codex-connect)
Wiki generated by AI (model: `MiniMax-M3`)
