Files
YunShu/src/runtime.go

102 lines
2.0 KiB
Go
Raw Normal View History

2026-05-08 10:12:31 +08:00
package main
import (
"encoding/json"
"fmt"
"os"
"path/filepath"
)
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(content)
return nil
}
}
}