mirascope
用装饰器统一调用任何 LLM:Python/TypeScript 双语言、8+ 提供商、Pydant
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
用装饰器统一调用任何 LLM:Python/TypeScript 双语言、8+ 提供商、Pydant
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
图1:Mirascope 品牌标识 — 镜子中的 AI 世界
你是否有过这样的经历:为了调用一次 GPT-4,需要写一堆 API 配置代码;换到 Claude,又要重新学一遍接口;做 Agent 工具调用,光是处理工具结果返回就写了半屏 if-else?这不是你的问题——而是 LLM 工具链碎片化的必然代价。
Mirascope 正是为解决这个痛点而生。它的核心哲学很简单:不做又一个 Agent 框架,而是把"调用 LLM"这件事变得足够优雅、足够类型安全、足够跨平台。 这也是为什么它的 slogan 叫「LLM Anti-Framework」——它刻意在 raw API 和重型 Agent 框架之间,找到一个恰到好处的中间地带。
作者 William Bakst 和 Dandelion Mane 在 Python README 中打了个比喻:把 Mirascope 看作 LLM 领域的 React,而各提供商的原生 SDK 是 HTML/CSS,重型 Agent 框架是 Angular。React 不替你写业务逻辑,但给了极致的灵活性和类型推断;Mirascope 同样如此——保持对 LLM 调用的完全控制,同时提供装饰器驱动的 ergonomics。
项目采用 Monorepo 结构,代码分为三个主要部分:python/(成熟版 v2.4.0,生产可用)、typescript/(Alpha 阶段,早期预览)、website/(官方文档站,基于 Modern.js)。Stars 1493,MIT 协议开源,GitHub Actions CI + Codecov 覆盖率监控持续追踪代码质量。
Mirascope 的设计核心围绕一个 @llm.call 装饰器展开。最小化示例:
from mirascope import llm
@llm.call("anthropic/claude-sonnet-4-5")
def recommend_book(genre: str):
return f"推荐一本{genre}类型的书"
response = recommend_book("奇幻")
print(response.text())
这段代码做了什么?装饰器把普通函数变成可直接调用的 LLM 调用器——函数参数自动变成 prompt 模板,返回值是结构化的 Response 对象。这个模式比直接调用 openai.ChatCompletion.create 简洁得多,同时比 LangChain 的链式调用更透明。
装饰器背后是四个层次的抽象:
1. Prompt 层(prompts/):函数返回的字符串被自动包装成 MessageTemplate,支持 Jinja2 风格模板语法和类型安全的参数注入。
2. Call 层(calls/):Call / AsyncCall / ContextCall / AsyncContextCall 四种变体,覆盖同步/异步和依赖注入场景。BaseCall 封装了 model 选择、retry 策略和 response 处理。
3. Provider 层(providers/):这是 Mirascope 最核心的差异化。它用 Provider Registry 模式 实现多厂商统一抽象:
openai/ — OpenAI GPT 系列anthropic/ — Anthropic Claude 系列google/ — Google Gemini 系列ollama/ — 本地 Ollamaopenrouter/ — OpenRouter 聚合together/ — Together AImlx/ — Apple Silicon MLXmirascope/ — Mirascope Cloud MCP每个 Provider 实现 BaseCallMiner 抽象基类,统一接口:call(), stream(), chat(), chunk()。换 Provider 只需改一行字符串。
4. Tool 层(tools/):@llm.tool 装饰器将普通 Python 函数注册为 LLM 可调用的工具。配合 response.resume(response.execute_tools()) 模式实现 Agent 循环。工具系统原生支持 Pydantic 类型定义,LLM 返回的工具调用结果自动反序列化为 Python 对象。
核心模块还包括:
format=MyModel 语法获得结构化输出,自动处理 JSON Schema 和 provider-specific 格式转换。在 v2 中新增的 ops 模块是 Mirascope 面向生产环境的杀手锏。基于 OpenTelemetry 标准,提供开箱即用的链路追踪:
from mirascope.ops import observe
@observe
@llm.call("anthropic/claude-sonnet-4-5")
def my_agent(query: str):
return query
支持 OTLP 导出到 Jaeger、Zipkin 等追踪后端,内置对 OpenAI、Anthropic、Google GenAI 的自动 instrumentation,无需手动埋点。集成 orjson(高性能 JSON)和 libcst(Python 代码静态分析),为未来更深入的代码分析能力埋下伏笔。同时支持 MCP(Model Context Protocol),可将 Mirascope 工具直接暴露给 MCP 客户端。
TypeScript 版本(v2.4.0-alpha.6)处于 Alpha 阶段,核心 API 已与 Python 版本对齐。安装方式:
bun add mirascope@alpha # 或 npm install mirascope@alpha
核心 API 包括 llm.model() 模型实例化、model.call() 直接调用、model.stream() 流式响应,以及 defineCall 函数式工具定义。构建工具链使用 tsup(基于 esbuild)实现 CJS/ESM 双格式输出,配合 Vitest 测试框架。
Mirascope 的工程化程度令人印象深刻。Python 版本完全使用 uv 作为包管理器,pyproject.toml 定义清晰的依赖分层:核心依赖仅 5 个(pydantic>=2.0, httpx>=0.27, jiter, docstring-parser, typing-extensions),按需可选的 extras 包括 anthropic、openai、google、mcp、ops、mlx,all extras 一键安装全部依赖。
代码质量工具链覆盖完整:
每一行提交代码都会经过拼写检查、风格扫描、类型检查、单元测试、覆盖率门槛的完整流水线。
重要:Mirascope 不是服务,不是 Web 应用,不是 Docker 镜像。 它是纯粹的代码库,通过包管理器安装后在你的代码中 import 使用。
uv add "mirascope[all]" 或 pip install "mirascope[all]",Python >= 3.10bun add mirascope@alpha 或 npm install mirascope@alpha,Node >= 18官方文档站使用 Modern.js 构建,部署在 Cloudflare Pages,包含完整 API 文档和教程。
最适合使用 Mirascope 的场景:
局限性:
Mirascope 代表了 LLM 开发工具演进的一个重要方向——「Anti-Framework」理念的兴起。随着 LLM API 逐渐标准化(Function Calling / Tool Use 已成为事实标准),重型 Agent 框架的价值正在被重新审视。LangChain 的过度抽象让开发者失去了对 token 消耗和调用链路的可见性;Mirascope 选择了相反的路线——保持 LLM 调用本身的可见性和可控性,同时通过装饰器提供 ergonomics。
这种设计哲学在 2024-2025 年的 LLM 开源社区中越来越流行。类似理念的项目还包括 Instructor(结构化输出)、Portkey(LLM 网关)等。Mirascope 的差异点在于 Provider 抽象层最为完善,同时覆盖 Python/TypeScript 双语言,加上 ops 可观测性模块,形成了从开发到生产的完整链路。
作者团队保持着活跃的迭代节奏,v2 从 Beta 到正式版经历了数十次 release,TypeScript 版本也在快速跟进。对于需要灵活集成多 LLM 厂商的团队,Mirascope 值得认真评估。