mirror of
https://github.com/discourse/discourse-ai.git
synced 2025-07-02 04:22:40 +00:00
* FEATURE: display more places where AI is used - Usage was not showing automation or image caption in llm list. - Also: FIX - reasoning models would time out incorrectly after 60 seconds (raised to 10 minutes) * correct enum not to enumerate non configured models * FEATURE: implement chat streamer This implements a basic chat streamer, it provides 2 things: 1. Gives feedback to the user when LLM is generating 2. Streams stuff much more efficiently to client (given it may take 100ms or so per call to update chat)
113 lines
3.8 KiB
Ruby
113 lines
3.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
RSpec.describe "Admin AI persona configuration", type: :system, js: true do
|
|
fab!(:admin)
|
|
let(:page_header) { PageObjects::Components::DPageHeader.new }
|
|
let(:form) { PageObjects::Components::FormKit.new("form") }
|
|
|
|
before do
|
|
SiteSetting.ai_bot_enabled = true
|
|
sign_in(admin)
|
|
end
|
|
|
|
it "allows creation of a persona" do
|
|
visit "/admin/plugins/discourse-ai/ai-personas"
|
|
|
|
expect(page_header).to be_visible
|
|
|
|
find(".ai-persona-list-editor__new-button").click()
|
|
|
|
expect(page_header).to be_hidden
|
|
|
|
form.field("name").fill_in("Test Persona")
|
|
form.field("description").fill_in("I am a test persona")
|
|
form.field("system_prompt").fill_in("You are a helpful bot")
|
|
|
|
tool_selector = PageObjects::Components::SelectKit.new("#control-tools .select-kit")
|
|
tool_selector.expand
|
|
tool_selector.select_row_by_value("Read")
|
|
tool_selector.select_row_by_value("ListCategories")
|
|
tool_selector.collapse
|
|
|
|
tool_selector = PageObjects::Components::SelectKit.new("#control-forcedTools .select-kit")
|
|
tool_selector.expand
|
|
tool_selector.select_row_by_value("ListCategories")
|
|
tool_selector.select_row_by_value("Read")
|
|
tool_selector.collapse
|
|
|
|
form.field("forced_tool_count").select(1)
|
|
|
|
form.submit
|
|
|
|
expect(page).not_to have_current_path("/admin/plugins/discourse-ai/ai-personas/new")
|
|
|
|
persona_id = page.current_path.split("/")[-2].to_i
|
|
|
|
persona = AiPersona.find(persona_id)
|
|
expect(persona.name).to eq("Test Persona")
|
|
expect(persona.description).to eq("I am a test persona")
|
|
expect(persona.system_prompt).to eq("You are a helpful bot")
|
|
expect(persona.forced_tool_count).to eq(1)
|
|
|
|
expected_tools = [["Read", { "read_private" => nil }, true], ["ListCategories", {}, true]]
|
|
expect(persona.tools).to contain_exactly(*expected_tools)
|
|
end
|
|
|
|
it "will not allow deletion or editing of system personas" do
|
|
visit "/admin/plugins/discourse-ai/ai-personas/#{DiscourseAi::Personas::Persona.system_personas.values.first}/edit"
|
|
expect(page).not_to have_selector(".ai-persona-editor__delete")
|
|
expect(form.field("system_prompt")).to be_disabled
|
|
end
|
|
|
|
it "will enable persona right away when you click on enable but does not save side effects" do
|
|
persona = Fabricate(:ai_persona, enabled: false)
|
|
|
|
visit "/admin/plugins/discourse-ai/ai-personas/#{persona.id}/edit"
|
|
|
|
form.field("name").fill_in("Test Persona 1")
|
|
form.field("enabled").toggle
|
|
|
|
try_until_success { expect(persona.reload.enabled).to eq(true) }
|
|
|
|
persona.reload
|
|
expect(persona.enabled).to eq(true)
|
|
expect(persona.name).not_to eq("Test Persona 1")
|
|
end
|
|
|
|
it "enabling a persona doesn't reset other fields" do
|
|
persona = Fabricate(:ai_persona, enabled: false)
|
|
updated_name = "Update persona 1"
|
|
|
|
visit "/admin/plugins/discourse-ai/ai-personas/#{persona.id}/edit"
|
|
|
|
form.field("name").fill_in(updated_name)
|
|
form.field("enabled").toggle
|
|
|
|
try_until_success { expect(persona.reload.enabled).to eq(true) }
|
|
|
|
expect(form.field("name").value).to eq(updated_name)
|
|
end
|
|
|
|
it "toggling a persona's priority doesn't reset other fields" do
|
|
persona = Fabricate(:ai_persona, priority: false)
|
|
updated_name = "Update persona 1"
|
|
|
|
visit "/admin/plugins/discourse-ai/ai-personas/#{persona.id}/edit"
|
|
|
|
form.field("name").fill_in(updated_name)
|
|
form.field("priority").toggle
|
|
|
|
try_until_success { expect(persona.reload.priority).to eq(true) }
|
|
|
|
expect(form.field("name").value).to eq(updated_name)
|
|
end
|
|
|
|
it "can navigate the AI plugin with breadcrumbs" do
|
|
visit "/admin/plugins/discourse-ai/ai-personas"
|
|
expect(page).to have_css(".d-breadcrumbs")
|
|
expect(page).to have_css(".d-breadcrumbs__item", count: 4)
|
|
find(".d-breadcrumbs__item", text: I18n.t("admin_js.admin.plugins.title")).click
|
|
expect(page).to have_current_path("/admin/plugins")
|
|
end
|
|
end
|