模型版本升级后参数名可能从city变成location,导致下游解析器崩溃。toolcontract库通过比对预期工具调用结构与实际结果,检测这类静默破坏的回归。
你的 agent 调用 get_weather(city="London")。提供商发布了一个新模型版本,现在它调用 get_weather(location="London, UK"),你下游的解析器报错了,而 CI 没有任何提示。
我为此写了一个专门解决这类问题的小库:
pip install toolcontract
GitHub: https://github.com/Divyansh2202/toolcontract PyPI: https://pypi.org/project/toolcontract/
你将一组预期的工具调用固定为契约,用实际模型重新运行它们,然后得到 pass / fail / inconclusive,并通过 diff 展示具体变化。
这并非评估框架。promptfoo、DeepEval 等工具评判输出质量——通常是语义质量,由另一个模型来判定。toolcontract 问的是一个更窄、更便宜的问题:这次工具调用在结构上和我固定的那个一样吗?相同工具、相同参数形状、相同轨迹。这是一场回归测试,而非评估——当提供商在你不知情的情况下升级版本时,这才是真正重要的问题。
pass / fail / INCONCLUSIVE — 结构比较器无法处理的情况永远不会被静默转换为 pass 或 fail
trajectory matching:strict、unordered、subset、superset
支持可选参数,以便你能断言某个字段必须不存在
支持 OpenAI、Anthropic、任何 OpenAI 兼容接口,或通过 LiteLLM
轻量级 pytest 插件,以及无需 pytest 即可产生相同判决结果的 CLI 工具
欢迎反馈它在哪些场景下会出问题。这是 v0.1 版本。