- 模块名重命名 yunshu -> hub.gaomia.site/titor/YunShu - Go 版本升级 1.21 -> 1.25 - src/ 目录删除,所有文件移至根目录 - 新增 pkg/mdprint/: Markdown AST 解析+ANSI 渲染 - 新增 pkg/style/: 终端颜色样式(8色 ANSI + 24位真彩色) - 新增 pkg/termui/: 终端输入组件(交互式输入/密码/确认) - 更新文档:AGENTS.md、architecture.md、changelog.md、taolun.md - gitignore 通配符修复 yunshu.exe -> yunshu.exe*
105 lines
2.1 KiB
Go
105 lines
2.1 KiB
Go
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
|
|
}
|
|
}
|
|
}
|