diff --git a/assets/javascripts/discourse/admin-discourse-ai-personas-route-map.js b/assets/javascripts/discourse/admin-discourse-ai-plugin-route-map.js similarity index 66% rename from assets/javascripts/discourse/admin-discourse-ai-personas-route-map.js rename to assets/javascripts/discourse/admin-discourse-ai-plugin-route-map.js index aff18154..1db0e5aa 100644 --- a/assets/javascripts/discourse/admin-discourse-ai-personas-route-map.js +++ b/assets/javascripts/discourse/admin-discourse-ai-plugin-route-map.js @@ -1,10 +1,10 @@ export default { - resource: "admin.adminPlugins", + resource: "admin.adminPlugins.show", path: "/plugins", map() { - this.route("discourse-ai", function () { + this.route("discourse-ai", { path: "/" }, function () { this.route("ai-personas", function () { this.route("new"); this.route("show", { path: "/:id" }); diff --git a/assets/javascripts/discourse/components/ai-persona-editor.gjs b/assets/javascripts/discourse/components/ai-persona-editor.gjs index 4a5fdf1a..6de12fbf 100644 --- a/assets/javascripts/discourse/components/ai-persona-editor.gjs +++ b/assets/javascripts/discourse/components/ai-persona-editor.gjs @@ -8,6 +8,7 @@ import didUpdate from "@ember/render-modifiers/modifiers/did-update"; import { LinkTo } from "@ember/routing"; import { later } from "@ember/runloop"; import { inject as service } from "@ember/service"; +import BackButton from "discourse/components/back-button"; import DButton from "discourse/components/d-button"; import Textarea from "discourse/components/d-textarea"; import DToggleSwitch from "discourse/components/d-toggle-switch"; @@ -58,7 +59,7 @@ export default class PersonaEditor extends Component { if (isNew) { this.args.personas.addObject(this.args.model); this.router.transitionTo( - "adminPlugins.discourse-ai.ai-personas.show", + "adminPlugins.show.discourse-ai.ai-personas.show", this.args.model ); } else { @@ -109,7 +110,7 @@ export default class PersonaEditor extends Component { return this.args.model.destroyRecord().then(() => { this.args.personas.removeObject(this.args.model); this.router.transitionTo( - "adminPlugins.discourse-ai.ai-personas.index" + "adminPlugins.show.discourse-ai.ai-personas.index" ); }); }, @@ -180,6 +181,10 @@ export default class PersonaEditor extends Component { } diff --git a/assets/javascripts/discourse/routes/admin-plugins-discourse-ai-index.js b/assets/javascripts/discourse/routes/admin-plugins-discourse-ai-index.js deleted file mode 100644 index cdd00132..00000000 --- a/assets/javascripts/discourse/routes/admin-plugins-discourse-ai-index.js +++ /dev/null @@ -1,9 +0,0 @@ -import { inject as service } from "@ember/service"; -import DiscourseRoute from "discourse/routes/discourse"; - -export default DiscourseRoute.extend({ - router: service(), - beforeModel() { - this.router.transitionTo("adminPlugins.discourse-ai.ai-personas"); - }, -}); diff --git a/assets/javascripts/discourse/routes/admin-plugins-discourse-ai-ai-personas-index.js b/assets/javascripts/discourse/routes/admin-plugins-show-discourse-ai-ai-personas-index.js similarity index 62% rename from assets/javascripts/discourse/routes/admin-plugins-discourse-ai-ai-personas-index.js rename to assets/javascripts/discourse/routes/admin-plugins-show-discourse-ai-ai-personas-index.js index da88909f..c41abaee 100644 --- a/assets/javascripts/discourse/routes/admin-plugins-discourse-ai-ai-personas-index.js +++ b/assets/javascripts/discourse/routes/admin-plugins-show-discourse-ai-ai-personas-index.js @@ -2,6 +2,6 @@ import DiscourseRoute from "discourse/routes/discourse"; export default DiscourseRoute.extend({ model() { - return this.modelFor("adminPlugins.discourse-ai.ai-personas"); + return this.modelFor("adminPlugins.show.discourse-ai.ai-personas"); }, }); diff --git a/assets/javascripts/discourse/routes/admin-plugins-discourse-ai-ai-personas-new.js b/assets/javascripts/discourse/routes/admin-plugins-show-discourse-ai-ai-personas-new.js similarity index 63% rename from assets/javascripts/discourse/routes/admin-plugins-discourse-ai-ai-personas-new.js rename to assets/javascripts/discourse/routes/admin-plugins-show-discourse-ai-ai-personas-new.js index 56182634..9a2daa8f 100644 --- a/assets/javascripts/discourse/routes/admin-plugins-discourse-ai-ai-personas-new.js +++ b/assets/javascripts/discourse/routes/admin-plugins-show-discourse-ai-ai-personas-new.js @@ -1,10 +1,10 @@ +import { AUTO_GROUPS } from "discourse/lib/constants"; import DiscourseRoute from "discourse/routes/discourse"; export default DiscourseRoute.extend({ async model() { const record = this.store.createRecord("ai-persona"); - // TL0 - record.set("allowed_group_ids", [10]); + record.set("allowed_group_ids", [AUTO_GROUPS.trust_level_0.id]); return record; }, @@ -12,7 +12,7 @@ export default DiscourseRoute.extend({ this._super(controller, model); controller.set( "allPersonas", - this.modelFor("adminPlugins.discourse-ai.ai-personas") + this.modelFor("adminPlugins.show.discourse-ai.ai-personas") ); }, }); diff --git a/assets/javascripts/discourse/routes/admin-plugins-discourse-ai-ai-personas-show.js b/assets/javascripts/discourse/routes/admin-plugins-show-discourse-ai-ai-personas-show.js similarity index 67% rename from assets/javascripts/discourse/routes/admin-plugins-discourse-ai-ai-personas-show.js rename to assets/javascripts/discourse/routes/admin-plugins-show-discourse-ai-ai-personas-show.js index 84958a6e..e24c218d 100644 --- a/assets/javascripts/discourse/routes/admin-plugins-discourse-ai-ai-personas-show.js +++ b/assets/javascripts/discourse/routes/admin-plugins-show-discourse-ai-ai-personas-show.js @@ -2,7 +2,9 @@ import DiscourseRoute from "discourse/routes/discourse"; export default DiscourseRoute.extend({ async model(params) { - const allPersonas = this.modelFor("adminPlugins.discourse-ai.ai-personas"); + const allPersonas = this.modelFor( + "adminPlugins.show.discourse-ai.ai-personas" + ); const id = parseInt(params.id, 10); return allPersonas.findBy("id", id); }, @@ -11,7 +13,7 @@ export default DiscourseRoute.extend({ this._super(controller, model); controller.set( "allPersonas", - this.modelFor("adminPlugins.discourse-ai.ai-personas") + this.modelFor("adminPlugins.show.discourse-ai.ai-personas") ); }, }); diff --git a/assets/javascripts/discourse/routes/admin-plugins-discourse-ai-ai-personas.js b/assets/javascripts/discourse/routes/admin-plugins-show-discourse-ai-ai-personas.js similarity index 53% rename from assets/javascripts/discourse/routes/admin-plugins-discourse-ai-ai-personas.js rename to assets/javascripts/discourse/routes/admin-plugins-show-discourse-ai-ai-personas.js index e8e6cb42..7455e4d5 100644 --- a/assets/javascripts/discourse/routes/admin-plugins-discourse-ai-ai-personas.js +++ b/assets/javascripts/discourse/routes/admin-plugins-show-discourse-ai-ai-personas.js @@ -1,7 +1,7 @@ import DiscourseRoute from "discourse/routes/discourse"; -export default DiscourseRoute.extend({ - async model() { +export default class DiscourseAiAiPersonasRoute extends DiscourseRoute { + model() { return this.store.findAll("ai-persona"); - }, -}); + } +} diff --git a/assets/javascripts/discourse/routes/admin-plugins-show-discourse-ai-index.js b/assets/javascripts/discourse/routes/admin-plugins-show-discourse-ai-index.js new file mode 100644 index 00000000..6d3c5aa8 --- /dev/null +++ b/assets/javascripts/discourse/routes/admin-plugins-show-discourse-ai-index.js @@ -0,0 +1,12 @@ +import { inject as service } from "@ember/service"; +import DiscourseRoute from "discourse/routes/discourse"; + +export default class DiscourseAiIndexRoute extends DiscourseRoute { + @service router; + + beforeModel() { + return this.router.transitionTo( + "adminPlugins.show.discourse-ai.ai-personas.index" + ); + } +} diff --git a/assets/javascripts/discourse/templates/admin-plugins/ai-personas/index.hbs b/assets/javascripts/discourse/templates/admin-plugins/ai-personas/index.hbs new file mode 100644 index 00000000..74bb4581 --- /dev/null +++ b/assets/javascripts/discourse/templates/admin-plugins/ai-personas/index.hbs @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/javascripts/discourse/templates/admin-plugins/show/discourse-ai/ai-personas/index.hbs b/assets/javascripts/discourse/templates/admin-plugins/show/discourse-ai/ai-personas/index.hbs new file mode 100644 index 00000000..74bb4581 --- /dev/null +++ b/assets/javascripts/discourse/templates/admin-plugins/show/discourse-ai/ai-personas/index.hbs @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/javascripts/discourse/templates/admin-plugins/discourse-ai/ai-personas/new.hbs b/assets/javascripts/discourse/templates/admin-plugins/show/discourse-ai/ai-personas/new.hbs similarity index 100% rename from assets/javascripts/discourse/templates/admin-plugins/discourse-ai/ai-personas/new.hbs rename to assets/javascripts/discourse/templates/admin-plugins/show/discourse-ai/ai-personas/new.hbs diff --git a/assets/javascripts/discourse/templates/admin-plugins/discourse-ai/ai-personas/show.hbs b/assets/javascripts/discourse/templates/admin-plugins/show/discourse-ai/ai-personas/show.hbs similarity index 100% rename from assets/javascripts/discourse/templates/admin-plugins/discourse-ai/ai-personas/show.hbs rename to assets/javascripts/discourse/templates/admin-plugins/show/discourse-ai/ai-personas/show.hbs diff --git a/assets/javascripts/initializers/admin-plugin-configuration-nav.js b/assets/javascripts/initializers/admin-plugin-configuration-nav.js new file mode 100644 index 00000000..6b10771b --- /dev/null +++ b/assets/javascripts/initializers/admin-plugin-configuration-nav.js @@ -0,0 +1,26 @@ +import { PLUGIN_NAV_MODE_TOP } from "discourse/lib/admin-plugin-config-nav"; +import { withPluginApi } from "discourse/lib/plugin-api"; + +export default { + name: "discourse-ai-admin-plugin-configuration-nav", + + initialize(container) { + const currentUser = container.lookup("service:current-user"); + if (!currentUser || !currentUser.admin) { + return; + } + + withPluginApi("1.1.0", (api) => { + api.addAdminPluginConfigurationNav("discourse-ai", PLUGIN_NAV_MODE_TOP, [ + { + label: "admin.plugins.change_settings_short", + route: "adminPlugins.show.settings", + }, + { + label: "discourse_ai.ai_persona.short_title", + route: "adminPlugins.show.discourse-ai.ai-personas", + }, + ]); + }); + }, +}; diff --git a/assets/stylesheets/modules/ai-bot/common/ai-persona.scss b/assets/stylesheets/modules/ai-bot/common/ai-persona.scss index 96df9d12..4b41b5af 100644 --- a/assets/stylesheets/modules/ai-bot/common/ai-persona.scss +++ b/assets/stylesheets/modules/ai-bot/common/ai-persona.scss @@ -1,10 +1,19 @@ +.admin-contents .ai-persona-list-editor { + margin-top: 0; +} + .ai-persona-list-editor { &__header { display: flex; justify-content: space-between; align-items: center; - margin-bottom: 10px; + margin: 0 0 1em 0; + + h3 { + margin: 0; + } } + &__current { padding-left: 20px; } diff --git a/assets/stylesheets/modules/ai-bot/mobile/ai-persona.scss b/assets/stylesheets/modules/ai-bot/mobile/ai-persona.scss new file mode 100644 index 00000000..6353f526 --- /dev/null +++ b/assets/stylesheets/modules/ai-bot/mobile/ai-persona.scss @@ -0,0 +1,7 @@ +.ai-persona-editor { + &__system_prompt, + &__description, + .select-kit.multi-select { + width: 100%; + } +} diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 077e5011..5fb8652d 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -114,7 +114,9 @@ en: select_option: "Select an option..." ai_persona: + back: Back name: Name + edit: Edit description: Description no_llm_selected: "No language model selected" max_context_posts: "Max Context Posts" @@ -129,12 +131,13 @@ en: system_prompt: System Prompt save: Save saved: AI Persona Saved - enabled: Enabled + enabled: "Enabled?" commands: Enabled Commands allowed_groups: Allowed Groups confirm_delete: Are you sure you want to delete this persona? - new: New + new: "New Persona" title: "AI Personas" + short_title: "Personas" delete: Delete temperature: Temperature temperature_help: Temperature to use for the LLM, increase to increase creativity (leave empty to use model default, generally a value from 0.0 to 2.0) @@ -143,16 +146,15 @@ en: priority: Priority priority_help: Priority personas are displayed to users at the top of the persona list. If multiple personas have priority, they will be sorted alphabetically. command_options: "Command Options" + what_are_personas: "What are AI Personas?" no_persona_selected: | - ## What are AI Personas? - AI Personas are a powerful feature that allows you to customize the behavior of the AI engine in your Discourse forum. They act as a 'system message' that guides the AI's responses and interactions, helping to create a more personalized and engaging user experience. - ## Why use AI Personas? + #### Why use AI Personas? With AI Personas, you can tailor the AI's behavior to better fit the context and tone of your forum. Whether you want the AI to be more formal for a professional setting, more casual for a community forum, or even embody a specific character for a role-playing game, AI Personas give you the flexibility to do so. - ## Group-Specific Access to AI Personas + #### Group-Specific Access to AI Personas Moreover, you can set it up so that certain user groups have access to specific personas. This means you can have different AI behaviors for different sections of your forum, further enhancing the diversity and richness of your community's interactions. diff --git a/config/routes.rb b/config/routes.rb index 60eec6d0..c9c5ac8b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -35,8 +35,6 @@ Discourse::Application.routes.draw do :constraints => StaffConstraint.new scope "/admin/plugins/discourse-ai", constraints: AdminConstraint.new do - get "/", to: redirect("/admin/plugins/discourse-ai/ai-personas") - resources :ai_personas, only: %i[index create show update destroy], path: "ai-personas", diff --git a/plugin.rb b/plugin.rb index dc452dff..aac7776d 100644 --- a/plugin.rb +++ b/plugin.rb @@ -17,6 +17,7 @@ register_asset "stylesheets/modules/ai-helper/common/ai-helper.scss" register_asset "stylesheets/modules/ai-bot/common/bot-replies.scss" register_asset "stylesheets/modules/ai-bot/common/ai-persona.scss" +register_asset "stylesheets/modules/ai-bot/mobile/ai-persona.scss", :mobile register_asset "stylesheets/modules/embeddings/common/semantic-related-topics.scss" register_asset "stylesheets/modules/embeddings/common/semantic-search.scss" @@ -38,7 +39,7 @@ after_initialize do require_relative "discourse_automation/llm_triage" require_relative "discourse_automation/llm_report" - add_admin_route "discourse_ai.title", "discourse-ai" + add_admin_route("discourse_ai.title", "discourse-ai", { use_new_show_route: true }) [ DiscourseAi::Embeddings::EntryPoint.new,