Skip to content

feat(providers): 引入 LLM seam 骨架——统一入口 llm.stream() 与协议适配器注册表 - #594

Open
AlphaCatMeow wants to merge 2 commits into
Stack-Cairn:mainfrom
AlphaCatMeow:feat-llm-seam-core
Open

feat(providers): 引入 LLM seam 骨架——统一入口 llm.stream() 与协议适配器注册表#594
AlphaCatMeow wants to merge 2 commits into
Stack-Cairn:mainfrom
AlphaCatMeow:feat-llm-seam-core

Conversation

@AlphaCatMeow

@AlphaCatMeow AlphaCatMeow commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Closes #593

改动说明

在 PR-0 golden 基线(#590)保护下引入 LLM seam 骨架,行为严格等价:

  • 新增 crates/agent-gui/src/lib/providers/service/
    • types.tsLlmAdapter 接口(必需 stream()resolveModel()/retryPolicy() 为后续 PR 预留的可选签名)与 LlmStreamRequest 请求信封
    • registry.ts:api→adapter 注册表;未注册协议错误文案与重构前逐字一致(Unsupported model API: ...
    • piAiAdapter.ts:原样搬移 streamByApi.ts 的 anthropic-messages / openai-completions / openai-responses / google-generative-ai 四分支(含各分支 withStreamRetry 包装位置、toolChoice 映射、thinking runtime 解析与注释)
    • deepSeekAdapter.ts:原样搬移 deepseek-responses 分支
    • llmService.ts:统一入口 llm.stream(request)——一次性分发(同一信封重复分发抛错)+ 仅 dev 构建生效的请求信封冻结(生产零开销)
  • streamByApi.ts 收缩为兼容壳:保留 streamSimpleByApi 原签名,内部走注册表路由;该模块同时是 seam 的公开可观测针孔(传输 golden 与 failover 测试按此路径 mock 截获全部出站流)
  • 消费方换统一入口:agentRunner.ts(1 处)、textOnlyRuntime.ts(4 处)改调 llm.stream(),参数三元组不变;failover 逐候选传输独立与 buffer-until-commit 语义逐行保持
  • 传输路由字段x-liveagent-* 头、useSystemProxy 派生头)对 seam 不透明透传:不读取、不判断、不缓存

零 Rust 改动(diff 不含 src-tauri/**)、零镜像文件改动、无依赖变更。

验证结果

  • ✅ PR-0 golden 两套件 零修改 全部通过(wire-payload-golden 与 transport-golden 共 13 用例)——行为等价的判定基准
  • ✅ 新增 test/providers/llm-service-seam.test.mjs 8 用例:注册表五协议分发、未知协议错误文案逐字等价、重复注册抛错、一次性分发、dev 冻结/生产不冻结/自动探测降级、兼容壳与 llm.stream() 双入口 wire payload 等价(openai-completions 与 deepseek 原生各一)
  • pnpm --dir crates/agent-gui build
  • pnpm --dir crates/agent-gui test:frontend(268 个测试文件,exit 0)
  • ✅ 本 PR 全部改动文件 Biome lint 零错误(全仓既有 CRLF/格式基线错误与本改动无关,见下)
  • git diff --check
  • ⚠️ node scripts/check-ui-boundaries.mjs 报 3 个文件(agent-gui settings/index.ts、gateway web settings/index.ts、gateway web uiMessages.ts)——已核验三者内容与 upstream/main 完全一致且不在本 PR 改动集,属既有基线问题
  • ⚠️ 全仓 pnpm lint 在 Windows checkout 上有 310+ 既有 CRLF/格式错误(基线问题,与本改动无关)

未运行项

  • Rust/Go/WebUI 构建与测试:本 PR 不涉及对应目录

人工验收

已在 Windows Tauri 调试客户端(本分支 HEAD 构建)人工验证通过:带工具多轮对话、会话标题生成、手动压缩、断网重试提示、failover 切换。

Screenshots / preview

image

Stack

Depends-On: #590
Stack-Root: #590

为 LLM seam 改造提供行为等价判定基准:
- wire-payload-golden:anthropic-messages / openai-completions /
  openai-responses / google-generative-ai / deepseek-responses 五协议
  固定输入下的完整请求体逐字段锁定(thinking 档位、工具、缓存断点、
  text-only 双形态),走真实 pi-ai stream() 与全部 payload 中间件,
  onPayload 链尾截获后中断,零网络。
- transport-golden:prepareProviderRequest 完整输出快照(反代 URL、
  全量头集、base64 覆盖包解码断言、鉴权头排除、full URL 模式、
  useSystemProxy 开关),并锁定 failover 逐候选传输配置独立性
  (主选走代理+备选直连互不泄漏,双向拓扑)。

零生产代码改动。
将 streamByApi.ts 的五协议 switch 原样搬移为 service/ 下的双适配器
(piAiAdapter 承接 4 条 pi-ai 协议,deepSeekAdapter 承接 deepseek 原生),
经 api→adapter 注册表分发;新增统一流式入口 llm.stream(),携带仅 dev
构建生效的请求信封冻结与一次性分发不变量。streamByApi.ts 收缩为保留
原签名的兼容壳(分发针孔),agentRunner 与 textOnlyRuntime 共 5 处调用
换用统一入口。行为严格等价:PR-0 两个 golden 套件(13 用例)零修改
通过;新增 seam 单测 8 用例覆盖注册表分发、错误文案逐字等价、dev
冻结开关与双入口 wire payload 等价。零 Rust 改动、零镜像文件改动。
@StackCairn
StackCairn marked this pull request as draft August 22, 2026 08:06
@github-actions

github-actions Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

PR governance checks passed. Awaiting human review.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

LLM seam 骨架:统一流式入口与协议适配器注册表

1 participant