Nutzen Sie den OpenAPI-Vertrag, um einen Integrations-Client zu generieren. Öffentliche API, Dashboard und MCP-Verwaltungsendpunkt arbeiten mit denselben Workspace-Ressourcen und Berechtigungen.
| Funktion | Endpunkt |
|---|---|
| Wiederverwendbare Tools | GET / POST /api/v1/voice/tools |
| Tool lesen / ändern / löschen | GET / PATCH / DELETE /api/v1/voice/tools/{id} |
| Tool in der Vorschau ansehen oder testen | POST /api/v1/voice/tools/{id}/test |
| Tools an einen Agent binden | PUT /api/v1/voice/agents/{id}/tools |
| Wissensdatenbanken | GET / POST /api/v1/voice/knowledge-bases |
| Wissensdatenbank lesen / ändern / löschen | GET / PATCH / DELETE /api/v1/voice/knowledge-bases/{id} |
| Dokumente hinzufügen / auflisten | POST / GET /api/v1/voice/knowledge-bases/{id}/documents |
| Dokument lesen / löschen | GET / DELETE /api/v1/voice/knowledge-bases/{id}/documents/{doc_id} |
| Abonnements für Anrufereignisse | GET / POST /api/v1/voice/webhooks |
| Abonnement lesen / ändern / löschen | GET / PATCH / DELETE /api/v1/voice/webhooks/{id} |
| Signiertes Testereignis senden | POST /api/v1/voice/webhooks/{id}/test |
| Entfernte MCP-Tools finden | POST /api/v1/voice/mcp/discover |
| MCP-Verwaltungsendpunkt | /api/v1/voice/mcp |
Registrieren Sie ein HTTP-Tool, das Ihren CRM-Adapter abfragt:
{
"name": "lookup_customer",
"description": "Find a customer after confirming their customer ID.",
"kind": "http",
"url": "https://crm.example.com/customers/{{customer_id}}",
"method": "GET",
"read_only": true,
"credential_ref": "crm",
"input_schema": {
"type": "object",
"properties": { "customer_id": { "type": "string" } },
"required": ["customer_id"],
"additionalProperties": false
},
"response_path": "data"
}
POST /tools liefert { "data": { "id": "TOOL_ID", ... } }. Binden Sie seine Definition mit PUT /agents/AGENT_ID/tools und { "tool_ids": ["TOOL_ID"] } an einen Agent. Das ersetzt die gesamte Tool-Liste durch Snapshots; binden Sie neu, wenn sich ein Bibliotheks-Tool ändert. Das Löschen einer Bibliotheksdefinition lässt bestehende Snapshots bestehen. Inline-Definitionen können Sie auch über das Feld tools der Agent-API lesen und ersetzen. Nutzen Sie analysis_config und widget_config, um Analyse und Widget über die Agent-API zu konfigurieren.
Ein Tool kann GET, POST, PUT, PATCH oder DELETE nutzen. query und request_body akzeptieren verschachtelte JSON-Vorlagen wie { "customer": { "id": "{{customer_id}}" } }. Ein vollständiger Platzhalter behält den ursprünglichen JSON-Typ. URL-Platzhalter werden kodiert und dürfen nur nach einem festen öffentlichen HTTPS-Host stehen. Ohne request_body erhalten Nicht-GET-Tools { "arguments": {...}, "call": { "callId": "...", "agentId": "...", "toolCallId": "...", "idempotencyKey": "..." } }. response_path wählt ein Feld in Punktnotation. Einfache parameters werden weiterhin akzeptiert; input_schema unterstützt zusätzlich verschachtelte Objekte, Arrays, Enums und Zahlenbereiche. Externe Schema-Referenzen und reguläre Ausdrücke werden nicht akzeptiert.
static_args: Werte, die bei jedem Aufruf gesendet werden, egal was das Modell schreibt, etwa eine Filial-ID; sie füllen auch {{name}} in Adresse und Body.extract: [{name, path}] behält Felder aus der Antwort einer Funktion (data.id) für {{name}} späterer Funktionen, sodass die customer_id einer Abfrage in die folgende Bestellung gehen kann, ohne dass das Modell sie wiederholt. Die Felder einer Startabfrage werden genauso behalten.reject_when: bis zu 5 Regeln {on: caller|agent, pattern, negate}; solange alle auf die letzten Worte zutreffen, wird die Funktion nicht ausgeführt und der Agent erhält reject_message.model_says: Bei jedem Aufruf schreibt das Modell einen Satz, der gesagt wird, während die Funktion läuft, statt des festen speak_before.Verbinden Sie unter Integrationen → Webhooks & Benachrichtigungen → Verbundene Apps eine App und nutzen Sie dann „Fertige Funktion hinzufügen“ im Tab Wissen & Tools des Agents; ein eigener Endpunkt ist nicht nötig:
check_availability (freie Zeiten an einem Datum) und book_appointment (bucht die vom Anrufer gewählte Zeit) hinzu. Zeiten in Google Kalender folgen der Zeitzone, den Öffnungstagen, Zeiten und Termindauer, die Sie festlegen; Cal.com nutzt die Verfügbarkeit des Ereignistyps selbst und eine von Ihnen festgelegte Ersatz-E-Mail, wenn der Anrufer keine nennt.save_to_sheet hinzu, das eine Zeile mit den von Ihnen aufgeführten Spalten anhängt, plus ID und Zeit des Anrufs.notify_team hinzu, das eine vom Agent geschriebene Nachricht in einem Slack-Kanal postet (Incoming Webhook).Die Steuerungsebene von EvaSay führt diese Funktionen mit dem verbundenen Konto aus; weder der Worker noch die Agent-Definition halten die Zugangsdaten der App. Beim Lesen eines Agents über die API erscheinen sie als kind: "app" (mit app, action, connection_id, app_config); senden Sie sie beim Ersetzen von tools unverändert zurück, um sie zu behalten. Apps werden nur im Dashboard verbunden.
Setzen Sie run_at_start: true bei einem der Tools eines Agents, und es wird zu Beginn jedes Anrufs aufgerufen, bevor der Agent grüßt oder antwortet. Parameter namens caller_number, called_number, direction, channel oder call_id werden dafür ausgefüllt. Die zurückgegebenen Felder füllen {{variables}} in first_message, system_prompt und idle_messages (Felder eine Ebene tiefer als {{customer.name}}), und die gesamte Antwort erhält der Agent als Hintergrund. Eine Begrüßung mit Variablen wartet bis zu 3 Sekunden auf die Antwort; was nicht gefunden wird, bleibt leer. Pro Agent kann ein Tool beim Start laufen.
Zugangsdaten werden in der Serverumgebung für Ihren Workspace und Ihr Ziel konfiguriert; bitten Sie support@evasay.com, eine credential_ref einzurichten. Legen Sie keine API-Schlüssel in Agent-Definitionen, Header, Prompts oder Tool-Parameter. Ihr Adapter kann CRM-Zugangsdaten in seiner eigenen Umgebung halten.
Sehen Sie sich ein Tool in der Vorschau an, bevor Sie Requests an das Geschäftssystem senden:
{
"arguments": { "customer_id": "customer-123" },
"dry_run": true,
"mock_result": { "name": "Alex", "order_status": "shipped" }
}
Eine Vorschau prüft die Parameter und zeigt den abgebildeten Request; sie führt kein Gespräch und kontaktiert das Geschäftssystem nicht. Setzen Sie dry_run=false für eine echte Ausführung. Ein echter Schreibtest erfordert zusätzlich confirmed=true und idempotency_key (8–128 Buchstaben, Ziffern, Punkte, Unterstriche, Doppelpunkte oder Bindestriche). Testantworten enthalten ok, status, duration_ms und ein begrenztes Ergebnis. Sie geben keine Zugangsdaten zurück. Lese- und Schreibtests erfordern Schreibrechte im Workspace.
Während eines Anrufs tragen Geschäfts-Requests einen stabilen Idempotency-Key. Ihr Geschäftsendpunkt muss ihn beachten. Identische Schreibvorgänge innerhalb eines Anrufs werden dedupliziert, auch Operationen mit unbekanntem Ausgang nach einem Timeout. Eine andere, beabsichtigte Operation braucht ein eigenes Geschäftsargument, etwa operation_id. EvaSay wiederholt Schreibvorgänge nicht automatisch. Ereignisse zur Tool-Ausführung enthalten Status und Dauer; die Funktion Gesprächstests bleibt eine Textsimulation, kein Test der Tool-Ausführung.
POST /mcp/discover akzeptiert { "url": "https://crm.example.com/mcp", "credential_ref": "crm" } und liefert die Tools und Schemas des Servers. Registrieren Sie nur das ausgewählte Tool:
{
"name": "lookup_customer",
"description": "Find a CRM customer by confirmed ID.",
"kind": "mcp",
"url": "https://crm.example.com/mcp",
"mcp_tool": "get_customer",
"credential_ref": "crm",
"read_only": true,
"input_schema": {
"type": "object",
"properties": { "customer_id": { "type": "string" } },
"required": ["customer_id"]
}
}
Nur registrierte Tools stehen dem Agent zur Verfügung. Entfernte Verbindungen unterstützen Streamable HTTP mit JSON- oder SSE-Antworten auf Requests, öffentliche HTTPS-Ziele und vorkonfigurierte Zugangsdaten. Alte SSE-Endpunkte, OAuth-Aushandlung, vom Server ausgelöstes Sampling/Elicitation und binäre Anhänge werden nicht unterstützt. Das Finden gewährt nicht automatisch Zugriff auf alle Tools des Servers. Das Schema des entfernten Tools muss inline sein und die unterstützte Teilmenge von JSON Schema verwenden.