
1. Codex 升级后 Superpowers 插件状态丢失为什么先别急着重装Codex 升级之后Superpowers 插件的 installed state 突然没了设置里「已安装插件」列表变空功能入口也跟着消失——这是最近不少人在群里问的一个 Bug。第一反应通常是重装插件但重装完下次升级大概率还会再丢一次。问题不在插件本身而在「状态存在哪」和「升级时谁动了它」。这篇文章换个视角假设你查 Superpowers 插件状态时不想走官方通道而是把 Codex 的请求切到 TaoToken 这条兼容通道上行不行结论是行但要说清楚边界——TaoToken 解决的是「模型请求走哪条路」的问题插件状态保不保得住仍然由用户目录和版本迁移逻辑决定。两者是两件事别混在一起。适合谁看正在用 Codex Superpowers 插件、升级后遇到 installed state 丢失、又想顺便把请求通道换成可自控 Base URL 的开发者。下面从现象、根因、通道切换配置、验证请求、排错一路走完命令和参数都能直接抄。2. 先搞清楚installed state 到底丢在哪2.1 现象长什么样装好 Superpowers 插件用得好好的某天 Codex 提示升级点完升级插件不见了功能消失设置里「已安装插件」列表空了。重装插件又能用但下次升级又丢。排查下来状态文件要么被新版本覆盖要么本来就存在「应用包内部目录」里升级即清。根因就一句话插件状态存错了地方或者升级流程没做状态迁移更新把用户状态一并抹掉了。2.2 应用有两类存储位置绝不能混位置用途升级时应用包内bundle / Program Files / /usr/lib程序代码、默认资源被整体替换用户数据目录AppData / Library/Application Support / .config / .local/share用户状态、插件、配置应保留插件安装状态属于用户状态必须落在用户数据目录。应用升级只替换包内文件用户目录不动状态才保得住。Codex 升级丢 Superpowers 状态十有八九是状态写进了包内目录或者新版本换了状态文件格式却没迁移。2.3 为什么「换通道」和「状态丢失」是两件事很多人把这两个问题绑在一起想是不是因为没走官方通道所以状态才丢不是。请求走哪条通道决定的是模型调用能不能通、走哪个 Base URL插件状态存哪决定的是升级后还在不在。你把 Base URL 换成 TaoToken插件状态该在用户目录还在用户目录该被覆盖还是被覆盖。所以正确做法是通道切换和状态修复分开处理各查各的。3. TaoToken 前置创建 Key 并把 Codex 的 Base URL 指过去3.1 为什么这里会用到 TaoTokenCodex 支持自定义 Base URL这给了我们一个「切换模型或供应商」的入口。当你想让 Codex 查 Superpowers 插件状态、跑排查清单时不一定非要走官方通道可以把它指到兼容通道上。TaoToken 在这里扮演的就是这个兼容通道的角色提供一个 OpenAI 兼容的 API 入口Codex 把 Base URL 填过去就能继续用。需要先说明TaoToken 只负责请求通道不碰你的本地插件状态文件。插件状态是否保留仍然由用户目录和版本迁移决定。3.2 创建 Key 的入口到官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 注册后进控制台创建 API Key。控制台地址https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 。Key 管理页https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。注意Base URL 填 https://taotoken.net/api 不要带 /v1。这是最容易踩的坑带了 /v1 会拼成 /v1/v1/chat/completions 直接 404。3.3 环境变量方式配置推荐比起改配置文件环境变量更干净也方便你在不同项目间切换。Linux / macOSexport OPENAI_BASE_URLhttps://taotoken.net/api export OPENAI_API_KEYsk-你的TaoTokenKeyWindows PowerShell$env:OPENAI_BASE_URL https://taotoken.net/api $env:OPENAI_API_KEY sk-你的TaoTokenKey如果你用的是 Codex 的配置文件方式找到 config 里的 provider 段把 base_url 改成上面的地址api_key 填你的 Key。改完重启 Codex让它重新读取配置。4. 可复制配置让 Codex 走 TaoToken 通道继续查插件状态4.1 最小验证脚本先确认通道通了在动 Codex 之前先用一段 Python 确认 TaoToken 通道本身是通的避免把「通道不通」误判成「插件状态问题」import os from openai import OpenAI client OpenAI( base_urlhttps://taotoken.net/api, api_keyos.environ[OPENAI_API_KEY], ) resp client.chat.completions.create( modelgpt-4o-mini, messages[{role: user, content: 回复 OK 两个字母即可}], ) print(resp.choices[0].message.content)跑通会打印 OK。这一步只验证通道不涉及插件状态。4.2 用 curl 直接打一发不想装 SDK 的话curl 最直接curl https://taotoken.net/api/chat/completions \ -H Authorization: Bearer $OPENAI_API_KEY \ -H Content-Type: application/json \ -d { model: gpt-4o-mini, messages: [{role: user, content: ping}] }返回里有 choices 数组就说明通道正常。注意 URL 是 /api/chat/completions不是 /api/v1/chat/completions。4.3 把插件状态修复逻辑接进来通道通了之后再让 Codex 按排查清单检查插件状态。核心修复思路是状态写用户目录 带版本号 升级迁移 原子写。下面这段可以直接放进你的排查脚本import os, sys, json def user_state_dir(app_nameCodex): if sys.platform darwin: base os.path.expanduser(~/Library/Application Support) elif sys.platform win32: base os.environ.get(APPDATA) else: base os.environ.get(XDG_CONFIG_HOME) or os.path.expanduser(~/.config) p os.path.join(base, app_name) os.makedirs(p, exist_okTrue) return p def atomic_save(path, data): tmp path .tmp with open(tmp, w) as f: json.dump(data, f) os.replace(tmp, path) def save_plugin_state(installed): d user_state_dir() atomic_save(os.path.join(d, plugins.json), {version: 2, installed: installed, enabled: {n: True for n in installed}}) def load_plugin_state(): p os.path.join(user_state_dir(), plugins.json) if not os.path.exists(p): return {version: 2, installed: [], enabled: {}} with open(p) as f: return json.load(f) if __name__ __main__: save_plugin_state([Superpowers]) print(升级后状态:, load_plugin_state())状态进用户目录升级只换包不碰它原子写用 os.replace 避免半截文件损坏。4.4 状态带版本号 升级迁移新版本换了状态格式时升级程序必须把旧状态搬过去而不是直接用空的新文件def migrate_state(old): current {version: 2, installed: [], enabled: {}} current[installed] old.get(installed, []) for name in current[installed]: current[enabled][name] True return current def load_with_migration(): state load_plugin_state() if state.get(version, 1) 2: state migrate_state(state) atomic_save(os.path.join(user_state_dir(), plugins.json), state) return stateversion migrate 保证升级不丢数据旧格式平滑过渡。5. 验证请求与成功结果怎么确认通道和状态都对5.1 通道验证跑完 4.1 或 4.2看到模型正常返回内容说明 Codex 已经能通过 TaoToken 通道发请求。这一步和插件状态无关只是确认「切换模型或供应商」这个动作生效了。5.2 状态验证跑 4.3 的脚本输出类似升级后状态: {version: 2, installed: [Superpowers], enabled: {Superpowers: True}}installed 里还有 Superpowers说明状态保住了。再模拟一次升级只替换包目录不动用户目录重新 loadinstalled 依然在就说明修复到位。5.3 升级后校验升级完成后主动校验一次缺失就告警def verify_after_upgrade(expected_installed): state load_plugin_state() missing [p for p in expected_installed if p not in state[installed]] if missing: print(f[升级] 警告以下插件状态疑似丢失: {missing}) return False return True verify_after_upgrade([Superpowers])返回 True 就放心了。6. 本篇常见错排查6.1 Base URL 带了 /v1最常见。填成 https://taotoken.net/api/v1 会拼出 /v1/v1/chat/completions直接 404。正确写法是 https://taotoken.net/api 不带 /v1。6.2 把状态丢失归咎于通道通道只影响请求能不能通不影响本地状态文件。状态丢了先查状态存哪、升级有没有迁移别去折腾 Base URL。6.3 状态还写在应用包内检查你的状态文件路径如果在 /Applications/xxx.app/Contents/... 或 C:\Program Files... 下升级必丢。挪到用户数据目录。6.4 升级没做迁移新版本换了格式旧状态文件没被搬过去直接读空。加 version 字段和 migrate 逻辑。6.5 写入不是原子的升级中途崩溃状态文件写半截损坏应用当「无状态」处理。用临时文件 os.replace。6.6 权限写不进用户目录用户目录 ACL 不对状态写不进去表现为「装了但没记住」。检查目录权限。6.7 排查清单速查状态存哪了是否在应用包内升级会覆盖升级是否迁移状态旧格式是否被搬到新位置状态有版本号吗新版本能否识别旧格式写入原子吗半截文件会损坏升级后校验吗丢失能否告警有备份吗升级前是否备份可回滚权限够吗用户目录是否写不进日志是否记录保留/迁移。7. 语义一致 CTA通道切换和状态修复各走各的路如果你只是想让 Codex 查 Superpowers 插件状态时走 TaoToken 通道先去 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 拿 KeyBase URL 填 https://taotoken.net/api 接入细节看文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。想先验证模型通不通用模型对话页 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentchatutm_campaignrewrite 打一发最快。如果你长期用 Codex 做编码、跑 Agent频繁切通道Coding Plan 更省事https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。Claude Code 相关接入看 https://taotoken.net/claude-code?utm_sourcetaotoken_aicg_blog_endutm_contentclaude-codeutm_campaignrewrite 。最后提醒一句TaoToken 是兼容通道插件状态保不保得住仍然由用户目录和版本迁移决定。把状态当成「比代码更持久的东西」来对待——存用户目录、带版本号、升级迁移、原子写、升级后校验这五步做完Codex 再升级Superpowers 的 installed state 就不会一夜消失了。