mirror of
https://github.com/discourse/discourse-ai.git
synced 2025-02-16 16:34:45 +00:00
1. Personas are now optionally mentionable, meaning that you can mention them either from public topics or PMs - Mentioning from PMs helps "switch" persona mid conversation, meaning if you want to look up sites setting you can invoke the site setting bot, or if you want to generate an image you can invoke dall e - Mentioning outside of PMs allows you to inject a bot reply in a topic trivially - We also add the support for max_context_posts this allow you to limit the amount of context you feed in, which can help control costs 2. Add support for a "random picker" tool that can be used to pick random numbers 3. Clean up routing ai_personas -> ai-personas 4. Add Max Context Posts so users can control how much history a persona can consume (this is important for mentionable personas) Co-authored-by: Martin Brennan <martin@discourse.org>
106 lines
2.8 KiB
Ruby
106 lines
2.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
RSpec.describe AiPersona do
|
|
it "validates context settings" do
|
|
persona =
|
|
AiPersona.new(
|
|
name: "test",
|
|
description: "test",
|
|
system_prompt: "test",
|
|
commands: [],
|
|
allowed_group_ids: [],
|
|
)
|
|
|
|
expect(persona.valid?).to eq(true)
|
|
|
|
persona.max_context_posts = 0
|
|
expect(persona.valid?).to eq(false)
|
|
expect(persona.errors[:max_context_posts]).to eq(["must be greater than 0"])
|
|
|
|
persona.max_context_posts = 1
|
|
expect(persona.valid?).to eq(true)
|
|
|
|
persona.max_context_posts = nil
|
|
expect(persona.valid?).to eq(true)
|
|
end
|
|
|
|
it "allows creation of user" do
|
|
persona =
|
|
AiPersona.create!(
|
|
name: "test",
|
|
description: "test",
|
|
system_prompt: "test",
|
|
commands: [],
|
|
allowed_group_ids: [],
|
|
)
|
|
|
|
user = persona.create_user!
|
|
expect(user.username).to eq("test_bot")
|
|
expect(user.name).to eq("Test")
|
|
expect(user.bot?).to be(true)
|
|
expect(user.id).to be <= AiPersona::FIRST_PERSONA_USER_ID
|
|
end
|
|
|
|
it "defines singleton methods on system persona classes" do
|
|
forum_helper = AiPersona.find_by(name: "Forum Helper")
|
|
forum_helper.update!(
|
|
user_id: 1,
|
|
mentionable: true,
|
|
default_llm: "anthropic:claude-2",
|
|
max_context_posts: 3,
|
|
)
|
|
|
|
klass = forum_helper.class_instance
|
|
|
|
expect(klass.id).to eq(forum_helper.id)
|
|
expect(klass.system).to eq(true)
|
|
# tl 0 by default
|
|
expect(klass.allowed_group_ids).to eq([10])
|
|
expect(klass.user_id).to eq(1)
|
|
expect(klass.mentionable).to eq(true)
|
|
expect(klass.default_llm).to eq("anthropic:claude-2")
|
|
expect(klass.max_context_posts).to eq(3)
|
|
end
|
|
|
|
it "defines singleton methods non persona classes" do
|
|
persona =
|
|
AiPersona.create!(
|
|
name: "test",
|
|
description: "test",
|
|
system_prompt: "test",
|
|
commands: [],
|
|
allowed_group_ids: [],
|
|
default_llm: "anthropic:claude-2",
|
|
max_context_posts: 3,
|
|
mentionable: true,
|
|
user_id: 1,
|
|
)
|
|
|
|
klass = persona.class_instance
|
|
|
|
expect(klass.id).to eq(persona.id)
|
|
expect(klass.system).to eq(false)
|
|
expect(klass.allowed_group_ids).to eq([])
|
|
expect(klass.user_id).to eq(1)
|
|
expect(klass.mentionable).to eq(true)
|
|
expect(klass.default_llm).to eq("anthropic:claude-2")
|
|
expect(klass.max_context_posts).to eq(3)
|
|
end
|
|
|
|
it "does not leak caches between sites" do
|
|
AiPersona.create!(
|
|
name: "pun_bot",
|
|
description: "you write puns",
|
|
system_prompt: "you are pun bot",
|
|
commands: ["ImageCommand"],
|
|
allowed_group_ids: [Group::AUTO_GROUPS[:trust_level_0]],
|
|
)
|
|
|
|
AiPersona.all_personas
|
|
|
|
expect(AiPersona.persona_cache[:value].length).to be > (0)
|
|
RailsMultisite::ConnectionManagement.stubs(:current_db) { "abc" }
|
|
expect(AiPersona.persona_cache[:value]).to eq(nil)
|
|
end
|
|
end
|