( pi-ai-llm版本无法兼容新的模型 ) 建立 pi-ai 版本兼容边界并完成 0.82.1 → 0.84.2 迁移 #3752
yifanxuaaa
started this conversation in
General
Replies: 1 comment
|
这个提案的方向我们用几个月的实测数据背书——我们维护 pi2dsh(让 Pi 插件跑在 DSH 上的兼容层),兼容面钉死单一 pi-ai 版本、升级走显式迁移,正是你说的"版本兼容边界"姿势,而且积累了跨版本 A/B 的实测差异数据,供这个迁移提案参考:
经验教训一条:^0.82.1 这种 0.x 范围锁死在 minor 内是对的方向,但升级必须配行为级回归,不能只看类型对齐——上面这些行为差异(和不变量)没有一个能从 changelog 读出来,全是打真代码打出来的。装置都是自包含的( |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
[llm-pi-ai] 建立 pi-ai 版本兼容边界并完成 0.82.1 → 0.84.2 迁移
背景
@deepseek-ai/dsh-llm-pi-ai@0.1.0-rc.8当前依赖:{ "@earendil-works/pi-ai": "^0.82.1" }由于
pi-ai仍处于0.x版本,^0.82.1的有效范围是:因此当前依赖范围实际上不包含
0.84.2。当前 lockfile 也解析到0.82.1。这在旧模型时代问题不明显,但新模型发布后,模型 catalog、thinking capability、请求字段、stream stop reason、abort 和 replay 行为都可能发生变化。仅修改版本号不能完成升级。
目前 Grok 4.6 在旧版
pi-ai@0.82.1的原生 xAI catalog 中不存在。我们通过 DSH 的显式 provider route 增加了:该 route 已经通过真实 DSH smoke test,并能暴露
low、medium、highthinking effort。但是,这只是模型 metadata 和 provider route 的兼容方案,不是完整解决 pi-ai host adapter 版本迁移问题。后续每次新模型发布,都可能重复出现同样的手工适配成本。
问题
将 DSH host 的
pi-ai临时从0.82.1升级到0.84.2时,发现这不是普通的依赖升级,而是一次 adapter compatibility migration。1. Catalog 类型发生 drift
DSH 当前
catalog.ts对 pi-ai 的 catalog capability 使用显式 drift gate,确保上游新增字段不会被静默忽略。pi-ai@0.84.2相比0.82.1新增或扩展了多个字段,例如:同时 reasoning format 增加了:
因此现有 catalog gate 在升级后需要重新分类每一个新字段:
如果只是修改类型使其编译通过,可能会静默丢失新的 provider capability。
2. StopReason 增加了新的生命周期状态
pi-ai@0.82.1的StopReason:pi-ai@0.84.2增加:其中:
pending表示当前 assistant message 仍处于部分流或中间状态;deferred表示 provider 请求被延迟,需要后续 poll、resolve 或 cancel。这两个状态不能简单映射成 DSH 的成功、失败或
aborted。当前 DSH 的
stream.ts主要假设一个请求最终以以下状态之一结束:升级后需要明确:
pending是否只能存在于 pi-ai 内部,还是需要暴露到 DSH stream;deferred是否需要成为 DSH durable operation;3. AssistantMessage 增加了新的持久化语义
pi-ai@0.84.2的AssistantMessage增加了:这些字段分别关系到:
end_turn语义。当前 DSH replay envelope 没有完整保存这些信息。若只升级 TypeScript 类型而不升级 replay schema,会出现以下风险:
end_turn语义在历史消息重建时丢失;当前
replay.ts的 stop reason 校验仍然只接受:4. Thinking effort 不是 provider-neutral 的简单字段
DSH UI 使用 provider-neutral 的 thinking effort,例如:
但不同 provider 的实际 wire format 可能不同:
{ "reasoning_effort": "high" }{ "thinking": { "type": "enabled" } }{ "chat_template_args": { "thinking": true } }{ "thinking_token_budget": 2048 }pi-ai@0.84.2原生的xai/grok-4.6catalog 虽然声明:{ "reasoning": true, "compat": { "supportsReasoningEffort": false } }但没有提供当前显式 route 使用的
thinkingLevelMap。因此:
DSH 需要明确区分:
reasoning_effort;5. 请求 body 可能发生变化
pi-ai 会根据 provider/model catalog 和 compat 字段决定请求字段,例如:
同一份 DSH request,在
0.82.1与0.84.2下可能产生不同的 provider request body。因此升级必须覆盖:
max_tokens与max_completion_tokens的选择;实际影响
当前实现会带来以下维护问题:
建议方案
阶段一:明确当前稳定基线
在 DSH 文档和 package metadata 中明确记录:
建议稳定发布版本使用精确版本或受控 lockfile,避免未经测试的 pi-ai 变化进入 release。
同时保留:
作为当前 DSH
0.82.1运行时上的显式 fallback route。该 route 不应被视为第二个 LLM engine,也不应引入第二个 pi-ai runtime。它只是为旧 catalog 补充缺失的 provider/model metadata。
阶段二:建立 adapter compatibility boundary
将 pi-ai 变化集中在
llm-pi-aiadapter 内处理,避免 pi-ai 类型和 provider-specific 行为向 DSH 其他模块泄漏。需要明确以下归一化边界:
重点包括:
pending/deferred的生命周期;endTurn的保存和恢复策略;新增 pi-ai 字段时,应当由 adapter 明确选择:
不能通过
as、字符串兜底或默认成功状态静默吞掉新语义。阶段三:单独完成 0.82.1 → 0.84.2 迁移
将
0.84.2作为一次独立的 DSH host adapter migration,而不是为了支持单个新模型直接修改版本号。迁移至少需要覆盖:
basetenthinking format;supportsFinishReason;chatTemplateArgs;supportsThinkingTokenBudget;supportsAdditionalTools;pending和deferredstop reason;AssistantMessage.deferred;rawStopReason;endTurn;max_tokens和max_completion_tokens;阶段四:增加模型兼容性测试矩阵
至少建立以下测试矩阵:
测试不需要让生产运行时同时加载两个 pi-ai 版本。可以使用两个独立的 dependency fixture 或 CI job,重点是防止升级时只能依赖手工 smoke test。
验收标准
llm-pi-ai支持的 pi-ai 版本策略;@earendil-works/pi-ai@0.84.2可以完成 DSH adapter 的 typecheck;offer、withhold或reject决策;pending和deferred不会被静默当成stop、error或aborted;endTurn的 Codex Responses 行为有测试;supportsAdditionalTools的 Codex tool loading 行为有测试;max_tokens、max_completion_tokens和 thinking 参数有 request body 断言;llm-pi-ai测试全部通过;0.82.1stable route 在迁移完成前继续可用;xai-grok-4-6fallback route。非目标
本 Issue 不要求:
llm-pi-aiadapter;llm-pi-ai直接实现第二套 streaming engine;0.84.2标记为兼容;相关代码
[packages/llm/llm-pi-ai/package.json](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/llm/llm-pi-ai/package.json)[packages/llm/llm-pi-ai/src/catalog.ts](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/llm/llm-pi-ai/src/catalog.ts)[packages/llm/llm-pi-ai/src/stream.ts](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/llm/llm-pi-ai/src/stream.ts)[packages/llm/llm-pi-ai/src/replay.ts](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/llm/llm-pi-ai/src/replay.ts)[packages/llm/llm-pi-ai/src/adapter.ts](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/llm/llm-pi-ai/src/adapter.ts)All reactions