--- name: opencode_key_replacement_script description: 当需要批量替换 ~/.astrion/astrion、~/.astrion/astrion-clone 和服务器 /opt/agent/runtime 中的 OpenCode API key 时,应该索引本记忆 --- --- name: opencode_key_replacement_script description: 当需要批量替换 ~/.astrion/astrion、~/.astrion/astrion-clone 和服务器 /opt/agent/runtime 中的 OpenCode API key 时,应该索引本记忆 --- # OpenCode API key 批量替换脚本 ## 脚本位置 项目根目录下的 `replace_opencode_keys.py`。 ## 作用 一次性批量替换以下目录中所有 OpenCode 相关的 API key: - 本地:`/Users/jojo/.astrion/astrion` - 本地:`/Users/jojo/.astrion/astrion-clone` - 服务器:`/opt/agent/runtime/`(或服务器上 `ASTRION_DATA_ROOT` 指向的目录) ## 扫描范围 仅扫描配置文件,自动跳过运行时数据: - `settings.json` - `config/*.json` - 跳过 `data/`、`logs/`、对话历史等目录 - 跳过已有的 `.bak_` / `.bak` 备份文件 ## 替换规则 脚本会查找已知的旧 OpenCode key 值(被多个 OpenCode Go 相关环境变量共用的同一串 key),并将其替换为新的 OpenCode key。 实际会改到的键名通常包括: - `settings.json` 中 `env_vars` 下的: - `API_KEY_OPENCODE` - `AGENT_API_KEY` - `AGENT_THINKING_API_KEY` - `AGENT_TITLE_API_KEY` - 指向 `opencode.ai` 的 `API_KEY_KIMI`、`API_KEY_DEEPSEEK`、`API_KEY_QWEN`、`API_KEY_MINIMAX` 等 - `config/sub_agent_models.json` 中 `url` 为 `https://opencode.ai/zen/go/v1` 的模型条目的 `apikey` `config/custom_models.json` 中一般使用 `${API_KEY_OPENCODE}` 变量引用,key 本身存在 `settings.json`,脚本不会直接修改它。 ## 用法 ```bash # 只预览,不写入(循环轮换模式) python3 replace_opencode_keys.py --dry-run # 正式执行循环轮换(默认:key1→key2, key2→key3, key3→key1) python3 replace_opencode_keys.py # 单次指定替换(覆盖默认循环模式) python3 replace_opencode_keys.py --old-key <旧key> --new-key <新key> ``` ## 服务器替换流程 1. 确保脚本已上传至 `/opt/agent/agents/replace_opencode_keys.py` 2. 在服务器上修改脚本,把 `Path("/opt/agent/runtime")` 加入 `TARGET_DIRS` 3. 先执行 `--dry-run` 预览影响范围 4. 去掉 `--dry-run` 正式执行 5. 执行 `bash /opt/agent/refresh_agents.sh` 重启 webapp 服务使配置生效 6. 删除生成的 `.bak_时间戳` 备份文件 ## 服务器执行方式建议 - **推荐**:通过 `terminal_session` 打开一个 SSH 会话,在会话里直接运行 `python3 replace_opencode_keys.py ...` - **次选**:使用服务器虚拟环境的完整路径,例如 `/opt/agent/venv/bin/python3 replace_opencode_keys.py ...` - **注意**:在旧版本或未重启前,通过 `run_command` 直接执行 `ssh host "python3 ..."` 时,`run_command` 可能把命令中的 `python3` 重写为本地 macOS 的 Python 绝对路径,导致远程服务器找不到解释器。该问题已在 `modules/terminal_ops/run.py` 中修复:当命令通过 `ssh` 在远程执行时,跳过 `python3`/`pip` 重写。 ## 注意事项 - 执行前会自动在同级目录生成 `.bak_时间戳` 备份。 - 如果在沙箱/受限执行环境下运行,原目录不可写时脚本会把备份和修改后的文件写到项目工作区的 `opencode_key_replacement_backup/` 目录下,需要手动复制覆盖。 - 建议执行后删除生成的 `.bak_时间戳` 备份文件。 - 服务器上配置文件修改后,需要重启 webapp 服务才能生效。 ## 历史记录 - 2026-06-19:使用脚本将本地两个目录的配置从主 key 替换为备用 key,并删除备份。 - 2026-06-19:将服务器 `/opt/agent/runtime/` 下的 `settings.json` 和 `config/sub_agent_models.json` 也从主 key 替换为备用 key,并删除备份。 - 2026-06-24:将服务器 `/opt/agent/runtime/` 下的 `settings.json`(9 处)和 `config/sub_agent_models.json`(1 处)从备用 key 替换回主 key,随后执行 `bash /opt/agent/refresh_agents.sh` 重启 webapp 服务,并删除备份。期间发现 `run_command` 执行 `ssh host "python3 ..."` 会错误重写 `python3` 为本地 macOS 路径,已修复 `modules/terminal_ops/run.py`。 - 2026-06-25:重构脚本为三 key 循环轮换模式(key1/key2/key3,去掉主/备用命名)。将本地 `~/.astrion/astrion` 和 `~/.astrion/astrion-clone` 的配置从 key2 替换为 key3(4 文件 20 处)。服务器尚未操作,当前仍为 key1。 - 2026-06-25:将本地 `~/.astrion/astrion` 和 `~/.astrion/astrion-clone` 的配置从 key2 替换为 key3(4 文件 20 处),删除备份。服务器仍为 key1。 ## 相关 key 记录 | 说明 | Key | |---|---| | key1 | `sk-zNU867TGGXNKxoM0H6Pg6Jq4PYUPUOPDgMlzrOl3SS6jECRMWK5nNi6YMSsHzoZ` | | key2 | `sk-sgt4ERgERPx2axU18PSfmenHv9zNDD3y8M5yr0p4ryhcNSm04CZsCxDHftJ9AkFD` | | key3 | `sk-Jhvi76vJdCEQzvEdl8cAS5MIwBxBS4iTrJYSru2zCAXVnDVQpiZIvrcn9hBwkdZ4` | | legacy(已停用,等同 key1 轮换到 key2) | `sk-j0NdTvEDoqqkKCHEAFXXYneEsuXEiOXNCgLeZARJmfYUBf2Riym7KPFWq1amkB6z` |