
baml :基本上是一种化妆的语言
主页|文档| baml AI聊天|不和谐
baml是一种简单的提示语言,用于构建可靠的AI工作流程和代理。
baml通过将其转变为模式工程(主要专注于提示的模型)来使及时的工程变得容易,以获取更可靠的输出。您不需要在baml中编写整个应用程序,只需要提示!您可以使用您选择的任何语言来连接LLM功能!请参阅我们的Python,TypeScript,Ruby和Go等的Quickstarts。
baml附带包括所有电池 - 具有完整类型的AFTETY,流媒体,重试,广泛的模型支持,即使它们不支持本机工具呼叫API
尝试baml :提示小提琴•交互式应用程序示例
核心baml原理:LLM提示是功能
baml中的基本构建块是一个功能。每个提示都是一个函数,该函数接收参数并返回类型。
function ChatAgent ( message : Message [ ] , tone : "happy" | "sad" ) -> string每个功能还定义了它使用的模型及其提示。
function ChatAgent ( message : Message [ ] , tone : "happy" | "sad" ) -> StopTool | ReplyTool {
client "openai/gpt-4o-mini"
prompt # "
Be a {{ tone }} bot.
{{ ctx.output_format }}
{% for m in message %}
{{ _.role(m.role) }}
{{ m.content }}
{% endfor %}
" #
}
class Message {
role string
content string
}
class ReplyTool {
response string
}
class StopTool {
action "stop" @ description ( # "
when it might be a good time to end the conversation
" # )
} baml函数可以从任何语言中调用
在下面,我们调用了通过Python在baml中定义的聊天功能。 baml的Rust编译器生成一个“ baml _CLEINT”来访问并致电。
from baml _client import b
from baml _client . types import Message , StopTool
messages = [ Message ( role = "assistant" , content = "How can I help?" )]
while True :
print ( messages [ - 1 ]. content )
user_reply = input ()
messages . append ( Message ( role = "user" , content = user_reply ))
tool = b . ChatAgent ( messages , "happy" )
if isinstance ( tool , StopTool ):
print ( "Goodbye!" )
break
else :
messages . append ( Message ( role = "assistant" , content = tool . response ))
您可以使用链式baml功能编写任何类型的代理或工作流。代理是一个while循环,该循环调用chat baml函数具有某种状态。
如果需要流,请添加几行:
stream = b . stream . ChatAgent ( messages , "happy" )
# partial is a Partial type with all Optional fields
for tool in stream :
if isinstance ( tool , StopTool ):
...
final = stream . get_final_response ()并获取流中每个块的完全类型安全输出。
测试提示快10倍,就在您的IDE中
baml配备了VSCODE的本机工具(Jetbrains + Neovim即将推出)。
可视化完整提示(包括任何多模式资产)和API请求。 baml为您提供了全部透明度和提示的控制。

使用AI是关于迭代速度的。
如果测试管道需要2分钟,则只能在20分钟内测试10个想法。
如果将其减少到5秒钟,则可以在相同的时间内测试240个想法。 
操场还允许您并行运行测试 - 甚至更快的迭代速度。
无需登录网站,也无需手动定义JSON模式。
使用任何型号启用可靠的工具称呼
即使模型不支持本机工具接听API, baml可以工作。我们创建了SAP(模式一致的解析)算法,以支持LLM可以提供的灵活输出,例如在回答之前在JSON BLOB或经过思考的链条中降低。阅读有关SAP的更多信息
使用baml ,您的结构化输出在模型释放的第1天工作。无需弄清楚模型是否支持并行工具调用,还是支持递归模式,或任何一个或单位。
与以下操作看到: DeepSeek-R1和Openai O1。
从几行从100型型号切换
function Extract() -> Resume {
+ client openai/o3-mini
prompt #"
....
"#
}重试策略•后备•型号旋转。所有静态定义。想在运行时选择型号吗?查看客户端注册表。
我们支持:Openai•人类•双子座•顶点•基岩•Azure Openai•任何openai兼容的东西(Ollama,OpenRouter,vllm,vllm,lmstudio,ferederai等)
建立美丽的流媒体UI
baml为NextJ,Python(和任何语言)生成了大量的实用程序,以使流媒体UI变得容易。 
baml的流界接口是完全类型的安全性。查看流文档,我们的React钩子
完全开源和离线
- 100%开源(Apache 2)
- 100%私人。 AGI不需要互联网连接, baml也不会
- 除了模型之外,没有网络请求您明确设置
- 未存储或用于任何培训数据
- baml文件可以在本地保存在您的计算机上,并将其检查到GitHub中以获取易于差异。
- 内置生锈。这么快,你甚至都无法分辨它在那里。
baml的设计理念
制作新语法时,一切都是公平的游戏。如果可以编码,则可以是您的。这是我们帮助限制思想的设计理念:
- 1:尽可能避免发明
- 是的,提示需要版本操作 - 我们有一个很棒的版本控制工具:git
- 是的,您需要保存提示 - 我们有一个很好的存储工具:文件系统
- 2:任何文件编辑器和任何终端都足以使用它
- 3:快
- 4:一年级的大学生应该能够理解
为什么一种新的编程语言
我们曾经以这样的方式编写网站:
def home ():
return " () => alert( \ " hello! \ " ) " >Click"现在我们这样做:
function Home ( ) {
return < button onClick = { ( ) => setCount ( prev => prev + 1 ) } >
{ count } clicks!
button >
}新的语法在表达新想法方面可能令人难以置信。再加上维持数百个f弦的想法,以提示我们的厌恶。字符串对可维护的代码库不利。我们更喜欢结构化的字符串。
baml的目的是为您提供英语的表现力,但代码的结构。
我们的完整博客文章。
结论
随着模型变得更好,我们将继续期望它们更多。但是,永远不会改变的是,我们将需要一种编写使用这些模型的可维护代码的方法。当前我们所有人都组装字符串的方式让人想起了早期的Web开发中PHP/HTML汤。我们希望我们今天分享的一些想法可以使我们大家明天都塑造我们所有人的方式,从而有很小的凹痕。
常问问题
| 我需要用baml写整个应用吗? | 不,只有提示! baml将定义转化为您选择的语言! Python,打字稿,Ruby等。 |
| baml稳定吗? | 是的,许多公司在生产中使用它!我们每周运送更新! |
| 为什么要一种新语言? | 跳到部分 |
贡献
结帐我们有关入门的指南
引用
您可以引用baml回购如下:
@software { baml ,
author = { Vaibhav Gupta, Aaron Villalpando and Boundary ML team } ,
title = { baml } ,
url = { https://gi*t*hub*.com/boundaryml/baml } ,
year = { 2024 }
}
用边界制成的❤️
华盛顿州西雅图的总部
PS我们正在雇用喜欢Rust的软件工程师。给我们发送电子邮件或与Discord接触!
通过命令行克隆项目: