kimi-code/docs/zh/guides/sessions.md
Kai 65d30177ad
feat(agent-core): record llm request trace in wire.jsonl (#1448)
* feat(agent-core): record llm request trace in wire.jsonl

Add three observability record types so every request sent to the model
can be reconstructed from the wire log at the logical-request level:

- llm.tools_snapshot: content-addressed snapshot of the top-level tools
  table as sent (post deferred-strip), written once per unique table
- llm.request: one record per outbound request (retries, strict resends,
  and compaction rounds included) carrying the effective request params
  and hash links to the system prompt and tools snapshot
- mcp.tools_discovered: the server's verbatim tools/list result plus the
  agent's gating (allow-list, collisions), deduplicated by content hash

Observability records never feed state rebuild; replay only restores the
write-dedup cursors. The records/types.ts contract now documents the two
record classes explicitly (persisted is not the same as replayed).

Recording happens at the single Agent.generate choke point. The
LLMRequestLogFields side channel gains kind/projection/maxTokens/
droppedCount, chatWithRetry preserves caller-set fields, and compaction
tags its requests. The vis wire view renders the new record kinds.

* fix(agent-core): record the provider-clamped completion cap in the request trace

The llm.request trace recorded the client-requested budget cap, but
chat-completions providers tighten the actual wire value inside
withMaxCompletionTokens (remaining-context sizing, transport ceilings,
model-default resolution) — with the default budget the clamp is active
on nearly every non-empty-context request, so the recorded value did not
match what was sent.

Providers now expose the effective cap they computed as a readonly
maxCompletionTokens field on the clone, and the recorder reads it from
the effective provider at the Agent.generate choke point. This replaces
the side-channel recomputation, which is removed along with the
appliedCompletionBudgetCap helper.

* fix(agent-core): park pre-replay MCP discovery records and hash the collision outcome

Two wire-hygiene fixes for the mcp.tools_discovered trace:

Parking: the real Session ordering connects MCP servers concurrently with
agent construction, so ToolManager can observe a connected server before
agent.resume() has replayed the wire. Recording at that point bypassed
the restored dedup cursor (duplicating a 1-50KB record on every resume)
and appended a stray metadata record ahead of replay. AgentRecords now
exposes a one-shot opened latch — set when replay completes (after the
migration rewrite flushes) or when the first live record is logged — and
ToolManager parks discoveries until then, re-running the dedup check at
drain time. A frozen range-limited replay never opens; those agents are
transient previews.

Collision hashing: the dedup hash now covers the collision outcome, not
just the raw list and allow-list. Collisions depend on which other
servers hold a sanitized qualified name at registration time, so a
server can re-register with identical tools but a flipped outcome; that
gating change must produce a new record instead of being suppressed.

* fix(agent-core): skip the request trace for pre-flight-aborted calls

Mirror kosong generate()'s pre-flight abort check at the Agent.generate
choke point: a call whose signal is already aborted never reaches the
wire (generate throws before dispatching), so it must not leave an
llm.request/llm.tools_snapshot trace or a diagnostic log line claiming a
request was sent. Recording stays before dispatch for every call that
passes the gate, preserving the crash-safety of the trace.

* chore(agent-core): remove a leftover adaptive-thinking override hook

The adaptiveThinkingOverride option was a temporary local hook explicitly
marked for removal before commit. Nothing passes it, so resolution falls
back to the alias-level adaptiveThinking value in all cases; drop the
option and the dead indirection.

* fix(kosong): derive the exposed completion cap from generation kwargs

maxCompletionTokens was a field stored only by withMaxCompletionTokens,
so caps that reach the wire through other paths were invisible to the
request trace: with completion budgeting disabled via env, Anthropic
still sends the constructor-resolved max_tokens (required by the
Messages API), and constructor-level kwargs like OpenAILegacyOptions
maxTokens were likewise unreported.

Replace the stored field with a getter derived from each provider's
generation kwargs — the single source the request body reads — covering
constructor defaults, direct withGenerationKwargs configuration, and
budget application in one place. Kimi mirrors its request-time legacy
max_tokens alias normalization; openai-legacy reuses the same
normalizeGenerationKwargs the request path uses.

* feat(agent-core): add thinkingKeep passthrough for Kimi providers and update tests
2026-07-07 14:09:19 +08:00

3.8 KiB
Raw Blame History

会话与上下文

Kimi Code CLI 把每次对话持久化为一个「会话」,保留消息历史和元数据,可以随时关闭终端后再回来继续。本页介绍如何恢复会话、管理上下文,以及导出和派生会话。

会话存储

所有会话保存在 $KIMI_CODE_HOME/sessions/ 下(默认 ~/.kimi-code/sessions/),按工作目录分组存放:

~/.kimi-code/
├── config.toml
├── session_index.jsonl
└── sessions/
    └── <workDirKey>/
        └── <sessionId>/
            ├── state.json
            └── agents/
                ├── main/
                │   └── wire.jsonl
                └── <subagentId>/
                    └── wire.jsonl
  • state.json:会话标题、创建时间等元数据。
  • agents/*/wire.jsonlAgent 事件流,用于会话恢复和回放;同时记录发给模型的请求轨迹(工具 schema、请求参数、MCP 工具清单),便于调试。

::: warning 注意 sessions/ 目录下的文件请勿手动编辑,否则可能导致会话无法正常恢复。 :::

启动与恢复会话

每次直接运行 kimi 都会创建新会话。以下方式可以恢复历史会话:

继续当前目录最近的会话:

kimi --continue

恢复指定会话(通过 ID

kimi --session abc123

交互式浏览历史会话并选择:

kimi --session

::: warning 注意 --continue--session 互斥。 :::

在 TUI 中切换会话

不离开当前终端也可以管理会话,以下斜杠命令仅在 Agent 空闲时可用:

  • /new(别名 /clear):切换到新会话,丢弃当前上下文。
  • /sessions(别名 /resume):浏览并恢复历史会话。
  • /fork:派生当前会话(详见下文)。
  • /title <text>(别名 /rename):设置会话标题方便识别;不带参数时显示当前标题。

上下文压缩

对话变长时Kimi Code CLI 会在上下文接近窗口上限时自动压缩历史消息,释放 token 空间。也可以随时手动触发:

/compact

压缩时可以附带指引,告诉模型优先保留哪些信息:

/compact 保留与数据库迁移相关的讨论

派生会话

想在不破坏当前对话的前提下尝试新思路,使用 /fork

/fork

派生后的两个会话彼此独立,互不影响,可以随时通过 /sessions 切回原来的会话。已保存的 /goal 不会复制到派生会话。如果你想在派生会话中进行自主 goal 工作,需要在那里开始一个新 goal。

导出会话

kimi export 把会话打包为 ZIP适合分享、归档或提交问题反馈

kimi export <sessionId>

不传 sessionId 时导出当前目录最近的会话(有交互式确认,加 -y 跳过)。用 -o 指定输出路径:

kimi export <sessionId> -o ~/Desktop/my-session.zip

导出包含会话目录下的所有文件,包括诊断日志。全局诊断日志(~/.kimi-code/logs/kimi-code.log)默认也会打包;如不需要,加 --no-include-global-log 排除。

也可以在 TUI 内导出,无需离开交互界面:

  • /export-debug-zip:产生与 kimi export 相同的调试 ZIP。
  • /export-md(别名 /export):导出为人类可读的 Markdown 对话记录,适合分享或存档。可选接收路径参数;不带参数时写入工作目录下的 kimi-export-<short-id>-<timestamp>.md

::: tip 提示 导出文件可能包含代码、命令输出和路径等敏感信息,分享前请先确认内容。 :::

下一步

  • 数据路径 — 会话文件的完整目录结构说明
  • kimi 命令--continue--sessionexport 等命令的完整参数参考