Jelajahi Sumber

docs: 记录 Ollama/chat-only 桥接工程

cc 1 Minggu lalu
induk
melakukan
87136d0e96
3 mengubah file dengan 56 tambahan dan 0 penghapusan
  1. 30 0
      .workbuddy/memory/2026-09-24.md
  2. 25 0
      _test.txt
  3. 1 0
      _tsc.txt

+ 30 - 0
.workbuddy/memory/2026-09-24.md

@@ -311,3 +311,33 @@ mtime 过滤的盲区:**后来的会话产出的新文件会混进更早会话
 方案讨论时对比过 B(每会话产物目录:协议没有输出目录概念,靠 prompt 约束不可靠)、
 D(主进程 watcher:只覆盖活会话,要养常驻进程)、E(按回合组织:交互重做)——都否了。
 提交 `(本次)`;验证 type:check 89 基线 / 本包 0 报错 + build exit=0。
+
+## Codex 支持本地 Ollama / chat-only 端点(P1-P4 全部落地)
+
+**前提修正(调研取证)**:Codex 0.155+ 已物理移除 wire_api="chat"(WireApi 只剩 Responses,
+配 chat 硬报错,官方 Discussion #7782);Ollama ≥ 0.13.3 原生支持非状态化 /v1/responses,
+而 Codex core 每轮重建完整 input(无状态调用),两者天然兼容。我们应用永远不需要给 Codex
+做消息转换;chat-only 端点的转换只能在 Codex 与端点之间的代理层。
+
+**四期落地**:
+- P1 `cf328ab`:probeEndpoint 四态(responses/chat-only/unsupported/unreachable),
+  真实 modelId 修 Ollama 404 误伤(Ollama 对未拉取模型也返回 404!),/api/version 消歧。
+- P2 `b029cbb`:chatBridgeTranslate.ts 纯函数翻译层 + ResponsesSseTranslator 流式状态机。
+- P3 `b9075dd`:chatBridgeService(127.0.0.1 随机端口、只接 POST /v1/responses、不持 key);
+  applyProvider 判 chat-only 自动桥接 + **Ollama 桥接必须降级为自定义 provider**(内置
+  provider 的 buildArgs 只允许覆盖 base_url,不降级会绕过桥接直连);AppliedProviderInfo
+  加 bridged(落盘存上游真实地址,桥接 URL 不落盘,重启靠重新「应用」重建)。
+- P4 `0d765ae`:运行时面板桥接行 + 已应用「桥接」标记。
+
+**关键经验**:
+- 冒烟(npm run smoke:codex)**真实验证了 Codex 无状态调用**:第二轮 turn 上游收到的
+  messages 含第一轮全部内容(user+assistant 回放)——这是 Ollama 非状态化兼容的根基。
+- 冒烟有两个**基线既有失败**(git stash 对照证实,与本改动无关):`status.version` 在沙箱里
+  拿到 object(spawnSync 怪癖)、codexCtl.itest.ts 的 electron 二进制未装好。
+- SSE 事件序列按 OpenAI Responses 规范合成(created→item.added→part.added→delta→done
+  系列→completed),真实 Codex 一次跑通,说明规范实现即可被接受。
+- provider.json 的 AppliedProviderInfo.bridged 只在桥接时写入;重启后 bridge 不自动重建,
+  页面重新「应用」时自然恢复(与 apiKey 注入同一流程)。
+
+验证:tsc 0 报错、114 单测全过、smoke 桥接 turn 通、build-electron exit=0(chat-bridge 已进包)、
+前端 type:check 89 基线 0 新增 + build exit=0。

+ 25 - 0
_test.txt

@@ -0,0 +1,25 @@
+ 鉁?[39m electron/service/codex/mcpService.test.ts (12 tests) 9ms
+node.exe : Sourcemap for "C:/Users/cc/WorkBuddy/Worktrees/zsjz-ai/dev-3-6ce6fa8
+7/ai-electron/node_modules/ee-core/dist/esm/ps/index.js" points to missing sour
+ce files
+所在位置 行:1 字符: 1
++ & "d:\nvm4w\nodejs/node.exe" "D:\nvm4w\nodejs/node_modules/npm/bin/np ...
++ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+    + CategoryInfo          : NotSpecified: (Sourcemap for "...ng source files 
+   :String) [], RemoteException
+    + FullyQualifiedErrorId : NativeCommandError
+ 
+ 鉁?[39m electron/service/codex/chatBridgeTranslate.test.ts (16 tests) 6ms
+ 鉁?[39m electron/service/codex/jsonRpcPeer.test.ts (5 tests) 6ms
+ 鉁?[39m electron/service/codex/codexRuntime.test.ts (14 tests) 4ms
+ 鉁?[39m electron/service/codex/chatBridgeService.test.ts (4 tests) 74ms
+ 鉁?[39m electron/service/codex/providerService.test.ts (16 tests) 66ms
+ 鉁?[39m electron/service/codex/codexLocator.test.ts (3 tests) 2ms
+ 鉁?[39m electron/service/codex/skillService.test.ts (44 tests) 5291ms
+
+ Test Files  8 passed (8)
+      Tests  114 passed (114)
+   Start at  17:43:38
+   Duration  5.67s (tests 89%, transform 7%, import 3%, worker 1%)
+
+test-exit=0

+ 1 - 0
_tsc.txt

@@ -0,0 +1 @@
+tsc-exit=0