项目级记忆系统提供基于文件(AGENTS.md)的结构化记忆存储,用于跨会话保持项目上下文。
pkg/memory/project/
├── types.go # 类型定义
├── store.go # Store 接口
└── file_store.go # AGENTS.md 文件存储实现
// ProjectMemory 项目记忆
type ProjectMemory struct {
ProjectID string // 项目 ID
Title string // 项目标题
Description string // 项目描述
Sections map[string]*Section // 章节
Metadata map[string]any // 元数据
CreatedAt time.Time
UpdatedAt time.Time
}
// Section 章节(如「用户偏好」「关键选择」)
type Section struct {
Name string
Protected bool // 是否受保护(不自动清理)
Entries []*Entry
}
// Entry 条目
type Entry struct {
Timestamp time.Time
Category string // 分类标签
Content string
Source string // 来源(dialog/tool/system)
Metadata map[string]any
}
import "github.com/astercloud/aster/pkg/memory/project"
// 创建文件存储
store := project.NewFileStore(&project.StoreConfig{
BasePath: "workspaces", // 项目基础路径
FileName: "AGENTS.md", // 记忆文件名
})
ctx := context.Background()
// 追加用户偏好
err := store.AppendEntry(ctx, projectID, project.SectionPreferences, &project.Entry{
Category: "style",
Content: "用户希望轻松幽默的风格",
Source: "dialog",
})
// 追加关键选择
err = store.AppendEntry(ctx, projectID, project.SectionChoices, &project.Entry{
Category: "topic",
Content: "[选题确认] 选择了「AI 时代的写作革命」",
Source: "workflow",
})
err := store.UpdateWorkflowStatus(ctx, projectID, &project.WorkflowStep{
Step: "选题确认",
Status: "completed",
Timestamp: time.Now(),
})
// 获取摘要用于注入 AI 上下文
summary, err := store.GetSummary(ctx, projectID)
// 返回格式化的 Markdown 摘要
const (
SectionPreferences = "用户偏好" // 自动提取的用户偏好
SectionChoices = "关键选择" // 用户的选项选择记录
SectionWorkflow = "工作流状态" // 当前进度追踪
SectionParams = "生成参数" // 每次生成的参数快照
)
# 项目名称
## 项目信息
- **创建时间**: 2024-12-08
- **项目类型**: 长篇小说
## 用户偏好 [protected]
<!-- 自动从对话中提取,检测关键词:想要、希望、喜欢、必须、不要等 -->
- 2024-12-08 10:30: [style] 用户希望轻松幽默的风格
- 2024-12-08 11:15: [constraint] 不要使用网络流行语
## 关键选择 [protected]
<!-- 记录用户在工作流中的选项选择 -->
- 2024-12-08 10:35: [选题确认] 选择了「AI 时代的写作革命」
## 工作流状态
| 步骤 | 状态 | 时间 |
|------|------|------|
| 选题确认 | ✅ 完成 | 2024-12-08 10:35 |
| 大纲生成 | 🔄 进行中 | 2024-12-08 11:00 |
## 生成参数
### 2024-12-08 11:00 生成
- **模型**: gpt-4
- **温度**: 0.7
- **最大长度**: 2000
import (
"github.com/astercloud/aster/pkg/memory/project"
"github.com/astercloud/aster/pkg/memory/dialog"
)
store := project.NewFileStore(config)
extractor := dialog.NewExtractor(dialog.WritingStyleKeywords(), nil)
// 从对话中提取并保存
prefs := extractor.Extract(userMessage)
for _, pref := range prefs {
store.AppendEntry(ctx, projectID, project.SectionPreferences, &project.Entry{
Category: string(pref.Category),
Content: pref.Content,
Source: "dialog",
})
}
[protected] 标记重要章节 - 防止自动清理误删