会话与消息
会话是某一个终端用户的一次对话。用户发出的每一条消息都会开启一个任务——助手的回答——它在会话的事件流上流式发送,并保存在会话的消息列表里。下面这些调用都使用终端用户的令牌。
创建会话
curl -s "$NEWEYES_API_BASE/v1/sessions" -X POST \
-H "Authorization: Bearer $NEWEYES_USER_TOKEN" \
-H "Content-Type: application/json" \
-d '{"output_format": "a2ui", "text": "What can I cook with leeks and potatoes?"}'
output_format决定会话整个生命周期内回复的形式:a2ui(默认):回复是由你的应用用 A2UI 渲染器渲染的界面数据,界面之外说的话以纯文本给出。详见 A2UI 回复。markdown:回复是格式化的 Markdown 文字。
capabilities或exclude_capabilities决定助手在这个会话里能用哪些能力,同样在会话的整个生命周期里不变:只开列出的,或除了列出的全开。两个都不传就全部打开。见为会话选择能力。text可选。带上它,第一个任务会立刻开始,响应里会有它的task_id和last_event_id。不带则创建一个空会话,空会话不需要余额。attachments随text一起,用法和后续消息相同(见下文)。
响应是会话本身:
| 字段 | 含义 |
|---|---|
id | 会话标识。 |
type | 文字对话为 text,语音通话为 realtime。 |
status | created、queued、running、completed、failed、stopped 或 timeout。 |
output_format | a2ui 或 markdown。 |
brief_status | 语音会话的纪要是否已就绪。 |
created_at、ended_at | 开始时间;结束时间,进行中为 null。 |
capabilities | 助手在这个会话里能用的能力。 |
task_id、last_event_id | 只在创建时返回:第一个任务,以及它在事件流上的起点。 |
发送消息
curl -s "$NEWEYES_API_BASE/v1/sessions/$SESSION_ID/messages" -X POST \
-H "Authorization: Bearer $NEWEYES_USER_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"text": "Make it vegetarian."}'
{ "object": "task", "task_id": "exec-5a2c…", "session_id": "9c1e…", "last_event_id": "1760860912345-0" }
text是用户说的话:1 到 32,000 个字符。- 响应为
202 Accepted,带上它开启的任务。从last_event_id开始在事件流上跟踪它;或者发送"stream": true,直接在这个请求上接收——详见事件流。 - 一次一个任务。 任务运行期间发送新消息,会被拒绝并返回
409 session_busy。等任务的结束帧,或先停止它。 - 语音会话不接受文字消息(
409 session_not_taskable)。 - 开启任务需要可用余额(否则返回
429 insufficient_credits)。
附带媒体
一条消息最多可以附带 10 个图片或视频:
{
"text": "Which of these two rooms gets more light?",
"attachments": [
{ "file_id": "3d0f…" },
{ "file_data": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQ…" }
]
}
每个附件是以下两者之一:
file_id:用户用POST /v1/files上传的文件。较大的内容(例如视频)请用这种方式。file_data:文件内容的 base64,直接内嵌,最大 10 MB。可以带data:…;base64,前缀。
音频不能作为消息附件(422 unsupported_media_type);请用 POST /v1/audio/transcriptions 转成文字后再发送。
回应界面操作
在 a2ui 会话里,用户通过操作界面——点按钮、提交表单——发出的消息,会在 a2ui_action 里带上渲染器给出的操作。详见 A2UI 回复。
停止任务
curl -s "$NEWEYES_API_BASE/v1/sessions/$SESSION_ID/stop" -X POST \
-H "Authorization: Bearer $NEWEYES_USER_TOKEN"
正在运行的任务会以 task.stopped 帧结束,帧里带着回复到目前为止的内容。响应给出被停止任务的 task_id;没有任务在运行时为 null。
读取对话
curl -s "$NEWEYES_API_BASE/v1/sessions/$SESSION_ID/messages?limit=50" \
-H "Authorization: Bearer $NEWEYES_USER_TOKEN"
列表按对话顺序排列,并分页。每一项都有 type:
type | 含义 |
|---|---|
user_message | 用户发出的内容:content 及其 attachments。 |
assistant_message | 一条回复:content、attachments(它生成的图片、视频、音频和文件)、suggestions,以及写下它的任务的 task_id。 |
status_update | 关于某个任务的通知,例如任务失败,带 error。 |
activity | 助手执行的一个步骤。仅在 verbose=true 时列出。 |
- 附件的
url是每次读取时重新签发的下载链接,在其expires_at(一小时)后失效。重新读取列表即可得到新链接。 - 较早的消息会随时间归档,归档可能改变消息的
id。请按task_id匹配回复,而不是按id。游标在归档前后都能保持位置。 - 语音会话列出的是它的转写内容。
列出、读取和删除会话
| 调用 | 作用 |
|---|---|
GET /v1/sessions | 用户的会话,按从新到旧。已删除的不会列出。 |
GET /v1/sessions/{session_id} | 一个会话。 |
DELETE /v1/sessions/{session_id} | 删除它:此后不再出现在列表或读取中。 |
语音会话在通话仍连接时不能删除(409 call_in_progress)。如果清理会话的存储数据失败,什么都不会被删除,调用返回 503:请重试。
会话只对拥有它的终端用户可见;读取其他用户的会话,结果为 404 session_not_found。