乐于分享
好东西不私藏

让OpenClaw用上gpt-5.3-codex-spark

让OpenClaw用上gpt-5.3-codex-spark

Codex Spark 别吃灰,OpenClaw 来续杯

五一期间,笔者把 pro 订阅套餐的周常规额度用完,只剩下 codex-spark 的额度,试用下来的效果不怎么理想,一边啃一边想着 spark 套餐有什么使用场景,转头看向了 OpenClaw 的常规 agent,正好可以给 gpt-5.5 减负。

26.05.03-openclaw-with-gpt-5.3-codex-spark

说做就做,我把 gpt-5.3-codex-spark 写进了 OpenClaw 配置,保存后看起来一切正常。可过一会儿再看,它不见了,像是 OpenClaw 自己把我的改动“回滚”了。

一开始我以为是配置写错,或者命令没生效。后来翻了一圈源码和相关 PR,才发现不是这么回事。

开源代码好自查

在本机安装的 OpenClaw 里,找到了这样一段 suppression:

1
2
3

provider: openai-codexmodel: gpt-5.3-codex-sparkreason: gpt-5.3-codex-spark is no longer exposed by the OpenAI or Codex catalogs. Use openai/gpt-5.5.

位置在:

1

/opt/homebrew/lib/node_modules/openclaw/dist/extensions/openai/openclaw.plugin.json

所以不是 OpenClaw 不认识 gpt-5.3-codex-spark ,而是它被主动隐藏了。

一条 PR 见分岔

早在3月份就有 OpenClaw issue 46734[1] 讨论 Spark、failover 和 OAuth profile cooldown 的问题。

近期也有相关 OpenClaw PR 73694[2] 来实现 Restore Codex OAuth model routes 。

作者的意思是:public OpenAI API 和 Azure 路由可以继续隐藏,但 Codex OAuth 这条路应该恢复。

因为在他的环境里,Codex CLI 还能直接跑:

1

codex exec -m gpt-5.3-codex-spark --sandbox read-only --ephemeral "Reply with exactly OK."

返回:

1

OK

为啥还要关掉它

维护者 steipete 的态度比较保守,他的 suppression 是有意为之,不是误伤,理由主要有三个:

第一,OpenAI public API 不暴露 gpt-5.3-codex-spark。因为 GET /v1/models/gpt-5.3-codex-spark 返回的是 404 model_not_found

第二,OpenAI API 模型文档[3] 里有 gpt-5.3-codex,但没有 gpt-5.3-codex-spark

第三,Spark 官方介绍[4] 和 Codex rate card[5] 的措辞,更像 limited research preview / may be available,而不是稳定的 catalog model。

他最关键的一句话是:

The Codex CLI may still accept the model string for some account/session preview routes, but that is not enough for OpenClaw to publish a static openai-codex/gpt-5.3-codex-spark route again.

也就是说维护者更担心:“一旦放进默认列表,就等于告诉所有人它稳定可用。”

就笔者这次遇到的场景看,它更像是只对 Pro 订阅用户开放。

开源补丁自己打

OpenClaw 是开源代码,并且还有前人提供的 PR,完全可以临时 patch。当前版本的 manifest 把模型目录放在 modelCatalog.providers 下面,下面这段脚本会先校验结构,再备份 manifest,把 Spark 加回 openai-codex.models,并移除 openai-codex/gpt-5.3-codex-spark 这一条 suppression。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60

python3 - <<'PY'import json, os, shutilfrom datetime import datetimefrom pathlib import PathPROVIDER = 'openai-codex'MODEL = 'gpt-5.3-codex-spark'DEFAULT = '/opt/homebrew/lib/node_modules/openclaw/dist/extensions/openai/openclaw.plugin.json'def need(obj, key, typ):    val = obj.get(key)    if not isinstance(val, typ):        raise SystemExit(f'unsupported manifest schema: {key}')    return valpath = Path(os.getenv('OPENCLAW_PLUGIN_MANIFEST') or DEFAULT)if not path.exists():    raise SystemExit(f'manifest not found: {path}')data = json.loads(path.read_text(encoding='utf-8'))catalog = need(data, 'modelCatalog', dict)provider = need(need(catalog, 'providers', dict), PROVIDER, dict)models = provider.setdefault('models', [])suppressions = need(catalog, 'suppressions', list)if not isinstance(models, list):    raise SystemExit(f'unsupported manifest schema: {PROVIDER}.models')changed = Falseif not any(isinstance(m, dict) and m.get('id') == MODEL for m in models):    models.append({        'id': MODEL,        'name': MODEL,        'reasoning': True,        'input': ['text'],        'contextWindow': 128000,        'contextTokens': 128000,        'maxTokens': 128000,        'cost': {'input': 0, 'output': 0, 'cacheRead': 0, 'cacheWrite': 0},    })    changed = Truekept = [    s for s in suppressions    if not (isinstance(s, dict) and s.get('provider') == PROVIDER and s.get('model') == MODEL)]if len(kept) != len(suppressions):    catalog['suppressions'] = kept    changed = Trueif not changed:    print(f'already patched: {path}')    raise SystemExit(0)backup = path.with_name(path.name + '.bak-' + datetime.now().strftime('%Y%m%d%H%M%S'))shutil.copy2(path, backup)path.write_text(json.dumps(data, indent=2, ensure_ascii=False) + '\n', encoding='utf-8')print(f'patched: {path}')print(f'backup:  {backup}')PY

然后验证:

1
2

openclaw models list --all --provider openai-codex --plain | grep gpt-5.3-codex-sparkopenclaw config validate

如果能看到:

1

openai-codex/gpt-5.3-codex-spark

就可以把它加进 fallback:

1

openclaw models fallbacks add openai-codex/gpt-5.3-codex-spark

或设成默认模型:

1

openclaw models set openai-codex/gpt-5.3-codex-spark

了解事项不麻爪

这个方法有两个注意事项:

  1. 1. 升级版本会覆盖,我们改的是 OpenClaw 安装包里的 dist 文件。使用 openclaw updatebrew upgradenpm reinstall,或者重新安装 OpenClaw,都可能把补丁冲掉;
  2. 2. 能出现在模型列表里,不等于一定能真实调用成功。

这次 patch 只是让 OpenClaw 不再隐藏:

1

openai-codex/gpt-5.3-codex-spark

能不能跑,取决于你的 Codex OAuth 账号。

总结还要叨一下

这件事最有意思的地方,其实不是那段 patch 脚本,它暴露的只是 AI 工具生态里的一个断层。

产品页可能显示你有 Spark 额度,Codex CLI 也能真的跑,usage 里还能看到记录。

但 public API catalog 不一定承认它,第三方工具维护者也不一定愿意默认暴露它,gpt-5.3-codex-spark 就卡在这里。

所以我的建议很简单:想尝鲜,可以本机 patch 一下,最好只放 fallback。

想长期稳定,就等官方 catalog、OpenClaw upstream,或者自己维护 fork。

对了,使用 ccs 的小伙伴还可以将 spark 因地制宜地配置在 Haiku 上。

本期封面

引用链接

[1] OpenClaw issue 46734: https://github.com/openclaw/openclaw/issues/46734[2] OpenClaw PR 73694 – Restore Codex OAuth model routes: https://github.com/openclaw/openclaw/pull/73694[3] OpenAI API docs – gpt-5.3-codex: https://developers.openai.com/api/docs/models/gpt-5.3-codex[4] Introducing GPT-5.3 Codex Spark: https://openai.com/index/introducing-gpt-5-3-codex-spark/[5] Codex rate card: https://help.openai.com/en/articles/20001106-codex-rate-card