Boilerplate-free voice agents.

Define a prompt, register Python functions as tools, deploy — across four voice-agent backends. minmo handles JSON-Schema generation, local tool hosting and tunneling, and each provider's REST API, so you write the assistant, not the plumbing.

install
pip install minmo
main.py
from minmo import VoiceAgent

agent = VoiceAgent(
    prompt="You are a friendly voice assistant.",
    api_key="YOUR_ASSEMBLYAI_API_KEY",
)

@agent.tool
def get_weather(city: str) -> str:
    """Get the current weather for a city."""
    return f"It's sunny in {city}."

agent.deploy(local=True)
main.py
from minmo import VoiceAgent
from minmo.providers.elevenlabs import ElevenLabsProvider

agent = VoiceAgent(
    prompt="You are a friendly voice assistant.",
    api_key="YOUR_ELEVENLABS_API_KEY",
    provider=ElevenLabsProvider(),
)

@agent.tool
def get_weather(city: str) -> str:
    """Get the current weather for a city."""
    return f"It's sunny in {city}."

agent.deploy(local=True)
main.py
from minmo import VoiceAgent
from minmo.providers.hume import HumeProvider

agent = VoiceAgent(
    prompt="You are a friendly voice assistant.",
    api_key="YOUR_HUME_API_KEY",
    provider=HumeProvider(),
    provider_options={"secret_key": "YOUR_HUME_SECRET_KEY"},
)

@agent.tool(transport="client")
def get_weather(city: str) -> str:
    """Get the current weather for a city."""
    return f"It's sunny in {city}."

agent.deploy()
Zero boilerplate
One decorator turns a typed Python function into a real, reachable tool. One deploy() call ships it.
Provider-agnostic
The same VoiceAgent API works across AssemblyAI, Hume, and ElevenLabs — three backends that don't share a wire protocol.
Fail fast, explain
Typed errors and a plain-language "info" string on every deploy() result: what happened, what to do next.
Test without spending
simulate() runs your tool logic against any OpenAI-compatible LLM — no live voice session, no burned minutes.