Files
calesthioandHanzo Dev 7ffb943132 Initial release — OpenMontage: the first open-source agentic video production system
11 production pipelines, 47 tools, 124 agent skills.
Supports cloud APIs (fal.ai, OpenAI, ElevenLabs, Suno, HeyGen, Runway) and
free local providers (diffusers, Piper TTS, WAN 2.1, Hunyuan, CogVideo).

Co-authored-by: Hanzo Dev <[email protected]>
2026-03-29 08:25:17 -07:00

22 KiB

Agent Configuration

Complete reference for configuring conversational AI agents.

Configuration Structure

agent = client.conversational_ai.agents.create(
    name="My Agent",
    conversation_config={
        "agent": {
            "first_message": "Hello!",
            "language": "en",
            "prompt": {           # LLM, system prompt, tools, and knowledge base
                "prompt": "You are helpful.",
                "llm": "gemini-2.0-flash",
                "tools": [...],
                "built_in_tools": {...}
            }
        },
        "tts": {...},             # Voice and TTS model settings
        "asr": {...},             # Speech recognition settings
        "turn": {...},            # Turn-taking behavior
        "conversation": {...},    # Duration, events, monitoring
        "vad": {...},             # Voice activity detection config
        "language_presets": {...}  # Language-specific overrides
    },
    platform_settings={...}       # Auth, call limits
)

conversation_config

Controls the real-time conversation behavior.

agent

conversation_config={
    "agent": {
        "first_message": "Hello! How can I help you today?",
        "language": "en",
        "disable_first_message_interruptions": False,
        "prompt": {
            "prompt": "You are a helpful assistant.",
            "llm": "gemini-2.0-flash",
            "temperature": 0.7
        }
    }
}
Field Type Default Description
first_message string "" What the agent says when conversation starts
language string "en" ISO 639-1 language code (en, es, fr, etc.)
disable_first_message_interruptions bool false Prevent user from interrupting the first message
hinglish_mode bool false When enabled and language is Hindi, agent responds in Hinglish
dynamic_variables object - Config with dynamic_variable_placeholders containing key-value pairs
prompt object - LLM configuration (see prompt section below)

tts (Text-to-Speech)

conversation_config={
    "tts": {
        "voice_id": "JBFqnCBsd6RMkjVDRZzb",
        "model_id": "eleven_flash_v2_5",
        "stability": 0.5,
        "similarity_boost": 0.8,
        "speed": 1.0,
        "optimize_streaming_latency": 3,
        "expressive_mode": True
    }
}
Field Type Default Description
voice_id string "cjVigY5qzO86Huf0OWal" Voice to use
model_id string - TTS model (see below)
stability float 0.5 0-1, lower = more expressive
similarity_boost float 0.8 0-1, higher = closer to original voice
speed float 1.0 0.7-1.2, speech speed multiplier
optimize_streaming_latency int - 0-4, higher = faster but lower quality
expressive_mode bool true Enable expressive voice generation
agent_output_audio_format string - Output audio codec format
pronunciation_dictionary_locators array - Pronunciation overrides

Available TTS models for agents:

Model ID Languages Latency
eleven_flash_v2_5 32 ~75ms (recommended)
eleven_flash_v2 English ~75ms
eleven_turbo_v2_5 32 ~250-300ms
eleven_turbo_v2 English ~250-300ms
eleven_multilingual_v2 29 Standard
eleven_v3_conversational 70+ Standard

asr (Automatic Speech Recognition)

conversation_config={
    "asr": {
        "quality": "high",
        "keywords": ["ElevenLabs", "TechCorp"],
        "user_input_audio_format": "pcm_16000"
    }
}
Field Type Default Description
quality string "high" Transcription quality level
provider string "elevenlabs" ASR provider (elevenlabs or scribe_realtime)
keywords array - Words to boost recognition accuracy
user_input_audio_format string - Input audio format (e.g., pcm_16000, ulaw_8000)

turn (Turn-Taking)

conversation_config={
    "turn": {
        "turn_timeout": 7,
        "turn_eagerness": "normal",
        "silence_end_call_timeout": -1
    }
}
Field Type Default Description
turn_timeout number 7 Seconds to wait before re-engaging the user
turn_eagerness string "normal" How quickly agent responds: patient, normal, or eager
silence_end_call_timeout number -1 Seconds of silence before ending call (-1 = disabled)
initial_wait_time number - Seconds to wait for user to start speaking
spelling_patience string "auto" Entity detection patience: auto or off
speculative_turn bool false Enable speculative turn detection
soft_timeout_config object - Configures a message if user is silent (see below)

soft_timeout_config:

Field Type Default Description
timeout_seconds number -1 Seconds before soft timeout (-1 = disabled)
message string "Hhmmmm...yeah." What agent says on timeout
use_llm_generated_message bool false Let LLM generate the timeout message

prompt (nested in conversation_config.agent)

Configures the LLM behavior. This object lives at conversation_config.agent.prompt:

conversation_config={
    "agent": {
        "prompt": {
            "prompt": "You are a helpful customer service agent...",
            "llm": "gemini-2.0-flash",
            "temperature": 0.7,
            "max_tokens": 500,
            "tools": [...],
            "built_in_tools": {...},
            "knowledge_base": [...]
        }
    }
}
Field Type Default Description
prompt string "" System prompt defining agent behavior
llm string - Model ID (see LLM providers below)
temperature float 0 0-1, higher = more creative
max_tokens int -1 Max tokens for LLM response (-1 = unlimited)
reasoning_effort string - Reasoning depth: none, minimal, low, medium, high (model-dependent)
thinking_budget int - Max thinking tokens for reasoning models
tools array - Webhook and client tool definitions
built_in_tools object - System tools (end_call, transfer, etc.)
tool_ids array - References to pre-configured tools
knowledge_base array - Documents for RAG
custom_llm object - Custom LLM endpoint config
timezone string - IANA timezone (e.g., America/New_York)
backup_llm_config object - Fallback LLM configuration
cascade_timeout_seconds number 8 Seconds before cascading to backup LLM (2-15)
mcp_server_ids array - MCP server IDs to connect
native_mcp_server_ids array - Native MCP server IDs
ignore_default_personality bool - Skip default personality instructions

Workspace environment variables let one agent configuration span multiple deployments. Use {{system_env__label}} in server tool and MCP server URLs, { "env_var_label": "orders_api_key" } for secret-backed tool headers, and { "env_var_label": "orders_oauth" } in auth_connection to resolve per-environment auth connections at runtime.

LLM Providers

Provider Model IDs
OpenAI gpt-5, gpt-5-mini, gpt-5-nano, gpt-4.1, gpt-4.1-mini, gpt-4.1-nano, gpt-4o, gpt-4o-mini, gpt-4-turbo
Anthropic claude-sonnet-4-6, claude-sonnet-4-5, claude-sonnet-4, claude-haiku-4-5, claude-3-7-sonnet, claude-3-5-sonnet, claude-3-haiku
Google gemini-3.1-flash-lite-preview, gemini-3-pro-preview, gemini-3-flash-preview, gemini-2.5-flash, gemini-2.5-flash-lite, gemini-2.0-flash, gemini-2.0-flash-lite
ElevenLabs glm-45-air-fp8, qwen3-30b-a3b, gpt-oss-120b (hosted, ultra-low latency)
Custom custom-llm (requires custom_llm config)

Use GET /v1/convai/llm/list to inspect the current model catalog, including deprecation state, token/context limits, and capability flags such as image-input support.

Custom LLM

The custom_llm field is nested inside conversation_config.agent.prompt:

conversation_config={
    "agent": {
        "prompt": {
            "prompt": "You are helpful.",
            "llm": "custom-llm",
            "custom_llm": {
                "url": "https://your-llm-endpoint.com/v1/chat/completions",
                "model_id": "your-model-id",
                "api_key": {"secret_id": "your-secret-id"},
                "api_type": "chat_completions"  # or "responses"
            }
        }
    }
}

platform_settings

Platform-level configuration for security, limits, summaries, and widget behavior.

platform_settings={
    "summary_language": "en",
    "widget": {
        "show_agent_status": True,
        "show_conversation_id": True
    },
    "auth": {
        "enable_auth": True,
        "allowlist": [{"hostname": "example.com"}]
    },
    "call_limits": {
        "agent_concurrency_limit": 10,
        "daily_limit": 100
    }
}

Top-Level Fields

Field Type Description
summary_language string Language for conversation analysis outputs such as summaries, titles, evaluation rationales, and data collection rationales. If omitted, ElevenLabs infers it from the conversation.
widget object Hosted widget and shareable page configuration. See the widget table below for selected options.
auth object Authentication and origin restrictions for agent access
call_limits object Concurrency and daily usage limits
guardrails object Built-in safety and policy controls for agent interactions
privacy object Recording, retention, and conversation history redaction settings

auth

Field Type Description
enable_auth bool Require signed URLs/tokens for connections
allowlist array Allowed origins for CORS
shareable_token string Public conversation token

call_limits

Field Type Description
agent_concurrency_limit int Max simultaneous conversations (default: -1, unlimited)
daily_limit int Max conversations per day (default: 100000)
bursting_enabled bool Allow exceeding limits at 2x cost (default: true)

guardrails

Use platform_settings.guardrails to configure built-in safety controls for user input and agent behavior. The fields below cover the current schema additions that are most relevant in agent configs.

Field Type Description
version string Guardrail config version. Use "1" for the current schema.
focus object Keeps the agent on-topic and aligned with the configured task.
prompt_injection object Detects prompt injection and instruction override attempts.
custom object Configures user-defined response validation guardrails.
content object Configures category-specific content moderation guardrails.

focus / prompt_injection:

Field Type Description
is_enabled bool Enables the guardrail.

content:

Field Type Description
execution_mode string Guardrail execution mode: streaming or blocking.
config object Category threshold settings for content moderation.

content.config:

Field Type Description
sexual object Threshold settings for sexual content.
violence object Threshold settings for violent content.
harassment object Threshold settings for harassment.
self_harm object Threshold settings for self-harm content.
profanity object Threshold settings for profanity.
religion_or_politics object Threshold settings for religion or politics content.
medical_and_legal_information object Threshold settings for medical or legal information.

content.config.<category>:

Field Type Description
is_enabled bool Enables moderation for the category.
threshold number or string Category threshold as a numeric score or one of low, medium, or high.

Blocking content guardrails and custom guardrails support a trigger_action that either ends the session immediately or retries the response. Retry removes the blocked reply, injects your feedback as a system message, and re-generates up to 3 times before the platform falls back to ending the session. Feedback templates can use {{trigger_reason}} and {{agent_message}}.

privacy

Use platform_settings.privacy to control recording, retention, and redaction behavior. The redaction-specific field is:

Field Type Description
conversation_history_redaction object Redacts configured entity types from stored transcripts, audio, and analysis.

conversation_history_redaction:

Field Type Default Description
enabled bool false Whether conversation history redaction is enabled
entities array - Entity types to redact. Use parent types such as name or specific values such as name.name_given, email_address, contact_number, dob, and age.

widget

Use platform_settings.widget to configure the hosted widget and shareable page defaults. For client-side embed attributes, see the widget embedding reference.

Field Type Default Description
dismissible bool false Whether the widget can be dismissed by the user
show_agent_status bool false Whether to show working, done, or error status while tools are running
show_conversation_id bool true Whether to show the conversation ID after disconnection
strip_audio_tags bool true Whether to strip audio markup from messages
syntax_highlight_theme string auto Code block syntax highlighting theme (light or dark); omit it to let the widget auto-detect

conversation (inside conversation_config)

Field Type Default Description
max_duration_seconds int 600 Max conversation duration
text_only bool false Text-only mode (avoids audio pricing)
monitoring_enabled bool false Enable real-time WebSocket monitoring

Additional Top-Level Fields

Field Type Description
tags array Classification labels for filtering (e.g., ["production"], ["test"])
workflow object Conversation flow definition and tool interaction sequences

Knowledge Base / RAG

Knowledge base is configured inside conversation_config.agent.prompt:

agent = client.conversational_ai.agents.create(
    name="Support Agent",
    conversation_config={
        "agent": {
            "prompt": {
                "prompt": "You are a support agent. Use the knowledge base to answer questions.",
                "llm": "gemini-2.0-flash",
                "knowledge_base": [
                    {"type": "file", "id": "doc-id", "name": "Product Guide", "usage_mode": "auto"}
                ],
                "rag": {
                    "enabled": True,
                    "embedding_model": "qwen3_embedding_4b",
                    "max_documents_length": 50000,
                    "max_retrieved_rag_chunks_count": 20
                }
            }
        },
        "tts": {"voice_id": "JBFqnCBsd6RMkjVDRZzb"}
    }
)

rag.embedding_model supports e5_mistral_7b_instruct, multilingual_e5_large_instruct, and qwen3_embedding_4b.

CRUD Operations

# Initialize project
elevenlabs agents init

# Create agent from template
elevenlabs agents add "My Agent" --template complete
elevenlabs agents add "Support Bot" --template customer-service

# List agents
elevenlabs agents list

# Check status
elevenlabs agents status

# Push local changes to platform
elevenlabs agents push
elevenlabs agents push --dry-run    # Preview changes first

# Import agents from platform
elevenlabs agents pull                      # Import all
elevenlabs agents pull --agent <agent-id>   # Import specific agent
elevenlabs agents pull --update             # Override local configs

# View available templates
elevenlabs agents templates list
elevenlabs agents templates show <template-name>

# Add tools
elevenlabs tools add-webhook "API Tool"
elevenlabs tools add-client "UI Tool"

# Generate widget code
elevenlabs agents widget <agent-id>

SDK: List Agents

agents = client.conversational_ai.agents.list()
for agent in agents.agents:
    print(f"{agent.name}: {agent.agent_id}")
const agents = await client.conversationalAi.agents.list();
curl -X GET "https://api.elevenlabs.io/v1/convai/agents" -H "xi-api-key: $ELEVENLABS_API_KEY"

SDK: Get Agent

agent = client.conversational_ai.agents.get(agent_id="your-agent-id")
const agent = await client.conversationalAi.agents.get("your-agent-id");
curl -X GET "https://api.elevenlabs.io/v1/convai/agents/your-agent-id" -H "xi-api-key: $ELEVENLABS_API_KEY"

SDK: Update Agent

Only include fields you want to change. All other settings remain unchanged.

Python:

# Update name
client.conversational_ai.agents.update(agent_id="id", name="New Name")

# Update TTS voice
client.conversational_ai.agents.update(agent_id="id", conversation_config={
    "tts": {"voice_id": "EXAVITQu4vr4xnSDxMaL", "model_id": "eleven_flash_v2_5"}
})

# Update prompt/LLM (nested in agent)
client.conversational_ai.agents.update(agent_id="id", conversation_config={
    "agent": {"prompt": {"prompt": "New instructions.", "llm": "claude-sonnet-4", "temperature": 0.8}}
})

# Update first message
client.conversational_ai.agents.update(agent_id="id", conversation_config={
    "agent": {"first_message": "Welcome back!"}
})

# Update platform settings
client.conversational_ai.agents.update(agent_id="id", platform_settings={
    "auth": {"enable_auth": True, "allowlist": [{"hostname": "myapp.com"}]}
})

JavaScript:

await client.conversationalAi.agents.update("id", { name: "New Name" });
await client.conversationalAi.agents.update("id", {
  conversationConfig: { tts: { voiceId: "EXAVITQu4vr4xnSDxMaL" } }
});
await client.conversationalAi.agents.update("id", {
  conversationConfig: { agent: { prompt: { prompt: "New instructions.", llm: "claude-sonnet-4" } } }
});

cURL:

curl -X PATCH "https://api.elevenlabs.io/v1/convai/agents/your-agent-id" \
  -H "xi-api-key: $ELEVENLABS_API_KEY" -H "Content-Type: application/json" \
  -d '{"name": "New Name"}'

Updatable Fields

Section Fields
Root name, tags
conversation_config.agent first_message, language, disable_first_message_interruptions, dynamic_variables
conversation_config.agent.prompt prompt, llm, temperature, max_tokens, reasoning_effort, tools, built_in_tools, knowledge_base, custom_llm, timezone
conversation_config.tts voice_id, model_id, stability, similarity_boost, speed, optimize_streaming_latency, expressive_mode
conversation_config.asr quality, provider, keywords, user_input_audio_format
conversation_config.turn turn_timeout, turn_eagerness, silence_end_call_timeout, soft_timeout_config
conversation_config.conversation max_duration_seconds, text_only, monitoring_enabled
platform_settings summary_language, guardrails, privacy
platform_settings.widget dismissible, show_agent_status, show_conversation_id, strip_audio_tags, syntax_highlight_theme
platform_settings.auth enable_auth, allowlist
platform_settings.call_limits agent_concurrency_limit, daily_limit, bursting_enabled

SDK: Delete Agent

client.conversational_ai.agents.delete(agent_id="your-agent-id")
await client.conversationalAi.agents.delete("your-agent-id");
curl -X DELETE "https://api.elevenlabs.io/v1/convai/agents/your-agent-id" -H "xi-api-key: $ELEVENLABS_API_KEY"

CI/CD Integration

Use the CLI in your deployment pipeline:

# Set API key as environment variable
export ELEVENLABS_API_KEY="your-api-key"

# Push changes (non-interactive)
elevenlabs agents push

Example Configurations

Customer Support Agent

agent = client.conversational_ai.agents.create(
    name="Support Agent",
    conversation_config={
        "agent": {
            "first_message": "Hi! Thanks for calling TechCorp support.",
            "language": "en",
            "prompt": {
                "prompt": "You are a customer support agent. Be helpful, professional, concise.",
                "llm": "gemini-2.0-flash",
                "temperature": 0.5,
                "built_in_tools": {
                    "end_call": {},
                    "transfer_to_number": {
                        "transfers": [{"transfer_destination": {"type": "phone", "phone_number": "+1234567890"}, "condition": "User asks for human support"}]
                    }
                }
            }
        },
        "tts": {"voice_id": "XB0fDUnXU5powFXDhCwa", "model_id": "eleven_flash_v2_5"},
        "turn": {"turn_eagerness": "normal", "turn_timeout": 7},
        "conversation": {"max_duration_seconds": 900}
    }
)

Low-Latency Assistant

agent = client.conversational_ai.agents.create(
    name="Quick Assistant",
    conversation_config={
        "agent": {
            "first_message": "Hey! What do you need?",
            "prompt": {
                "prompt": "Fast, efficient assistant. Brief answers.",
                "llm": "gemini-2.0-flash",
                "temperature": 0.3,
                "max_tokens": 100
            }
        },
        "tts": {"voice_id": "JBFqnCBsd6RMkjVDRZzb", "model_id": "eleven_flash_v2_5", "optimize_streaming_latency": 4},
        "turn": {"turn_eagerness": "eager", "turn_timeout": 3}
    }
)