最近想在 Ubuntu 服务器上使用 Codex,并接入小米 MiMo 模型。我的需求比较明确:
- 已经通过 npm 安装好了 Codex;
- 服务器是 Ubuntu,shell 是 zsh;
- 没有 sudo 权限;
- 不想把 API Key 直接写进
~/.zshrc; - 希望 key 存放在单独的隐藏目录中;
- 希望在 terminal 中输入不同命令时,分别使用不同的 MiMo 服务;
- 希望进入 Codex 后可以用
/model切换 MiMo 模型。
最终我希望实现的效果是:
codex-mimo
使用 MiMo Token Plan,也就是读取 tp- 开头的 Token Plan key。
codex-mimo-api
使用 MiMo 按量 API,也就是读取 sk- 开头的 MiMo API key。
进入 Codex 后,还可以输入:
/model
在以下模型之间切换:
mimo-v2.5-pro-ultraspeed
mimo-v2.5-pro
mimo-v2.5
需要注意的是,mimo-v2.5-pro-ultraspeed 是 MiMo API 里的模型。如果在 Token Plan 下切换到这个模型,而 Token Plan 本身不支持它,那么请求可能会失败。失败后再用 /model 切回 mimo-v2.5-pro 或 mimo-v2.5 即可。
下面是完整配置过程。
一、前提:确认 Codex 已安装
由于我已经通过 npm 安装好了 Codex,所以这里只做检查:
which codex
codex --version
如果能看到 Codex 的路径和版本号,说明 Codex 已经可用。
二、创建 .secrets 文件夹保存 key
我不希望把 key 写到 ~/.zshrc,也不希望每次在终端里手动 export,所以选择把 key 存在:
~/.secrets/mimo.key
~/.secrets/mimo_api.key
其中:
~/.secrets/mimo.key # MiMo Token Plan,tp- 开头
~/.secrets/mimo_api.key # MiMo 按量 API,sk- 开头
先创建目录:
mkdir -p ~/.secrets
chmod 700 ~/.secrets
三、隐藏输入 key,避免出目前终端和 history 中
1. 保存 MiMo Token Plan key
执行下面命令:
print -n "Paste MiMo Token Plan key, tp-..., hidden: "
stty -echo
read -r MIMO_TP_KEY
stty echo
print
printf '%s
' "$MIMO_TP_KEY" > ~/.secrets/mimo.key
unset MIMO_TP_KEY
chmod 600 ~/.secrets/mimo.key
粘贴 tp- 开头的 Token Plan key。输入时终端不会显示内容。
2. 保存 MiMo API key
执行下面命令:
print -n "Paste MiMo API key, sk-..., hidden: "
stty -echo
read -r MIMO_API_KEY_TMP
stty echo
print
printf '%s
' "$MIMO_API_KEY_TMP" > ~/.secrets/mimo_api.key
unset MIMO_API_KEY_TMP
chmod 600 ~/.secrets/mimo_api.key
粘贴 sk- 开头的 MiMo API key。
检查文件是否存在,但不要打印 key 内容:
ls -l ~/.secrets/mimo.key ~/.secrets/mimo_api.key
正常情况下,权限应该类似:
-rw------- 1 user user ... /home/user/.secrets/mimo.key
-rw------- 1 user user ... /home/user/.secrets/mimo_api.key
四、创建 Codex 配置目录
mkdir -p ~/.codex/model-catalogs ~/.local/bin
这里会用到三个位置:
~/.codex/ # Codex 配置目录
~/.codex/model-catalogs/ # 模型列表配置
~/.local/bin/ # 自定义命令
五、创建统一模型列表,支持 /model 切换
创建模型 catalog:
cat > ~/.codex/model-catalogs/model-catalogs.json <<'EOF'
{
"models": [
{
"slug": "mimo-v2.5-pro-ultraspeed",
"display_name": "mimo-v2.5-pro-ultraspeed",
"description": "MiMo-v2.5-Pro-Ultraspeed",
"default_reasoning_level": "high",
"supported_reasoning_levels": [
{
"effort": "none",
"description": "Disable Thinking"
},
{
"effort": "high",
"description": "Enabled Thinking"
}
],
"shell_type": "shell_command",
"visibility": "list",
"supported_in_api": true,
"priority": 0,
"base_instructions": "You are MiMo, an AI assistant developed by Xiaomi. Today's date: {date} {week}. Your knowledge cutoff date is December 2024.",
"supports_reasoning_summaries": true,
"default_reasoning_summary": "none",
"support_verbosity": false,
"truncation_policy": {
"mode": "bytes",
"limit": 10000
},
"supports_parallel_tool_calls": false,
"supports_image_detail_original": false,
"context_window": 1048576,
"max_context_window": 1048576,
"effective_context_window_percent": 95,
"experimental_supported_tools": [],
"input_modalities": ["text"],
"supports_search_tool": false
},
{
"slug": "mimo-v2.5-pro",
"display_name": "mimo-v2.5-pro",
"description": "MiMo-v2.5-Pro",
"default_reasoning_level": "high",
"supported_reasoning_levels": [
{
"effort": "none",
"description": "Disable Thinking"
},
{
"effort": "high",
"description": "Enabled Thinking"
}
],
"shell_type": "shell_command",
"visibility": "list",
"supported_in_api": true,
"priority": 1,
"base_instructions": "You are MiMo, an AI assistant developed by Xiaomi. Today's date: {date} {week}. Your knowledge cutoff date is December 2024.",
"supports_reasoning_summaries": true,
"default_reasoning_summary": "none",
"support_verbosity": false,
"truncation_policy": {
"mode": "bytes",
"limit": 10000
},
"supports_parallel_tool_calls": false,
"supports_image_detail_original": false,
"context_window": 1048576,
"max_context_window": 1048576,
"effective_context_window_percent": 95,
"experimental_supported_tools": [],
"input_modalities": ["text"],
"supports_search_tool": false
},
{
"slug": "mimo-v2.5",
"display_name": "mimo-v2.5",
"description": "MiMo-v2.5",
"default_reasoning_level": "high",
"supported_reasoning_levels": [
{
"effort": "none",
"description": "Disable Thinking"
},
{
"effort": "high",
"description": "Enabled Thinking"
}
],
"shell_type": "shell_command",
"visibility": "list",
"supported_in_api": true,
"priority": 2,
"base_instructions": "You are MiMo, an AI assistant developed by Xiaomi. Today's date: {date} {week}. Your knowledge cutoff date is December 2024.",
"supports_reasoning_summaries": true,
"default_reasoning_summary": "none",
"support_verbosity": false,
"truncation_policy": {
"mode": "bytes",
"limit": 10000
},
"supports_parallel_tool_calls": false,
"supports_image_detail_original": true,
"context_window": 1048576,
"max_context_window": 1048576,
"effective_context_window_percent": 95,
"experimental_supported_tools": [],
"input_modalities": ["text", "image"],
"supports_search_tool": false
}
]
}
EOF
这里最重大的是每个模型的 slug,例如:
"slug": "mimo-v2.5-pro-ultraspeed"
slug 需要和后端 API 支持的模型名称一致。
六、创建 MiMo Token Plan 的 Codex profile
执行:
CATALOG_PATH="$HOME/.codex/model-catalogs/model-catalogs.json"
cat > ~/.codex/mimo-tokenplan.config.toml <
这里的:
env_key = "MIMO_TOKEN_PLAN_KEY"
不是把 key 写进配置文件,而是告知 Codex:启动时去环境变量 MIMO_TOKEN_PLAN_KEY 中读取 key。
这个环境变量后面会由 codex-mimo 启动脚本临时生成,不会写进 ~/.zshrc。
如果你的 Token Plan 控制台给了专属 Base URL,就把这一行:
base_url = "https://token-plan-cn.xiaomimimo.com/v1"
替换成你的专属地址。
七、创建 MiMo 按量 API 的 Codex profile
执行:
CATALOG_PATH="$HOME/.codex/model-catalogs/model-catalogs.json"
cat > ~/.codex/mimo-api.config.toml <
这里默认模型设置成:
model = "mimo-v2.5-pro-ultraspeed"
也就是说,执行:
codex-mimo-api
默认会使用 MiMo API 的 mimo-v2.5-pro-ultraspeed 模型。
如果后续想切换成其他模型,可以在 Codex 里输入:
/model
再选择其他模型。
八、创建 codex-mimo 启动脚本
这个命令用于启动 MiMo Token Plan。
cat > ~/.local/bin/codex-mimo <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
set +x
KEY_FILE="$HOME/.secrets/mimo.key"
if [ ! -r "$KEY_FILE" ]; then
echo "Error: cannot read $KEY_FILE"
echo "Please create it and put your MiMo Token Plan key in it."
exit 1
fi
MIMO_TOKEN_PLAN_KEY="$(tr -d '
' < "$KEY_FILE")"
if [ -z "$MIMO_TOKEN_PLAN_KEY" ]; then
echo "Error: $KEY_FILE is empty"
exit 1
fi
export MIMO_TOKEN_PLAN_KEY
exec codex --profile mimo-tokenplan "$@"
EOF
chmod +x ~/.local/bin/codex-mimo
这个脚本做了几件事:
- 从
~/.secrets/mimo.key读取 Token Plan key; - 去掉换行符;
- 临时设置环境变量
MIMO_TOKEN_PLAN_KEY; - 执行:
codex --profile mimo-tokenplan
key 不会写进 .zshrc,也不会写进 Codex 配置文件。
九、创建 codex-mimo-api 启动脚本
这个命令用于启动 MiMo 按量 API。
cat > ~/.local/bin/codex-mimo-api <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
set +x
KEY_FILE="$HOME/.secrets/mimo_api.key"
if [ ! -r "$KEY_FILE" ]; then
echo "Error: cannot read $KEY_FILE"
echo "Please create it and put your MiMo API key in it."
exit 1
fi
MIMO_API_PAYG_KEY="$(tr -d '
' < "$KEY_FILE")"
if [ -z "$MIMO_API_PAYG_KEY" ]; then
echo "Error: $KEY_FILE is empty"
exit 1
fi
export MIMO_API_PAYG_KEY
exec codex --profile mimo-api "$@"
EOF
chmod +x ~/.local/bin/codex-mimo-api
这个脚本会从:
~/.secrets/mimo_api.key
读取 sk- 开头的 MiMo API key,然后启动:
codex --profile mimo-api
十、确保 zsh 能找到这两个命令
检查 ~/.local/bin 是否在 PATH 中:
echo $PATH | tr ':' '
' | grep "$HOME/.local/bin"
如果没有输出,执行:
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
rehash
这里写进 ~/.zshrc 的只有 PATH,不包含任何 key。
十一、检查文件结构
执行:
ls -l ~/.secrets
ls -l ~/.codex
ls -l ~/.codex/model-catalogs
ls -l ~/.local/bin/codex-mimo ~/.local/bin/codex-mimo-api
再检查两个命令是否能找到:
which codex-mimo
which codex-mimo-api
正常应该看到类似:
/home/你的用户名/.local/bin/codex-mimo
/home/你的用户名/.local/bin/codex-mimo-api
十二、启动测试
1. 测试 MiMo Token Plan
执行:
codex-mimo
进入 Codex 后,输入:
/status
查看当前 provider 和 model。
然后输入:
/model
应该可以看到模型列表:
mimo-v2.5-pro-ultraspeed
mimo-v2.5-pro
mimo-v2.5
需要注意:Token Plan 下如果选择 mimo-v2.5-pro-ultraspeed,而你的 Token Plan 不支持它,请求可能会失败。再用 /model 切回:
mimo-v2.5-pro
或:
mimo-v2.5
即可。
2. 测试 MiMo 按量 API
执行:
codex-mimo-api
进入 Codex 后输入:
/status
默认模型应该是:
mimo-v2.5-pro-ultraspeed
也可以输入:
/model
切换到:
mimo-v2.5-pro
mimo-v2.5
十三、日常使用方式
如果想用 Token Plan:
codex-mimo
如果想用 MiMo 按量 API:
codex-mimo-api
也可以直接带任务启动:
codex-mimo "帮我检查当前项目结构"
或者:
codex-mimo-api "帮我优化这个 Python 脚本"
十四、最终配置结构
最后的文件结构大致是:
~/.secrets/
mimo.key
mimo_api.key
~/.codex/
mimo-tokenplan.config.toml
mimo-api.config.toml
model-catalogs/
model-catalogs.json
~/.local/bin/
codex-mimo
codex-mimo-api
其中 key 只保存在:
~/.secrets/mimo.key
~/.secrets/mimo_api.key
不会出目前:
~/.zshrc
~/.codex/mimo-tokenplan.config.toml
~/.codex/mimo-api.config.toml
~/.local/bin/codex-mimo
~/.local/bin/codex-mimo-api
Codex 启动时,wrapper 脚本会临时读取 key,并导出给 Codex 子进程使用。退出 Codex 后,这个临时环境变量也会随进程结束。
十五、常见问题
1. codex-mimo: command not found
大致率是 ~/.local/bin 没有加入 PATH。
执行:
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
rehash
然后再检查:
which codex-mimo
2. 提示读取不到 key 文件
检查文件是否存在:
ls -l ~/.secrets/mimo.key
ls -l ~/.secrets/mimo_api.key
如果不存在,就重新创建。
3. Token Plan 认证失败
优先检查两点:
第一,~/.secrets/mimo.key 里是否是 tp- 开头的 Token Plan key;
第二, 里的
~/.codex/mimo-tokenplan.config.tomlbase_url 是否需要改成你的 Token Plan 控制台专属 Base URL。
4. MiMo API 认证失败
检查:
ls -l ~/.secrets/mimo_api.key
确认里面保存的是 sk- 开头的 MiMo API key。
5. /model 切换到 mimo-v2.5-pro-ultraspeed 后失败
这一般说明当前服务不支持该模型。例如,在 Token Plan 下切换到 API-only 模型,可能会失败。
解决方法是在 Codex 中重新输入:
/model
然后切回:
mimo-v2.5-pro
或:
mimo-v2.5
总结
这套方案的核心思路是:
- 用
~/.secrets/保存 key; - 用
~/.codex/*.config.toml区分 MiMo Token Plan 和 MiMo API; - 用
~/.local/bin/codex-mimo和~/.local/bin/codex-mimo-api做启动命令; - 用统一的
model-catalogs.json支持 Codex 内部/model切换模型; - 不把 key 写进
.zshrc,也不把 key 写进 Codex 配置文件。
最终使用起来很简单:
codex-mimo
走 MiMo Token Plan。
codex-mimo-api
走 MiMo 按量 API。
进入 Codex 后:
/model
即可切换 MiMo 模型。