跳到正文
FunCoding

搜索

搜索文档、Skill 和 MCP

会话恢复、断开与删除

创建可恢复会话,补齐恢复配置,并按业务保留策略清理状态。

需要跨客户端重启恢复工作时,为会话指定应用管理的 sessionId,保存其归属和状态位置,随后用 resumeSession 恢复。

const session = await client.createSession({
    sessionId: "user-123-task-456",
    model: "auto",
});
await session.sendAndWait({ prompt: "Analyze my codebase" });
await session.disconnect();

const resumed = await client.resumeSession("user-123-task-456");
await resumed.sendAndWait({ prompt: "What did we discuss earlier?" });

持久化教程把显式 ID 作为其可恢复流程前提,未指定时使用随机 ID 并按临时会话描述;这里不据此推断所有 runtime 版本的随机 ID 都不会产生磁盘文件。

保存什么

默认目录为 ~/.copilot/session-state/{sessionId}/,配置 COPILOT_HOME 或 sessionFs 时按实际存储定位。保存内容包括会话历史、工具结果、规划状态和会话资料;内存中的工具状态不会自动持久化,工具需无状态设计或维护自己的存储。

BYOK provider/API key 不写入会话磁盘,恢复时必须重新提供 provider 配置。该教程中的旧 Azure 示例使用 endpoint、deploymentId,而当前 ProviderConfig 参考使用 baseUrl 与会话 model;应按BYOK 参考配置,不混用旧字段。

恢复时可调整的设置

resumeSession 可调整模型、系统消息、工具允许/拒绝列表、provider、reasoning effort、streaming、工作目录、配置目录、MCP、自定义角色、预选 agent、Skill 目录和 infiniteSessions。

恢复多用户会话时也要重新提供适用的会话身份并校验归属。Auto tier 与 Responses transport 的特殊规则见恢复模型配置。

生命周期操作

操作结果
client.listSessions()列出会话,可传 { repository: "owner/repo" } 筛选
session.disconnect()释放内存资源,保留磁盘数据供恢复
client.deleteSession(sessionId)永久删除历史、规划与资料,不可恢复

旧 destroy() 已弃用,官方建议迁移到 disconnect。TypeScript 可使用 await using,Python 使用 async context manager,.NET 使用 IAsyncDisposable,Go 使用 defer,具体写法按语言 API。

空闲与长会话

默认没有 idle timeout;sessionIdleTimeoutSeconds 省略或设 0 表示关闭。该 client 选项仅控制 SDK 启动的 runtime,外部服务使用其自身 timeout。正在执行命令或后台 agent 的会话受保护,不因空闲清理设置而直接删除活动工作。

教程的 idle 示例访问 event.idleDurationMs,当前事件参考仅给出 data.aborted,未列出该字段。本页不以它实现计时,应按当前 SDK 类型和应用自己的活动记录处理。

infiniteSessions 的 backgroundCompactionThreshold: 0.80 与 bufferExhaustionThreshold: 0.95 是官方长会话示例的上下文比例,不是 token 数,也不是存储持久性保证。其作用是压缩和必要时等待,不替代持久卷。

部署边界

容器迁移需要保留对应会话存储;同一 session 的并发写入需要应用锁或队列。结构化 ID 有助审计,但应在服务端保存 owner 元数据并验证,不能仅解析用户传入 ID 作为授权。参见扩展与存储。