会话与记忆
会话模型
- 每个
session_id对应一个独立会话,持有逐轮对话历史 + 一份滚动摘要; - 会话按「租户 + session_id」寻址:不同租户用同名
session_id互不相通,这是平台级隔离,不需要你做任何事; - 不传
session_id时落到本租户的"anon"会话——同租户所有匿名请求共享它,强烈建议总是传; - 换一个
session_id就是开一个全新会话(无需「创建」步骤,首次使用即创建)。
记忆压缩(自动,无需参数)
长对话不会无限堆上下文。平台用滚动摘要策略:
- 对话原文超过 24 轮后,把最旧的溢出轮次交给模型折叠进摘要,只按原文保留最近 12 轮;
- 摘要保留关键事实(名字、偏好、决定、数字、未决问题),寒暄被丢弃;摘要本身最长约 2000 字;
- 每轮请求时,摘要会注入系统提示——所以几十轮前说过的关键信息,喵喵依然记得;
- 整个过程自动发生,没有任何可调参数,也不需要你感知。
含图片的历史轮次,图片本体不会长期保留(历史里以
[图片]占位),只有文字脉络进入记忆。
对话历史 API
GET /v1/sessions/:id/history — 读回某个会话当前的完整状态。Bearer key 鉴权。
bash
curl "$BASE/v1/sessions/s1/history" \
-H "Authorization: Bearer $KEY"成功响应 200:
json
{
"messages": [
{"role": "user", "content": "今天上海天气怎么样喵?"},
{"role": "assistant", "content": "今天上海多云,出门挺舒服的喵。"}
],
"summary": "",
"count": 2
}| 字段 | 说明 |
|---|---|
messages | 当前仍按原文保留的轮次(已被压缩的旧轮不在此,在 summary 里) |
summary | 滚动摘要(没发生过压缩时为空串) |
count | messages 条数 |
- 从未用过的
session_id→200+{"messages":[],"summary":"","count":0}(不报 404); - 无 / 错 key → 401(与
/v1/agent同口径,防枚举); - 历史里绝不含任何 key 或 base64 图片数据;
- 你只能读到自己租户的会话——拿别人的
session_id来读,得到的也只是你自己租户里同名(通常是空的)会话。
已知限制:
session_id含/、%等需要 URL 编码的特殊字符时,读写两侧编码处理不对称,可能读不回。建议session_id只用字母、数字、-、_。
列出 / 删除会话
会话是边缘 Durable Object(每个 session_id 一个),平台另维护一份会话索引让你能列出 / 删除自己的会话。索引只含元数据,绝不含任何对话内容——要看内容仍走上面的历史 API。
列出会话
GET /v1/sessions — 列出本租户会话,按最后活跃时间倒序。Bearer 租户通用 key(App 级 / 设备 key → 403,最小权限)。
bash
curl "$BASE/v1/sessions?limit=50" \
-H "Authorization: Bearer $KEY"成功响应 200:
json
{
"sessions": [
{
"id": "user-42",
"turn_count": 7,
"first_at": "2026-06-13T02:10:00.000Z",
"last_at": "2026-06-13T04:25:13.000Z",
"app_id": null,
"device_id": null
}
]
}| 参数 | 说明 |
|---|---|
limit | 返回条数(默认 100,上限 500;非法值回落默认) |
since | 只返回 last_at 不早于此刻的会话(ISO 8601) |
| 字段 | 说明 |
|---|---|
id | session_id(匿名请求落到 anon) |
turn_count | 累计对话轮数 |
first_at / last_at | 首次出现 / 最后活跃时刻(ISO 8601 UTC) |
app_id / device_id | 末次该会话请求所用 key 的归属(通用 key 为 null) |
/v1/sessions(列表)与/v1/sessions/:id/history(读历史)是两个不同端点,互不冲突。
注:会话进列表靠对话时的尽力而为埋点(与计费同位点)。极偶发埋点失败不影响对话本身,只是该会话可能短时不在列表里——下次对话即补上。
删除会话
DELETE /v1/sessions/:id — 删一个会话:清除它的全部记忆(逐轮历史 + 摘要)并从索引移除。Bearer 租户通用 key(App 级 / 设备 key → 403)。
bash
curl -X DELETE "$BASE/v1/sessions/user-42" \
-H "Authorization: Bearer $KEY"成功响应 200:{"id":"user-42","deleted":true}
- 幂等:会话不存在也回
200{deleted:true}(重复删、删不存在的都安全); - 删后:
/v1/sessions/:id/history读到空(count:0)、列表不再含它; - 隔离:你只能删自己租户的会话(寻址按租户命名空间 + 索引行按租户过滤,两层);
- 这是真正的「清空对话 / 清记忆」——用户隐私诉求(忘掉我说过的话)由此满足。
控制台「观测 · 会话」页提供同样的列出 / 查看历史 / 删除(确认后执行),无需写代码。
实践建议
- 一个用户一个稳定
session_id(如user-42),多设备共享记忆;一次性任务用随机 id,用完即弃; - 「清空对话 / 清记忆」有两种:① 换一个新
session_id(旧会话仍在,只是不再用);②DELETE /v1/sessions/:id(真删旧会话的记忆,隐私诉求选这个); - 审计 / 回放 / 数据导出,用历史 API 拉取即可;盘点有哪些会话用列表 API。