WebSocket
Öffne einen Socket, sende JSON-Nachrichten und streame jede Antwort in deine App, während der Agent sie schreibt. Agenten-Sessions halten das Gespräch über mehrere Nachrichten und neue Verbindungen hinweg zusammen.
- Publisher
- Von connic
- Modi
- Sync
- Einrichtung
- Dashboard oder connectors/*.yaml
- Dokumentation
- WebSocket Docs
Streame die Antwort, während der Agent schreibt
Öffne den Socket, sende JSON und zeige jeden Textteil an, sobald er ankommt. Jede Nachricht bekommt ein ack, und die Antwort endet mit dem vollständigen Text und der Token-Nutzung.
- Streaming an
- Du bekommst stream_start, dann stream_chunk Events mit Textteilen und zum Schluss stream_end mit der vollständigen Antwort und der Token-Nutzung.
- Streaming aus
- Die Antwort kommt als ein einzelnes response Event, sobald der Run fertig ist.
- Erst die Guardrails
- Hat der Agent Output-Guardrails, sendet er seine Antwort als einen einzigen stream_chunk, nachdem die Prüfung bestanden ist.
- Antworten zuordnen
- Gib jeder Nachricht eine id, dann trägt jedes Event ihrer Antwort dieselbe id.
const ws = new WebSocket(
"<websocket-url>?secret=<your-secret-key>"
);
ws.onopen = () => {
ws.send(JSON.stringify({
type: "message",
id: "msg-001",
payload: { message: "Where is my order ord_8812?" },
}));
};
ws.onmessage = (event) => {
const data = JSON.parse(event.data);
if (data.type === "stream_chunk") appendToChat(data.chunk);
};{ "type": "ack", "id": "msg-001", "message_number": 1 }
{ "type": "stream_start", "id": "msg-001",
"agent": "support-chat" }
{ "type": "stream_chunk", "id": "msg-001",
"agent": "support-chat", "chunk": "Order ord_8812 " }
{ "type": "stream_chunk", "id": "msg-001",
"agent": "support-chat", "chunk": "shipped on October 12." }
{ "type": "stream_end", "id": "msg-001",
"agent": "support-chat",
"full_response": "Order ord_8812 shipped on October 12.",
"token_usage": { "input_tokens": 812, "output_tokens": 14,
"total_tokens": 826 } }Halte das Gespräch über mehrere Nachrichten
Jede Nachricht startet einen eigenen Agent Run. Eine persistente Session mit einer Gesprächs-ID als Schlüssel trägt den Verlauf von einer Nachricht zur nächsten.
- Der Verlauf gehört zum Gespräch
- Setze session.key auf input.conversation_id und sende dieses Feld mit jeder Nachricht. Verbindest du dich mit derselben ID neu, geht das Gespräch weiter.
- Ein Schlüssel pro Gespräch
- Ohne Schlüssel teilen sich alle Gespräche des Agenten eine Session.
- Eine Nachricht nach der anderen
- Eine Verbindung verarbeitet Nachrichten in der Reihenfolge ihres Eingangs. Kommt eine Nachricht während einer Antwort, wartet sie, bis alle verknüpften Agenten geantwortet haben.
- Freigaben halten die Antwort an
- Ein Tool mit Freigabepflicht pausiert die Antwort, bis jemand entscheidet, und spätere Nachrichten warten. Halte approval.timeout bei Chat-Agenten kurz.
session:
key: input.conversation_id
ttl: 86400{
"type": "message",
"id": "msg-002",
"payload": {
"message": "Can you send it to my office instead?",
"conversation_id": "conv_4821"
}
}Halte den Socket neben deinen Agenten
Deklariere ihn als YAML-Datei in connectors/. Jedes Deployment legt ihn für sein Environment an oder aktualisiert ihn, und ein Rollback stellt ihn wieder her. URL und Secret erzeugt connic, deshalb stehen beide nicht in der Datei.
type: websocket
name: Support chat
config:
streaming: true
max_messages_per_session: 500
agents:
- support-chatLege fest, wer sich verbindet und wie lange
Die Authentifizierung ist standardmäßig aktiv, und jede Verbindung schließt nach einer Leerlaufzeit oder einem Nachrichtenlimit, das du festlegst.
- Ein Secret beim Verbinden
- Übergib es als Query-Parameter secret, als X-Connic-Secret Header oder als erste JSON-Nachricht. Bei falschem Secret schließt der Socket, bevor ein Run startet.
- Eigene Prüfung der Aufrufer
- Deaktiviere Require Authentication nur, wenn Middleware jeden Aufrufer prüft, zum Beispiel über ein signiertes Token.
- Limits pro Verbindung
- Eine inaktive Verbindung schließt nach session_timeout, und sobald sie max_messages_per_session erreicht, schließt sie ebenfalls. Der Verlauf bleibt in der Agenten-Session, also verbindet sich der Client neu und macht weiter.
Wo ein WebSocket passt
Wähle ein Szenario und sieh, was der Client sendet und was über den Socket zurückkommt.
Deine Web-App streamt die Antwort ins Chatfenster, während der Agent sie schreibt.
{
"type": "message",
"id": "msg-001",
"payload": {
"message": "Where is my order ord_8812?",
"conversation_id": "conv_4821"
}
}{ "type": "ack", "id": "msg-001", "message_number": 1 }
{ "type": "stream_start", "id": "msg-001",
"agent": "support-chat" }
{ "type": "stream_chunk", "id": "msg-001",
"agent": "support-chat", "chunk": "Order ord_8812 " }
{ "type": "stream_chunk", "id": "msg-001",
"agent": "support-chat", "chunk": "shipped on October 12." }
{ "type": "stream_end", "id": "msg-001",
"agent": "support-chat",
"full_response": "Order ord_8812 shipped on October 12.",
"token_usage": { "input_tokens": 812, "output_tokens": 14,
"total_tokens": 826 } }Nutzer laden in deinem Portal einen Vertrag hoch und fragen danach. Die Antwort streamt mit der Datei im Kontext zurück.
{
"type": "message",
"id": "msg-007",
"payload": {
"message": "Which notice period applies to this contract?",
"conversation_id": "conv_9310",
"files": [
{
"name": "service-agreement.pdf",
"mime_type": "application/pdf",
"data": "<base64-bytes>",
"size": 284113
}
]
}
}{
"type": "stream_end",
"id": "msg-007",
"agent": "contract-reader",
"full_response": "Section 9: three months' notice to the end of a quarter.",
"token_usage": { "input_tokens": 6120, "output_tokens": 22, "total_tokens": 6142 }
}Deine App zeigt den nächsten Einrichtungsschritt als vollständige Nachricht, deshalb läuft die Verbindung ohne Streaming.
{
"type": "message",
"id": "msg-003",
"payload": {
"message": "I imported my contacts. What comes next?",
"conversation_id": "onb_5520"
}
}{ "type": "ack", "id": "msg-003", "message_number": 3 }
{
"type": "response",
"id": "msg-003",
"agent": "onboarding-guide",
"response": "Next, create your first campaign. Pick a template to start from.",
"token_usage": { "input_tokens": 930, "output_tokens": 16, "total_tokens": 946 }
}Dein CRM-Backend fragt ein Briefing zu einem Account an und zeigt den fertigen Text in einer Seitenleiste.
import json
import websockets
async def brief(account_id: str) -> str:
url = "<websocket-url>?secret=<your-secret-key>"
async with websockets.connect(url) as ws:
await ws.recv() # connected
await ws.send(json.dumps({"payload": {
"message": "Brief me before my call.",
"account_id": account_id,
}}))
while True:
event = json.loads(await ws.recv())
if event["type"] == "stream_end":
return event.get("full_response", ""){
"type": "stream_end",
"id": "3f2b8c1e-6d4a-4e9b-9a7c-2d5e8f1b4c6a",
"agent": "account-briefing",
"full_response": "Example GmbH renewed in March and has two open tickets.",
"token_usage": { "input_tokens": 1460, "output_tokens": 24, "total_tokens": 1484 }
}FAQ zu WebSocket
Weitere Verbindungen
AWS SQS
Von connicAgenten arbeiten Nachrichten aus SQS-Queues ab. Jede Nachricht wird gelöscht, sobald ihre Runs abgeschlossen sind, und fehlgeschlagene kommen nach dem Visibility Timeout zurück.
InboundOutboundCron-Scheduler
Von connicEin Cron-Ausdruck legt fest, wann ein Agent ausgeführt wird. connic betreibt den Scheduler für tägliche Zusammenfassungen, stündliche Health-Checks und wöchentliche Audits.
InboundE-Mail (SMTP/IMAP)
Von connicEingehende E-Mails lösen Agenten aus, die Antwortentwürfe per SMTP versenden können. Anhänge werden unterstützt.
InboundOutboundHTTP-Webhooks
Von connicHTTP-Anfragen mit JSON, Formulardaten oder Datei-Uploads lösen Agenten aus. Ein eigener Integrationsserver ist nicht erforderlich.
InboundOutboundSyncPostgreSQL
Von connicMit LISTEN/NOTIFY lösen neue Zeilen einen Agenten aus. Polling oder eine CDC-Pipeline sind nicht erforderlich.
InboundTelnyx Voice
Von connicLass einen Sprachagenten Anrufe unter deiner Telnyx-Rufnummer entgegennehmen. connic richtet die Anrufweiterleitung ein und überträgt das Gespräch.
Sync