jev-harness-lab
用 TypeSafe Jev(System One 决策模型)做 agent harness 工程实验的技术仓库:评测框架、基准报告、可运行的集成工具(MCP server、skill router)。
安装
① MCP server(给 agent 加三个 Jev 工具)
用 uv 一条命令,无需克隆:
# 从 PyPI(发布后可用)
uvx jev-mcp
# 直接从 GitHub 源码运行
uvx --from git+https://github.com/Aitejiu/jev-harness-lab jev-mcp
配置到任意 MCP 客户端(opencode / Claude Desktop 等):
{
"mcp": {
"jev": {
"type": "local",
"command": ["uvx", "--from", "git+https://github.com/Aitejiu/jev-harness-lab", "jev-mcp"],
"environment": { "TYPESAFE_API_KEY": "your-key" },
"enabled": true
}
}
}
提供的工具:
| 工具 | 作用 |
|---|---|
scan_injection |
扫描工具/网页/邮件输出里的注入指令,返回 block / review / pass |
bash_risk |
shell 命令四维风险打分(破坏性 / 触密 / 外发 / 不可逆),返回 deny / review / allow |
rank_candidates |
候选片段按相关性打分排序(RAG 精排) |
MCP Registry:mcp-name: io.github.aitejiu/jev(server.json 随仓库提供)
② Agent skill(让 Jev 帮主模型选 skill)
npx skills add Aitejiu/jev-harness-lab --skill jev-skill-router
用 Jev 把任务路由到已安装的 skill,并且只加载选中那一个的完整指令,避免把整个 skill 目录塞进主模型上下文。技能页:https://www.skills.sh/aitejiu/jev-harness-lab/jev-skill-router
环境变量
两个集成都需要:
export TYPESAFE_API_KEY=<your-key>
目录
.
├── examples/ # 最小可运行示例(三原语、state、路由、护栏、抽取)
├── eval/ # 评测框架:11 个基准脚本 + 24 份报告 + 原始结果
│ └── datasets/ # 手工构造的数据集(如 130 条 shell 命令风险集)
├── integrations/
│ └── opencode/ # opencode 插件:jev_route_skill(skill 门控)
├── skills/
│ └── jev-skill-router/ # 可安装的 agent skill(SKILL.md + 独立脚本,skills.sh)
├── docs/
│ └── REPORT.md # 技术评估报告(数据与结论)
├── src/jev_mcp/ # MCP server 包(PyPI: jev-mcp)
├── pyproject.toml # Python 打包配置(console script: jev-mcp)
├── server.json # MCP Registry 元数据(mcp-name: io.github.aitejiu/jev)
├── mcp_server.py # 兼容 shim:不安装也可 python mcp_server.py 运行
├── skill_router.py # 本地 skill 目录路由(Jev 选择并加载 SKILL.md)
├── common.py # .env 加载 + 共享 client
└── requirements.txt
快速开始
uv venv --python 3.12 .venv
uv pip install -r requirements.txt
echo "TYPESAFE_API_KEY=<your-key>" > .env
# 最小示例
.venv/bin/python examples/quickstart.py
.venv/bin/python examples/noul.py # criteria 对判断的影响
.venv/bin/python examples/routing.py # 阈值路由
# 跑评测(示例:skill router,501 个真实 skills)
.venv/bin/python eval/run_skillretbench.py --variant hybrid --per-setting 100
评测结果缓存在 eval/results/*.jsonl(已随仓库提交,可 --report-only 直接出报告);原始数据集在 eval/data/,需按 eval/README.md 的说明下载(已 gitignore)。
集成工具
MCP server
.venv/bin/python mcp_server.py # stdio
| 工具 | 作用 | 输入 → 输出 |
|---|---|---|
scan_injection |
扫描工具输出中的注入指令 | tool_output → action(block/review/pass) + 概率 |
bash_risk |
shell 命令四维风险打分 | command → action(deny/review/allow) + 破坏性/触密/外发/不可逆分数 |
rank_candidates |
候选片段相关性重排 | query + candidates(≤10) → 排序后的 index/score |
接入 opencode 的配置示例(项目 .opencode/opencode.json):
{
"mcp": {
"jev": {
"type": "local",
"command": ["/absolute/path/to/jev-harness-lab/.venv/bin/python", "/absolute/path/to/jev-harness-lab/mcp_server.py"],
"enabled": true
}
}
}
Skill router
.venv/bin/python skill_router.py --query "帮我查飞书文档" --load
opencode 插件在 integrations/opencode/jev-skill-router.ts:注册 jev_route_skill(task) 工具,请求进来时用 Jev 从本地 skill 目录选出最合适的一个并返回其完整指令。参考做法是配合 agent.build.tools.skill = false 关闭内置 skill 工具,使主模型上下文不再携带整个 skill 目录。
主要基准结果(详见 docs/REPORT.md)
| 任务 | 数据 | 结果 |
|---|---|---|
| 间接注入检测 | InjecAgent 1,105 条 | 阈值 0.10:P/R 100%,良性误报 0% |
| 检索重排 | BEIR SciFact 900 对 | BM25 → Jev:MRR 0.622 → 0.843,Hit@1 50% → 78.3% |
| 意图分类 | SNIPS / Banking77 | 7 类 97.9% / 77 类 80.3% |
| 工具目录路由 | MetaTool 199 工具 | 相似干扰 k=5 96.5% |
| Skill router | SkillRetBench 501 库 | hybrid 架构 R@1 75.8%(最强基线 38.0%) |
| 命令风险门控 | 自建 130 条 | 危险拦截 100%、正常放行 98.2% |
| 模型难度路由 | RouterBench | 51%(无信号,负结果) |
| 轨迹失败归因 | Who&When 1,403 步 | AUROC 0.56(负结果) |
总计约 22,500 次 API 调用、52.2M input tokens、$2.19。
说明
- 所有 benchmark 使用公开数据集;原始结果 JSONL 已提交,报告可复现。
- 部分官方基线为模拟实现(在报告中已标注)。
- Jev 已知限制:
choice最多 255 个选项、仅文本输入、state+questions 共享约 32k tokens、英语为主。 - 版本:
jev-1.13.0,模型升级后建议重新评测。
Release files for jev-mcp 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| jev_mcp-0.1.0.tar.gz | 4.9 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| jev_mcp-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 4.9 MB
Release files / jev_mcp-0.1.0.tar.gz
| Download URL | jev_mcp-0.1.0.tar.gz |
|---|---|
| Size | 4.9 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d56202dc746df62b5dc622ded48d6b9f2211e7c195bc824f9c921b73b4a15b55
|
|
BLAKE2b-256 checksum How to use checksums |
a1cadc4fe33a80a9f6b696f3721886de3817f96636b96035fd531836b631cd4d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / jev_mcp-0.1.0-py3-none-any.whl
| Download URL | jev_mcp-0.1.0-py3-none-any.whl |
|---|---|
| Size | 7.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a503a08e27c40d3adfa1a0d6015aced734e9372e7270a79e389a7a5e18725461
|
|
BLAKE2b-256 checksum How to use checksums |
9d76cfc357ad8e6b6cd9211f9b6de28cf35d4842ac1054a678eb082ec8ae9149
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|