Chat 是和接电话的同一个 Agent 打字对话:指令、函数、知识库和转接规则都照常生效,只是不出声音。你的服务器发出每条消息,在应答里拿到 Agent 这一轮的完整回复。按对方发出的条数计费;每个会话都是一条通话记录:列在“通话记录”里(标为“文字”),照常做通话分析、发 Webhook,也会随来电者的数据一起删除。
curl https://evasay.com/api/v1/voice/chats \
-X POST \
-H "Authorization: Bearer sk-your-key" \
-H "Content-Type: application/json" \
-d '{ "agent_id": "AGENT_ID", "message": "周日送货吗?", "user_id": "u_42" }'
{
"data": {
"chat_id": "vc_…",
"reply": "送的,上午 10 点到下午 4 点。要帮您约一个时段吗?",
"cards": [],
"quick_replies": [],
"ended": false
}
}
user_id(你给这个人的 ID)和 variables(Agent 和函数可以信任的值)的用法和网页通话令牌一样。cards 和 quick_replies 是 Agent 在网页通话里会显示的卡片和回话按钮(见网站和 App 里的通话)。curl https://evasay.com/api/v1/voice/chats/CHAT_ID/messages \
-X POST \
-H "Authorization: Bearer sk-your-key" \
-H "Content-Type: application/json" \
-d '{ "message": "好,这周日中午。" }'
应答的字段和上面一样。每条最多 500 字。一次发一条,等回复回来再发下一条:Agent 还在回答时发来的消息会得到 409 chat_busy,距上一条不到 1 秒的会得到 429 rate_limited。
如果运行这个会话的 Worker 不在了(比如重启),会开一个新会话、带上之前的对话接着聊,并回答你这条消息;这时应答里有 continued_from,值是原会话的 ID。之后请改用新的 chat_id。
30 分钟没有新消息、开始满 2 小时、满 100 条、Agent 结束对话,或者你主动结束:
curl https://evasay.com/api/v1/voice/chats/CHAT_ID/end \
-X POST \
-H "Authorization: Bearer sk-your-key"
结束后做通话分析、以 call.ended 发给你的 Webhook,并结算点数。向已结束的会话发消息会得到 409 chat_ended。要接着聊,就开一个新会话并带上 previous_chat_id:Agent 会知道之前的对话(最近 50 条),新会话的记录从空开始。回复里的 ended: true 表示 Agent 用这条回复结束了会话。
一个工作区同时进行的会话数有上限,和通话分开计算;都占满时,新会话会得到 429 chat_limit,直到有会话结束。
| 代码 | 状态 | 什么时候 |
|---|---|---|
invalid_message | 400 | 没有消息,或超过 500 字 |
chat_not_found | 404 | 工作区里没有这个会话(或 previous_chat_id 不是会话) |
chat_busy | 409 | Agent 还在回答上一条 |
chat_ended | 409 | 会话已结束,用 previous_chat_id 开新会话 |
chat_message_limit | 409 | 会话已满 100 条 |
rate_limited | 429 | 距上一条不到 1 秒 |
chat_limit | 429 | 工作区同时进行的会话已到上限 |
insufficient_credits | 402 | 点数不够开始会话 |
chat_timeout | 504 | Agent 没能及时答完,请重试 |
chat_unavailable | 503 | Agent 暂时回答不了,请重试 |
网页挂件和托管页同时提供说话和打字;可以在 Agent → 部署 里改成只提供其中一种。网页上的打字对话和 Chat 一样按条计费。见网站和 App 里的通话。