|
| 1 | +# OpenClaw 图像输入与 GPT 模板调整分析 |
| 2 | + |
| 3 | +## 1. 背景 |
| 4 | + |
| 5 | +本次调整有两个目标: |
| 6 | + |
| 7 | +1. 将 `packages/core/templates` 中涉及 GPT 的模板模型统一收敛到: |
| 8 | + - `gpt-5.4` |
| 9 | + - `gpt-5.3-codex` |
| 10 | +2. 修正 OpenClaw 当前模板中“图片输入无法稳定走主模型识别”的问题 |
| 11 | + |
| 12 | +用户期望是: |
| 13 | + |
| 14 | +- **优先使用 `gpt-5.4`** |
| 15 | +- **如果配置允许多个模型,则保留多个模型** |
| 16 | +- 但不能为了“支持更多输入类型”而随意在配置里乱加能力声明 |
| 17 | + |
| 18 | +--- |
| 19 | + |
| 20 | +## 2. 代码现状与问题定位 |
| 21 | + |
| 22 | +本次核对的关键文件: |
| 23 | + |
| 24 | +- `packages/core/templates/openclaw/openclaw.base.template.json` |
| 25 | +- `packages/core/templates/openclaw/models.base.template.json` |
| 26 | +- `packages/core/templates/opencode/opencode.json` |
| 27 | +- `packages/core/src/writers/openclaw.ts` |
| 28 | +- `packages/core/src/writers/opencode.ts` |
| 29 | + |
| 30 | +### 2.1 旧问题一:OpenClaw 模型能力被声明成 text-only |
| 31 | + |
| 32 | +在原始模板中,OpenClaw 的两个模型都被写成了: |
| 33 | + |
| 34 | +- `input: ["text"]` |
| 35 | + |
| 36 | +这会带来一个直接后果: |
| 37 | + |
| 38 | +- 即使底层模型本身支持图片,OpenClaw 也可能先把它视为“当前主模型不接受图片” |
| 39 | +- 之后再转向 `imageModel` 或 `tools.media` 对应的外部识别路径 |
| 40 | + |
| 41 | +### 2.2 旧问题二:没有显式声明 `imageModel` |
| 42 | + |
| 43 | +原始模板只设置了: |
| 44 | + |
| 45 | +- `agents.defaults.model.primary` |
| 46 | + |
| 47 | +但没有显式设置: |
| 48 | + |
| 49 | +- `agents.defaults.imageModel` |
| 50 | + |
| 51 | +这意味着: |
| 52 | + |
| 53 | +- 当主模型被用户切换成一个文本型模型时,图片请求缺少明确的“原生图像模型兜底” |
| 54 | +- OpenClaw 更容易走工具链或外部媒体理解链路 |
| 55 | + |
| 56 | +### 2.3 旧问题三:第二模型还是旧的 `gpt-5.2-codex` |
| 57 | + |
| 58 | +模板中第二模型仍是: |
| 59 | + |
| 60 | +- `gpt-5.2-codex` |
| 61 | + |
| 62 | +这和本次要求的统一目标不一致,应更新为: |
| 63 | + |
| 64 | +- `gpt-5.3-codex` |
| 65 | + |
| 66 | +--- |
| 67 | + |
| 68 | +## 3. OpenClaw 官方文档结论 |
| 69 | + |
| 70 | +本次判断主要参考 OpenClaw 官方文档: |
| 71 | + |
| 72 | +- AI Providers:<https://docs.openclaw.ai/configuration/ai-providers> |
| 73 | +- Configuration(自定义 provider / 模型列表示例):<https://docs.openclaw.ai/configuration/configuration> |
| 74 | +- Tools(`media` 工具说明):<https://docs.openclaw.ai/configuration/tools> |
| 75 | + |
| 76 | +结合文档,可以确认三点: |
| 77 | + |
| 78 | +### 3.1 `input` 是“模型能力声明”,不是任意开关 |
| 79 | + |
| 80 | +官方配置示例中的自定义模型条目,会为每个模型单独声明输入能力,例如: |
| 81 | + |
| 82 | +- `["text"]` |
| 83 | +- `["text", "image"]` |
| 84 | + |
| 85 | +这说明: |
| 86 | + |
| 87 | +- `input` 的语义是“告诉 OpenClaw 这个模型原生支持哪些输入模态” |
| 88 | +- 不是“我希望它支持什么,就写什么” |
| 89 | + |
| 90 | +因此,如果某个模型并没有官方确认支持某种输入,就不应该随意加进 `input` |
| 91 | + |
| 92 | +### 3.2 `imageModel` 是图片请求的专用兜底模型 |
| 93 | + |
| 94 | +官方文档说明: |
| 95 | + |
| 96 | +- 当当前主模型不支持图片时,OpenClaw 会使用 `imageModel` |
| 97 | + |
| 98 | +这意味着更稳妥的做法是: |
| 99 | + |
| 100 | +- 把真正可处理图片的模型放到 `imageModel` |
| 101 | +- 而不是把所有候选模型都声明成 image-capable |
| 102 | + |
| 103 | +### 3.3 `tools.media` 是另一条链路 |
| 104 | + |
| 105 | +官方工具文档说明 `media` 工具可负责媒体理解,并且支持自动检测外部能力来源。 |
| 106 | + |
| 107 | +因此当前项目里出现: |
| 108 | + |
| 109 | +- 用户发图后没有走主模型原生视觉 |
| 110 | +- 反而去调工具或外部识别链路 |
| 111 | + |
| 112 | +并不是偶然,而是配置层会直接影响 OpenClaw 的路由决策。 |
| 113 | + |
| 114 | +--- |
| 115 | + |
| 116 | +## 4. 本次采用的安全配置策略 |
| 117 | + |
| 118 | +### 4.1 最终策略 |
| 119 | + |
| 120 | +本次最终采用“两个模型都按官方能力声明 image 输入”的方案: |
| 121 | + |
| 122 | +- `gpt-5.4` |
| 123 | + - 作为主模型 |
| 124 | + - 声明 `input: ["text", "image"]` |
| 125 | + - 同时作为 `imageModel` |
| 126 | +- `gpt-5.3-codex` |
| 127 | + - 作为第二模型保留 |
| 128 | + - 声明 `input: ["text", "image"]` |
| 129 | + |
| 130 | +### 4.2 为什么这样更稳 |
| 131 | + |
| 132 | +因为这里要同时满足两件事: |
| 133 | + |
| 134 | +1. 让 OpenClaw 在默认情况下明确知道:`gpt-5.4` 可以原生收图 |
| 135 | +2. 让模板能力声明与官方模型能力保持一致 |
| 136 | + |
| 137 | +也就是说: |
| 138 | + |
| 139 | +- `gpt-5.4` 负责默认主模型与图片兜底 |
| 140 | +- `gpt-5.3-codex` 也具备原生图片输入声明 |
| 141 | +- 同时仍通过 `imageModel` 保持优先路由到 `gpt-5.4` |
| 142 | + |
| 143 | +--- |
| 144 | + |
| 145 | +## 5. “如果还要解析其他类型怎么办?” |
| 146 | + |
| 147 | +结论是: |
| 148 | + |
| 149 | +- **需要额外加** |
| 150 | +- **但不能现在随便加** |
| 151 | + |
| 152 | +必须同时满足两个前提: |
| 153 | + |
| 154 | +1. OpenClaw 官方配置明确支持该输入类型 |
| 155 | +2. 实际接入的底层模型 / API 也真的支持该输入类型 |
| 156 | + |
| 157 | +否则会出现两类风险: |
| 158 | + |
| 159 | +- 配置写了,但 OpenClaw 根本不识别这个能力值 |
| 160 | +- OpenClaw 识别了,但底层模型不支持,最后仍会失败或退回工具链 |
| 161 | + |
| 162 | +### 5.1 当前不建议直接添加的原因 |
| 163 | + |
| 164 | +截至本次核对,我能从 OpenClaw 官方配置文档中稳定确认的自定义 provider 输入能力,核心是: |
| 165 | + |
| 166 | +- `text` |
| 167 | +- `image` |
| 168 | + |
| 169 | +我**没有找到足够明确的官方文档**说明可以直接在这个字段里安全地扩展为例如: |
| 170 | + |
| 171 | +- `audio` |
| 172 | +- `pdf` |
| 173 | +- `file` |
| 174 | +- `video` |
| 175 | + |
| 176 | +因此当前不建议凭猜测把这些值写进模板。 |
| 177 | + |
| 178 | +### 5.2 正确做法 |
| 179 | + |
| 180 | +如果后续你希望支持更多模态,建议按下面顺序推进: |
| 181 | + |
| 182 | +1. 先核 OpenClaw 官方文档或源码,确认 `input` 支持的合法枚举 |
| 183 | +2. 再核实际模型文档,确认该模型是否支持该模态 |
| 184 | +3. 只有两边都成立,才把能力写进模板 |
| 185 | + |
| 186 | +在这之前,其他类型更适合走: |
| 187 | + |
| 188 | +- OpenClaw 的工具链能力 |
| 189 | +- 或上游预处理 / 转换链路 |
| 190 | + |
| 191 | +--- |
| 192 | + |
| 193 | +## 6. 本次实际落地改动 |
| 194 | + |
| 195 | +### 6.1 OpenClaw 模板 |
| 196 | + |
| 197 | +已调整: |
| 198 | + |
| 199 | +- `packages/core/templates/openclaw/openclaw.base.template.json` |
| 200 | +- `packages/core/templates/openclaw/models.base.template.json` |
| 201 | + |
| 202 | +改动内容: |
| 203 | + |
| 204 | +- 保留 `gpt-5.4` 为首选模型 |
| 205 | +- 将第二模型从 `gpt-5.2-codex` 改为 `gpt-5.3-codex` |
| 206 | +- 将 `gpt-5.4` 的 `input` 改为 `["text", "image"]` |
| 207 | +- 将 `gpt-5.3-codex` 的 `input` 也改为 `["text", "image"]` |
| 208 | +- 新增 `agents.defaults.imageModel = "{{providerName}}/gpt-5.4"` |
| 209 | + |
| 210 | +### 6.2 OpenClaw 内置回退模板 |
| 211 | + |
| 212 | +已同步调整: |
| 213 | + |
| 214 | +- `packages/core/src/writers/openclaw.ts` |
| 215 | + |
| 216 | +避免模板文件缺失时,运行时行为和磁盘模板不一致。 |
| 217 | + |
| 218 | +### 6.3 OpenCode 模板与默认模型集合 |
| 219 | + |
| 220 | +已同步调整: |
| 221 | + |
| 222 | +- `packages/core/templates/opencode/opencode.json` |
| 223 | +- `packages/core/src/writers/opencode.ts` |
| 224 | + |
| 225 | +改动内容: |
| 226 | + |
| 227 | +- 第二模型从 `gpt-5.2-codex` 改为 `gpt-5.3-codex` |
| 228 | +- 默认模型集合保留两个模型 |
| 229 | +- 合并写回时也会自动补齐第二模型,避免用户已有配置里丢失它 |
| 230 | + |
| 231 | +--- |
| 232 | + |
| 233 | +## 7. 验证结果 |
| 234 | + |
| 235 | +本次验证全部在隔离测试目录进行,没有触碰本地真实配置。 |
| 236 | + |
| 237 | +已执行: |
| 238 | + |
| 239 | +- `pnpm --filter=@ccman/core build` |
| 240 | +- `pnpm --filter=@ccman/core exec vitest run src/writers/openclaw.test.ts src/tool-manager.openclaw.test.ts src/writers/opencode.test.ts` |
| 241 | + |
| 242 | +结果: |
| 243 | + |
| 244 | +- 3 个测试文件通过 |
| 245 | +- 8 个测试用例通过 |
| 246 | + |
| 247 | +覆盖点包括: |
| 248 | + |
| 249 | +- OpenClaw 默认写入 |
| 250 | +- OpenClaw merge 行为 |
| 251 | +- OpenClaw manager 写入 |
| 252 | +- OpenCode 默认写入 |
| 253 | +- OpenCode merge / overwrite 行为 |
| 254 | + |
| 255 | +--- |
| 256 | + |
| 257 | +## 8. 最终建议 |
| 258 | + |
| 259 | +当前最合理的结论是: |
| 260 | + |
| 261 | +- **不要把 OpenClaw 的 `input` 当成任意扩展能力开关** |
| 262 | +- **先把图片这条链路配置正确** |
| 263 | +- **优先由 `gpt-5.4` 承担图片输入** |
| 264 | +- **由 `imageModel` 显式兜底** |
| 265 | +- **同时让 `gpt-5.3-codex` 的能力声明与官方模型页保持一致** |
| 266 | + |
| 267 | +如果你下一步要继续做“音频 / PDF / 其他附件”的原生输入支持,我建议单独开一个分析项,先核: |
| 268 | + |
| 269 | +1. OpenClaw 官方允许的 `input` 枚举 |
| 270 | +2. 目标模型的真实模态支持矩阵 |
| 271 | +3. 是否应该走 `tools.media`,还是走模型原生多模态 |
0 commit comments