v1.7 Session 会话机制 + 多工作区隔离 + Reporter 抽象
This commit is contained in:
+51
-26
@@ -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()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user