---
title: "会话"
description: "会话的存储、工作区绑定与导出。"
---

会话把一次工作过程完整留住：对话、工具调用、产物与用量统计都归属到同一个会话下。

## 会话里存什么

每个会话存进 SQLite（`.bi/bi.db`）的 `user_sessions` 表，字段包括：

- `id` — 会话 id
- `title` — 标题；新建时缺省为「新对话」，可改名
- `created_at` / `updated_at` — 创建与最近更新时间
- `project_path` — **会话专属的工作区根目录**
- `pinned` — 是否置顶

对话内容存在 `user_messages` 表：每条消息含角色、文本内容、工具调用参数与结果、token 用量统计。**工具调用与结果会被保留**，包括 `read` 读到的文件内容、`write` 写入的内容、`exec` 的命令全文。

## 会话的工作区

每个会话可以绑定**独立的 `project_path`**。这意味着：

- 不同项目开不同会话，智能体只在该会话的根目录内活动
- 终端面板的工作目录同样取自会话的 `project_path`
- 未设置时会话回退到全局 `workspace`

这是「会话即项目上下文」的设计：同一个 Bi 进程里可以并行推进互不干扰的多个项目。

## 会话 API

所有会话端点都要求登录：

| 端点 | 方法 | 作用 |
| --- | --- | --- |
| `/api/user/sessions` | `GET` | 列出会话（含置顶、消息数、token 总量） |
| `/api/user/sessions` | `POST` | 新建会话（可带标题与 `project_path`） |
| `/api/user/sessions/{id}` | `GET` | 取单个会话 |
| `/api/user/sessions/{id}` | `PUT` | 改名 / 更新（截断或退回某一步也走这里） |
| `/api/user/sessions/{id}` | `DELETE` | 删除会话（级联删除其消息） |
| `/api/user/sessions/{id}/messages` | `POST` | 增量追加消息 |
| `/api/user/sessions/{id}/export` | `POST` | 导出为 Markdown |

## 导出为 Markdown

`export` 由后端渲染（数据库才是权威数据），把会话写成工作区 `对话/<日期>-<标题>-<id 前 8 位>.md`：

- 纯 Markdown，不含 HTML，可直接进 git、可被 AI 读取
- 包含用户提问、助手正文、思考过程（折叠）、工具调用与结果、权限请求、引用与错误
- 文件头部注明会话 id、消息数与创建/更新时间，页脚注明「只读快照，权威数据在数据库」

## 会话与上下文

模型每次请求看到的内容由[上下文管理](/zh/docs/advanced/context)决定：最近若干轮完整重建，更早的轮次做规则摘要。这不是会话级开关，而是每次打包时的统一行为。
