From e3abbd9f4647c5824f15a0438ba1a90df1f21c85 Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 4 Sep 2023 12:05:27 +1000 Subject: [PATCH] FEATURE: add researcher persona (#181) The researcher persona has access to Google and can perform various internet research tasks. At the moment it can not read web pages, but that is under consideration --- config/locales/server.en.yml | 3 +++ config/settings.yml | 3 ++- lib/modules/ai_bot/entry_point.rb | 1 + lib/modules/ai_bot/personas/persona.rb | 1 + lib/modules/ai_bot/personas/researcher.rb | 26 +++++++++++++++++++ .../modules/ai_bot/personas/persona_spec.rb | 10 +++++++ .../ai_bot/personas/researcher_spec.rb | 11 ++++++++ 7 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 lib/modules/ai_bot/personas/researcher.rb create mode 100644 spec/lib/modules/ai_bot/personas/researcher_spec.rb diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 3c2104f4..2b5ec6b3 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -107,6 +107,9 @@ en: settings_explorer: name: Settings Explorer description: "AI Bot specialized in helping explore Discourse site settings" + researcher: + name: Researcher + description: "AI Bot with Google access that can research information for you" default_pm_prefix: "[Untitled AI bot PM]" topic_not_found: "Summary unavailable, topic not found!" command_summary: diff --git a/config/settings.yml b/config/settings.yml index f57e8c19..621b2635 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -217,12 +217,13 @@ discourse_ai: - time ai_bot_enabled_personas: type: list - default: "general|artist|sql_helper|settings_explorer" + default: "general|artist|sql_helper|settings_explorer|researcher" choices: - general - artist - sql_helper - settings_explorer + - researcher ai_bot_add_to_header: default: true client: true diff --git a/lib/modules/ai_bot/entry_point.rb b/lib/modules/ai_bot/entry_point.rb index 711efb27..91142310 100644 --- a/lib/modules/ai_bot/entry_point.rb +++ b/lib/modules/ai_bot/entry_point.rb @@ -46,6 +46,7 @@ module DiscourseAi require_relative "personas/general" require_relative "personas/sql_helper" require_relative "personas/settings_explorer" + require_relative "personas/researcher" end def inject_into(plugin) diff --git a/lib/modules/ai_bot/personas/persona.rb b/lib/modules/ai_bot/personas/persona.rb index 37cd6b9c..4ff40dfb 100644 --- a/lib/modules/ai_bot/personas/persona.rb +++ b/lib/modules/ai_bot/personas/persona.rb @@ -7,6 +7,7 @@ module DiscourseAi personas = [Personas::General, Personas::SqlHelper] personas << Personas::Artist if SiteSetting.ai_stability_api_key.present? personas << Personas::SettingsExplorer + personas << Personas::Researcher if SiteSetting.ai_google_custom_search_api_key.present? personas_allowed = SiteSetting.ai_bot_enabled_personas.split("|") personas.filter { |persona| personas_allowed.include?(persona.to_s.demodulize.underscore) } diff --git a/lib/modules/ai_bot/personas/researcher.rb b/lib/modules/ai_bot/personas/researcher.rb new file mode 100644 index 00000000..5d670962 --- /dev/null +++ b/lib/modules/ai_bot/personas/researcher.rb @@ -0,0 +1,26 @@ +#frozen_string_literal: true + +module DiscourseAi + module AiBot + module Personas + class Researcher < Persona + def commands + [Commands::GoogleCommand] + end + + def system_prompt + <<~PROMPT + You are research bot. With access to the internet you can find information for users. + + - You fully understand Discourse Markdown and generate it. + - When generating responses you always cite your sources. + - When possible you also quote the sources. + + {commands} + + PROMPT + end + end + end + end +end diff --git a/spec/lib/modules/ai_bot/personas/persona_spec.rb b/spec/lib/modules/ai_bot/personas/persona_spec.rb index 376184e4..87a19b25 100644 --- a/spec/lib/modules/ai_bot/personas/persona_spec.rb +++ b/spec/lib/modules/ai_bot/personas/persona_spec.rb @@ -64,12 +64,22 @@ module DiscourseAi::AiBot::Personas it "includes all personas by default" do # must be enabled to see it SiteSetting.ai_stability_api_key = "abc" + SiteSetting.ai_google_custom_search_api_key = "abc" expect(DiscourseAi::AiBot::Personas.all).to contain_exactly( General, SqlHelper, Artist, SettingsExplorer, + Researcher, + ) + end + + it "does not include personas that require api keys by default" do + expect(DiscourseAi::AiBot::Personas.all).to contain_exactly( + General, + SqlHelper, + SettingsExplorer, ) end diff --git a/spec/lib/modules/ai_bot/personas/researcher_spec.rb b/spec/lib/modules/ai_bot/personas/researcher_spec.rb new file mode 100644 index 00000000..9cc63c7c --- /dev/null +++ b/spec/lib/modules/ai_bot/personas/researcher_spec.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +RSpec.describe DiscourseAi::AiBot::Personas::Researcher do + let :researcher do + subject + end + + it "renders schema" do + expect(researcher.commands).to eq([DiscourseAi::AiBot::Commands::GoogleCommand]) + end +end