From f2c74e29e88e19c0b0861937af85095b871e4eef Mon Sep 17 00:00:00 2001 From: Ettore Di Giacinto Date: Fri, 5 Apr 2024 23:56:03 +0200 Subject: [PATCH] Add search internet --- Makefile | 5 ++- agent/options.go | 1 + example/webui/actions/search.go | 56 +++++++++++++++++++++------------ example/webui/main.go | 5 ++- go.mod | 3 ++ go.sum | 11 +++++++ 6 files changed, 59 insertions(+), 22 deletions(-) diff --git a/Makefile b/Makefile index 48c139c..a30ebba 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,7 @@ GOCMD=go tests: - $(GOCMD) run github.com/onsi/ginkgo/v2/ginkgo --fail-fast -v -r ./... \ No newline at end of file + $(GOCMD) run github.com/onsi/ginkgo/v2/ginkgo --fail-fast -v -r ./... + +webui: + cd example/webui && $(GOCMD) run ./ \ No newline at end of file diff --git a/agent/options.go b/agent/options.go index 4ab5beb..0f8f75a 100644 --- a/agent/options.go +++ b/agent/options.go @@ -34,6 +34,7 @@ type options struct { func defaultOptions() *options { return &options{ + periodicRuns: 15 * time.Minute, LLMAPI: llmOptions{ APIURL: "http://localhost:8080", Model: "echidna", diff --git a/example/webui/actions/search.go b/example/webui/actions/search.go index cbf502f..7230e28 100644 --- a/example/webui/actions/search.go +++ b/example/webui/actions/search.go @@ -1,39 +1,55 @@ -package action2 +package action import ( + "fmt" + "github.com/mudler/local-agent-framework/action" + "github.com/sap-nocops/duckduckgogo/client" "github.com/sashabaranov/go-openai/jsonschema" ) -// NewIntention creates a new intention action -// The inention action is special as it tries to identify -// a tool to use and a reasoning over to use it -func NewSearch(s ...string) *SearchAction { - return &SearchAction{tools: s} +func NewSearch() *SearchAction { + return &SearchAction{} } -type SearchAction struct { - tools []string -} +type SearchAction struct{} -func (a *SearchAction) Run(action.ActionParams) (string, error) { - return "no-op", nil +func (a *SearchAction) Run(params action.ActionParams) (string, error) { + result := struct { + Query string `json:"query"` + }{} + err := params.Unmarshal(&result) + if err != nil { + fmt.Printf("error: %v", err) + + return "", err + } + ddg := client.NewDuckDuckGoSearchClient() + res, err := ddg.SearchLimited(result.Query, 10) + if err != nil { + msg := fmt.Sprintf("error: %v", err) + fmt.Printf(msg) + return msg, err + } + + results := "" + for i, r := range res { + results += fmt.Sprintf("*********** RESULT %d\nurl: %s\ntitle: %s\nsnippet: %s\n", i, r.FormattedUrl, r.Title, r.Snippet) + } + + return results, nil } func (a *SearchAction) Definition() action.ActionDefinition { return action.ActionDefinition{ - Name: "intent", - Description: "detect user intent", + Name: "search_internet", + Description: "Search the internet for something.", Properties: map[string]jsonschema.Definition{ - "reasoning": { + "query": { Type: jsonschema.String, - Description: "A detailed reasoning on why you want to call this tool.", - }, - "tool": { - Type: jsonschema.String, - Enum: a.tools, + Description: "The query to search for.", }, }, - Required: []string{"tool", "reasoning"}, + Required: []string{"query"}, } } diff --git a/example/webui/main.go b/example/webui/main.go index c11860b..b36a90e 100644 --- a/example/webui/main.go +++ b/example/webui/main.go @@ -12,6 +12,8 @@ import ( "github.com/donseba/go-htmx" "github.com/donseba/go-htmx/sse" + actions "github.com/mudler/local-agent-framework/example/webui/actions" + . "github.com/mudler/local-agent-framework/agent" ) @@ -63,6 +65,7 @@ func main() { ) return true }), + WithActions(actions.NewSearch()), WithAgentResultCallback(func(state ActionState) { text := fmt.Sprintf(`Reasoning: %s Action taken: %+v @@ -123,7 +126,7 @@ func main() { // Server Sent Events mux.Handle("GET /sse", http.HandlerFunc(app.SSE)) - fmt.Print("Server started at :3210") + fmt.Print("Server started at http://localhost:3210") err = http.ListenAndServe(":3210", mux) log.Fatal(err) } diff --git a/go.mod b/go.mod index 8fe7362..8040f41 100644 --- a/go.mod +++ b/go.mod @@ -11,11 +11,14 @@ require ( ) require ( + github.com/PuerkitoBio/goquery v1.6.0 // indirect + github.com/andybalholm/cascadia v1.1.0 // indirect github.com/donseba/go-htmx v1.8.0 // indirect github.com/go-logr/logr v1.3.0 // indirect github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect + github.com/sap-nocops/duckduckgogo v0.0.0-20201102135645-176990152850 // indirect golang.org/x/net v0.19.0 // indirect golang.org/x/sys v0.15.0 // indirect golang.org/x/text v0.14.0 // indirect diff --git a/go.sum b/go.sum index 137f9da..1cdbed1 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,7 @@ +github.com/PuerkitoBio/goquery v1.6.0 h1:j7taAbelrdcsOlGeMenZxc2AWXD5fieT1/znArdnx94= +github.com/PuerkitoBio/goquery v1.6.0/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= +github.com/andybalholm/cascadia v1.1.0 h1:BuuO6sSfQNFRu1LppgbD25Hr2vLYW25JvxHs5zzsLTo= +github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -23,16 +27,23 @@ github.com/onsi/gomega v1.31.1 h1:KYppCUK+bUgAZwHOu7EXVBKyQA6ILvOESHkn/tgoqvo= github.com/onsi/gomega v1.31.1/go.mod h1:y40C95dwAD1Nz36SsEnxvfFe8FFfNxzI5eJ0EYGyAy0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/sap-nocops/duckduckgogo v0.0.0-20201102135645-176990152850 h1:DsVS3HK/t9X7ereJYMTiOeFSJWLOmrSG74CQhk2SlEs= +github.com/sap-nocops/duckduckgogo v0.0.0-20201102135645-176990152850/go.mod h1:ur7dCshjxoPKHtsZgtb6n5gpOmzQNRQ5AT+yOLwaJxM= github.com/sashabaranov/go-openai v1.18.3 h1:dspFGkmZbhjg1059KhqLYSV2GaCiRIn+bOu50TlXUq8= github.com/sashabaranov/go-openai v1.18.3/go.mod h1:lj5b/K+zjTSFxVLijLSTDZuP7adOgerWeFyZLUhAKRg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA=