关于 agents
agents 是用于构建和管理 ElevenLabs 语音 AI Agent 的技能,面向开发者和需要配置对话体验的团队。它支持多种 LLM、工具、工作流与会话接入方式,也可通过网页嵌入对话。
主要功能
- 01通过 CLI 创建和管理 Agent
- 02配置多种 LLM 提供方
- 03添加 Webhook、客户端和系统工具
- 04设置分支工作流与可复用流程
- 05通过 WebRTC 或客户端启动会话
- 06支持网页嵌入对话
适用场景
- 01搭建语音客户服务 Agent
- 02配置带工具调用的对话流程
- 03在网页中接入 Agent 会话
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ elevenlabs/ skills --skill agents安装后在 Claude Code 中输入/agents确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/agent-configuration.mdclient-tools.mdinstallation.mdoutbound-calls.mdusing-procedure-api.mdwidget-embedding.mdwriting-procedures.md详细介绍
ElevenLabs Agents Platform
构建具备自然对话能力的语音 AI Agent,支持多个 LLM 提供商、自定义工具和轻松嵌入网页。
**编写代码前的设置:**如果此项目尚未设置
ELEVENLABS_API_KEY,请先在应用文件夹中运行npx -y @elevenlabs/cli@latest onboard init,并按提示操作:该命令会为用户登录并为项目保存密钥,无需手动复制密钥。否则,请参阅 安装指南,了解 CLI 和 SDK 的设置方法。
使用 CLI 快速开始
ElevenLabs CLI 是创建和管理 Agent 的推荐方式:
# 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
可用模板: 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
CLI 会自动从环境中读取 ELEVENLABS_API_KEY:
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"}}}'
开始对话
**经过身份验证的 WebRTC:**从后端请求会话令牌。响应中包含令牌和对话 ID:
session = client.conversational_ai.conversations.get_webrtc_token(
agent_id="your-agent-id",
)
print(session.token, session.conversation_id)
**服务端(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("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:**请将 Hook 的使用者包裹在 ConversationProvider 中。对于会话控制和 UI 状态,优先使用 useConversationControls 和 useConversationStatus 等细粒度 Hook;也可以使用便捷的一体化 Hook useConversation。如果希望由 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}>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>
);
}
配置
| 提供商 | 模型 |
|---|---|
| OpenAI | gpt-6.1-sol、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-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-5-5、claude-opus-5、claude-sonnet-5-5、claude-opus-4-7、claude-opus-4-6、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 |
gemini-4-argon、gemini-3.8-flash、gemini-3.7-flash、gemini-3.6-flash、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-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 |
| 自定义 | custom-llm(使用你自己的端点) |
使用 GET /v1/convai/llm/list 查看当前模型目录,包括弃用状态、令牌数和上下文限制、图像输入支持等能力标志,以及特定模型支持的推理强度。
要让 Agent 使用 ElevenLabs Realtime 模型,而非单独的 LLM 和 TTS 模型(conversation_config.realtime_model),请使用 realtime 技能。
常用语音: JBFqnCBsd6RMkjVDRZzb(George)、EXAVITQu4vr4xnSDxMaL(Sarah)、onwK4e9ZLuTAKqWW03F9(Daniel)、XB0fDUnXU5powFXDhCwa(Charlotte)
轮次响应积极度:patient(等待用户更长时间)、normal 或 eager(快速响应)
所有选项请参阅 Agent 配置。
系统提示词结构
使用 Markdown 标题对提示词分节——这样模型能更可靠地理解并优先处理指令(提示词编写指南):
# 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)
指令应简短并以行动为导向。对于关键步骤,请标注“This step is important.”。对于关键的拒绝/安全规则,请在提示词中加入简洁指令,并通过 platform_settings.guardrails 配置独立的自定义 Guardrails(参阅 Guardrails)。
工具
通过 Webhook、客户端工具或内置系统工具扩展 Agent。工具定义在 conversation_config.agent.prompt 中:
工作区环境变量可以解析各环境的服务端工具 URL、请求头和身份验证连接;运行时系统变量(例如 {{system__conversation_history}})则可以在需要时将完整对话上下文传递给工具调用。
"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"}]}
}
}
客户端工具在浏览器中运行:
clientTools: {
show_product: async ({ productId }) => {
document.getElementById("product").src = `/products/${productId}`;
return { success: true };
}
}
完整文档请参阅客户端工具参考。
内置系统工具
在 conversation_config.agent.prompt.built_in_tools 下设置。{} 启用默认工具;提供 description 可自定义;省略则禁用。
| 工具 | 启用场景 |
|---|---|
end_call | 所有 Agent |
language_detection | 多语言 Agent |
transfer_to_number | 基于电话的人工升级处理 |
transfer_to_agent | 多 Agent 工作流 |
skip_turn | 辅导/指导(静默聆听) |
voicemail_detection | 外呼 |
play_keypad_touch_tone | IVR 导航 |
start_procedure 和 end_procedure 不在此处配置。只要 Agent 至少有一个流程,平台就会自动添加这两个工具(参见流程)。
run_subagent 是一种系统工具,用于将任务委派给另一个已配置的 Agent。将其添加到
conversation_config.agent.prompt.tools 中,并设置 params.system_tool_type: "run_subagent" 和一个
agents 数组。每个条目都必须包含 agent_id 和 description;branch_id 和 JSON Schema
parameters 对象为可选项。
knowledge_base 是一种系统工具,可让模型选择如何检查附加的知识。将其添加到
conversation_config.agent.prompt.tools 中,并设置 type: "system"、一个 name 和
params.system_tool_type: "knowledge_base"。使用 enabled_strategies 可启用 cat、keyword、semantic 和 ls 中的任意组合:
{
"type": "system",
"name": "knowledge_base",
"description": "Search the attached knowledge base.",
"params": {
"system_tool_type": "knowledge_base",
"enabled_strategies": ["semantic", "keyword"]
}
}
集成工具
由平台管理的预构建连接器。创建包含凭据的连接,然后通过 tool_ids 附加:
| 集成 | 用途 |
|---|---|
calcom | 安排预约 |
salesforce | CRM 查询、创建案例 |
hubspot | CRM、营销、联系人 |
zendesk | 支持工单 |
三步流程:POST /v1/convai/api-integrations/{id}/connections → GET /v1/convai/api-integrations/{id}/tools → 使用 api_integration_id 和 api_integration_connection_id 调用 POST /v1/convai/tools。通过 "prompt": {"tool_ids": ["tool_xxxx"]} 将工具附加到 Agent。内联 tools 和 tool_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} | 外汇汇率 |
工作流
通过带分支逻辑的离散步骤路由对话。在 Agent 顶层的 workflow 字段下定义。参考:Agent 工作流。
节点类型: start(ID 必须为 "start_node")、end(outcome 将对话记录为 success(默认值)或 failure)、override_agent(包含 label + additional_prompt 的子 Agent 步骤)、dispatch_tool(执行工具并按成功/失败路由)、agent_transfer、transfer_to_number。
边类型: unconditional、llm(自然语言条件)、expression(确定性数据检查)。工具节点有单独的成功/失败边。
使用节点上的 additional_tool_ids 按步骤限定工具范围,以防在错误步骤触发错误的工具。在问候语和 classify_intent 等对话路由节点上设置 additional_tool_ids: [],使其仅进行对话:
{
"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}
}
为每个节点添加 position({x, y}),以确保编辑器正确渲染。从 y=0 开始,将 end 放在底部,并在 x=-150 和 x=150 处水平排列分支;建议各层之间垂直间隔 200px,各分支之间水平间隔 300px。工作流保持在 4-7 个节点,并确保始终有一条通往 end 的路径。
在 override_agent 节点上使用 entry_behavior,选择子 Agent 是立即发言(generate_immediately)、等待用户输入(wait_for_user),还是由平台决定(auto)。
对于嵌套的 Agent 转移,在 standalone_agent 节点上设置 enable_nesting,并在应将控制权交还给父工作流的 end 节点上设置
return_when_nested。
流程
可复用的指令块,Agent 会在触发条件匹配时运行。流程分为 free_form(Agent 可灵活运用的 Markdown 指引,也是唯一可以引用知识库文档的类型)或 deterministic(在控制面板中称为“structured”:按固定顺序运行的类型化步骤,适用于每次都必须以相同方式执行的流程)。完整的 CLI 和 SDK 流程请参阅使用 Procedure API,步骤参考、验证规则和编写指南请参阅编写流程。
流程位于 Agent 分支上,每次写入都会暂存一份按用户区分的草稿:
| 操作 | 调用 |
|---|---|
| 列出、创建、读取、更新、丢弃、移除 | /v1/convai/agents/{agent_id}/branches/{branch_id}/procedures...(SDK 中的 procedures.* 和 procedures.drafts.*) |
| 发布 | PATCH /v1/convai/agents/{agent_id}?branch_id=...(agents.update) |
编写这些调用前值得了解的语义:
- 在发布之前,实时 Agent 不会收到任何内容。发布不是过程的端点;对 Agent 执行一次 PATCH,就会为该分支上的所有已更改过程生成版本。
GET .../procedures/{procedure_id}会读取分支 HEAD;在该过程首次发布之前会返回404。读取/draft变体以查看刚创建的过程;不要重试创建操作。- 将结构化过程的步骤转换为 Agent 执行的形式,称为编译。平台会在保存 Agent 草稿或发布 Agent 时编译每个结构化过程;作者无需自行编译。保存草稿和发布都会验证分支上的每个结构化过程。操作失败时不会写入任何内容。若要在不发布的情况下进行验证,请使用
POST /v1/convai/agents/{agent_id}/drafts?branch_id=...保存 Agent 草稿,并原样发送 Agent 当前的name、conversation_config、platform_settings和workflow,然后对相同路径执行DELETE,以丢弃该 Agent 草稿;请参阅使用过程 API。 - 如果结构化过程无效,发布或保存草稿时会返回
400,其中status为procedure_validation_failed,errors按过程 ID 分类,每个条目都包含出错字段的path和一条消息。不会写入任何内容;修复过程草稿后重新发布。 - 更新草稿会替换整个正文。先读取草稿,再连同新的
content一起重新发送name、type和trigger。创建后不能更改type。 content对于free_form过程是 Markdown;对于deterministic过程,则是带有steps数组的 JSON 编码对象。两种情况下,触发条件都是顶层的trigger字段,而不是content的一部分。请将其序列化;不要手动转义引号。- 手动编写的工作流边不能连接到结构化过程,也不能从结构化过程连出。使用
sub_procedure步骤串联结构化过程;入口匹配触发条件以及过程完成均由平台管理。 - 第三种
type是folder,用于在控制面板中对过程分组。文件夹不包含content或trigger;使用POST .../procedures/{procedure_id}/move将过程移入文件夹。 - Agent 会在上下文中保留最近启动的五个过程。启动的过程超过五个时,最早启动的自由形式过程的内容、内联工具和知识库文档会从提示词中移除,但这些过程仍保持活动状态。请让过程保持精简,并使用子过程,以便同时处于活动状态的过程尽可能少。
- 路由由
trigger文本决定,而非过程名称。请编写具体且互不重叠的触发条件,涵盖用户实际可能使用的措辞。模型只会看到编号的触发条件菜单,不会看到过程名称或 ID。 - 若要限制启动 Agent 在某次对话中仅使用选定的过程,请启用
platform_settings.overrides.enable_procedure_ids_from_client,然后在对话初始化数据中将这些过程的 ID 作为procedure_ids传入。空列表会禁用该启动 Agent 的所有过程。 - 过程 API 要求使用版本为
2.60.0或更高的elevenlabs(Python)或@elevenlabs/elevenlabs-js。
安全防护
独立于大模型运行的分层安全防护机制 — 在 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": "No medical diagnoses",
"prompt": "Block the agent from providing medical diagnoses or treatment advice.",
"execution_mode": "blocking",
"model": "gemini-2.5-flash-lite",
"history_message_count": 1,
"trigger_action": {"type": "retry", "feedback": "Reason: {{trigger_reason}}"}
}]
}
}
}
}
类型: focus(主题相关性)、prompt_injection(防操纵)、content(类别过滤器)、custom(由大模型评估的领域规则)。内容类别包括 harassment、profanity、sexual、violence、self_harm 和 medical_and_legal_information — 阈值范围为 0.0–1.0(默认值为 0.3)。自定义规则使用 execution_mode: "blocking",并配合 model、history_message_count 和 trigger_action(例如,使用反馈进行 retry)。自定义安全防护会并行评估,且在出错时默认放行。
按领域分类: 医疗保健/金融/法律 → 启用 medical_and_legal_information;教育/青少年 → sexual/violence/self_harm/profanity;客服/销售 → harassment/profanity。所有 Agent 都能从 focus + prompt_injection + 2-4 条自定义规则中受益。
测试 Agent
通过 POST /v1/convai/agent-testing/create 创建三种测试,然后通过 PATCH 将其关联到 Agent。参考:Agent 测试。
| 类型 | 用途 |
|---|---|
llm | 场景测试 — Agent 是否会针对消息做出恰当回应? |
tool | 工具调用测试 — 工具和参数是否正确? |
simulation | 使用模拟用户角色进行多轮对话 |
// 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"}}
]
}
}
评估策略:exact、regex、llm。提示词评估标准可以使用二元评分,也可以使用包含 scoring_mode: "numeric_uniform"、max_score 和 score_instructions 的数值评分;数值评分会归一化,并计入对话成功率的总体百分比。通过更新 Agent 进行关联:
elevenlabs agents update --agent-id "your-agent-id" \
--json '{"platform_settings": {"testing": {"attached_tests": [{"test_id": "test_xxxx"}]}}}'
使用 POST /v1/convai/agents/{agent_id}/run-tests 运行选定的测试。请求正文必须包含 tests,并可通过 repeat_count 指定重复运行次数,范围为 1 到 50。
模拟测试最多可定义 30 条 success_conditions 提示词;所有标准都会进行评估,并合并到最终结果中。
模拟测试还可以定义按工具 ID 索引的 tool_mock_overrides,为单项测试替换共享响应模拟。每项覆盖内容都是包含必填字段 mock_result 的模拟数组;设置 is_error: true 可测试工具故障路径。覆盖设置仅适用于通过 tool_mock_config 启用模拟的工具。
对于已完成的对话,可通过 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 集成,使用你的 Agent 拨打外呼电话:
以下示例使用 Twilio。Exotel 的用法请参阅参考文档。
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
有关特定提供商的端点、配置覆盖项和动态变量,请参阅外呼参考。
管理 Agent
使用 CLI(推荐)
# 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"
项目结构
CLI 会创建用于管理 Agent 的项目结构:
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 示例
# 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")
所有配置选项和 SDK 示例请参阅 Agent 配置。
错误处理
try:
agent = client.conversational_ai.agents.create(...)
except Exception as e:
print(f"API error: {e}")
常见错误:401(密钥无效)、404(未找到)、422(配置无效)、429(请求过多)
参考资料
- 安装指南 - SDK 设置与迁移
- Agent 配置 - 所有配置选项和 CRUD 示例
- 客户端工具 - Webhook、客户端和系统工具
- 使用 Procedure API - Procedure CLI 和 SDK 流程、草稿与发布
- 编写 Procedures - 触发条件和内容编写、结构化步骤参考与规则
- 嵌入 Widget - 网站集成
- 外呼 - 电话集成