Skip to main content
每個 payload 開頭都有 event 欄位指出觸發的事件種類。把 body 當 discriminated union、用這個欄位分流。
每個事件都有的共通欄位:
string
Discriminator。session.ended / call.ended / session.finalized / recording.ready 之一。
string
Pathors session ID。
string
事件 emit 時的 ISO 8601 timestamp。

session.ended

對話結束時觸發。對 call session,通話的最終狀態跟時長此時可能還沒就緒。
string
對話結束時 agent 停在的 pathway node。
number
messages 的長度 —— 這個 payload 送出的 user/assistant 對話輪數。
array
對話逐字稿,依對話順序排列的 { role, content, timestamp? } 物件。roleuserassistant —— tool call/result 跟 system prompt 都會被濾掉。timestamp 是該輪對話的 ISO 8601 時間,有記錄到才會出現。語音通話 finalize 後,這裡是 agent-authoritative 的對話內容(使用者實際聽到的版本)。
object
這個 session 提取出來的變數,以名稱為 key。除了 agent 對話中提取的值之外,也包含 session 建立時注入的變數:startAt / endAt、通話 metadata(fromNumbertoNumber),以及 —— 若該電話號碼有設定 header capture 的 SIP 通話 —— 被擷取的 custom SIP header 值,以各 header 設定的 attribute 名稱為 key(例如 X-Campaign-Id header 設定擷取為 campaignId,就會出現在 extractedVariables.campaignId)。
string
已棄用
event 在多事件支援之前的 legacy 別名。未來版本會移除 —— 新 receiver 請改用 event

call.ended

通話結束時觸發。Call session 限定 —— text session 不會收到這個事件。
string
擁有此 agent 的 project ID。
string
最終 domain status。可能值:userHangupagentHanguptransferredvoicemailerrorTransferredbusyuserNoAnsweruserRejectedinvalidNumbersipTrunkFailureagentNoAnswererrorunknownEnded
number
通話秒數。對於不計費的結束狀態(busy、no-answer、無效號碼)為 0

recording.ready

通話錄音處理完成後觸發 —— 成功與失敗都會觸發Call session 限定,text session 不會收到。 對 call session 來說,錄音處理會 gate session.finalized:finalization 會等到錄音成功或失敗才發生(有 timeout backstop),成功的 recordingUrl 也會一併放進 session.finalized 的 payload。想單獨收到錄音訊號才需要訂閱 recording.ready —— 它是唯一會告訴你錄音失敗的事件;否則 session.finalized 已經帶了 URL。
string
擁有此 agent 的 project ID。
boolean
錄音是否成功處理並存檔。為 false 時不帶 recordingUrl
string
合併後音檔的臨時下載連結。只有 successtrue 時才有。連結為短期有效(約 15 分鐘)—— 請儘快下載。過期後目前沒有 API 可重新取得,請改從 Pathors 後台的通話記錄下載錄音。
成功範例:
失敗範例:

session.finalized

這個 session 的所有事情都做完時觸發 —— 對 call session 來說包含錄音處理。Payload 已經把原本要從 session.endedcall.endedrecording.ready 各自抓出來的資料合併到同一個 body,receiver 只需處理這一個事件。 對 text session,call 相關欄位(callStatuscallDuration整個被省略(不是設成 null)。用欄位有沒有來區分 call vs text:
string
擁有此 agent 的 project ID。
string
對話結束時 agent 停在的 pathway node。
number
messages 的長度,同 session.endedmessagesCount
array
對話逐字稿,格式與過濾規則同 session.endedmessages
object
session.endedextractedVariables —— 電話號碼有設定 header capture 時,一樣包含擷取到的 custom SIP header 值。
string
Call session 限定。call.endedcallStatus。Text session 被省略。
number
Call session 限定。call.endedcallDuration。Text session 被省略。
string
Call session 限定。 合併後音檔的臨時下載連結,同 recording.readyrecordingUrl。有錄音且處理成功時才有;text session 與錄音失敗時省略。連結為短期有效(約 15 分鐘)—— 請儘快下載。
Call session 範例:
Text session 範例:

實作範例

event 欄位 dispatch 各事件的 receiver:

順序

session.finalized 對某個 session 一定最後到:它只在所有預期的步驟都完成後才觸發 —— text session 只等 session.ended;call session 等 session.endedcall.ended 加上 recording.ready Call session 的典型順序:
  1. session.ended
  2. call.ended
  3. recording.ready
  4. session.finalized
Text session 則是 session.endedsession.finalized 緊接著到。 個別步驟(session.endedcall.endedrecording.ready)彼此之間在 edge case(例如使用者直接掛斷在 agent 還沒走到結尾節點時)沒有嚴格順序,而且 recording.ready 的 HTTP 送達可能跟它解鎖的 session.finalized 請求互相 race。可以依賴的是:收到 session.finalized 時錄音處理必定已結束,成功的錄音 URL 就在該 payload 裡。