init: 云枢·Agent 初始提交
This commit is contained in:
101
src/runtime.go
Normal file
101
src/runtime.go
Normal file
@@ -0,0 +1,101 @@
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user