Bolna 语音智能体平台
端到端开源语音智能体框架:通过一个 JSON 配置即可编排 ASR、LLM 与 TTS,快速构建可打电话的对话式语音助手。
证据显示密钥通过.env与系统级AWS凭据传入,测试明确防止用真实账户;未见恶意行为或过度权限。扣分:发起电话等外部效应缺乏内置确认机制,数据流(音频/转录发往多家云端)透明度仅靠README片段描述,无回滚机制说明,发布者身份未验证且归属信息单薄。
依赖均锁定或限定版本,测试基础设施(conftest、冒烟脚本)设计认真,失败路径在冒烟脚本中有明确事件与提示。扣分:仅在提供文件内可见部分错误处理,未覆盖整个编排平台的故障语义。
README面向语音助手开发者,提供电话/纯文本两条路径、可扩展telephony provider指南及Python版本要求,边界(closed-source托管组件)明确。扣分:语言切换/LID等触发精度仅见于测试夹具,缺乏面向用户的触发行为文档。
MIT许可证完整,pyproject规范(commitizen版本管理、ruff、pytest配置),安装说明含快速启动与手动Docker步骤,示例丰富。扣分:README自述维护者流失(actively looking for maintainers)与维护波动,无CHANGELOG文件,已知局限仅在'开源v.s托管'段落间接提及。
JSON驱动的助手编排、程序化Python API与Docker本地栈均可用,输出形状(异步流式dict)已说明,相对自建ASR+LLM+TTS管线有明确边际价值。扣分:成本收益依赖第三方API费用,文档未量化。
README中代码链接指向具体commit/路径,示例与requirements一致。扣分:跨源佐证有限(仅README+部分代码文件),'production ready'等主张无测试证据支撑;事实与推断区分总体清晰。
- 发起真实电话属于高风险外部效应,部署前应自行加入确认与限额机制。
- 语音与转录数据会发送至Deepgram/OpenAI/ElevenLabs/Azure等多家云端供应商,需自行评估数据驻留与合规。
- 项目公开征集维护者,维护连续性存在不确定性,生产使用前评估更新频率。
- 发布者未经验证,供应链信任需自行建立(锁定依赖、审查工作流)。
这个 Agent 能做什么,适合哪些场景?
Bolna(bolna-ai/bolna,MIT 许可证)是一个端到端开源的生产级框架,用于构建基于 LLM 的语音驱动对话应用。该仓库包含完整的编排平台,通过 WebSocket 组合不同的 ASR + LLM + TTS 提供商与模型来调度语音对话。本地部署由四个 Docker 容器组成:电话 Web 服务器(Twilio 或 Plivo)、Bolna 服务器、ngrok 隧道和 Redis 持久化。平台也提供基于此编排构建的托管 API 与无代码 playground(两者目前闭源)。开发者既可以用 Python 的 Assistant 类以编程方式构建流水线,也可以通过 Docker 化的本地环境发起真实电话。项目明确表示正在寻找维护者,且开源版与托管方案之间的投入曾有所波动。
Bolna 编排完整的语音对话流水线:通过 Twilio 或 Plivo 发起电话(Exotel、Vonage 标注为即将推出),用 Deepgram 或 Azure 等转录音频,用 OpenAI、DeepSeek、Llama、Cohere、Mistral 等 LLM 处理对话,再通过 AWS Polly、ElevenLabs、Deepgram、OpenAI、Azure、Cartesia、Smallest、Maya、Kalpa 等合成语音回传到电话线路。LLM 集成基于 LiteLLM 包,也支持 VLLM 托管模型。在代码层面,开发者用 bolna.assistant.Assistant 组装任务,配置 Transcriber(如 provider='deepgram', model='nova-2')、LlmAgent/SimpleLlmAgent(如 provider='openai', model='gpt-4o-mini')和 Synthesizer(如 provider='elevenlabs'),通过 add_task 构建 transcriber → LLM → synthesizer 流水线,并异步迭代 assistant.execute() 获取流式输出结果块;examples/simple_assistant.py 与 examples/text_only_assistant.py 展示了完整用法,Agent 的增删改查 REST API 记录在仓库根目录的 API.md。本地部署通过 local_setup/start.sh 或 docker compose build/up -d 启动四个容器,密钥通过 .env 文件配置(如 DEEPGRAM_AUTH_TOKEN、ELEVENLABS_API_KEY、TWILIO_ACCOUNT_SID 等)。
- 需要在产品中快速搭建可拨打和接听电话的语音客服或外呼助手的开发团队
- 希望用自有 LLM 密钥(OpenAI、DeepSeek、VLLM 托管模型等)自托管语音对话流水线、避免依赖单一 SaaS 的工程师
- 想在 Twilio 或 Plivo 之上构建双向流式语音应用并需要现成 WebSocket 编排层的开发者
- 需要在 ElevenLabs、Cartesia、AWS Polly 等多个 TTS 与 Deepgram、Azure 等多个 ASR 之间切换评测的技术选型者
- 偏好纯 Python 编程接口、以异步流式方式处理语音对话结果的开发者(examples/ 目录提供可直接运行的示例)
- 只想构建纯文本 LLM 对话流水线、不需要音频输入输出的用户(可用 text_only 模式)
这个 Agent 有哪些优点和局限?
- 提供商高度可替换:ASR(Deepgram、Azure)、LLM(通过 LiteLLM 支持 OpenAI、DeepSeek、Llama、Cohere、Mistral 及 VLLM 托管模型)、TTS(ElevenLabs、Cartesia、AWS Polly 等)、电话(Twilio、Plivo)均可组合切换,避免锁定单一供应商
- 提供完整可运行的本地部署路径:local_setup/ 中的 Docker 化四容器方案(电话服务器、Bolna 服务器、ngrok、Redis)附带 start.sh 一键脚本
- 同时提供 Python 编程接口(Assistant 类、异步流式 execute)与 REST API(API.md),并附 text-only 流水线示例,接入方式灵活
- README 文档化了如何通过继承 input_handlers 和 output_handlers 中的 telephony.py 类来扩展 Vonage、Telnyx 等新电话提供商
- 托管 API 与无代码 playground(platform.bolna.ai)均为闭源,完整产品体验需要依赖厂商托管服务
- 本地打电话依赖 ngrok 隧道和 Twilio/Plivo 付费账号,部署链条较长(四个容器 + 环境密钥配置)
- 项目公开声明正在积极寻找维护者,且承认过去因时间紧张在开源与托管方案之间的维护投入有过波动,长期维护节奏存在不确定性
- assistant.execute() 的输出字典字段随提供商和工具配置变化,没有固定 schema,调用方需自行处理流式增量解析
- 部分电话提供商(Exotel、Vonage)仍标注为'即将推出',尚未实现
如何安装或部署这个 Agent?
前置要求:安装 Docker 与 Docker Compose V2。快速开始:
cd local_setup
chmod +x start.sh
./start.sh该脚本会检查 Docker 依赖、启用 BuildKit 构建所有服务并以分离模式启动。手动方式:设置 export DOCKER_BUILDKIT=1 和 export COMPOSE_DOCKER_CLI_BUILD=1,然后 docker compose build,再 docker compose up -d。也可只启动部分服务:docker compose up -d bolna-app twilio-app(或 plivo-app)。首次运行前需从 .env.sample 复制生成 .env 并填入所选提供商的密钥;使用 Twilio 或 Plivo 打电话需先注册相应账号,ngrok 需在 ngrok-config.yml 中填入 authtoken。
如何使用这个 Agent?
方式一(Docker 本地部署):启动四个容器后,即可创建 Agent 并指示其发起电话,Agent 与提示词数据由 Redis 持久化;可在 examples.bolna.dev 试用不同的示例 Agent。方式二(纯 Python 编程):设置环境变量 OPENAI_API_KEY、DEEPGRAM_AUTH_TOKEN、ELEVENLABS_API_KEY,然后运行 python examples/simple_assistant.py。代码中通过 Assistant(name=...) 创建助手,用 add_task(task_type='conversation', llm_agent=..., transcriber=..., synthesizer=...) 组装流水线,并异步迭代 assistant.execute(),它是一个按任务步骤产出字典块的异步生成器,字段随配置变化,应逐块增量处理。文本-only 模式:add_task 时设置 enable_textual_input=True 且不传 transcriber/synthesizer,仅需 OPENAI_API_KEY。基于 REST 的 Agent CRUD 见仓库根目录 API.md。
这个 Agent 与同类方案有什么区别?
README 将 Bolna 与其自身的托管 API 及 platform.bolna.ai 无代码 playground 区分开:开源仓库是核心编排平台,新功能先落地于此,再逐步暴露到托管 API 和 UI。除此之外,源材料未提及其他具体竞争产品,无法作可靠对比。