From a06cfd995f05782854844e51a71a656f70274f64 Mon Sep 17 00:00:00 2001 From: Grail Finder Date: Thu, 18 Dec 2025 11:53:07 +0300 Subject: Feat: add agent entity --- tools.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'tools.go') diff --git a/tools.go b/tools.go index d603507..e4af7ad 100644 --- a/tools.go +++ b/tools.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "gf-lt/agent" "gf-lt/extra" "gf-lt/models" "io" @@ -848,6 +849,29 @@ var fnMap = map[string]fnSig{ "todo_delete": todoDelete, } +// callToolWithAgent calls the tool and applies any registered agent. +func callToolWithAgent(name string, args map[string]string) []byte { + f, ok := fnMap[name] + if !ok { + return []byte(fmt.Sprintf("tool %s not found", name)) + } + raw := f(args) + if a := agent.Get(name); a != nil { + return a.Process(args, raw) + } + return raw +} + +// registerDefaultAgents registers default agents for formatting. +func registerDefaultAgents() { + agent.Register("websearch", agent.DefaultFormatter("websearch")) + agent.Register("read_url", agent.DefaultFormatter("read_url")) +} + +func init() { + registerDefaultAgents() +} + // openai style def var baseTools = []models.Tool{ // websearch -- cgit v1.2.3 From f779f039745f97f08f25967214d07716ce213326 Mon Sep 17 00:00:00 2001 From: Grail Finder Date: Fri, 19 Dec 2025 15:39:55 +0300 Subject: Enha: agent request builder --- tools.go | 52 ++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 40 insertions(+), 12 deletions(-) (limited to 'tools.go') diff --git a/tools.go b/tools.go index e4af7ad..49d8192 100644 --- a/tools.go +++ b/tools.go @@ -13,6 +13,7 @@ import ( "regexp" "strconv" "strings" + "sync" "time" ) @@ -126,7 +127,9 @@ under the topic: Adam's number is stored: After that you are free to respond to the user. ` - basicCard = &models.CharCard{ + webSearchSysPrompt = `Summarize the web search results, extracting key information and presenting a concise answer. Provide sources and URLs where relevant.` + readURLSysPrompt = `Extract and summarize the content from the webpage. Provide key information, main points, and any relevant details.` + basicCard = &models.CharCard{ SysPrompt: basicSysMsg, FirstMsg: defaultFirstMsg, Role: "", @@ -141,8 +144,43 @@ After that you are free to respond to the user. // sysMap = map[string]string{"basic_sys": basicSysMsg, "tool_sys": toolSysMsg} sysMap = map[string]*models.CharCard{"basic_sys": basicCard} sysLabels = []string{"basic_sys"} + + webAgentClient *agent.AgentClient + webAgentClientOnce sync.Once + webAgentsOnce sync.Once ) +// getWebAgentClient returns a singleton AgentClient for web agents. +func getWebAgentClient() *agent.AgentClient { + webAgentClientOnce.Do(func() { + if cfg == nil { + panic("cfg not initialized") + } + if logger == nil { + panic("logger not initialized") + } + getToken := func() string { + if chunkParser == nil { + return "" + } + return chunkParser.GetToken() + } + webAgentClient = agent.NewAgentClient(cfg, *logger, getToken) + }) + return webAgentClient +} + +// registerWebAgents registers WebAgentB instances for websearch and read_url tools. +func registerWebAgents() { + webAgentsOnce.Do(func() { + client := getWebAgentClient() + // Register websearch agent + agent.Register("websearch", agent.NewWebAgentB(client, webSearchSysPrompt)) + // Register read_url agent + agent.Register("read_url", agent.NewWebAgentB(client, readURLSysPrompt)) + }) +} + // web search (depends on extra server) func websearch(args map[string]string) []byte { // make http request return bytes @@ -597,7 +635,6 @@ var globalTodoList = TodoList{ Items: []TodoItem{}, } - // Todo Management Tools func todoCreate(args map[string]string) []byte { task, ok := args["task"] @@ -851,6 +888,7 @@ var fnMap = map[string]fnSig{ // callToolWithAgent calls the tool and applies any registered agent. func callToolWithAgent(name string, args map[string]string) []byte { + registerWebAgents() f, ok := fnMap[name] if !ok { return []byte(fmt.Sprintf("tool %s not found", name)) @@ -862,16 +900,6 @@ func callToolWithAgent(name string, args map[string]string) []byte { return raw } -// registerDefaultAgents registers default agents for formatting. -func registerDefaultAgents() { - agent.Register("websearch", agent.DefaultFormatter("websearch")) - agent.Register("read_url", agent.DefaultFormatter("read_url")) -} - -func init() { - registerDefaultAgents() -} - // openai style def var baseTools = []models.Tool{ // websearch -- cgit v1.2.3