mcpField
A
agents

agents

github.com/elevenlabsAgent 工作流51611.4k 次安装今天更新
代码仓库

关于 agents

agents 是用于构建和管理 ElevenLabs 语音 AI Agent 的技能,面向开发者和需要配置对话体验的团队。它支持多种 LLM、工具、工作流与会话接入方式,也可通过网页嵌入对话。

主要功能

  1. 01通过 CLI 创建和管理 Agent
  2. 02配置多种 LLM 提供方
  3. 03添加 Webhook、客户端和系统工具
  4. 04设置分支工作流与可复用流程
  5. 05通过 WebRTC 或客户端启动会话
  6. 06支持网页嵌入对话

适用场景

  1. 01搭建语音客户服务 Agent
  2. 02配置带工具调用的对话流程
  3. 03在网页中接入 Agent 会话

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/elevenlabs/skills --skill agents

安装后在 Claude Code 中输入/agents确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
agent-configuration.md
client-tools.md
installation.md
outbound-calls.md
using-procedure-api.md
widget-embedding.md
writing-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>
  );
}

配置

提供商模型
OpenAIgpt-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
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-5、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.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
自定义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_toneIVR 导航

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安排预约
salesforceCRM 查询、创建案例
hubspotCRM、营销、联系人
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_weatherhttps://wttr.in/{location}?format=j1当前天气
search_wikipediahttps://en.wikipedia.org/api/rest_v1/page/summary/{topic}主题摘要
get_exchange_ratehttps://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(请求过多)

参考资料

评论

支持 Markdown