世界上有一种Agent,它每次醒来都像失忆了一样——不记得昨天生成了什么页面,不记得用户说过什么偏好。直到有一天,它学会了写日记。
—— 妙趣AI · 状态管理独白
Agent State Management(状态管理)是指AI Agent在运行过程中,对内部状态(如对话历史、用户偏好、任务进度、工具调用结果等)进行存储、读取、更新和持久化的能力。
类比:状态管理就像Agent的"工作笔记"——记下了当前做到哪一步、用户喜欢什么风格、上次任务的结果是什么。没有状态管理,每次对话都是"第一次见面"。
| 状态类型 | 生命周期 | 存储位置 | 示例 |
|---|---|---|---|
| 会话状态(Session State) | 单次对话 | 内存 | 当前对话历史、临时变量 |
| 用户状态(User State) | 跨会话 | 本地文件/数据库 | 用户偏好、历史任务 |
| 全局状态(Global State) | 永久 | 配置文件 | 系统设置、API Keys |
| 任务状态(Task State) | 任务执行期 | 内存+持久化 | 任务进度、中间结果 |
状态需要持久化的场景:
// 状态更新模式 1. 乐观更新:先更新内存,再异步持久化 2. 事务更新:持久化成功才算更新成功 3. 增量更新:只保存变化的部分,不覆盖整个状态 4. 版本控制:状态变更记录,支持回滚
妙趣AI使用Session State记录每轮cron任务的执行状态:
# Session State 结构(简化)
session_state = {
"sessionId": "217ff872-a73d-436e-bb65-4015d8ac7b6b",
"startTime": "2026-05-29T04:00:00Z",
"tasks": [
{
"taskId": "marketing-glossary-pages",
"status": "running",
"progress": 3, // 已生成3个页面
"total": 10,
"results": [...]
}
],
"context": {
"lastGeneratedTerm": "agent-state-management",
"sitemapEntries": 2064
}
}
OpenClaw通过USER.md和MEMORY.md管理用户状态:
# USER.md - 用户偏好状态
user:
name: "诗中"
preferences:
content_style: "妙趣风格" # 王家卫+周星驰
publish_channels: ["website", "xiaohongshu", "wechat"]
cron_schedule:
glossary: "20:00" # 每晚8点生成术语
news: "08:00" # 早8点新闻日报
# 每次任务执行时,Agent读取这些偏好
# 自动应用风格和内容渠道
批量生成术语页面时,如果中断可以从检查点恢复:
# 每完成一个页面,更新状态
for (let i = 0; i < terms.length; i++) {
// 检查是否有未完成的任务
if (state.completedTerms.includes(terms[i])) {
continue; // 跳过已完成的
}
await generatePage(terms[i]);
// 更新状态
state.completedTerms.push(terms[i]);
state.progress = i + 1;
await saveState(state); // 持久化
}
// Agent State Manager
class AgentState {
constructor(sessionId) {
this.sessionId = sessionId;
this.state = {
sessionId,
startTime: Date.now(),
tasks: {},
context: {},
history: []
};
}
// 获取状态
get(key) {
return this.state[key];
}
// 更新状态
set(key, value) {
this.state[key] = value;
this.notifyChange(key, value);
}
// 更新嵌套状态
updateContext(updates) {
Object.assign(this.state.context, updates);
}
// 添加历史记录
addHistory(entry) {
this.state.history.push({
timestamp: Date.now(),
...entry
});
}
// 持久化到文件
async save() {
const stateFile = `./state/${this.sessionId}.json`;
await fs.writeFile(stateFile, JSON.stringify(this.state, null, 2));
}
// 从文件恢复
static async load(sessionId) {
const stateFile = `./state/${sessionId}.json`;
if (await fileExists(stateFile)) {
const data = await fs.readFile(stateFile, 'utf8');
const agentState = new AgentState(sessionId);
agentState.state = JSON.parse(data);
return agentState;
}
return new AgentState(sessionId);
}
}
# openclaw.yaml - 状态管理配置
agent:
state:
persistence: true
store: "file" # 或 "database", "redis"
path: "./state"
# 自动保存触发条件
autosave:
afterToolCall: true # 工具调用后保存
afterMessage: false # 消息处理后不保存(性能考虑)
interval: 300000 # 每5分钟自动保存
# 状态清理
cleanup:
sessionTTL: 7d # 会话状态保留7天
archiveCompleted: true
// 跨会话共享用户状态
class UserState {
constructor(userId) {
this.userId = userId;
this.stateFile = `./users/${userId}/state.json`;
}
async getPreference(key) {
const state = await this.load();
return state.preferences?.[key];
}
async setPreference(key, value) {
const state = await this.load();
if (!state.preferences) state.preferences = {};
state.preferences[key] = value;
await this.save(state);
}
async load() {
if (await fileExists(this.stateFile)) {
return JSON.parse(await fs.readFile(this.stateFile, 'utf8'));
}
return { userId: this.userId, preferences: {}, history: [] };
}
async save(state) {
await fs.mkdir(path.dirname(this.stateFile), { recursive: true });
await fs.writeFile(this.stateFile, JSON.stringify(state, null, 2));
}
}
✅ DO(推荐做法)
⚠️ DON'T(常见坑)
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 内存状态 | 最快、最简单 | 重启丢失 | 临时变量、会话内状态 |
| 文件持久化 | 简单、可审计 | 并发差、性能低 | 单用户、低频更新 |
| 数据库 | 并发好、查询强 | 需要部署 | 多用户、高频更新 |
| Redis | 极快、支持过期 | 内存受限 | 缓存、临时状态 |
就像《九品芝麻官》里的包龙星——没有一本厚厚的状纸,怎么告得赢状。Agent State Management就是Agent的"状纸",记下了所有重要信息。好的状态管理,让你的Agent从"金鱼记忆"进化成"大象记忆"。记住:好记性不如烂笔头,状态管理就是Agent的笔头!