Replies: 2 comments
|
你这两条我都同意,补一个来自另一套实现的旁证,正好支持你的第 1 条。 默认值这件事,"显式写入"比"检测后回落"更可靠。 我维护的桥在把包自带的 provider 定义翻译成官方 所以你提的"默认改 false"我认为方向对。更彻底一点的形状是:让声明成为必填而不是有默认值——自定义 provider 在配置时必须表态支不支持 developer 角色,写错了是配置问题,比"没写、系统猜、猜错"要好排查得多。当然那是 breaking change,默认改 false 是成本低得多的中间态。 第 2 条(UI 没有 compat 开关)不只是 compat。 同一个形状在别处也在发生: 第 3 条那个误导性报错值得单独强调: 我这边不涉及的部分:我们不修 利益相关:我维护 pi2dsh(Pi 生态兼容层)。第一段说的是它内部的做法,不需要你装任何东西——你已经用 |

Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
接 [接入火山方舟(Ark, volces.com)报 400:pi-ai 将系统提示词以 developer 角色发出,方舟只接受 system/assistant/user/tool #3379](#3379)
背景
上一个 discussion 的根因:自定义提供方声明
reasoningEfforts(推理模型)后,pi-ai 会以developer角色发送系统提示词,而多数非 OpenAI 端点拒绝该角色,直接 400。好消息:rc.8 已在
dsh-llm-pi-ai的compatProfile中加入supportsDeveloperRole开关,通过settings.yaml可以关闭(我已在方舟、Dots 等场景实测生效),上一个 discussion 提到的问题已经解决。👍随之而来的新问题
默认值仍不安全:自定义提供方只要 baseURL 不在 pi-ai 的
isNonStandard名单里,supportsDeveloperRole就默认true(responses 协议更是无条件?? true)。新增"推理模型 + 不在名单的端点"组合,依然一请求就 400。模型配置 UI 没有任何 compat 开关:
设置 → 模型的自定义提供方卡片只有 Provider ID / 显示名 / baseURL / 协议 / API key / 模型列表。用户无法在 UI 关闭它,只能手改settings.yaml(官方文档也写明"表单没有对应字段")。报错极具误导性,排查容易走弯路。以我最近的一次实际遭遇为例:配置了新模型
dots3-note-prev(声明了reasoningEfforts),调用时报400 status code (no body)/CONTEXT_WINDOW_EXCEEDED。按错误码先查上下文,结果:max_tokens=64000、stream_options、tools 数组、1MB 大载荷——全部返回 200。折腾一圈后回到老问题:用与 DSH 相同的 SDK 复现,
role: developer立刻 400,role: system返回 200——最终确认还是 接入火山方舟(Ark, volces.com)报 400:pi-ai 将系统提示词以 developer 角色发出,方舟只接受 system/assistant/user/tool #3379 的同一个根因。而这个 400 响应体为空,被 pi-ai 的启发式规则(为 Cerebras 加的400/413 (no body)匹配)误分类成CONTEXT_WINDOW_EXCEEDED,与真实原因毫无关系。为什么建议默认改为 false
这个问题有不少先例,不是孤立现象:
api.openai.com端点supportsDeveloperRole=false,并保留 per-model 显式true覆盖。结论:目前已知可靠接受
developerrole 的只有原生api.openai.com(OpenClaw 调研:非原生端点中 "none known")。黑名单式逐个打补丁永远追不上现实,默认false+ 显式 opt-in 才是安全形态。改动方法(建议)
改动很小,两个协议都要覆盖。以当前 DSH 内置的 pi-ai 0.82.1 为例,共三处:
openai-responses-shared.js约 92 行,它读取的是model.compat(原始配置),而不是getCompat()的解析结果。因此只改第 2 处(responses.js的?? false)是死代码、不会生效——实测改完后 responses 实际发出的仍是developer,必须同时改第 3 处。completions 协议走的是解析后的 compat(getCompat合并model.compat ?? detected),所以第 1 处单独就够。保留
compat.supportsDeveloperRole: true作为显式逃生舱(OpenClaw 已验证此模式可行)。若不想依赖上游 pi-ai,也可在dsh-llm-pi-ai构建 provider 时做归一化(思路同 OpenClaw 的normalizeModelCompat:非原生端点默认 false、显式配置优先)。已在本机 rc.8(pi-ai 0.82.1)落实并验证:通过 pi-ai 真实
streamSimple路径抓取实际发出的 wire 消息,completions 与 responses 两个协议下均为——非 OpenAI 端点默认system、原生api.openai.com保持developer、显式compat.supportsDeveloperRole: true覆盖仍生效。收益与风险
收益:
风险/代价:
system与developer都是系统级指令,绝大多数端点等效;唯一受影响的是"非原生端点但接受 developer"的情况——目前已知为零;compat.supportsDeveloperRole: true覆盖。UI 开关建议(征询)
除了改默认值,建议在
设置 → 模型的自定义提供方卡片里增加一个可见的supportsDeveloperRole开关(provider 级默认值 + 模型行 per-model 覆盖),写入compat.supportsDeveloperRole。这样:想请教社区:
All reactions