BAML 多语言 SDK 生成体系:从 baml generate 命令到 sdk_tests 验证矩阵
编程语言AI Agent编译器CLI人工智能【免费下载链接】bamlThe programming language for agents项目地址https://gitcode.com/gh_mirrors/ba/baml点击查看免费下载本文以 BAML SDK 总览文档 为核心讲解 BAMLThe programming language for agents如何将用户的.baml定义编译为宿主语言的类型安全客户端 SDK包括baml generate命令的行为与参数、各语言 SDK 的“FFI 桥 代码生成器”双件式实现结构以及支撑全部生成器的sdk_tests端到端验证矩阵。读完后你能掌握如何在自己的 BAML 项目中生成并验证 Python、TypeScript、Rust 等语言的客户端 SDK。一、核心能力用 baml generate 生成类型安全客户端SDK 总览文档给出了这条产品线的核心承诺BAML 用户可以通过baml generate为自己的 BAML 代码生成“在所选宿主语言中类型安全的客户端 SDK”并且仓库在sdk_tests中为所有受支持的目标维护了端到端测试覆盖。当前支持矩阵以 baml_language/sdks/README.md 为准支持级别生成器 / 环境说明Betapython_pydantic2PythonPydantic v2 风格绑定Betatypescript_nodeNode 环境测试位于vitest_nodeBetatypescript_web_chromium浏览器Chromium环境测试位于vitest_webBetatypescript_web_cloudflare_workersCloudflare Workers 环境测试位于vitest_workersAlphacppCAlpharustRustAlphagoGoAlphajavaJavaAlphaswiftSwift计划中csharp文档标注 “Support is coming soon”需要注意的一个细节SDK 总览文档将csharp标注为“即将支持”但当前仓库中已存在 sdks/csharp 目录、sdk_tests的 C# 测试 crate且测试代码生成驱动 sdk_tests/codegen/src/main.rs 的GENERATORS表中已注册(csharp, sdk_test_codegen::csharp::run_all)。从源码结构看C# 链路生成器 桥在仓库中已有实质性实现总览文档的“coming soon”更应理解为面向公共用户的发布状态尚未正式开放。类似地GENERATORS表中的typescript/typescript_web两个条目对应文档矩阵里的typescript_node、typescript_web_chromium、typescript_web_cloudflare_workers三个运行环境。二、baml generate 命令参数与行为baml generate由 BAML CLI 实现入口定义在 baml_cli/src/generate.rs。其官方帮助文本给出了三个典型用法# 为最近的项目生成客户端 baml generate # 为指定项目生成客户端 baml generate --project ./my-project # 覆写输出目录对本次调用中所有生成器生效 baml generate --output-dir ./generated从GenerateArgs的结构定义generate.rs可以确认命令面--projectPATH指定目标 BAML 项目--output-dir/--output/-oPATH输出目录覆写参数优先级高于baml.toml中各生成器配置里的output_dir对本次调用中的每个生成器统一生效--from--project的弃用别名在帮助中隐藏hide true子命令baml generate add向baml.toml中添加一个客户端生成器配置。该命令的执行语义在源码注释中写得很清楚generate.rs读取baml.toml中所有[generator.name]配置段校验项目后为每个已配置生成器写出客户端。也就是说生成哪些语言的 SDK、写到哪个目录由baml.toml的[generator.name]段驱动命令行只负责选择项目和覆写输出位置。生成完成后 CLI 会打印每个生成器的产出摘要文件数、标识符重命名数与目标目录例如python_pydantic2 (N file(s), M identifier renames → ./baml_sdk)--quiet关闭摘要--verbose则逐条列出被重命名的标识符及原因见 generate.rs 的generation_presentation。三、SDK 目录组织FFI 桥 代码生成器的双件式结构仓库 baml_language/sdks/ 目录按语言划分每个语言内部再拆成“桥bridge核心运行时绑定”与“生成器sdkgen_*类型绑定代码生成”两部分。sdk_tests 总览 明确概括了这一结构Each SDK is implemented in two parts: an FFI to provide core runtime bindings and an SDK generator to generate typed bindings.各语言的对应关系摘自 sdk_tests/README.md测试 crate覆盖的桥 / 运行时覆盖的生成器sdk_test_python_pydantic2sdks/python/rust/bridge_python、sdks/python/src/baml_bridgesdks/python/rust/sdkgen_python_pydantic2sdk_test_typescriptsdks/typescript/bridge_typescriptsdks/typescript/sdkgen_typescript_sharedsdk_test_typescript_websdks/typescript/bridge_typescript_websdks/typescript/sdkgen_typescript_sharedsdk_test_rustsdks/rust/bridge_rustsdks/rust/sdkgen_rust这与sdks/的实际目录布局一致sdks/python/含rust/下的桥与生成器、sdks/typescript/bridge_typescript、bridge_typescript_web、sdkgen_typescript_shared、sdks/rust/bridge_rust、sdkgen_rust、sdks/go/baml_go、bridge_go、sdkgen_go以及cpp、java、swift、csharp等目录。Node 与 Web 两种 TypeScript 目标共享同一生成器sdkgen_typescript_shared只替换桥与运行时环境这也是文档中typescript_node与两个typescript_web_*环境共享一份customizable测试语料的原因。另外sdks/下还有一组面向 AI 协作者的参考文档 sdks/agent-docs/bridge-ref/包含 Java 桥的入站编码、出站解码、类型映射、打包与完成度状态等参考文章可用于深入了解单语言桥的契约细节。四、sdk_tests生成器 × fixture 的端到端验证矩阵sdk_tests是对所有生成 SDK 的端到端测试同时验证 sdkgen 逻辑与底层 FFI 接口。它有两个维度生成器维度每个 SDK 生成器一个 Rust cratesdk_test_python_pydantic2、sdk_test_typescript、sdk_test_typescript_web、sdk_test_rust等命名规则为sdk_test_generatorfixture 维度sdk_tests/fixtures/下每个 fixture 是一棵只含.baml源的baml_src/树如function_calls、llm_functions、type_shapes作为所有生成器的无关输入。每个生成器 crate 会把自己“扇出”到所有 fixture代码生成产物落在sdk_tests/crates/generator/fixture/generated/宿主机语言的移植测试放在被 git 跟踪的customizable/目录中。运行方式sdk_tests/README.md 给出的标准命令在baml_language目录下# 一次跑完所有 SDK 测试目标的全部 fixture cargo nextest run -p sdk_test_python_pydantic2 -p sdk_test_typescript -p sdk_test_typescript_web -p sdk_test_rust # 只跑某个生成器 cargo nextest run -p sdk_test_python_pydantic2 cargo nextest run -p sdk_test_typescript cargo nextest run -p sdk_test_typescript_web cargo nextest run -p sdk_test_rust # 只跑某个宿主机语言 runner cargo nextest run -p sdk_test_python_pydantic2 function_calls::pytest cargo nextest run -p sdk_test_typescript function_calls::vitest_node cargo nextest run -p sdk_test_typescript_web function_calls::vitest_web cargo nextest run -p sdk_test_typescript_web function_calls::vitest_workers cargo nextest run -p sdk_test_rust function_calls::cargo_test文档特别提醒SDK 测试必须用cargo nextest run驱动普通cargo test会以“令人惊讶的方式”失败。原因在 sdk_tests/DEVELOPMENT.md 中解释得很清楚代码生成不是构建脚本。每个生成器 crate 的setup.shUnix/setup.ps1Windows先执行cargo run -p sdk_test_codegen -- generator再安装各语言工具链。nextest 通过 .config/nextest.toml 中的平台过滤绑定自动触发 setup 脚本setup_guard::ran测试会校验脚本在本次运行中确实执行过通过在$NEXTEST_ENV中写入SDK_TEST_GEN_SETUP1面包屑防止测试跑在陈旧或未生成的目录上。每个 fixture 的.baml文件经完整编译器管线parse → HIR → TIR →SymbolPool→ emitter与baml generate相同的路径编译遇到Severity::Error诊断直接中止——“失败要大声”failures are loud没有软失败通道。fixture 清单是钉死的fixture_manifest::matches_corpus测试断言各 crate 声明的行、fixtures::SHARED表和磁盘上的 fixture 目录三者一致漏改任何一处都会失败并点名要编辑的文件。过滤 pytest / vitest 的用例nextest 不会向pytest/vitest透传额外参数官方推荐的调试姿势是先用 nextest 生成 fixture再直接进generated/目录跑宿主语言测试# pytest按关键字表达式过滤 cargo nextest run -p sdk_test_python_pydantic2 function_calls::pytest (cd sdk_tests/crates/python_pydantic2/function_calls/generated uv run pytest -v -k optional_args) # vitest在某个运行时里按测试名模式过滤 cargo nextest run -p sdk_test_typescript function_calls::vitest_node (cd sdk_tests/crates/typescript/function_calls/generated pnpm exec vitest run --config vitest.node.config.ts -t optional_args) # rust按测试名过滤并复用共享构建缓存 cargo nextest run -p sdk_test_rust function_calls::cargo_test (cd sdk_tests/crates/rust/function_calls/generated CARGO_TARGET_DIR../../../../../target/sdk-rust-target cargo test optional_args)TypeScript 侧还有一套运行时选择机制每个*.test.ts通过生成出的test_runtime.js的isTestRuntime助手用describe.runIf(isTestRuntime(node | web | workers))在同一份测试文件里交错 Node / Chromium / workerd 的专属覆盖从而让同一份测试语料在三个环境中共享执行。五、扩展添加新生成器与新 fixtureDEVELOPMENT.md 记录了扩展流程核心步骤添加生成器在sdk_tests/codegen/src/下新增target.rs实现run_all(CodegenCtx)注册进 main.rs 的GENERATORS表在harness_runner/src/lib.rs中声明对应的test_suite!宏再按crates/cpp/的形态添加crates/target/Cargo.toml、src/lib.rs、setup.sh、setup.ps1并在.config/nextest.toml中挂上平台过滤的 setup 绑定。添加 fixturemkdir -p sdk_tests/fixtures/name/baml_src/放入.baml文件在fixtures::SHARED表和需要运行它的各crates/*/src/lib.rs的test_suite!块中各加一行然后cargo nextest run -p sdk_test_generator name::。设计上有两个值得注意的工程决策均出自 DEVELOPMENT.md一是每个 fixture 的产出目录只有一个属主write_codegen_output管生成树、Overlay管脚手架与移植测试不变化的再生成零文件触碰避免无效化 cargo/uv/pnpm/gradle 的 mtime 缓存二是代码生成刻意不放进build.rs否则编译器闭包会被拖进每次cargo check且编译器改动会触发全量 SDK 再生成。六、关键参考路径内容路径SDK 支持矩阵总览baml_language/sdks/README.mdbaml generate命令实现baml_language/crates/baml_cli/src/generate.rsSDK 各语言实现桥 生成器baml_language/sdks/SDK 端到端测试总览与运行手册baml_language/sdk_tests/README.md测试基础设施开发指南baml_language/sdk_tests/DEVELOPMENT.md测试代码生成驱动GENERATORS 表baml_language/sdk_tests/codegen/src/main.rsJava 桥参考文档baml_language/sdks/agent-docs/bridge-ref/赞分享编程语言AI Agent编译器CLI人工智能【免费下载链接】bamlThe programming language for agents项目地址https://gitcode.com/gh_mirrors/ba/baml点击查看免费下载相关推荐BAML SDK 端到端测试体系用 cargo nextest 驱动多语言 SDK 生成、验证与门控BAML SDK 端到端测试体系用 cargo nextest 驱动多语言 SDK 生成、验证与门控 BAML 是一种面向 Agent 的编程语言用户可以用编程语言AI Agent编译器CLI人工智能BAML sdk_tests 代码生成测试基础设施从 fixture 到真实 SDK 的端到端验证机制BAML sdk_tests 代码生成测试基础设施从 fixture 到真实 SDK 的端到端验证机制 BAMLThe programming langua编程语言AI Agent编译器CLI人工智能BAML 集成测试体系实战跨语言客户端生成与一致性验证BAML 集成测试体系实战跨语言客户端生成与一致性验证 BAML 的集成测试位于 integ tests/ https://link.gitcode.com/编程语言AI Agent编译器CLI人工智能上一篇SonoffLAN 调优让百台设备 2 秒内全部响应下一篇20 分钟让 AI 替你查数据库WrenAI 本地跑通自然语言问数创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

eslint-plugin-react 规则详解:react/no-this-in-sfc —— 禁止无状态函数组件中使用 `this`

eslint-plugin-react 规则详解:react/no-this-in-sfc —— 禁止无状态函数组件中使用 `this`

开发工具代码质量静态分析 【免费下载链接】eslint-plugin-react React-specific linting rules for ESLint 项目地址: https://gitcode.com/gh_mirrors/es/eslint-plugin-react 点击查看 免费下载 react/no-this-in-sfc 是 eslint-plugin-react 提供的一条"可…

2026/9/25 15:57:47 阅读更多 →
开源大模型本地部署与安全实战:Qwen微调、微软工具链与谷歌生态

开源大模型本地部署与安全实战:Qwen微调、微软工具链与谷歌生态

1. 开源AI浪潮下的技术选型与安全博弈过去一年里,我身边做开发和运维的朋友聊得最多的话题,从“你用了哪个API”逐渐变成了“你本地跑了哪个模型”。这个转变背后其实是一个很明显的信号:开源大模型的能力已经跨过了“能用”的门槛&#xff0…

2026/9/25 15:57:47 阅读更多 →
开源AI代码评审工具open-code-review:架构、部署与实战

开源AI代码评审工具open-code-review:架构、部署与实战

做代码评审这件事,我一开始是有点抗拒AI介入的。原因很简单:一个不懂业务上下文、没见过团队历史的模型,凭什么对一个改了三行代码的PR指手画脚?后来我被现实教育了——团队规模变大之后,人工评审根本忙不过来&#xf…

2026/9/25 15:57:46 阅读更多 →

最新新闻

通信+客户数据:DeskcommCRM如何构建带上下文的客服系统

通信+客户数据:DeskcommCRM如何构建带上下文的客服系统

做这套DeskcommCRM的念头,源于我接手客服团队后的第三周。当时团队每天要处理两百多通客户来电,但同事们的日常是:电话一响,先问“您好哪位”,然后手忙脚乱翻Excel、查聊天记录,甚至有人用便利贴在显示器边…

2026/9/25 16:37:09 阅读更多 →
DeskcommCRM:把通话记录与客户管理融为一体的通讯型CRM

DeskcommCRM:把通话记录与客户管理融为一体的通讯型CRM

做CRM选型这些年,我见过太多团队在“客户管理”这件事上走弯路,其中很典型的一类就是——电话一通,客户信息就断了,销售打完电话还要手动补记录,补着补着就漏了,漏着漏着,客户就凉了。直到我实际…

2026/9/25 16:37:09 阅读更多 →
亚马逊卖家如何提高账号权重?方案详解

亚马逊卖家如何提高账号权重?方案详解

对于亚马逊卖家而言,所谓“账号权重”并不是一个公开、单独的官方评分,而是卖家对店铺整体表现的概括。想要长期提升店铺表现,核心要围绕商品质量、销售表现、客户体验、履约能力和合规运营持续优化。先理解:“账号权重”主要看什…

2026/9/25 16:37:09 阅读更多 →
机器人视觉选型:全局快门、卷帘快门与RGB-D的优缺点及场景适配

机器人视觉选型:全局快门、卷帘快门与RGB-D的优缺点及场景适配

给机器人装眼睛这件事,说简单也简单,说难也难。简单在于市面上可选的视觉方案实在是太多了,难就难在——这么多方案,到底哪个才是自己项目真正需要的?我见过不少团队,前期调研不够仔细,拍到一半发现果冻效应严重得离谱,或者视觉系统跑起来才发现深度数据根本喂不饱算法,最后只…

2026/9/25 16:37:09 阅读更多 →
Atlas 300V 24G是AI推理加速卡吗?昇腾环境部署YOLO全流程指南

Atlas 300V 24G是AI推理加速卡吗?昇腾环境部署YOLO全流程指南

前阵子有个朋友在群里问我:“Atlas 300V 24G是运算加速卡吗?我能不能拿它直接部署YOLO?”我一看就知道,这兄弟大概率是从GPU阵营转过来的。类似的问题还有“为什么卡插上了但跑不了PyTorch”“npu-smi死活看不到设备”“模型转换一…

2026/9/25 16:37:09 阅读更多 →
【含最新安装包】保姆级手把手教你,OpenClaw 零基础一键快速部署 TaoToken 配置

【含最新安装包】保姆级手把手教你,OpenClaw 零基础一键快速部署 TaoToken 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 16:36:09 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/25 11:15:26 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →