Kimi Code CLI Web 接口详解:UpdateSessionRequest 会话更新请求模型与 PATCH 端点实战
2026/9/15 13:31:19 网站建设 项目流程

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)

字段名类型含义
titlestring会话的新标题(重命名)
archivedboolean是否归档会话(归档/取消归档)

这一描述在源码中得到精确印证。前端生成的 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")

从源码结构看,titlemin_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-Typeapplication/json
Acceptapplication/json
成功响应200,返回更新后的 Session 对象
失败响应422(参数校验失败)

PATCH语义在这里体现为部分更新:请求体中只出现titlearchived之一,未提供的字段保持不变。前端生成的 API 客户端(见 web/src/lib/api/apis/SessionsApi.ts)会校验sessionIdupdateSessionRequest均为必填,再将请求体经UpdateSessionRequestToJSON序列化后发送。

后端处理链路:从请求到会话状态落盘

理解该请求模型的关键在于后端如何消费它。核心实现在 src/kimi_cli/web/api/sessions.py 的update_session路由函数中,处理流程清晰分为四步:

  1. 获取可编辑会话:调用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."——即运行中的会话不能被重命名或归档,这是必须遵守的使用前提。

  2. 加载会话状态:通过load_session_state(session_dir)读取会话目录下的state.json(状态文件名定义于 src/kimi_cli/session_state.py)。

  3. 按字段分支更新

    • 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模型中(archivedarchived_atauto_archive_exempt)。
  4. 落盘与刷新save_session_state(state, session_dir)原子写入(底层使用atomic_json_write,见 src/kimi_cli/session_state.py),随后invalidate_sessions_cache()使缓存失效,最后重新加载会话并返回更新后的Session对象;若重新加载失败则返回 500。

更新后的 Session 响应结构

成功响应是 Session 对象,其字段如下:

字段名类型含义
sessionIdstring会话唯一 ID
titlestring会话标题(由 kimi-cli 历史推导)
lastUpdatedDate最后更新时间
isRunningboolean会话是否运行中
statusSessionStatus会话运行时状态
workDirstring会话工作目录
sessionDirstring会话目录路径
archivedboolean是否已归档

其中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,因此重命名/归档前需确认会话已停止。
  • 字段可空、可部分更新titlearchived均为可选,后端以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.jsonSessionState,前端在 web/src/hooks/useSessions.ts 中驱动界面状态迁移。掌握该模型的字段语义与后端处理规则,即可在自己的客户端中安全、正确地实现会话管理功能。

【免费下载链接】kimi-cliKimi Code CLI is your next CLI agent.项目地址: https://gitcode.com/GitHub_Trending/ki/kimi-cli

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询