Kimi Code CLI Web 接口详解:UpdateSessionRequest 会话更新请求模型与 PATCH 端点实战
【免费下载链接】kimi-cliKimi Code CLI is your next CLI agent.项目地址: https://gitcode.com/GitHub_Trending/ki/kimi-cli
UpdateSessionRequest是 Kimi Code CLI Web 接口(kimi-cli web)中用于**更新会话(Session)**的请求体模型,对应PATCH /api/sessions/{session_id}端点。它仅暴露两个可选字段:title(重命名会话标题)与archived(归档/取消归档会话)。本文以 web/src/lib/api/docs/UpdateSessionRequest.md 为骨架,结合前后端源码与测试,完整讲解该模型的字段语义、请求方式、后端处理链路及前端调用实战,帮助你直接复用这套"重命名 + 归档"的会话管理能力。
UpdateSessionRequest 的定位与数据模型
在 Kimi Code CLI 的 Web 架构中,会话(Session)是用户与 CLI Agent 交互的载体,每个会话都有独立的标题、工作目录与运行状态。Web 前端(web/目录下的 React 应用)通过 REST API 管理这些会话,其中"更新会话"这一操作由UpdateSessionRequest定义请求载荷。
字段定义
原文档中给出的属性表如下,两个字段均为可选(Optional):
| 字段名 | 类型 | 含义 |
|---|---|---|
title | string | 会话的新标题(重命名) |
archived | boolean | 是否归档会话(归档/取消归档) |
这一描述在源码中得到精确印证。前端生成的 TypeScript 模型中,两个字段被声明为可空的可选类型(见 web/src/lib/api/models/UpdateSessionRequest.ts):
export interface UpdateSessionRequest { title?: string | null; archived?: boolean | null; }后端 Pydantic 模型(见 src/kimi_cli/web/models.py)则给出了更严格的约束——title最小长度 1、最大长度 200:
class UpdateSessionRequest(BaseModel): """Update session request.""" title: str | None = Field(default=None, min_length=1, max_length=200) archived: bool | None = Field(default=None, description="Archive or unarchive the session")从源码结构看,title的min_length=1意味着空字符串会被 Pydantic 拒绝(返回 422),max_length=200则限制了标题长度上限,这两条约束与前端表单校验共同保证了标题数据的合法性。
对应的 HTTP 端点:PATCH /api/sessions/{session_id}
UpdateSessionRequest只被一个端点消费:updateSessionApiSessionsSessionIdPatch,即PATCH /api/sessions/{session_id},其描述为 "Update a session (e.g., rename title or archive/unarchive)"(见 web/src/lib/api/docs/SessionsApi.md)。
端点请求特征如下:
| 项 | 值 |
|---|---|
| 方法 | PATCH |
| 路径 | /api/sessions/{session_id} |
| 路径参数 | session_id(string,UUID 格式) |
| 请求体 | UpdateSessionRequest(必填) |
| Content-Type | application/json |
| Accept | application/json |
| 成功响应 | 200,返回更新后的 Session 对象 |
| 失败响应 | 422(参数校验失败) |
PATCH语义在这里体现为部分更新:请求体中只出现title或archived之一,未提供的字段保持不变。前端生成的 API 客户端(见 web/src/lib/api/apis/SessionsApi.ts)会校验sessionId与updateSessionRequest均为必填,再将请求体经UpdateSessionRequestToJSON序列化后发送。
后端处理链路:从请求到会话状态落盘
理解该请求模型的关键在于后端如何消费它。核心实现在 src/kimi_cli/web/api/sessions.py 的update_session路由函数中,处理流程清晰分为四步:
获取可编辑会话:调用
get_editable_session(session_id, runner)校验会话存在且不忙。该函数(见 src/kimi_cli/web/api/sessions.py)在会话不存在时返回 404,在会话运行中(session_process.is_busy)返回 400,错误信息为"Session is busy. Please wait for it to complete before modifying."——即运行中的会话不能被重命名或归档,这是必须遵守的使用前提。加载会话状态:通过
load_session_state(session_dir)读取会话目录下的state.json(状态文件名定义于 src/kimi_cli/session_state.py)。按字段分支更新:
- 当
request.title is not None时,写入state.custom_title = request.title,并置state.title_generated = True——表示标题已被用户手动设定,后续 AI 自动生成标题逻辑(generate-title端点)将尊重该值不再覆盖(这一点由测试 tests/web/test_sessions_api.py 中的test_generate_title_preserves_concurrent_manual_title专门验证)。 - 当
request.archived is not None时,写入state.archived;若归档为True,同时记录archived_at = time.time()并清除自动归档豁免;若取消归档为False,则清空archived_at并设置auto_archive_exempt = True——从源码可推断,取消归档的会话会获得"自动归档豁免",避免被后台清理任务再次自动归档。这些字段均定义在 src/kimi_cli/session_state.py 的SessionState模型中(archived、archived_at、auto_archive_exempt)。
- 当
落盘与刷新:
save_session_state(state, session_dir)原子写入(底层使用atomic_json_write,见 src/kimi_cli/session_state.py),随后invalidate_sessions_cache()使缓存失效,最后重新加载会话并返回更新后的Session对象;若重新加载失败则返回 500。
更新后的 Session 响应结构
成功响应是 Session 对象,其字段如下:
| 字段名 | 类型 | 含义 |
|---|---|---|
sessionId | string | 会话唯一 ID |
title | string | 会话标题(由 kimi-cli 历史推导) |
lastUpdated | Date | 最后更新时间 |
isRunning | boolean | 会话是否运行中 |
status | SessionStatus | 会话运行时状态 |
workDir | string | 会话工作目录 |
sessionDir | string | 会话目录路径 |
archived | boolean | 是否已归档 |
其中archived字段与请求模型遥相呼应——前端拿到响应后,据此把会话在"活跃列表"与"归档列表"之间迁移(见 web/src/hooks/useSessions.ts)。
实战:三种调用方式
1. 原文档示例:TypeScript 类型声明与 JSON 转换
原文档给出的示例代码演示了UpdateSessionRequest的类型使用、JSON 序列化与反序列化闭环:
import type { UpdateSessionRequest } from '' // TODO: Update the object below with actual values const example = { "title": null, "archived": null, } satisfies UpdateSessionRequest console.log(example) // Convert the instance to a JSON string const exampleJSON: string = JSON.stringify(example) console.log(exampleJSON) // Parse the JSON string back to an object const exampleParsed = JSON.parse(exampleJSON) as UpdateSessionRequest console.log(exampleParsed)注意示例中两个字段均为null——发送{"title": null, "archived": null}时后端会跳过所有更新(因为两个is not None判断都不成立),因此实际使用时至少应携带一个有效字段。
2. 重命名会话
仅发送title字段:
PATCH /api/sessions/38400000-8cf0-11bd-b23e-10b96e4ef00d Content-Type: application/json { "title": "重构登录模块" }这是 Web 前端"重命名"按钮的实际行为。前端renameSession的实现(见 web/src/hooks/useSessions.ts)直接以PATCH请求发送JSON.stringify({ title }),成功后调用refreshSession刷新会话数据,失败时抛出data.detail中的后端错误信息并弹出 toast。
3. 归档与取消归档
仅发送archived字段:
PATCH /api/sessions/38400000-8cf0-11bd-b23e-10b96e4ef00d Content-Type: application/json { "archived": true }前端在批量归档、单个归档与恢复场景中均通过该方式操作(见 web/src/hooks/useSessions.ts),每次操作后会把会话在活跃列表与归档列表间迁移,并刷新归档列表。archived: true的会话会被GET /api/sessions/?archived=true查询过滤出来(查询语义见 src/kimi_cli/web/api/sessions.py 与 src/kimi_cli/web/store/sessions.py)。
使用注意事项与边界行为
- 运行中的会话不可更新:
get_editable_session会在is_busy时返回 400,因此重命名/归档前需确认会话已停止。 - 字段可空、可部分更新:
title与archived均为可选,后端以is not None判断是否更新对应字段;显式传null等价于"不更新"。 - 标题约束:
title长度须在 1~200 之间,空字符串会被 Pydantic 校验拦截返回 422。 - 手动标题优先:设置
title会同时置位title_generated,后续 AI 生成标题(POST /api/sessions/{session_id}/generate-title)会直接返回已设定的标题,不会覆盖用户手动输入。 - 归档的连带状态:归档会记录
archived_at并清除自动归档豁免;取消归档则清空archived_at并设置豁免,避免被自动归档任务(AUTO_ARCHIVE_DAYS逻辑见 src/kimi_cli/web/store/sessions.py)再次处理。 - 会话列表联动:更新后缓存被显式失效(
invalidate_sessions_cache),确保后续列表查询能立刻反映重命名与归档结果。
小结
UpdateSessionRequest虽然只有两个字段,却是 Kimi Code CLI Web 会话管理闭环中的关键一环:它通过PATCH /api/sessions/{session_id}以部分更新语义完成会话重命名与归档,后端在 src/kimi_cli/web/api/sessions.py 中将其持久化到state.json的SessionState,前端在 web/src/hooks/useSessions.ts 中驱动界面状态迁移。掌握该模型的字段语义与后端处理规则,即可在自己的客户端中安全、正确地实现会话管理功能。
【免费下载链接】kimi-cliKimi Code CLI is your next CLI agent.项目地址: https://gitcode.com/GitHub_Trending/ki/kimi-cli
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考