v1.7 Session 会话机制 + 多工作区隔离 + Reporter 抽象

This commit is contained in:
zhuyongxin
2026-05-29 14:09:12 +08:00
parent 3e91c7d0a1
commit e480c5c55e
6 changed files with 424 additions and 120 deletions
+51 -26
View File
@@ -4,16 +4,17 @@ import (
"context"
"log"
"os"
"sync"
"time"
"go-tiny-claw/internal/engine"
"go-tiny-claw/internal/provider"
"go-tiny-claw/internal/schema"
"go-tiny-claw/internal/tools"
)
func main() {
workDir, _ := os.Getwd()
// 1. 初始化真实的 Provider大脑
// 这里你可以任意切换 NewZhipuClaudeProvider 或 NewZhipuOpenAIProvider,效果完全一致!
llmProvider := provider.DeepseekOpenAIProvider("deepseek-v4-flash")
@@ -21,34 +22,58 @@ func main() {
registry := tools.NewRegistry()
// 挂载工具全家桶
registry.Register(tools.NewReadFileTool(workDir))
registry.Register(tools.NewWriteFileTool(workDir))
registry.Register(tools.NewBashTool(workDir))
registry.Register(tools.NewEditFileTool(workDir))
registry.Register(tools.NewReadSkillTool(workDir))
// registry.Register(tools.NewReadFileTool(workDir))
// registry.Register(tools.NewWriteFileTool(workDir))
// registry.Register(tools.NewBashTool(workDir))
// registry.Register(tools.NewEditFileTool(workDir))
// registry.Register(tools.NewReadSkillTool(workDir))
workDir, _ := os.Getwd()
registry.Register(tools.NewReadFileTool(workDir + "/tmp/project_front"))
// 实例化引擎,开启 EnableThinking = true
eng := engine.NewAgentEngine(llmProvider, registry, workDir, false)
eng := engine.NewAgentEngine(llmProvider, registry, false)
reporter := engine.NewTerminalReporter()
// 发起一个需要局部修改的指令
//prompt := `
//我当前目录下有一个 server.go 文件。
//请帮我把里面 "TODO: 增加鉴权逻辑" 下面的那个 if 语句,整个替换为:
//if user == nil {
// fmt.Println("Forbidden!")
// return
//}
//`
var wg sync.WaitGroup
//prompt := `
//我当前目录下有 a.txt, b.txt, c.txt 三个文件。
//为了节省时间,请你同时一次性读取这三个文件,并将它们的内容综合起来,告诉我它们分别记录了什么领域的信息。
//`
// ================= 模拟并发场景 1:飞书前端群 =================
wg.Add(1)
go func() {
defer wg.Done()
sessionA := engine.GlobalSessionMgr.GetOrCreate("chat_front_001", workDir+"/tmp/project_front")
prompt := `我需要在当前目录下新建一个 ping.go,提供一个简单的 http ping 接口。写完之后,帮我把代码用 git 提交一下。`
// 回合 1:获取机密
log.Println("\n>>> 🙋‍♂️ [Session A / Turn 1]: 帮我看看 README.md 里记录了什么密钥?我的操作系统是windows")
sessionA.Append(schema.Message{Role: schema.RoleUser, Content: "帮我看看 README.md 里记录了什么密钥?"})
_ = eng.Run(context.Background(), sessionA, reporter)
err := eng.Run(context.Background(), prompt)
if err != nil {
log.Fatalf("引擎运行崩溃: %v", err)
}
// 故意制造大量“废话”对话,刷掉记忆 (假设 Working Memory Limit=6)
for i := 0; i < 6; i++ {
sessionA.Append(schema.Message{Role: schema.RoleUser, Content: "这只是一句闲聊占位符。"})
sessionA.Append(schema.Message{Role: schema.RoleAssistant, Content: "好的,收到闲聊。"})
}
// 回合 2:验证记忆截断 (此时第一轮的密钥已经被挤出 Working Memory 了!)
log.Println("\n>>> 🙋‍♂️ [Session A / Turn 2]: 请直接告诉我,刚才第一轮你查到的那个密钥是什么?")
sessionA.Append(schema.Message{Role: schema.RoleUser, Content: "请直接告诉我,刚才第一轮你查到的那个密钥是什么?不准调用工具!"})
_ = eng.Run(context.Background(), sessionA, reporter)
}()
// ================= 模拟并发场景 2:飞书后端群 =================
wg.Add(1)
go func() {
defer wg.Done()
// 稍微错开一点时间发起请求
time.Sleep(1 * time.Second)
sessionB := engine.GlobalSessionMgr.GetOrCreate("chat_back_002", workDir+"/tmp/project_back")
log.Println("\n>>> 🙋‍♂️ [Session B]: 别人查到了一个密钥,你这里能看到吗?")
sessionB.Append(schema.Message{Role: schema.RoleUser, Content: "别人查到了一个密钥,你这里能看到吗?不准调用工具!"})
_ = eng.Run(context.Background(), sessionB, reporter)
}()
wg.Wait()
}