Własny kanał

Połącz zewnętrzny kanał tekstowy z agentem ElevenLabs za pomocą webhooków

Omówienie

Custom Channel łączy zewnętrzny system wiadomości z agentem ElevenLabs. Wysyłaj wiadomości użytkowników do webhooka ElevenLabs, a odpowiedzi agenta odbieraj na własnym endpointcie HTTPS.

Custom Channel jest w fazie alfa.
Custom Channel nie jest dostępny dla agentów ani przestrzeni roboczych korzystających z trybu zero retention.

Możliwości

MożliwośćObsługa
Tryb zero retention (ZRM)Nieobsługiwany — niedostępny dla przestrzeni roboczych i agentów ZRM
Załączniki w wiadomościachNieobsługiwane — wiadomości zawierają tylko tekst

Konfiguracja

1

Otwórz Custom Channel

Otwórz agenta, wybierz Channels, następnie Custom Channel i kliknij Add trigger.

2

Skonfiguruj wyzwalacz

Wybierz istniejące połączenie lub utwórz nowe, a potem podaj Reply Webhook URL.

3

Skopiuj dane uwierzytelniające

Kliknij Add, a następnie skopiuj Inbound Webhook URL, Inbound Secret i Outbound Signing Secret.

4

Skonfiguruj usługę

Wysyłaj wiadomości użytkowników na adres webhooka przychodzącego z sekretem przychodzącym w X-Webhook-Secret. Użyj sekretu podpisywania wychodzącego, aby zweryfikować każdą odpowiedź.

Wyślij wiadomość

Wyślij żądanie POST na wygenerowany adres webhooka:

POST /v1/convai/api-integrations/custom_channel/triggers/{trigger_connection_id}/async_message
X-Webhook-Secret: <inbound-secret>
Content-Type: application/json
{
"data": {
"type": "user_message",
"text": "Where is my order?",
"user_identifier": "customer_8427"
},
"user_message_id": "msg_01k1e6z3f4t8n9c2",
"dynamic_variables": {
"order_id": "order_72491"
}
}
PoleWymaganeOpis
data.typeTakMusi mieć wartość user_message.
data.textTakNiepusta wiadomość użytkownika.
data.user_identifierNieIdentyfikator zewnętrznego użytkownika.
user_message_idTakNiepusty klucz idempotencji przekazany przez twój system.
conversation_idNiePodaj zwrócone ID, aby kontynuować rozmowę. Pomiń je, aby rozpocząć nową rozmowę.
dynamic_variablesNieZmienne dynamiczne przekazane agentowi w tej turze.

ElevenLabs zwraca 202 Accepted przed przetworzeniem tury:

{
"conversation_id": "conv_01k1e72d4x8p6v3m",
"status": "queued"
}

Aby kontynuować rozmowę, wyślij kolejne żądanie z tym conversation_id i nowym user_message_id.

Odbieraj odpowiedzi

ElevenLabs wysyła żądanie POST na adres webhooka odpowiedzi po każdej turze:

{
"version": "1",
"conversation_id": "conv_01k1e72d4x8p6v3m",
"user_message_ids": ["msg_01k1e6z3f4t8n9c2"],
"status": "completed",
"data": [
{
"type": "agent_response",
"event": {
"agent_response": "Your order is scheduled to arrive tomorrow.",
"response_id": "9f2c1a7e-4b3d-4e8a-9c1f-2d6b8e0a5f31",
"event_id": 4
}
},
{
"type": "agent_tool_response",
"event": {
"tool_name": "end_call",
"tool_call_id": "toolu_01k1e70r4b8y",
"tool_type": "system",
"event_id": 4,
"is_called": true,
"is_error": false,
"is_blocked": false,
"status": "success"
}
}
],
"error": null
}

Jeśli przetwarzanie się nie powiedzie, status ma wartość failed, data ma wartość [], a error zawiera opis.

data zawiera zdarzenia w kolejności tur. Każdy element ma type i event:

  • agent_response zawiera jedną wypowiedź agenta. response_id jednoznacznie identyfikuje wypowiedź, a event_id wiąże ją z turą. Połącz wartości agent_response, jeśli twój kanał wyświetla jeden dymek tekstowy na turę.
  • agent_tool_response raportuje wynik działania narzędzia i ma wspólne dla tury event_id. Jego status to success, error, blocked lub skipped. Odpowiedź z tool_type: "system", tool_name: "end_call" i status: "success" oznacza, że agent zakończył rozmowę.

Wiele wiadomości przychodzących może zostać połączonych w jedną turę. user_message_ids zawiera identyfikatory wiadomości użytkownika, na które odpowiada ta odpowiedź.

Zweryfikuj podpisy odpowiedzi

Każda odpowiedź zawiera nagłówek ElevenLabs-Signature:

t=1753876800,v0=<hex-digest>

Skrót to podpis HMAC-SHA256 dla {timestamp}.{raw_request_body}, używający sekretu podpisywania wychodzącego. Zweryfikuj surowe body przed sparsowaniem JSON i odrzucaj nieaktualne znaczniki czasu.

import hashlib
import hmac
import time
def verify_signature(raw_body: bytes, header: str, secret: str) -> None:
values = dict(part.split("=", 1) for part in header.split(","))
timestamp = values["t"]
if abs(time.time() - int(timestamp)) > 30 * 60:
raise ValueError("Stale webhook signature")
expected = hmac.new(
secret.encode(),
timestamp.encode() + b"." + raw_body,
hashlib.sha256,
).hexdigest()
if not hmac.compare_digest(expected, values["v0"]):
raise ValueError("Invalid webhook signature")

Sposób dostarczania

ElevenLabs podejmuje trzy próby dostarczenia w trakcie procesu: po około 0, 0,5 i 2 sekundach. Odpowiedź 2xx oznacza pomyślne dostarczenie.

Rozmiar body żądania jest ograniczony do 256 KiB.