Skip to content
This repository was archived by the owner on Jul 22, 2025. It is now read-only.

Commit 30242a2

Browse files
authored
REFACTOR: Move personas into its own module. (#1233)
This change moves all the personas code into its own module. We want to treat them as a building block features can built on top of, same as `Completions::Llm`. The code to title a message was moved from `Bot` to `Playground`.
1 parent 5b6d39a commit 30242a2

File tree

98 files changed

+790
-852
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

98 files changed

+790
-852
lines changed

app/controllers/discourse_ai/admin/ai_personas_controller.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ def index
1515
LocalizedAiPersonaSerializer.new(persona, root: false)
1616
end
1717
tools =
18-
DiscourseAi::AiBot::Personas::Persona.all_available_tools.map do |tool|
18+
DiscourseAi::Personas::Persona.all_available_tools.map do |tool|
1919
AiToolSerializer.new(tool, root: false)
2020
end
2121
AiTool

app/jobs/regular/create_ai_chat_reply.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@ def execute(args)
1212
return if message.blank?
1313

1414
personaClass =
15-
DiscourseAi::AiBot::Personas::Persona.find_by(id: args[:persona_id], user: message.user)
15+
DiscourseAi::Personas::Persona.find_by(id: args[:persona_id], user: message.user)
1616
return if personaClass.blank?
1717

1818
user = User.find_by(id: personaClass.user_id)
19-
bot = DiscourseAi::AiBot::Bot.as(user, persona: personaClass.new)
19+
bot = DiscourseAi::Personas::Bot.as(user, persona: personaClass.new)
2020

2121
DiscourseAi::AiBot::Playground.new(bot).reply_to_chat_message(
2222
message,

app/jobs/regular/create_ai_reply.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@ def execute(args)
1010
persona_id = args[:persona_id]
1111

1212
begin
13-
persona = DiscourseAi::AiBot::Personas::Persona.find_by(user: post.user, id: persona_id)
14-
raise DiscourseAi::AiBot::Bot::BOT_NOT_FOUND if persona.nil?
13+
persona = DiscourseAi::Personas::Persona.find_by(user: post.user, id: persona_id)
14+
raise DiscourseAi::Personas::Bot::BOT_NOT_FOUND if persona.nil?
1515

16-
bot = DiscourseAi::AiBot::Bot.as(bot_user, persona: persona.new)
16+
bot = DiscourseAi::Personas::Bot.as(bot_user, persona: persona.new)
1717

1818
DiscourseAi::AiBot::Playground.new(bot).reply_to(post)
19-
rescue DiscourseAi::AiBot::Bot::BOT_NOT_FOUND
19+
rescue DiscourseAi::Personas::Bot::BOT_NOT_FOUND
2020
Rails.logger.warn(
2121
"Bot not found for post #{post.id} - perhaps persona was deleted or bot was disabled",
2222
)

app/jobs/regular/stream_discover_reply.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ def execute(args)
1919
return if (llm_model = LlmModel.find_by(id: ai_persona_klass.default_llm_id)).nil?
2020

2121
bot =
22-
DiscourseAi::AiBot::Bot.as(
22+
DiscourseAi::Personas::Bot.as(
2323
Discourse.system_user,
2424
persona: ai_persona_klass.new,
2525
model: llm_model,
@@ -31,7 +31,7 @@ def execute(args)
3131
base = { query: query, model_used: llm_model.display_name }
3232

3333
context =
34-
DiscourseAi::AiBot::BotContext.new(
34+
DiscourseAi::Personas::BotContext.new(
3535
messages: [{ type: :user, content: query }],
3636
skip_tool_details: true,
3737
)

app/models/ai_persona.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -201,14 +201,14 @@ def class_instance
201201
if inner_name.start_with?("custom-")
202202
custom_tool_id = inner_name.split("-", 2).last.to_i
203203
if AiTool.exists?(id: custom_tool_id, enabled: true)
204-
klass = DiscourseAi::AiBot::Tools::Custom.class_instance(custom_tool_id)
204+
klass = DiscourseAi::Personas::Tools::Custom.class_instance(custom_tool_id)
205205
end
206206
else
207207
inner_name = inner_name.gsub("Tool", "")
208208
inner_name = "List#{inner_name}" if %w[Categories Tags].include?(inner_name)
209209

210210
begin
211-
klass = "DiscourseAi::AiBot::Tools::#{inner_name}".constantize
211+
klass = "DiscourseAi::Personas::Tools::#{inner_name}".constantize
212212
options[klass] = current_options if current_options
213213
rescue StandardError
214214
end
@@ -218,7 +218,7 @@ def class_instance
218218
klass
219219
end
220220

221-
persona_class = DiscourseAi::AiBot::Personas::Persona.system_personas_by_id[self.id]
221+
persona_class = DiscourseAi::Personas::Persona.system_personas_by_id[self.id]
222222
if persona_class
223223
instance_attributes.each do |key, value|
224224
# description/name are localized
@@ -230,7 +230,7 @@ def class_instance
230230

231231
ai_persona_id = self.id
232232

233-
Class.new(DiscourseAi::AiBot::Personas::Persona) do
233+
Class.new(DiscourseAi::Personas::Persona) do
234234
instance_attributes.each { |key, value| define_singleton_method(key) { value } }
235235

236236
define_singleton_method(:to_s) do

app/models/ai_tool.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ def function_call_name
3636
end
3737

3838
def runner(parameters, llm:, bot_user:, context: nil)
39-
DiscourseAi::AiBot::ToolRunner.new(
39+
DiscourseAi::Personas::ToolRunner.new(
4040
parameters: parameters,
4141
llm: llm,
4242
bot_user: bot_user,

db/fixtures/ai_bot/603_bot_ai_personas.rb renamed to db/fixtures/personas/603_ai_personas.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
# frozen_string_literal: true
22

3-
DiscourseAi::AiBot::Personas::Persona.system_personas.each do |persona_class, id|
3+
DiscourseAi::Personas::Persona.system_personas.each do |persona_class, id|
44
persona = AiPersona.find_by(id: id)
55
if !persona
66
persona = AiPersona.new
77
persona.id = id
8-
if persona_class == DiscourseAi::AiBot::Personas::WebArtifactCreator
8+
if persona_class == DiscourseAi::Personas::WebArtifactCreator
99
# this is somewhat sensitive, so we default it to staff
1010
persona.allowed_group_ids = [Group::AUTO_GROUPS[:staff]]
1111
else
1212
persona.allowed_group_ids = [Group::AUTO_GROUPS[:trust_level_0]]
1313
end
1414
persona.enabled = true
15-
persona.priority = true if persona_class == DiscourseAi::AiBot::Personas::General
15+
persona.priority = true if persona_class == DiscourseAi::Personas::General
1616
end
1717

1818
names = [

lib/ai_bot/entry_point.rb

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ def inject_into(plugin)
110110
scope.user.in_any_groups?(SiteSetting.ai_bot_allowed_groups_map)
111111
end,
112112
) do
113-
DiscourseAi::AiBot::Personas::Persona
113+
DiscourseAi::Personas::Persona
114114
.all(user: scope.user)
115115
.map do |persona|
116116
{
@@ -205,8 +205,7 @@ def inject_into(plugin)
205205
include_condition: -> { SiteSetting.ai_bot_enabled && object.topic.private_message? },
206206
) do
207207
id = topic.custom_fields["ai_persona_id"]
208-
name =
209-
DiscourseAi::AiBot::Personas::Persona.find_by(user: scope.user, id: id.to_i)&.name if id
208+
name = DiscourseAi::Personas::Persona.find_by(user: scope.user, id: id.to_i)&.name if id
210209
name || topic.custom_fields["ai_persona"]
211210
end
212211

lib/ai_bot/personas/creative.rb

Lines changed: 0 additions & 19 deletions
This file was deleted.

0 commit comments

Comments
 (0)