尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

BAML 多语言 SDK 生成体系:从 baml generate 命令到 sdk_tests 验证矩阵

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),仅供参考
返回列表