@gcoder1991/pi-jev-router

ReAct-boundary model and thinking-level routing for Pi using TypeSafe Jev

Packages

Package details

extension

Install @gcoder1991/pi-jev-router from npm and Pi will load the resources declared by the package manifest.

$ pi install npm:@gcoder1991/pi-jev-router
Package
@gcoder1991/pi-jev-router
Version
0.1.0
Published
Sep 22, 2026
Downloads
110/mo · 110/wk
Author
gcoder1991
License
MIT
Types
extension
Size
51.5 KB
Dependencies
0 dependencies · 2 peers
Pi manifest JSON
{
  "extensions": [
    "./index.ts"
  ]
}

Security note

Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.

README

Pi Jev Router

让 Pi 根据每轮任务需要自动降低思考强度,同时始终尊重用户最初选择的上限。

使用 TypeSafe Jev 做结构化路由判断,通过 Pi 的公开 Provider API 调用真实执行模型。Jev 只选择档位,不执行工具,也不生成任务答案。

  • 只降不升:不能超过用户提交任务时选择的思考等级。
  • 无需填写模型:默认读取当前模型,生成其支持的 low / medium / high 档位。
  • 每轮比较固定的用户基准,而不是上一轮自动档位。
  • 无可用的更低档位时,完全跳过 Jev。
  • 可配置概率差阈值、超时和文本共享范围。
  • 默认关闭,显式启用才发送路由文本;支持脱敏 Debug 日志。

实验性版本。 验证环境为 Pi 0.86.0、Node.js 24。已通过自动化回归和少量真实任务测试,但不是准确率、成本节省或跨版本兼容性的保证。本项目不隶属于 TypeSafe 或 Pi 官方。

安装

需要已安装 Pi,并配置至少一个可用执行模型。扩展会执行本机代码,安装前请审阅源码。

通过 GitHub

pi install git:github.com/gcoder1991/pi-jev-router

通过 npm

包名为 @gcoder1991/pi-jev-router,不是第三方同名的 pi-jev-router。以下命令需在该 scoped 包发布到 npm 后使用;若返回 404,请先用 GitHub 安装。

pi install npm:@gcoder1991/pi-jev-router

pi install 会登记到 Pi 用户配置。只想临时试用、不持久安装:

pi -e git:github.com/gcoder1991/pi-jev-router

也可以从源码运行:

git clone https://github.com/gcoder1991/pi-jev-router.git
cd pi-jev-router
npm install
pi -e ./index.ts

不要同时通过多个来源加载同一扩展。

快速开始

先用正常的 Pi 模型配置启动,不要直接选择虚拟入口 jev-router/auto。

export TYPESAFE_API_KEY='YOUR_TYPESAFE_API_KEY'
pi --jev-router

以上针对已经安装的扩展。源码试用时加 -e ./index.ts。

也可以不传 --jev-router,在 Pi 内手动启用:

/jev-router on

启用意味着允许将下文说明的有限文本发给 TypeSafe。不要将真实密钥写入代码、JSON 配置、截图或提交记录。

命令

命令 行为
/jev-router on 空闲时启用,交互模式会确认文本外发
/jev-router off 停止路由,保留最近实际执行档位,不取消任务
/jev-router status 查看用户选择、实际档位、入口和最近决策
/jev-router models 列出 Pi 可用的真实执行模型
Pi /model / 手动修改 thinking 暂停自动路由并取消旧请求;重新启用后采用新的用户选择

路由规则

用户提交任务 → 固定本任务的模型和思考等级基准
  → Pi 开始本轮执行请求,已有取消信号和完整本轮上下文
  → 本地过滤候选:必须比用户基准更低,且满足能力/scope约束
  → 没有降档候选:直接用用户基准,不请求 Jev
  → 有降档候选:Jev 对候选和用户基准评分
  → 最佳候选概率 − 用户基准概率 > switchMargin?
      是:使用候选
      否:使用用户基准(即使上一轮降过档,也回到基准)
  → 真实模型响应 → 工具执行 → 下一轮重新判断

默认 switchMargin = 0.15,表示严格超过 15 个百分点,不是相对增长 15%。恰好达到阈值不会降档。Jev 的 confidence 仅记录,不作为切换门槛;概率与 confidence 都不是任务成功率保证。

例如用户初始选择 high:

轮次 最佳候选 用户 high 概率 优势 实际执行
1 medium 65% 25% 40 个百分点 medium
2 medium 45% 35% 10 个百分点 回到 high
3 low 70% 15% 55 个百分点 low

这里恢复 high 不算越级升档:整个任务始终没有超过用户的初始上限。

等级顺序为 off < minimal < low < medium < high < xhigh < max,仅用于比较思考等级,不是不同模型的能力或价格排名。同等级的其他模型不算降档候选。显式跨模型配置需自行评估成本与兼容性。

默认档位

优先使用模型支持的 low / medium / high;这些等级均不可用时,使用其实际支持的其他非 off 等级。非推理模型仅有 off。

因此默认用户选 low 时,通常没有更低候选,会直接跳过路由;需要 minimal/off 时请显式配置,而且模型必须支持。

提示参考 OpenAI 的通用 reasoning 指南:low 也支持规划、工具、多步执行和常规编码,不被限定为机械操作。medium/high 用于额外推理有明确价值的工作。任务类别有重叠,必须结合实际评测,不能看到“读代码”就强制选 medium。

配置

配置文件只从显式 CLI 路径读取,不自动信任仓库里的 JSON。

创建 config.local.json:

{
  "timeoutMs": 10000,
  "switchMargin": 0.15,
  "shareToolResults": false,
  "maxToolChars": 16000,
  "maxStateChars": 48000
}
pi --jev-router --jev-router-config ./config.local.json
参数 默认值 说明
jevModel jev-1.13.0 TypeSafe 判断模型 ID
timeoutMs 1800 每次 Jev 请求上限,整数 100~10000 毫秒;不控制执行模型/工具耗时
switchMargin 0.15 候选概率相对用户基准的优势阈值,范围 0~1
shareToolResults false 共享工具正文及 read 来源信息;开启前评估数据外发政策
maxToolChars 16000 每条工具正文的截断预算,1200~100000 字符;截断标记额外占少量字符
maxStateChars 48000 用户目标和观察正文的总预算,2400~200000 字符;不含其他元数据和题目描述
profiles 省略 自动使用当前模型;显式配置需 1~16 项且目标组合不重复

只改超时也可以:{"timeoutMs": 10000}。测试中出现过超过 1.8 秒的 Jev 请求,调试时可放宽到 10 秒;默认值并未因此自动提高。

缺 key、超时、网络/HTTP 错误、非法响应和候选优势不足,都会使用用户本任务初始档位。用户取消则停止请求,不会按失败兜底继续执行。执行供应商自己的错误仍交给 Pi 处理。

修改配置后重启 Pi 最稳妥。/reload 会重新初始化扩展;若使用 Debug,原日志路径已存在时不会覆盖。旧版 minConfidence、minMargin 不再参与决策,请移除。

显式模型档位

通常不需要填写 profiles。需要自定义时,参考 config.example.json,将其中 YOUR_PROVIDER、YOUR_MODEL 替换为 /jev-router models 列出的真实 ID。

{
  "switchMargin": 0.15,
  "profiles": [
    {
      "id": "economical",
      "provider": "YOUR_PROVIDER",
      "model": "YOUR_MODEL",
      "thinking": "low",
      "description": "Efficient reasoning for routine planning, tool use and execution-oriented coding."
    }
  ]
}

若用户基准不在候选列表内,会以唯一的 __user_selected 选项参与评分,不会将其概率假定为零。空的 profiles: [] 或非法配置会保持关闭,不静默回退。自定义描述不会被自动档位提示覆盖。

隐私与实际 API 输入

固定路由端点为 POST https://api.typesafe.ai/v1/systemone。请求包含 model、state、questions.route。

state 包含:

  • goal:最近用户目标,约最多 2400 字符,不在 observations 中重复。
  • userSelected:本任务固定的用户模型和思考等级。
  • current:上一轮实际执行档位,与用户基准分开。
  • nextStep:明确标记下一步尚未生成,不伪造下一步计划。
  • observations:最多 8 条历史观察,工具调用和结果通过 ID 关联。
  • evidenceLimits:共享设置、截断和遗漏说明。
  • routingPolicy:降档模式、用户上限和切换阈值。

工具正文默认不发送。开启 shareToolResults 后,共享文本正文,并允许内置 read 的路径、offset、limit 白名单字段。不发送系统提示词、隐藏思考、图片数据、工具 details、shell 命令或任意其他工具参数。

脱敏不是完整 DLP。 用户文本、助手正文和工具结果仍可能包含商业秘密、个人信息或复制的敏感数据。候选描述也会发送。不要在不允许外发的项目启用;过滤字段不等于防提示注入。

正文截断优先保留最新证据,过长文本保留首尾并标记缺失;这不是语义摘要,可能遗漏文件中间逻辑。完整本轮上下文只转发给实际执行模型。

Debug 日志

mkdir -p debug
pi --jev-router --jev-router-config ./config.local.json \
  --jev-router-debug "./debug/run-$(date +%Y%m%d-%H%M%S).jsonl"

只有显式指定路径才记录正文。目录必须已存在,文件必须是新文件,以 0600 创建。不会覆盖已有文件或跟随已有符号链接。日志写入失败会停止记录,不阻塞任务;没有自动轮转。

事件 内容
task-baseline 任务开始时的用户基准
jev-input 实际路由请求的脱敏副本,不包含认证头
jev-http HTTP 状态
jev-choice 概率分布、confidence、基准概率、优势和阈值
decision 采用/回退/跳过原因、耗时、输入 token 等
execution 实际开始返回非错误事件的执行档位,不只是建议
request-error 取消或分派失败的类别

使用 requestId 关联请求、选择和执行。日志仍含任务正文,不要提交到公开仓库。项目忽略 debug/、*.jsonl、本地配置和环境文件,npm 包另外采用文件白名单。

Pi 集成与限制

使用公开 API:registerProvider、modelRegistry.streamSimple、扩展事件和会话审计。没有修改 Pi 核心。

  • Pi 模型栏显示 jev-router/auto;状态栏和 /jev-router status 显示实际执行档位。
  • 启用时将入口切换为虚拟 Provider;逐轮只在真实请求入口选择目标,不在 before_agent_start 等待网络。
  • 真实 provider/model、usage、thinking 签名和工具 ID 原样返回;Jev usage 单独记审计,不并入主模型统计。
  • 支持取消、scope、图片能力和保守上下文窗口过滤;虚拟入口使用配置模型的最小窗口,可能提前压缩。
  • 主请求与维护请求通过 options.signal === ctx.signal 区分;这依赖当前 Pi 行为,并非跨版本稳定性保证。升级后先跑测试。
  • 默认模型设置不持久修改,但虚拟入口会出现在会话历史。内存中的用户基准/最后执行档位不完整跨重启恢复;从正常真实模型启动最可靠。
  • 手动选择优先;排队/steering 消息沿用当前 agent run 的基准,不被当成一次新的手动档位选择。
  • 不控制子 Agent,不能撤销已发生的工具副作用。Pi 重试请求时可能重新调用 Jev。
  • 第三方 provider 专属 hooks、OAuth、跨供应商上下文迁移需单独测试;认证仍由 Pi 处理,不把虚拟入口凭据转发给真实供应商。
  • 每次有效路由多一次 API 请求和等待,跨模型切换可能损失缓存,不能保证端到端省钱或提速。

开发与验证

git clone https://github.com/gcoder1991/pi-jev-router.git
cd pi-jev-router
npm install
npm run check
npm test
npm pack --dry-run

测试使用真实 Pi SDK / agent loop,执行 provider 和 Jev 网络请求为 mock,使用临时目录和内存凭据,不调用付费 API。覆盖取消、手动选择、图片、概率差边界、固定用户基准、只降不升、无低档跳过、文本隐私和 Debug。

开发中另做过少量真实任务验证:常规单文件核查选 low,条件概率题选 medium,异步竞态和约束优化题保留 high。概率答案由精确分数计算核对,优化结果由枚举核对,并发反例及修复由调度脚本核对。这些是有限样本,不是系统性基准或质量保证;原始本地会话日志不公开发布。

参考与许可

MIT,见 LICENSE。