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 }