中文EN

dsh-llm-codex-app-server

model装不上npmMIT

使用本地 Codex 登录的 Codex App Server 模型提供方,支持会话复用、Harness 工具桥接、原生动作轨迹和生成图片持久化。

下载量 / Downloads
777
测试时间 / Tested
2026-11-07
DSH 版本 / Version
0.2.2-rc.1

安装

dsh plugin --profile web add dsh-llm-codex-app-server

沙箱测试结果

阶段结果
1 安装✗
2 列装—
3 挂载—
4 启动—
第一条错误
dsh: initialized profile web at /home/node/.dsh/profiles/web

四阶段在隔离沙箱里跑:安装(有网)→ 列装 → 挂载 → 启动(后三步断网)。

README

dsh-llm-codex-app-server

[English](README.md) | 中文

dsh-llm-codex-app-server 注册一个由本地登录的 Codex App Server 驱动的 DeepSeek Harness 主模型提供方。它是独立于 Harness 主仓库的组合包,因此安装时不会修改 deepseek-harness 仓库。

它与 Harness 内置的 @deepseek-ai/dsh-subagent-codex 不同。内置包将 Codex 暴露为接受委派的子 agent;本包注册到 ctx.llm,因此 Harness Agent loop 可以选择 codex-local 作为模型提供方。

截图

[CDP 截图日志与验证详情](docs/evidence/codex-settings-card.md)

工作方式

在有界缓存租约有效期间,普通 Harness 会话会复用一个固定版本为 @openai/codex@0.147.0、运行于私有空目录中的 App Server 进程和一个临时线程。该进程使用 CODEX_HOME 下的原生 Codex 账户状态;插件不会读取、复制、记录或保存 OAuth token 与 API key。没有 Session ID 的请求和辅助请求仍使用一次性进程。

适配器将 Harness 系统文本作为 App Server 的基础指令,通过在空 turn 开始前注入全部已记录的 Harness 消息来重建冷启动线程,在 App Server 的 deepseek_harness 命名空间下声明 Harness 工具,并通过原生 turn input 发送后续普通用户消息。当一个 DSH step 追加多条 inbox 消息时,第一条启动 turn,其余消息通过有序的 turn/steer 请求进入同一 turn。外层 Harness 的 skill 工具在该命名空间内映射为 harness_skill;其参数 schema 只接受当前 Harness Session 目录中的名称,而 Codex 原生 skill 仍由 Codex 自己的 loader 管理。只有完整请求是适配器可重现的仅追加续接时才会复用热线程,否则会丢弃并重建线程。App Server 仍会加入 Codex 自有的指令和工具。这是有意设计的分层提供方,不是原始模型传输层,也不声称 Harness 取代了 Codex prompt。

推理、Assistant 文本、用量、Codex 自有上下文、诊断信息和动作生命周期会在到达时转换为 Harness 流事件。Codex 缓存输入通过 Harness 的 cacheReadTokens 上报,因此标准 token 计量器和会话统计无需提供方专用 UI 即可显示缓存命中率。每个 codex-action 块都包含 category(lifecycle、context、action 或 diagnostic)、解析后的 phase、准确的 protocolEvent 以及对应的 JSON 协议快照。即使 App Server 没有发出对应的 ThreadItem,原始 Code Mode 调用及其结果也会保留。Codex 原生动作失败或被拒绝仍属于动作结果;除非 App Server 报告整个 turn 失败,否则不会导致 Harness 模型请求失败。

Harness 用户图片和含图片的工具结果在消息、重放与缓存身份中始终保留为持久 ImageAttachmentRef。只有即将跨越 App Server 边界时,适配器才会验证保留的附件,并临时转换为对应协议形态:冷启动重建使用 Responses input_image,热用户 turn 使用 v2 image,待处理动态工具 callback 使用 inputImage。若预计的 base64 图片负载超过 maxRequestImageBytes,最旧的模型可见图片会被确定性省略文本替代,而且不会读取其字节。Codex 原生图片输出沿反方向处理:先解码并通过 Harness 附件服务持久提交,再发布标准 Harness image 块,同时把轨迹和重放中的字节替换为小型持久标记。任何 data URL 都不会持久化。聊天附件不等于隐式修改工作区:要生成 public/example.png 或其他项目文件,Codex 仍须为明确的目标路径请求已声明的 Harness 修改工具。

本包还包含浏览器插件。它以较低的 slot 优先级覆盖默认 Assistant 单元格,保留标准文本、推理、图片和通用回退展示,并使用 Harness 的紧凑 disclosure row 与状态点渲染 codex-action 块。图片组会委托给 rc.8 的 conversation.message.images slot;标准 Web profile 已组合其 ui-attachment owner,自定义 host 则须像默认 Assistant 渲染器一样组合该展示插件。折叠行显示解析后的动作、类别和阶段;展开后显示摘要、准确的协议事件、动作 ID,以及 Harness JSON tree 中的持久 JSON 记录。thread/start 会明确报告分层 prompt 所有权和发现的指令来源数量;它不会被标记为 Harness 工具或请求失败。浏览器插件还通过 DSH 原生 settings.plugin.item 扩展点贡献 Codex App Server 设置卡片,不修改 Models 或 Settings 核心包。

thread/start 块用于披露提供方生命周期,并不表示模型执行了原生动作。由 Codex 添加、且不属于注入的 Harness 历史记录的 developer、system 和 user 消息会显示为 context/injected 报告。它们会被记录以供审计,但不会在下一个无状态请求中作为 Harness 编写的历史内容再次提交。

当 App Server 请求 deepseek_harness 命名空间内的已声明工具时,适配器会发出真正的 Harness tool-call,结束当前模型 step,并保持 App Server callback 待处理。命名空间和映射后的名称必须同时匹配,调用才能进入 Harness;harness_skill 还必须准确匹配当前 Harness 目录中的名称,并且只有验证后才会映射回 skill。即使未带命名空间的 Codex 原生调用名称与 Harness 工具相似,它仍属于提供方轨迹;只有经过验证、带 Harness 命名空间的调用才不会显示为原生动作。Harness 负责这些调用的执行、审批、展示和持久记录。后续仅追加请求会先用已记录的工具结果回复待处理 callback,再把后续 inbox 消息按顺序 steer 进 active turn,并继续同一个 Codex turn;replacement 或其他非前缀历史变化会触发冷启动重建。

辅助工作跟随发起 Agent 的 provider,不会暗中切换账户。compaction-basic 未显式指定摘要路由时,会通过一次性进程使用当前选中的 Codex 模型,并且只有自然完成的文本才会成为持久 Harness checkpoint。Codex Agent 的 web_search 会在配置的 Web provider 之前被条件接管:每个 query 都在独立的一次性 App Server 进程中执行原生实时搜索,URL citation 再经原有 Harness 工具输出约定投影;非 Codex Agent 则原样委托给既有 provider chain。搜索不能复用主进程,因为该线程正在等待 Harness 工具结果。

安装

先完成一次原生 CLI 登录:

codex login

npm release 可用后,可安装不可变的已发布版本:

dsh plugin --profile web add dsh-llm-codex-app-server@latest
dsh --profile web --dump-config
dsh --profile web

若要改为构建当前工作副本并打包:

pnpm install --frozen-lockfile
pnpm run check

将生成的 tarball 安装到 Harness profile:

dsh plugin --profile web add ./dist/dsh-llm-codex-app-server-<version>.tgz
dsh --profile web --dump-config
dsh --profile web

该组合包注册 codex-local 提供方,以及固定版本 App Server 默认模型选择器中的所有模型:gpt-5.6-sol、gpt-5.6-terra、gpt-5.6-luna、gpt-5.5、gpt-5.4、gpt-5.4-mini 和 gpt-5.3-codex-spark。请在 Models UI 中选择模型。安装不会自动替换 profile 的默认模型。标记为隐藏的 App Server 路由不会加入选择器。

Harness profile 设置了 autoInstallPeers: false,因此安装时可能报告缺少 peer dependency。启动时,profile 的模块回退机制会从当前 Harness 安装中提供这些 peer,使插件共享相同的 Cordis 和服务实例。

若要从源码安装:

dsh plugin --profile web add github:wss534857356/dsh-plugin-codex

可追加 #<commit> 固定版本。通过 Git 安装时,包的 prepare 脚本会构建 TypeScript,因此 pnpm 必须允许该包执行构建。已打包的 tarball 或 npm release 已经完成构建。

从 profile 中移除该组合包:

dsh plugin --profile web remove dsh-llm-codex-app-server

配置

在 Web UI 打开“设置 → 插件 → 插件配置”,展开 Codex App Server 卡片即可修改 image generation、Codex Web Search 接管、搜索默认模型和最大结果数。卡片使用 DSH 的 llm-codex-app-server settings 命名空间,保存后直接写入 DSH 用户设置层;下一次调用即生效,涉及进程能力的变化会通过请求 epoch 自动淘汰旧缓存线程。

后续 profile 补丁层可以替换 llm-codex-app-server 配置项。Harness 补丁配置项不会深度合并,因此替换时必须重新写出完整配置。

配置键 · 默认值 · 说明

provider · codex-local · Harness 提供方路由。

displayName · Codex (local login) · 选择器标签。

modelProvider · openai · Codex App Server 的模型提供方 ID。

models · 7 个可见的 App Server 目录项 · 建议模型元数据、输入模态和推理选项。内置快照为当时观测到的 6 个路由声明图片输入,Spark 仅文本;省略模态的自定义模型默认仅文本。未列出但符合安全格式的模型 ID 仍可按仅文本路由。

timeoutMs · 300000 · 单个 App Server turn 的实际运行时间上限。

disposeGraceMs · 3000 · 终止进程树时的宽限时间。

maxJsonRpcLineBytes · 8388608 · 从 App Server stdout 接受的单条换行分隔 JSON-RPC 消息最大字节数。成功解析的消息不会累计到 stdout 总量限制中。

maxRequestImageBytes · 20971520 · 单次模型请求允许临时恢复的预计 base64 图片负载上限;超限时优先把最旧的模型可见图片替换为确定性省略文本。

maxStderrBytes · 65536 · 保留诊断输出的最大字节数。

maxRetries · 0 · Harness 可见的临时进程或提供方错误重试次数。

maxCachedSessions · 8 · 按最近最少使用策略驱逐前,可保留的最大空闲或等待工具结果的 Session 租约数。活跃请求可能暂时超过该值。

sessionIdleTimeoutMs · 600000 · 已缓存 App Server Session 线程的空闲存活时间。

imageGenerationEnabled · true · 普通模型 turn 是否为固定版本 App Server 开启原生 image generation。压缩 tur

…(truncated)

以上内容来自 npm 上的 README,我们只做格式化,不改内容。

版本

npm 上共发布:1,最后更新 2026-08-24

链接

GitHub · Homepage · npm

同类插件