Codex 多模型接入指南:DeepSeek 默认 + 百炼 Qwen 子任务(含图片识别)
文章目录
Codex 多模型接入指南(DeepSeek 默认 + 百炼 Qwen 子任务)
在一台新机器上配置 Codex:DeepSeek 作为默认模型,阿里云百炼 qwen3.7-flash 作为可切换的子任务模型(支持图片识别)。本文档可整体转发,所有 API Key 均为占位符,请勿填写真实 Key 后再外发。
0. 方案原理(30 秒看懂)
- Codex 的一个会话同一时间只使用一个 provider(
base_url+ API Key + 协议)。模型选择器只切换模型、不切换 provider。 - 要使用第二个 provider,用官方支持的 profile(
codex -p qwen)或 嵌套 exec(codex -p qwen exec "任务")起独立会话/子进程,两者共用同一份配置。 - 图片分析直接传路径即可(
-i <图片路径>),Codex 内部自动转 base64,不需要手动处理。 - 本方案不需要 MCP server、不需要装额外 GUI 工具,适合直接转发传播。
1. 前置条件
- 已安装 Codex CLI(建议 ≥ 0.144)或 ChatGPT 桌面端,且至少运行过一次(
~/.codex目录存在)。 - 两个 API Key:
- DeepSeek:在 DeepSeek Platform 获取,
sk-开头。 - 百炼:在 阿里云百炼控制台 获取,
sk-开头(按量计费)。
- DeepSeek:在 DeepSeek Platform 获取,
2. 第一步:接入 DeepSeek(默认 provider)
推荐使用 DeepSeek 官方一键脚本(会自动生成 models.json 元数据和 [model_providers.deepseek] 配置,并备份原配置):
bash <(curl -fsSL https://cdn.deepseek.com/api-docs/codex-deepseek-setup.sh)
按菜单选择模型(1 = deepseek-v4-flash,2 = deepseek-v4-pro),输入 API Key。
手动配置方式见 DeepSeek 官方文档:接入 Codex | DeepSeek API Docs。
3. 第二步:接入百炼 qwen3.7-flash
方式 A:一键脚本(推荐)
把随本文档一起分发的 setup-codex-qwen.sh 拷贝到目标机器,然后:
bash setup-codex-qwen.sh # 交互输入百炼 API Key
bash setup-codex-qwen.sh "sk-你的百炼Key" # 或直接传 Key
脚本会:自动备份 → 追加 [model_providers.bailian] → 创建 ~/.codex/qwen.config.toml → 往 models.json 追加 qwen3.7-flash 条目,全部幂等可重跑。
方式 B:手动配置
1) 在 ~/.codex/config.toml 末尾追加:
[model_providers.bailian]
name = "Aliyun Bailian"
base_url = "https://dashscope.aliyuncs.com/compatible-mode/v1"
wire_api = "responses"
supports_websockets = false
experimental_bearer_token = "<你的百炼APIKey>"
base_url 二选一:
- 通用地址:
https://dashscope.aliyuncs.com/compatible-mode/v1 - 控制台给了 WorkspaceId 时:
https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/compatible-mode/v1
2) 新建 ~/.codex/qwen.config.toml:
model = "qwen3.7-flash"
model_provider = "bailian"
3) 在 ~/.codex/models.json 的 models 数组末尾追加(deepseek 的两个条目保留):
{
"slug": "qwen3.7-flash",
"display_name": "qwen3.7-flash",
"description": "DashScope model: qwen3.7-flash",
"default_reasoning_level": "medium",
"supported_reasoning_levels": [
{ "effort": "low", "description": "Fast responses with lighter reasoning" },
{ "effort": "medium", "description": "Greater reasoning depth for complex problems" },
{ "effort": "high", "description": "High reasoning depth for complex problems" }
],
"context_window": 1048576,
"max_context_window": 1048576,
"effective_context_window_percent": 95,
"supports_parallel_tool_calls": false,
"supports_image_detail_original": true,
"input_modalities": ["text", "image"],
"shell_type": "default",
"visibility": "list",
"supported_in_api": true,
"priority": 1,
"base_instructions": "",
"support_verbosity": false,
"supports_reasoning_summaries": false,
"experimental_supported_tools": [],
"truncation_policy": { "mode": "bytes", "limit": 10000 }
}
4. 验证
codex debug models # 应看到 deepseek-v4-flash / deepseek-v4-pro / qwen3.7-flash
codex -p qwen exec "回复 OK" # 能出结果即接入成功
5. 使用方法
| 场景 | 命令 |
|---|---|
| 切到 Qwen 交互会话 | codex -p qwen |
| 非交互子任务(嵌套 exec) | codex -p qwen exec "任务描述" |
| 图片识别 / UI/UX 分析 | codex -p qwen exec -i <图片路径> --skip-git-repo-check "详细描述这张图片" |
| 无人值守 | 追加 --ask-for-approval never 或 -c approval_policy=never |
| 在 DeepSeek 主会话里派 Qwen 子任务 | 直接要求 agent 执行上面的 codex -p qwen exec ...,结果写文件或 stdout 交接 |
在主会话里可以这样说:
用
codex -p qwen exec -i /path/to/screenshot.png --skip-git-repo-check "分析这张截图的 UI/UX 问题,重点看灰色遮罩层,结果写到 /tmp/review.md"起一个 Qwen 子任务。
6. 常见问题与避坑
| 现象 | 原因 | 解决 |
|---|---|---|
403 Model access denied | 百炼账号未开通该模型 / API Key 无调用权限 | 去百炼控制台开通模型、检查 Key 权限(RAM 子账号需授权) |
图片请求偶发 400(报 input_image / MultiModalItem 格式错) | Codex 走了 WebSocket,百炼 WebSocket 校验器不认 input_image | 确认 [model_providers.bailian] 里有 supports_websockets = false(必须走 HTTP) |
Not inside a trusted directory | 在非 git 目录执行 | 加 --skip-git-repo-check |
| 嵌套 exec 连不上 API | 父会话沙箱默认禁网 | 给命令放行网络,或父会话配置允许联网 |
| 桌面端模型选择器里选了 qwen 报错 | 选择器不切换 provider,请求发到了 deepseek | 只在 codex -p qwen / 嵌套 exec 里用 qwen |
| 改配置后桌面端无变化 | app-server 启动时缓存配置 | 完全退出并重启 ChatGPT 客户端 |
| 历史会话"消失" | Codex 按登录方式分组存会话 | 切回原配置/登录方式即可找回 |
7. 安全与备份
- API Key 明文写在
config.toml(experimental_bearer_token),不要把含真实 Key 的配置外发。 - 脚本和官方脚本都会自动备份:
~/.codex/backup-qwen/、~/.codex/backup-deepseek/;恢复即把备份复制回去。 - 模型元数据中的上下文窗口按 qwen3.7-flash 规格(1M)填写;若型号/规格变化,同步调整
context_window等字段。
附录:参考来源
附录:一键脚本 setup-codex-qwen.sh(可直接复制保存为脚本运行)
#!/usr/bin/env bash
# setup-codex-qwen.sh
# 在任意机器上为 Codex 追加「阿里云百炼 qwen3.7-flash」provider + profile + 模型元数据。
# 要求:已安装 Codex 且 ~/.codex 已存在(建议先跑 DeepSeek 官方一键脚本生成 models.json)。
# 本脚本不会删除/覆盖已有配置,运行前自动备份。
#
# 用法:
# bash setup-codex-qwen.sh # 交互输入百炼 API Key
# bash setup-codex-qwen.sh "sk-你的百炼Key" # 直接传 Key
# bash setup-codex-qwen.sh "sk-你的百炼Key" "https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/compatible-mode/v1"
#
# 也可用环境变量:BAILIAN_API_KEY、BAILIAN_BASE_URL
set -euo pipefail
KEY="${1:-${BAILIAN_API_KEY:-}}"
BASE_URL="${2:-${BAILIAN_BASE_URL:-https://dashscope.aliyuncs.com/compatible-mode/v1}}"
CODEX_HOME_DIR="${CODEX_HOME:-$HOME/.codex}"
CONFIG="$CODEX_HOME_DIR/config.toml"
MODELS="$CODEX_HOME_DIR/models.json"
PROFILE="$CODEX_HOME_DIR/qwen.config.toml"
if [ ! -f "$CONFIG" ]; then
echo "未找到 $CONFIG"
echo "请先安装并运行一次 Codex(或 ChatGPT 桌面端),再执行本脚本。"
exit 1
fi
if [ -z "$KEY" ]; then
read -r -s -p "请输入百炼 API Key(sk- 开头): " KEY
echo
fi
if [ -z "$KEY" ]; then
echo "未提供 API Key,已中止(未修改任何文件)。"
exit 1
fi
echo "==> 备份现有配置"
BACKUP_DIR="$CODEX_HOME_DIR/backup-qwen"
mkdir -p "$BACKUP_DIR"
TS=$(date +%Y%m%d-%H%M%S)
cp "$CONFIG" "$BACKUP_DIR/config.toml.$TS"
[ -f "$MODELS" ] && cp "$MODELS" "$BACKUP_DIR/models.json.$TS"
echo " 备份到 $BACKUP_DIR"
echo "==> 1/3 追加 [model_providers.bailian] 到 config.toml"
if grep -q '^\[model_providers\.bailian\]' "$CONFIG"; then
echo " 已存在 [model_providers.bailian],跳过(如需更新 Key/地址请手动编辑)"
else
cat >> "$CONFIG" <<EOF
[model_providers.bailian]
name = "Aliyun Bailian"
base_url = "${BASE_URL}"
wire_api = "responses"
supports_websockets = false
experimental_bearer_token = "$KEY"
EOF
echo " 已追加(base_url=${BASE_URL})"
fi
echo "==> 2/3 写入 qwen profile: $PROFILE"
printf 'model = "qwen3.7-flash"\nmodel_provider = "bailian"\n' > "$PROFILE"
echo " 完成"
echo "==> 3/3 往 models.json 追加 qwen3.7-flash"
if [ ! -f "$MODELS" ]; then
echo " 未找到 $MODELS"
echo " 请先运行 DeepSeek 官方脚本: bash <(curl -fsSL https://cdn.deepseek.com/api-docs/codex-deepseek-setup.sh)"
exit 1
fi
python3 - "$MODELS" <<'PY'
import json, sys
path = sys.argv[1]
with open(path, encoding="utf-8") as f:
data = json.load(f)
if any(m.get("slug") == "qwen3.7-flash" for m in data["models"]):
print(" 已包含 qwen3.7-flash,跳过")
else:
data["models"].append({
"slug": "qwen3.7-flash",
"display_name": "qwen3.7-flash",
"description": "DashScope model: qwen3.7-flash",
"default_reasoning_level": "medium",
"supported_reasoning_levels": [
{"effort": "low", "description": "Fast responses with lighter reasoning"},
{"effort": "medium", "description": "Greater reasoning depth for complex problems"},
{"effort": "high", "description": "High reasoning depth for complex problems"},
],
"context_window": 1048576,
"max_context_window": 1048576,
"effective_context_window_percent": 95,
"supports_parallel_tool_calls": False,
"supports_image_detail_original": True,
"input_modalities": ["text", "image"],
"shell_type": "default",
"visibility": "list",
"supported_in_api": True,
"priority": 1,
"base_instructions": "",
"support_verbosity": False,
"supports_reasoning_summaries": False,
"experimental_supported_tools": [],
"truncation_policy": {"mode": "bytes", "limit": 10000},
})
with open(path, "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
f.write("\n")
print(" 已追加 qwen3.7-flash")
PY
echo
echo "完成。接下来:"
echo " 1) 验证: codex debug models (应看到 deepseek-v4-flash / deepseek-v4-pro / qwen3.7-flash)"
echo " 2) 试跑: codex -p qwen exec \"回复 OK\""
echo " 3) 图片: codex -p qwen exec -i <图片路径> --skip-git-repo-check \"详细描述这张图片\""
echo " 4) 若在 ChatGPT 桌面端使用,重启客户端生效。"
使用截图

更多推荐




所有评论(0)