agents

agents

热门

使用 ElevenLabs 构建语音 AI 代理。适用于创建语音助手、客服机器人、交互式语音角色或任何实时语音对话体验。

384Star
50Fork
更新于 2026/7/15
SKILL.md
只读
名称
agents
描述

使用 ElevenLabs 构建语音 AI 代理。适用于创建语音助手、客服机器人、交互式语音角色或任何实时语音对话体验。

ElevenLabs 代理平台

构建具有自然对话、多种 LLM 提供商、自定义工具和简单网页嵌入的语音 AI 代理。

设置: 请参阅安装指南了解 CLI 和 SDK 设置。

使用 CLI 快速开始

ElevenLabs CLI 是创建和管理代理的推荐方式:

# 安装 CLI 并进行身份验证
npm install -g @elevenlabs/cli
elevenlabs auth login

# 初始化项目并创建代理
elevenlabs agents init
elevenlabs agents add "我的助手" --template complete

# 推送到 ElevenLabs 平台
elevenlabs agents push

可用模板: complete, minimal, voice-only, text-only, customer-service, assistant

Python

from elevenlabs import ElevenLabs

client = ElevenLabs()

agent = client.conversational_ai.agents.create(
    name="我的助手",
    conversation_config={
        "agent": {
            "first_message": "你好!有什么可以帮你的?",
            "language": "zh",
            "prompt": {
                "prompt": "你是一个乐于助人的助手。请简洁友好。",
                "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: "我的助手",
  conversationConfig: {
    agent: {
      firstMessage: "你好!有什么可以帮你的?",
      language: "zh",
      prompt: {
        prompt: "你是一个乐于助人的助手。",
        llm: "gemini-2.0-flash",
        temperature: 0.7
      }
    },
    tts: { voiceId: "JBFqnCBsd6RMkjVDRZzb" }
  }
});

cURL

curl -X POST "https://api.elevenlabs.io/v1/convai/agents/create" \
  -H "xi-api-key: $ELEVENLABS_API_KEY" -H "Content-Type: application/json" \
  -d '{"name": "我的助手", "conversation_config": {"agent": {"first_message": "你好!", "language": "zh", "prompt": {"prompt": "你是一个乐于助人的助手。", "llm": "gemini-2.0-flash"}}, "tts": {"voice_id": "JBFqnCBsd6RMkjVDRZzb"}}}'

开始对话

临时 LiveKit WebSocket 固定版本

在 ElevenLabs LiveKit 服务器支持 /rtc/v1 之前,使用 WebRTC 的浏览器客户端在底层 LiveKit WebSocket 握手过程中可能会失败或卡住,尤其是使用 livekit-client 版本高于 2.16.1 时。对于使用 connectionType: "webrtc" 或访问 wss://livekit.rtc.elevenlabs.io/rtc/v1 的 React、Next.js、Electron 或其他 @elevenlabs/client / @elevenlabs/react 集成,请在 package.json 中添加此临时固定版本:

{
  "overrides": {
    "livekit-client": "2.16.1"
  }
}

当应用在会话启动时记录 /rtc/v1 404、v1 RTC path not foundcould not establish pc connection 时,请使用此固定版本。这是针对 WebRTC 会话的 LiveKit 服务器兼容性解决方法,而非 ElevenLabs 的 connectionType: "websocket" 传输方式。上游 LiveKit 服务器或 SDK 问题修复后请移除。

服务器端 (Python): 获取用于客户端连接的签名 URL:

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

客户端 (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("代理:", msg.message),
  onUserTranscript: (t) => console.log("用户:", t.message),
  onPing: (event) => console.log("估计延迟:", event.ping_ms),
  onError: (e) => console.error(e)
});

React Hook: 将 Hook 消费者包裹在 ConversationProvider 中。建议使用细粒度 Hook,如 useConversationControlsuseConversationStatus 来控制会话和 UI 状态;useConversation 仍可作为便捷的全能 Hook 使用。当希望 React 在统一位置处理对话错误时,可传递提供者级别的回调,如 onError

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}>结束对话</button>;
  }

  return (
    <button onClick={() => startSession({ signedUrl })}>
      开始对话
    </button>
  );
}

function App({ signedUrl }: { signedUrl: string }) {
  return (
    <ConversationProvider
      onError={(error) => console.error("对话错误:", error)}
      onPing={(event) => console.log("估计延迟:", event.ping_ms)}
    >
      <Agent signedUrl={signedUrl} />
    </ConversationProvider>
  );
}

配置

提供商 模型
OpenAI 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-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-opus-4-7, 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.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
ElevenLabs glm-45-air-fp8, qwen3-30b-a3b, qwen36-35b-a3b, qwen35-35b-a3b, qwen35-397b-a17b, gpt-oss-120b
自定义 custom-llm (自带端点)

使用 GET /v1/convai/llm/list 查看当前模型目录,包括弃用状态、令牌/上下文限制、能力标志(如图像输入支持)以及模型特定的推理努力支持。

热门语音: JBFqnCBsd6RMkjVDRZzb (George), EXAVITQu4vr4xnSDxMaL (Sarah), onwK4e9ZLuTAKqWW03F9 (Daniel), XB0fDUnXU5powFXDhCwa (Charlotte)

轮次急切度: patient (等待用户完成更长时间), normal, 或 eager (快速响应)

所有选项请参阅代理配置

系统提示结构

使用 Markdown 标题对提示进行分段——模型会更可靠地优先处理和解释指令(提示指南):

# 个性   – 命名角色,2-3 个特质
# 环境   – 工作地点,与谁交谈
# 语气   – 语音风格,4-5 个要点
# 目标   – 成功的标准(多步骤流程使用编号)

保持指令简短且基于行动。用“此步骤很重要”标记关键步骤。对于关键的拒绝/安全规则,在提示中包含简洁的指令,并通过 platform_settings.guardrails 配置独立的自定义护栏(请参阅护栏)。

工具

通过 Webhook、客户端或内置系统工具扩展代理。工具定义在 conversation_config.agent.prompt 内:

工作区环境变量可以解析每个环境的服务器工具 URL、标头和身份验证连接,运行时系统变量(如 {{system__conversation_history}})可以在需要时将完整的对话上下文传递给工具调用。

"prompt": {
    "prompt": "你是一个乐于助人的助手,可以查询天气。",
    "llm": "gemini-2.0-flash",
    "tools": [
        # Webhook:服务器端 API 调用
        {"type": "webhook", "name": "get_weather", "description": "获取天气",
         "api_schema": {"url": "https://api.example.com/weather", "method": "POST",
             "request_body_schema": {"type": "object", "properties": {"location": {"type": "string"}}, "required": ["location"]}}},
        # 客户端:在浏览器中运行
        {"type": "client", "name": "show_product", "description": "显示产品",
         "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": "用户要求人工支持"}]},
        "start_procedure": {}
    }
}

客户端工具 在浏览器中运行:

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

完整文档请参阅客户端工具参考

内置系统工具

conversation_config.agent.prompt.built_in_tools 下设置。{} 启用默认设置;提供 description 进行自定义;省略则禁用。

工具 启用场景
end_call 所有代理
language_detection 多语言代理
transfer_to_number 基于电话的人工升级
transfer_to_agent 多代理工作流
start_procedure 流程引导的对话
end_procedure 完成活动流程
skip_turn 辅导/指导(静默监听)
voicemail_detection 外呼
play_keypad_touch_tone IVR 导航

run_subagent 是一个系统工具,用于将任务委托给另一个已配置的代理。将其添加到 conversation_config.agent.prompt.tools,并设置 params.system_tool_type: "run_subagent" 和一个 agents 数组。每个条目需要 agent_iddescriptionbranch_id 和 JSON 模式的 parameters 对象是可选的。

集成工具

由平台管理的预构建连接器。使用凭据创建连接,然后通过 tool_ids 附加:

集成 用例
calcom 预约安排
salesforce CRM 查询、创建案例
hubspot CRM、营销、联系人
zendesk 支持工单

三步流程:POST /v1/convai/api-integrations/{id}/connectionsGET /v1/convai/api-integrations/{id}/toolsPOST /v1/convai/tools,包含 api_integration_idapi_integration_connection_id。通过 "prompt": {"tool_ids": ["tool_xxxx"]} 附加到代理。内联 toolstool_ids 可以共存——优先使用集成而不是重复的自定义 Webhook。

公共 API Webhook 示例

适用于原型的无需身份验证的 API(URL 必须为 HTTPS):

工具 URL 用途
get_weather https://wttr.in/{location}?format=j1 当前天气
search_wikipedia https://en.wikipedia.org/api/rest_v1/page/summary/{topic} 主题摘要
get_exchange_rate https://open.er-api.com/v6/latest/{base_currency} 汇率

工作流

通过具有分支逻辑的离散步骤路由对话。在代理顶层的 workflow 字段下定义。参考:代理工作流

节点类型: start (ID 必须为 "start_node"), end, override_agent (子代理步骤,包含 label + additional_prompt), dispatch_tool (执行工具,带有成功/失败路由), agent_transfer, transfer_to_number

边类型: unconditional, llm (自然语言条件), expression (确定性数据检查)。工具节点有单独的成功/失败边。

按步骤限定工具范围 使用节点上的 additional_tool_ids——防止错误的工具在错误的步骤触发。在对话路由节点(如问候和 classify_intent)上设置 additional_tool_ids: [],使其仅进行对话:

{
  "type": "override_agent",
  "label": "预约",
  "additional_prompt": "讨论首选日期和医生。一旦达成一致,显示预约表单。",
  "entry_behavior": "wait_for_user",
  "additional_tool_ids": ["show_booking_form", "display_appointment_card"],
  "position": {"x": 0, "y": 400}
}

在每个节点上包含 position ({x, y}),以便编辑器清晰渲染。从 y=0 开始,将 end 放在底部,水平分支间距为 x=-150x=150;建议垂直间距为 200px,水平间距为 300px。保持工作流在 4-7 个节点内,并始终有一条通往 end 的路径。

override_agent 节点上使用 entry_behavior 来选择子代理是立即发言 (generate_immediately)、等待用户输入 (wait_for_user) 还是让平台决定 (auto)。

对于嵌套代理转移,在 standalone_agent 节点上设置 enable_nesting,并在应返回控制权给父工作流的 end 节点上设置 return_when_nested

护栏

独立于 LLM 运行的分层安全执行——在 platform_settings.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": "禁止医疗诊断",
          "prompt": "阻止代理提供医疗诊断或治疗建议。",
          "execution_mode": "blocking",
          "model": "gemini-2.5-flash-lite",
          "history_message_count": 1,
          "trigger_action": {"type": "retry", "feedback": "原因: {{trigger_reason}}"}
        }]
      }
    }
  }
}

类型: focus (话题相关), prompt_injection (操纵防御), content (类别过滤器), custom (LLM 评估的领域规则)。内容类别包括 harassment, profanity, sexual, violence, self_harmmedical_and_legal_information——阈值范围 0.01.0 (默认 0.3)。自定义规则使用 execution_mode: "blocking",并包含 modelhistory_message_counttrigger_action (例如,带反馈的 retry)。自定义护栏并行评估,失败时开放。

按垂直领域: 医疗/金融/法律 → 启用 medical_and_legal_information;教育/青少年 → sexual/violence/self_harm/profanity;支持/销售 → harassment/profanity。所有代理都受益于 focus + prompt_injection + 2-4 条自定义规则。

测试代理

通过 POST /v1/convai/agent-testing/create 创建三种测试类型,然后通过 PATCH 附加到代理。参考:代理测试

类型 用途
llm 场景测试——代理是否对消息做出适当响应?
tool 工具调用测试——正确的工具,正确的参数?
simulation 使用模拟用户角色的多轮流程
// 工具调用测试 (全程使用 snake_case;chat_history 角色为 "user" 或 "agent")
{
  "name": "使用正确的医生和日期预约",
  "type": "tool",
  "chat_history": [
    {"role": "user", "message": "3月5日下午2点找史密斯医生", "time_in_call_secs": 10}
  ],
  "tool_call_parameters": {
    "referenced_tool": {"id": "show_booking_form", "type": "client"},
    "parameters": [
      {"path": "doctor_name", "eval": {"type": "llm", "description": "应提及史密斯医生"}},
      {"path": "date", "eval": {"type": "regex", "pattern": "2025-03-05|3月5日"}}
    ]
  }
}

评估策略:exact, regex, llm。提示评估标准可以使用二元评分或数值评分,使用 scoring_mode: "numeric_uniform"max_scorescore_instructions;数值评分会归一化到聚合的对话成功百分比。通过 PATCH 附加:

curl -s -X PATCH "https://api.elevenlabs.io/v1/convai/agents/{agent_id}" \
  -H "xi-api-key: $ELEVENLABS_API_KEY" -H "Content-Type: application/json" \
  -d '{"platform_settings": {"testing": {"attached_tests": [{"test_id": "test_xxxx"}]}}}'

使用 POST /v1/convai/agents/{agent_id}/run-tests 运行选定的测试。请求体需要 tests,并接受 repeat_count,范围从 150,用于重复运行。模拟测试可以定义最多 30 个 success_conditions 提示;所有标准都会被评估并合并到最终结果中。
对于已完成的对话,使用 POST /v1/convai/conversations/{conversation_id}/analysis/evaluations/run 和包含 evaluation_id 的请求体重新运行一个评估标准。

小部件嵌入

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

使用属性自定义:avatar-image-url, action-text, start-call-text, end-call-text

所有选项请参阅小部件嵌入参考

外呼

通过 Twilio 或 Exotel 集成使用您的代理进行外呼:

以下示例使用 Twilio。Exotel REST 用法请参阅参考。

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"呼叫已发起: {response.conversation_id}")

JavaScript

const response = await client.conversationalAi.twilio.outboundCall({
  agentId: "your-agent-id",
  agentPhoneNumberId: "your-phone-number-id",
  toNumber: "+1234567890",
  callRecordingEnabled: true,
});

cURL

curl -X POST "https://api.elevenlabs.io/v1/convai/twilio/outbound-call" \
  -H "xi-api-key: $ELEVENLABS_API_KEY" -H "Content-Type: application/json" \
  -d '{"agent_id": "your-agent-id", "agent_phone_number_id": "your-phone-number-id", "to_number": "+1234567890", "call_recording_enabled": true}'

请参阅外呼参考了解提供商特定的端点、配置覆盖和动态变量。

管理代理

使用 CLI (推荐)

# 列出代理并检查状态
elevenlabs agents list
elevenlabs agents status

# 从平台导入代理到本地配置
elevenlabs agents pull                      # 导入所有代理
elevenlabs agents pull --agent <agent-id>   # 导入特定代理

# 将本地更改推送到平台
elevenlabs agents push              # 上传配置
elevenlabs agents push --dry-run    # 先预览更改

# 添加工具
elevenlabs tools add-webhook "天气 API"
elevenlabs tools add-client "UI 工具"

项目结构

CLI 创建一个用于管理代理的项目结构:

your_project/
├── agents.json       # 代理定义
├── tools.json        # 工具配置
├── tests.json        # 测试配置
├── agent_configs/    # 单个代理配置
├── tool_configs/     # 单个工具配置
└── test_configs/     # 单个测试配置

SDK 示例

# 列出
agents = client.conversational_ai.agents.list()

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

# 更新 (部分更新 - 仅包含要更改的字段)
client.conversational_ai.agents.update(agent_id="your-agent-id", name="新名称")
client.conversational_ai.agents.update(agent_id="your-agent-id",
    conversation_config={
        "agent": {"prompt": {"prompt": "新指令", "llm": "claude-sonnet-4"}}
    })

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

所有配置选项和 SDK 示例请参阅代理配置

错误处理

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

常见错误:401 (无效密钥), 404 (未找到), 422 (无效配置), 429 (速率限制)

参考