在安全测试、CTF 比赛、渗透测试等场景下,AI 编码工具(Codex、Claude Code、OpenCode)会频繁拒绝涉及安全操作的请求,导致会话中断。
Codex Session Patcher 提供两类解决方案:
1. 会话清理 — 扫描已产生的拒绝回复,替换为配合性内容,让会话可以 resume 继续
2. CTF 提示词注入 — 在配置层面注入安全测试上下文,从源头降低被拒绝的概率
- 智能检测 — 两级拒绝检测策略(强短语全文匹配 + 弱关键词开头匹配),低误报率
- AI 智能改写 — 调用 LLM 根据对话上下文生成符合语境的替换回复(支持 OpenAI / Ollama / OpenRouter 等兼容接口)
- 批量清理 — 处理会话中所有拒绝回复,而非仅最后一条
- 推理内容擦除 — 删除 Reasoning / Thinking block 加密推理内容
- 备份还原 — 清理前自动备份,支持一键还原到任意历史版本
- Diff 对比 — 清理前后 Side-by-side 对比视图
- Codex Profile 模式 — 创建
ctfprofile,仅codex -p ctf启动时生效,不影响正常会话 - Codex 全局模式 — 注入到全局配置,所有新会话自动生效
- Claude Code 工作空间 — 创建专用 CTF 工作空间
~/.claude-ctf-workspace,通过项目级 CLAUDE.md 注入 - OpenCode 工作空间 — 创建专用 CTF 工作空间
~/.opencode-ctf-workspace,通过 AGENTS.md 注入 - 提示词自定义 — Web UI 内直接编辑注入提示词,支持模板保存与切换
- AI 提示词改写 — 结合已注入的 CTF 系统提示词,AI 改写你的请求使其更易被接受
| 平台 | 会话清理 | CTF 注入 | 会话格式 |
|---|---|---|---|
| Codex CLI | ✅ | ✅ Profile + 全局 | JSONL |
| Claude Code | ✅ | ✅ 专用工作空间 | JSONL |
| OpenCode | ✅ | ✅ 专用工作空间 | SQLite |
- 会话列表 — 多平台统一管理,按日期分组,支持按格式/拒绝状态/备份状态过滤
- 可视化清理 — 预览面板 + Diff 对比 + 一键执行
- 多语言 — 支持中文 / English 界面切换
- 实时日志 — WebSocket 推送,操作日志实时显示
git clone https://github.com/ryfineZ/codex-session-patcher.git
cd codex-session-patcher
# CLI 版本(零额外依赖)
python -m pip install -e .
# Web UI 版本
python -m pip install -e ".[web]"
cd web/frontend && npm install && npm run build && cd ../..- Web UI 默认只监听本机:
http://127.0.0.1:47832 - 开发模式前端地址:
http://127.0.0.1:3000 - 本机默认可无密码直接进入
- 如果配置了 Web 管理密码,整站 API 才需要先登录
- 默认启动时自动确保 Codex Profile CTF/渗透模式可用
- 不会再把普通
codex会话偷偷改成全局安全模式
| 场景 | 在哪里执行 | 命令 | 说明 |
|---|---|---|---|
| 首次完整启动 | 仓库根目录 | ./scripts/start-web.sh |
会检查依赖、构建前端、启动服务,并自动确保 Codex Profile CTF/渗透模式可用 |
| 首次完整启动 | scripts/ 目录 |
./start-web.sh |
与上面等价,脚本会自动回到仓库根目录 |
| 依赖和前端已准备好,只想直接启动后端 | 仓库根目录 | python -m web.backend.main |
最快,不会再跑 pip install 和前端构建,且会自动确保 Codex Profile CTF/渗透模式可用 |
| 手动用 uvicorn 启动 | 仓库根目录 | python -m uvicorn web.backend.main:app --host 127.0.0.1 --port 47832 |
仅后端启动,不经过内置启动包装 |
| 前后端热更新开发 | 仓库根目录 | ./scripts/dev-web.sh |
启动 127.0.0.1:47832 后端 + 127.0.0.1:3000 前端 |
| 手动执行一次自动清理 | 仓库根目录 | ./scripts/auto-clean-sessions.sh |
默认扫描并清理最新 Codex 会话中的拒绝回复 |
| macOS 开机自动启动 + 每分钟自动清理 | 仓库根目录 | ./scripts/install-launch-agent.sh |
安装当前用户的 launchd Web 服务和 60 秒自动清理任务 |
推荐顺序:
- 第一次跑项目,用
./scripts/start-web.sh - 之后如果只是本机打开 Web UI,优先用
python -m web.backend.main - 只有前端代码要热更新时,才用
./scripts/dev-web.sh
默认行为:
- 以上三种启动方式都会在启动时检查并自动确保 Codex Profile CTF/渗透模式 可用
- 启动后如果你要进入该模式,请显式执行:
codex -p ctf- 如果你明确不想自动确保该 Profile,可临时设置:
export CODEX_PATCHER_AUTO_ENABLE_PROFILE=0如果你只是本机使用,现在可以不配密码直接启动。
如果你想给 Web 面板加一层登录保护,再用下面任一方式:
方式 A:环境变量(最直接)
export CODEX_PATCHER_WEB_PASSWORD='请改成你的强密码'方式 B:写入 ~/.codex-patcher/config.json 的密码哈希(更适合长期本机使用)
{
"web_password_hash": "pbkdf2_sha256$..."
}说明:
- 登录成功后,后端会下发
HttpOnlysession cookie GET /api/settings不再返回完整ai_key,只会返回掩码- 若未配置密码:
- 本机访问可直接进入
- WebSocket 仍会校验
Origin - 非本机地址仍然禁止无认证监听
# 在仓库根目录执行
./scripts/start-web.sh这个脚本会做三件事:
- 安装 Python Web 依赖
- 安装并构建前端
- 启动 FastAPI 服务,并自动确保 Codex Profile CTF/渗透模式可用
启动后访问:
http://127.0.0.1:47832
如果你当前就在 scripts/ 目录,也可以直接执行:
./start-web.sh这两种写法是等价的。
如果你已经跑过一次完整启动,或者已经确认下面两项都存在:
- Python Web 依赖已经装好
web/frontend/dist/index.html已存在
那么后续最省事的调用方式是:
python -m web.backend.main访问地址:
http://127.0.0.1:47832
启动时会自动检查并确保 Codex Profile CTF/渗透模式可用;也就是说,你之后如果要进入该模式,执行:
codex -p ctf即可带渗透模式,而不会污染普通 codex 会话。
如果你还没准备好依赖和前端产物,再执行下面这套手动准备流程:
python -m pip install -e ".[web]"
cd web/frontend && npm install && npm run build && cd ../..
python -m web.backend.main或:
python -m uvicorn web.backend.main:app --host 127.0.0.1 --port 47832访问地址同样是:
http://127.0.0.1:47832
# 在仓库根目录执行
./scripts/dev-web.sh启动后:
- 前端开发服务器:
http://127.0.0.1:3000 - 后端 API:
http://127.0.0.1:47832 - API 文档:
http://127.0.0.1:47832/docs
如果你配置了 Web 管理密码,打开 Web 页面后会先出现登录框。
- 输入你配置的 Web 管理密码
- 登录成功后,页面才会加载会话列表、设置页、WebSocket 日志流
- 退出登录会清空前端状态并关闭 WebSocket 连接
如果你没有配置 Web 管理密码:
- 页面会直接进入主界面
- 不需要登录
如果你希望登录 macOS 后自动拉起这个服务,并且每 60 秒自动清理一次最新 Codex 会话里的拒绝回复,使用:
# 在仓库根目录执行
./scripts/install-launch-agent.sh它会安装当前用户的两个 LaunchAgent:
- Web 服务标签:
com.houzi.codex-session-patcher.web - Web 配置文件:
~/Library/LaunchAgents/com.houzi.codex-session-patcher.web.plist - Web 标准输出日志:
~/.codex-patcher/launchd/stdout.log - Web 标准错误日志:
~/.codex-patcher/launchd/stderr.log - 自动清理标签:
com.houzi.codex-session-patcher.auto-clean - 自动清理配置文件:
~/Library/LaunchAgents/com.houzi.codex-session-patcher.auto-clean.plist - 自动清理标准输出日志:
~/.codex-patcher/auto-clean/stdout.log - 自动清理标准错误日志:
~/.codex-patcher/auto-clean/stderr.log
注意:
- 这条开机自启动链路走的是
./scripts/start-web-daemon.sh - 每分钟自动清理链路走的是
./scripts/auto-clean-sessions.sh - 默认每
60秒扫描一次 - 默认只扫 最新 Codex 会话
- 不会在每次开机时重复执行
pip install或npm run build - 如果
127.0.0.1:47832已被本项目旧的手动实例占用,start-web-daemon.sh会先回收旧实例,再由 launchd 接管 - 如果
127.0.0.1:47832被别的无关进程占用,LaunchAgent 会拒绝强杀并直接报错 - 它要求你至少先成功准备过一次运行环境,也就是:
- Python Web 依赖已经装好
web/frontend/dist/index.html已存在
如果你要修改自动清理策略,可以在安装前先导出环境变量,再执行安装脚本:
export CODEX_PATCHER_AUTO_CLEAN_FORMAT=codex
export CODEX_PATCHER_AUTO_CLEAN_SCOPE=latest
export CODEX_PATCHER_AUTO_CLEAN_INTERVAL=60
export CODEX_PATCHER_AUTO_CLEAN_NO_BACKUP=0
export CODEX_PATCHER_AUTO_CLEAN_BACKUP_DIR=/Volumes/otherdata/mac/codex/bak/sessions
./scripts/install-launch-agent.sh可选值说明:
CODEX_PATCHER_AUTO_CLEAN_FORMAT:codex/claude-code/opencodeCODEX_PATCHER_AUTO_CLEAN_SCOPE:latest/allCODEX_PATCHER_AUTO_CLEAN_INTERVAL:秒,默认60CODEX_PATCHER_AUTO_CLEAN_NO_BACKUP:1表示不备份,默认0CODEX_PATCHER_AUTO_CLEAN_BACKUP_DIR:JSONL 清理前备份目录,默认/Volumes/otherdata/mac/codex/bak/sessions
如果你想卸载开机自启动:
./scripts/uninstall-launch-agent.sh卸载时不会直接删除 plist,而是归档到:
~/.codex-patcher/launchd/.trash/
如果你不想等到下一轮定时任务,也可以随时手动执行一次:
./scripts/auto-clean-sessions.sh默认行为:
- 扫描
~/.codex/sessions/里的最新会话 - 检测到拒绝回复后立即改写并保存
- 默认保留
.bak备份
如果你想一次性扫全部会话,可以临时这样执行:
CODEX_PATCHER_AUTO_CLEAN_SCOPE=all ./scripts/auto-clean-sessions.sh项目内置的安全启动入口 python -m web.backend.main 默认禁止绑定 0.0.0.0 / ::。
也就是说,下面这种显式公网绑定会被拒绝:
python -c "from web.backend.main import run_server; run_server(host='0.0.0.0', port=47832)"若你在代码里调用 run_server(host="0.0.0.0"),也会被拒绝。
如果你确实要让内置安全启动入口监听公网地址,必须同时满足:
- 已配置 Web 管理密码
- 显式设置:
export CODEX_PATCHER_ALLOW_PUBLIC=1否则后端会直接拒绝启动。
注意:
uvicorn web.backend.main:app --host 0.0.0.0 ...会绕过run_server()这一层 Python 启动保护,所以不要这么用。这个项目的推荐启动方式始终是python -m web.backend.main或./scripts/start-web.sh。
- CORS 不再是
* - 默认只允许本机白名单来源:
http://127.0.0.1:3000http://localhost:3000http://127.0.0.1:8080http://localhost:8080http://127.0.0.1:47832http://localhost:47832
- WebSocket 会额外校验
Origin - 当启用了密码登录时,WebSocket 还会继续校验登录 cookie
如果你需要自定义来源白名单,可使用:
export CODEX_PATCHER_ALLOWED_ORIGINS='http://127.0.0.1:3000,http://127.0.0.1:47832'或写入 ~/.codex-patcher/config.json:
{
"web_allowed_origins": [
"http://127.0.0.1:3000",
"http://127.0.0.1:47832"
]
}# 本地完整启动
./scripts/start-web.sh
# 或手动启动
python -m uvicorn web.backend.main:app --host 127.0.0.1 --port 47832访问 http://127.0.0.1:47832
开发模式(前后端热更新):
./scripts/dev-web.sh访问 http://127.0.0.1:3000
# 预览模式(不修改文件)
codex-patcher --dry-run --show-content
# 清理最新会话
codex-patcher --latest
# 清理所有会话
codex-patcher --all
# 指定格式(claude / opencode)
codex-patcher --latest --format claude
codex-patcher --latest --format opencode
# 安装/卸载 Codex Profile 模式
codex-patcher --install-ctf-config
codex-patcher --uninstall-ctf-config
# 安装/卸载 Claude Code / OpenCode CTF
codex-patcher --install-claude-ctf
codex-patcher --install-opencode-ctf
# 执行一次自动清理(默认最新 Codex 会话)
./scripts/auto-clean-sessions.sh可以。
全局模式 的本质不是“Web 在后台常驻”,而是把默认配置写进 ~/.codex/config.toml,同时写入提示词文件:
~/.codex/config.toml~/.codex/prompts/security_mode.md
一旦写进去,后续你直接运行:
codex新的 Codex 会话就会默认带上这套安全测试上下文;这时不需要再启动 Web UI。
当前仓库里,Profile 模式 有现成 CLI:
codex-patcher --install-ctf-config但 全局模式 目前没有单独封装成 CLI 参数,只有:
- Web UI 按钮
- 或直接调用安装器
如果你不想启动 Web,可以在仓库根目录直接执行:
python -c "from codex_session_patcher.ctf_config import CTFConfigInstaller; ok, msg = CTFConfigInstaller().install_global(); print(msg); raise SystemExit(0 if ok else 1)"注意:
- 如果你的
~/.codex/config.toml顶层已经有自己的model_instructions_file(例如指向~/.codex/AGENTS.md),全局模式会和现有配置冲突 - 当前仓库会直接拒绝这种冲突写入,避免再制造
duplicate key - 这种场景请改用
Profile 模式,也就是codex -p ctf
禁用全局模式:
python -c "from codex_session_patcher.ctf_config import CTFConfigInstaller; ok, msg = CTFConfigInstaller().uninstall_global(); print(msg); raise SystemExit(0 if ok else 1)"生效方式:
- 执行一次上面的
install_global() - 之后直接运行
codex - 不再需要
codex -p ctf - 也不再需要启动 Web,除非你想用可视化界面管理或清理会话
如果你只是偶尔需要安全测试上下文,还是更建议用 Profile 模式;因为 全局模式 会影响所有新的 Codex 会话。
1. 安装 CTF Profile
codex-patcher --install-ctf-config
2. 使用 CTF Profile 启动(不影响普通会话)
codex -p ctf
3. 发送请求,若遇到拒绝 → 打开 Web UI 清理会话
4. resume 继续
codex resume
1. 启用全局模式
python -c "from codex_session_patcher.ctf_config import CTFConfigInstaller; ok, msg = CTFConfigInstaller().install_global(); print(msg); raise SystemExit(0 if ok else 1)"
2. 直接启动 Codex
codex
3. 所有新会话自动带安全测试上下文
4. 用完后禁用
python -c "from codex_session_patcher.ctf_config import CTFConfigInstaller; ok, msg = CTFConfigInstaller().uninstall_global(); print(msg); raise SystemExit(0 if ok else 1)"
1. Web UI → 提示词增强 → Claude Code → 启用
(创建 ~/.claude-ctf-workspace)
2. 从专用工作空间启动
cd ~/.claude-ctf-workspace && claude
3. 遇到拒绝 → Web UI 清理 → 继续对话
1. Web UI → 提示词增强 → OpenCode → 启用
(创建 ~/.opencode-ctf-workspace)
2. 从专用工作空间启动
cd ~/.opencode-ctf-workspace && opencode
3. 遇到拒绝 → Web UI 清理 → 继续对话
CLI 和 Web UI 共享配置文件 ~/.codex-patcher/config.json:
| 配置项 | 说明 | 默认值 |
|---|---|---|
mock_response |
默认替换文本 | 配合性回复 |
ai_enabled |
启用 AI 改写 | false |
ai_endpoint |
LLM API 地址 | — |
ai_key |
API Key | — |
ai_model |
模型名称 | — |
custom_keywords |
自定义拒绝检测关键词 | {} |
ctf_prompts |
各平台自定义 CTF 提示词 | 内置模板 |
ctf_templates |
用户保存的提示词模板 | {} |
web_password_hash |
Web 管理密码哈希 | — |
web_allowed_origins |
Web UI / WebSocket 允许的来源白名单 | 本机默认白名单 |
codex-session-patcher/
├── codex_session_patcher/ # 核心库
│ ├── auto_clean.py # 定时自动清理入口
│ ├── cli.py # CLI 入口
│ ├── core/
│ │ ├── formats.py # 多平台格式策略
│ │ ├── parser.py # 会话解析器(JSONL + SQLite)
│ │ ├── sqlite_adapter.py # OpenCode SQLite 适配器
│ │ ├── detector.py # 拒绝检测器
│ │ └── patcher.py # 清理逻辑
│ └── ctf_config/
│ ├── installer.py # CTF 注入安装器(三平台)
│ ├── templates.py # 内置提示词模板
│ └── status.py # 状态检测
├── web/
│ ├── backend/ # FastAPI 后端
│ │ ├── api.py # API 路由
│ │ ├── ai_service.py # AI 分析 & 改写
│ │ ├── prompt_rewriter.py # 提示词改写服务
│ │ └── schemas.py # 数据模型
│ └── frontend/ # Vue 3 + Naive UI
│ └── src/
│ ├── components/ # 页面组件
│ ├── stores/ # Pinia 状态管理
│ └── locales/ # i18n 国际化
├── tests/
├── scripts/
└── pyproject.toml
- 无法突破平台最高安全策略 — 对于明确违规的请求仍可能被拒绝
- 效果因版本而异 — 模型版本更新可能影响效果
- OpenCode 需从工作空间目录启动 — OpenCode 无 profile 机制,CTF 注入依赖工作空间
- 清理后需 resume — 会话清理后需手动 resume 继续上下文
如果这个项目对你有帮助,欢迎:
- ⭐ 点个 Star
- ☕ Buy me a coffee — Web UI 右上角有赞赏入口(微信 / USDC)
- 📢 关注微信公众号「钢之AI术师」获取更多 AI 工具技巧