55 lines
1.6 KiB
Go
55 lines
1.6 KiB
Go
package agents
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
gollm "gitea.stevedudenhoeffer.com/steve/go-llm"
|
|
"strings"
|
|
)
|
|
|
|
var ErrNoSearchTerms = errors.New("no search terms")
|
|
|
|
// GenerateSearchTerms will create search terms for the given question.
|
|
// alreadySearched is a list of search terms that have already been used, and should not be used again.
|
|
func (a Agent) GenerateSearchTerms(ctx context.Context, question string, alreadySearched []string) (string, error) {
|
|
var res string
|
|
var cantFind bool
|
|
fnSearch := gollm.NewFunction(
|
|
"search_terms",
|
|
"search DuckDuckGo with these search terms for the given question",
|
|
func(ctx *gollm.Context, args struct {
|
|
SearchTerms string `description:"The search terms to use for the search"`
|
|
}) (any, error) {
|
|
res = args.SearchTerms
|
|
return "", nil
|
|
})
|
|
|
|
fnCantThinkOfAny := gollm.NewFunction(
|
|
"cant_think_of_any",
|
|
"tell the user that you cannot think of any search terms for the given question",
|
|
func(ctx *gollm.Context, args struct{}) (any, error) {
|
|
cantFind = true
|
|
return "", nil
|
|
})
|
|
|
|
var suffix string
|
|
if len(alreadySearched) > 0 {
|
|
suffix = "The following search terms have already been used, please avoid them: " + strings.Join(alreadySearched, ", ") + "\n"
|
|
}
|
|
|
|
_, err := a.WithSystemPrompt(`You are to generate search terms for a question using DuckDuckGo. The question will be provided by the user.`).
|
|
WithSystemPromptSuffix(suffix).
|
|
WithToolbox(gollm.NewToolBox(fnSearch, fnCantThinkOfAny)).
|
|
CallAndExecute(ctx, question)
|
|
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
if cantFind {
|
|
return "cannot think of any search terms", ErrNoSearchTerms
|
|
}
|
|
|
|
return res, nil
|
|
}
|