From a7da343a1303e01fff69c4c436501cc4bbfc20e6 Mon Sep 17 00:00:00 2001 From: Sam Saffron Date: Mon, 16 Sep 2024 18:52:36 +1000 Subject: [PATCH] moving rag UI to a central spot --- .../admin/ai_personas_controller.rb | 50 ------- .../rag_document_fragments_controller.rb | 64 +++++++++ .../components/ai-persona-editor.gjs | 4 +- .../components/rag-upload-progress.gjs | 2 +- ...sona-rag-uploader.gjs => rag-uploader.gjs} | 28 ++-- .../modules/ai-bot/common/ai-persona.scss | 123 +++++++++--------- config/routes.rb | 2 +- 7 files changed, 143 insertions(+), 130 deletions(-) create mode 100644 app/controllers/discourse_ai/admin/rag_document_fragments_controller.rb rename assets/javascripts/discourse/components/{persona-rag-uploader.gjs => rag-uploader.gjs} (85%) diff --git a/app/controllers/discourse_ai/admin/ai_personas_controller.rb b/app/controllers/discourse_ai/admin/ai_personas_controller.rb index 4082692e..54c2461f 100644 --- a/app/controllers/discourse_ai/admin/ai_personas_controller.rb +++ b/app/controllers/discourse_ai/admin/ai_personas_controller.rb @@ -75,32 +75,6 @@ module DiscourseAi end end - def upload_file - file = params[:file] || params[:files].first - - if !SiteSetting.ai_embeddings_enabled? - raise Discourse::InvalidAccess.new("Embeddings not enabled") - end - - validate_extension!(file.original_filename) - validate_file_size!(file.tempfile.size) - - hijack do - upload = - UploadCreator.new( - file.tempfile, - file.original_filename, - type: "discourse_ai_rag_upload", - skip_validations: true, - ).create_for(current_user.id) - - if upload.persisted? - render json: UploadSerializer.new(upload) - else - render json: failed_json.merge(errors: upload.errors.full_messages), status: 422 - end - end - end def indexing_status_check render json: RagDocumentFragment.indexing_status(@ai_persona, @ai_persona.uploads) @@ -164,30 +138,6 @@ module DiscourseAi end end - def validate_extension!(filename) - extension = File.extname(filename)[1..-1] || "" - authorized_extensions = %w[txt md] - if !authorized_extensions.include?(extension) - raise Discourse::InvalidParameters.new( - I18n.t( - "upload.unauthorized", - authorized_extensions: authorized_extensions.join(" "), - ), - ) - end - end - - def validate_file_size!(filesize) - max_size_bytes = 20.megabytes - if filesize > max_size_bytes - raise Discourse::InvalidParameters.new( - I18n.t( - "upload.attachments.too_large_humanized", - max_size: ActiveSupport::NumberHelper.number_to_human_size(max_size_bytes), - ), - ) - end - end end end end diff --git a/app/controllers/discourse_ai/admin/rag_document_fragments_controller.rb b/app/controllers/discourse_ai/admin/rag_document_fragments_controller.rb new file mode 100644 index 00000000..67d0c954 --- /dev/null +++ b/app/controllers/discourse_ai/admin/rag_document_fragments_controller.rb @@ -0,0 +1,64 @@ +# frozen_string_literal: true + +module DiscourseAi + module Admin + class RagDocumentFragmentsController < ::Admin::AdminController + requires_plugin ::DiscourseAi::PLUGIN_NAME + + def upload_file + file = params[:file] || params[:files].first + + if !SiteSetting.ai_embeddings_enabled? + raise Discourse::InvalidAccess.new("Embeddings not enabled") + end + + validate_extension!(file.original_filename) + validate_file_size!(file.tempfile.size) + + hijack do + upload = + UploadCreator.new( + file.tempfile, + file.original_filename, + type: "discourse_ai_rag_upload", + skip_validations: true, + ).create_for(current_user.id) + + if upload.persisted? + render json: UploadSerializer.new(upload) + else + render json: failed_json.merge(errors: upload.errors.full_messages), status: 422 + end + end + end + + private + + def validate_extension!(filename) + extension = File.extname(filename)[1..-1] || "" + authorized_extensions = %w[txt md] + if !authorized_extensions.include?(extension) + raise Discourse::InvalidParameters.new( + I18n.t( + "upload.unauthorized", + authorized_extensions: authorized_extensions.join(" "), + ), + ) + end + end + + def validate_file_size!(filesize) + max_size_bytes = 20.megabytes + if filesize > max_size_bytes + raise Discourse::InvalidParameters.new( + I18n.t( + "upload.attachments.too_large_humanized", + max_size: ActiveSupport::NumberHelper.number_to_human_size(max_size_bytes), + ), + ) + end + end + + end + end +end diff --git a/assets/javascripts/discourse/components/ai-persona-editor.gjs b/assets/javascripts/discourse/components/ai-persona-editor.gjs index a4ba5580..7438cbe7 100644 --- a/assets/javascripts/discourse/components/ai-persona-editor.gjs +++ b/assets/javascripts/discourse/components/ai-persona-editor.gjs @@ -23,7 +23,7 @@ import DTooltip from "float-kit/components/d-tooltip"; import AiLlmSelector from "./ai-llm-selector"; import AiPersonaToolOptions from "./ai-persona-tool-options"; import AiToolSelector from "./ai-tool-selector"; -import PersonaRagUploader from "./persona-rag-uploader"; +import RagUploader from "./rag-uploader"; export default class PersonaEditor extends Component { @service router; @@ -487,7 +487,7 @@ export default class PersonaEditor extends Component { {{/if}} {{#if this.siteSettings.ai_embeddings_enabled}}
- {{#if this.progress}} diff --git a/assets/javascripts/discourse/components/persona-rag-uploader.gjs b/assets/javascripts/discourse/components/rag-uploader.gjs similarity index 85% rename from assets/javascripts/discourse/components/persona-rag-uploader.gjs rename to assets/javascripts/discourse/components/rag-uploader.gjs index ce28944d..f93966c8 100644 --- a/assets/javascripts/discourse/components/persona-rag-uploader.gjs +++ b/assets/javascripts/discourse/components/rag-uploader.gjs @@ -12,7 +12,7 @@ import discourseDebounce from "discourse-common/lib/debounce"; import I18n from "discourse-i18n"; import RagUploadProgress from "./rag-upload-progress"; -export default class PersonaRagUploader extends Component.extend( +export default class RagUploader extends Component.extend( UppyUploadMixin ) { @service appEvents; @@ -21,9 +21,9 @@ export default class PersonaRagUploader extends Component.extend( @tracked filteredUploads = null; @tracked ragIndexingStatuses = null; @tracked ragUploads = null; - id = "discourse-ai-persona-rag-uploader"; + id = "discourse-ai-rag-uploader"; maxFiles = 20; - uploadUrl = "/admin/plugins/discourse-ai/ai-personas/files/upload"; + uploadUrl = "/admin/plugins/discourse-ai/rag-document-fragments/files/upload"; preventDirectS3Uploads = true; didReceiveAttrs() { @@ -112,19 +112,19 @@ export default class PersonaRagUploader extends Component.extend( }