ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Skybridge Evals 实战:如何在 CI 中用真实模型断言你 MCP App 的工具调用

Skybridge Evals 实战:如何在 CI 中用真实模型断言你 MCP App 的工具调用 Skybridge Evals 实战如何在 CI 中用真实模型断言你 MCP App 的工具调用【免费下载链接】skybridgeSkybridge is a full-stack TypeScript framework for MCP Apps and ChatGPT Apps. Type-safe. React-powered. Platform-agnostic.项目地址: https://gitcode.com/gh_mirrors/skybr/skybridgeSkybridge Evals是 Skybridge一款面向 MCP Apps 与 ChatGPT Apps 的全栈 TypeScript 框架内置的测试能力它让一个真实模型在你的 App 上发起对话把模型实际做出的工具调用交给你断言——不需要端口、不需要 fixture跑在 Vitest 里天然适合放进 CI。为什么需要 Evals工具能跑 ≠ 模型会调用对 MCP App 来说最隐蔽的 bug 不是工具本身报错而是工具明明可用模型却不调用它——比如改了工具名、描述或参数 schema 之后模型开始绕过它或传错参数。Skybridge 的测试工具箱按保真度 vs 成本分了层见 docs/test/index.mdx想验证什么用什么真实模型适合 CI手动调工具、看视图DevTools❌❌用真实模型先手动对话Playground✅❌在 CI 中断言模型的工具调用Evals✅✅提交前整体合规检查Audit✅部分推荐节奏先用 Playground 手动确认模型大致会用我的工具再用 Evals 把这个行为固化成可重复运行的测试之后每次改动由 CI 替你盯住。一键接入3 步开启 Evals第 1 步安装测试运行时pnpm add -D skybridge/test vitest^4 ai ai-sdk/anthropic第 2 步在 Vite 插件里打开evals开关// vite.config.ts export default defineConfig({ plugins: [ skybridge({ evals: {} }), // 注册 expect.chat 匹配器收集 evals/**/*.eval.ts react(), ], });evals: {}会同时做四件事注册断言匹配器、自动收集evals/目录下的场景、把单场景超时提到 2 分钟、加载.env让模型 API Key 可用。第 3 步加一个运行脚本{ evals: vitest run evals }写第一个场景自然语言提问 工具调用断言场景的结构非常简单start()在进程内把你的 App 服务起来App 只需从src/server.ts导出导入不会启动任何服务发一条消息然后断言// evals/search.eval.ts const chat await start({ app, model: anthropic(claude-sonnet-4-5) }); await chat.send(Find me running shoes under 100 dollars); expect.chat(chat).toHaveCalledToolWith(search-products, { query: running shoes, });关键点expect.chat(chat)的类型直接来自你的 App——工具名有自动补全参数按各工具的 input schema 做类型检查。改错工具名编译器就会先于模型发现问题。完整匹配器清单断言模型的每一步行为匹配器通过条件toHaveCalledToolOnce(name, args?)恰好一次成功的调用可匹配参数toHaveCalledToolWith(name, args)某次成功调用匹配了参数toNeverHaveCalledTool(name)该工具从未被尝试toHaveFailedToolCall(name)某次调用被拒绝或抛错toHaveSaid(text)助手回合包含文本支持正则toHaveCalledToolsInOrder(...names)按相对顺序调用了这些工具toHaveCalledNoTools()完全没调用任何工具toPassJudgment(criteria)裁判模型按标准评分通过所有匹配器都支持.not、覆盖整段对话不只是最后一次send失败信息会列出模型实际做过的每一次调用及参数。需要自定义断言时chat.toolCalls和chat.assistantTurns也全部可用。裁判模型断言语气得体这类软性标准有些行为没法用确定性匹配器表达比如回答是否礼貌、是否基于工具结果编造价格。toPassJudgment会把整段对话交给一个裁判模型打分失败的输出里直接带上裁判理由judge: FAIL The plan totals 640 euros. The assistant quoted hotel prices that do not appear in the search-hotels result.裁判默认使用对话自身的模型可传model换成更便宜的模型也可以传judge换成任意打分服务官方示例里用了一个返回概率的评估模型缺 Key 时自动跳过自己其余场景照常跑。 提示裁判断言是实时模型调用——费钱且不完全可复现只在其他匹配器都表达不了时再上并把标准写得足够窄。CI 稳定性的关键用 stubs 钉住会漂移的数据依赖今天日期或线上商品目录的场景今天绿、下月红。stubs让你在场景里直接回答某个工具而不经过你的 handlerconst chat await start({ app, model, stubs: { search-flights: ({ to }) (to LIS ? lisbonFixture : undefined), }, });返回undefined就回落到真实工具——这样既能钉住一组参数、又让其余调用保持真实。被 stub 的调用同样计入chat.toolCalls所有匹配器照常工作。测试带鉴权的工具传authInfo即可为会话声明身份。注意它只跳过 token 验证每个工具自己的鉴权方案和 scope 检查都会真实执行不传则走匿名路径含鉴权挑战。CI 实践何时跑、怎么省Evals 是真实模型调用会消耗 token建议这样安排触发时机——在改动工具的名字、描述或 input schema时运行这正是最容易让模型不会调用的改动或按夜间任务跑成本控制——保持temperature: 0默认值断言落在工具调用而非措辞上toHaveSaid尽量用宽松正则裁判断言少而精密钥注入——CI 中通过环境变量注入ANTHROPIC_API_KEY.env会被插件自动加载数据稳定——会漂移的数据一律走stubs别依赖线上接口调参——skybridge({ evals: { systemPrompt, maxSteps, timeout } })设置全局默认单个场景可在start中覆盖相关代码与文档路径官方文档docs/test/evals.mdx完整参数与默认值测试运行时源码packages/test/入口 packages/test/src/index.ts、会话与start()实现 packages/test/src/session-registry.ts匹配器实现packages/test/src/matchers/index.tsVite 插件中 Evals 的接线逻辑packages/vite-plugin/src/plugin.ts完整参考示例一个专为测试而生的滑雪商店 App4 个工具、每个匹配器都有对应场景examples/evals/场景如 examples/evals/evals/search.eval.ts小结✅ Skybridge Evals 让你用三行代码回答一个关键问题真实模型到底会不会正确地调用我的 MCP App 工具进程内运行、类型安全断言、stub 钉住易变数据再配上 CI 触发策略你的工具改动从此有一道自动守门员。【免费下载链接】skybridgeSkybridge is a full-stack TypeScript framework for MCP Apps and ChatGPT Apps. Type-safe. React-powered. Platform-agnostic.项目地址: https://gitcode.com/gh_mirrors/skybr/skybridge创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表