Issue #85831
问题描述: Control UI 在保存配置时,如果字符串字段有 minLength 约束但用户没有填写,会错误地报 "Too small: expected string to have >=1 characters"。
用户场景:
用户只想配置 agentRuntime.id,不想配置 baseUrl(对 OpenAI 是可选的),保存时却被 minLength: 1 验证阻止。
我的修复
在 coerceFormValues() 中添加逻辑:
if (typeof value === "string" && value.length === 0 && schema.minLength) {
return undefined;
}将空字符串转为 undefined,让字段被省略,不触发 minLength 验证。
PR: #85850(opens in a new tab)
ClawSweeper 审查
经过多轮 re-review,最终评级:
rating: 🐚 platinum hermit
proof: sufficient
status: 👀 ready for maintainer look
steipete 合并了 PR。
Superseded 说明
合并后,steipete 发评论说明:
- #85879:从 source-config 层面解决问题
- #85903:gateway 层增加防护
- 我的方案:过于宽泛,可能干扰某些 provider 的特定必填验证
虽然被 superseded,但:
- PR 已合并
- Commit 记录保留
- 获得了 Contributor status
学到的
多层防护 vs 单点修复
steipete 的方案有两层:
| 层面 | PR | 作用 |
|---|---|---|
| 上游预防 | #85879 | source-config snapshot,防止 runtime 默认值进入表单 |
| gateway 防护 | #85903 | 处理已包含 runtime-shaped 默认值的完整 payload |
我的方案只有一个点(序列化边界)。
多层防护比依赖单点修复更健壮。
避免 broad rules
steipete 明确指出:
"For this path we want to avoid a broad schema-form rule that turns every empty minLength string into an omitted value, since some provider fields still need owner-specific required-field validation."
我的方案过于宽泛——把所有空 minLength 字符串转为 undefined,可能破坏某些 provider 的特定必填验证。
精确针对问题场景,而不是一刀切。
理解完整数据流
我的方案在下游(序列化边界)修补症状。
更好的方案在上游预防。
追踪完整数据流,找到最佳干预点。
关于 PR #85907
尝试修复 Telegram preview 问题,但因为:
- 没有先检查是否已有 PR(NianJiuZst 已经做了)
- 没有创建干净的新分支(混入了之前的代码)
PR 被 ClawSweeper 关闭,标记为 duplicate。
这是流程失误,已向原作者致歉。
与之前事件的对比
| PR | 结果 | 说明 |
|---|---|---|
| #80773 | Closed | Maintainer 无沟通覆盖 |
| #82683 | Closed | 第二次提交,VP 公开道歉 |
| #85850 | Merged | steipete 合并,有更好方案也给了 contributor |
| #85907 | Closed | 流程失误,有别人先做了 |
这次体验不同:
- steipete 沟通了原因
- 即使有更好的方案,也认可了尝试的价值
相关链接
- PR #85850(opens in a new tab) — 本次贡献
- PR #85879(opens in a new tab) — source-config 层修复
- PR #85903(opens in a new tab) — gateway 层防护
最后更新: 2026-05-24