Generated banner for Agents
Generated logo for Agents

Agents

ElevenLabsOfficialPublished by ElevenLabs

  • Skill
  • Tool integration
  • Data and AI
  • MIT
  • Medium risk

From the author

Build voice AI agents with ElevenLabs. Use when creating voice assistants, customer service bots, interactive voice characters, or any real-time voice conversation experience, and when configuring an agent's tools, workflows, or procedures, including creating, editing, and publishing free-form and structured procedure drafts on an agent branch over the SDKs or REST API.
— the description by ElevenLabs

AutoGineer summary

Written by AutoGineer from the skill’s own files, not by the author

The ElevenLabs Agents platform provides tools and SDKs to create, configure, and deploy voice-enabled AI agents. It supports multiple LLM providers, custom webhook and client-side tools, and structured workflows to manage conversational logic. Developers can integrate these agents into web applications via widgets or manage them programmatically through a CLI, Python SDK, or JavaScript SDK.

What it does

  • Create and manage voice AI agents with custom system prompts and LLM configurations.
  • Define custom tools for agents, including server-side webhooks and browser-based client functions.
  • Implement branching conversational workflows with node-based logic.
  • Configure safety guardrails to filter content and enforce domain-specific rules.
  • Deploy agents via web widgets or integrate them into applications using SDKs.
  • Manage agent procedures and testing scenarios through a dedicated API.

When to use it

  • Building interactive voice assistants or customer service bots.
  • Creating voice-enabled characters for real-time conversation experiences.
  • Implementing multi-step conversational flows that require branching logic.
  • Connecting AI agents to external APIs or local browser functions via tools.

Advantages

  • Supports a wide range of LLM providers and custom endpoints.
  • Provides granular control over agent behavior, including turn-taking and voice settings.
  • Enables secure integration with external services through webhook and client tools.
  • Offers built-in testing and simulation capabilities for agent evaluation.
  • Supports both programmatic management via SDKs and rapid prototyping via CLI.

Usage examples

“Create a new voice assistant agent using the ElevenLabs Python SDK.”
The agent is initialized with a specified name, system prompt, LLM model, and voice ID.
“Define a webhook tool for an agent to look up weather information.”
The agent is configured with an API schema that allows it to call an external weather service during a conversation.
“Embed a voice agent into a React application.”
The agent is rendered using the provided widget component, enabling users to start and end voice sessions.
“Configure a custom guardrail to prevent an agent from providing medical advice.”
A blocking guardrail is added to the agent's platform settings to intercept and filter specific topics.

Install

  1. Download the skill as a ZIP:

    https://mp-staging.autogineer.com/agent-skills/elevenlabs/agents/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip agents.zip -d .agents/skills

Documentation by ElevenLabs

ElevenLabs Agents Platform

Build voice AI agents with natural conversations, multiple LLM providers, custom tools, and easy web embedding.

Setup, before writing any code: if ELEVENLABS_API_KEY isn't set for this project, run npx -y @elevenlabs/cli@latest onboard init from the app's folder first and follow what it prints: it signs the user in and stores a key for the project, so nobody copies one by hand. Otherwise see the Installation Guide for CLI and SDK setup.

Quick Start with CLI

The ElevenLabs CLI is the recommended way to create and manage agents:

# Install CLI and authenticate
npm install -g @elevenlabs/cli
elevenlabs auth login

# Initialize project and create an agent
elevenlabs agents init
elevenlabs agents add "My Assistant" --template complete

# Push to ElevenLabs platform
elevenlabs agents push

Available templates: complete, minimal, voice-only, text-only, customer-service, assistant

Python
from elevenlabs import ElevenLabs

client = ElevenLabs()

agent = client.conversational_ai.agents.create(
    name="My Assistant",
    conversation_config={
        "agent": {
            "first_message": "Hello! How can I help?",
            "language": "en",
            "prompt": {
                "prompt": "You are a helpful assistant. Be concise and friendly.",
                "llm": "gemini-2.0-flash",
                "temperature": 0.7
            }
        },
        "tts": {"voice_id": "JBFqnCBsd6RMkjVDRZzb"}
    }
)
JavaScript
import { ElevenLabsClient } from "@elevenlabs/elevenlabs-js";
const client = new ElevenLabsClient();

const agent = await client.conversationalAi.agents.create({
  name: "My Assistant",
  conversationConfig: {
    agent: {
      firstMessage: "Hello! How can I help?",
      language: "en",
      prompt: {
        prompt: "You are a helpful assistant.",
        llm: "gemini-2.0-flash",
        temperature: 0.7
      }
    },
    tts: { voiceId: "JBFqnCBsd6RMkjVDRZzb" }
  }
});
CLI

The CLI reads ELEVENLABS_API_KEY from the environment automatically:

elevenlabs agents create \
  --json '{"name": "My Assistant", "conversation_config": {"agent": {"first_message": "Hello!", "language": "en", "prompt": {"prompt": "You are helpful.", "llm": "gemini-2.0-flash"}}, "tts": {"voice_id": "JBFqnCBsd6RMkjVDRZzb"}}}'

Starting Conversations

Authenticated WebRTC: Request a session token from your backend. The response includes both the token and the conversation ID:

session = client.conversational_ai.conversations.get_webrtc_token(
    agent_id="your-agent-id",
)
print(session.token, session.conversation_id)

Server-side (Python): Get signed URL for client connection:

signed_url = client.conversational_ai.conversations.get_signed_url(
    agent_id="your-agent-id",
    environment="staging",
)

Client-side (JavaScript):

import { Conversation } from "@elevenlabs/client";

const conversation = await Conversation.startSession({
  agentId: "your-agent-id",
  environment: "staging",
  overrides: { asr: { keywords: ["ElevenLabs", "TechCorp"] } },
  onMessage: (msg) => console.log("Agent:", msg.message),
  onUserTranscript: (t) => console.log("User:", t.message),
  onPing: (event) => console.log("Estimated latency:", event.ping_ms),
  onContextUsage: ({ model, context_tokens, context_limit_tokens }) =>
    console.log(`${model}: ${context_tokens}/${context_limit_tokens} context tokens`),
  onError: (e) => console.error(e)
});

React Hook: Wrap hook consumers in ConversationProvider. Prefer granular hooks such as useConversationControls and useConversationStatus for session controls and UI state; useConversation remains available as the convenience all-in-one hook. Pass provider-level callbacks such as onError when you want React to handle conversation errors in one place.

import {
  ConversationProvider,
  useConversationControls,
  useConversationStatus,
} from "@elevenlabs/react";

function Agent({ signedUrl }: { signedUrl: string }) {
  const { startSession, endSession } = useConversationControls();
  const { status } = useConversationStatus();

  if (status === "connected") {
    return <button onClick={endSession}>End conversation</button>;
  }

  return (
    <button onClick={() => startSession({ signedUrl })}>
      Start conversation
    </button>
  );
}

function App({ signedUrl }: { signedUrl: string }) {
  return (
    <ConversationProvider
      onError={(error) => console.error("Conversation error:", error)}
      onPing={(event) => console.log("Estimated latency:", event.ping_ms)}
      onContextUsage={({ model, context_tokens, context_limit_tokens }) =>
        console.log(`${model}: ${context_tokens}/${context_limit_tokens} context tokens`)
      }
    >
      <Agent signedUrl={signedUrl} />
    </ConversationProvider>
  );
}

Configuration

ProviderModels
OpenAIgpt-6.1-sol, gpt-6.1-terra, gpt-6-sol, gpt-6-luna, gpt-6-astra, gpt-5.6-sol, gpt-5.6-terra, gpt-5.6-luna, gpt-5.5, gpt-5.5-2026-04-23, gpt-5.4, gpt-5.4-mini, gpt-5.4-nano, gpt-5.4-2026-03-05, gpt-5.4-mini-2026-03-17, gpt-5.4-nano-2026-03-17, gpt-4.1, gpt-4.1-mini, gpt-4o, gpt-4o-mini, gpt-4-turbo
Anthropicclaude-opus-5-5, claude-opus-5, claude-sonnet-5-5, claude-opus-4-7, claude-opus-4-6, claude-sonnet-4-6, claude-sonnet-4, claude-haiku-4-5, claude-3-7-sonnet, claude-3-5-sonnet, claude-3-haiku
Googlegemini-4-argon, gemini-3.8-flash, gemini-3.7-flash, gemini-3.6-flash, gemini-3.5-flash, gemini-3.5-flash-lite, gemini-3.1-flash-lite-preview, gemini-3.1-pro-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
ElevenLabsglm-52, deepseek-v41-flash, glm-45-air-fp8, qwen3-30b-a3b, qwen36-35b-a3b, qwen35-35b-a3b, qwen35-397b-a17b, nemotron-35-super-vl-nvfp4, gpt-oss-120b
Customcustom-llm (bring your own endpoint)

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

To run an agent on an ElevenLabs Realtime model instead of a separate LLM and TTS model (conversation_config.realtime_model), use the realtime skill.

Popular voices: JBFqnCBsd6RMkjVDRZzb (George), EXAVITQu4vr4xnSDxMaL (Sarah), onwK4e9ZLuTAKqWW03F9 (Daniel), XB0fDUnXU5powFXDhCwa (Charlotte)

Turn eagerness: patient (waits longer for user to finish), normal, or eager (responds quickly)

See Agent Configuration for all options.

System Prompt Structure

Section the prompt with markdown headings — the model prioritizes and interprets instructions more reliably (prompting guide):

# Personality   – named character, 2-3 traits
# Environment   – where they work, who they talk to
# Tone          – vocal style as 4-5 bullets
# Goal          – what success looks like (numbered for multi-step flows)

Keep instructions short and action-based. Mark critical steps with "This step is important." For critical refusal/safety rules, include concise instructions in the prompt and also configure independent custom Guardrails via platform_settings.guardrails (see Guardrails).

Tools

Extend agents with webhook, client, or built-in system tools. Tools are defined inside conversation_config.agent.prompt:

Workspace environment variables can resolve per-environment server tool URLs, headers, and auth connections, and runtime system variables such as {{system__conversation_history}} can pass full conversation context into tool calls when needed.

"prompt": {
    "prompt": "You are a helpful assistant that can check the weather.",
    "llm": "gemini-2.0-flash",
    "tools": [
        # Webhook: server-side API call
        {"type": "webhook", "name": "get_weather", "description": "Get weather",
         "api_schema": {"url": "https://api.example.com/weather", "method": "POST",
             "request_body_schema": {"type": "object", "properties": {"location": {"type": "string"}}, "required": ["location"]}}},
        # Client: runs in the browser
        {"type": "client", "name": "show_product", "description": "Display a product",
         "parameters": {"type": "object", "properties": {"productId": {"type": "string"}}, "required": ["productId"]}}
    ],
    "built_in_tools": {
        "end_call": {},
        "transfer_to_number": {"transfers": [{"transfer_destination": {"type": "phone", "phone_number": "+1234567890"}, "condition": "User asks for human support"}]}
    }
}

Client tools run in browser:

clientTools: {
  show_product: async ({ productId }) => {
    document.getElementById("product").src = `/products/${productId}`;
    return { success: true };
  }
}

See Client Tools Reference for complete documentation.

Built-in System Tools

Set under conversation_config.agent.prompt.built_in_tools. {} enables defaults; provide description to customize; omit to disable.

ToolEnable for
end_callAll agents
language_detectionMultilingual agents
transfer_to_numberPhone-based human escalation
transfer_to_agentMulti-agent workflows
skip_turnTutoring / coaching (silent listening)
voicemail_detectionOutbound calling
play_keypad_touch_toneIVR navigation

start_procedure and end_procedure are not configured here. The platform adds them automatically whenever the agent has at least one procedure (see Procedures).

run_subagent is a system tool for delegating a task to another configured agent. Add it to conversation_config.agent.prompt.tools with params.system_tool_type: "run_subagent" and an agents array. Each entry requires agent_id and description; branch_id and a JSON-schema parameters object are optional.

knowledge_base is a system tool for letting the model choose how to inspect attached knowledge. Add it to conversation_config.agent.prompt.tools with type: "system", a name, and params.system_tool_type: "knowledge_base". Use enabled_strategies to expose any combination of cat, keyword, semantic, and ls:

{
  "type": "system",
  "name": "knowledge_base",
  "description": "Search the attached knowledge base.",
  "params": {
    "system_tool_type": "knowledge_base",
    "enabled_strategies": ["semantic", "keyword"]
  }
}
Integration Tools

Pre-built connectors managed by the platform. Create a connection with credentials, then attach via tool_ids:

IntegrationUse case
calcomScheduling appointments
salesforceCRM lookups, case creation
hubspotCRM, marketing, contacts
zendeskSupport ticketing

Three-step flow: POST /v1/convai/api-integrations/{id}/connections → GET /v1/convai/api-integrations/{id}/tools → POST /v1/convai/tools with api_integration_id and api_integration_connection_id. Attach to the agent with "prompt": {"tool_ids": ["tool_xxxx"]}. Inline tools and tool_ids can coexist — prefer an integration over a duplicate custom webhook.

Public-API Webhook Examples

No-auth APIs useful for prototypes (URLs must be HTTPS):

ToolURLPurpose
get_weatherhttps://wttr.in/{location}?format=j1Current weather
search_wikipediahttps://en.wikipedia.org/api/rest_v1/page/summary/{topic}Topic summary
get_exchange_ratehttps://open.er-api.com/v6/latest/{base_currency}FX rates

Workflows

Route conversations through discrete steps with branching logic. Define under the agent's top-level workflow field. Reference: Agent Workflows.

Node types: start (ID must be "start_node"), end (outcome records the conversation as success, the default, or failure), override_agent (subagent step with label + additional_prompt), dispatch_tool (executes a tool with success/failure routing), agent_transfer, transfer_to_number.

Edge types: unconditional, llm (natural-language condition), expression (deterministic data check). Tool nodes have separate success/failure edges.

Scope tools per step with additional_tool_ids on a node — prevents the wrong tool firing at the wrong step. Set additional_tool_ids: [] on conversational routing nodes such as greeting and classify_intent so they only converse:

{
  "type": "override_agent",
  "label": "Book Appointment",
  "additional_prompt": "Discuss preferred dates and doctors. Show the booking form once agreed.",
  "entry_behavior": "wait_for_user",
  "additional_tool_ids": ["show_booking_form", "display_appointment_card"],
  "position": {"x": 0, "y": 400}
}

Include position ({x, y}) on every node so the editor renders cleanly. Start at y=0, put end at the bottom, and space branches horizontally at x=-150 and x=150; suggested spacing is 200px vertical between levels and 300px horizontal between branches. Keep workflows to 4-7 nodes and always have a path to end.

Use entry_behavior on override_agent nodes to choose whether a sub-agent speaks immediately (generate_immediately), waits for user input (wait_for_user), or lets the platform decide (auto).

For nested agent transfers, set enable_nesting on a standalone_agent node and return_when_nested on an end node that should return control to the parent workflow.

Procedures

Reusable instruction blocks an agent runs when a trigger matches. A procedure is free_form (markdown guidance the agent adapts, and the only type that can reference knowledge base documents) or deterministic (called "structured" in the dashboard: typed steps that run in a fixed order, for flows that must happen the same way every time). See Using the Procedure API for the full CLI and SDK flow, and Writing Procedures for the step reference, validation rules, and authoring guidance.

Procedures live on an agent branch, and every write stages a per-user draft:

OperationCall
List, create, read, update, discard, remove/v1/convai/agents/{agent_id}/branches/{branch_id}/procedures... (procedures.* and procedures.drafts.* in the SDKs)
PublishPATCH /v1/convai/agents/{agent_id}?branch_id=... (agents.update)

Semantics worth knowing before writing any of these calls:

  • Nothing reaches the live agent until you publish. Publishing is not a procedure endpoint; one PATCH on the agent versions every changed procedure draft on the branch.

  • GET .../procedures/{procedure_id} reads branch HEAD and returns 404 until that procedure's first publish. Read the /draft variant to see a procedure you just created; do not retry the create.

  • Turning a structured procedure's steps into the form the agent executes is called compiling. The platform compiles every structured procedure when the agent draft is saved or the agent is published; authors never compile anything themselves. Both draft save and publish validate every structured procedure on the branch. A failed operation writes nothing. To validate without publishing, save an agent draft with POST /v1/convai/agents/{agent_id}/drafts?branch_id=..., sending the agent's current name, conversation_config, platform_settings, and workflow unchanged, then discard that agent draft with DELETE on the same path; see Using the Procedure API.

  • If a structured procedure is invalid, the publish or draft save returns 400 with status procedure_validation_failed and errors keyed by procedure ID, each entry carrying the path of the offending field and a message. Nothing is written; repair the procedure draft and publish again.

  • A draft update replaces the whole body. Read the draft first, then resend name, type, and trigger alongside the new content. type cannot change after creation.

  • content is markdown for a free_form procedure, and a JSON-encoded object with a steps array for a deterministic one. The trigger is the top-level trigger field in both cases, not part of content. Serialize it; do not hand-escape quotes.

  • Manually authored workflow edges cannot connect to or from a structured procedure. Use a sub_procedure step to chain structured procedures; entry from a matching trigger and completion are platform-managed.

  • A third type, folder, groups procedures in the dashboard. Folders carry no content or trigger; move a procedure into one with POST .../procedures/{procedure_id}/move.

  • The agent keeps the five most recently started procedures in context. When more have been started, the content, inline tools, and knowledge base documents of the oldest free-form ones drop out of the prompt, although the procedures remain active. Keep procedures focused and use sub-procedures so that few are active at once.

  • Routing is driven by the trigger text, not the procedure name. Write concrete, non-overlapping triggers that cover the phrasings a user would actually say. The model sees only a numbered menu of triggers; it never sees procedure names or IDs.

  • To restrict the starting agent to selected procedures for one conversation, enable platform_settings.overrides.enable_procedure_ids_from_client, then pass their IDs as procedure_ids in conversation initiation data. An empty list disables all procedures for that starting agent. The same setting allows start_procedure_ids: up to five free-form procedures that start with the conversation, for when the user's task is already known (for example from an IVR choice or the page hosting the widget).

  • Procedure APIs require elevenlabs (Python) or @elevenlabs/elevenlabs-js at 2.60.0 or newer.

Guardrails

Layered safety enforcement that runs independently of the LLM — configured under platform_settings.guardrails, not in the system prompt. Reference: Guardrails.

"platform_settings": {
  "guardrails": {
    "version": "1",
    "focus": {"is_enabled": true},
    "prompt_injection": {"is_enabled": true},
    "content": {"config": {"harassment": {"is_enabled": true, "threshold": 0.5}}},
    "custom": {
      "config": {
        "configs": [{
          "is_enabled": true,
          "name": "No medical diagnoses",
          "prompt": "Block the agent from providing medical diagnoses or treatment advice.",
          "execution_mode": "blocking",
          "model": "gemini-3.1-flash-lite",
          "history_message_count": 1,
          "trigger_action": {"type": "retry", "feedback": "Reason: {{trigger_reason}}"}
        }]
      }
    }
  }
}

Types: focus (on-topic), prompt_injection (manipulation defense), content (category filters), custom (LLM-evaluated domain rules). Content categories include harassment, profanity, sexual, violence, self_harm, and medical_and_legal_information — threshold range 0.0–1.0 (default 0.3). Custom rules use execution_mode: "blocking" with a model, history_message_count, and trigger_action (e.g., retry with feedback). Custom guardrails evaluate in parallel and fail-open.

Per vertical: healthcare/finance/legal → enable medical_and_legal_information; education/youth → sexual/violence/self_harm/profanity; support/sales → harassment/profanity. All agents benefit from focus + prompt_injection + 2-4 custom rules.

Testing Agents

Three test types via POST /v1/convai/agent-testing/create, then attached with PATCH on the agent. Reference: Agent Testing.

TypePurpose
llmScenario test — does the agent respond appropriately to a message?
toolTool-call test — right tool, right parameters?
simulationMulti-turn flow with a simulated user persona
// Tool-call test (snake_case throughout; chat_history role is "user" or "agent")
{
  "name": "Books with correct doctor and date",
  "type": "tool",
  "chat_history": [
    {"role": "user", "message": "Dr. Smith on March 5 at 2pm", "time_in_call_secs": 10}
  ],
  "tool_call_parameters": {
    "referenced_tool": {"id": "show_booking_form", "type": "client"},
    "parameters": [
      {"path": "doctor_name", "eval": {"type": "llm", "description": "Should reference Dr. Smith"}},
      {"path": "date", "eval": {"type": "regex", "pattern": "2025-03-05|March 5"}}
    ]
  }
}

Eval strategies: exact, regex, llm. Prompt evaluation criteria can use binary scoring or numeric scoring with scoring_mode: "numeric_uniform", max_score, and score_instructions; numeric scores are normalized into the aggregate conversation success percentage. Attach via an agent update:

elevenlabs agents update --agent-id "your-agent-id" \
  --json '{"platform_settings": {"testing": {"attached_tests": [{"test_id": "test_xxxx"}]}}}'

Run selected tests with POST /v1/convai/agents/{agent_id}/run-tests. The request body requires tests and accepts repeat_count from 1 to 50 for repeated runs. Simulation tests can define up to 30 success_conditions prompts; all criteria are evaluated and merged into the final result. Simulation tests can also define tool_mock_overrides, keyed by tool ID, to replace shared response mocks for one test. Each override is an array of mocks with a required mock_result; set is_error: true to exercise a tool-failure path. Overrides only apply to tools enabled for mocking through tool_mock_config. For completed conversations, rerun one evaluation criterion with POST /v1/convai/conversations/{conversation_id}/analysis/evaluations/run and a request body containing evaluation_id.

Widget Embedding

<elevenlabs-convai agent-id="your-agent-id"></elevenlabs-convai>
<script src="https://unpkg.com/@elevenlabs/convai-widget-embed" async type="text/javascript"></script>

Customize with attributes: avatar-image-url, action-text, start-call-text, end-call-text.

See Widget Embedding Reference for all options.

Outbound Calls

Make outbound phone calls using your agent via Twilio or Exotel integration:

The examples below use Twilio. See the reference for Exotel usage.

Python
response = client.conversational_ai.twilio.outbound_call(
    agent_id="your-agent-id",
    agent_phone_number_id="your-phone-number-id",
    to_number="+1234567890",
    call_recording_enabled=True
)
print(f"Call initiated: {response.conversation_id}")
JavaScript
const response = await client.conversationalAi.twilio.outboundCall({
  agentId: "your-agent-id",
  agentPhoneNumberId: "your-phone-number-id",
  toNumber: "+1234567890",
  callRecordingEnabled: true,
});
CLI
elevenlabs agents twilio outbound_call \
  --agent-id "your-agent-id" \
  --agent-phone-number-id "your-phone-number-id" \
  --to-number "+1234567890" \
  --call-recording-enabled true

See Outbound Calls Reference for provider-specific endpoints, configuration overrides, and dynamic variables.

Managing Agents

# List agents and check status
elevenlabs agents list
elevenlabs agents status

# Import agents from platform to local config
elevenlabs agents pull                      # Import all agents
elevenlabs agents pull --agent <agent-id>   # Import specific agent

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

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

The CLI creates a project structure for managing agents:

your_project/
├── agents.json       # Agent definitions
├── tools.json        # Tool configurations
├── tests.json        # Test configurations
├── agent_configs/    # Individual agent configs
├── tool_configs/     # Individual tool configs
└── test_configs/     # Individual test configs
SDK Examples
# List
agents = client.conversational_ai.agents.list()

# Get
agent = client.conversational_ai.agents.get(agent_id="your-agent-id")

# Update (partial - only include fields to change)
client.conversational_ai.agents.update(agent_id="your-agent-id", name="New Name")
client.conversational_ai.agents.update(agent_id="your-agent-id",
    conversation_config={
        "agent": {"prompt": {"prompt": "New instructions", "llm": "claude-sonnet-4"}}
    })

# Delete
client.conversational_ai.agents.delete(agent_id="your-agent-id")

See Agent Configuration for all configuration options and SDK examples.

Error Handling

try:
    agent = client.conversational_ai.agents.create(...)
except Exception as e:
    print(f"API error: {e}")

Common errors: 401 (invalid key), 404 (not found), 422 (invalid config), 429 (rate limit)

References

Files

references/agent-configuration.md

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
        }
    }
}
FieldTypeDefaultDescription
first_messagestring""What the agent says when conversation starts
languagestring"en"ISO 639-1 language code (en, es, fr, etc.)
disable_first_message_interruptionsboolfalsePrevent user from interrupting the first message
max_conversation_duration_messagestring-If non-empty, the message sent when conversation.max_duration_seconds is reached
text_behavior_overridesobject-Per-channel text behavior overrides. Map of ConversationInitiationSource -> BehaviorOverride (verbosity, output_format, interaction_budget). Interaction budgets are realtime, 5_minutes, 10_minutes, or 1_hour. See API reference.
hinglish_modeboolfalseWhen enabled and language is Hindi, agent responds in Hinglish
dynamic_variablesobject-Config with dynamic_variable_placeholders containing key-value pairs
promptobject-LLM configuration (see prompt section below)
tts (Text-to-Speech)
conversation_config={
    "tts": {
        "voice_id": "JBFqnCBsd6RMkjVDRZzb",
        "model_id": "eleven_v4_turbo",
        "stability": 0.5,
        "similarity_boost": 0.8
    }
}
FieldTypeDefaultDescription
voice_idstring"cjVigY5qzO86Huf0OWal"Voice to use
model_idstring"eleven_v4_turbo"TTS model (see below)
stabilityfloat0.50-1, lower = more expressive
similarity_boostfloat0.80-1, higher = closer to original voice
speedfloat1.00.7-1.2, speech speed multiplier (not supported on Eleven v4 models)
expressive_modebooltrueEnable expressive voice generation
agent_output_audio_formatstring-Output audio codec format
pronunciation_dictionary_locatorsarray-Pronunciation overrides
enable_phoneme_tagsbooltrueParse inline and pronunciation-dictionary SSML phoneme tags into IPA for V3 models

Available TTS models for agents:

Model IDLanguagesLatency
eleven_v4_turbo90+~100ms (default, recommended — most expressive real-time model)
eleven_v490+Standard
eleven_flash_v2_532~75ms (lowest latency and cost)
eleven_flash_v2English~75ms
eleven_v3_conversational70+~280ms (previous generation)
eleven_multilingual_v229Standard (previous generation)

eleven_turbo_v2_5 and eleven_turbo_v2 are still accepted but superseded by the Flash models. Eleven v4 models use only stability and similarity_boost; speed does not apply.

asr (Automatic Speech Recognition)
conversation_config={
    "asr": {
        "quality": "high",
        "provider": "scribe_realtime",
        "keywords": ["ElevenLabs", "TechCorp"],
        "user_input_audio_format": "pcm_16000"
    }
}
FieldTypeDefaultDescription
qualitystring"high"Transcription quality level
providerstring"scribe_realtime"ASR provider for current agents
keywordsarray-Words to boost recognition accuracy
user_input_audio_formatstring-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,
        "turn_model": "turn_v3"
    }
}
FieldTypeDefaultDescription
turn_timeoutnumber7Seconds to wait before re-engaging the user
turn_eagernessstring"normal"How quickly agent responds: patient, normal, or eager
silence_end_call_timeoutnumber-1Seconds of silence before ending call (-1 = disabled)
initial_wait_timenumber-Seconds to wait for user to start speaking
spelling_patiencestring"auto"Entity detection patience: auto or off
speculative_turnboolfalseEnable speculative turn detection
turn_modelstring"turn_v3"Turn detection model version: turn_v2 or turn_v3
interruption_ignore_termsarray-Case-insensitive terms that should not trigger an interruption when spoken by the user
interruption_ignore_term_languagesarray-Language codes whose curated ignore-term lists are enabled
merge_with_default_ignore_termsboolfalseCombine curated terms for interruption_ignore_term_languages with interruption_ignore_terms
transcribe_on_disabled_interruptionsboolfalseWhen interruptions are disabled, still transcribe user speech so it can carry into the next turn
soft_timeout_configobject-Configures a message if user is silent (see below)

soft_timeout_config:

FieldTypeDefaultDescription
timeout_secondsnumber-1Seconds before soft timeout (-1 = disabled)
messagestring"Hhmmmm...yeah."What agent says on timeout; supports dynamic variables
additional_soft_timeout_messagesarray-Extra static filler messages for later timeouts in the same LLM response, up to 7 strings
use_llm_generated_messageboolfalseLet LLM generate the timeout message
randomize_fillersboolfalseShuffle static soft timeout messages once at the start of each turn
max_soft_timeouts_per_generationint1Maximum filler messages while waiting for one LLM response (1-8)
llm_generated_message_prompt_overridestring-Custom prompt for LLM-generated filler messages; supports dynamic variables
disable_until_first_user_messageboolfalseSuppress soft timeout fillers until the conversation receives its first user 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": [...]
        }
    }
}
FieldTypeDefaultDescription
promptstring""System prompt defining agent behavior
llmstring-Model ID (see LLM providers below)
service_tierstring"standard"standard or fast. fast trades a per-token price premium for higher token throughput; only some models offer it (see available_service_tiers in GET /v1/convai/llm/list)
temperaturefloat00-1, higher = more creative
max_tokensint-1Max tokens for LLM response (-1 = unlimited)
reasoning_effortstring-Reasoning depth: none, minimal, low, medium, high, xhigh, or max (model-dependent)
thinking_budgetint-Max thinking tokens for reasoning models
enable_reasoning_summaryboolfalseRequest provider reasoning summaries when supported; keep disabled for lower time-to-first-byte
toolsarray-Webhook and client tool definitions
built_in_toolsobject-System tools (end_call, transfer, etc.)
enable_parallel_tool_callsbooltrueAllow supported models to execute multiple tools within one turn
tool_idsarray-References to pre-configured tools
knowledge_basearray-Documents for RAG
custom_llmobject-Custom LLM endpoint config
timezonestring-IANA timezone (e.g., America/New_York)
backup_llm_configobject-Fallback LLM configuration
cascade_timeout_secondsnumber4Seconds before cascading to backup LLM (2-15)
mcp_server_idsarray-MCP server IDs to connect
native_mcp_server_idsarray-Native MCP server IDs
ignore_default_personalitybool-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
ProviderModel IDs
OpenAIgpt-6.1-sol, gpt-6.1-terra, gpt-6-sol, gpt-6-luna, gpt-6-astra, gpt-5.6-sol, gpt-5.6-terra, gpt-5.6-luna, gpt-5.5, gpt-5.5-2026-04-23, gpt-5.4, gpt-5.4-mini, gpt-5.4-nano, gpt-5.4-2026-03-05, gpt-5.4-mini-2026-03-17, gpt-5.4-nano-2026-03-17, gpt-4.1, gpt-4.1-mini, gpt-4o, gpt-4o-mini, gpt-4-turbo
Anthropicclaude-opus-5-5, claude-opus-5, claude-sonnet-5-5, claude-opus-4-7, claude-opus-4-6, claude-sonnet-4-6, claude-sonnet-4, claude-haiku-4-5, claude-3-7-sonnet, claude-3-5-sonnet, claude-3-haiku
Googlegemini-4-argon, gemini-3.8-flash, gemini-3.7-flash, gemini-3.6-flash, gemini-3.5-flash, gemini-3.5-flash-lite, gemini-3.1-flash-lite-preview, gemini-3.1-pro-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
ElevenLabsglm-52, deepseek-v41-flash, glm-45-air-fp8, qwen3-30b-a3b, qwen36-35b-a3b, qwen35-35b-a3b, qwen35-397b-a17b, nemotron-35-super-vl-nvfp4, gpt-oss-120b (hosted, ultra-low latency)
Customcustom-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"  # "chat_completions", "responses", or "websocket"
            }
        }
    }
}

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
    },
    "queueing_config": {
        "enabled": True,
        "wait_timeout_seconds": 300
    },
    "trust_context": "low"
}
Top-Level Fields
FieldTypeDescription
summary_languagestringLanguage for conversation analysis outputs such as summaries, titles, evaluation rationales, and data collection rationales. If omitted, ElevenLabs infers it from the conversation.
auto_translate_transcript_to_app_languageboolAutomatically translate a transcript to the viewer's application language when they open it
analysis_itemsobject or nullEvaluation criteria and data-collection items attached to the agent by reference
widgetobjectHosted widget and shareable page configuration. See the widget table below for selected options.
authobjectAuthentication and origin restrictions for agent access
call_limitsobjectConcurrency and daily usage limits
queueing_configobjectPer-agent wait queue for calls that arrive at the concurrency limit
guardrailsobjectBuilt-in safety and policy controls for agent interactions
privacyobjectRecording, retention, and conversation history redaction settings
trust_contextstringTrust classification for the agent: unknown, low, or high
topic_discoveryobjectPer-agent topic discovery configuration
sentiment_analysisobjectPer-agent post-call sentiment analysis configuration
alertingobject or nullPer-agent monitor thresholds, auto-resolution timing, and webhook, PagerDuty, or Slack notification settings
auth
FieldTypeDescription
enable_authboolRequire signed URLs/tokens for connections
allowlistarrayAllowed origins for CORS
shareable_tokenstringPublic conversation token
call_limits
FieldTypeDescription
agent_concurrency_limitintMax simultaneous conversations (default: -1, unlimited)
daily_limitintMax conversations per day (default: 100000)
bursting_enabledboolAllow exceeding limits at 2x cost (default: true)
alerting

Use platform_settings.alerting.notifiers to deliver alert lifecycle notifications:

NotifierRequired fields
Webhooktype: "webhook", webhook_id
PagerDutytype: "integration", integration_type: "pagerduty", connection_id
Slacktype: "integration", integration_type: "slack", connection_id, channel_id

For Slack, connection_id identifies a workspace integration connection with monitoring capability. channel_id identifies the destination channel:

{
  "platform_settings": {
    "alerting": {
      "notifiers": [
        {
          "type": "integration",
          "integration_type": "slack",
          "connection_id": "connection_id",
          "channel_id": "C0123456789"
        }
      ]
    }
  }
}
queueing_config

Call queueing holds callers when the agent is at its concurrency limit and connects them when capacity becomes available. It is disabled by default.

FieldTypeDefaultDescription
enabledboolfalseHold callers in a queue instead of rejecting them immediately
wait_timeout_secondsint180Maximum wait before disconnection, from 1 to 1,800 seconds

Queued callers hear the default hold tone unless a custom MP3 or WAV file is uploaded. Use client.conversational_ai.agents.hold_audio.create or client.conversationalAi.agents.holdAudio.create to upload a file, and the corresponding delete method to restore the default tone. The uploaded hold_audio object in queueing_config is read-only.

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.

FieldTypeDescription
versionstringGuardrail config version. Use "1" for the current schema.
focusobjectKeeps the agent on-topic and aligned with the configured task.
prompt_injectionobjectDetects prompt injection and instruction override attempts.
customobjectConfigures user-defined response validation guardrails.
contentobjectConfigures category-specific content moderation guardrails.

custom.config.configs[]:

FieldTypeDescription
is_enabledboolEnables the custom guardrail.
namestringUser-facing guardrail name.
promptstringInstruction describing what to block.
execution_modestringGuardrail execution mode: streaming or blocking.
modelstringLLM model used for custom guardrail evaluation, such as gemini-3.1-flash-lite, claude-sonnet-4-6, or gpt-5.4-mini.
history_message_countintegerNumber of recent customer messages to include in guardrail history; 0 includes none.
trigger_actionobjectAction when triggered, such as retrying with feedback or ending the call.
evaluate_full_response_onlyboolEvaluate the complete non-TTS response once. Requires execution_mode set to blocking; defaults to false.

focus / prompt_injection:

FieldTypeDescription
is_enabledboolEnables the guardrail.

content:

FieldTypeDescription
execution_modestringGuardrail execution mode: streaming or blocking.
configobjectCategory threshold settings for content moderation.

content.config:

FieldTypeDescription
sexualobjectThreshold settings for sexual content.
violenceobjectThreshold settings for violent content.
harassmentobjectThreshold settings for harassment.
self_harmobjectThreshold settings for self-harm content.
profanityobjectThreshold settings for profanity.
religion_or_politicsobjectThreshold settings for religion or politics content.
medical_and_legal_informationobjectThreshold settings for medical or legal information.

content.config.<category>:

FieldTypeDescription
is_enabledboolEnables moderation for the category.
thresholdnumber or stringCategory 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:

FieldTypeDescription
conversation_history_redactionobjectRedacts configured entity types from stored transcripts, audio, and analysis.

conversation_history_redaction:

FieldTypeDefaultDescription
enabledboolfalseWhether conversation history redaction is enabled
entitiesarray-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.

FieldTypeDefaultDescription
dismissibleboolfalseWhether the widget can be dismissed by the user
show_agent_statusboolfalseWhether to show working, done, or error status while tools are running
show_conversation_idbooltrueWhether to show the conversation ID after disconnection
strip_audio_tagsbooltrueWhether to strip audio markup from messages
mic_muting_enabledbooltrueWhether users can mute their microphone
transcript_enabledbooltrueWhether to show the live conversation transcript
syntax_highlight_themestringautoCode block syntax highlighting theme (light or dark); omit it to let the widget auto-detect
show_resize_buttonbooltrueWhether to show the expand and collapse control in the widget header
conversation (inside conversation_config)
FieldTypeDefaultDescription
max_duration_secondsint600Max conversation duration
text_onlyboolfalseText-only mode (avoids audio pricing)
file_inputobject-Enables image and PDF uploads in chat for multimodal LLMs
dtmf_input_settingsobject or null-Collects phone keypad input; set to null to disable
monitoring_enabledboolfalseEnable real-time WebSocket monitoring
client_eventsarray-Client events forwarded to the connected application
monitoring_eventsarray-Events forwarded to monitoring WebSocket connections
background_soundobject-Background sound played during conversations
source_attributionboolfalseInstructs the LLM to report sources used when knowledge base content is present

Common client events include agent_response_correction, agent_tool_response_full_payload, agent_response_complete, and context_usage. agent_response_complete fires when the agent is done responding. context_usage fires after each completed agent turn with event_id, model, context_tokens, and context_limit_tokens. Enable either event by adding it to client_events.

file_input:

FieldTypeDefaultDescription
enabledbooltrueAllows end users to attach images or PDFs in chat when the selected LLM supports multimodal input
max_files_in_memoryint10Number of most-recent files kept in memory (1-30); older files are summarized and released
max_files_per_conversationint10Total upload limit; use -1 for no limit or a value at least as large as max_files_in_memory

dtmf_input_settings:

FieldTypeDefaultDescription
dtmf_input_timeoutnumber2Seconds to wait after the last keypress before completing the sequence (0.5-10)
hash_terminatorbooltrueCompletes the sequence when the caller presses #
redact_inputboolfalseReplaces keypad entries in stored transcripts, logs, and analysis; the live agent and tools still receive the digits

DTMF input accepts out-of-band keypad events during phone calls. Each completed sequence becomes one user turn.

background_sound:

FieldTypeDefaultDescription
source_typestring-Background sound source type; use preset for built-in sounds
source_idstring-Preset sound ID, such as office1, office2, restaurant, city, typing, or elevator1-elevator4
volumenumber0.15Playback volume from 0.01 to 1.0
crossfade_loopbooltrueCrossfade loop boundaries to avoid audible pops

Additional Top-Level Fields

FieldTypeDescription
tagsarrayClassification labels for filtering (e.g., ["production"], ["test"])
workflowobjectConversation 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.

Set conversation_config.conversation.source_attribution to true when you want the agent to report which knowledge base sources it used in responses.

Knowledge Base Management

Use a crawl job to ingest a website into the knowledge base. A crawl requires a url and can control crawl depth, page count, URL matching, sitemaps, folder placement, and automatic synchronization. List, inspect, or cancel crawl jobs while ingestion is running. Set auto_discover: true with enable_auto_sync: true to follow links from crawled pages and add newly discovered pages during automatic synchronization.

Before deleting several documents or folders, use the bulk dependency check to find affected agents. The bulk delete endpoint returns an independent result for each document ID. Use force only when you intend to remove agent dependencies and recursively delete the contents of non-empty folders.

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();
elevenlabs agents list
SDK: Manage Conversation Tags

Use tags to categorize conversation history and filter list views:

tag = client.conversational_ai.conversations.tags.create(
    title="Urgent Support",
    description="Conversations that need same-day follow-up",
)

client.conversational_ai.conversations.tags.assign(
    conversation_id="conversation_id",
    tag_ids=[tag.tag_id],
)

conversations = client.conversational_ai.conversations.list(
    tag_ids=[tag.tag_id],
    exclude_statuses=["initiated", "in-progress", "processing"],
)
const tag = await client.conversationalAi.conversations.tags.create({
  title: "Urgent Support",
  description: "Conversations that need same-day follow-up",
});

await client.conversationalAi.conversations.tags.assign("conversation_id", {
  tagIds: [tag.tagId],
});

const conversations = await client.conversationalAi.conversations.list({
  tagIds: [tag.tagId],
  excludeStatuses: ["initiated", "in-progress", "processing"],
});

Conversation listing and message search can filter by visited_agent_ids and visited_agent_branch_ids, triggered_procedure_ids, and include_invalid_tool_calls. List conversations also accepts parent_conversation_id, guardrail_types, custom_guardrail_names, and sort_direction to narrow or order results. For a listing that includes selected analysis results, pass data_collection_ids or evaluation_criteria_ids; matching summaries include data_collection_results or evaluation_criteria_results.

Both operations accept repeatable data_collection_params, dynamic_variable_params, and evaluation_params filters. Data collection and dynamic variable filters use name:op:value, where op is eq, neq, gt, gte, lt, lte, or in; comparison operators require a numeric value, and in values use a pipe delimiter. Evaluation filters use criteria_id:result, where result is success, failure, or unknown.

SDK: Get Agent
agent = client.conversational_ai.agents.get(agent_id="your-agent-id")
const agent = await client.conversationalAi.agents.get("your-agent-id");
elevenlabs agents get --agent-id "your-agent-id"
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_v4_turbo"}
})

# 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" } } }
});

CLI:

elevenlabs agents update --agent-id "your-agent-id" --json '{"name": "New Name"}'
Updatable Fields
SectionFields
Rootname, tags
conversation_config.agentfirst_message, language, disable_first_message_interruptions, dynamic_variables, text_behavior_overrides
conversation_config.agent.promptprompt, llm, temperature, max_tokens, reasoning_effort, tools, built_in_tools, enable_parallel_tool_calls, knowledge_base, custom_llm, timezone
conversation_config.ttsvoice_id, model_id, stability, similarity_boost, speed, expressive_mode, enable_phoneme_tags
conversation_config.asrquality, provider, keywords, user_input_audio_format
conversation_config.turnturn_timeout, turn_eagerness, silence_end_call_timeout, turn_model, interruption_ignore_terms, interruption_ignore_term_languages, merge_with_default_ignore_terms, transcribe_on_disabled_interruptions, soft_timeout_config
conversation_config.conversationmax_duration_seconds, text_only, dtmf_input_settings, monitoring_enabled, background_sound
platform_settingssummary_language, auto_translate_transcript_to_app_language, analysis_items, queueing_config, guardrails, privacy, topic_discovery, sentiment_analysis, alerting
platform_settings.widgetdismissible, show_agent_status, show_conversation_id, strip_audio_tags, mic_muting_enabled, transcript_enabled, syntax_highlight_theme
platform_settings.authenable_auth, allowlist
platform_settings.call_limitsagent_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");
elevenlabs agents delete --agent-id "your-agent-id"

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_v4_turbo"},
        "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"},  # Flash: lowest latency (~75ms)
        "turn": {"turn_eagerness": "eager", "turn_timeout": 3}
    }
)

Requirements and compatibility

Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta

“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.

Needs: Needs an API key, Needs Python, Needs Node.js

The author says: Requires internet access and an ElevenLabs API key (ELEVENLABS_API_KEY).

Security

What our scanner noticed· Medium risk

  • Instructions that use the network
  • Downloads piped into a shell

A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.

Attribution and licence

Published by
ElevenLabs
Publisher
ElevenLabs (Official)
Source
elevenlabs/skills · agents · commit 9763c39
Licence
MIT License (redistribution allowed)
  • LICENSE (added by AutoGineer from LICENSE)
  • ATTRIBUTION.md (written by AutoGineer)
Synced

AutoGineer is not affiliated with or endorsed by ElevenLabs.

Download ZIP

The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download agents.zip