Az API ugyanazokkal az ügynökökkel, hívásokkal és kreditekkel dolgozik, mint a webes vezérlőpult. Bármit, amit a vezérlőpulton felépítesz, vezérelhetsz a saját rendszereidből, és fordítva.
| Mit | Endpoint |
|---|---|
| Ügynökök listázása | GET /api/v1/voice/agents |
| Ügynök létrehozása | POST /api/v1/voice/agents |
| Ügynök lekérése / frissítése | GET · PATCH /api/v1/voice/agents/{id} |
| Kimenő hívás indítása | POST /api/v1/voice/calls |
| Hívások listázása | GET /api/v1/voice/calls |
| Hívás lekérése (átirat) | GET /api/v1/voice/calls/{id} |
| Hívás törlése | DELETE /api/v1/voice/calls/{id} |
| Egy hívó hívásainak törlése | POST /api/v1/voice/calls/delete-by-caller |
| Kampányok | GET · POST /api/v1/voice/campaigns |
| Kampány lekérése | GET /api/v1/voice/campaigns/{id} |
| Indítás / szüneteltetés / törlés | POST /api/v1/voice/campaigns/{id}/{action} |
| Klónozott hangok | GET · POST /api/v1/voice/voices |
| Klónozott hang törlése | DELETE /api/v1/voice/voices/{id} |
| Hívástiltó lista | GET · POST /api/v1/voice/do-not-call |
| Eltávolítás a listáról | DELETE /api/v1/voice/do-not-call/{phone} |
| Nyelvek, hangok, sablonok | GET /api/v1/voice/catalog |
| Egy ügynök tesztjei | GET · POST /api/v1/voice/agents/{id}/tests |
| Tesztek futtatása / futás lekérése | POST /api/v1/voice/agents/{id}/test-runs · GET /api/v1/voice/test-runs/{id} |
| Szám hozzárendelése ügynökhöz | PATCH /api/v1/voice/phone-numbers/{id} |
| Szólisták | GET · POST /api/v1/voice/vocabularies |
Hozz létre egy kulcsot a vezérlőpulton az Integrációk → API-kulcsok alatt (vagy egy kattintással az áttekintő oldalon), és küldd Bearer tokenként:
Authorization: Bearer sk-your-key
A kulcs abban a munkaterületben működik, amelyben a tulajdonosa dolgozik, az ő szerepkörével: egy csak olvasási jogú tag kulcsa olvasni tud, de semmit sem módosíthat.
Hozz létre egy ügynököt sablonból, és ha szeretnéd, ugyanabban a kérésben add meg a mezőit. template nélkül üresen indul; a GET /api/v1/voice/catalog felsorolja a sablonokat, valamint az ügynök által elfogadott nyelveket és hangokat. A sablonok angolul és kínaiul készültek, ezért más nyelvhez küldje el a system_prompt és a first_message mezőt az adott nyelven. Vagy a teljes kérés mentésre kerül, vagy nem jön létre ügynök, így egy elutasított kérés javítás után újra elküldhető. A válaszban lévő dashboard_url az ügynök oldala az irányítópulton, ahol a böngészőben beszélhet a piszkozattal. Minden ügynök az EvaSay ASR-en, az EvaSay LLM-en és az EvaSay TTS-en fut, amelyeket az EvaSay hívásonként a nyelv és a terhelés alapján választ, és amelyek benne vannak a hívás árában; más szolgáltatók fiókjait nem kell beállítanod.
curl https://evasay.com/api/v1/voice/agents \
-X POST \
-H "Authorization: Bearer sk-your-key" \
-H "Content-Type: application/json" \
-d '{
"name": "Front desk",
"language": "en",
"first_message": "Hi, thanks for calling Sunrise Salon. How can I help?",
"system_prompt": "You are the front desk of Sunrise Salon..."
}'
Ezek bármelyik mezőjét frissítheted a PATCH /api/v1/voice/agents/{id} hívással:
| Mező | Megjegyzések |
|---|---|
name, first_message, system_prompt | Szöveg |
status | A published új verzióként közzéteszi a piszkozatot; a draft megszünteti a hívásfogadást |
language | A 27 nyelv egyike, pl. en, zh, es, de, vagy multi, hogy kövesse a hívó nyelvét |
temperature | 0-100 |
max_duration_sec, silence_timeout_sec | Hívási korlátok |
interruptible, end_call_enabled | Logikai értékek |
confirm_details | Logikai érték; a számokat és neveket visszamondja, és megerősítteti őket |
ai_disclosure | Logikai érték, alapértelmezés true; az első üzenete előtt az ügynök a hívás nyelvén elmondja, hogy a hívó mesterséges intelligenciával beszél (kimarad, ha az első üzenet már ezt mondja) |
voicemail_detection | Logikai érték; a kimenő hívások először hallgatnak, és hangpostánál véget érnek |
voicemail_message | A hangpostán hagyott üzenet, használhat {{variables}} értékeket; ha nincs, lerakja a telefont |
transfer_number | Az átkapcsolás száma, nemzetközi formátumban |
transfer_destinations | Legfeljebb 9 további szám, [{name, number, when}]; az ügynök a when alapján választ egyet |
transfer_briefing | Logikai érték; aki először felveszi, meghallja az ügynök összefoglalóját a hívásról |
pronunciations | Legfeljebb 100 elem [{word, say, case_sensitive}]; a hang a word helyett a say értéket mondja |
idle_messages | Legfeljebb 3 emlékeztető, amelyeket sorban mond el egy elhallgatott hívónak, mielőtt a hívás véget ér |
noise_reduction | Logikai érték; a hívó háttérzaját kiszűri, mielőtt meghallanák |
recording_enabled | Logikai érték; a hívásokat két csatornán rögzíti (a hívó balra, az ügynök jobbra) |
recording_consent | announce, ask (csak akkor marad meg, ha a hívó beleegyezik) vagy none |
recording_notice | Az elsőként elmondott tájékoztatás vagy kérdés; üresen a hívás nyelvén beépített szöveg |
handoffs | Legfeljebb 5 elem [{agent_id, when}]: más ügynökök, akiknek ez átadhat egy hívást |
knowledge_base_id | Egy a tudásbázisaid közül |
vocabulary_id | Egy a szótáraid közül; a benne szereplő kifejezéseket megbízhatóbban ismeri fel, ha a hívó kimondja őket |
voice_id | Egy beépített EvaSay-hang azonosítója vagy egy klónozott hangod (clone:…) |
A beépített hangok a nyelvtől függnek: a kínainak ming-designed-female-clear és ming-designed-female-warm (női), ming-designed-male-clear és ming-designed-male-friendly (férfi) van, a többi nyelvnek F1–F5 (női) és M1–M5 (férfi). Az a beépített hang, amely nem beszéli az ügynök nyelvét, lecserélődik az azonos nemű hangra, amelyik igen. A régebbi tts_voice_id mezőnév továbbra is elfogadott. Minden más voice_id érték, illetve a még nem kész klónozott hang elutasításra kerül.
Az analysis_config határozza meg, mit kell megállapítani minden hívásból a végén: summary (alapértelmezés true), summaryLanguage, successCriteria (mit ér el egy sikeres hívás), fields (legfeljebb 20 kinyerendő {name, type, description}, ahol a type string, number vagy boolean) és scorecard (legfeljebb 10 {name, description, weight}, súly 1–5). Az eredmények a hívás analysis mezőjében és a call.analyzed webhookban jelennek meg.
Egy ügynök mezőinek módosítása a piszkozatát módosítja. A hívások a közzétett verziót használják tovább, amíg közzé nem teszed a piszkozatot a POST /api/v1/voice/agents/{id}/publish hívással (opcionálisan note mezővel), vagy a status: "published" értékkel ugyanabban a PATCH-ben. Minden közzététel megőriz egy számozott verziót; az ügynök published_version mezője megmondja, melyiket használják a hívások. Egy hívás azon a verzión marad, amely az indulásakor élesben volt, így a hívás közbeni közzététel nem változtat rajta. A vezérlőpultról indított tesztbeszélgetések a piszkozatot használják.
A GET /agents/{id}/versions kilistázza a verziókat, a POST /agents/{id}/versions/{version}/restore pedig visszaállít: az új hívások azt a verziót használják, és a piszkozat azzá válik. Az ügynök neve, telepítése, a widget kinézete és az értesítések nincsenek verziózva, és azonnal módosulnak, ahogy a tudásbázis dokumentumai is.
Egy teszt szövegben játszik le egy hívást: egy szimulált hívó eljátssza a scenario leírását, az ügynök a piszkozatából (utasítások, első üzenet és tudás) válaszol, egy értékelő pedig a success_criteria alapján ellenőrzi a beszélgetést. Írjon teszteket a fontos hívásokra, futtassa őket minden módosítás után, és akkor tegye közzé, ha átmennek.
curl https://evasay.com/api/v1/voice/agents/AGENT_ID/tests \
-X POST \
-H "Authorization: Bearer sk-your-key" \
-H "Content-Type: application/json" \
-d '{
"name": "Move a booking",
"scenario": "A regular customer wants to move Friday 3 pm to Saturday morning.",
"success_criteria": "Offers Saturday times and confirms the new time and the customer'"'"'s name.",
"max_turns": 8
}'
A POST /agents/{id}/test-runs lefuttatja az ügynök összes tesztjét, vagy a test_ids listában szereplőket, és tesztenként egy futással válaszol (status: "running"). Kérdezze le a GET /test-runs/{id} végpontot, amíg a status értéke passed, failed vagy error nem lesz; ekkor a futásban ott a transcript és az értékelő reason mezője (angolul, vagy kínaiul ezzel: reason_language: "zh"). Minden futás Credits-be kerül, amely a teszteknél látható az irányítópulton; a futások az első olyannál megállnak, amelyet az egyenleg nem fedez, a not_started pedig felsorolja a többit. A le nem futó futás díját visszatérítjük. A tesztek azt ellenőrzik, mit mond az ügynök, nem a hangját vagy időzítését, és nem hívják meg a függvényeit: ezeket a POST /tools/{id}/test hívással nézheti meg előre. Egy ügynöknek legfeljebb 30 tesztje lehet; a PATCH és a DELETE /agents/{id}/tests/{test_id} módosít vagy töröl egyet.
A teljes hívások (type: "simulation", alapértelmezés) mellett egy teszt egyetlen választ is ellenőrizhet. A type: "next_reply" a chat_history mezőt kapja, vagyis a válasz előtti, a hívóval végződő beszélgetést ([{role, text}], ahol a role caller vagy agent), valamint a success_criteria mezőt az ügynök következő válaszához. A type: "tool_call" a chat_history és az expected_tool {name, arguments, match} mezőt kapja: az ügynöknek a name függvényt kell meghívnia (egy saját függvényét vagy az end_call, transfer_call, handoff_to_agent valamelyikét) az arguments értékekkel, pontos összevetéssel (szóközök levágva, kis- és nagybetű mindegy) vagy match: "judge" esetén jelentés szerint; a további átadott argumentumokat nem nézzük. Egy futás transcript mezőjében a tool_calls mutatja a meghívott függvényeket.
A POST /agents/{id}/tests/generate az ügynök piszkozatából (utasítások, tudás és függvények) javasol teszteket. Paraméterei: count (1–10, alapértelmezés 5), types, focus (mit fedjenek le) és language (en vagy zh, a nevekhez és kritériumokhoz); egy futásnyi Credits-be kerül, és piszkozatokat ad vissza, amelyeket átnézve a POST /agents/{id}/tests hívásnak küldhet; save: true esetén el is menti őket.
A hooks a hívás egy adott pillanatában tesz valamit, legfeljebb 10 szabály: on: "silence" (a hívó seconds ideje, 3–600, nem szólt, mióta az ügynök befejezte; egyszer, amíg újra meg nem szólal), on: "time_elapsed" (seconds másodperccel a hívás kezdete után, 10–3600) vagy on: "call_ending". Minden szabály legfeljebb 3-at hajt végre (do) a következők közül: {type: "say", text}, {type: "transfer", destination?}, {type: "end_call", text?} és {type: "tool", name, args?}; a hívás végére szóló szabály csak függvényeket futtat. Egy szabály által befejezett hívás ended_reason értéke rule_ended.
Telefonhívásoknál a hívó által lenyomott billentyűk válaszként jutnak el az ügynökhöz: a bevitel # jellel vagy kétmásodperces szünettel ér véget. Kimenő hívásoknál az ügynök maga is nyomhat billentyűket, hogy átjusson egy cég telefonmenüjén.
A transfer_number az ügynök fő száma, amelyre a hívót emberhez adja át, és az a szám, amelyet akkor hív, ha a munkaterületen elfogytak a kreditek. A transfer_destinations elnevezett számokat ad hozzá, mindegyikhez megjegyzéssel, mikor kell használni („Számlázás: számlákkal és visszatérítésekkel kapcsolatos kérdések”), és az ügynök választ. Bekapcsolt transfer_briefing esetén az ügynök átkapcsoláskor rövid összefoglalót ír; aki felveszi, meghallja azt egy EvaSay-hangon és az ügynök összefoglalónyelvén, mielőtt a hívót átkapcsolják. A hívás ended_reason értéke ekkor transferred.
A handoffs segítségével egy ügynök átadhat egy hívást a munkaterületed egy másik közzétett ügynökének, például egy recepció átadja a foglalást egy foglalási ügynöknek. Az ügynök a when alapján választ. A másik ügynök átveszi ugyanazt a hívást mindazzal, ami eddig elhangzott, és a saját utasításaival, hangjával, tudásával, eszközeivel és átadásaival beszél. A hívás az első ügynök alatt marad listázva, elemezve és számlázva; az átirata minden átadást jegyez.
A számokat az irányítópulton kapcsolja össze a saját szolgáltatói fiókjával. A GET /api/v1/voice/phone-numbers felsorolja őket, a PATCH /api/v1/voice/phone-numbers/{id} a { "agent_id": "AGENT_ID" } értékkel pedig egy ügynökhöz (annak közzétett verziójához) irányítja a szám hívásait, a "agent_id": null értékkel egyikhez sem; a label átnevezi.
A szólista olyan neveket és kifejezéseket tartalmaz, amelyeket a hívók mondanak, és a beszédfelismerő különben félrehallana, például termék-, gyógyszer- vagy utcaneveket. POST /api/v1/voice/vocabularies a { "name": "Products", "terms": ["Lumora", "Vantix Pro"] } értékkel (legfeljebb 1000, egyenként 50 karakteres kifejezés, vagy kiindulásként "preset": "medical" vagy "legal"), majd állítsa be az ügynök vocabulary_id mezőjét. GET, PATCH (name, terms) és DELETE /vocabularies/{id}; ügynök által használt lista nem törölhető.
Minden számnak vannak hívásszabályai a Telefonszámok oldalon, amelyek azelőtt érvényesülnek, hogy az ügynök felvenné: a letiltott számokat vagy számelőtagokat (+1555), valamint a számukat elrejtő hívókat felvétel nélkül elutasítja, és semmibe sem kerülnek; a listán szereplő hívók közvetlenül átkapcsolhatók egy másik számra; és ha az ügynök nem tud felvenni (nincs közzétéve, nincs worker, elfogytak a kreditek és nincs átkapcsolási szám), a hívás kicsöngethet egy számot, vagy lejátszhatja a saját üzenetedet. Egy indítási lekérdezés (run_at_start) is elutasíthat egy hívót a {"reject": true, "message": "..."} válasszal: az ügynök elmondja az üzenetet, ha van, és lerakja a telefont, ended_reason értéke rejected.
Indíts egy hívást a munkaterületed egyik telefonszámáról. Minden kéréshez egyedi Idempotency-Key kell; ugyanannak a kulcsnak az ismételt elküldése ugyanazt a hívást adja vissza ahelyett, hogy kétszer tárcsázna.
curl https://evasay.com/api/v1/voice/calls \
-X POST \
-H "Authorization: Bearer sk-your-key" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"agent_id": "AGENT_ID",
"to": "+14155550100",
"variables": { "customer_name": "Alex", "order_id": "1234" }
}'
A from kötelező, ha a munkaterületnek egynél több telefonszáma van. A variables kitölti a {{customer_name}}-szerű helyőrzőket az ügynök első üzenetében és promptjában.
A GET /api/v1/voice/calls/{id} visszaadja a hívás állapotát, időtartamát, a felszámított krediteket, az összefoglalót, az elemzést és az átiratot. A hívásokat a GET /api/v1/voice/calls?agent_id=&status=&channel=&user_id=&page= listázza (user_id: a személyhez tartozó saját azonosítód, egy webes hívástokenből). A turns a hívás fordulónkénti hibakeresési naplója: hová ment az idő attól kezdve, hogy a hívó befejezte a beszédet, addig, amíg meghallotta a választ, ezredmásodpercben — waitMs (beszédvég), sttMs (felismerés), llmMs (a modell első szava, függvényfordulónként még egy), ttsMs (a hang első hangja), firstAudioMs (a válasz meghallása) — a meghívott függvényekkel, megszakításokkal és hibákkal. A hívás oldala is megmutatja.
A recording_enabled esetén minden hívás kétcsatornás WAV-ként kerül rögzítésre: a hívó balra, az ügynök jobbra, a hívás mintavételi frekvenciáján. A recording_consent: "announce" esetén az ügynök először elmondja, hogy a hívást rögzítik; "ask" esetén megkérdezi, és a felvétel csak akkor marad meg, ha a hívó beleegyezik (a válasz hiánya nemnek számít); "none" esetén semmit sem mond. Nézd meg, mit ír elő a jog ott, ahol te és a hívóid vagytok.
A felvételek az EvaSay tárhelyén vagy a saját S3-kompatibilis bucketedben (AWS S3, Cloudflare R2, Google Cloud Storage, Supabase, MinIO) tárolódnak, amelyet az Integrációk → Webhookok és értesítések → Felvételek tárolása alatt állítasz be. A hívást futtató worker közvetlenül a bucketbe tölti fel a fájlt. A GET /api/v1/voice/calls/{id} a felvétel mentése után egy órán át érvényes recordingUrl értéket ad vissza, valamint a recording.status értéket (recording, stored, declined vagy failed).
A DELETE /api/v1/voice/calls/{id} töröl egy befejezett hívást az átirattal, a felvétellel (az EvaSay tárhelyén vagy a saját bucketjében), az elemzéssel és a webhook-kézbesítésekkel együtt. A felhasznált Credits a kredittörténetben marad. A még nem törölhető hívás 409 választ ad code call_not_deletable_yet értékkel: még tart vagy épp most ért véget, még elszámolás alatt áll, a felvétele talán még feltöltés alatt van, vagy olyan Credits-tartozása van, amelyet az egyenleg nem fedezett (előbb töltsön fel Credits-et).
Ha valaki kéri az adatai törlését, a POST /api/v1/voice/calls/delete-by-caller a { "phone_number": "+14155550123" } értékkel törli az ezzel a számmal folytatott összes hívást (bejövő hívásnál a hívó számát, kimenőnél a hívott számot), a { "user_id": "..." } értékkel pedig az összes webes hívást, amelynek tokenjében ez a user_id szerepelt. A válasz { "deleted": 12, "kept_back": { "settling": 1 }, "more": false }: kérésenként legfeljebb 200 hívás, ezért ismételje, amíg a more értéke true, később pedig a kept_back hívásai miatt is. Ha a szám a hívástiltó listán van, ott marad. Az irányítópulton ugyanezt a Hívások → Hívó adatainak törlése végzi.
Küldd el a POST /api/v1/voice/calls/{id}/control kérést, amíg a hívás folyamatban van. A hívást futtató worker nagyjából 2 másodpercen belül felveszi a parancsot; az API 202 választ ad. Ha a hívást futtató worker nem érhető el, az API 503 választ ad (code call_unreachable), és a parancs nem fut le.
type | Mi történik |
|---|---|
say | Az ügynök az aktuális mondata után elmondja a text értéket, vagy azonnal, ha "interrupt": true |
note | Az ügynök megtudja a text értéket (nem mondja ki hangosan), és a következő válaszától figyelembe veszi; az átirat jegyzi |
end | Az ügynök elmondja a text értéket, ha meg van adva, majd lerakja; a text nélküli telefonhívást azonnal lerakja |
A hívás ended_reason értéke ekkor api_ended. A vezérlőpult hívásoldalán ugyanezek a vezérlők vannak.
A POST /api/v1/voice/calls/{id}/listen (opcionálisan { "channels": 2 }) egy listen_url címet ad vissza, amelyet két percen belül megnyithatsz. Ez egy WebSocket: először egy JSON-üzenet {"type":"start","sampleRate":8000,"channels":1,"encoding":"pcm_s16le"}, majd bináris keretek 16 bites little-endian PCM-mel azzal, amit a hívó hall (mindkét hang összekeverve; channels: 2 esetén a hívó balra, az ügynök jobbra). A hívás végén bezárul. A hang közvetlenül a hívást futtató workertől érkezik, nem az EvaSay vezérlősíkján keresztül; a vezérlőpult hívásoldalának Hallgatás gombja ugyanezt a címet használja.
Küldd és fogadd egy hívás hangját a saját programodból, például a saját telefonrendszeredből vagy alkalmazásodból. Indítsd el a hívást:
curl https://evasay.com/api/v1/voice/calls/websocket \
-X POST \
-H "Authorization: Bearer sk-your-key" \
-H "Content-Type: application/json" \
-d '{ "agent_id": "AGENT_ID", "encoding": "pcm_s16le", "sample_rate": 16000 }'
A válasz websocket_url címe egyszeri tokent tartalmaz, és 15 percen belül megnyitható. Az encoding értéke pcm_s16le (16 bites little-endian PCM 8000, 16000 vagy 24000 sample_rate mellett) vagy mulaw (8 kHz-es μ-law). A hang mindkét irányban bináris keretekként halad ebben a formátumban, lehetőleg 20 ms-osakban. A szöveges keretek JSON-ok:
| Irány | Üzenetek |
|---|---|
| Te → EvaSay | {"type":"dtmf","digits":"12#"} billentyűleütések; {"type":"end"} lerakja; {"type":"text","text":"…"} a hívó által begépelt szavak ("input":"button" megérintett válaszhoz); {"type":"context","text":"…","key":"cart"} amit az alkalmazásod jelent (az ügynök nem válaszol rá); {"type":"tool_result","id":"…","result":{…}} (vagy "error") egy oldalfüggvény válasza |
| EvaSay → te | start (a callId mezővel); clear (a hívó közbeszólt: dobd el az ügynök még le nem játszott hangját); transcript (role, text, final, és input a begépelt szavaknál); user_started_speaking, user_stopped_speaking, agent_started_speaking, agent_stopped_speaking; cards (cards, quick_replies); tool (id, name, arguments: futtasd az egyik oldalfüggvényedet); notice (code: too_fast vagy limit a begépelt szavaknál); ended (a reason mezővel, majd a socket bezárul) |
Az ügynök köszön, amint csatlakozol. A kéréshez hozzáadhatók a user_id és a page_tools (az oldalfüggvények, amelyekre az alkalmazásod válaszol, lásd alább). A hívásokat percenként számláznak, mint bármelyik másikat, ugyanazokkal a hívásnaplókkal, elemzéssel és webhookokkal.
Egy webes hívásnál (a widget, a tárolt oldal, az alkalmazásod) a hívó a hang mellett egy csevegést lát, így az ügynök többet tehet a beszédnél. A telefonos hívók ebből semmit sem kapnak.
Kapcsold be az Ügynök → Eszközök → Küldés a hívónak beállítást (send_to_caller az ügynök API-ban), és az ügynök egyszerre legfeljebb öt kártyát tehet a hívó képernyőjére: címet, alatta egy sort, leírást, képet, hivatkozást és mindegyiken legfeljebb két válaszgombot; egy kérdés alá legfeljebb három gyorsválaszt is felkínálhat. A hivatkozásokat soha nem olvassa fel.
Az ügynök csak olyan hivatkozásokat és képeket küldhet, amelyeket abban a hívásban kapott: az utasításait és az üdvözlését, a tudásbázist (egy weboldalról beolvasott dokumentum hordozza az oldal címét), a függvényeid válaszait és a kész kártyákat. A hivatkozásnak ezenkívül az allowed_hosts egyikén kell lennie (a kész kártya saját webhelye mindig az). Az ügynök által kitalált, vagy a hívó által felolvasott hivatkozásokat nem küldi el. Az ügynök szavaiban az ezekre a webhelyekre mutató hivatkozások kattinthatók a csevegésben.
"send_to_caller": {
"enabled": true,
"allowed_hosts": ["shop.example.com", "*.cdn.example.com"],
"presets": [
{ "name": "hours", "when": "asked when we open", "title": "Opening hours",
"description": "Mon–Sat 9:00–18:00", "url": "https://shop.example.com/stores", "image_url": "" }
]
}
Minden küldés a call.message_sent webhookként érkezik hozzád (channel, items a title és url mezőkkel, quickReplies, blocked). Egy hívás legfeljebb 10-szer küldhet.
A hívás során a hívó gépelhet is (e-mail-címet, rendelésszámot), vagy megérinthet egy válaszgombot; az ügynök úgy válaszol rá, mint a beszédre, előbb abbahagyva, ha éppen beszélt. Üzenetenként legfeljebb 500 karakter, másodpercenként egy, hívásonként 100. A hívásnaplóban ezek a fordulók begépeltként vagy megérintettként vannak megjelölve.
A widget egy evasay objektumot ad az oldaladnak. Minden opcionális, és a hívás kerete csak akkor hallgat az oldaladra, ha az a widget engedélyezett webhelyeinek egyike (Ügynök → Telepítés):
<script src="https://evasay.com/voice-widget.js" data-agent="AGENT_SLUG" async></script>
<script>
window.evasay = window.evasay || [];
evasay.push(function (agent) {
agent.setVariables({ plan: 'pro', page: location.pathname }); // for the next call
agent.update('Cart: 2 items, $120', { key: 'cart' }); // during it
agent.registerTool('add_to_cart', async function (args) {
// your code, in the visitor's browser
return { ok: true, checkout: 'https://shop.example.com/checkout' };
});
agent.on('cards', function (cards) {}); // also 'live', 'ended'
});
</script>
setVariables értékei kitöltik a {{name}} helyőrzőt az utasításokban és az üdvözlésben. A látogató böngészőjéből származnak, ezért az ügynök megtudja, hogy nincsenek ellenőrizve, és soha nem jutnak el a függvényeidhez vagy az indítási lekérdezéshez.update közli az ügynökkel, mi történik az oldalon, anélkül hogy válaszra késztetné; ugyanazzal a key értékkel érkező újabb frissítés felváltja a régebbit."kind": "page", url nélkül), és regisztrálj az oldaladon egy azonos nevű függvényt. Az ügynök csak olyan oldalról érkező hívásokban hívhatja, amely regisztrálta; a választ legfeljebb timeout_sec ideig várja (1–10, alapértelmezés 5), kivéve ha a wait_for_result értéke false. A látogató bejelentkezett munkamenetével fut, mint egy saját kattintása: a pénzbe kerülő vagy vissza nem vonható dolgok előtt kérj megerősítést a saját oldaladon. A válaszában szereplő hivatkozások kártyaként elküldhetők.Állítsd a Ki indíthat hívást beállítást Csak tokennel értékre, és a szervered kérjen egyszeri tokent a bejelentkezett felhasználónak:
curl https://evasay.com/api/v1/voice/web-calls \
-X POST \
-H "Authorization: Bearer sk-your-key" \
-H "Content-Type: application/json" \
-d '{ "agent_id": "AGENT_ID", "user_id": "u_42", "variables": { "name": "Ann" }, "expires_in": 600 }'
A válasz tartalmazza a token (egy hívás, expires_in másodpercen belül, 30–3600, alapértelmezés 600), az agent (a slug) és a web_call_url mezőt. Add át a tokent az oldalnak a widget szkriptjén a data-token-url="/your/endpoint" attribútummal (a látogató sütijeivel POST-ol oda, és beolvassa a { "token": "…" } választ) vagy az agent.setToken(async () => token) hívással. A token variables értékei ellenőrzöttek: az utasítások, az indítási lekérdezés és a függvényeid sablonjai használhatják őket, akárcsak a user_id-t, amelyet a hívás megőriz (userId a hívásban, user_id a hívások szűréséhez). Az API-kulcsodat tartsd a szervereden.
A saját alkalmazásodban POST-old a { "token": "…", "pageTools": ["add_to_cart"] } tartalmat a https://evasay.com + web_call_url címre. A válasz a hívás kapcsolata (egy WebRTC-ajánlat címe vagy egy WebSocket-cím a hívástokennel), egy RTVI-klienshez, például a Pipecat kliens-SDK-jaihoz weben, iOS-en, Androidon és React Native-ben. A kártyák, az oldalfüggvények és az értesítések RTVI server-message üzenetként érkeznek (evasay.cards, evasay.tool, evasay.notice); a begépelt szavakat a send-text üzenettel küldd, az oldal jelentéseit és válaszait pedig client-message üzenetként evasay.context és evasay.tool_result néven. Vagy vidd magad a hangot a Hang WebSocketen keresztül szakasz szerint, a user_id és a page_tools megadásával.
A Telefonszámok → SIP alatt a saját alközpontod, SIP-telefonjaid vagy SIP-trunkod közvetlenül hívhatja az ügynökeidet; a hívásokat a SIP-szolgáltatód számlázza:
sip:ev…@<EvaSay's SIP domain>, csak bejövő hívások, alközpontokhoz (3CX, FreePBX, Asterisk…) és SIP-telefonokhoz.from értékként); az emberhez történő átkapcsolásokat REFER-rel adják át a trunknek. Amikor a trunk hitelesítő adatokat kér, az EvaSay az általad megadott trunk-felhasználónévvel és jelszóval válaszol.A bejövő hívások digest hitelesítéssel jelentkeznek be az EvaSay által megadott felhasználónévvel és jelszóval (a realm a SIP-tartomány); korlátozhatod a forrás IP-címeket, vagy kizárólag IP alapján is elfogadhatsz, ha a szolgáltatód nem tud bejelentkezni (az IP-címek ilyenkor kötelezők). Minden SIP-címnek vagy trunknek van egyidejű hívási korlátja; efelett a hívások 486-ot kapnak. A jelszavakat egyszer mutatja meg, létrehozáskor vagy visszaállításkor. Csak UDP és G.711 (PCMU, PCMA); billentyűleütések RFC 4733-mal vagy SIP INFO-val; kapcsold ki a regisztrációt (REGISTER) az alközpontod trunkjén.
Egy kampány egyetlen ügynökkel hív egy kapcsolatlistát hívási idősávon és egyidejűségi korláton belül (max_concurrency, legfeljebb 100 egyidejű hívás, és soha nem több, mint a munkaterületed egyidejű hívásainak korlátja), és újrapróbálkozik azokkal, akiket nem ért el.
curl https://evasay.com/api/v1/voice/campaigns \
-X POST \
-H "Authorization: Bearer sk-your-key" \
-H "Content-Type: application/json" \
-d '{
"name": "Appointment reminders",
"agent_id": "AGENT_ID",
"phone_number_id": "PHONE_NUMBER_ID",
"timezone": "America/New_York",
"window_start": "09:00",
"window_end": "18:00",
"max_concurrency": 2,
"max_attempts": 2,
"retry_delay_min": 60,
"consent_confirmed": true,
"contacts": [
{ "phone": "+14155550100", "name": "Alex", "appointment": "Tuesday 3 pm" }
]
}'
A kapcsolatok CSV-szöveg is lehetnek, az első oszlopban a telefonszámmal. A consent_confirmed: true kötelező: vele megerősíted, hogy a listán mindenki beleegyezett abba, hogy felhívják, mesterséges intelligenciás hanggal is, és az EvaSay ezt a megerősítést a kampánnyal együtt megőrzi (consent_confirmed_at). A kampány piszkozatként jön létre; indítsd el a POST /api/v1/voice/campaigns/{id}/start hívással, a pause és a cancel ugyanígy használható. Az ügynöknek közzétettnek kell lennie, mielőtt a kampány elindul.
Bekapcsolt voicemail_detection esetén (alapértelmezés) a kimenő hívás megvárja, hogy a másik fél megszólaljon, mielőtt az ügynök köszönne; ha hallgatnak, az ügynök két-három másodperc után köszön. Amikor az ügynök hangpostát vagy egy telefontársaság felvételét hallja, megvárja a köszöntés és a sípszó végét, otthagyja a voicemail_message üzenetet, vagy lerakja, ha nincs. Az ilyen hívások ended_reason értéke voicemail, a tényleges időtartamukra számláznak, és nem elemzik, illetve nem értesítik róluk.
Egy kampányban a hangpostára jutott számot úgy hívják újra, mint amelyik nem vette fel, és az üzenetet csak az utolsó próbálkozásnál hagyják, hogy senki se kapja kétszer ugyanazt az üzenetet.
Minden kimenő hívás, kampányból vagy a POST /api/v1/voice/calls hívásból, először a munkaterület hívástiltó listáját ellenőrzi. A listán szereplő számot soha nem tárcsázza: az API 409 választ ad do_not_call code értékkel, a kampány pedig a kapcsolatot canceled állapotúra és do_not_call outcome értékűre állítja, és megy tovább a következőre.
Amikor az ügynök által indított hívás személye azt kéri, hogy ne hívják újra, az ügynök maga felveszi a számát a listára, megmondja neki, és elküldi a call.do_not_call webhookot. A számok a Kampányok → Hívástiltó lista alatt vagy az API-val is hozzáadhatók és eltávolíthatók:
curl https://evasay.com/api/v1/voice/do-not-call \
-X POST \
-H "Authorization: Bearer sk-your-key" \
-H "Content-Type: application/json" \
-d '{ "phones": ["+14155550100"], "note": "Asked by email" }'
A számok nemzetközi formátumban szerepelnek; egyszerre legfeljebb 1000. A GET /api/v1/voice/do-not-call listázza őket, a legújabbakkal kezdve (search, limit, page), mindegyiket a source értékével (call, dashboard vagy api). A DELETE /api/v1/voice/do-not-call/%2B14155550100 újra levesz egyet; ezt csak akkor tedd, ha a személy beleegyezett abba, hogy felhívják.
A POST /api/v1/voice/voices egyetlen beszélő WAV-felvételéből hoz létre hangot (multipart audio, name, language, consent=true). 202 választ ad running állapottal; kérdezd le a GET /api/v1/voice/voices hívással, amíg ready nem lesz, majd állítsd egy ügynök voice_id értékét a hang voice_id értékére. A language a felvételen beszélt nyelv, a fent felsorolt ügynöknyelvek bármelyike; a hang mindegyiket beszéli a kínai kivételével, ahol egy azonos nemű beépített hang válaszol, és a felvétel nyelvén hasonlít leginkább a felvételen szereplő beszélőre. Minden klónozott hang krediteket költ, amelyeket a vezérlőpult a létrehozás előtt megmutat.
Adj hozzá egy https-címet az Integrációk → Webhookok és értesítések alatt, hogy hívásesemények érkezzenek:
| Esemény | Mikor |
|---|---|
call.started | Az ügynök felvette |
call.ended | A hívás véget ért, az időtartammal és a kreditekkel |
call.analyzed | Az összefoglaló, az eredmény, a kinyert mezők és az átirat elkészült |
call.transcript | A hívás közben, az átirat új sorai néhány másodpercenként |
call.tool_called | Az ügynök meghívta az egyik függvényedet: name, arguments, status, durationMs |
call.handed_off | A hívást átadták egy másik ügynöknek: fromAgentId, toAgentId |
call.transferred | A hívást átkapcsolták egy személyhez: destination |
call.voicemail | Egy kimenő hívás hangpostára jutott |
call.do_not_call | A kimenő hívás személye azt kérte, hogy ne hívják újra: phone |
call.recording_ready | A kétcsatornás felvétel el van mentve: recordingUrl (24 óráig érvényes), durationMs |
call.message_sent | Az ügynök kártyákat mutatott egy webes vagy alkalmazásból hívó képernyőjén: items, quickReplies |
alert.triggered | Az egyik riasztásod (Webhookok és értesítések → Riasztások) átlépte a küszöbét |
alert.resolved | Az a riasztás visszatért a normális állapotba |
A hívás közben küldött események data.call mezőt hordoznak (id, agentId, channel, direction, számok). Minden kérés alá van írva:
EvaSay-Signature: t=<unix seconds>,v1=<hex HMAC-SHA256 of "<t>.<raw body>">
EvaSay-Delivery: <delivery id>
Ellenőrizd az aláírást a webhook létrehozásakor megjelenített webhook-titokkal, és válaszolj 2xx állapottal. A sikertelen kézbesítéseket 1 perc, 5 perc, 30 perc, 2 óra és 12 óra múlva újrapróbálja ugyanazzal a törzzsel és ugyanazzal az EvaSay-Delivery azonosítóval, így az ismétlődéseket figyelmen kívül hagyhatod. Egy webhook legutóbbi kézbesítéseit, a pontosan elküldött törzzsel és a végpontod által adott állapottal, a GET /webhooks/{id}/deliveries és a vezérlőpult listázza; a POST /webhooks/{id}/deliveries/{delivery_id} újra elküld egyet.
Az e-mail és az alert.triggered / alert.resolved webhookok mellett a riasztások mehetnek egy Slack-csatornára (incoming webhook), egy WeCom csoportrobotnak vagy Telegramra a Webhookok és értesítések → Riasztások → Küldés ide is alatt.
A hibák egyetlen alakot használnak:
{
"error": {
"type": "invalid_request_error",
"code": "invalid_agent_field",
"message": "status must be draft or published",
"param": "status"
}
}
| Állapot | Jelentés |
|---|---|
| 400 | Érvénytelen bemenet (a code és a param megmondja, melyik) |
| 401 | Hiányzó vagy érvénytelen API-kulcs |
| 402 | Nincs elég kredit a hívás indításához |
| 403 | A kulcs csak olvasható, vagy az ügynök nem érhető el |
| 404 | Nincs ilyen ügynök, hívás vagy kampány ebben a munkaterületben |
| 409 | Hibás állapot (pl. futó kampány indítása), egy szolgáltatói fiók nincs csatlakoztatva, vagy a szám a hívástiltó listán van (do_not_call) |
| 429 | Túl sok kérés; lassíts, és próbáld újra |
A munkaterület elmúlt 30 napi Voice API-kérései (idő, endpoint, állapot, időtartam, kulcs és hibakód; törzsek nélkül) az API-kulcsok → API-kérésnapló alatt találhatók.
Az olvasások kulcsonként percenként 120 kérésre, az írások és a hívások 30-ra vannak korlátozva.
A hívásokat percenként számlázzák a munkaterület krediteiből, ugyanabból az egyenlegből, amelyet a vezérlőpult használ. Az aktuális díjak az árazási oldalon találhatók.
Használd az OpenAPI-szerződést integrációs kliens generálásához. A nyilvános API, a vezérlőpult és az MCP-kezelő végpont ugyanazokon a munkaterület-erőforrásokon és jogosultságokon működik.
| Képesség | Endpoint |
|---|---|
| Újrafelhasználható eszközök | GET / POST /api/v1/voice/tools |
| Eszköz olvasása / frissítése / törlése | GET / PATCH / DELETE /api/v1/voice/tools/{id} |
| Eszköz előnézete vagy tesztelése | POST /api/v1/voice/tools/{id}/test |
| Eszközök kötése egy ügynökhöz | PUT /api/v1/voice/agents/{id}/tools |
| Tudásbázisok | GET / POST /api/v1/voice/knowledge-bases |
| Tudásbázis olvasása / frissítése / törlése | GET / PATCH / DELETE /api/v1/voice/knowledge-bases/{id} |
| Dokumentumok hozzáadása / listázása | POST / GET /api/v1/voice/knowledge-bases/{id}/documents |
| Dokumentum olvasása / törlése | GET / DELETE /api/v1/voice/knowledge-bases/{id}/documents/{doc_id} |
| Hívásesemény-feliratkozások | GET / POST /api/v1/voice/webhooks |
| Feliratkozás olvasása / frissítése / törlése | GET / PATCH / DELETE /api/v1/voice/webhooks/{id} |
| Aláírt tesztesemény küldése | POST /api/v1/voice/webhooks/{id}/test |
| Távoli MCP-eszközök felderítése | POST /api/v1/voice/mcp/discover |
| MCP-kezelő végpont | /api/v1/voice/mcp |
Regisztrálj egy HTTP-eszközt, amely lekérdezi a CRM-adapteredet:
{
"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"
}
A POST /tools visszaadja: { "data": { "id": "TOOL_ID", ... } }. Kösd a definícióját egy ügynökhöz a PUT /agents/AGENT_ID/tools hívással és a { "tool_ids": ["TOOL_ID"] } tartalommal. Ez a teljes eszközlistát pillanatképekre cseréli; kösd újra, amikor egy könyvtári eszköz megváltozik. Egy könyvtári definíció törlése megtartja a meglévő pillanatképeket. A beágyazott definíciókat az ügynök API tools mezőjével is olvashatod és cserélheted. Az analysis_config és a widget_config segítségével az ügynök API-n keresztül konfigurálhatod az elemzést és a widgetet.
Egy eszköz használhat GET, POST, PUT, PATCH vagy DELETE metódust. A query és a request_body beágyazott JSON-sablonokat fogad el, például { "customer": { "id": "{{customer_id}}" } }. Egy teljes helyőrző megőrzi az eredeti JSON-típust. Az URL-helyőrzők kódolva vannak, és csak egy rögzített, nyilvános HTTPS-gazdagép után szerepelhetnek. request_body nélkül a nem GET eszközök ezt kapják: { "arguments": {...}, "call": { "callId": "...", "agentId": "...", "toolCallId": "...", "idempotencyKey": "..." } }. A response_path pontnotációval választ ki egy mezőt. Az egyszerű parameters továbbra is elfogadott; az input_schema emellett támogatja a beágyazott objektumokat, tömböket, felsorolásokat és numerikus határokat. Külső sémahivatkozások és reguláris kifejezések nem fogadhatók el.
static_args: minden híváshoz elküldött értékek, bármit is ír a modell, például egy üzletazonosító; kitöltik a {{name}} helyőrzőt a címben és a törzsben is.extract: [{name, path}] megőriz mezőket egy függvény válaszából (data.id) a későbbi függvények {{name}} értékéhez, így egy lekérdezés customer_id értéke a következő rendelésbe kerülhet anélkül, hogy a modell megismételné. Egy indítási lekérdezés mezőit ugyanígy őrzi meg.reject_when: legfeljebb 5 szabály {on: caller|agent, pattern, negate}; amíg mindegyik teljesül az utolsó szavakra, a függvény nem fut le, és az ügynök a reject_message értéket kapja.model_says: minden híváskor a modell egy mondatot ír, amelyet a függvény futása közben elmondanak, a rögzített speak_before helyett.Csatlakoztass egy alkalmazást az Integrációk → Webhookok és értesítések → Csatlakoztatott alkalmazások alatt, majd használd az „Elkészített függvény hozzáadása” lehetőséget az ügynök Tudás és eszközök lapján; nincs szükséged saját végpontra:
check_availability (szabad időpontok egy napon) és a book_appointment (lefoglalja a hívó által választott időpontot) függvényeket. A Google Calendar időpontjai az általad megadott időzónát, nyitvatartási napokat, órákat és időpont-hosszt követik; a Cal.com az eseménytípus saját elérhetőségét használja, és az általad megadott tartalék e-mail-címet arra az esetre, ha a hívó nem ad meg egyet.save_to_sheet függvényt, amely egy sort fűz hozzá az általad felsorolt oszlopokkal, valamint a hívás azonosítójával és idejével.notify_team függvényt, amely egy az ügynök által írt üzenetet tesz közzé egy Slack-csatornán (incoming webhook).Az EvaSay vezérlősíkja futtatja ezeket a függvényeket az általad csatlakoztatott fiókkal; sem a worker, sem az ügynök definíciója nem tárolja az alkalmazás hitelesítő adatait. Egy ügynök API-n keresztüli olvasásakor kind: "app" formában jelennek meg (az app, action, connection_id, app_config mezőkkel); a tools cseréjekor küldd vissza őket változatlanul, hogy megmaradjanak. Az alkalmazásokat csak a vezérlőpulton lehet csatlakoztatni.
Állítsd a run_at_start: true értéket az ügynök egyik eszközén, és minden hívás kezdetén meghívódik, mielőtt az ügynök köszönne vagy válaszolna. A caller_number, called_number, direction, channel vagy call_id nevű paramétereket kitölti helyette. A visszaadott mezők kitöltik a {{variables}} helyőrzőket a first_message, system_prompt és idle_messages mezőkben (eggyel lejjebb lévő mezők {{customer.name}} formában), és a teljes válasz háttérként az ügynök elé kerül. A változókat tartalmazó üdvözlés legfeljebb 3 másodpercet vár a válaszra; ami nem található, üresen marad. Ügynökönként egy eszköz futhat induláskor.
A hitelesítő adatokat a szerverkörnyezetben konfigurálják a munkaterületedhez és a célodhoz; kérd a support@evasay.com címen egy credential_ref létrehozását. Ne tegyél API-kulcsokat ügynökdefiníciókba, fejlécekbe, promptokba vagy eszközparaméterekbe. Az adaptered a CRM hitelesítő adatait a saját környezetében tarthatja.
Nézd meg egy eszköz előnézetét, mielőtt kéréseket küldesz az üzleti rendszernek:
{
"arguments": { "customer_id": "customer-123" },
"dry_run": true,
"mock_result": { "name": "Alex", "order_status": "shipped" }
}
Az előnézet ellenőrzi a paramétereket, és megmutatja a leképezett kérést; nem folytat beszélgetést, és nem lép kapcsolatba az üzleti rendszerrel. A valódi futtatáshoz állítsd a dry_run=false értéket. Egy éles írási teszthez a confirmed=true és az idempotency_key is kell (8–128 betű, szám, pont, aláhúzás, kettőspont vagy kötőjel). A teszt válaszai tartalmazzák az ok, status, duration_ms mezőket és egy korlátozott eredményt. Nem adnak vissza hitelesítő adatokat. Az olvasási és írási tesztekhez a munkaterület írási jogosultsága kell.
A hívás során az üzleti kérések stabil Idempotency-Key értéket hordoznak. Az üzleti végpontodnak tiszteletben kell tartania. Egy híváson belüli azonos írások deduplikálódnak, beleértve az időtúllépés után ismeretlen kimenetelű műveleteket is. Egy másik szándékos művelethez külön üzleti argumentum kell, például operation_id. Az EvaSay nem játssza vissza automatikusan az írásokat. Az eszközfuttatási események tartalmazzák az állapotot és az időtartamot; a beszélgetésteszt funkció továbbra is szöveges szimuláció, nem eszközfuttatási teszt.
Állíts be egy Streamable HTTP MCP-kapcsolatot:
URL: https://evasay.com/api/v1/voice/mcp
Authorization: Bearer <your EvaSay API key>
Például a Claude Code-ban:
claude mcp add --transport http evasay https://evasay.com/api/v1/voice/mcp --header "Authorization: Bearer $EVASAY_API_KEY"
A kapcsolat megmondja az eszköznek, hogyan építsen ügynököt: olvassa el a katalógust, hozzon létre piszkozatot, adjon hozzá tudást, függvényeket és szólistákat, írjon és futtasson teszteket, javítsa a piszkozatot, amíg átmennek, adja át Önnek az ügynök dashboard_url címét kipróbálásra, és csak az Ön jóváhagyása után tegye közzé és rendeljen hozzá számot. A dokumentációt olvasó eszközök a https://evasay.com/llms.txt címről indulhatnak, amely erre az oldalra, az OpenAPI-leírásra és az MCP-címre mutat.
Használd a kliens biztonságos token- vagy környezetiváltozó-beállítását. A végpont API-kulcsos hitelesítést használ, nem OAuth bejelentkezési folyamatot. Elérhetővé teszi az ügynökök létrehozását és konfigurálását, a könyvtári eszközöket, a tudást, a webhookokat és a hívásnaplókat. A közzététel és a valódi hívások indítása írási műveletek; a kimenő hívások krediteket és szolgáltatói díjakat fogyasztanak. Minden eszközhívás újra ellenőrzi a munkaterület jogosultságait. Kapcsold be a kliensed megerősítési vezérlőit az írási műveletekhez. A végpont állapotmentes JSON-válaszokat használ; nem kínál háttér-értesítési adatfolyamot.
Egy példautasítás a kódolóeszköznek: „Hozz létre egy EvaSay-ügynököt piszkozatként, regisztráld a CRM-lekérdező végpontomat, nézd meg az előnézetét tesztargumentumokkal, kösd az ügynökhöz, és állíts be egy call.analyzed webhookot.” Nézd át, és kifejezetten hagyd jóvá a közzétételt és a valódi hívásokat.
A POST /mcp/discover elfogadja a { "url": "https://crm.example.com/mcp", "credential_ref": "crm" } tartalmat, és visszaadja a szerver eszközeit és sémáit. Csak a kiválasztott eszközt regisztráld:
{
"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"]
}
}
Csak a regisztrált eszközök válnak elérhetővé az ügynök számára. A távoli kapcsolatok támogatják a Streamable HTTP-t JSON- vagy SSE-válaszokkal a kérésekre, nyilvános HTTPS-célokat és előre konfigurált hitelesítő adatokat. A régi SSE-végpontok, az OAuth-egyeztetés, a szerver által kezdeményezett sampling/elicitation és a bináris mellékletek nem támogatottak. A felderítés nem ad automatikusan hozzáférést a szerver összes eszközéhez. A távoli eszköz sémájának beágyazottnak kell lennie, és a JSON Schema támogatott részhalmazát kell használnia.
Hozz létre egy webhookot a POST /webhooks hívással és a { "url": "https://crm.example.com/evasay-events", "events": ["call.analyzed"] } tartalommal. A válasz tartalmazza a feliratkozást és egy generált aláírási titkot, amelyet csak a létrehozáskor ad vissza. Ellenőrizd az EvaSay-Signature értékét, deduplikáld az EvaSay-Delivery értékét, és frissítsd a CRM-edet. Az eseménywebhookok aszinkron értesítések; a hívás közbeni eszközök az eredményeket közvetlenül az ügynöknek adják vissza.