Session 是 Qoder Cloud Agents 中实际执行任务的单元。它将 Agent(配置)和 Environment(基础设施)组合在一起,形成一个有状态的工作会话。你向 Session 发送消息,它处理后返回事件流。Documentation Index
Fetch the complete documentation index at: https://docs.qoder.com/llms.txt
Use this file to discover all available pages before exploring further.
Session 生命周期
Session 是一个状态机,核心状态如下:
| 状态 | 说明 | 可流转到 |
|---|---|---|
idle | 空闲,等待用户消息 | processing |
processing | 正在处理,Agent 执行中 | canceling, idle |
canceling | 取消指令已发出,等待中断完成 | idle |
archived | 已归档 | — (终态) |
字段说明
| 字段 | 类型 | 说明 |
|---|---|---|
id | string | 系统生成,sess_ 前缀 |
agent | string/object | 绑定的 Agent(字符串=最新版本,对象 {id,version}=锁版本)。创建请求只接受此字段 |
agent_id | string | 响应中返回,始终等于 agent;为兼容性保留,优先使用 agent |
environment_id | string | 绑定的 Environment ID |
status | string | 当前状态:idle / processing / canceling |
title | string/null | 会话标题,可为空 |
metadata | object | 自定义键值对 |
usage | object | Token 用量统计 |
usage.input_tokens | integer | 累计输入 token 数 |
usage.output_tokens | integer | 累计输出 token 数 |
created_at | string | 创建时间 |
updated_at | string | 最后更新时间 |
创建 Session
创建 Session 时需要指定agent 和 environment_id:
方式一:使用 Agent ID(字符串)
绑定该 Agent 的最新版本:方式二:使用 Agent 对象(指定版本)
绑定 Agent 的特定版本,确保行为一致性:在生产环境中建议使用方式二(指定版本),避免因 Agent 更新导致行为变化。
agent 字段格式
| 格式 | 示例 | 行为 |
|---|---|---|
| 字符串 | "agent_019e5ce0bf307a1a8f952eb814aea3d5" | 使用该 Agent 最新版本 |
| 对象 | {"id": "agent_019e5ce0bf307a1a8f952eb814aea3d5", "version": 2} | 锁定到指定版本 |
状态流转
事件请求体格式
POST /sessions/{id}/events 的请求体必须使用 events 数组包装,content 是内容块数组:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
events | array | 是 | 事件数组,单次请求可包含一个或多个事件 |
events[].type | string | 是 | 事件类型,如 user.message |
events[].content | array | 是 | 内容块数组 |
events[].content[].type | string | 是 | 内容块类型,如 text |
events[].content[].text | string | 是 | 文本内容 |
idle → processing
当你向 Session 发送user.message 事件时,状态从 idle 变为 processing:
processing → idle
Agent 完成处理后自动回到idle,通过事件流会收到 session.status_idle 事件。
取消 Session
中断正在执行的 Session:仅在
processing 状态下 cancel 才有实际中断效果:状态先变为 canceling,中断完成后回到 idle,Session 可继续复用——直接发送下一条 user.message 即可。对已处于 idle 的 Session 调用 cancel 是空操作,同样返回 200,不会报错,状态保持 idle 不变。查询 Session
Usage 统计
每个 Session 维护累计的 token 用量:| 字段 | 说明 |
|---|---|
usage.input_tokens | 所有请求的输入 token 总数 |
usage.output_tokens | 所有响应的输出 token 总数 |
Session 与 Agent 版本绑定
Session 创建时会快照 Agent 的配置:- 使用字符串形式
"agent": "agent_xxx"绑定创建时刻的最新版本 - 使用对象形式
"agent": {"id": "agent_xxx", "version": N}绑定精确版本 - Session 创建后,修改 Agent 不会影响已存在的 Session
- 想要使用新版 Agent,需要创建新的 Session
Session A — 绑定 Agent v1
在更新前创建。即使 Agent 后续更新到 v2,Session A 仍然继续使用 v1 配置。
Session B — 绑定 Agent v2
在更新后创建,使用新的 v2 配置。
多轮对话
Session 支持多轮对话。每次发送消息后等待session.status_idle,然后继续发送:
状态相关错误码
向 Session 发送事件时,常见的状态相关错误:| HTTP | type | 触发条件 |
|---|---|---|
| 409 | conflict_error | 向 processing 状态的 Session 发消息(需先 cancel 当前轮或等待 idle) |
| 404 | not_found_error | Session 不存在或已被删除 |
最佳实践
- 版本锁定 — 生产环境始终使用
{"id": ..., "version": ...}形式创建 Session - 及时取消 — 不再需要的 Session 及时 cancel,释放资源
- 监控用量 — 定期检查
usage字段,避免意外消耗 - 元数据标记 — 用
metadata记录业务上下文(任务 ID、触发来源等)
常见问题
Q: Session 有超时机制吗? A: Session 在idle 状态下会保持一段时间。长时间不活跃的 Session 可能被系统自动归档。建议按需创建,任务完成后主动 cancel。
Q: 向 processing 状态的 Session 发消息会怎样?
A: 会返回 HTTP 409 conflict_error,错误信息为 Session is currently processing a turn. Cancel the current turn or wait for completion.。需要先取消当前轮(cancel)或等待 Session 回到 idle,再发送新消息。
Q: 一个 Session 最多支持多少轮对话?
A: 没有硬性轮次限制,但受模型上下文窗口大小约束。随着对话增长,早期内容可能被截断。
Q: 如何获取 Session 的完整对话历史?
A: 通过 GET /sessions/{id}/events 获取该 Session 的所有事件,包括用户消息和 Agent 响应。
Q: 取消后的 Session 还能继续用吗?
A: 可以。cancel 后状态从 canceling 自动回到 idle,Session 保持可用——直接发送下一条 user.message 即可继续对话。仅 archived 是终态,归档后无法恢复。