fix: 接入 dsflash-go model catalog
This commit is contained in:
@@ -4,7 +4,7 @@ Backend adapter 是 runner 与具体 Code Agent 工具之间的适配层。`v0.1
|
||||
|
||||
## 在系统中的职责划分
|
||||
|
||||
- 根据 `backendProfile` 选择具体 backend profile;`v0.1` 必须支持 `codex`、`deepseek` 与 `minimax-m3`,三者共享同一个 `codex-app-server-stdio` backend kind。
|
||||
- 根据 `backendProfile` 选择具体 backend profile;`v0.1` 必须支持 `codex`、`deepseek`、`minimax-m3` 与 `dsflash-go`,四者共享同一个 `codex-app-server-stdio` backend kind。
|
||||
- 接收 manager 持久化后的 run、command 和 executionPolicy;不得自行扩大 workspace、network、approval 或 secret scope。
|
||||
- 调用具体 backend,并把 backend 输出归一化为 AgentRun events。
|
||||
- 负责 provider/auth/backend/protocol 错误到 failureKind 的映射。
|
||||
@@ -28,7 +28,7 @@ Adapter 输入必须来自 manager 保存的 run/command 和 Kubernetes Secret p
|
||||
|
||||
Backend adapter 消费 RuntimeAssembly 中的 `BackendImageRef` 和 `ProfileRef` 结果,但不定义四要素字段;四要素权威见 [spec-v01-runtime-assembly.md](spec-v01-runtime-assembly.md)。
|
||||
|
||||
`v0.1` 的第一真实 adapter 是 Codex stdio adapter。它必须走 Codex CLI app-server JSON-RPC over stdio;adapter 合同把 Codex 的 thread、turn、notification、tool lifecycle 和 stderr/exit 信息归一化为 AgentRun 标准 events。`codex`、`deepseek` 与 `minimax-m3` 只是该 adapter 的 profile/config/SecretRef 选择,不允许复制多套协议实现。
|
||||
`v0.1` 的第一真实 adapter 是 Codex stdio adapter。它必须走 Codex CLI app-server JSON-RPC over stdio;adapter 合同把 Codex 的 thread、turn、notification、tool lifecycle 和 stderr/exit 信息归一化为 AgentRun 标准 events。`codex`、`deepseek`、`minimax-m3` 与 `dsflash-go` 只是该 adapter 的 profile/config/SecretRef 选择,不允许复制多套协议实现。
|
||||
|
||||
## HWLAB v0.2 Code Agent 能力吸收
|
||||
|
||||
@@ -40,7 +40,7 @@ Backend adapter 的第一阶段实现应吸收 HWLAB v0.2 已验证的 Codex std
|
||||
| completed 判定 | `docs/reference/code-agent-chat-readiness.md` | 只有 Codex turn terminal completed 且 assistant reply 可聚合时才输出 completed;assistant delta、item completed、stdout 或 transport close 不能单独完成。 |
|
||||
| assistant stream 和 trace | `internal/cloud/code-agent-trace-store.ts`、`internal/cloud/codex-stdio-session-turn-state.ts` | assistant delta 只能作为 stream/progress 证据;长输出过程中可以输出有界 `assistant_message.source=agent-message-delta-progress` 快照,但 `replyAuthority=false` 且不得参与最终 reply 聚合;每个非空 completed `agentMessage` item 必须输出一个 `assistant_message` event,保留 `itemId` 和顺序;`item/agentMessage:started`、`item/agentMessage:completed` 这类 lifecycle 不得额外持久化为 `backend_status`,避免同一消息在 Web/CLI trace 中重复渲染;最终 result reply 必须优先来自最后一个 completed `agentMessage` item,不能把 commentary/progress delta 与 final response 直接串接。event 必须保留 `threadId`、`turnId`、session 摘要和 redacted backend metadata。 |
|
||||
| command/tool output bounded | `docs/reference/code-agent-chat-readiness.md`、`web/hwlab-cloud-web/app-trace.ts` | `tool_call` 和 `command_output` 必须记录状态、摘要、字节数、截断标记;完整大输出只能通过后续 log/artifact 引用。 |
|
||||
| provider/profile 隔离 | `internal/cloud/code-agent-contract.ts` | `codex`、`deepseek` 与 `minimax-m3` 共享同一 backend kind,但必须使用 profile-scoped SecretRef、model/base-url/config 和 writable runtime home。 |
|
||||
| provider/profile 隔离 | `internal/cloud/code-agent-contract.ts` | `codex`、`deepseek`、`minimax-m3` 与 `dsflash-go` 共享同一 backend kind,但必须使用 profile-scoped SecretRef、model/base-url/config/model catalog 和 writable runtime home。 |
|
||||
| Secret redaction | `internal/cloud/code-agent-trace-store.ts` | `OPENAI_API_KEY`、auth/config、token、password、kubeconfig、URL credential 不得进入 event、result、log 或 health。 |
|
||||
|
||||
## Backend Profile Registry
|
||||
@@ -52,6 +52,7 @@ Backend adapter 的第一阶段实现应吸收 HWLAB v0.2 已验证的 Codex std
|
||||
| `codex` | `codex-app-server-stdio` | `codex-app-server-jsonrpc-stdio` | `stdio` | `codex app-server --listen stdio://` | 已有主闭环,必须保持默认兼容。 |
|
||||
| `deepseek` | `codex-app-server-stdio` | `codex-app-server-jsonrpc-stdio` | `stdio` | `codex app-server --listen stdio://` | 已实现 profile;必须用独立 SecretRef 和 profile-scoped `CODEX_HOME` 完成真实联调。 |
|
||||
| `minimax-m3` | `codex-app-server-stdio` | `codex-app-server-jsonrpc-stdio` | `stdio` | `codex app-server --listen stdio://` | 已实现 profile;必须用独立 SecretRef 和 profile-scoped `CODEX_HOME` 完成真实联调。 |
|
||||
| `dsflash-go` | `codex-app-server-stdio` | `codex-app-server-jsonrpc-stdio` | `stdio` | `codex app-server --listen stdio://` | 已实现 profile;必须用独立 SecretRef、profile-scoped `CODEX_HOME` 和 `model-catalog.json` 完成 1M context 联调。 |
|
||||
|
||||
Registry 只表达能力和选择边界,不读取 Secret 值。Manager 负责校验 `backendProfile` 是否在 allowlist 内,并校验 `executionPolicy.secretScope.providerCredentials` 是否存在匹配 profile 的 SecretRef;runner 只为当前 run 选择的 profile 准备 Secret projection 和 runtime home。
|
||||
|
||||
@@ -83,6 +84,7 @@ Adapter 必须把 backend 错误映射为稳定 failureKind:
|
||||
| `provider-auth-failed` | provider credential 或 auth file 无效、上游返回 401/403。 |
|
||||
| `provider-rate-limited` | 上游限流或 quota 错误。 |
|
||||
| `provider-unavailable` | 上游 provider availability/transient 失败,包括 HTTP 5xx/503、`Service Unavailable`、`responseStreamDisconnected` 携带 5xx 状态码、明确 `provider unavailable` 或 `temporary unavailable` 文案。 |
|
||||
| `provider-compact-unsupported` | provider 或 bridge 对 `/v1/responses/compact` / `/compact` 返回 404、not found、unsupported、no route 或 not implemented;通常表示 `dsflash-go` / Moon Bridge compact path 配置错误。 |
|
||||
| `backend-protocol-error` | backend 输出无法解析、协议字段缺失。 |
|
||||
| `backend-json-parse-error` | backend stdout 不是合法 JSON-RPC 行。 |
|
||||
| `backend-response-invalid` | backend JSON-RPC response/terminal notification 缺少必需字段。 |
|
||||
@@ -97,7 +99,7 @@ Adapter 必须把 backend 错误映射为稳定 failureKind:
|
||||
|
||||
- Adapter 只能看到运行时投影出来的最小 Secret 文件或 env;不得枚举整个 namespace Secret。
|
||||
- Adapter 不得把 Secret 值写入 event、trace、日志、CLI 输出、health 或 Postgres。
|
||||
- Codex backend 的 `auth.json` 和 `config.toml` 整体按敏感文件处理,即使其中包含非敏感配置,也不得输出原文。
|
||||
- Codex backend 的 `auth.json`、`config.toml` 和 profile-local `model-catalog.json` 整体按敏感文件处理,即使其中包含非敏感配置,也不得输出原文。
|
||||
- Provider base URL、model 名称和 profile 名称可以输出,但 URL credential、Authorization header、token、api_key、password 必须 redacted。
|
||||
|
||||
## 测试规格
|
||||
@@ -112,20 +114,21 @@ Adapter 必须把 backend 错误映射为稳定 failureKind:
|
||||
|
||||
### T3 真实 backend 联调
|
||||
|
||||
阅读本文、[spec-v01-backend-codex.md](spec-v01-backend-codex.md) 和 [spec-v01-validation.md](spec-v01-validation.md),然后分别用 `backendProfile=codex`、`backendProfile=deepseek` 与 `backendProfile=minimax-m3` 完成真实最短 turn。确认 adapter 输出真实 assistant/backend_status/terminal_status events,事件中包含 profile/backendKind/protocol 摘要,且没有 Secret 泄露。
|
||||
阅读本文、[spec-v01-backend-codex.md](spec-v01-backend-codex.md) 和 [spec-v01-validation.md](spec-v01-validation.md),然后分别用 `backendProfile=codex`、`backendProfile=deepseek`、`backendProfile=minimax-m3` 与 `backendProfile=dsflash-go` 完成真实最短 turn。确认 adapter 输出真实 assistant/backend_status/terminal_status events,事件中包含 profile/backendKind/protocol 摘要,且没有 Secret 泄露。
|
||||
|
||||
### T4 Profile isolation 自测试
|
||||
|
||||
阅读本文,然后用 fake Codex app-server 和多个不同的 profile Secret fixture 做自测试。确认 adapter 只选择 run 指定 profile 的 SecretRef 和 `CODEX_HOME`,`deepseek` 或 `minimax-m3` 缺失时失败为 `secret-unavailable`,不会 fallback 到 `codex`。
|
||||
阅读本文,然后用 fake Codex app-server 和多个不同的 profile Secret fixture 做自测试。确认 adapter 只选择 run 指定 profile 的 SecretRef 和 `CODEX_HOME`,`deepseek`、`minimax-m3` 或 `dsflash-go` 缺失时失败为 `secret-unavailable`,不会 fallback 到 `codex`。
|
||||
|
||||
## 规格的实现情况
|
||||
|
||||
| 规格项 | 状态 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| Backend adapter 合同 | 已定义 | 本文为 v0.1 adapter 权威。 |
|
||||
| 通用 adapter 模块 | 已实现 profile 形态 | `src/backend/adapter.ts` 作为 runner 进程内 adapter 入口;`codex`、`deepseek` 与 `minimax-m3` 均路由到同一 Codex stdio backend kind,不复制第二套协议实现。 |
|
||||
| 通用 adapter 模块 | 已实现 profile 形态 | `src/backend/adapter.ts` 作为 runner 进程内 adapter 入口;`codex`、`deepseek`、`minimax-m3` 与 `dsflash-go` 均路由到同一 Codex stdio backend kind,不复制第二套协议实现。 |
|
||||
| event normalization | 已实现主路径 | Codex backend 已把 backend_status、assistant_message、tool_call、command_output、error 和 terminal_status 归一化为 manager events;复杂事件审计按人工验收抽查。 |
|
||||
| failure mapping | 已实现主路径 | Codex backend 已覆盖 missing secret、auth/rate/availability、protocol、JSON parse、invalid response、spawn、timeout 和 cancel 分类;真实负向场景按 [spec-v01-validation.md](spec-v01-validation.md) T7 手动验收。 |
|
||||
| `deepseek` profile | 已实现/已通过主闭环 | 已进入 registry、validation、runner Secret selection、backend_status metadata、CLI secret render 和 fake stdio 自测试;真实综合联调已按 [spec-v01-validation.md](spec-v01-validation.md) T8 覆盖 `codex -> deepseek -> codex` 切换。 |
|
||||
| `minimax-m3` profile | 已实现/待真实主闭环 | 已进入 registry、validation、runner Secret selection、backend_status metadata、CLI secret render 和 fake stdio 自测试;真实综合联调需要按 [spec-v01-validation.md](spec-v01-validation.md) T8 覆盖 `codex -> deepseek -> minimax-m3 -> codex` 切换。 |
|
||||
| `dsflash-go` profile | 已实现/待真实主闭环 | 已进入 registry、validation、runner Secret selection、`model-catalog.json` projection、backend_status metadata、CLI secret render 和 fake stdio 自测试;真实综合联调需要覆盖 `backendProfile=dsflash-go`、`deepseek-v4-flash` 和 1M context metadata。 |
|
||||
| 多 backend 路由 | Deferred | 跨 backend kind 的自动路由和 scheduler capacity selection 不进入 v0.1。 |
|
||||
|
||||
Reference in New Issue
Block a user