今天在 GitHub 上闲逛,刷到一个挺有意思的仓库:managedcode/LlmTestServer。
Star 只有 2 个,一个还是我star的,但我把代码翻完之后觉得,这可能是今年 .NET 圈最被低估的一个工具。它做的事情一句话就能说清:在本地跑一个假的 LLM 服务商,OpenAI、Anthropic、Gemini 全都能演,但你测试里的应用根本分不出来。
先说说痛点
如果你写过调用大模型的应用,一定被测试折磨过。
调真实 API 吧,又慢又烧钱,更致命的是模型每次回答都不一样------你永远没法写 assert reply == "xxx",测试 CI 跑十次挂三次,挂的还是不同的三次。
那 mock 掉 HTTP 客户端?也行,但你的测试就绕过了官方 SDK 的序列化、重试、流式解析------恰恰是这些地方最容易出线上事故。至于限流 429、内容过滤拦截、SSE 流中途断掉这种异常路径,想在真实 API 上复现,基本靠缘分。
这个项目的思路很直接:既然问题是"模型不确定",那就把模型换成一个完全听你指挥的服务器。
它是怎么工作的
启动方式就一行:
sh
docker run --rm -p 8080:8080 \
-e LlmTestServer__RequiredBearerToken=test-key \
ghcr.io/managedcode/llm-test-server:1.0.0
然后用客户端把"剧本"灌进去------第一个请求回什么、第二个请求回什么、什么时候该报 429、流式响应在哪个分片断掉,全都由你的测试脚本决定:
csharp
await control.ConfigureAsync(config => config
.RequireBearerToken("test-key")
.UseChatModel("gpt-6.1-sol")
.UseChatScenario("delivery", scenario => scenario
.ForModel("gpt-6.1-sol")
.Responds("Your order arrives on Friday.")
.Responds("Delivery is free.")));
应用侧呢?什么都不用改,只把 base URL 从 api.openai.com 换成 http://localhost:8080/openai/v1。官方 SDK 照常用,流式照常流,工具调用照常调------只是对面坐着的从 GPT 换成了一个绝对听话的演员。
这个演员的演技覆盖面相当广:13 家提供商,包括 OpenAI、Azure OpenAI、Anthropic、Gemini、Bedrock、Groq、Mistral、Ollama、Cohere 等等。像 Anthropic 的 Messages 协议、Gemini 的 generateContent、Bedrock 的 Converse 这些非 OpenAI 系的协议,它都实现了原生模拟,不只是套一层 OpenAI 兼容皮。甚至连图像生成、语音转写、视频生成这些多模态接口都覆盖了。
整体架构一张图能看明白:左边是你的测试和官方 SDK,右边是这个假服务器,中间只隔一个 base URL。服务器内部三件事------按剧本回答、把每次请求记进日志、用仪表盘给你看------而真实 API,永不调用。

让我眼前一亮的三个设计
第一个是会话步图。 测客服机器人这类多轮对话时,光有"回答队列"是不够的------用户说"退款"和说"物流",机器人该走的路完全不同。这个项目允许你把对话定义成一个状态机:用户消息匹配什么条件、跳到哪个步骤、什么时候结束,都能编排。每个测试会话有独立的状态,并行跑互不干扰。
第二个是 token 账本。 它内置了真实的分词器,能把每次请求的输入拆成系统提示、工具 schema、历史消息各占多少 token,还能模拟各家提示缓存的读写规则。配着自带的 Blazor 仪表盘,你能亲眼看到"这轮对话的钱到底花在哪了"。等于把成本工程也变成了可以写断言、可以回归的东西------这个我在别的 mock 工具里真没见过。
第三个,也是我最佩服的:防漂移机制。 假服务器最怕什么?怕真 API 改了而它还活在昨天。这项目的解法是:每个提供商包里都存着一份契约,记录官方文档的 URL 和检索日期,超过 180 天没复核,契约测试直接挂红灯。用 CI 强迫自己跟上 API 的演变,这个设计值得所有做 mock 工具的人抄作业。
顺手扒了扒背后的团队
维护者是 Konstantin Semenenko,乌克兰出身、现在法国的 Managed Code 公司的 CTO,21 年 .NET 老兵。项目今年 7 月 7 日第一次提交,10 月 20 日发 1.0.0,之后 8 天连发 6 个修复版------节奏快得不像一个人。
看了仓库根目录我才明白为什么快:这是一个彻头彻尾的 AI 代理驱动开发的项目。仓库里内置了 80 个给 AI 编程代理用的技能包,6 篇架构决策记录,484 个测试,还有一套他们自研的方法论叫 MCAF,核心就三条:上下文必须活在仓库文档里、能不能交付由测试说了算、规矩要写进 AGENTS.md 里持久化。
一个教人"确定性地测试 AI 应用"的工具,自己就是用"让 AI 确定性地写代码"的方式造出来的。这个闭环,比工具本身更值得琢磨。
冷静一下,说点风险
新项目该有的毛病它都有。2 个 star,网上搜不到任何第三方讨论;所有提交出自一个人,bus factor 为 1;13 家提供商的协议跟踪是个长期苦力活,一个人能不能扛住要打个问号。部分文档还诚实地标着"已实现,公开发布待决"------能力面比交付面稍微画大了一点。
所以我的建议是:.NET 团队,特别是已经在用 Aspire 的,现在就可以拿去试 ,一行 builder.AddLlmTestServer() 就能接入,几乎零摩擦。其他栈的团队可以先观望,或者看看同类选手------JS 生态有 CopilotKit 的 AIMock,Java 系有 MockServer 的 LLM 模块。
另外不管用什么 mock,都请保留一小撮定期跑真实 API 的契约测试。Mock 决定你测试跑得多快多稳,真实调用决定你的测试是不是真的------这俩谁也不能替谁。
这个项目目前还很冷清,但"LLM 应用的确定性测试"是 2026 年实打实的刚需。2 star 的项目值不值得关注?反正我先 star 了,你们随意。
相关链接
- 项目仓库:github.com/managedcode/LlmTestServer(MIT 协议)
- 官网:llmtest.managed-code.com
- NuGet:nuget.org/packages/ManagedCode.LlmTestServer
- Docker 镜像:ghcr.io/managedcode/llm-test-server
- 团队自研的 AI 代理开发框架 MCAF:github.com/managedcode/MCAF
- 同类工具:CopilotKit AIMock(JS 栈)、MockServer LLM 模块(Java 栈)、dwmkerr/mock-llm(轻量 YAML 配置)
本文基于 2026 年 11 月 14 日的仓库状态与公开资料整理。公众号不支持外链,地址请复制到浏览器打开。