新的 user turn 只问一次 Jev。tool continuation、重试和后续 model call 都复用这个已经固定的决定。
为什么是 turn-pinned
在 tool loop 里切模型,是最贵的路由方式。
新模型必须重建 prompt prefix。把模型固定在整个 tool loop 内,能把重建次数压到 turn 边界。
同一个模型、同一个 prefix:effort 可以移动,而不用支付 prefix 重建。这是日常 turn 最稳的省钱杠杆。
主流程
新 turn → Jev 一次 → 政策闸门 → 固定模型 → tool loop。
jev-codex 启动真实 Codex,并在 picker 里暴露虚拟模型
jev-auto。本地代理识别 fresh user turn,问一次
TypeSafe Jev,通过确定性 gate
后把真实模型写进请求。
这一轮剩下的部分保持稳定:同一个模型处理所有 tool continuation。下一个 user turn 才是下一次重新选择的机会。
打开完整图 ↗
控制回路
四个决策:选 → 闸 → 跑 → 学。
Jev 提议 model 和 effort;本地 policy 决定这次切换是否允许。价格 break-even、缓存 热度、session 状态和 upgrade trigger 都进入同一个确定性闸门。
turn 结束后,usage 更新缓存热度,失败可以触发升级,session 被持久化。compaction 会重置缓存证据和 effort provenance。
打开完整图 ↗
Guardrails
Jev 提议,代码决定。
比较目标模型的重建成本和剩余 turn 的每轮节省。
从响应 usage 读取 cached_tokens。冷缓存让降级更值得尝试。
超过 turn 预算后锁定、限制切换次数、切换后 cooldown,并在 resume 后恢复。
只在 failure、高复杂度或用户显式要求时升级,而不是 Jev 一说升级就切。
压缩后的 prefix 已经变了,缓存证据和 effort anchor 都要重置。
每轮 effort 默认封顶 high,并定义明确的 fallback。
取舍
先降 effort,再降 model;永远不要 per-call。
Per-call routing
- 每次 model call 都可能换模型。
- prefix cache 会被反复重建。
- tool loop 行为更不稳定。
- 最好情况:每次调用更贴合。
Turn-pinned + effort
- 一个 user turn 一个模型。
- tool loop 复用同一个模型。
- effort 可以用
configuration_update移动。 - 最好情况:更少重建,日常任务更少 reasoning。
CODEX APP
同一个 model,在 App 里也能选。
同一套本地 provider 也接入了 Codex app。运行 jev-codex setup-app,完全重启 app 后新建 task,在 model picker 里选择 Jev Auto Router。
证据
已经证明什么,还没证明什么。
turn 识别、tool-loop pinning、retry dedupe、价格 gate、session guard、effort anchor、compaction reset 和 session store。共 63 个测试。
真实 GPT 的 cache 命中率、质量非劣、output token 降幅和端到端延迟,还需要配对 评测。
快速开始
从源码构建,先跑一个小任务。
需要 Node.js 22+、已登录的 Codex CLI 和 TypeSafe Jev key。npm registry 版本还没有发布;当前使用源码安装。
git clone https://github.com/miniLV/Jev-Auto-Router.git
cd Jev-Auto-Router
npm ci
npm run build
export JEV_API_KEY="<your-typesafe-key>"
node bin/jev-codex.mjs
effort routing 默认关闭。想试新的控制回路,先在一个小任务上开启:
export JEV_CODEX_EFFORT_ROUTING=turn
export JEV_CODEX_EFFORT_CAP=high
node bin/jev-codex.mjs
Codex app 使用同一套本地 provider:
jev-codex setup-app