mirror of
				https://github.com/discourse/discourse-ai.git
				synced 2025-11-03 16:08:52 +00:00 
			
		
		
		
	previously you would have to wait quite a while to see the prompt this implements a very basic implementation of progress so you can see the API is working. Also: - Fix google progress. - Handle the incredibly rare, zero results from google. - Simplify command so it is less error prone - replace invoke and attache results with a invoke - ensure invoke can only ever be run once - pass in all the information a command needs in constructor - use new pattern throughout - test invocation in isolation
		
			
				
	
	
		
			81 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
#frozen_string_literal: true
 | 
						|
 | 
						|
module DiscourseAi::AiBot::Commands
 | 
						|
  class GoogleCommand < Command
 | 
						|
    class << self
 | 
						|
      def name
 | 
						|
        "google"
 | 
						|
      end
 | 
						|
 | 
						|
      def desc
 | 
						|
        "Will search using Google - global internet search (supports all Google search operators)"
 | 
						|
      end
 | 
						|
 | 
						|
      def parameters
 | 
						|
        [
 | 
						|
          Parameter.new(
 | 
						|
            name: "query",
 | 
						|
            description: "The search query",
 | 
						|
            type: "string",
 | 
						|
            required: true,
 | 
						|
          ),
 | 
						|
        ]
 | 
						|
      end
 | 
						|
 | 
						|
      def custom_system_message
 | 
						|
        "You were trained on OLD data, lean on search to get up to date information from the web"
 | 
						|
      end
 | 
						|
    end
 | 
						|
 | 
						|
    def result_name
 | 
						|
      "results"
 | 
						|
    end
 | 
						|
 | 
						|
    def description_args
 | 
						|
      {
 | 
						|
        count: @last_num_results || 0,
 | 
						|
        query: @last_query || "",
 | 
						|
        url: "https://google.com/search?q=#{CGI.escape(@last_query || "")}",
 | 
						|
      }
 | 
						|
    end
 | 
						|
 | 
						|
    def process(query:)
 | 
						|
      @last_query = query
 | 
						|
 | 
						|
      show_progress(localized_description)
 | 
						|
 | 
						|
      api_key = SiteSetting.ai_google_custom_search_api_key
 | 
						|
      cx = SiteSetting.ai_google_custom_search_cx
 | 
						|
      query = CGI.escape(query)
 | 
						|
      uri =
 | 
						|
        URI("https://www.googleapis.com/customsearch/v1?key=#{api_key}&cx=#{cx}&q=#{query}&num=10")
 | 
						|
      body = Net::HTTP.get(uri)
 | 
						|
 | 
						|
      parse_search_json(body, query)
 | 
						|
    end
 | 
						|
 | 
						|
    def minimize_field(result, field, max_tokens: 100)
 | 
						|
      data = result[field].squish
 | 
						|
      data = ::DiscourseAi::Tokenizer::BertTokenizer.truncate(data, max_tokens).squish
 | 
						|
      data
 | 
						|
    end
 | 
						|
 | 
						|
    def parse_search_json(json_data, query)
 | 
						|
      parsed = JSON.parse(json_data)
 | 
						|
      results = parsed["items"]
 | 
						|
 | 
						|
      @last_num_results = parsed.dig("searchInformation", "totalResults").to_i
 | 
						|
 | 
						|
      format_results(results, args: query) do |result|
 | 
						|
        {
 | 
						|
          title: minimize_field(result, "title"),
 | 
						|
          link: minimize_field(result, "link"),
 | 
						|
          snippet: minimize_field(result, "snippet", max_tokens: 120),
 | 
						|
          displayLink: minimize_field(result, "displayLink"),
 | 
						|
          formattedUrl: minimize_field(result, "formattedUrl"),
 | 
						|
        }
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 |