API toimii samojen agenttien, puhelujen ja krediittien kanssa kuin verkkohallintapaneeli. Kaiken, minkä rakennat paneelissa, voi ohjata omista järjestelmistäsi, ja päinvastoin.
| Mitä | Endpoint |
|---|---|
| Listaa agentit | GET /api/v1/voice/agents |
| Luo agentti | POST /api/v1/voice/agents |
| Hae / päivitä agentti | GET · PATCH /api/v1/voice/agents/{id} |
| Soita lähtevä puhelu | POST /api/v1/voice/calls |
| Listaa puhelut | GET /api/v1/voice/calls |
| Hae puhelu (litteraatti) | GET /api/v1/voice/calls/{id} |
| Poista puhelu | DELETE /api/v1/voice/calls/{id} |
| Poista soittajan puhelut | POST /api/v1/voice/calls/delete-by-caller |
| Kampanjat | GET · POST /api/v1/voice/campaigns |
| Hae kampanja | GET /api/v1/voice/campaigns/{id} |
| Käynnistä / keskeytä / peruuta | POST /api/v1/voice/campaigns/{id}/{action} |
| Kloonatut äänet | GET · POST /api/v1/voice/voices |
| Poista kloonattu ääni | DELETE /api/v1/voice/voices/{id} |
| Älä soita -luettelo | GET · POST /api/v1/voice/do-not-call |
| Poista luettelosta | DELETE /api/v1/voice/do-not-call/{phone} |
| Kielet, äänet, mallit | GET /api/v1/voice/catalog |
| Agentin testit | GET · POST /api/v1/voice/agents/{id}/tests |
| Aja testit / lue ajo | POST /api/v1/voice/agents/{id}/test-runs · GET /api/v1/voice/test-runs/{id} |
| Numeron ohjaus agentille | PATCH /api/v1/voice/phone-numbers/{id} |
| Sanalistat | GET · POST /api/v1/voice/vocabularies |
Luo avain paneelin kohdassa Integraatiot → API-avaimet (tai yhdellä napsautuksella yleiskatsauksessa) ja lähetä se Bearer-tunnisteena:
Authorization: Bearer sk-your-key
Avain toimii siinä työtilassa, jossa sen omistaja työskentelee, ja kyseisen henkilön roolilla: vain luku -jäsenen avaimella voi lukea mutta ei muuttaa mitään.
Luo agentti mallista ja määritä halutessasi sen kentät samassa pyynnössä. Ilman template-arvoa se alkaa tyhjänä; GET /api/v1/voice/catalog luettelee mallit sekä kielet ja äänet, joita agentille voi antaa. Mallit on kirjoitettu englanniksi ja kiinaksi, joten muulla kielellä lähetä system_prompt ja first_message sillä kielellä. Joko koko pyyntö tallennetaan tai agenttia ei luoda lainkaan, joten hylätyn pyynnön voi korjattuna lähettää uudelleen. Vastauksen dashboard_url on agentin sivu hallintapaneelissa, jossa voit puhua luonnoksen kanssa selaimessa. Jokainen agentti toimii EvaSay ASR:llä, EvaSay LLM:llä ja EvaSay TTS:llä, jotka EvaSay valitsee jokaiselle puhelulle kielen ja kuormituksen mukaan ja jotka sisältyvät puhelun hintaan; muiden palveluntarjoajien tilejä ei tarvitse määrittää.
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..."
}'
Päivitä mitä tahansa näistä kentistä komennolla PATCH /api/v1/voice/agents/{id}:
| Kenttä | Huomautukset |
|---|---|
name, first_message, system_prompt | Teksti |
status | published julkaisee luonnoksen uutena versiona; draft lopettaa puheluiden vastaanoton |
language | Yksi 27 kielestä, esim. en, zh, es, de, tai multi soittajan kielen mukaan |
temperature | 0-100 |
max_duration_sec, silence_timeout_sec | Puhelun rajat |
interruptible, end_call_enabled | Totuusarvot |
confirm_details | Totuusarvo; lukee numerot ja nimet takaisin ja pyytää vahvistuksen |
ai_disclosure | Totuusarvo, oletus true; ennen ensimmäistä viestiään agentti sanoo puhelun kielellä, että soittaja puhuu tekoälyn kanssa (jätetään pois, kun ensimmäinen viesti jo kertoo sen) |
voicemail_detection | Totuusarvo; lähtevät puhelut kuuntelevat ensin ja päättyvät vastaajaan |
voicemail_message | Jätetään vastaajaan, voi käyttää {{variables}}; ei mitään, jos halutaan katkaista |
transfer_number | Numero, johon siirretään, kansainvälisessä muodossa |
transfer_destinations | Enintään 9 lisänumeroa, [{name, number, when}]; agentti valitsee yhden kentän when perusteella |
transfer_briefing | Totuusarvo; ensimmäisenä vastaava kuulee agentin tekemän yhteenvedon puhelusta |
pronunciations | Enintään 100 kohtaa [{word, say, case_sensitive}]; ääni sanoo say sanan word sijaan |
idle_messages | Enintään 3 muistutusta, jotka sanotaan vuorotellen hiljaiselle soittajalle ennen puhelun päättymistä |
noise_reduction | Totuusarvo; soittajan taustamelu suodatetaan ennen kuin se kuullaan |
recording_enabled | Totuusarvo; puhelut tallennetaan kahdelle kanavalle (soittaja vasemmalle, agentti oikealle) |
recording_consent | announce, ask (säilytetään vain, jos soittaja suostuu) tai none |
recording_notice | Ensin sanottava ilmoitus tai kysymys; tyhjä tarkoittaa sisäänrakennettua tekstiä puhelun kielellä |
handoffs | Enintään 5 kohtaa [{agent_id, when}]: muut agentit, joille tämä saa luovuttaa puhelun |
knowledge_base_id | Yksi tietopankeistasi |
vocabulary_id | Yksi sanastoistasi; sen termit tunnistetaan luotettavammin, kun soittaja sanoo ne |
voice_id | Sisäänrakennetun EvaSay-äänen tunnus tai yksi kloonatuista äänistäsi (clone:…) |
Sisäänrakennetut äänet riippuvat kielestä: kiinalla on ming-designed-female-clear ja ming-designed-female-warm (naisäänet), ming-designed-male-clear ja ming-designed-male-friendly (miesäänet), muilla kielillä F1–F5 (naisäänet) ja M1–M5 (miesäänet). Sisäänrakennettu ääni, joka ei puhu agentin kieltä, korvataan samaa sukupuolta olevalla äänellä, joka puhuu. Vanhempaa kentän nimeä tts_voice_id hyväksytään edelleen. Muut voice_id-arvot ja kloonattu ääni, joka ei ole vielä valmis, hylätään.
analysis_config määrittää, mitä kustakin puhelusta selvitetään sen päätyttyä: summary (oletus true), summaryLanguage, successCriteria (mitä onnistunut puhelu saavuttaa), fields (enintään 20 poimittavaa {name, type, description}, jossa type on string, number tai boolean) ja scorecard (enintään 10 {name, description, weight}, paino 1–5). Tulokset ovat puhelun analysis-kentässä ja call.analyzed-webhookissa.
Agentin kenttien muuttaminen muuttaa sen luonnosta. Puhelut käyttävät edelleen julkaistua versiota, kunnes julkaiset luonnoksen komennolla POST /api/v1/voice/agents/{id}/publish (halutessasi note-kentän kanssa) tai status: "published" samassa PATCH-pyynnössä. Jokainen julkaisu säilyttää numeroidun version; agentin published_version kertoo, mitä puhelut käyttävät. Puhelu pysyy versiossa, joka oli käytössä sen alkaessa, joten julkaiseminen puhelun aikana ei muuta sitä. Paneelin testipuhelut käyttävät luonnosta.
GET /agents/{id}/versions listaa versiot, ja POST /agents/{id}/versions/{version}/restore palauttaa vanhan: uudet puhelut käyttävät sitä versiota ja luonnoksesta tulee se. Agentin nimi, käyttöönotto, widgetin ulkoasu ja ilmoitukset eivät ole versioituja ja muuttuvat heti, samoin tietopankin asiakirjat.
Testi käy läpi yhden puhelun tekstinä: simuloitu soittaja esittää scenario-kuvauksen, agentti vastaa luonnoksestaan (ohjeet, ensimmäinen viesti ja tietämys), ja arvioija tarkistaa keskustelun success_criteria-ehtoja vasten. Kirjoita testit tärkeille puheluille, aja ne jokaisen muutoksen jälkeen ja julkaise, kun ne menevät läpi.
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
}'
POST /agents/{id}/test-runs ajaa kaikki agentin testit, tai test_ids-listan testit, ja vastaa yhdellä ajolla testiä kohden (status: "running"). Kysy GET /test-runs/{id}, kunnes status on passed, failed tai error; silloin ajossa on transcript ja arvioijan reason (englanniksi, tai kiinaksi asetuksella reason_language: "zh"). Jokainen ajo maksaa Credits-krediittejä, jotka näkyvät testien kohdalla hallintapaneelissa; ajot pysähtyvät ensimmäiseen, jota saldo ei riitä maksamaan, ja not_started luettelee loput. Ajo, joka ei onnistu, hyvitetään. Testit tarkistavat, mitä agentti sanoo, eivät ääntä tai ajoitusta, eivätkä ne kutsu sen funktioita: esikatsele ne POST /tools/{id}/test-kutsulla. Agentilla voi olla enintään 30 testiä; PATCH ja DELETE /agents/{id}/tests/{test_id} muuttavat tai poistavat testin.
Koko puhelujen (type: "simulation", oletus) lisäksi testi voi tarkistaa yhden vastauksen. type: "next_reply" ottaa chat_history-keskustelun, joka edeltää vastausta ja päättyy soittajaan ([{role, text}], jossa role on caller tai agent), sekä success_criteria-ehdot agentin seuraavalle vastaukselle. type: "tool_call" ottaa chat_history ja expected_tool {name, arguments, match}: agentin pitää kutsua name-funktiota (omaansa tai end_call, transfer_call, handoff_to_agent) arvoilla arguments, joita verrataan täsmälleen (tekstistä poistetaan reunojen välilyönnit, kirjainkoolla ei väliä) tai asetuksella match: "judge" merkityksen mukaan; muita argumentteja ei tarkisteta. Ajon transcript näyttää kutsutut funktiot kentässä tool_calls.
POST /agents/{id}/tests/generate ehdottaa testejä agentin luonnoksen perusteella: ohjeiden, tietämyksen ja funktioiden. Se ottaa count (1–10, oletus 5), types, focus (mitä katetaan) ja language (en tai zh, nimille ja ehdoille), maksaa Credits-krediittejä kuin yksi ajo ja palauttaa luonnoksia, jotka tarkistat ja lähetät kutsulla POST /agents/{id}/tests; asetuksella save: true ne tallennetaan.
hooks tekee jotain puhelun tietyllä hetkellä, enintään 10 sääntöä: on: "silence" (soittaja ei ole sanonut mitään seconds, 3–600, sen jälkeen kun agentti lopetti; kerran, kunnes hän puhuu uudelleen), on: "time_elapsed" (seconds puhelun alusta, 10–3600) tai on: "call_ending". Jokainen sääntö tekee (do) enintään 3 näistä: {type: "say", text}, {type: "transfer", destination?}, {type: "end_call", text?} ja {type: "tool", name, args?}; puhelun päättymisen sääntö suorittaa vain funktioita. Säännön päättämän puhelun ended_reason on rule_ended.
Puheluissa soittajan painamat näppäimet saapuvat agentille vastauksena: syöte päättyy #-merkkiin tai kahden sekunnin taukoon. Lähtevissä puheluissa agentti voi myös painaa näppäimiä päästäkseen yrityksen puhelinvalikon läpi.
transfer_number on agentin pääasiallinen numero soittajan siirtämiseen ihmiselle sekä numero, johon soitetaan, kun työtilan krediitit ovat loppu. transfer_destinations lisää nimettyjä numeroita, joilla kullakin on merkintä siitä, milloin sitä käytetään („Laskutus: kysymykset laskuista ja hyvityksistä”), ja agentti valitsee. Kun transfer_briefing on päällä, agentti kirjoittaa siirrettäessä lyhyen yhteenvedon; vastaaja kuulee sen EvaSay-äänellä ja agentin yhteenvetokielellä ennen kuin soittaja yhdistetään. Puhelun ended_reason on tällöin transferred.
handoffs-asetuksella agentti voi luovuttaa puhelun toiselle työtilasi julkaistulle agentille, esimerkiksi vastaanotto luovuttaa varauksen varausagentille. Agentti valitsee kentän when perusteella. Toinen agentti ottaa saman puhelun haltuunsa kaiken tähän asti sanotun kanssa ja puhuu omilla ohjeillaan, äänellään, tiedoillaan, työkaluillaan ja luovutuksillaan. Puhelu pysyy listattuna, analysoituna ja laskutettuna ensimmäisen agentin alla; litteraatti merkitsee jokaisen luovutuksen.
Numerot liitetään hallintapaneelissa omalla operaattoritililläsi. GET /api/v1/voice/phone-numbers luettelee ne, ja PATCH /api/v1/voice/phone-numbers/{id} arvolla { "agent_id": "AGENT_ID" } ohjaa numeron puhelut agentille (sen julkaistulle versiolle), tai arvolla "agent_id": null ei millekään; label nimeää sen uudelleen.
Sanalista sisältää nimiä ja termejä, joita soittajat sanovat ja jotka puheentunnistus muuten kuulisi väärin, kuten tuotteiden, lääkkeiden tai katujen nimiä. POST /api/v1/voice/vocabularies arvolla { "name": "Products", "terms": ["Lumora", "Vantix Pro"] } (enintään 1 000 termiä, kukin enintään 50 merkkiä, tai lähtökohdaksi "preset": "medical" tai "legal"), ja aseta sitten agentin vocabulary_id. GET, PATCH (name, terms) ja DELETE /vocabularies/{id}; agentin käyttämää listaa ei voi poistaa.
Jokaisella numerolla on puhelusäännöt Puhelinnumerot-sivulla, ja ne sovelletaan ennen kuin agentti vastaa: estetyt numerot tai numeroiden alut (+1555) sekä soittajat, jotka piilottavat numeronsa, torjutaan vastaamatta eivätkä maksa mitään; luettelossa olevat soittajat voidaan yhdistää suoraan toiseen numeroon; ja kun agentti ei voi vastata (ei julkaistu, ei workeria, krediitit loppu eikä siirtonumeroa), puhelu voi soittaa numeroon tai toistaa oman viestisi. Aloitushaku (run_at_start) voi myös torjua soittajan vastaamalla {"reject": true, "message": "..."}: agentti sanoo viestin, jos sellainen on, ja katkaisee, ja ended_reason on rejected.
Soita yksi puhelu jostakin työtilasi puhelinnumerosta. Jokainen pyyntö tarvitsee yksilöllisen Idempotency-Key-avaimen; saman avaimen lähettäminen uudelleen palauttaa saman puhelun sen sijaan, että soitettaisiin kahdesti.
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" }
}'
from vaaditaan, kun työtilassa on useampi kuin yksi puhelinnumero. variables täyttävät {{customer_name}}-tyyppiset paikkamerkit agentin ensimmäisessä viestissä ja kehotteessa.
GET /api/v1/voice/calls/{id} palauttaa puhelun tilan, keston, veloitetut krediitit, yhteenvedon, analyysin ja litteraatin. Listaa puhelut komennolla GET /api/v1/voice/calls?agent_id=&status=&channel=&user_id=&page= (user_id: oma tunnuksesi henkilölle, verkkopuhelun tunnisteesta). Sen turns on puhelun vuoro vuorolta -vianetsintäloki: mihin aika kului siitä, kun soittaja lopetti puhumisen, siihen, kun hän kuuli vastauksen, millisekunteina — waitMs (puheen loppu), sttMs (tunnistus), llmMs (mallin ensimmäinen sana, yksi lisää jokaista funktiokierrosta kohti), ttsMs (äänen ensimmäinen ääni), firstAudioMs (vastaus kuultiin) — sekä kutsutut funktiot, keskeytykset ja virheet. Puhelusivu näyttää sen myös.
recording_enabled-asetuksella jokainen puhelu tallennetaan kaksikanavaiseksi WAV-tiedostoksi: soittaja vasemmalle, agentti oikealle, puhelun näytteenottotaajuudella. Asetuksella recording_consent: "announce" agentti kertoo ensin, että puhelu tallennetaan; asetuksella "ask" se kysyy, ja tallenne säilytetään vain, jos soittaja suostuu (vastaamatta jättäminen lasketaan kieltäytymiseksi); asetuksella "none" mitään ei sanota. Tarkista, mitä laki vaatii siellä, missä sinä ja soittajasi olette.
Tallenteet säilytetään EvaSayn tallennustilassa tai omassa S3-yhteensopivassa bucketissasi (AWS S3, Cloudflare R2, Google Cloud Storage, Supabase, MinIO), jonka määrität kohdassa Integraatiot → Webhookit ja ilmoitukset → Tallenteiden säilytys. Puhelua pyörittävä worker lataa tiedoston suoraan bucketiin. GET /api/v1/voice/calls/{id} palauttaa recordingUrl-osoitteen, joka on voimassa tunnin sen jälkeen, kun tallenne on tallennettu, sekä recording.status-tilan (recording, stored, declined tai failed).
DELETE /api/v1/voice/calls/{id} poistaa päättyneen puhelun litterointeineen, nauhoituksineen (EvaSayn tallennustilassa tai omassa bucketissasi), analyyseineen ja webhook-toimituksineen. Käytetyt Credits jäävät krediittihistoriaan. Puhelu, jota ei voi vielä poistaa, vastaa 409 ja code call_not_deletable_yet: se on käynnissä tai päättyi juuri, sitä laskutetaan vielä, sen nauhoitusta saatetaan vielä ladata tai sillä on Credits-velkaa, jota saldo ei kattanut (lisää ensin Credits).
Kun henkilö pyytää poistamaan tietonsa, POST /api/v1/voice/calls/delete-by-caller ja { "phone_number": "+14155550123" } poistaa kaikki puhelut tällä numerolla (saapuvissa soittajan numero, lähtevissä soitettu numero), tai { "user_id": "..." } kaikki verkkopuhelut, joiden tunnuksessa oli tämä user_id. Vastaus on { "deleted": 12, "kept_back": { "settling": 1 }, "more": false }: enintään 200 puhelua pyyntöä kohden, joten kysy uudelleen niin kauan kuin more on true, ja myöhemmin uudelleen kept_back-puheluille. Jos numero on Älä soita -luettelossa, se pysyy siellä. Hallintapaneelissa sama tehdään kohdassa Puhelut → Poista soittajan tiedot.
Lähetä POST /api/v1/voice/calls/{id}/control, kun puhelu on käynnissä. Puhelua pyörittävä worker poimii komennon noin 2 sekunnissa; API vastaa 202. Jos puhelua pyörittävään workeriin ei saada yhteyttä, API vastaa 503 (code call_unreachable), eikä komentoa suoriteta.
type | Mitä tapahtuu |
|---|---|
say | Agentti sanoo text nykyisen lauseensa jälkeen tai heti, jos "interrupt": true |
note | Agentille kerrotaan text (ei puhuta ääneen), ja se ottaa sen huomioon seuraavasta vastauksestaan; litteraatti merkitsee sen |
end | Agentti sanoo text, jos se on annettu, ja katkaisee sitten; puhelu ilman text katkaistaan heti |
Puhelun ended_reason on tällöin api_ended. Paneelin puhelusivulla on samat hallintatoiminnot.
POST /api/v1/voice/calls/{id}/listen (halutessasi { "channels": 2 }) palauttaa listen_url-osoitteen, jonka voi avata kahden minuutin kuluessa. Se on WebSocket: ensin JSON-viesti {"type":"start","sampleRate":8000,"channels":1,"encoding":"pcm_s16le"}, sitten binäärikehyksiä 16-bittistä little-endian PCM:ää sillä, mitä soittaja kuulee (molemmat äänet sekoitettuna; asetuksella channels: 2 soittaja vasemmalla ja agentti oikealla). Se sulkeutuu, kun puhelu päättyy. Ääni tulee suoraan puhelua pyörittävältä workerilta, ei EvaSayn ohjaustason kautta; paneelin puhelusivun Kuuntele-painike käyttää samaa osoitetta.
Lähetä ja vastaanota puhelun ääni omasta ohjelmastasi, esimerkiksi omasta puhelinjärjestelmästäsi tai sovelluksestasi. Aloita puhelu:
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 }'
Vastauksen websocket_url sisältää kertakäyttöisen tunnisteen, ja sen voi avata 15 minuutin kuluessa. encoding on pcm_s16le (16-bittinen little-endian PCM, sample_rate 8000, 16000 tai 24000) tai mulaw (8 kHz:n μ-law). Ääni kulkee molempiin suuntiin binäärikehyksinä tässä muodossa, mieluiten 20 ms:n kehyksinä. Tekstikehykset ovat JSON-muotoisia:
| Suunta | Viestit |
|---|---|
| Sinä → EvaSay | {"type":"dtmf","digits":"12#"} näppäinpainallukset; {"type":"end"} katkaisee; {"type":"text","text":"…"} soittajan kirjoittamat sanat ("input":"button" napautetulle vastaukselle); {"type":"context","text":"…","key":"cart"} mitä sovelluksesi raportoi (agentti ei vastaa siihen); {"type":"tool_result","id":"…","result":{…}} (tai "error") sivufunktion vastaus |
| EvaSay → sinä | start (kentän callId kanssa); clear (soittaja keskeytti: hylkää agentin vielä toistamaton ääni); transcript (role, text, final ja input kirjoitetuille sanoille); user_started_speaking, user_stopped_speaking, agent_started_speaking, agent_stopped_speaking; cards (cards, quick_replies); tool (id, name, arguments: suorita yksi sivufunktioistasi); notice (code: too_fast tai limit kirjoitetuille sanoille); ended (kentän reason kanssa, sitten socket sulkeutuu) |
Agentti tervehtii heti, kun yhdistät. Pyyntöön voi lisätä user_id- ja page_tools-kentät (sivufunktiot, joihin sovelluksesi vastaa, ks. alla). Puhelut laskutetaan minuuteittain kuten kaikki muutkin, samoilla puhelutiedoilla, analyysillä ja webhookeilla.
Verkkopuhelussa (widget, isännöity sivu, sovelluksesi) soittaja näkee chatin äänen vieressä, joten agentti voi tehdä muutakin kuin puhua. Puhelimella soittavat eivät saa tätä.
Ota käyttöön Agentti → Työkalut → Lähetä soittajalle (send_to_caller agentti-API:ssa), niin agentti voi näyttää soittajan ruudulla enintään viisi korttia kerrallaan: otsikon, rivin sen alla, kuvauksen, kuvan, linkin ja enintään kaksi vastauspainiketta kussakin; se voi myös tarjota enintään kolme pikavastausta kysymyksen alla. Linkkejä ei lueta koskaan ääneen.
Agentti saa lähettää vain linkkejä ja kuvia, jotka sille on annettu kyseisessä puhelussa: sen ohjeet ja tervehdys, tietopankki (verkkosivulta luetun asiakirjan mukana on sen osoite), funktioidesi vastaukset ja valmiit kortit. Lisäksi linkin täytyy olla jollakin allowed_hosts-isännällä (valmiin kortin oma sivusto on aina sallittu). Linkkejä, jotka agentti keksii tai jotka soittaja lukee ääneen, ei lähetetä. Näiden sivustojen linkit agentin sanoissa ovat napsautettavia chatissa.
"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": "" }
]
}
Jokainen lähetys tulee sinulle call.message_sent-webhookina (channel, items kentillä title ja url, quickReplies, blocked). Puhelu lähettää enintään 10 kertaa.
Puhelun aikana soittaja voi myös kirjoittaa (sähköpostiosoite, tilausnumero) tai napauttaa vastauspainiketta; agentti vastaa siihen kuin puheeseen ja lopettaa ensin, jos se puhui. Enintään 500 merkkiä viestissä, yksi sekunnissa, 100 puhelussa. Puhelutiedoissa nämä vuorot on merkitty kirjoitetuiksi tai napautetuiksi.
Widget antaa sivullesi evasay-olion. Kaikki on valinnaista, ja puhelukehys kuuntelee sivuasi vain, jos se on yksi widgetin sallituista verkkosivustoista (Agentti → Ota käyttöön):
<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-arvot täyttävät {{name}} ohjeissa ja tervehdyksessä. Ne tulevat kävijän selaimesta, joten agentille kerrotaan, ettei niitä ole varmennettu, eivätkä ne koskaan päädy funktioihisi tai aloitushakuun.update kertoo agentille, mitä sivulla tapahtuu, saamatta sitä vastaamaan; uudempi päivitys samalla key-arvolla korvaa vanhemman."kind": "page", ei url), ja rekisteröi sivullesi samanniminen funktio. Agentti saa kutsua sitä vain puheluissa sivulta, joka on rekisteröinyt sen; se odottaa vastausta enintään timeout_sec (1–10, oletus 5), ellei wait_for_result ole false. Se suoritetaan kävijän kirjautumisella, kuin hänen oma napsautuksensa: pyydä vahvistus omalla sivullasi ennen kaikkea, mikä maksaa rahaa tai mitä ei voi perua. Sen vastauksen linkit voidaan lähettää korttina.Aseta Kuka voi aloittaa puhelun arvoon Vain tunnisteella ja anna palvelimesi hakea kertakäyttöinen tunniste kirjautuneelle käyttäjälle:
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 }'
Vastauksessa on token (yksi puhelu, expires_in sekunnin sisällä, 30–3600, oletus 600), agent (slug) ja web_call_url. Anna tunniste sivulle widgetin skriptin data-token-url="/your/endpoint"-attribuutilla (se tekee sinne POST-pyynnön kävijän evästeillä ja lukee { "token": "…" }) tai agent.setToken(async () => token)-kutsulla. Tunnisteen variables on varmennettu: ohjeet, aloitushaku ja funktioidesi mallit voivat käyttää niitä, samoin user_id:tä, jonka puhelu säilyttää (userId puhelussa, user_id puheluiden suodatukseen). Pidä API-avaimesi palvelimellasi.
Omassa sovelluksessasi tee POST { "token": "…", "pageTools": ["add_to_cart"] } osoitteeseen https://evasay.com + web_call_url. Vastaus on puhelun yhteys (WebRTC-tarjousosoite tai WebSocket-osoite puhelutunnisteen kanssa) RTVI-asiakkaalle, kuten Pipecatin asiakas-SDK:ille webille, iOS:lle, Androidille ja React Nativelle. Kortit, sivufunktiot ja huomautukset saapuvat RTVI-server-message-viesteinä (evasay.cards, evasay.tool, evasay.notice); lähetä kirjoitetut sanat send-text-viestillä ja sivun ilmoitukset ja vastaukset client-message-viesteinä evasay.context ja evasay.tool_result. Tai siirrä ääni itse osiolla Ääni WebSocketin kautta antamalla user_id ja page_tools.
Kohdassa Puhelinnumerot → SIP oma puhelinvaihteesi, SIP-puhelimesi tai SIP-trunkkisi voi soittaa agenteillesi suoraan; SIP-palveluntarjoajasi laskuttaa puhelut:
sip:ev…@<EvaSay's SIP domain>, vain saapuvat puhelut, puhelinvaihteille (3CX, FreePBX, Asterisk…) ja SIP-puhelimille.from-arvona); siirrot ihmiselle luovutetaan trunkille REFER-viestillä. Kun trunkki pyytää tunnistetietoja, EvaSay vastaa syöttämälläsi trunkin käyttäjätunnuksella ja salasanalla.Saapuvat puhelut kirjautuvat digest-tunnistuksella EvaSayn antamalla käyttäjätunnuksella ja salasanalla (realm on SIP-verkkotunnus); voit myös rajata lähde-IP-osoitteet tai hyväksyä pelkän IP:n perusteella, kun palveluntarjoajasi ei voi kirjautua (IP-osoitteet ovat silloin pakolliset). Jokaisella SIP-osoitteella tai trunkilla on samanaikaisten puheluiden raja; sen ylittävät puhelut saavat vastauksen 486. Salasanat näytetään kerran, luotaessa tai nollattaessa. Vain UDP ja G.711 (PCMU, PCMA); näppäinpainallukset RFC 4733:lla tai SIP INFO:lla; poista rekisteröinti (REGISTER) käytöstä puhelinvaihteesi trunkista.
Kampanja soittaa yhteystietoluettelolle yhdellä agentilla soittoaikojen ja rinnakkaisuusrajan (max_concurrency, enintään 100 puhelua kerrallaan, eikä koskaan enempää kuin työtilasi samanaikaisten puheluiden raja) puitteissa ja yrittää uudelleen niille, joita se ei tavoittanut.
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" }
]
}'
Yhteystiedot voivat olla myös CSV-tekstiä, jonka ensimmäisessä sarakkeessa on puhelinnumero. consent_confirmed: true vaaditaan: sillä vahvistat, että kaikki luettelossa olevat ovat suostuneet siihen, että heille soitetaan, myös tekoälyäänellä, ja EvaSay säilyttää vahvistuksen kampanjan mukana (consent_confirmed_at). Kampanja luodaan luonnoksena; käynnistä se komennolla POST /api/v1/voice/campaigns/{id}/start ja käytä pause- tai cancel-toimintoa samalla tavalla. Agentin on oltava julkaistu ennen kampanjan käynnistämistä.
Kun voicemail_detection on päällä (oletus), lähtevä puhelu kuuntelee, puhuuko toinen osapuoli, ennen kuin agentti tervehtii; jos he pysyvät hiljaa, agentti tervehtii kahden tai kolmen sekunnin kuluttua. Kun agentti kuulee vastaajan tai operaattorin äänitteen, se odottaa tervehdyksen ja äänimerkin päättymistä, jättää voicemail_message-viestin tai katkaisee, jos sellaista ei ole. Tällaiset puhelut päättyvät ended_reason-arvoon voicemail, ne laskutetaan keston mukaan, eikä niitä analysoida tai niistä ilmoiteta.
Kampanjassa vastaajaan päätynyt numero soitetaan uudelleen kuin numero, joka ei vastannut, ja viesti jätetään vain viimeisellä yrityksellä, jotta kukaan ei saa samaa viestiä kahdesti.
Jokainen lähtevä puhelu, kampanjasta tai komennolla POST /api/v1/voice/calls, tarkistaa ensin työtilan Älä soita -luettelon. Luettelossa olevaan numeroon ei soiteta koskaan: API vastaa 409 ja code on do_not_call, ja kampanja merkitsee yhteystiedon tilaan canceled ja outcome-arvoksi do_not_call ja siirtyy seuraavaan.
Kun agentin soittamassa puhelussa oleva henkilö pyytää, ettei hänelle soiteta enää, agentti lisää hänen numeronsa luetteloon itse, kertoo siitä hänelle, ja call.do_not_call-webhook lähetetään. Numeroita voi myös lisätä ja poistaa kohdassa Kampanjat → Älä soita -luettelo tai API:lla:
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" }'
Numerot annetaan kansainvälisessä muodossa; enintään 1 000 kerrallaan. GET /api/v1/voice/do-not-call listaa ne uusin ensin (search, limit, page), kunkin source-arvon kanssa (call, dashboard tai api). DELETE /api/v1/voice/do-not-call/%2B14155550100 poistaa yhden luettelosta; tee se vain, kun henkilö on suostunut siihen, että hänelle soitetaan.
POST /api/v1/voice/voices luo äänen yhden puhujan WAV-tallenteesta (multipart audio, name, language, consent=true). Se vastaa 202 ja tilalla running; kysy GET /api/v1/voice/voices, kunnes tila on ready, ja aseta sitten agentin voice_id äänen voice_id:ksi. language on tallenteessa puhuttu kieli, mikä tahansa yllä mainituista agenttikielistä; ääni puhuu niitä kaikkia paitsi kiinaa, jossa vastaa samaa sukupuolta oleva sisäänrakennettu ääni, ja se kuulostaa eniten tallenteen puhujalta tallenteen kielellä. Jokainen kloonattu ääni maksaa krediittejä, jotka paneeli näyttää ennen kuin luot sen.
Lisää https-osoite kohdassa Integraatiot → Webhookit ja ilmoitukset saadaksesi puhelutapahtumia:
| Tapahtuma | Milloin |
|---|---|
call.started | Agentti vastasi |
call.ended | Puhelu päättyi, mukana kesto ja krediitit |
call.analyzed | Yhteenveto, lopputulos, poimitut kentät ja litteraatti ovat valmiit |
call.transcript | Puhelun aikana, litteraatin uudet rivit muutaman sekunnin välein |
call.tool_called | Agentti kutsui yhtä funktioistasi: name, arguments, status, durationMs |
call.handed_off | Puhelu luovutettiin toiselle agentille: fromAgentId, toAgentId |
call.transferred | Puhelu siirrettiin ihmiselle: destination |
call.voicemail | Lähtevä puhelu päätyi vastaajaan |
call.do_not_call | Lähtevän puhelun henkilö pyysi, ettei hänelle soiteta enää: phone |
call.recording_ready | Kaksikanavainen tallenne on tallennettu: recordingUrl (voimassa 24 tuntia), durationMs |
call.message_sent | Agentti näytti kortteja verkko- tai sovellussoittajan ruudulla: items, quickReplies |
alert.triggered | Yksi hälytyksistäsi (Webhookit ja ilmoitukset → Hälytykset) ylitti kynnyksensä |
alert.resolved | Kyseinen hälytys on palannut normaaliksi |
Puhelun aikana lähetetyt tapahtumat sisältävät data.call-kentän (id, agentId, channel, direction, numerot). Jokainen pyyntö on allekirjoitettu:
EvaSay-Signature: t=<unix seconds>,v1=<hex HMAC-SHA256 of "<t>.<raw body>">
EvaSay-Delivery: <delivery id>
Varmenna allekirjoitus webhookin luontihetkellä näytetyllä webhook-salaisuudella ja vastaa 2xx-tilalla. Epäonnistuneet toimitukset yritetään uudelleen 1 minuutin, 5 minuutin, 30 minuutin, 2 tunnin ja 12 tunnin kuluttua samalla sisällöllä ja samalla EvaSay-Delivery-tunnuksella, joten voit ohittaa toistot. Webhookin viimeisimmät toimitukset, täsmälleen lähetetty sisältö ja päätepisteesi vastaama tila, listataan komennolla GET /webhooks/{id}/deliveries ja paneelissa; POST /webhooks/{id}/deliveries/{delivery_id} lähettää yhden uudelleen.
Sähköpostin ja alert.triggered- / alert.resolved-webhookien lisäksi hälytykset voivat mennä Slack-kanavalle (incoming webhook), WeCom-ryhmärobotille tai Telegramiin kohdassa Webhookit ja ilmoitukset → Hälytykset → Lähetä myös.
Virheillä on yksi muoto:
{
"error": {
"type": "invalid_request_error",
"code": "invalid_agent_field",
"message": "status must be draft or published",
"param": "status"
}
}
| Tila | Merkitys |
|---|---|
| 400 | Virheellinen syöte (code ja param kertovat, mikä) |
| 401 | API-avain puuttuu tai on virheellinen |
| 402 | Krediittejä ei ole tarpeeksi puhelun aloittamiseen |
| 403 | Avain on vain luku -tilassa tai agentti ei ole käytettävissä |
| 404 | Tällaista agenttia, puhelua tai kampanjaa ei ole tässä työtilassa |
| 409 | Väärä tila (esim. käynnissä olevan kampanjan käynnistäminen), palveluntarjoajan tiliä ei ole yhdistetty tai numero on Älä soita -luettelossa (do_not_call) |
| 429 | Liikaa pyyntöjä; hidasta ja yritä uudelleen |
Työtilan Voice API -pyynnöt viimeisen 30 päivän ajalta (aika, endpoint, tila, kesto, avain ja virhekoodi; ei sisältöä) listataan kohdassa API-avaimet → API-pyyntöloki.
Lukemiset on rajattu 120 pyyntöön minuutissa avainta kohti, kirjoitukset ja puhelut 30 pyyntöön.
Puhelut laskutetaan minuuteittain työtilan krediiteistä, samasta saldosta, jota paneeli käyttää. Voimassa olevat hinnat ovat hinnoittelusivulla.
Käytä OpenAPI-sopimusta integraatioasiakkaan luomiseen. Julkinen API, paneeli ja MCP-hallintapäätepiste toimivat samoilla työtilan resursseilla ja oikeuksilla.
| Ominaisuus | Endpoint |
|---|---|
| Uudelleenkäytettävät työkalut | GET / POST /api/v1/voice/tools |
| Lue / päivitä / poista työkalu | GET / PATCH / DELETE /api/v1/voice/tools/{id} |
| Esikatsele tai testaa työkalu | POST /api/v1/voice/tools/{id}/test |
| Sido työkalut agenttiin | PUT /api/v1/voice/agents/{id}/tools |
| Tietopankit | GET / POST /api/v1/voice/knowledge-bases |
| Lue / päivitä / poista tietopankki | GET / PATCH / DELETE /api/v1/voice/knowledge-bases/{id} |
| Lisää / listaa asiakirjoja | POST / GET /api/v1/voice/knowledge-bases/{id}/documents |
| Lue / poista asiakirja | GET / DELETE /api/v1/voice/knowledge-bases/{id}/documents/{doc_id} |
| Puhelutapahtumien tilaukset | GET / POST /api/v1/voice/webhooks |
| Lue / päivitä / poista tilaus | GET / PATCH / DELETE /api/v1/voice/webhooks/{id} |
| Lähetä allekirjoitettu testitapahtuma | POST /api/v1/voice/webhooks/{id}/test |
| Löydä etä-MCP-työkalut | POST /api/v1/voice/mcp/discover |
| MCP-hallintapäätepiste | /api/v1/voice/mcp |
Rekisteröi HTTP-työkalu, joka kysyy CRM-sovittimeltasi:
{
"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 palauttaa { "data": { "id": "TOOL_ID", ... } }. Sido sen määritelmä agenttiin komennolla PUT /agents/AGENT_ID/tools ja { "tool_ids": ["TOOL_ID"] }. Tämä korvaa koko työkalulistan tilannekuvilla; sido uudelleen, kun kirjaston työkalu muuttuu. Kirjastomääritelmän poistaminen säilyttää olemassa olevat tilannekuvat. Voit myös lukea ja korvata sisäisiä määritelmiä agentti-API:n tools-kentällä. Käytä analysis_config- ja widget_config-kenttiä analyysin ja widgetin määrittämiseen agentti-API:n kautta.
Työkalu voi käyttää GET-, POST-, PUT-, PATCH- tai DELETE-menetelmää. query ja request_body hyväksyvät sisäkkäisiä JSON-malleja, kuten { "customer": { "id": "{{customer_id}}" } }. Kokonainen paikkamerkki säilyttää alkuperäisen JSON-tyypin. URL-paikkamerkit koodataan, ja ne saavat esiintyä vain kiinteän julkisen HTTPS-isännän jälkeen. Ilman request_body-kenttää muut kuin GET-työkalut saavat { "arguments": {...}, "call": { "callId": "...", "agentId": "...", "toolCallId": "...", "idempotencyKey": "..." } }. response_path valitsee kentän pistenotaatiolla. Yksinkertaiset parameters hyväksytään edelleen; input_schema tukee lisäksi sisäkkäisiä objekteja, taulukoita, luettelotyyppejä ja numeerisia rajoja. Ulkoisia skeemaviittauksia ja säännöllisiä lausekkeita ei hyväksytä.
static_args: arvot, jotka lähetetään jokaisen kutsun mukana riippumatta siitä, mitä malli kirjoittaa, kuten myymälän tunnus; ne täyttävät myös {{name}} osoitteessa ja rungossa.extract: [{name, path}] säilyttää kenttiä funktion vastauksesta (data.id) myöhempien funktioiden {{name}}-arvoksi, jotta haun customer_id voi päätyä seuraavaan tilaukseen ilman, että malli toistaa sen. Aloitushaun kentät säilytetään samalla tavalla.reject_when: enintään 5 sääntöä {on: caller|agent, pattern, negate}; niin kauan kuin kaikki pätevät viimeisiin sanoihin, funktiota ei suoriteta ja agentti saa reject_message-viestin.model_says: jokaisella kutsulla malli kirjoittaa yhden lauseen, joka sanotaan funktion suorituksen aikana kiinteän speak_before-arvon sijaan.Yhdistä sovellus kohdassa Integraatiot → Webhookit ja ilmoitukset → Yhdistetyt sovellukset ja käytä sitten agentin Tietämys ja työkalut -välilehden toimintoa „Lisää valmis funktio”; oma endpoint ei ole tarpeen:
check_availability (vapaat ajat tiettynä päivänä) ja book_appointment (varaa soittajan valitseman ajan). Google Calendarin ajat noudattavat asettamaasi aikavyöhykettä, aukiolopäiviä, tunteja ja tapaamisen kestoa; Cal.com käyttää tapahtumatyypin omaa saatavuutta ja asettamaasi varasähköpostiosoitetta, kun soittaja ei anna sellaista.save_to_sheet, joka lisää rivin luettelemillasi sarakkeilla sekä puhelun tunnuksella ja ajalla.notify_team, joka julkaisee agentin kirjoittaman viestin Slack-kanavalle (incoming webhook).EvaSayn ohjaustaso suorittaa nämä funktiot yhdistämälläsi tilillä; ei worker eikä agentin määritelmä pidä sovelluksen tunnistetietoja. Agentin lukeminen API:n kautta näyttää ne muodossa kind: "app" (kentillä app, action, connection_id, app_config); lähetä ne takaisin muuttamattomina korvatessasi tools-kentän, jotta ne säilyvät. Sovellukset yhdistetään vain paneelissa.
Aseta run_at_start: true yhdelle agentin työkalulle, niin sitä kutsutaan jokaisen puhelun alussa, ennen kuin agentti tervehtii tai vastaa. Parametrit nimeltä caller_number, called_number, direction, channel tai call_id täytetään sille. Sen palauttamat kentät täyttävät {{variables}} kentissä first_message, system_prompt ja idle_messages (yksi taso alempana olevat kentät muodossa {{customer.name}}), ja koko vastaus annetaan agentille taustatietona. Muuttujia sisältävä tervehdys odottaa vastausta enintään 3 sekuntia; mitä ei löydy, jää tyhjäksi. Yksi työkalu agenttia kohti voi suorittua alussa.
Tunnistetiedot määritetään palvelinympäristössä työtilallesi ja kohteellesi; pyydä osoitteesta support@evasay.com credential_ref-viitteen luontia. Älä laita API-avaimia agenttimäärittelyihin, otsakkeisiin, kehotteisiin tai työkaluparametreihin. Sovittimesi voi pitää CRM-tunnistetiedot omassa ympäristössään.
Esikatsele työkalu ennen pyyntöjen tekemistä liiketoimintajärjestelmään:
{
"arguments": { "customer_id": "customer-123" },
"dry_run": true,
"mock_result": { "name": "Alex", "order_status": "shipped" }
}
Esikatselu validoi parametrit ja näyttää muodostetun pyynnön; se ei käy keskustelua eikä ota yhteyttä liiketoimintajärjestelmään. Aseta dry_run=false todellista suoritusta varten. Todellinen kirjoitustesti vaatii myös confirmed=true ja idempotency_key (8–128 kirjainta, numeroa, pistettä, alaviivaa, kaksoispistettä tai yhdysmerkkiä). Testivastaukset sisältävät ok, status, duration_ms ja rajatun tuloksen. Ne eivät palauta tunnistetietoja. Luku- ja kirjoitustestit vaativat työtilan kirjoitusoikeuden.
Puhelun aikana liiketoimintapyynnöillä on vakaa Idempotency-Key. Liiketoimintapäätepisteesi on kunnioitettava sitä. Samanlaiset kirjoitukset puhelun sisällä deduplikoidaan, myös operaatiot, joiden lopputulos on tuntematon aikakatkaisun jälkeen. Toinen tarkoituksellinen operaatio tarvitsee oman liiketoimintaparametrinsa, kuten operation_id. EvaSay ei toista kirjoituksia automaattisesti. Työkalujen suoritustapahtumat sisältävät tilan ja keston; keskustelutestitoiminto on edelleen tekstisimulaatio, ei työkalujen suoritustesti.
Määritä Streamable HTTP -MCP-yhteys:
URL: https://evasay.com/api/v1/voice/mcp
Authorization: Bearer <your EvaSay API key>
Esimerkiksi Claude Codessa:
claude mcp add --transport http evasay https://evasay.com/api/v1/voice/mcp --header "Authorization: Bearer $EVASAY_API_KEY"
Yhteys kertoo työkalulle, miten agentti rakennetaan: lue luettelo, luo luonnos, lisää tietämys, funktiot ja sanalistat, kirjoita ja aja testit, korjaa luonnosta kunnes ne menevät läpi, anna sinulle agentin dashboard_url kokeilua varten, ja julkaise sekä ohjaa numero vasta hyväksyntäsi jälkeen. Dokumentaatiota lukevat työkalut voivat aloittaa osoitteesta https://evasay.com/llms.txt, josta on linkit tälle sivulle, OpenAPI-kuvaukseen ja MCP-osoitteeseen.
Käytä asiakasohjelman turvallista tunniste- tai ympäristömuuttuja-asetusta. Päätepiste käyttää API-avaintodennusta, ei OAuth-kirjautumista. Se tarjoaa agenttien luonnin ja määrittämisen, kirjastotyökalut, tietämyksen, webhookit ja puhelutiedot. Julkaiseminen ja todellisten puheluiden soittaminen ovat kirjoitustoimia; lähtevät puhelut kuluttavat krediittejä ja operaattorimaksuja. Jokainen työkalukutsu tarkistaa työtilan oikeudet uudelleen. Ota asiakasohjelmasi vahvistusasetukset käyttöön kirjoitustoimille. Päätepiste käyttää tilattomia JSON-vastauksia; se ei tarjoa taustailmoitusvirtaa.
Esimerkkiohje koodaustyökalulle: „Luo EvaSay-agentti luonnoksena, rekisteröi CRM-hakupäätepisteeni, esikatsele sitä testiargumenteilla, sido se agenttiin ja määritä call.analyzed-webhook.” Tarkista ja valtuuta julkaisu ja todelliset puhelut nimenomaisesti.
POST /mcp/discover hyväksyy { "url": "https://crm.example.com/mcp", "credential_ref": "crm" } ja palauttaa palvelimen työkalut ja skeemat. Rekisteröi vain valittu työkalu:
{
"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"]
}
}
Agentin käyttöön tulevat vain rekisteröidyt työkalut. Etäyhteydet tukevat Streamable HTTP:tä JSON- tai SSE-vastauksilla pyyntöihin, julkisia HTTPS-kohteita ja esimääritettyjä tunnistetietoja. Vanhoja SSE-päätepisteitä, OAuth-neuvottelua, palvelimen aloittamaa samplingia/elicitationia ja binäärisiä liitteitä ei tueta. Löytäminen ei automaattisesti anna pääsyä kaikkiin palvelimen työkaluihin. Etätyökalun skeeman on oltava sisäinen ja käytettävä tuettua JSON Schema -osajoukkoa.
Luo webhook komennolla POST /webhooks ja { "url": "https://crm.example.com/evasay-events", "events": ["call.analyzed"] }. Vastaus sisältää tilauksen ja luodun allekirjoitussalaisuuden, joka palautetaan vain luotaessa. Varmenna EvaSay-Signature, deduplikoi EvaSay-Delivery ja päivitä CRM:si. Tapahtumawebhookit ovat asynkronisia ilmoituksia; puhelun aikaiset työkalut palauttavat tulokset suoraan agentille.