← Open Source
bolna-ai

bolna

Conversational voice AI agents.

AI EngineeringMake agent see hear talkPython
Open on GitHub
Momentum
+1stars in 24 hours+0.1%
794
Stars
374
Forks
+7
This week
39
Contributors
Created 2024-08-24 · Updated 2026-10-16 · #6256 today
Top developers

bolna-ai/bolna is ranked 6,256 with 794 stars.

Same-category comparison

bolna-ai/bolna is ranked 6,256 among these 8 peers; Doriandarko/RepoToTextForLLMs is ranked 6,255.

Same-category comparison
NameRankMetrics
MME-Benchmarks/Video-MME6,242
Stars:
801
Forks:
29
Description:
✨✨[CVPR 2025] Video-MME: The First-Ever Comprehensive Evaluation Benchmark of Multi-modal LLMs in Video Analysis.
Marve10s/Better-Fullstack6,249
Language:
TypeScript
Stars:
798
Forks:
56
Description:
Scaffold production-ready full-stack apps in TypeScript, Rust, Python, Go, and Java with a visual builder and CLI. Choose your frontend, backend, database, auth, AI, payments, and DevOps integrations, all wired together.
Ark0N/Codeman6,253
Language:
TypeScript
Stars:
797
Forks:
124
Description:
Self-hosted mission control for AI coding agents: run Claude Code, OpenCode, Pi, Codex, and Antigravity & Gemini CLI 24/7, from any device, watch every subagent live.
Doriandarko/RepoToTextForLLMs6,255
Language:
Python
Stars:
794
Forks:
101
Description:
Automate the analysis of GitHub repositories for LLMs with RepoToTextForLLMs. Fetch READMEs, structure, and non-binary files efficiently. Outputs include analysis prompts to aid in comprehensive repo evaluation.
bruin-data/dac6,258
Language:
Go
Stars:
793
Forks:
38
Description:
DaC is a dashboard-as-code tool. Build interactive dashboards using YAML and JSX. Built-in semantic layer. Get your agents to build standardized, reviewable dashboards.
SAIL-Research-Lab/cheetahclaws6,265
Language:
Python
Stars:
788
Forks:
275
Description:
CheetahClaws: A Fast and Easy-to-Use Agent Harness Infrastructure for Long-Horizon, Multi-Model, and Tool-Using AI Systems.
stackblitz-labs/use-stick-to-bottom6,274
Language:
TypeScript
Stars:
782
Forks:
59
Description:
A lightweight React Hook intended mainly for AI chat applications, for smoothly sticking to bottom of messages.
alirezarezvani/claude-code-tresor6,276
Language:
Shell
Stars:
781
Forks:
168
Description:
A world-class collection of Claude Code utilities: autonomous skills, expert agents, slash commands, and prompts that supercharge your development workflow.
Key parameters and specifications
Key parameters and specifications
ParameterValue
LanguagePython
CategoryAI Engineering
SubcategoryMake agent see hear talk
Stars794
Forks374
Contributors39
Created date2024-08-24
Updated date2026-10-16
Stars in 1 day1
Stars in 7 days7
Rank6,256
Previous rank13,659
Rank change7,403
7-day stars rank4,823
Previous 7-day stars rank4,848
7-day stars rank change25
Total stars rank13,428
Previous total stars rank13,432
Total stars rank change4
CountryUSA
README summary

End-to-end open-source voice agents platform : Quickly build voice firsts conversational assistants through a json. NOTE] We are actively looking for maintainers. Introduction **Bolna** is the end-to-end open source production ready framework for quickly building LLM based voice driven conversational applications. This repository contains the entire orchestration platform to build voice AI applications. It technically orchestrates voice conversations using combination of different ASR+LLM+TTS providers and models over websockets. Components Bolna helps you create AI

Voice Agents which can be instructed to do tasks beginning with: 1. Orchestration platform (this open source repository) 2. Hosted APIs ( built on top of this orchestration platform [currently closed source] 3. No-code UI playground at using the hosted APIs + tailwind CSS [currently closed source] Development philosophy 1. Any integration, enhancement or feature initially lands on this open source package since it forms the backbone of our Hosted APIs and dashboard 2. Post that we expose APIs or make

changes to existing APIs as required for the same 3. Thirdly, we push it to the UI dashboard Supported providers and models 1. Initiating a phone call using telephony providers like , , (coming soon), (coming soon) etc. Transcribing the conversations using , etc. Using LLMs like , , , , , etc to handle conversations 4. Synthesizing LLM responses back to telephony using , , , , , , , , etc. Refer to the docs for a deepdive into all supported providers. Local example setup [will be moved to a different repository] A basic

local setup includes usage of Twilio or Plivo for telephony. One will need to populate an environment file from . The setup consists of four containers: 1. Telephony web server: Choosing Twilio: for initiating the calls one will need to set up a Twilio account Choosing Plivo: for initiating the calls one will need to set up a Plivo account 2. Bolna server: for creating and handling agents 3. : for persisting agents & prompt data Quick Start The easiest way to get

started is to use the provided script: This script will check for Docker dependencies, build all services with BuildKit enabled, and start them in detached mode. Manual Setup Alternatively, you can manually build and run the services: 1. Make sure you have Docker with Docker Compose V2 installed 2. Run the services: To run specific services only: Once the docker containers are up, you can now start to create your agents and instruct them to initiate calls. Example agents to

create, use and start making calls You may try out different agents from example. Programmatic usage (minimal example) You can also build and run an agent directly in Python without the local telephony setup. Example script: How to run: This demonstrates orchestration and streaming output. Note: For REST-based usage (Agent CRUD over HTTP), see in the repo root. Expected output shape: is an async generator yielding per-task result dicts (event-like chunks). The exact keys depend on configured

tools/providers; treat it as a stream and process incrementally. Text-only pipeline example If you want a text-only

Frequently asked questions

How many stars and forks are recorded?

bolna-ai/bolna has 794 stars and 374 forks.

What is the repository rank?

bolna-ai/bolna is ranked 6,256.

What language and category are recorded?

bolna-ai/bolna has 794 stars, uses Python and belongs to AI Engineering.

Which repository is closest in rank?

bolna-ai/bolna is compared with Doriandarko/RepoToTextForLLMs, ranked 6,255 with 794 stars.

README

End-to-end open-source voice agents platform: Quickly build voice firsts conversational assistants through a json.

Discord | Hosted Docs | Website

[!NOTE] We are actively looking for maintainers.

Introduction

Bolna is the end-to-end open source production ready framework for quickly building LLM based voice driven conversational applications.

Demo

https://github.com/bolna-ai/bolna/assets/1313096/2237f64f-1c5b-4723-b7e7-d11466e9b226

What is this repository?

This repository contains the entire orchestration platform to build voice AI applications. It technically orchestrates voice conversations using combination of different ASR+LLM+TTS providers and models over websockets.

Components

Bolna helps you create AI Voice Agents which can be instructed to do tasks beginning with:

  1. Orchestration platform (this open source repository)
  2. Hosted APIs (https://docs.bolna.ai/api-reference/introduction) built on top of this orchestration platform [currently closed source]
  3. No-code UI playground at https://platform.bolna.ai/ using the hosted APIs + tailwind CSS [currently closed source]

Development philosophy

  1. Any integration, enhancement or feature initially lands on this open source package since it forms the backbone of our Hosted APIs and dashboard
  2. Post that we expose APIs or make changes to existing APIs as required for the same
  3. Thirdly, we push it to the UI dashboard
graph LR;
    A[Bolna open source] -->B[Hosted APIs];
    B[Hosted APIs] --> C[Hosted Playground]

Supported providers and models

  1. Initiating a phone call using telephony providers like Twilio, Plivo, Exotel (coming soon), Vonage (coming soon) etc.
  2. Transcribing the conversations using Deepgram, Azure etc.
  3. Using LLMs like OpenAI, DeepSeek, Llama, Cohere, Mistral, etc to handle conversations
  4. Synthesizing LLM responses back to telephony using AWS Polly, ElevenLabs, Deepgram, OpenAI, Azure, Cartesia, Smallest, Maya, Kalpa etc.

Refer to the docs for a deepdive into all supported providers.

Local example setup [will be moved to a different repository]

A basic local setup includes usage of Twilio or Plivo for telephony. We have dockerized the setup in local_setup/. One will need to populate an environment .env file from .env.sample.

The setup consists of four containers:

  1. Telephony web server:
    • Choosing Twilio: for initiating the calls one will need to set up a Twilio account
    • Choosing Plivo: for initiating the calls one will need to set up a Plivo account
  2. Bolna server: for creating and handling agents
  3. ngrok: for tunneling. One will need to add the authtoken to ngrok-config.yml
  4. redis: for persisting agents & prompt data

Quick Start

The easiest way to get started is to use the provided script:

cd local_setup
chmod +x start.sh
./start.sh

This script will check for Docker dependencies, build all services with BuildKit enabled, and start them in detached mode.

Manual Setup

Alternatively, you can manually build and run the services:

  1. Make sure you have Docker with Docker Compose V2 installed
  2. Enable BuildKit for faster builds:
    export DOCKER_BUILDKIT=1
    export COMPOSE_DOCKER_CLI_BUILD=1
    
  3. Build the images:
    docker compose build
    
  4. Run the services:
    docker compose up -d
    

To run specific services only:

docker compose up -d bolna-app twilio-app
# or
docker compose up -d bolna-app plivo-app

Once the docker containers are up, you can now start to create your agents and instruct them to initiate calls.

Example agents to create, use and start making calls

You may try out different agents from example.bolna.dev.

Programmatic usage (minimal example)

You can also build and run an agent directly in Python without the local telephony setup.

Example script: examples/simple_assistant.py

import asyncio
from bolna.assistant import Assistant
from bolna.models import (
    Transcriber,
    Synthesizer,
    ElevenLabsConfig,
    LlmAgent,
    SimpleLlmAgent,
)


async def main():
    assistant = Assistant(name="demo_agent")

    # Configure audio input (ASR)
    transcriber = Transcriber(provider="deepgram", model="nova-2", stream=True, language="en")

    # Configure LLM
    llm_agent = LlmAgent(
        agent_type="simple_llm_agent",
        agent_flow_type="streaming",
        llm_config=SimpleLlmAgent(
            provider="openai",
            model="gpt-4o-mini",
            temperature=0.3,
        ),
    )

    # Configure audio output (TTS)
    synthesizer = Synthesizer(
        provider="elevenlabs",
        provider_config=ElevenLabsConfig(voice="George", voice_id="JBFqnCBsd6RMkjVDRZzb", model="eleven_turbo_v2_5"),
        stream=True,
        audio_format="wav",
    )

    # Build a single coherent pipeline: transcriber -> llm -> synthesizer
    assistant.add_task(
        task_type="conversation",
        llm_agent=llm_agent,
        transcriber=transcriber,
        synthesizer=synthesizer,
        enable_textual_input=False,
    )

    # Stream results
    async for chunk in assistant.execute():
        print(chunk)


if __name__ == "__main__":
    asyncio.run(main())

How to run:

export OPENAI_API_KEY=...
export DEEPGRAM_AUTH_TOKEN=...
export ELEVENLABS_API_KEY=...
python examples/simple_assistant.py

This demonstrates orchestration and streaming output. For telephony, use the services in local_setup/.

Note: For REST-based usage (Agent CRUD over HTTP), see API.md in the repo root.

Expected output shape: assistant.execute() is an async generator yielding per-task result dicts (event-like chunks). The exact keys depend on configured tools/providers; treat it as a stream and process incrementally.

Text-only pipeline example

If you want a text-only flow (no transcriber/synthesizer), you can enable a text-only pipeline:

Example script: examples/text_only_assistant.py

import asyncio
from bolna.assistant import Assistant
from bolna.models import LlmAgent, SimpleLlmAgent


async def main():
    assistant = Assistant(name="text_only_agent")

    llm_agent = LlmAgent(
        agent_type="simple_llm_agent",
        agent_flow_type="streaming",
        llm_config=SimpleLlmAgent(
            provider="openai",
            model="gpt-4o-mini",
            temperature=0.2,
        ),
    )

    # No transcriber/synthesizer; enable a text-only pipeline
    assistant.add_task(
        task_type="conversation",
        llm_agent=llm_agent,
        enable_textual_input=True,
    )

    async for chunk in assistant.execute():
        print(chunk)


if __name__ == "__main__":
    asyncio.run(main())

How to run (text-only):

export OPENAI_API_KEY=...
python examples/text_only_assistant.py

Expected output shape: assistant.execute() yields streaming dicts per task step; fields vary by configuration. Handle chunk-by-chunk.

Using your own providers

You can populate the .env file to use your own keys for providers.

ASR Providers

These are the current supported ASRs Providers:

Provider Environment variable to be added in .env file
Deepgram DEEPGRAM_AUTH_TOKEN
Bolna (self-hosted, OpenAI Realtime transcription protocol) REALTIME_TRANSCRIBER_URL ({model} is replaced by the model), REALTIME_TRANSCRIBER_KEY

 

LLM Providers

Bolna uses LiteLLM package to support multiple LLM integrations.

These are the current supported LLM Provider Family: https://github.com/bolna-ai/bolna/blob/10fa26e5985d342eedb5a8985642f12f1cf92a4b/bolna/providers.py#L30-L47

For LiteLLM based LLMs, add either of the following to the .env file depending on your use-case:

LITELLM_MODEL_API_KEY: API Key of the LLM

LITELLM_MODEL_API_BASE: URL of the hosted LLM

LITELLM_MODEL_API_VERSION: API VERSION for LLMs like Azure

For LLMs hosted via VLLM, add the following to the .env file:

VLLM_SERVER_BASE_URL: URL of the hosted LLM using VLLM

 

TTS Providers

These are the current supported TTS Providers: https://github.com/bolna-ai/bolna/blob/c8a0d1428793d4df29133119e354bc2f85a7ca76/bolna/providers.py#L7-L14

Provider Environment variable to be added in .env file
AWS Polly Accessed from system wide credentials via ~/.aws
Elevenlabs ELEVENLABS_API_KEY
OpenAI OPENAI_API_KEY
Deepgram DEEPGRAM_AUTH_TOKEN
Cartesia CARTESIA_API_KEY
Smallest SMALLEST_API_KEY
Maya MAYA_API_KEY
Kalpa KALPA_API_KEY
Custom (the customer's own server, OpenAI speech API) None: the platform injects the endpoint (synthesizer_base_url) and key (synthesizer_key) per call

 

Telephony Providers

These are the current supported Telephony Providers:

Provider Environment variable to be added in .env file
Twilio TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN, TWILIO_PHONE_NUMBER
Plivo PLIVO_AUTH_ID, PLIVO_AUTH_TOKEN, PLIVO_PHONE_NUMBER

Open-source v/s Hosted APIs

We have in the past tried to maintain both the open source and the hosted solution (via APIs and a UI dashboard).

We have fluctuated b/w maintaining this repository purely from a point of time crunch and not interest.

Currently, we are continuing to maintain it for the community and improving the adoption of Voice AI.

Though the repository is completely open source, you can connect with us if interested in managed hosted offerings or more customized solutions.

Extending with other Telephony Providers

In case you wish to extend and add some other Telephony like Vonage, Telnyx, etc. following the guidelines below:

  1. Make sure bi-directional streaming is supported by the Telephony provider
  2. Add the telephony-specific input handler file in input_handlers/telephony_providers writing custom functions extending from the telephony.py class
    1. This file will mainly contain how different types of event packets are being ingested from the telephony provider
  3. Add telephony-specific output handler file in output_handlers/telephony_providers writing custom functions extending from the telephony.py class
    1. This mainly concerns converting audio from the synthesizer class to a supported audio format and streaming it over the websocket provided by the telephony provider
  4. Lastly, you'll have to write a dedicated server like the example twilio_api_server.py provided in local_setup to initiate calls over websockets.

Security Acknowledgments

We would like to thank the following individuals for responsibly disclosing security vulnerabilities and helping us keep this project safe:

Contributing

We love all types of contributions: whether big or small helping in improving this community resource.

  1. There are a number of open issues present which can be good ones to start with
  2. If you have suggestions for enhancements, wish to contribute a simple fix such as correcting a typo, or want to address an apparent bug, please feel free to initiate a new issue or submit a pull request
  3. If you're contemplating a larger change or addition to this repository, be it in terms of its structure or the features, kindly begin by creating a new issue open a new issue :octocat: and outline your proposed changes. This will allow us to engage in a discussion before you dedicate a significant amount of time or effort. Your cooperation and understanding are appreciated
Nearby in the ranking
Similar items