| — | ||||||||
|---|---|---|---|---|---|---|---|---|
| OOM | 一次塞 150K token | 加載即峰值顯存 | 調用失敗、重試成本↑ | |||||
| 狀態丟失 | 多輪 Agent 中斷續傳 | session 無快照 | 重復推理、費用翻倍 |
結論:“能裝”≠“能管”——需要狀態管理框架把 256K 窗口當“硬盤”而非“內存”用。
| — | ||||||||
|---|---|---|---|---|---|---|---|---|
create_session |
新建長上下文會話 | 單賬號 ≤ 100 個 | 返回 session_id |
|||||
append_message |
增量寫 | 單次 ≤ 8K token | 支持流式 | |||||
truncate |
截斷頭部 | 保留 ≥ 4K | 自由設置 preserve_len |
|||||
snapshot |
生成快照 | 秒級完成 | 可回滾、可共享 | |||||
compress |
摘要壓縮 | 4→1 token 比例 | 基于“結構化摘要” |

觸發條件:累計 token > 180K(留 70K 余量)
快照內容:系統指令 + 工具描述 + 最近 3 輪(可調)
失敗回退:snapshot_ID 回滾,零重復推理
snap = client.sessions.snapshot.create(session_id=SESSION_ID,
preserve_len=8000)
SNAP_LIST.append(snap.snapshot_id)
client.sessions.truncate(session_id=SESSION_ID,
preserve_len=8000)
return reply
client = OpenAI(base_url="https://api.moonshot.cn/v1",
api_key="sk-xxx")
SESSION_ID = None
SNAP_LIST = []
# 保存 snapshot_id
def chat_round(user_input: str, max_keep=180_000):
global SESSION_ID, SNAP_LIST
# 1. 增量寫
stream = client.chat.completions.create(
model="kimi-k2-0905",
session_id=SESSION_ID,
messages=[{"role": "user", "content": user_input}],
max_tokens=4000,
temperature=0.2,
stream=True
)
reply = ""
for chunk in stream:
reply += chunk.choices[0].delta.content or ""
# 2. 檢查長度
usage = client.sessions.retrieve(session_id=SESSION_ID).usage
if usage.total_tokens > max_keep:
# 3. 快照 + 截斷
snap = client.sessions.snapshot.create(session_id=SESSION_ID,
preserve_len=8000)
SNAP_LIST.append(snap.snapshot_id)
client.sessions.truncate(session_id=SESSION_ID,
preserve_len=8000)
return reply
實測:
任務:連續 50 輪代碼重構 + 單測生成
總 token:224K
快照次數:2 次
重試 / 失敗:0
費用:比“無快照”方案↓ 37%(避免重復歷史計費)
POST /sessions/{id}/compress
{"ratio": 4, "format": "outline"}
session_id將“代碼規范、工具描述”抽成獨立片段
通過 append_message(role="system") 動態注入
復用率 > 60% 的提示不再重復上傳
| — | ||||||||
|---|---|---|---|---|---|---|---|---|
| 100 文件代碼審查 | 需 7 次調用 | 1 次完成 | ↓ 86 % 延遲 | |||||
| 50 輪 Agent 對話 | 重復上傳 42K | 零重復 | ↓ 39 % 成本 | |||||
| 4K 行日志分析 | 截斷后丟信息 | 完整讀取 | 準確率 ↑ 18 % |
結論:“裝得下”+“管得好”才釋放長上下文真正價值
[ ] 評估單任務最大 token → 設置 preserve_len 閾值
[ ] 開啟快照并保存 snapshot_id → 便于回滾 & 共享
[ ] 使用結構化摘要 → 壓縮冗余,提升 30 % 窗口壽命
[ ] 監控 usage.total_tokens → 觸發 truncate 前預留 20 % 余量
[ ] 多 Session 拆分獨立子任務 → 避免單點膨脹
session / snapshot / compress 接口提供滾動窗口+摘要+回滾三板斧,零重復推理即可管理超大上下文。現在就申請 Kimi 開放平臺 50 元免費額度,把本文的
rolling_snapshot.py跑一遍,體驗“一次上傳,全鏈路留在窗口”的絲滑!
Kimi K2-0905 Agent API實戰指南:Agentic Coding多模型任務優化