2023-05-18 16:10:08 +10:00
|
|
|
# frozen_string_literal: true
|
|
|
|
RSpec.describe "AI chat channel summarization", type: :system, js: true do
|
2024-03-05 16:48:28 +01:00
|
|
|
fab!(:user)
|
2023-09-04 11:52:44 +10:00
|
|
|
fab!(:group) { Fabricate(:group, visibility_level: Group.visibility_levels[:staff]) }
|
2023-05-18 16:10:08 +10:00
|
|
|
|
2024-06-18 14:32:14 -03:00
|
|
|
fab!(:gpt_4) { Fabricate(:llm_model, name: "gpt-4") }
|
|
|
|
fab!(:gpt_3_5_turbo) { Fabricate(:llm_model, name: "gpt-3.5-turbo") }
|
|
|
|
|
2023-05-18 16:10:08 +10:00
|
|
|
before do
|
|
|
|
SiteSetting.ai_bot_enabled = true
|
2024-06-18 14:32:14 -03:00
|
|
|
toggle_enabled_bots(bots: [gpt_4, gpt_3_5_turbo])
|
2023-09-04 11:52:44 +10:00
|
|
|
SiteSetting.ai_bot_allowed_groups = group.id.to_s
|
|
|
|
sign_in(user)
|
|
|
|
end
|
|
|
|
|
|
|
|
it "does not show AI button to users not in group" do
|
|
|
|
visit "/latest"
|
|
|
|
expect(page).not_to have_selector(".ai-bot-button")
|
2023-05-18 16:10:08 +10:00
|
|
|
end
|
|
|
|
|
2023-09-04 11:52:44 +10:00
|
|
|
it "shows the AI bot button, which is clickable (even if group is hidden)" do
|
|
|
|
group.add(user)
|
|
|
|
group.save
|
|
|
|
|
2024-10-25 06:24:53 +11:00
|
|
|
allowed_persona = AiPersona.last
|
|
|
|
allowed_persona.update!(allowed_group_ids: [group.id], enabled: true)
|
|
|
|
|
2023-05-18 16:10:08 +10:00
|
|
|
visit "/latest"
|
|
|
|
expect(page).to have_selector(".ai-bot-button")
|
|
|
|
find(".ai-bot-button").click
|
|
|
|
|
2024-10-25 06:24:53 +11:00
|
|
|
find(".gpt-persona").click
|
|
|
|
expect(page).to have_css(".gpt-persona ul li", count: 1)
|
|
|
|
|
|
|
|
find(".llm-selector").click
|
|
|
|
expect(page).to have_css(".llm-selector ul li", count: 2)
|
|
|
|
|
2023-05-18 16:10:08 +10:00
|
|
|
expect(page).to have_selector(".d-editor-container")
|
2023-09-04 11:52:44 +10:00
|
|
|
|
2024-10-25 06:24:53 +11:00
|
|
|
# lets disable bots but still allow 1 persona
|
|
|
|
allowed_persona.create_user!
|
FEATURE: PDF support for rag pipeline (#1118)
This PR introduces several enhancements and refactorings to the AI Persona and RAG (Retrieval-Augmented Generation) functionalities within the discourse-ai plugin. Here's a breakdown of the changes:
**1. LLM Model Association for RAG and Personas:**
- **New Database Columns:** Adds `rag_llm_model_id` to both `ai_personas` and `ai_tools` tables. This allows specifying a dedicated LLM for RAG indexing, separate from the persona's primary LLM. Adds `default_llm_id` and `question_consolidator_llm_id` to `ai_personas`.
- **Migration:** Includes a migration (`20250210032345_migrate_persona_to_llm_model_id.rb`) to populate the new `default_llm_id` and `question_consolidator_llm_id` columns in `ai_personas` based on the existing `default_llm` and `question_consolidator_llm` string columns, and a post migration to remove the latter.
- **Model Changes:** The `AiPersona` and `AiTool` models now `belong_to` an `LlmModel` via `rag_llm_model_id`. The `LlmModel.proxy` method now accepts an `LlmModel` instance instead of just an identifier. `AiPersona` now has `default_llm_id` and `question_consolidator_llm_id` attributes.
- **UI Updates:** The AI Persona and AI Tool editors in the admin panel now allow selecting an LLM for RAG indexing (if PDF/image support is enabled). The RAG options component displays an LLM selector.
- **Serialization:** The serializers (`AiCustomToolSerializer`, `AiCustomToolListSerializer`, `LocalizedAiPersonaSerializer`) have been updated to include the new `rag_llm_model_id`, `default_llm_id` and `question_consolidator_llm_id` attributes.
**2. PDF and Image Support for RAG:**
- **Site Setting:** Introduces a new hidden site setting, `ai_rag_pdf_images_enabled`, to control whether PDF and image files can be indexed for RAG. This defaults to `false`.
- **File Upload Validation:** The `RagDocumentFragmentsController` now checks the `ai_rag_pdf_images_enabled` setting and allows PDF, PNG, JPG, and JPEG files if enabled. Error handling is included for cases where PDF/image indexing is attempted with the setting disabled.
- **PDF Processing:** Adds a new utility class, `DiscourseAi::Utils::PdfToImages`, which uses ImageMagick (`magick`) to convert PDF pages into individual PNG images. A maximum PDF size and conversion timeout are enforced.
- **Image Processing:** A new utility class, `DiscourseAi::Utils::ImageToText`, is included to handle OCR for the images and PDFs.
- **RAG Digestion Job:** The `DigestRagUpload` job now handles PDF and image uploads. It uses `PdfToImages` and `ImageToText` to extract text and create document fragments.
- **UI Updates:** The RAG uploader component now accepts PDF and image file types if `ai_rag_pdf_images_enabled` is true. The UI text is adjusted to indicate supported file types.
**3. Refactoring and Improvements:**
- **LLM Enumeration:** The `DiscourseAi::Configuration::LlmEnumerator` now provides a `values_for_serialization` method, which returns a simplified array of LLM data (id, name, vision_enabled) suitable for use in serializers. This avoids exposing unnecessary details to the frontend.
- **AI Helper:** The `AiHelper::Assistant` now takes optional `helper_llm` and `image_caption_llm` parameters in its constructor, allowing for greater flexibility.
- **Bot and Persona Updates:** Several updates were made across the codebase, changing the string based association to a LLM to the new model based.
- **Audit Logs:** The `DiscourseAi::Completions::Endpoints::Base` now formats raw request payloads as pretty JSON for easier auditing.
- **Eval Script:** An evaluation script is included.
**4. Testing:**
- The PR introduces a new eval system for LLMs, this allows us to test how functionality works across various LLM providers. This lives in `/evals`
2025-02-14 12:15:07 +11:00
|
|
|
allowed_persona.update!(default_llm_id: gpt_4.id)
|
2024-10-25 06:24:53 +11:00
|
|
|
|
|
|
|
gpt_4.update!(enabled_chat_bot: false)
|
|
|
|
gpt_3_5_turbo.update!(enabled_chat_bot: false)
|
|
|
|
|
|
|
|
visit "/latest"
|
|
|
|
find(".ai-bot-button").click
|
|
|
|
|
|
|
|
find(".gpt-persona").click
|
|
|
|
expect(page).to have_css(".gpt-persona ul li", count: 1)
|
|
|
|
expect(page).not_to have_selector(".llm-selector")
|
|
|
|
|
2023-09-04 11:52:44 +10:00
|
|
|
SiteSetting.ai_bot_add_to_header = false
|
|
|
|
visit "/latest"
|
|
|
|
expect(page).not_to have_selector(".ai-bot-button")
|
2023-05-18 16:10:08 +10:00
|
|
|
end
|
|
|
|
end
|