package main import ( "encoding/json" "fmt" "os" "path/filepath" "hub.gaomia.site/titor/YunShu/pkg/mdprint" ) func sessionPath() string { return filepath.Join(ConfigDir(), "session.json") } func ClearSession() { os.Remove(sessionPath()) } func LoadSession() []Message { data, err := os.ReadFile(sessionPath()) if err != nil { return nil } var messages []Message if err := json.Unmarshal(data, &messages); err != nil { return nil } return messages } func AppendToSession(msg Message) { messages := LoadSession() messages = append(messages, msg) data, err := json.MarshalIndent(messages, "", " ") if err != nil { return } os.WriteFile(sessionPath(), data, 0644) } func RunAgent(def *AgentDef, userInput string) error { messages := LoadSession() fullMessages := []Message{ {Role: RoleSystem, Content: def.SystemPrompt}, } fullMessages = append(fullMessages, messages...) fullMessages = append(fullMessages, Message{Role: RoleUser, Content: userInput}) AppendToSession(Message{Role: RoleUser, Content: userInput}) toolDefs := GetToolDefs(def.Tools) for { resp, err := CallLLM(fullMessages, toolDefs) if err != nil { return err } choice := resp.Choices[0] if len(choice.Message.ToolCalls) > 0 { assistantMsg := Message{ Role: RoleAssistant, ToolCalls: choice.Message.ToolCalls, } fullMessages = append(fullMessages, assistantMsg) AppendToSession(assistantMsg) for _, tc := range choice.Message.ToolCalls { result, err := ExecuteTool(tc) if err != nil { result = fmt.Sprintf("工具执行错误: %v", err) } toolMsg := Message{ Role: RoleTool, Content: result, ToolCallID: tc.ID, } fullMessages = append(fullMessages, toolMsg) AppendToSession(toolMsg) } } else { content := "" if choice.Message.Content != nil { content = *choice.Message.Content } assistantMsg := Message{ Role: RoleAssistant, Content: content, } fullMessages = append(fullMessages, assistantMsg) AppendToSession(assistantMsg) fmt.Println() mdprint.Print(content) return nil } } }