工具一多,选择就漂
新增工具或改描述后,原来选对的工具开始被别的工具抢走,等用户报错才发现。
工具和 skill 越装越多,模型开始选错、或者干脆不调用。mf 扫描工具定义,静态检查描述、参数与边界;安装时毫秒级门禁,需要证据时再跑真实模型评分卡。
# 扫工具与 skill
$ npx -y modelfunction-cli@0.5.3 scan --root ./agent
✓ 12 tools · 3 skills · MCP stdio
# 静态体检:lint + 族边界 + 覆盖 + 挂载
$ mf audit --suite mf.suite.json
✓ 不调用模型 · 无网络 · 可转发报告
! 2 个族需要补选择边界
# 安装时门禁:一包新能力 × 已装能力
$ mf check --manifests pack.json --installed installed.json
warn gitcrawl × tag-duplicate-prs-issues
模型不会告诉你“我分不清这两个工具”,它只会在用户面前选错,或者干脆不调用。
新增工具或改描述后,原来选对的工具开始被别的工具抢走,等用户报错才发现。
description 写得太泛或和已有能力重叠,模型只能靠字面猜,最后没人触发。
会话 ID、租户 ID、任务 ID 只能由系统注入;模型不知道从哪来,可能直接放弃调用。
想换更便宜的模型,却不知道 function calling 会不会退化;没有复核过的用例,复现全靠回忆。
安装路径上永远不调模型。静态检查零成本、毫秒级;真实模型只留给需要证据的评分卡。
读 function.json、OpenAPI、MCP 配置和 SKILL.md;需要时连 MCP server 拉真实 tools/list。
$ mf scan --root . --probe
✓ 12 tools · 3 skills
✓ mcp: filesystem (8)
lint、覆盖、族内边界和挂载一次出报告;新能力可以和已装能力做增量门禁。
$ mf audit --suite mf.suite.json
✓ lint · boundaries · coverage
$ mf check --manifests pack.json
warn: 1 对互抢
用你或编码 Agent 写的复核用例,跑选择、参数、通过率;换版本前 compare 一次。
select 92%
args 100%
pass 92%
p50 2.1s · ¥0.0009/次
不评测聊天、不做托管、不替你调用线上工具;把“选不选得到、填不填得对”测清楚。
function.json、OpenAPI、MCP(stdio / streamable HTTP)、SKILL.md、Python @tool、TS zod/TypeBox,或运行时导出的数组。
新装一个或一包能力时,与已装能力做静态比较:混淆、必填来源、schema 错误。advisory 不阻断,纯静态毫秒级。
描述、命名、必填、参数说明和工具对边界;skills 走同一套检查。重复规则自动合并,报告可直接转发。
选择准确率、参数准确率、通过率,加上延迟与单次成本;同一套用例横向比,不靠榜单拍脑袋。
工具、用例、套件的内容指纹写进评分卡;定义变了就明确告诉你“不可直接比较”,不拿噪声当结论。
混淆矩阵告诉你“被谁抢走”;留一法 ablate 告诉你这个工具是干扰、帮助还是中性。
手写脚本能跑,通用框架能调模型;但工具定义、安装门禁、可比性和干扰归因还得自己搭。
| 能力 | 手写脚本 | 通用 eval 框架 | ModelFunction |
|---|---|---|---|
| 工具 / skill 定义来源 | 手抄 | 手抄或导 JSON | 自动扫描 function.json / OpenAPI / MCP / SKILL.md |
| 安装时质量门禁 | 无 | 通常不在安装路径 | check() / checkMany,纯静态、毫秒级 |
| 用例校验与复核 | 自己写 | 自己写 | mf case add 校验 + 未复核不计分 |
| 能否跨版本比较 | 自己保证 | 需自己保证一致 | 内容指纹判定可比性 |
| 工具间干扰归因 | 无 | 需自己实现 | 混淆矩阵 + 留一法 ablate |
| 数据去哪了 | 自己保管 | 多为云端 | 本地运行,零上传 |
基于 2026-11 公开资料与产品定位的简化对比,具体能力以各家为准。
通用评测框架解决“怎么调模型、怎么写断言”;mf 只解决 Agent 工具这一层:自动发现工具定义、按工具组织用例、算选择/参数/执行、比较版本、归因工具间干扰。安装门禁是现有框架之外的一道工具质量检查。
不会。check() / checkMany 是同步纯静态函数:不调模型、不联网、不读文件、不写状态。真实 100 个能力约 40ms;输入形状不对会直接报错,不会静默放过。
CLI 全本地运行,无遥测、无服务端地址。唯一出站是你配置的模型端点和你自己的 MCP server。评分卡会把用例输入与工具描述发给被测模型供应商——敏感数据请选境内供应商或本地模型;Key 只从环境变量或本地 credentials 读取。
模型:任何 OpenAI 兼容接口,内置 DeepSeek、Qwen、GLM、Kimi、硅基流动、Ollama 适配。工具:function.json、OpenAPI、MCP(stdio / streamable HTTP)、SKILL.md、Python @tool、TS zod/TypeBox,也支持运行时导出的工具数组。
可以。用例由你或你的编码 Agent 撰写,mf case add 会校验结构与覆盖,并默认标记“未复核”;未复核用例不计入正式分。写用例的规则模板在包内 skills/mf-cases/SKILL.md。
CLI 已发布到 npm,MIT 开源、本地免费:npx -y modelfunction-cli@0.5.3 --version。云端历史与团队基线尚未开放;内网平台如果需要私有部署或参考集成,直接发邮件聊。
我们最想看到的不是“功能列表是否完整”,而是你的真实工具集里有没有选错、有没有装了不用的 skill、有没有模型拿不到的必填参数。