WIP rename persona -> agent

This commit is contained in:
Sam Saffron 2025-05-29 15:17:34 +10:00
parent ad5c48d9ae
commit 4ba091aa8b
No known key found for this signature in database
GPG Key ID: B9606168D2FFD9F5
289 changed files with 2786 additions and 2372 deletions

View File

@ -0,0 +1,19 @@
import DiscourseRoute from "discourse/routes/discourse";
export default class AdminPluginsShowDiscourseAiAgentsEdit extends DiscourseRoute {
async model(params) {
const allAgents = this.modelFor(
"adminPlugins.show.discourse-ai-agents"
);
const id = parseInt(params.id, 10);
return allAgents.findBy("id", id);
}
setupController(controller, model) {
super.setupController(controller, model);
controller.set(
"allAgents",
this.modelFor("adminPlugins.show.discourse-ai-agents")
);
}
}

View File

@ -1,16 +1,16 @@
import { AUTO_GROUPS } from "discourse/lib/constants"; import { AUTO_GROUPS } from "discourse/lib/constants";
import DiscourseRoute from "discourse/routes/discourse"; import DiscourseRoute from "discourse/routes/discourse";
export default class AdminPluginsShowDiscourseAiPersonasNew extends DiscourseRoute { export default class AdminPluginsShowDiscourseAiAgentsNew extends DiscourseRoute {
async model() { async model() {
const record = this.store.createRecord("ai-persona"); const record = this.store.createRecord("ai-agent");
record.set("allowed_group_ids", [AUTO_GROUPS.trust_level_0.id]); record.set("allowed_group_ids", [AUTO_GROUPS.trust_level_0.id]);
record.set("rag_uploads", []); record.set("rag_uploads", []);
// these match the defaults on the table // these match the defaults on the table
record.set("rag_chunk_tokens", 374); record.set("rag_chunk_tokens", 374);
record.set("rag_chunk_overlap_tokens", 10); record.set("rag_chunk_overlap_tokens", 10);
record.set("rag_conversation_chunks", 10); record.set("rag_conversation_chunks", 10);
record.set("allow_personal_messages", true); record.set("allow_agentl_messages", true);
record.set("tool_details", false); record.set("tool_details", false);
return record; return record;
} }
@ -18,8 +18,8 @@ export default class AdminPluginsShowDiscourseAiPersonasNew extends DiscourseRou
setupController(controller, model) { setupController(controller, model) {
super.setupController(controller, model); super.setupController(controller, model);
controller.set( controller.set(
"allPersonas", "allAgents",
this.modelFor("adminPlugins.show.discourse-ai-personas") this.modelFor("adminPlugins.show.discourse-ai-agents")
); );
} }
} }

View File

@ -0,0 +1,7 @@
import DiscourseRoute from "discourse/routes/discourse";
export default class DiscourseAiAiAgentsRoute extends DiscourseRoute {
model() {
return this.store.findAll("ai-agent");
}
}

View File

@ -1,19 +0,0 @@
import DiscourseRoute from "discourse/routes/discourse";
export default class AdminPluginsShowDiscourseAiPersonasEdit extends DiscourseRoute {
async model(params) {
const allPersonas = this.modelFor(
"adminPlugins.show.discourse-ai-personas"
);
const id = parseInt(params.id, 10);
return allPersonas.findBy("id", id);
}
setupController(controller, model) {
super.setupController(controller, model);
controller.set(
"allPersonas",
this.modelFor("adminPlugins.show.discourse-ai-personas")
);
}
}

View File

@ -1,7 +0,0 @@
import DiscourseRoute from "discourse/routes/discourse";
export default class DiscourseAiAiPersonasRoute extends DiscourseRoute {
model() {
return this.store.findAll("ai-persona");
}
}

View File

@ -0,0 +1,4 @@
<AiAgentListEditor
@agents={{this.allAgents}}
@currentAgent={{this.model}}
/>

View File

@ -0,0 +1 @@
<AiAgentListEditor @agents={{this.model}} />

View File

@ -0,0 +1,4 @@
<AiAgentListEditor
@agents={{this.allAgents}}
@currentAgent={{this.model}}
/>

View File

@ -15,7 +15,7 @@ export default RouteTemplate(
const prefix = "discourse_ai.features.list.header"; const prefix = "discourse_ai.features.list.header";
return [ return [
i18n(`${prefix}.name`), i18n(`${prefix}.name`),
i18n(`${prefix}.persona`), i18n(`${prefix}.agent`),
i18n(`${prefix}.groups`), i18n(`${prefix}.groups`),
"", "",
]; ];
@ -75,21 +75,21 @@ export default RouteTemplate(
</span> </span>
</td> </td>
<td <td
class="d-admin-row__detail ai-feature-list__row-item ai-feature-list__persona" class="d-admin-row__detail ai-feature-list__row-item ai-feature-list__agent"
> >
<DButton <DButton
class="btn-flat btn-small ai-feature-list__row-item-persona" class="btn-flat btn-small ai-feature-list__row-item-agent"
@translatedLabel={{feature.persona.name}} @translatedLabel={{feature.agent.name}}
@route="adminPlugins.show.discourse-ai-personas.edit" @route="adminPlugins.show.discourse-ai-agents.edit"
@routeModels={{feature.persona.id}} @routeModels={{feature.agent.id}}
/> />
</td> </td>
<td <td
class="d-admin-row__detail ai-feature-list__row-item ai-feature-list__groups" class="d-admin-row__detail ai-feature-list__row-item ai-feature-list__groups"
> >
{{#if (gt feature.persona.allowed_groups.length 0)}} {{#if (gt feature.agent.allowed_groups.length 0)}}
<ul class="ai-feature-list__row-item-groups"> <ul class="ai-feature-list__row-item-groups">
{{#each feature.persona.allowed_groups as |group|}} {{#each feature.agent.allowed_groups as |group|}}
<li>{{group.name}}</li> <li>{{group.name}}</li>
{{/each}} {{/each}}
</ul> </ul>

View File

@ -1,4 +0,0 @@
<AiPersonaListEditor
@personas={{this.allPersonas}}
@currentPersona={{this.model}}
/>

View File

@ -1 +0,0 @@
<AiPersonaListEditor @personas={{this.model}} />

View File

@ -1,4 +0,0 @@
<AiPersonaListEditor
@personas={{this.allPersonas}}
@currentPersona={{this.model}}
/>

View File

@ -1,4 +1,4 @@
<section class="ai-persona-tool-editor__current admin-detail pull-left"> <section class="ai-agent-tool-editor__current admin-detail pull-left">
<AiToolEditor <AiToolEditor
@tools={{this.allTools}} @tools={{this.allTools}}
@model={{this.model}} @model={{this.model}}

View File

@ -1,4 +1,4 @@
<section class="ai-persona-tool-editor__current admin-detail pull-left"> <section class="ai-agent-tool-editor__current admin-detail pull-left">
<AiToolEditor <AiToolEditor
@tools={{this.allTools}} @tools={{this.allTools}}
@model={{this.model}} @model={{this.model}}

View File

@ -2,20 +2,20 @@
module DiscourseAi module DiscourseAi
module Admin module Admin
class AiPersonasController < ::Admin::AdminController class AiAgentsController < ::Admin::AdminController
requires_plugin ::DiscourseAi::PLUGIN_NAME requires_plugin ::DiscourseAi::PLUGIN_NAME
before_action :find_ai_persona, only: %i[edit update destroy create_user] before_action :find_ai_agent, only: %i[edit update destroy create_user]
def index def index
ai_personas = ai_agents =
AiPersona.ordered.map do |persona| AiAgent.ordered.map do |agent|
# we use a special serializer here cause names and descriptions are # we use a special serializer here cause names and descriptions are
# localized for system personas # localized for system agents
LocalizedAiPersonaSerializer.new(persona, root: false) LocalizedAiAgentSerializer.new(agent, root: false)
end end
tools = tools =
DiscourseAi::Personas::Persona.all_available_tools.map do |tool| DiscourseAi::Agents::Agent.all_available_tools.map do |tool|
AiToolSerializer.new(tool, root: false) AiToolSerializer.new(tool, root: false)
end end
AiTool AiTool
@ -36,7 +36,7 @@ module DiscourseAi
allowed_seeded_llm_ids: SiteSetting.ai_bot_allowed_seeded_models_map, allowed_seeded_llm_ids: SiteSetting.ai_bot_allowed_seeded_models_map,
) )
render json: { render json: {
ai_personas: ai_personas, ai_agents: ai_agents,
meta: { meta: {
tools: tools, tools: tools,
llms: llms, llms: llms,
@ -51,55 +51,55 @@ module DiscourseAi
end end
def edit def edit
render json: LocalizedAiPersonaSerializer.new(@ai_persona) render json: LocalizedAiAgentSerializer.new(@ai_agent)
end end
def create def create
ai_persona = AiPersona.new(ai_persona_params.except(:rag_uploads)) ai_agent = AiAgent.new(ai_agent_params.except(:rag_uploads))
if ai_persona.save if ai_agent.save
RagDocumentFragment.link_target_and_uploads(ai_persona, attached_upload_ids) RagDocumentFragment.link_target_and_uploads(ai_agent, attached_upload_ids)
render json: { render json: {
ai_persona: LocalizedAiPersonaSerializer.new(ai_persona, root: false), ai_agent: LocalizedAiAgentSerializer.new(ai_agent, root: false),
}, },
status: :created status: :created
else else
render_json_error ai_persona render_json_error ai_agent
end end
end end
def create_user def create_user
user = @ai_persona.create_user! user = @ai_agent.create_user!
render json: BasicUserSerializer.new(user, root: "user") render json: BasicUserSerializer.new(user, root: "user")
end end
def update def update
if @ai_persona.update(ai_persona_params.except(:rag_uploads)) if @ai_agent.update(ai_agent_params.except(:rag_uploads))
RagDocumentFragment.update_target_uploads(@ai_persona, attached_upload_ids) RagDocumentFragment.update_target_uploads(@ai_agent, attached_upload_ids)
render json: LocalizedAiPersonaSerializer.new(@ai_persona, root: false) render json: LocalizedAiAgentSerializer.new(@ai_agent, root: false)
else else
render_json_error @ai_persona render_json_error @ai_agent
end end
end end
def destroy def destroy
if @ai_persona.destroy if @ai_agent.destroy
head :no_content head :no_content
else else
render_json_error @ai_persona render_json_error @ai_agent
end end
end end
def stream_reply def stream_reply
persona = agent =
AiPersona.find_by(name: params[:persona_name]) || AiAgent.find_by(name: params[:agent_name]) ||
AiPersona.find_by(id: params[:persona_id]) AiAgent.find_by(id: params[:agent_id])
return render_json_error(I18n.t("discourse_ai.errors.persona_not_found")) if persona.nil? return render_json_error(I18n.t("discourse_ai.errors.agent_not_found")) if agent.nil?
return render_json_error(I18n.t("discourse_ai.errors.persona_disabled")) if !persona.enabled return render_json_error(I18n.t("discourse_ai.errors.agent_disabled")) if !agent.enabled
if persona.default_llm.blank? if agent.default_llm.blank?
return render_json_error(I18n.t("discourse_ai.errors.no_default_llm")) return render_json_error(I18n.t("discourse_ai.errors.no_default_llm"))
end end
@ -107,8 +107,8 @@ module DiscourseAi
return render_json_error(I18n.t("discourse_ai.errors.no_query_specified")) return render_json_error(I18n.t("discourse_ai.errors.no_query_specified"))
end end
if !persona.user_id if !agent.user_id
return render_json_error(I18n.t("discourse_ai.errors.no_user_for_persona")) return render_json_error(I18n.t("discourse_ai.errors.no_user_for_agent"))
end end
if !params[:username] && !params[:user_unique_id] if !params[:username] && !params[:user_unique_id]
@ -142,7 +142,7 @@ module DiscourseAi
DiscourseAi::AiBot::ResponseHttpStreamer.queue_streamed_reply( DiscourseAi::AiBot::ResponseHttpStreamer.queue_streamed_reply(
io: io, io: io,
persona: persona, agent: agent,
user: user, user: user,
topic: topic, topic: topic,
query: params[:query].to_s, query: params[:query].to_s,
@ -178,17 +178,17 @@ module DiscourseAi
end end
end end
def find_ai_persona def find_ai_agent
@ai_persona = AiPersona.find(params[:id]) @ai_agent = AiAgent.find(params[:id])
end end
def attached_upload_ids def attached_upload_ids
ai_persona_params[:rag_uploads].to_a.map { |h| h[:id] } ai_agent_params[:rag_uploads].to_a.map { |h| h[:id] }
end end
def ai_persona_params def ai_agent_params
permitted = permitted =
params.require(:ai_persona).permit( params.require(:ai_agent).permit(
:name, :name,
:description, :description,
:enabled, :enabled,
@ -209,7 +209,7 @@ module DiscourseAi
:allow_chat_channel_mentions, :allow_chat_channel_mentions,
:allow_chat_direct_messages, :allow_chat_direct_messages,
:allow_topic_mentions, :allow_topic_mentions,
:allow_personal_messages, :allow_agentl_messages,
:tool_details, :tool_details,
:forced_tool_count, :forced_tool_count,
:force_default_llm, :force_default_llm,
@ -217,15 +217,15 @@ module DiscourseAi
rag_uploads: [:id], rag_uploads: [:id],
) )
if tools = params.dig(:ai_persona, :tools) if tools = params.dig(:ai_agent, :tools)
permitted[:tools] = permit_tools(tools) permitted[:tools] = permit_tools(tools)
end end
if response_format = params.dig(:ai_persona, :response_format) if response_format = params.dig(:ai_agent, :response_format)
permitted[:response_format] = permit_response_format(response_format) permitted[:response_format] = permit_response_format(response_format)
end end
if examples = params.dig(:ai_persona, :examples) if examples = params.dig(:ai_agent, :examples)
permitted[:examples] = permit_examples(examples) permitted[:examples] = permit_examples(examples)
end end

View File

@ -17,19 +17,19 @@ module DiscourseAi
private private
def serialize_features(features) def serialize_features(features)
features.map { |feature| feature.merge(persona: serialize_persona(feature[:persona])) } features.map { |feature| feature.merge(agent: serialize_agent(feature[:agent])) }
end end
def serialize_feature(feature) def serialize_feature(feature)
return nil if feature.blank? return nil if feature.blank?
feature.merge(persona: serialize_persona(feature[:persona])) feature.merge(agent: serialize_agent(feature[:agent]))
end end
def serialize_persona(persona) def serialize_agent(agent)
return nil if persona.blank? return nil if agent.blank?
serialize_data(persona, AiFeaturesPersonaSerializer, root: false) serialize_data(agent, AiFeaturesAgentSerializer, root: false)
end end
end end
end end

View File

@ -6,8 +6,8 @@ module DiscourseAi
requires_plugin ::DiscourseAi::PLUGIN_NAME requires_plugin ::DiscourseAi::PLUGIN_NAME
def indexing_status_check def indexing_status_check
if params[:target_type] == "AiPersona" if params[:target_type] == "AiAgent"
@target = AiPersona.find(params[:target_id]) @target = AiAgent.find(params[:target_id])
elsif params[:target_type] == "AiTool" elsif params[:target_type] == "AiTool"
@target = AiTool.find(params[:target_id]) @target = AiTool.find(params[:target_id])
else else

View File

@ -46,17 +46,17 @@ module DiscourseAi
end end
def discover def discover
ai_persona = ai_agent =
AiPersona AiAgent
.all_personas(enabled_only: false) .all_agents(enabled_only: false)
.find { |persona| persona.id == SiteSetting.ai_bot_discover_persona.to_i } .find { |agent| agent.id == SiteSetting.ai_bot_discover_agent.to_i }
if ai_persona.nil? || !current_user.in_any_groups?(ai_persona.allowed_group_ids.to_a) if ai_agent.nil? || !current_user.in_any_groups?(ai_agent.allowed_group_ids.to_a)
raise Discourse::InvalidAccess.new raise Discourse::InvalidAccess.new
end end
if ai_persona.default_llm_id.blank? if ai_agent.default_llm_id.blank?
render_json_error "Discover persona is missing a default LLM model.", status: 503 render_json_error "Discover agent is missing a default LLM model.", status: 503
return return
end end
@ -77,7 +77,7 @@ module DiscourseAi
user = User.find(params[:user_id]) user = User.find(params[:user_id])
bot_user_id = AiPersona.find_by(id: SiteSetting.ai_bot_discover_persona).user_id bot_user_id = AiAgent.find_by(id: SiteSetting.ai_bot_discover_agent).user_id
bot_username = User.find_by(id: bot_user_id).username bot_username = User.find_by(id: bot_user_id).username
query = params[:query] query = params[:query]

View File

@ -11,12 +11,12 @@ module ::Jobs
message = ::Chat::Message.find_by(id: args[:message_id]) message = ::Chat::Message.find_by(id: args[:message_id])
return if message.blank? return if message.blank?
personaClass = agentClass =
DiscourseAi::Personas::Persona.find_by(id: args[:persona_id], user: message.user) DiscourseAi::Agents::Agent.find_by(id: args[:agent_id], user: message.user)
return if personaClass.blank? return if agentClass.blank?
user = User.find_by(id: personaClass.user_id) user = User.find_by(id: agentClass.user_id)
bot = DiscourseAi::Personas::Bot.as(user, persona: personaClass.new) bot = DiscourseAi::Agents::Bot.as(user, agent: agentClass.new)
DiscourseAi::AiBot::Playground.new(bot).reply_to_chat_message( DiscourseAi::AiBot::Playground.new(bot).reply_to_chat_message(
message, message,

View File

@ -7,18 +7,18 @@ module ::Jobs
def execute(args) def execute(args)
return unless bot_user = User.find_by(id: args[:bot_user_id]) return unless bot_user = User.find_by(id: args[:bot_user_id])
return unless post = Post.includes(:topic).find_by(id: args[:post_id]) return unless post = Post.includes(:topic).find_by(id: args[:post_id])
persona_id = args[:persona_id] agent_id = args[:agent_id]
begin begin
persona = DiscourseAi::Personas::Persona.find_by(user: post.user, id: persona_id) agent = DiscourseAi::Agents::Agent.find_by(user: post.user, id: agent_id)
raise DiscourseAi::Personas::Bot::BOT_NOT_FOUND if persona.nil? raise DiscourseAi::Agents::Bot::BOT_NOT_FOUND if agent.nil?
bot = DiscourseAi::Personas::Bot.as(bot_user, persona: persona.new) bot = DiscourseAi::Agents::Bot.as(bot_user, agent: agent.new)
DiscourseAi::AiBot::Playground.new(bot).reply_to(post) DiscourseAi::AiBot::Playground.new(bot).reply_to(post)
rescue DiscourseAi::Personas::Bot::BOT_NOT_FOUND rescue DiscourseAi::Agents::Bot::BOT_NOT_FOUND
Rails.logger.warn( Rails.logger.warn(
"Bot not found for post #{post.id} - perhaps persona was deleted or bot was disabled", "Bot not found for post #{post.id} - perhaps agent was deleted or bot was disabled",
) )
end end
end end

View File

@ -9,8 +9,8 @@ module Jobs
return unless SiteSetting.ai_discord_search_enabled return unless SiteSetting.ai_discord_search_enabled
if SiteSetting.ai_discord_search_mode == "persona" if SiteSetting.ai_discord_search_mode == "agent"
DiscourseAi::Discord::Bot::PersonaReplier.new(interaction).handle_interaction! DiscourseAi::Discord::Bot::AgentReplier.new(interaction).handle_interaction!
else else
DiscourseAi::Discord::Bot::Search.new(interaction).handle_interaction! DiscourseAi::Discord::Bot::Search.new(interaction).handle_interaction!
end end

View File

@ -8,20 +8,20 @@ module Jobs
return if (user = User.find_by(id: args[:user_id])).nil? return if (user = User.find_by(id: args[:user_id])).nil?
return if (query = args[:query]).blank? return if (query = args[:query]).blank?
ai_persona_klass = ai_agent_klass =
AiPersona AiAgent
.all_personas(enabled_only: false) .all_agents(enabled_only: false)
.find { |persona| persona.id == SiteSetting.ai_bot_discover_persona.to_i } .find { |agent| agent.id == SiteSetting.ai_bot_discover_agent.to_i }
if ai_persona_klass.nil? || !user.in_any_groups?(ai_persona_klass.allowed_group_ids.to_a) if ai_agent_klass.nil? || !user.in_any_groups?(ai_agent_klass.allowed_group_ids.to_a)
return return
end end
return if (llm_model = LlmModel.find_by(id: ai_persona_klass.default_llm_id)).nil? return if (llm_model = LlmModel.find_by(id: ai_agent_klass.default_llm_id)).nil?
bot = bot =
DiscourseAi::Personas::Bot.as( DiscourseAi::Agents::Bot.as(
Discourse.system_user, Discourse.system_user,
persona: ai_persona_klass.new, agent: ai_agent_klass.new,
model: llm_model, model: llm_model,
) )
@ -31,7 +31,7 @@ module Jobs
base = { query: query, model_used: llm_model.display_name } base = { query: query, model_used: llm_model.display_name }
context = context =
DiscourseAi::Personas::BotContext.new( DiscourseAi::Agents::BotContext.new(
messages: [{ type: :user, content: query }], messages: [{ type: :user, content: query }],
skip_tool_details: true, skip_tool_details: true,
) )

View File

@ -1,16 +1,16 @@
# frozen_string_literal: true # frozen_string_literal: true
class AiPersona < ActiveRecord::Base class AiAgent < ActiveRecord::Base
# TODO remove this line 01-10-2025 # TODO remove this line 01-10-2025
self.ignored_columns = %i[default_llm question_consolidator_llm] self.ignored_columns = %i[default_llm question_consolidator_llm]
# places a hard limit, so per site we cache a maximum of 500 classes # places a hard limit, so per site we cache a maximum of 500 classes
MAX_PERSONAS_PER_SITE = 500 MAX_AGENTS_PER_SITE = 500
validates :name, presence: true, uniqueness: true, length: { maximum: 100 } validates :name, presence: true, uniqueness: true, length: { maximum: 100 }
validates :description, presence: true, length: { maximum: 2000 } validates :description, presence: true, length: { maximum: 2000 }
validates :system_prompt, presence: true, length: { maximum: 10_000_000 } validates :system_prompt, presence: true, length: { maximum: 10_000_000 }
validate :system_persona_unchangeable, on: :update, if: :system validate :system_agent_unchangeable, on: :update, if: :system
validate :chat_preconditions validate :chat_preconditions
validate :allowed_seeded_model, if: :default_llm_id validate :allowed_seeded_model, if: :default_llm_id
validate :well_formated_examples validate :well_formated_examples
@ -41,50 +41,50 @@ class AiPersona < ActiveRecord::Base
before_destroy :ensure_not_system before_destroy :ensure_not_system
before_update :regenerate_rag_fragments before_update :regenerate_rag_fragments
def self.persona_cache def self.agent_cache
@persona_cache ||= ::DiscourseAi::MultisiteHash.new("persona_cache") @agent_cache ||= ::DiscourseAi::MultisiteHash.new("agent_cache")
end end
scope :ordered, -> { order("priority DESC, lower(name) ASC") } scope :ordered, -> { order("priority DESC, lower(name) ASC") }
def self.all_personas(enabled_only: true) def self.all_agents(enabled_only: true)
persona_cache[:value] ||= AiPersona agent_cache[:value] ||= AiAgent
.ordered .ordered
.all .all
.limit(MAX_PERSONAS_PER_SITE) .limit(MAX_AGENTS_PER_SITE)
.map(&:class_instance) .map(&:class_instance)
if enabled_only if enabled_only
persona_cache[:value].select { |p| p.enabled } agent_cache[:value].select { |p| p.enabled }
else else
persona_cache[:value] agent_cache[:value]
end end
end end
def self.persona_users(user: nil) def self.agent_users(user: nil)
persona_users = agent_users =
persona_cache[:persona_users] ||= AiPersona agent_cache[:agent_users] ||= AiAgent
.where(enabled: true) .where(enabled: true)
.joins(:user) .joins(:user)
.map do |persona| .map do |agent|
{ {
id: persona.id, id: agent.id,
user_id: persona.user_id, user_id: agent.user_id,
username: persona.user.username_lower, username: agent.user.username_lower,
allowed_group_ids: persona.allowed_group_ids, allowed_group_ids: agent.allowed_group_ids,
default_llm_id: persona.default_llm_id, default_llm_id: agent.default_llm_id,
force_default_llm: persona.force_default_llm, force_default_llm: agent.force_default_llm,
allow_chat_channel_mentions: persona.allow_chat_channel_mentions, allow_chat_channel_mentions: agent.allow_chat_channel_mentions,
allow_chat_direct_messages: persona.allow_chat_direct_messages, allow_chat_direct_messages: agent.allow_chat_direct_messages,
allow_topic_mentions: persona.allow_topic_mentions, allow_topic_mentions: agent.allow_topic_mentions,
allow_personal_messages: persona.allow_personal_messages, allow_agentl_messages: agent.allow_agentl_messages,
} }
end end
if user if user
persona_users.select { |persona_user| user.in_any_groups?(persona_user[:allowed_group_ids]) } agent_users.select { |agent_user| user.in_any_groups?(agent_user[:allowed_group_ids]) }
else else
persona_users agent_users
end end
end end
@ -93,31 +93,31 @@ class AiPersona < ActiveRecord::Base
allow_chat_channel_mentions: false, allow_chat_channel_mentions: false,
allow_chat_direct_messages: false, allow_chat_direct_messages: false,
allow_topic_mentions: false, allow_topic_mentions: false,
allow_personal_messages: false allow_agentl_messages: false
) )
index = index =
"modality-#{allow_chat_channel_mentions}-#{allow_chat_direct_messages}-#{allow_topic_mentions}-#{allow_personal_messages}" "modality-#{allow_chat_channel_mentions}-#{allow_chat_direct_messages}-#{allow_topic_mentions}-#{allow_agentl_messages}"
personas = agents =
persona_cache[index.to_sym] ||= persona_users.select do |persona| agent_cache[index.to_sym] ||= agent_users.select do |agent|
next true if allow_chat_channel_mentions && persona[:allow_chat_channel_mentions] next true if allow_chat_channel_mentions && agent[:allow_chat_channel_mentions]
next true if allow_chat_direct_messages && persona[:allow_chat_direct_messages] next true if allow_chat_direct_messages && agent[:allow_chat_direct_messages]
next true if allow_topic_mentions && persona[:allow_topic_mentions] next true if allow_topic_mentions && agent[:allow_topic_mentions]
next true if allow_personal_messages && persona[:allow_personal_messages] next true if allow_agentl_messages && agent[:allow_agentl_messages]
false false
end end
if user if user
personas.select { |u| user.in_any_groups?(u[:allowed_group_ids]) } agents.select { |u| user.in_any_groups?(u[:allowed_group_ids]) }
else else
personas agents
end end
end end
after_commit :bump_cache after_commit :bump_cache
def bump_cache def bump_cache
self.class.persona_cache.flush! self.class.agent_cache.flush!
end end
def tools_can_not_be_duplicated def tools_can_not_be_duplicated
@ -138,7 +138,7 @@ class AiPersona < ActiveRecord::Base
end end
if seen_tools.include?(inner_name) if seen_tools.include?(inner_name)
errors.add(:tools, I18n.t("discourse_ai.ai_bot.personas.cannot_have_duplicate_tools")) errors.add(:tools, I18n.t("discourse_ai.ai_bot.agents.cannot_have_duplicate_tools"))
break break
else else
seen_tools.add(inner_name) seen_tools.add(inner_name)
@ -154,7 +154,7 @@ class AiPersona < ActiveRecord::Base
.pluck(:tool_name) .pluck(:tool_name)
.each do |tool_name| .each do |tool_name|
if builtin_tool_names.include?(tool_name.downcase) if builtin_tool_names.include?(tool_name.downcase)
errors.add(:tools, I18n.t("discourse_ai.ai_bot.personas.cannot_have_duplicate_tools")) errors.add(:tools, I18n.t("discourse_ai.ai_bot.agents.cannot_have_duplicate_tools"))
break break
end end
end end
@ -176,7 +176,7 @@ class AiPersona < ActiveRecord::Base
allow_chat_channel_mentions allow_chat_channel_mentions
allow_chat_direct_messages allow_chat_direct_messages
allow_topic_mentions allow_topic_mentions
allow_personal_messages allow_agentl_messages
force_default_llm force_default_llm
name name
description description
@ -208,14 +208,14 @@ class AiPersona < ActiveRecord::Base
if inner_name.start_with?("custom-") if inner_name.start_with?("custom-")
custom_tool_id = inner_name.split("-", 2).last.to_i custom_tool_id = inner_name.split("-", 2).last.to_i
if AiTool.exists?(id: custom_tool_id, enabled: true) if AiTool.exists?(id: custom_tool_id, enabled: true)
klass = DiscourseAi::Personas::Tools::Custom.class_instance(custom_tool_id) klass = DiscourseAi::Agents::Tools::Custom.class_instance(custom_tool_id)
end end
else else
inner_name = inner_name.gsub("Tool", "") inner_name = inner_name.gsub("Tool", "")
inner_name = "List#{inner_name}" if %w[Categories Tags].include?(inner_name) inner_name = "List#{inner_name}" if %w[Categories Tags].include?(inner_name)
begin begin
klass = "DiscourseAi::Personas::Tools::#{inner_name}".constantize klass = "DiscourseAi::Agents::Tools::#{inner_name}".constantize
options[klass] = current_options if current_options options[klass] = current_options if current_options
rescue StandardError rescue StandardError
end end
@ -225,14 +225,14 @@ class AiPersona < ActiveRecord::Base
klass klass
end end
persona_class = DiscourseAi::Personas::Persona.system_personas_by_id[self.id] agent_class = DiscourseAi::Agents::Agent.system_agents_by_id[self.id]
if persona_class if agent_class
return( return(
# we need a new copy so we don't leak information # we need a new copy so we don't leak information
# across sites # across sites
Class.new(persona_class) do Class.new(agent_class) do
# required for localization # required for localization
define_singleton_method(:to_s) { persona_class.to_s } define_singleton_method(:to_s) { agent_class.to_s }
instance_attributes.each do |key, value| instance_attributes.each do |key, value|
# description/name are localized # description/name are localized
define_singleton_method(key) { value } if key != :description && key != :name define_singleton_method(key) { value } if key != :description && key != :name
@ -242,9 +242,9 @@ class AiPersona < ActiveRecord::Base
) )
end end
ai_persona_id = self.id ai_agent_id = self.id
Class.new(DiscourseAi::Personas::Persona) do Class.new(DiscourseAi::Agents::Agent) do
instance_attributes.each { |key, value| define_singleton_method(key) { value } } instance_attributes.each { |key, value| define_singleton_method(key) { value } }
define_singleton_method(:to_s) do define_singleton_method(:to_s) do
@ -254,24 +254,24 @@ class AiPersona < ActiveRecord::Base
define_singleton_method(:inspect) { to_s } define_singleton_method(:inspect) { to_s }
define_method(:initialize) do |*args, **kwargs| define_method(:initialize) do |*args, **kwargs|
@ai_persona = AiPersona.find_by(id: ai_persona_id) @ai_agent = AiAgent.find_by(id: ai_agent_id)
super(*args, **kwargs) super(*args, **kwargs)
end end
define_method(:tools) { tools } define_method(:tools) { tools }
define_method(:force_tool_use) { force_tool_use } define_method(:force_tool_use) { force_tool_use }
define_method(:forced_tool_count) { @ai_persona&.forced_tool_count } define_method(:forced_tool_count) { @ai_agent&.forced_tool_count }
define_method(:options) { options } define_method(:options) { options }
define_method(:temperature) { @ai_persona&.temperature } define_method(:temperature) { @ai_agent&.temperature }
define_method(:top_p) { @ai_persona&.top_p } define_method(:top_p) { @ai_agent&.top_p }
define_method(:system_prompt) { @ai_persona&.system_prompt || "You are a helpful bot." } define_method(:system_prompt) { @ai_agent&.system_prompt || "You are a helpful bot." }
define_method(:uploads) { @ai_persona&.uploads } define_method(:uploads) { @ai_agent&.uploads }
define_method(:response_format) { @ai_persona&.response_format } define_method(:response_format) { @ai_agent&.response_format }
define_method(:examples) { @ai_persona&.examples } define_method(:examples) { @ai_agent&.examples }
end end
end end
FIRST_PERSONA_USER_ID = -1200 FIRST_AGENT_USER_ID = -1200
def create_user! def create_user!
raise "User already exists" if user_id && User.exists?(user_id) raise "User already exists" if user_id && User.exists?(user_id)
@ -279,7 +279,7 @@ class AiPersona < ActiveRecord::Base
# find the first id smaller than FIRST_USER_ID that is not taken # find the first id smaller than FIRST_USER_ID that is not taken
id = nil id = nil
id = DB.query_single(<<~SQL, FIRST_PERSONA_USER_ID, FIRST_PERSONA_USER_ID - 200).first id = DB.query_single(<<~SQL, FIRST_AGENT_USER_ID, FIRST_AGENT_USER_ID - 200).first
WITH seq AS ( WITH seq AS (
SELECT generate_series(?, ?, -1) AS id SELECT generate_series(?, ?, -1) AS id
) )
@ -323,12 +323,12 @@ class AiPersona < ActiveRecord::Base
allow_chat_channel_mentions || allow_chat_direct_messages || allow_topic_mentions || allow_chat_channel_mentions || allow_chat_direct_messages || allow_topic_mentions ||
force_default_llm force_default_llm
) && !default_llm_id ) && !default_llm_id
errors.add(:default_llm, I18n.t("discourse_ai.ai_bot.personas.default_llm_required")) errors.add(:default_llm, I18n.t("discourse_ai.ai_bot.agents.default_llm_required"))
end end
end end
def system_persona_unchangeable def system_agent_unchangeable
error_msg = I18n.t("discourse_ai.ai_bot.personas.cannot_edit_system_persona") error_msg = I18n.t("discourse_ai.ai_bot.agents.cannot_edit_system_agent")
if top_p_changed? || temperature_changed? || system_prompt_changed? || name_changed? || if top_p_changed? || temperature_changed? || system_prompt_changed? || name_changed? ||
description_changed? description_changed?
@ -356,7 +356,7 @@ class AiPersona < ActiveRecord::Base
def ensure_not_system def ensure_not_system
if system if system
errors.add(:base, I18n.t("discourse_ai.ai_bot.personas.cannot_delete_system_persona")) errors.add(:base, I18n.t("discourse_ai.ai_bot.agents.cannot_delete_system_agent"))
throw :abort throw :abort
end end
end end
@ -380,13 +380,13 @@ class AiPersona < ActiveRecord::Base
return return
end end
errors.add(:examples, I18n.t("discourse_ai.personas.malformed_examples")) errors.add(:examples, I18n.t("discourse_ai.agents.malformed_examples"))
end end
end end
# == Schema Information # == Schema Information
# #
# Table name: ai_personas # Table name: ai_agents
# #
# id :bigint not null, primary key # id :bigint not null, primary key
# name :string(100) not null # name :string(100) not null
@ -414,7 +414,7 @@ end
# allow_chat_channel_mentions :boolean default(FALSE), not null # allow_chat_channel_mentions :boolean default(FALSE), not null
# allow_chat_direct_messages :boolean default(FALSE), not null # allow_chat_direct_messages :boolean default(FALSE), not null
# allow_topic_mentions :boolean default(FALSE), not null # allow_topic_mentions :boolean default(FALSE), not null
# allow_personal_messages :boolean default(TRUE), not null # allow_agentl_messages :boolean default(TRUE), not null
# force_default_llm :boolean default(FALSE), not null # force_default_llm :boolean default(FALSE), not null
# rag_llm_model_id :bigint # rag_llm_model_id :bigint
# default_llm_id :bigint # default_llm_id :bigint
@ -424,5 +424,5 @@ end
# #
# Indexes # Indexes
# #
# index_ai_personas_on_name (name) UNIQUE # index_ai_agents_on_name (name) UNIQUE
# #

View File

@ -36,7 +36,7 @@ class AiTool < ActiveRecord::Base
end end
def runner(parameters, llm:, bot_user:, context: nil) def runner(parameters, llm:, bot_user:, context: nil)
DiscourseAi::Personas::ToolRunner.new( DiscourseAi::Agents::ToolRunner.new(
parameters: parameters, parameters: parameters,
llm: llm, llm: llm,
bot_user: bot_user, bot_user: bot_user,
@ -45,10 +45,10 @@ class AiTool < ActiveRecord::Base
) )
end end
after_commit :bump_persona_cache after_commit :bump_agent_cache
def bump_persona_cache def bump_agent_cache
AiPersona.persona_cache.flush! AiAgent.agent_cache.flush!
end end
def regenerate_rag_fragments def regenerate_rag_fragments
@ -176,11 +176,11 @@ class AiTool < ActiveRecord::Base
* user_id_or_username (number | string): The ID or username of the user. * user_id_or_username (number | string): The ID or username of the user.
* Returns: Object (User details using UserSerializer structure) or null if not found. * Returns: Object (User details using UserSerializer structure) or null if not found.
* *
* discourse.getPersona(name): Gets an object representing another AI Persona configured on the site. * discourse.getAgent(name): Gets an object representing another AI Agent configured on the site.
* Parameters: * Parameters:
* name (string): The name of the target persona. * name (string): The name of the target agent.
* Returns: Object { respondTo: function(params) } or null if persona not found. * Returns: Object { respondTo: function(params) } or null if agent not found.
* respondTo(params): Instructs the target persona to generate a response within the current context (e.g., replying to the same post or chat message). * respondTo(params): Instructs the target agent to generate a response within the current context (e.g., replying to the same post or chat message).
* Parameters: * Parameters:
* params (Object, optional): { instructions: string, whisper: boolean } * params (Object, optional): { instructions: string, whisper: boolean }
* Returns: { success: boolean, post_id?: number, post_number?: number, message_id?: number } or { error: string } * Returns: { success: boolean, post_id?: number, post_number?: number, message_id?: number } or { error: string }
@ -201,7 +201,7 @@ class AiTool < ActiveRecord::Base
* private_message (boolean): Whether the context is a private message (in Post context). * private_message (boolean): Whether the context is a private message (in Post context).
* message_id (number): ID of the chat message triggering the tool (if in Chat context). * message_id (number): ID of the chat message triggering the tool (if in Chat context).
* channel_id (number): ID of the chat channel (if in Chat context). * channel_id (number): ID of the chat channel (if in Chat context).
* user (Object): Details of the user invoking the tool/persona (structure may vary, often null or SystemUser details unless explicitly passed). * user (Object): Details of the user invoking the tool/agent (structure may vary, often null or SystemUser details unless explicitly passed).
* participants (string): Comma-separated list of usernames in a PM (if applicable). * participants (string): Comma-separated list of usernames in a PM (if applicable).
* // ... other potential context-specific properties added by the calling environment. * // ... other potential context-specific properties added by the calling environment.
* *

View File

@ -2,7 +2,7 @@
class RagDocumentFragment < ActiveRecord::Base class RagDocumentFragment < ActiveRecord::Base
# TODO Jan 2025 - remove # TODO Jan 2025 - remove
self.ignored_columns = %i[ai_persona_id] self.ignored_columns = %i[ai_agent_id]
belongs_to :upload belongs_to :upload
belongs_to :target, polymorphic: true belongs_to :target, polymorphic: true
@ -38,7 +38,7 @@ class RagDocumentFragment < ActiveRecord::Base
end end
end end
def indexing_status(persona, uploads) def indexing_status(agent, uploads)
embeddings_table = DiscourseAi::Embeddings::Schema.for(self).table embeddings_table = DiscourseAi::Embeddings::Schema.for(self).table
results = results =
@ -56,8 +56,8 @@ class RagDocumentFragment < ActiveRecord::Base
WHERE uploads.id IN (:upload_ids) WHERE uploads.id IN (:upload_ids)
GROUP BY uploads.id GROUP BY uploads.id
SQL SQL
target_id: persona.id, target_id: agent.id,
target_type: persona.class.to_s, target_type: agent.class.to_s,
upload_ids: uploads.map(&:id), upload_ids: uploads.map(&:id),
) )

View File

@ -51,13 +51,13 @@ class SharedAiConversation < ActiveRecord::Base
# but this name works # but this name works
class SharedPost class SharedPost
attr_accessor :user attr_accessor :user
attr_reader :id, :user_id, :created_at, :cooked, :persona attr_reader :id, :user_id, :created_at, :cooked, :agent
def initialize(post) def initialize(post)
@id = post[:id] @id = post[:id]
@user_id = post[:user_id] @user_id = post[:user_id]
@created_at = DateTime.parse(post[:created_at]) @created_at = DateTime.parse(post[:created_at])
@cooked = post[:cooked] @cooked = post[:cooked]
@persona = post[:persona] @agent = post[:agent]
end end
end end
@ -140,9 +140,9 @@ class SharedAiConversation < ActiveRecord::Base
llm_name = ActiveSupport::Inflector.humanize(llm_name) if llm_name llm_name = ActiveSupport::Inflector.humanize(llm_name) if llm_name
llm_name ||= I18n.t("discourse_ai.unknown_model") llm_name ||= I18n.t("discourse_ai.unknown_model")
persona = nil agent = nil
if persona_id = topic.custom_fields["ai_persona_id"] if agent_id = topic.custom_fields["ai_agent_id"]
persona = AiPersona.find_by(id: persona_id.to_i)&.name agent = AiAgent.find_by(id: agent_id.to_i)&.name
end end
posts = posts =
@ -167,7 +167,7 @@ class SharedAiConversation < ActiveRecord::Base
cooked: cook_artifacts(post), cooked: cook_artifacts(post),
} }
mapped[:persona] = persona if ai_bot_participant&.id == post.user_id mapped[:agent] = agent if ai_bot_participant&.id == post.user_id
mapped[:username] = post.user&.username if include_usernames mapped[:username] = post.user&.username if include_usernames
mapped mapped
end, end,

View File

@ -1,6 +1,6 @@
# frozen_string_literal: true # frozen_string_literal: true
class AiFeaturesPersonaSerializer < ApplicationSerializer class AiFeaturesAgentSerializer < ApplicationSerializer
attributes :id, :name, :system_prompt, :allowed_groups, :enabled attributes :id, :name, :system_prompt, :allowed_groups, :enabled
def allowed_groups def allowed_groups

View File

@ -2,7 +2,7 @@
class LlmModelSerializer < ApplicationSerializer class LlmModelSerializer < ApplicationSerializer
# TODO: we probably should rename the table LlmModel to AiLlm # TODO: we probably should rename the table LlmModel to AiLlm
# it is consistent with AiPersona and AiTool # it is consistent with AiAgent and AiTool
# LLM model is a bit confusing given that large langauge model model is a confusing # LLM model is a bit confusing given that large langauge model model is a confusing
# name # name
root "ai_llm" root "ai_llm"

View File

@ -1,7 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
class LocalizedAiPersonaSerializer < ApplicationSerializer class LocalizedAiAgentSerializer < ApplicationSerializer
root "ai_persona" root "ai_agent"
attributes :id, attributes :id,
:name, :name,
@ -29,7 +29,7 @@ class LocalizedAiPersonaSerializer < ApplicationSerializer
:allow_chat_channel_mentions, :allow_chat_channel_mentions,
:allow_chat_direct_messages, :allow_chat_direct_messages,
:allow_topic_mentions, :allow_topic_mentions,
:allow_personal_messages, :allow_agentl_messages,
:force_default_llm, :force_default_llm,
:response_format, :response_format,
:examples :examples

View File

@ -43,8 +43,8 @@
<article class="post"> <article class="post">
<header class="post__header"> <header class="post__header">
<span class="post__user"><%= post.user.username %></span> <span class="post__user"><%= post.user.username %></span>
<%if post.persona.present? %> <%if post.agent.present? %>
<span class="post__persona"><%= post.persona %></span> <span class="post__agent"><%= post.agent %></span>
<% end %> <% end %>
<time class="post__date" datetime="<%= post.created_at.iso8601 %>"><%= post.created_at.strftime('%Y-%m-%d') %></time> <time class="post__date" datetime="<%= post.created_at.iso8601 %>"><%= post.created_at.strftime('%Y-%m-%d') %></time>
</header> </header>

View File

@ -4,7 +4,7 @@ export default {
path: "/plugins", path: "/plugins",
map() { map() {
this.route("discourse-ai-personas", { path: "ai-personas" }, function () { this.route("discourse-ai-agents", { path: "ai-agents" }, function () {
this.route("new"); this.route("new");
this.route("edit", { path: "/:id/edit" }); this.route("edit", { path: "/:id/edit" });
}); });

View File

@ -16,6 +16,6 @@ export default class Adapter extends RestAdapter {
} }
apiNameFor() { apiNameFor() {
return "ai-persona"; return "ai-agent";
} }
} }

View File

@ -29,7 +29,7 @@ const CREATE_ATTRIBUTES = [
"allow_chat", "allow_chat",
"tool_details", "tool_details",
"forced_tool_count", "forced_tool_count",
"allow_personal_messages", "allow_agentl_messages",
"allow_topic_mentions", "allow_topic_mentions",
"allow_chat_channel_mentions", "allow_chat_channel_mentions",
"allow_chat_direct_messages", "allow_chat_direct_messages",
@ -58,16 +58,16 @@ const SYSTEM_ATTRIBUTES = [
"rag_llm_model_id", "rag_llm_model_id",
"question_consolidator_llm_id", "question_consolidator_llm_id",
"tool_details", "tool_details",
"allow_personal_messages", "allow_agentl_messages",
"allow_topic_mentions", "allow_topic_mentions",
"allow_chat_channel_mentions", "allow_chat_channel_mentions",
"allow_chat_direct_messages", "allow_chat_direct_messages",
]; ];
export default class AiPersona extends RestModel { export default class AiAgent extends RestModel {
async createUser() { async createUser() {
const result = await ajax( const result = await ajax(
`/admin/plugins/discourse-ai/ai-personas/${this.id}/create-user.json`, `/admin/plugins/discourse-ai/ai-agents/${this.id}/create-user.json`,
{ {
type: "POST", type: "POST",
} }
@ -143,10 +143,10 @@ export default class AiPersona extends RestModel {
fromPOJO(data) { fromPOJO(data) {
const dataClone = JSON.parse(JSON.stringify(data)); const dataClone = JSON.parse(JSON.stringify(data));
const persona = AiPersona.create(dataClone); const agent = AiAgent.create(dataClone);
persona.tools = this.flattenedToolStructure(dataClone); agent.tools = this.flattenedToolStructure(dataClone);
return persona; return agent;
} }
toPOJO() { toPOJO() {

View File

@ -8,8 +8,8 @@ export default class AiFeature extends RestModel {
"ref", "ref",
"description", "description",
"enable_setting", "enable_setting",
"persona", "agent",
"persona_setting" "agent_setting"
); );
} }
} }

View File

@ -15,15 +15,15 @@ import Group from "discourse/models/group";
import { i18n } from "discourse-i18n"; import { i18n } from "discourse-i18n";
import AdminUser from "admin/models/admin-user"; import AdminUser from "admin/models/admin-user";
import GroupChooser from "select-kit/components/group-chooser"; import GroupChooser from "select-kit/components/group-chooser";
import AiPersonaResponseFormatEditor from "../components/modal/ai-persona-response-format-editor"; import AiAgentResponseFormatEditor from "../components/modal/ai-agent-response-format-editor";
import AiLlmSelector from "./ai-llm-selector"; import AiLlmSelector from "./ai-llm-selector";
import AiPersonaCollapsableExample from "./ai-persona-example"; import AiAgentCollapsableExample from "./ai-agent-example";
import AiPersonaToolOptions from "./ai-persona-tool-options"; import AiAgentToolOptions from "./ai-agent-tool-options";
import AiToolSelector from "./ai-tool-selector"; import AiToolSelector from "./ai-tool-selector";
import RagOptionsFk from "./rag-options-fk"; import RagOptionsFk from "./rag-options-fk";
import RagUploader from "./rag-uploader"; import RagUploader from "./rag-uploader";
export default class PersonaEditor extends Component { export default class AgentEditor extends Component {
@service router; @service router;
@service store; @service store;
@service dialog; @service dialog;
@ -59,12 +59,12 @@ export default class PersonaEditor extends Component {
} }
get allTools() { get allTools() {
return this.args.personas.resultSetMeta.tools; return this.args.agents.resultSetMeta.tools;
} }
get maxPixelValues() { get maxPixelValues() {
const l = (key) => const l = (key) =>
i18n(`discourse_ai.ai_persona.vision_max_pixel_sizes.${key}`); i18n(`discourse_ai.ai_agent.vision_max_pixel_sizes.${key}`);
return [ return [
{ name: l("low"), id: 65536 }, { name: l("low"), id: 65536 },
{ name: l("medium"), id: 262144 }, { name: l("medium"), id: 262144 },
@ -76,14 +76,14 @@ export default class PersonaEditor extends Component {
const content = [ const content = [
{ {
id: -1, id: -1,
name: i18n("discourse_ai.ai_persona.tool_strategies.all"), name: i18n("discourse_ai.ai_agent.tool_strategies.all"),
}, },
]; ];
[1, 2, 5].forEach((i) => { [1, 2, 5].forEach((i) => {
content.push({ content.push({
id: i, id: i,
name: i18n("discourse_ai.ai_persona.tool_strategies.replies", { name: i18n("discourse_ai.ai_agent.tool_strategies.replies", {
count: i, count: i,
}), }),
}); });
@ -112,23 +112,23 @@ export default class PersonaEditor extends Component {
this.isSaving = true; this.isSaving = true;
try { try {
const personaToSave = Object.assign( const agentToSave = Object.assign(
this.args.model, this.args.model,
this.args.model.fromPOJO(data) this.args.model.fromPOJO(data)
); );
await personaToSave.save(); await agentToSave.save();
this.#sortPersonas(); this.#sortAgents();
if (isNew && this.args.model.rag_uploads.length === 0) { if (isNew && this.args.model.rag_uploads.length === 0) {
this.args.personas.addObject(personaToSave); this.args.agents.addObject(agentToSave);
this.router.transitionTo( this.router.transitionTo(
"adminPlugins.show.discourse-ai-personas.edit", "adminPlugins.show.discourse-ai-agents.edit",
personaToSave agentToSave
); );
} else { } else {
this.toasts.success({ this.toasts.success({
data: { message: i18n("discourse_ai.ai_persona.saved") }, data: { message: i18n("discourse_ai.ai_agent.saved") },
duration: 2000, duration: 2000,
}); });
} }
@ -151,12 +151,12 @@ export default class PersonaEditor extends Component {
@action @action
delete() { delete() {
return this.dialog.confirm({ return this.dialog.confirm({
message: i18n("discourse_ai.ai_persona.confirm_delete"), message: i18n("discourse_ai.ai_agent.confirm_delete"),
didConfirm: () => { didConfirm: () => {
return this.args.model.destroyRecord().then(() => { return this.args.model.destroyRecord().then(() => {
this.args.personas.removeObject(this.args.model); this.args.agents.removeObject(this.args.model);
this.router.transitionTo( this.router.transitionTo(
"adminPlugins.show.discourse-ai-personas.index" "adminPlugins.show.discourse-ai-agents.index"
); );
}); });
}, },
@ -259,7 +259,7 @@ export default class PersonaEditor extends Component {
return updatedOptions; return updatedOptions;
} }
async persistField(dirtyData, field, newValue, sortPersonas) { async persistField(dirtyData, field, newValue, sortAgents) {
if (!this.args.model.isNew) { if (!this.args.model.isNew) {
const updatedDirtyData = Object.assign({}, dirtyData); const updatedDirtyData = Object.assign({}, dirtyData);
updatedDirtyData[field] = newValue; updatedDirtyData[field] = newValue;
@ -270,8 +270,8 @@ export default class PersonaEditor extends Component {
this.dirtyFormData = updatedDirtyData; this.dirtyFormData = updatedDirtyData;
await this.args.model.update(args); await this.args.model.update(args);
if (sortPersonas) { if (sortAgents) {
this.#sortPersonas(); this.#sortAgents();
} }
} catch (e) { } catch (e) {
popupAjaxError(e); popupAjaxError(e);
@ -279,8 +279,8 @@ export default class PersonaEditor extends Component {
} }
} }
#sortPersonas() { #sortAgents() {
const sorted = this.args.personas.toArray().sort((a, b) => { const sorted = this.args.agents.toArray().sort((a, b) => {
if (a.priority && !b.priority) { if (a.priority && !b.priority) {
return -1; return -1;
} else if (!a.priority && b.priority) { } else if (!a.priority && b.priority) {
@ -289,20 +289,20 @@ export default class PersonaEditor extends Component {
return a.name.localeCompare(b.name); return a.name.localeCompare(b.name);
} }
}); });
this.args.personas.clear(); this.args.agents.clear();
this.args.personas.setObjects(sorted); this.args.agents.setObjects(sorted);
} }
<template> <template>
<BackButton <BackButton
@route="adminPlugins.show.discourse-ai-personas" @route="adminPlugins.show.discourse-ai-agents"
@label="discourse_ai.ai_persona.back" @label="discourse_ai.ai_agent.back"
/> />
<div class="ai-persona-editor" {{didInsert this.updateAllGroups @model.id}}> <div class="ai-agent-editor" {{didInsert this.updateAllGroups @model.id}}>
<Form @onSubmit={{this.save}} @data={{this.formData}} as |form data|> <Form @onSubmit={{this.save}} @data={{this.formData}} as |form data|>
<form.Field <form.Field
@name="name" @name="name"
@title={{i18n "discourse_ai.ai_persona.name"}} @title={{i18n "discourse_ai.ai_agent.name"}}
@validation="required|length:1,100" @validation="required|length:1,100"
@disabled={{data.system}} @disabled={{data.system}}
@format="large" @format="large"
@ -313,7 +313,7 @@ export default class PersonaEditor extends Component {
<form.Field <form.Field
@name="description" @name="description"
@title={{i18n "discourse_ai.ai_persona.description"}} @title={{i18n "discourse_ai.ai_agent.description"}}
@validation="required|length:1,100" @validation="required|length:1,100"
@disabled={{data.system}} @disabled={{data.system}}
@format="large" @format="large"
@ -324,7 +324,7 @@ export default class PersonaEditor extends Component {
<form.Field <form.Field
@name="system_prompt" @name="system_prompt"
@title={{i18n "discourse_ai.ai_persona.system_prompt"}} @title={{i18n "discourse_ai.ai_agent.system_prompt"}}
@validation="required|length:1,100000" @validation="required|length:1,100000"
@disabled={{data.system}} @disabled={{data.system}}
@format="large" @format="large"
@ -333,28 +333,28 @@ export default class PersonaEditor extends Component {
<field.Textarea /> <field.Textarea />
</form.Field> </form.Field>
<AiPersonaResponseFormatEditor @form={{form}} @data={{data}} /> <AiAgentResponseFormatEditor @form={{form}} @data={{data}} />
<form.Field <form.Field
@name="default_llm_id" @name="default_llm_id"
@title={{i18n "discourse_ai.ai_persona.default_llm"}} @title={{i18n "discourse_ai.ai_agent.default_llm"}}
@tooltip={{i18n "discourse_ai.ai_persona.default_llm_help"}} @tooltip={{i18n "discourse_ai.ai_agent.default_llm_help"}}
@format="large" @format="large"
as |field| as |field|
> >
<field.Custom> <field.Custom>
<AiLlmSelector <AiLlmSelector
@value={{field.value}} @value={{field.value}}
@llms={{@personas.resultSetMeta.llms}} @llms={{@agents.resultSetMeta.llms}}
@onChange={{field.set}} @onChange={{field.set}}
@class="ai-persona-editor__llms" @class="ai-agent-editor__llms"
/> />
</field.Custom> </field.Custom>
</form.Field> </form.Field>
<form.Field <form.Field
@name="allowed_group_ids" @name="allowed_group_ids"
@title={{i18n "discourse_ai.ai_persona.allowed_groups"}} @title={{i18n "discourse_ai.ai_agent.allowed_groups"}}
@format="large" @format="large"
as |field| as |field|
> >
@ -369,8 +369,8 @@ export default class PersonaEditor extends Component {
<form.Field <form.Field
@name="vision_enabled" @name="vision_enabled"
@title={{i18n "discourse_ai.ai_persona.vision_enabled"}} @title={{i18n "discourse_ai.ai_agent.vision_enabled"}}
@tooltip={{i18n "discourse_ai.ai_persona.vision_enabled_help"}} @tooltip={{i18n "discourse_ai.ai_agent.vision_enabled_help"}}
@format="large" @format="large"
as |field| as |field|
> >
@ -380,7 +380,7 @@ export default class PersonaEditor extends Component {
{{#if data.vision_enabled}} {{#if data.vision_enabled}}
<form.Field <form.Field
@name="vision_max_pixels" @name="vision_max_pixels"
@title={{i18n "discourse_ai.ai_persona.vision_max_pixels"}} @title={{i18n "discourse_ai.ai_agent.vision_max_pixels"}}
@onSet={{this.onChangeMaxPixels}} @onSet={{this.onChangeMaxPixels}}
@format="large" @format="large"
as |field| as |field|
@ -397,8 +397,8 @@ export default class PersonaEditor extends Component {
<form.Field <form.Field
@name="max_context_posts" @name="max_context_posts"
@title={{i18n "discourse_ai.ai_persona.max_context_posts"}} @title={{i18n "discourse_ai.ai_agent.max_context_posts"}}
@tooltip={{i18n "discourse_ai.ai_persona.max_context_posts_help"}} @tooltip={{i18n "discourse_ai.ai_agent.max_context_posts_help"}}
@format="large" @format="large"
as |field| as |field|
> >
@ -408,8 +408,8 @@ export default class PersonaEditor extends Component {
{{#unless data.system}} {{#unless data.system}}
<form.Field <form.Field
@name="temperature" @name="temperature"
@title={{i18n "discourse_ai.ai_persona.temperature"}} @title={{i18n "discourse_ai.ai_agent.temperature"}}
@tooltip={{i18n "discourse_ai.ai_persona.temperature_help"}} @tooltip={{i18n "discourse_ai.ai_agent.temperature_help"}}
@disabled={{data.system}} @disabled={{data.system}}
@format="large" @format="large"
as |field| as |field|
@ -419,8 +419,8 @@ export default class PersonaEditor extends Component {
<form.Field <form.Field
@name="top_p" @name="top_p"
@title={{i18n "discourse_ai.ai_persona.top_p"}} @title={{i18n "discourse_ai.ai_agent.top_p"}}
@tooltip={{i18n "discourse_ai.ai_persona.top_p_help"}} @tooltip={{i18n "discourse_ai.ai_agent.top_p_help"}}
@disabled={{data.system}} @disabled={{data.system}}
@format="large" @format="large"
as |field| as |field|
@ -430,22 +430,22 @@ export default class PersonaEditor extends Component {
{{/unless}} {{/unless}}
<form.Section <form.Section
@title={{i18n "discourse_ai.ai_persona.examples.title"}} @title={{i18n "discourse_ai.ai_agent.examples.title"}}
@subtitle={{i18n "discourse_ai.ai_persona.examples.examples_help"}} @subtitle={{i18n "discourse_ai.ai_agent.examples.examples_help"}}
> >
{{#unless data.system}} {{#unless data.system}}
<form.Container> <form.Container>
<form.Button <form.Button
@action={{fn this.addExamplesPair form data}} @action={{fn this.addExamplesPair form data}}
@label="discourse_ai.ai_persona.examples.new" @label="discourse_ai.ai_agent.examples.new"
class="ai-persona-editor__new_example" class="ai-agent-editor__new_example"
/> />
</form.Container> </form.Container>
{{/unless}} {{/unless}}
{{#if (gt data.examples.length 0)}} {{#if (gt data.examples.length 0)}}
<form.Collection @name="examples" as |exCollection exCollectionIdx|> <form.Collection @name="examples" as |exCollection exCollectionIdx|>
<AiPersonaCollapsableExample <AiAgentCollapsableExample
@examplesCollection={{exCollection}} @examplesCollection={{exCollection}}
@exampleNumber={{exCollectionIdx}} @exampleNumber={{exCollectionIdx}}
@system={{data.system}} @system={{data.system}}
@ -455,10 +455,10 @@ export default class PersonaEditor extends Component {
{{/if}} {{/if}}
</form.Section> </form.Section>
<form.Section @title={{i18n "discourse_ai.ai_persona.ai_tools"}}> <form.Section @title={{i18n "discourse_ai.ai_agent.ai_tools"}}>
<form.Field <form.Field
@name="tools" @name="tools"
@title={{i18n "discourse_ai.ai_persona.tools"}} @title={{i18n "discourse_ai.ai_agent.tools"}}
@format="large" @format="large"
as |field| as |field|
> >
@ -467,7 +467,7 @@ export default class PersonaEditor extends Component {
@value={{field.value}} @value={{field.value}}
@disabled={{data.system}} @disabled={{data.system}}
@onChange={{fn this.updateToolNames form data}} @onChange={{fn this.updateToolNames form data}}
@content={{@personas.resultSetMeta.tools}} @content={{@agents.resultSetMeta.tools}}
/> />
</field.Custom> </field.Custom>
</form.Field> </form.Field>
@ -475,7 +475,7 @@ export default class PersonaEditor extends Component {
{{#if (gt data.tools.length 0)}} {{#if (gt data.tools.length 0)}}
<form.Field <form.Field
@name="forcedTools" @name="forcedTools"
@title={{i18n "discourse_ai.ai_persona.forced_tools"}} @title={{i18n "discourse_ai.ai_agent.forced_tools"}}
@format="large" @format="large"
as |field| as |field|
> >
@ -493,7 +493,7 @@ export default class PersonaEditor extends Component {
{{#if (gt data.forcedTools.length 0)}} {{#if (gt data.forcedTools.length 0)}}
<form.Field <form.Field
@name="forced_tool_count" @name="forced_tool_count"
@title={{i18n "discourse_ai.ai_persona.forced_tool_strategy"}} @title={{i18n "discourse_ai.ai_agent.forced_tool_strategy"}}
@format="large" @format="large"
as |field| as |field|
> >
@ -508,19 +508,19 @@ export default class PersonaEditor extends Component {
{{#if (gt data.tools.length 0)}} {{#if (gt data.tools.length 0)}}
<form.Field <form.Field
@name="tool_details" @name="tool_details"
@title={{i18n "discourse_ai.ai_persona.tool_details"}} @title={{i18n "discourse_ai.ai_agent.tool_details"}}
@tooltip={{i18n "discourse_ai.ai_persona.tool_details_help"}} @tooltip={{i18n "discourse_ai.ai_agent.tool_details_help"}}
@format="large" @format="large"
as |field| as |field|
> >
<field.Checkbox /> <field.Checkbox />
</form.Field> </form.Field>
<AiPersonaToolOptions <AiAgentToolOptions
@form={{form}} @form={{form}}
@data={{data}} @data={{data}}
@llms={{@personas.resultSetMeta.llms}} @llms={{@agents.resultSetMeta.llms}}
@allTools={{@personas.resultSetMeta.tools}} @allTools={{@agents.resultSetMeta.tools}}
/> />
{{/if}} {{/if}}
</form.Section> </form.Section>
@ -535,10 +535,10 @@ export default class PersonaEditor extends Component {
<field.Custom> <field.Custom>
<RagUploader <RagUploader
@target={{data}} @target={{data}}
@targetName="AiPersona" @targetName="AiAgent"
@updateUploads={{fn this.updateUploads form}} @updateUploads={{fn this.updateUploads form}}
@onRemove={{fn this.removeUpload form data field.value}} @onRemove={{fn this.removeUpload form data field.value}}
@allowImages={{@personas.resultSetMeta.settings.rag_images_enabled}} @allowImages={{@agents.resultSetMeta.settings.rag_images_enabled}}
/> />
</field.Custom> </field.Custom>
</form.Field> </form.Field>
@ -546,16 +546,16 @@ export default class PersonaEditor extends Component {
<RagOptionsFk <RagOptionsFk
@form={{form}} @form={{form}}
@data={{data}} @data={{data}}
@llms={{@personas.resultSetMeta.llms}} @llms={{@agents.resultSetMeta.llms}}
@allowImages={{@personas.resultSetMeta.settings.rag_images_enabled}} @allowImages={{@agents.resultSetMeta.settings.rag_images_enabled}}
> >
<form.Field <form.Field
@name="rag_conversation_chunks" @name="rag_conversation_chunks"
@title={{i18n @title={{i18n
"discourse_ai.ai_persona.rag_conversation_chunks" "discourse_ai.ai_agent.rag_conversation_chunks"
}} }}
@tooltip={{i18n @tooltip={{i18n
"discourse_ai.ai_persona.rag_conversation_chunks_help" "discourse_ai.ai_agent.rag_conversation_chunks_help"
}} }}
@format="large" @format="large"
as |field| as |field|
@ -566,10 +566,10 @@ export default class PersonaEditor extends Component {
<form.Field <form.Field
@name="question_consolidator_llm_id" @name="question_consolidator_llm_id"
@title={{i18n @title={{i18n
"discourse_ai.ai_persona.question_consolidator_llm" "discourse_ai.ai_agent.question_consolidator_llm"
}} }}
@tooltip={{i18n @tooltip={{i18n
"discourse_ai.ai_persona.question_consolidator_llm_help" "discourse_ai.ai_agent.question_consolidator_llm_help"
}} }}
@format="large" @format="large"
as |field| as |field|
@ -577,9 +577,9 @@ export default class PersonaEditor extends Component {
<field.Custom> <field.Custom>
<AiLlmSelector <AiLlmSelector
@value={{field.value}} @value={{field.value}}
@llms={{@personas.resultSetMeta.llms}} @llms={{@agents.resultSetMeta.llms}}
@onChange={{field.set}} @onChange={{field.set}}
@class="ai-persona-editor__llms" @class="ai-agent-editor__llms"
/> />
</field.Custom> </field.Custom>
</form.Field> </form.Field>
@ -587,10 +587,10 @@ export default class PersonaEditor extends Component {
</form.Section> </form.Section>
{{/if}} {{/if}}
<form.Section @title={{i18n "discourse_ai.ai_persona.ai_bot.title"}}> <form.Section @title={{i18n "discourse_ai.ai_agent.ai_bot.title"}}>
<form.Field <form.Field
@name="enabled" @name="enabled"
@title={{i18n "discourse_ai.ai_persona.enabled"}} @title={{i18n "discourse_ai.ai_agent.enabled"}}
@onSet={{fn this.toggleEnabled data}} @onSet={{fn this.toggleEnabled data}}
as |field| as |field|
> >
@ -599,21 +599,21 @@ export default class PersonaEditor extends Component {
<form.Field <form.Field
@name="priority" @name="priority"
@title={{i18n "discourse_ai.ai_persona.priority"}} @title={{i18n "discourse_ai.ai_agent.priority"}}
@onSet={{fn this.togglePriority data}} @onSet={{fn this.togglePriority data}}
@tooltip={{i18n "discourse_ai.ai_persona.priority_help"}} @tooltip={{i18n "discourse_ai.ai_agent.priority_help"}}
as |field| as |field|
> >
<field.Toggle /> <field.Toggle />
</form.Field> </form.Field>
{{#if @model.isNew}} {{#if @model.isNew}}
<div>{{i18n "discourse_ai.ai_persona.ai_bot.save_first"}}</div> <div>{{i18n "discourse_ai.ai_agent.ai_bot.save_first"}}</div>
{{else}} {{else}}
{{#if data.default_llm_id}} {{#if data.default_llm_id}}
<form.Field <form.Field
@name="force_default_llm" @name="force_default_llm"
@title={{i18n "discourse_ai.ai_persona.force_default_llm"}} @title={{i18n "discourse_ai.ai_agent.force_default_llm"}}
@format="large" @format="large"
as |field| as |field|
> >
@ -622,12 +622,12 @@ export default class PersonaEditor extends Component {
{{/if}} {{/if}}
<form.Container <form.Container
@title={{i18n "discourse_ai.ai_persona.user"}} @title={{i18n "discourse_ai.ai_agent.user"}}
@tooltip={{unless @tooltip={{unless
data.user data.user
(i18n "discourse_ai.ai_persona.create_user_help") (i18n "discourse_ai.ai_agent.create_user_help")
}} }}
class="ai-persona-editor__ai_bot_user" class="ai-agent-editor__ai_bot_user"
> >
{{#if data.user}} {{#if data.user}}
<a <a
@ -643,20 +643,20 @@ export default class PersonaEditor extends Component {
{{else}} {{else}}
<form.Button <form.Button
@action={{fn this.createUser form}} @action={{fn this.createUser form}}
@label="discourse_ai.ai_persona.create_user" @label="discourse_ai.ai_agent.create_user"
class="ai-persona-editor__create-user" class="ai-agent-editor__create-user"
/> />
{{/if}} {{/if}}
</form.Container> </form.Container>
{{#if data.user}} {{#if data.user}}
<form.Field <form.Field
@name="allow_personal_messages" @name="allow_agentl_messages"
@title={{i18n @title={{i18n
"discourse_ai.ai_persona.allow_personal_messages" "discourse_ai.ai_agent.allow_agentl_messages"
}} }}
@tooltip={{i18n @tooltip={{i18n
"discourse_ai.ai_persona.allow_personal_messages_help" "discourse_ai.ai_agent.allow_agentl_messages_help"
}} }}
@format="large" @format="large"
as |field| as |field|
@ -666,9 +666,9 @@ export default class PersonaEditor extends Component {
<form.Field <form.Field
@name="allow_topic_mentions" @name="allow_topic_mentions"
@title={{i18n "discourse_ai.ai_persona.allow_topic_mentions"}} @title={{i18n "discourse_ai.ai_agent.allow_topic_mentions"}}
@tooltip={{i18n @tooltip={{i18n
"discourse_ai.ai_persona.allow_topic_mentions_help" "discourse_ai.ai_agent.allow_topic_mentions_help"
}} }}
@format="large" @format="large"
as |field| as |field|
@ -680,10 +680,10 @@ export default class PersonaEditor extends Component {
<form.Field <form.Field
@name="allow_chat_direct_messages" @name="allow_chat_direct_messages"
@title={{i18n @title={{i18n
"discourse_ai.ai_persona.allow_chat_direct_messages" "discourse_ai.ai_agent.allow_chat_direct_messages"
}} }}
@tooltip={{i18n @tooltip={{i18n
"discourse_ai.ai_persona.allow_chat_direct_messages_help" "discourse_ai.ai_agent.allow_chat_direct_messages_help"
}} }}
@format="large" @format="large"
as |field| as |field|
@ -694,10 +694,10 @@ export default class PersonaEditor extends Component {
<form.Field <form.Field
@name="allow_chat_channel_mentions" @name="allow_chat_channel_mentions"
@title={{i18n @title={{i18n
"discourse_ai.ai_persona.allow_chat_channel_mentions" "discourse_ai.ai_agent.allow_chat_channel_mentions"
}} }}
@tooltip={{i18n @tooltip={{i18n
"discourse_ai.ai_persona.allow_chat_channel_mentions_help" "discourse_ai.ai_agent.allow_chat_channel_mentions_help"
}} }}
@format="large" @format="large"
as |field| as |field|
@ -715,7 +715,7 @@ export default class PersonaEditor extends Component {
{{#unless (or @model.isNew @model.system)}} {{#unless (or @model.isNew @model.system)}}
<form.Button <form.Button
@action={{this.delete}} @action={{this.delete}}
@label="discourse_ai.ai_persona.delete" @label="discourse_ai.ai_agent.delete"
class="btn-danger" class="btn-danger"
/> />
{{/unless}} {{/unless}}

View File

@ -7,7 +7,7 @@ import { eq } from "truth-helpers";
import icon from "discourse/helpers/d-icon"; import icon from "discourse/helpers/d-icon";
import { i18n } from "discourse-i18n"; import { i18n } from "discourse-i18n";
export default class AiPersonaCollapsableExample extends Component { export default class AiAgentCollapsableExample extends Component {
@tracked collapsed = true; @tracked collapsed = true;
get caretIcon() { get caretIcon() {
@ -26,7 +26,7 @@ export default class AiPersonaCollapsableExample extends Component {
} }
get exampleTitle() { get exampleTitle() {
return i18n("discourse_ai.ai_persona.examples.collapsable_title", { return i18n("discourse_ai.ai_agent.examples.collapsable_title", {
number: this.args.exampleNumber + 1, number: this.args.exampleNumber + 1,
}); });
} }
@ -41,7 +41,7 @@ export default class AiPersonaCollapsableExample extends Component {
<exPair.Field <exPair.Field
@title={{i18n @title={{i18n
(concat (concat
"discourse_ai.ai_persona.examples." "discourse_ai.ai_agent.examples."
(if (eq pairIdx 0) "user" "model") (if (eq pairIdx 0) "user" "model")
) )
}} }}
@ -57,8 +57,8 @@ export default class AiPersonaCollapsableExample extends Component {
<@form.Container> <@form.Container>
<@form.Button <@form.Button
@action={{this.deletePair}} @action={{this.deletePair}}
@label="discourse_ai.ai_persona.examples.remove" @label="discourse_ai.ai_agent.examples.remove"
class="ai-persona-editor__delete_example btn-danger" class="ai-agent-editor__delete_example btn-danger"
/> />
</@form.Container> </@form.Container>
{{/unless}} {{/unless}}

View File

@ -0,0 +1,117 @@
import Component from "@glimmer/component";
import { fn } from "@ember/helper";
import { on } from "@ember/modifier";
import { action } from "@ember/object";
import { LinkTo } from "@ember/routing";
import { service } from "@ember/service";
import DBreadcrumbsItem from "discourse/components/d-breadcrumbs-item";
import DPageSubheader from "discourse/components/d-page-subheader";
import DToggleSwitch from "discourse/components/d-toggle-switch";
import concatClass from "discourse/helpers/concat-class";
import { popupAjaxError } from "discourse/lib/ajax-error";
import { i18n } from "discourse-i18n";
import AdminConfigAreaEmptyList from "admin/components/admin-config-area-empty-list";
import AiAgentEditor from "./ai-agent-editor";
export default class AiAgentListEditor extends Component {
@service adminPluginNavManager;
@action
async toggleEnabled(agent) {
const oldValue = agent.enabled;
const newValue = !oldValue;
try {
agent.set("enabled", newValue);
await agent.save();
} catch (err) {
agent.set("enabled", oldValue);
popupAjaxError(err);
}
}
<template>
<DBreadcrumbsItem
@path="/admin/plugins/{{this.adminPluginNavManager.currentPlugin.name}}/ai-agents"
@label={{i18n "discourse_ai.ai_agent.short_title"}}
/>
<section class="ai-agent-list-editor__current admin-detail pull-left">
{{#if @currentAgent}}
<AiAgentEditor @model={{@currentAgent}} @agents={{@agents}} />
{{else}}
<DPageSubheader
@titleLabel={{i18n "discourse_ai.ai_agent.short_title"}}
@descriptionLabel={{i18n
"discourse_ai.ai_agent.agent_description"
}}
@learnMoreUrl="https://meta.discourse.org/t/ai-bot-agents/306099"
>
<:actions as |actions|>
<actions.Primary
@label="discourse_ai.ai_agent.new"
@route="adminPlugins.show.discourse-ai-agents.new"
@icon="plus"
class="ai-agent-list-editor__new-button"
/>
</:actions>
</DPageSubheader>
{{#if @agents}}
<table class="content-list ai-agent-list-editor d-admin-table">
<thead>
<tr>
<th>{{i18n "discourse_ai.ai_agent.name"}}</th>
<th>{{i18n "discourse_ai.ai_agent.list.enabled"}}</th>
<th></th>
</tr>
</thead>
<tbody>
{{#each @agents as |agent|}}
<tr
data-agent-id={{agent.id}}
class={{concatClass
"ai-agent-list__row d-admin-row__content"
(if agent.priority "priority")
}}
>
<td class="d-admin-row__overview">
<div class="ai-agent-list__name-with-description">
<div class="ai-agent-list__name">
<strong>
{{agent.name}}
</strong>
</div>
<div class="ai-agent-list__description">
{{agent.description}}
</div>
</div>
</td>
<td class="d-admin-row__detail">
<DToggleSwitch
@state={{agent.enabled}}
{{on "click" (fn this.toggleEnabled agent)}}
/>
</td>
<td class="d-admin-row__controls">
<LinkTo
@route="adminPlugins.show.discourse-ai-agents.edit"
@model={{agent}}
class="btn btn-text btn-small"
>{{i18n "discourse_ai.ai_agent.edit"}} </LinkTo>
</td>
</tr>
{{/each}}
</tbody>
</table>
{{else}}
<AdminConfigAreaEmptyList
@ctaLabel="discourse_ai.ai_agent.new"
@ctaRoute="adminPlugins.show.discourse-ai-agents.new"
@ctaClass="ai-agent-list-editor__empty-new-button"
@emptyLabel="discourse_ai.ai_agent.no_agents"
/>
{{/if}}
{{/if}}
</section>
</template>
}

View File

@ -6,10 +6,10 @@ import { service } from "@ember/service";
import { i18n } from "discourse-i18n"; import { i18n } from "discourse-i18n";
import DropdownSelectBox from "select-kit/components/dropdown-select-box"; import DropdownSelectBox from "select-kit/components/dropdown-select-box";
const PERSONA_SELECTOR_KEY = "ai_persona_selector_id"; const AGENT_SELECTOR_KEY = "ai_agent_selector_id";
const LLM_SELECTOR_KEY = "ai_llm_selector_id"; const LLM_SELECTOR_KEY = "ai_llm_selector_id";
export default class AiPersonaLlmSelector extends Component { export default class AiAgentLlmSelector extends Component {
@service currentUser; @service currentUser;
@service keyValueStore; @service keyValueStore;
@ -20,7 +20,7 @@ export default class AiPersonaLlmSelector extends Component {
super(...arguments); super(...arguments);
if (this.botOptions?.length) { if (this.botOptions?.length) {
this.#loadStoredPersona(); this.#loadStoredAgent();
this.#loadStoredLlm(); this.#loadStoredLlm();
next(() => { next(() => {
@ -34,25 +34,25 @@ export default class AiPersonaLlmSelector extends Component {
} }
get hasLlmSelector() { get hasLlmSelector() {
return this.currentUser.ai_enabled_chat_bots.any((bot) => !bot.is_persona); return this.currentUser.ai_enabled_chat_bots.any((bot) => !bot.is_agent);
} }
get botOptions() { get botOptions() {
if (!this.currentUser.ai_enabled_personas) { if (!this.currentUser.ai_enabled_agents) {
return; return;
} }
let enabledPersonas = this.currentUser.ai_enabled_personas; let enabledAgents = this.currentUser.ai_enabled_agents;
if (!this.hasLlmSelector) { if (!this.hasLlmSelector) {
enabledPersonas = enabledPersonas.filter((persona) => persona.username); enabledAgents = enabledAgents.filter((agent) => agent.username);
} }
return enabledPersonas.map((persona) => { return enabledAgents.map((agent) => {
return { return {
id: persona.id, id: agent.id,
name: persona.name, name: agent.name,
description: persona.description, description: agent.description,
}; };
}); });
} }
@ -67,8 +67,8 @@ export default class AiPersonaLlmSelector extends Component {
set value(newValue) { set value(newValue) {
this._value = newValue; this._value = newValue;
this.keyValueStore.setItem(PERSONA_SELECTOR_KEY, newValue); this.keyValueStore.setItem(AGENT_SELECTOR_KEY, newValue);
this.args.setPersonaId(newValue); this.args.setAgentId(newValue);
this.setAllowLLMSelector(); this.setAllowLLMSelector();
this.resetTargetRecipients(); this.resetTargetRecipients();
} }
@ -79,11 +79,11 @@ export default class AiPersonaLlmSelector extends Component {
return; return;
} }
const persona = this.currentUser.ai_enabled_personas.find( const agent = this.currentUser.ai_enabled_agents.find(
(innerPersona) => innerPersona.id === this._value (innerAgent) => innerAgent.id === this._value
); );
this.allowLLMSelector = !persona?.force_default_llm; this.allowLLMSelector = !agent?.force_default_llm;
} }
get currentLlm() { get currentLlm() {
@ -104,16 +104,16 @@ export default class AiPersonaLlmSelector extends Component {
).username; ).username;
this.args.setTargetRecipient(botUsername); this.args.setTargetRecipient(botUsername);
} else { } else {
const persona = this.currentUser.ai_enabled_personas.find( const agent = this.currentUser.ai_enabled_agents.find(
(innerPersona) => innerPersona.id === this._value (innerAgent) => innerAgent.id === this._value
); );
this.args.setTargetRecipient(persona.username || ""); this.args.setTargetRecipient(agent.username || "");
} }
} }
get llmOptions() { get llmOptions() {
const availableBots = this.currentUser.ai_enabled_chat_bots const availableBots = this.currentUser.ai_enabled_chat_bots
.filter((bot) => !bot.is_persona) .filter((bot) => !bot.is_agent)
.filter(Boolean); .filter(Boolean);
return availableBots return availableBots
@ -130,18 +130,18 @@ export default class AiPersonaLlmSelector extends Component {
return this.allowLLMSelector && this.llmOptions.length > 1; return this.allowLLMSelector && this.llmOptions.length > 1;
} }
#loadStoredPersona() { #loadStoredAgent() {
let personaId = this.keyValueStore.getItem(PERSONA_SELECTOR_KEY); let agentId = this.keyValueStore.getItem(AGENT_SELECTOR_KEY);
this._value = this.botOptions[0].id; this._value = this.botOptions[0].id;
if (personaId) { if (agentId) {
personaId = parseInt(personaId, 10); agentId = parseInt(agentId, 10);
if (this.botOptions.any((bot) => bot.id === personaId)) { if (this.botOptions.any((bot) => bot.id === agentId)) {
this._value = personaId; this._value = agentId;
} }
} }
this.args.setPersonaId(this._value); this.args.setAgentId(this._value);
} }
#loadStoredLlm() { #loadStoredLlm() {
@ -172,13 +172,13 @@ export default class AiPersonaLlmSelector extends Component {
} }
<template> <template>
<div class="persona-llm-selector"> <div class="agent-llm-selector">
<div class="persona-llm-selector__selection-wrapper gpt-persona"> <div class="agent-llm-selector__selection-wrapper gpt-agent">
{{#if @showLabels}} {{#if @showLabels}}
<label>{{i18n "discourse_ai.ai_bot.persona"}}</label> <label>{{i18n "discourse_ai.ai_bot.agent"}}</label>
{{/if}} {{/if}}
<DropdownSelectBox <DropdownSelectBox
class="persona-llm-selector__persona-dropdown" class="agent-llm-selector__agent-dropdown"
@value={{this.value}} @value={{this.value}}
@content={{this.botOptions}} @content={{this.botOptions}}
@options={{hash @options={{hash
@ -188,12 +188,12 @@ export default class AiPersonaLlmSelector extends Component {
/> />
</div> </div>
{{#if this.showLLMSelector}} {{#if this.showLLMSelector}}
<div class="persona-llm-selector__selection-wrapper llm-selector"> <div class="agent-llm-selector__selection-wrapper llm-selector">
{{#if @showLabels}} {{#if @showLabels}}
<label>{{i18n "discourse_ai.ai_bot.llm"}}</label> <label>{{i18n "discourse_ai.ai_bot.llm"}}</label>
{{/if}} {{/if}}
<DropdownSelectBox <DropdownSelectBox
class="persona-llm-selector__llm-dropdown" class="agent-llm-selector__llm-dropdown"
@value={{this.currentLlm}} @value={{this.currentLlm}}
@content={{this.llmOptions}} @content={{this.llmOptions}}
@options={{hash icon=(if @showLabels "angle-down" "globe")}} @options={{hash icon=(if @showLabels "angle-down" "globe")}}

View File

@ -4,7 +4,7 @@ import { eq } from "truth-helpers";
import { i18n } from "discourse-i18n"; import { i18n } from "discourse-i18n";
import AiLlmSelector from "./ai-llm-selector"; import AiLlmSelector from "./ai-llm-selector";
export default class AiPersonaToolOptions extends Component { export default class AiAgentToolOptions extends Component {
get showToolOptions() { get showToolOptions() {
const allTools = this.args.allTools; const allTools = this.args.allTools;
if (!allTools || !this.args.data.tools) { if (!allTools || !this.args.data.tools) {
@ -36,19 +36,19 @@ export default class AiPersonaToolOptions extends Component {
<template> <template>
{{#if this.showToolOptions}} {{#if this.showToolOptions}}
<@form.Container <@form.Container
@title={{i18n "discourse_ai.ai_persona.tool_options"}} @title={{i18n "discourse_ai.ai_agent.tool_options"}}
@direction="column" @direction="column"
@format="full" @format="full"
> >
<@form.Object <@form.Object
@name="toolOptions" @name="toolOptions"
@title={{i18n "discourse_ai.ai_persona.tool_options"}} @title={{i18n "discourse_ai.ai_agent.tool_options"}}
as |toolObj optsPerTool| as |toolObj optsPerTool|
> >
{{#each (this.formObjectKeys optsPerTool) as |toolId|}} {{#each (this.formObjectKeys optsPerTool) as |toolId|}}
<div class="ai-persona-editor__tool-options"> <div class="ai-agent-editor__tool-options">
{{#let (get this.toolsMetadata toolId) as |toolMeta|}} {{#let (get this.toolsMetadata toolId) as |toolMeta|}}
<div class="ai-persona-editor__tool-options-name"> <div class="ai-agent-editor__tool-options-name">
{{toolMeta.name}} {{toolMeta.name}}
</div> </div>
<toolObj.Object @name={{toolId}} as |optionsObj optionData|> <toolObj.Object @name={{toolId}} as |optionsObj optionData|>
@ -73,7 +73,7 @@ export default class AiPersonaToolOptions extends Component {
@value={{field.value}} @value={{field.value}}
@llms={{@llms}} @llms={{@llms}}
@onChange={{field.set}} @onChange={{field.set}}
@class="ai-persona-tool-option-editor__llms" @class="ai-agent-tool-option-editor__llms"
/> />
</field.Custom> </field.Custom>
{{else if (eq optionMeta.type "boolean")}} {{else if (eq optionMeta.type "boolean")}}

View File

@ -23,7 +23,7 @@ import {
} from "discourse/lib/user-status-on-autocomplete"; } from "discourse/lib/user-status-on-autocomplete";
import { clipboardHelpers } from "discourse/lib/utilities"; import { clipboardHelpers } from "discourse/lib/utilities";
import { i18n } from "discourse-i18n"; import { i18n } from "discourse-i18n";
import AiPersonaLlmSelector from "discourse/plugins/discourse-ai/discourse/components/ai-persona-llm-selector"; import AiAgentLlmSelector from "discourse/plugins/discourse-ai/discourse/components/ai-agent-llm-selector";
export default class AiBotConversations extends Component { export default class AiBotConversations extends Component {
@service aiBotConversationsHiddenSubmit; @service aiBotConversationsHiddenSubmit;
@ -133,8 +133,8 @@ export default class AiBotConversations extends Component {
} }
@action @action
setPersonaId(id) { setAgentId(id) {
this.aiBotConversationsHiddenSubmit.personaId = id; this.aiBotConversationsHiddenSubmit.agentId = id;
} }
@action @action
@ -279,9 +279,9 @@ export default class AiBotConversations extends Component {
<template> <template>
<div class="ai-bot-conversations"> <div class="ai-bot-conversations">
<AiPersonaLlmSelector <AiAgentLlmSelector
@showLabels={{true}} @showLabels={{true}}
@setPersonaId={{this.setPersonaId}} @setAgentId={{this.setAgentId}}
@setTargetRecipient={{this.setTargetRecipient}} @setTargetRecipient={{this.setTargetRecipient}}
/> />

View File

@ -116,7 +116,7 @@ export default class AiLlmEditorForm extends Component {
const localized = usedBy.map((m) => { const localized = usedBy.map((m) => {
return i18n(`discourse_ai.llms.usage.${m.type}`, { return i18n(`discourse_ai.llms.usage.${m.type}`, {
persona: m.name, agent: m.name,
}); });
}); });

View File

@ -8,7 +8,7 @@ const AiLlmSelector = <template>
@onChange={{@onChange}} @onChange={{@onChange}}
@options={{hash @options={{hash
filterable=true filterable=true
none="discourse_ai.ai_persona.no_llm_selected" none="discourse_ai.ai_agent.no_llm_selected"
}} }}
class={{@class}} class={{@class}}
/> />

View File

@ -112,9 +112,9 @@ export default class AiLlmsListEditor extends Component {
} }
localizeUsage(usage) { localizeUsage(usage) {
if (usage.type === "ai_persona") { if (usage.type === "ai_agent") {
return i18n("discourse_ai.llms.usage.ai_persona", { return i18n("discourse_ai.llms.usage.ai_agent", {
persona: usage.name, agent: usage.name,
}); });
} else if (usage.type === "automation") { } else if (usage.type === "automation") {
return i18n("discourse_ai.llms.usage.automation", { return i18n("discourse_ai.llms.usage.automation", {

View File

@ -1,117 +0,0 @@
import Component from "@glimmer/component";
import { fn } from "@ember/helper";
import { on } from "@ember/modifier";
import { action } from "@ember/object";
import { LinkTo } from "@ember/routing";
import { service } from "@ember/service";
import DBreadcrumbsItem from "discourse/components/d-breadcrumbs-item";
import DPageSubheader from "discourse/components/d-page-subheader";
import DToggleSwitch from "discourse/components/d-toggle-switch";
import concatClass from "discourse/helpers/concat-class";
import { popupAjaxError } from "discourse/lib/ajax-error";
import { i18n } from "discourse-i18n";
import AdminConfigAreaEmptyList from "admin/components/admin-config-area-empty-list";
import AiPersonaEditor from "./ai-persona-editor";
export default class AiPersonaListEditor extends Component {
@service adminPluginNavManager;
@action
async toggleEnabled(persona) {
const oldValue = persona.enabled;
const newValue = !oldValue;
try {
persona.set("enabled", newValue);
await persona.save();
} catch (err) {
persona.set("enabled", oldValue);
popupAjaxError(err);
}
}
<template>
<DBreadcrumbsItem
@path="/admin/plugins/{{this.adminPluginNavManager.currentPlugin.name}}/ai-personas"
@label={{i18n "discourse_ai.ai_persona.short_title"}}
/>
<section class="ai-persona-list-editor__current admin-detail pull-left">
{{#if @currentPersona}}
<AiPersonaEditor @model={{@currentPersona}} @personas={{@personas}} />
{{else}}
<DPageSubheader
@titleLabel={{i18n "discourse_ai.ai_persona.short_title"}}
@descriptionLabel={{i18n
"discourse_ai.ai_persona.persona_description"
}}
@learnMoreUrl="https://meta.discourse.org/t/ai-bot-personas/306099"
>
<:actions as |actions|>
<actions.Primary
@label="discourse_ai.ai_persona.new"
@route="adminPlugins.show.discourse-ai-personas.new"
@icon="plus"
class="ai-persona-list-editor__new-button"
/>
</:actions>
</DPageSubheader>
{{#if @personas}}
<table class="content-list ai-persona-list-editor d-admin-table">
<thead>
<tr>
<th>{{i18n "discourse_ai.ai_persona.name"}}</th>
<th>{{i18n "discourse_ai.ai_persona.list.enabled"}}</th>
<th></th>
</tr>
</thead>
<tbody>
{{#each @personas as |persona|}}
<tr
data-persona-id={{persona.id}}
class={{concatClass
"ai-persona-list__row d-admin-row__content"
(if persona.priority "priority")
}}
>
<td class="d-admin-row__overview">
<div class="ai-persona-list__name-with-description">
<div class="ai-persona-list__name">
<strong>
{{persona.name}}
</strong>
</div>
<div class="ai-persona-list__description">
{{persona.description}}
</div>
</div>
</td>
<td class="d-admin-row__detail">
<DToggleSwitch
@state={{persona.enabled}}
{{on "click" (fn this.toggleEnabled persona)}}
/>
</td>
<td class="d-admin-row__controls">
<LinkTo
@route="adminPlugins.show.discourse-ai-personas.edit"
@model={{persona}}
class="btn btn-text btn-small"
>{{i18n "discourse_ai.ai_persona.edit"}} </LinkTo>
</td>
</tr>
{{/each}}
</tbody>
</table>
{{else}}
<AdminConfigAreaEmptyList
@ctaLabel="discourse_ai.ai_persona.new"
@ctaRoute="adminPlugins.show.discourse-ai-personas.new"
@ctaClass="ai-persona-list-editor__empty-new-button"
@emptyLabel="discourse_ai.ai_persona.no_personas"
/>
{{/if}}
{{/if}}
</section>
</template>
}

View File

@ -154,8 +154,8 @@ export default class AiSearchDiscoveries extends Component {
} }
get canContinueConversation() { get canContinueConversation() {
const personas = this.currentUser?.ai_enabled_personas; const agents = this.currentUser?.ai_enabled_agents;
if (!personas) { if (!agents) {
return false; return false;
} }
@ -163,16 +163,16 @@ export default class AiSearchDiscoveries extends Component {
return false; return false;
} }
const discoverPersona = personas.find( const discoverAgent = agents.find(
(persona) => (agent) =>
persona.id === parseInt(this.siteSettings?.ai_bot_discover_persona, 10) agent.id === parseInt(this.siteSettings?.ai_bot_discover_agent, 10)
); );
const discoverPersonaHasBot = discoverPersona?.username; const discoverAgentHasBot = discoverAgent?.username;
return ( return (
this.discobotDiscoveries.discovery?.length > 0 && this.discobotDiscoveries.discovery?.length > 0 &&
!this.smoothStreamer.isStreaming && !this.smoothStreamer.isStreaming &&
discoverPersonaHasBot discoverAgentHasBot
); );
} }

View File

@ -7,16 +7,16 @@ import ModalJsonSchemaEditor from "discourse/components/modal/json-schema-editor
import { prettyJSON } from "discourse/lib/formatter"; import { prettyJSON } from "discourse/lib/formatter";
import { i18n } from "discourse-i18n"; import { i18n } from "discourse-i18n";
export default class AiPersonaResponseFormatEditor extends Component { export default class AiAgentResponseFormatEditor extends Component {
@tracked showJsonEditorModal = false; @tracked showJsonEditorModal = false;
jsonSchema = { jsonSchema = {
type: "array", type: "array",
uniqueItems: true, uniqueItems: true,
title: i18n("discourse_ai.ai_persona.response_format.modal.root_title"), title: i18n("discourse_ai.ai_agent.response_format.modal.root_title"),
items: { items: {
type: "object", type: "object",
title: i18n("discourse_ai.ai_persona.response_format.modal.key_title"), title: i18n("discourse_ai.ai_agent.response_format.modal.key_title"),
properties: { properties: {
key: { key: {
type: "string", type: "string",
@ -30,7 +30,7 @@ export default class AiPersonaResponseFormatEditor extends Component {
}; };
get editorTitle() { get editorTitle() {
return i18n("discourse_ai.ai_persona.response_format.title"); return i18n("discourse_ai.ai_agent.response_format.title");
} }
get responseFormatAsJSON() { get responseFormatAsJSON() {
@ -64,21 +64,21 @@ export default class AiPersonaResponseFormatEditor extends Component {
<template> <template>
<@form.Container @title={{this.editorTitle}} @format="large"> <@form.Container @title={{this.editorTitle}} @format="large">
<div class="ai-persona-editor__response-format"> <div class="ai-agent-editor__response-format">
{{#if (gt @data.response_format.length 0)}} {{#if (gt @data.response_format.length 0)}}
<pre class="ai-persona-editor__response-format-pre"> <pre class="ai-agent-editor__response-format-pre">
<code <code
>{{this.displayJSON}}</code> >{{this.displayJSON}}</code>
</pre> </pre>
{{else}} {{else}}
<div class="ai-persona-editor__response-format-none"> <div class="ai-agent-editor__response-format-none">
{{i18n "discourse_ai.ai_persona.response_format.no_format"}} {{i18n "discourse_ai.ai_agent.response_format.no_format"}}
</div> </div>
{{/if}} {{/if}}
<@form.Button <@form.Button
@action={{this.openModal}} @action={{this.openModal}}
@label="discourse_ai.ai_persona.response_format.open_modal" @label="discourse_ai.ai_agent.response_format.open_modal"
@disabled={{@data.system}} @disabled={{@data.system}}
/> />
</div> </div>

View File

@ -1,14 +1,14 @@
import Component from "@glimmer/component"; import Component from "@glimmer/component";
import { isGPTBot } from "../../lib/ai-bot-helper"; import { isGPTBot } from "../../lib/ai-bot-helper";
export default class AiPersonaFlair extends Component { export default class AiAgentFlair extends Component {
static shouldRender(args) { static shouldRender(args) {
return isGPTBot(args.post.user); return isGPTBot(args.post.user);
} }
<template> <template>
<span class="persona-flair"> <span class="agent-flair">
{{@outletArgs.post.topic.ai_persona_name}} {{@outletArgs.post.topic.ai_agent_name}}
</span> </span>
</template> </template>
} }

View File

@ -70,7 +70,7 @@ export default class RagOptionsFk extends Component {
@value={{field.value}} @value={{field.value}}
@llms={{this.visionLlms}} @llms={{this.visionLlms}}
@onChange={{field.set}} @onChange={{field.set}}
@class="ai-persona-editor__llms" @class="ai-agent-editor__llms"
/> />
</field.Custom> </field.Custom>
</@form.Field> </@form.Field>

View File

@ -1,7 +1,7 @@
import Component from "@glimmer/component"; import Component from "@glimmer/component";
import { action } from "@ember/object"; import { action } from "@ember/object";
import { service } from "@ember/service"; import { service } from "@ember/service";
import AiPersonaLlmSelector from "discourse/plugins/discourse-ai/discourse/components/ai-persona-llm-selector"; import AiAgentLlmSelector from "discourse/plugins/discourse-ai/discourse/components/ai-agent-llm-selector";
function isBotMessage(composer, currentUser) { function isBotMessage(composer, currentUser) {
if ( if (
@ -21,7 +21,7 @@ function isBotMessage(composer, currentUser) {
export default class BotSelector extends Component { export default class BotSelector extends Component {
static shouldRender(args, container) { static shouldRender(args, container) {
return ( return (
container?.currentUser?.ai_enabled_personas && container?.currentUser?.ai_enabled_agents &&
isBotMessage(args.model, container.currentUser) isBotMessage(args.model, container.currentUser)
); );
} }
@ -29,8 +29,8 @@ export default class BotSelector extends Component {
@service currentUser; @service currentUser;
@action @action
setPersonaIdOnComposer(id) { setAgentIdOnComposer(id) {
this.args.outletArgs.model.metaData = { ai_persona_id: id }; this.args.outletArgs.model.metaData = { ai_agent_id: id };
} }
@action @action
@ -39,8 +39,8 @@ export default class BotSelector extends Component {
} }
<template> <template>
<AiPersonaLlmSelector <AiAgentLlmSelector
@setPersonaId={{this.setPersonaIdOnComposer}} @setAgentId={{this.setAgentIdOnComposer}}
@setTargetRecipient={{this.setTargetRecipientsOnComposer}} @setTargetRecipient={{this.setTargetRecipientsOnComposer}}
/> />
</template> </template>

View File

@ -9,8 +9,8 @@ import AiSearchDiscoveriesTooltip from "../../components/ai-search-discoveries-t
export default class AiFullPageDiscobotDiscoveries extends Component { export default class AiFullPageDiscobotDiscoveries extends Component {
static shouldRender(_args, { siteSettings, currentUser }) { static shouldRender(_args, { siteSettings, currentUser }) {
return ( return (
siteSettings.ai_bot_discover_persona && siteSettings.ai_bot_discover_agent &&
currentUser?.can_use_ai_bot_discover_persona && currentUser?.can_use_ai_bot_discover_agent &&
currentUser?.user_option?.ai_search_discoveries currentUser?.user_option?.ai_search_discoveries
); );
} }

View File

@ -8,8 +8,8 @@ import AiSearchDiscoveriesTooltip from "../../components/ai-search-discoveries-t
export default class AiDiscobotDiscoveries extends Component { export default class AiDiscobotDiscoveries extends Component {
static shouldRender(args, { siteSettings, currentUser }) { static shouldRender(args, { siteSettings, currentUser }) {
return ( return (
siteSettings.ai_bot_discover_persona && siteSettings.ai_bot_discover_agent &&
currentUser?.can_use_ai_bot_discover_persona && currentUser?.can_use_ai_bot_discover_agent &&
currentUser?.user_option?.ai_search_discoveries currentUser?.user_option?.ai_search_discoveries
); );
} }

View File

@ -35,8 +35,8 @@ export default class PreferencesAiController extends Controller {
checked: this.model.user_option.ai_search_discoveries, checked: this.model.user_option.ai_search_discoveries,
isIncluded: (() => { isIncluded: (() => {
return ( return (
this.siteSettings.ai_bot_discover_persona && this.siteSettings.ai_bot_discover_agent &&
this.model?.can_use_ai_bot_discover_persona && this.model?.can_use_ai_bot_discover_agent &&
this.siteSettings.ai_bot_enabled this.siteSettings.ai_bot_enabled
); );
})(), })(),

View File

@ -5,7 +5,7 @@ import Composer from "discourse/models/composer";
import { i18n } from "discourse-i18n"; import { i18n } from "discourse-i18n";
import ShareFullTopicModal from "../components/modal/share-full-topic-modal"; import ShareFullTopicModal from "../components/modal/share-full-topic-modal";
const MAX_PERSONA_USER_ID = -1200; const MAX_AGENT_USER_ID = -1200;
let enabledChatBotMap = null; let enabledChatBotMap = null;
@ -40,12 +40,12 @@ export function getBotType(user) {
if (!bot) { if (!bot) {
return; return;
} }
return bot.is_persona ? "persona" : "llm"; return bot.is_agent ? "agent" : "llm";
} }
export function isPostFromAiBot(post, currentUser) { export function isPostFromAiBot(post, currentUser) {
return ( return (
post.user_id <= MAX_PERSONA_USER_ID || post.user_id <= MAX_AGENT_USER_ID ||
!!currentUser?.ai_enabled_chat_bots?.any( !!currentUser?.ai_enabled_chat_bots?.any(
(bot) => post.username === bot.username (bot) => post.username === bot.username
) )
@ -66,7 +66,7 @@ export async function composeAiBotMessage(
options = { options = {
skipFocus: false, skipFocus: false,
topicBody: "", topicBody: "",
personaUsername: null, agentUsername: null,
} }
) { ) {
const currentUser = composer.currentUser; const currentUser = composer.currentUser;
@ -77,8 +77,8 @@ export async function composeAiBotMessage(
botUsername = currentUser.ai_enabled_chat_bots.find( botUsername = currentUser.ai_enabled_chat_bots.find(
(bot) => bot.model_name === targetBot (bot) => bot.model_name === targetBot
)?.username; )?.username;
} else if (options.personaUsername) { } else if (options.agentUsername) {
botUsername = options.personaUsername; botUsername = options.agentUsername;
} else { } else {
botUsername = currentUser.ai_enabled_chat_bots[0].username; botUsername = currentUser.ai_enabled_chat_bots[0].username;
} }

View File

@ -16,7 +16,7 @@ export default class AiBotConversationsHiddenSubmit extends Service {
@tracked loading = false; @tracked loading = false;
personaId; agentId;
targetUsername; targetUsername;
uploads = []; uploads = [];
@ -35,12 +35,12 @@ export default class AiBotConversationsHiddenSubmit extends Service {
async submitToBot() { async submitToBot() {
if ( if (
this.inputValue.length < this.inputValue.length <
this.siteSettings.min_personal_message_post_length this.siteSettings.min_agentl_message_post_length
) { ) {
return this.dialog.alert({ return this.dialog.alert({
message: i18n( message: i18n(
"discourse_ai.ai_bot.conversations.min_input_length_message", "discourse_ai.ai_bot.conversations.min_input_length_message",
{ count: this.siteSettings.min_personal_message_post_length } { count: this.siteSettings.min_agentl_message_post_length }
), ),
didConfirm: () => this.focusInput(), didConfirm: () => this.focusInput(),
didCancel: () => this.focusInput(), didCancel: () => this.focusInput(),
@ -78,7 +78,7 @@ export default class AiBotConversationsHiddenSubmit extends Service {
title, title,
archetype: "private_message", archetype: "private_message",
target_recipients: this.targetUsername, target_recipients: this.targetUsername,
meta_data: { ai_persona_id: this.personaId }, meta_data: { ai_agent_id: this.agentId },
}, },
}); });

View File

@ -22,9 +22,9 @@ export default {
description: "discourse_ai.llms.preconfigured.description", description: "discourse_ai.llms.preconfigured.description",
}, },
{ {
label: "discourse_ai.ai_persona.short_title", label: "discourse_ai.ai_agent.short_title",
route: "adminPlugins.show.discourse-ai-personas", route: "adminPlugins.show.discourse-ai-agents",
description: "discourse_ai.ai_persona.persona_description", description: "discourse_ai.ai_agent.agent_description",
}, },
{ {
label: "discourse_ai.embeddings.short_title", label: "discourse_ai.embeddings.short_title",

View File

@ -3,7 +3,7 @@ import { withSilencedDeprecations } from "discourse/lib/deprecated";
import { withPluginApi } from "discourse/lib/plugin-api"; import { withPluginApi } from "discourse/lib/plugin-api";
import { registerWidgetShim } from "discourse/widgets/render-glimmer"; import { registerWidgetShim } from "discourse/widgets/render-glimmer";
import AiBotHeaderIcon from "../discourse/components/ai-bot-header-icon"; import AiBotHeaderIcon from "../discourse/components/ai-bot-header-icon";
import AiPersonaFlair from "../discourse/components/post/ai-persona-flair"; import AiAgentFlair from "../discourse/components/post/ai-agent-flair";
import AiCancelStreamingButton from "../discourse/components/post-menu/ai-cancel-streaming-button"; import AiCancelStreamingButton from "../discourse/components/post-menu/ai-cancel-streaming-button";
import AiDebugButton from "../discourse/components/post-menu/ai-debug-button"; import AiDebugButton from "../discourse/components/post-menu/ai-debug-button";
import AiShareButton from "../discourse/components/post-menu/ai-share-button"; import AiShareButton from "../discourse/components/post-menu/ai-share-button";
@ -53,35 +53,35 @@ function initializeAIBotReplies(api) {
}); });
} }
function initializePersonaDecorator(api) { function initializeAgentDecorator(api) {
api.renderAfterWrapperOutlet("post-meta-data-poster-name", AiPersonaFlair); api.renderAfterWrapperOutlet("post-meta-data-poster-name", AiAgentFlair);
withSilencedDeprecations("discourse.post-stream-widget-overrides", () => withSilencedDeprecations("discourse.post-stream-widget-overrides", () =>
initializeWidgetPersonaDecorator(api) initializeWidgetAgentDecorator(api)
); );
} }
function initializeWidgetPersonaDecorator(api) { function initializeWidgetAgentDecorator(api) {
api.decorateWidget(`poster-name:after`, (dec) => { api.decorateWidget(`poster-name:after`, (dec) => {
const botType = getBotType(dec.attrs.user); const botType = getBotType(dec.attrs.user);
// we have 2 ways of decorating // we have 2 ways of decorating
// 1. if a bot is a LLM we decorate with persona name // 1. if a bot is a LLM we decorate with agent name
// 2. if bot is a persona we decorate with LLM name // 2. if bot is a agent we decorate with LLM name
if (botType === "llm") { if (botType === "llm") {
return dec.widget.attach("persona-flair", { return dec.widget.attach("agent-flair", {
personaName: dec.model?.topic?.ai_persona_name, agentName: dec.model?.topic?.ai_agent_name,
}); });
} else if (botType === "persona") { } else if (botType === "agent") {
return dec.widget.attach("persona-flair", { return dec.widget.attach("agent-flair", {
personaName: dec.model?.llm_name, agentName: dec.model?.llm_name,
}); });
} }
}); });
registerWidgetShim( registerWidgetShim(
"persona-flair", "agent-flair",
"span.persona-flair", "span.agent-flair",
hbs`{{@data.personaName}}` hbs`{{@data.agentName}}`
); );
} }
@ -149,11 +149,11 @@ function initializeShareTopicButton(api) {
showShareConversationModal(modal, this.topic.id); showShareConversationModal(modal, this.topic.id);
}, },
classNames: ["share-ai-conversation-button"], classNames: ["share-ai-conversation-button"],
dependentKeys: ["topic.ai_persona_name"], dependentKeys: ["topic.ai_agent_name"],
displayed() { displayed() {
return ( return (
currentUser?.can_share_ai_bot_conversations && currentUser?.can_share_ai_bot_conversations &&
this.topic.ai_persona_name this.topic.ai_agent_name
); );
}, },
}); });
@ -171,7 +171,7 @@ export default {
withPluginApi((api) => { withPluginApi((api) => {
attachHeaderIcon(api); attachHeaderIcon(api);
initializeAIBotReplies(api); initializeAIBotReplies(api);
initializePersonaDecorator(api); initializeAgentDecorator(api);
initializeDebugButton(api, container); initializeDebugButton(api, container);
initializeShareButton(api, container); initializeShareButton(api, container);
initializeShareTopicButton(api, container); initializeShareTopicButton(api, container);

View File

@ -6,7 +6,7 @@ export default apiInitializer((api) => {
if ( if (
!settings.ai_bot_enabled || !settings.ai_bot_enabled ||
!currentUser?.can_use_ai_bot_discover_persona !currentUser?.can_use_ai_bot_discover_agent
) { ) {
return; return;
} }

View File

@ -8,7 +8,7 @@
display: block; display: block;
} }
&__row-item-persona { &__row-item-agent {
padding: 0; padding: 0;
text-align: left; text-align: left;

View File

@ -157,7 +157,7 @@ body.has-ai-conversations-sidebar {
flex-direction: column; flex-direction: column;
height: calc(100dvh - var(--header-offset) - 5em); height: calc(100dvh - var(--header-offset) - 5em);
.persona-llm-selector { .agent-llm-selector {
display: flex; display: flex;
gap: 0.5em; gap: 0.5em;
justify-content: flex-start; justify-content: flex-start;

View File

@ -1,8 +1,8 @@
.admin-contents .ai-persona-list-editor { .admin-contents .ai-agent-list-editor {
margin-top: 0; margin-top: 0;
} }
.ai-persona-list-editor { .ai-agent-list-editor {
&__header { &__header {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
@ -23,7 +23,7 @@
} }
} }
.ai-persona-tool-option-editor { .ai-agent-tool-option-editor {
&__instructions { &__instructions {
color: var(--primary-medium); color: var(--primary-medium);
font-size: var(--font-down-1); font-size: var(--font-down-1);
@ -31,7 +31,7 @@
} }
} }
.ai-personas__container { .ai-agents__container {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
align-items: center; align-items: center;
@ -39,7 +39,7 @@
width: 100%; width: 100%;
} }
.ai-persona-editor { .ai-agent-editor {
padding-left: 0.5em; padding-left: 0.5em;
&__tool-options { &__tool-options {

View File

@ -11,7 +11,7 @@ nav.post-controls .actions button.cancel-streaming {
} }
} }
.persona-llm-selector { .agent-llm-selector {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
@ -24,7 +24,7 @@ nav.post-controls .actions button.cancel-streaming {
} }
.ai-bot-pm { .ai-bot-pm {
.gpt-persona { .gpt-agent {
margin-bottom: 5px; margin-bottom: 5px;
} }
@ -75,7 +75,7 @@ article.streaming nav.post-controls .actions button.cancel-streaming {
} }
} }
.topic-body .persona-flair { .topic-body .agent-flair {
order: 2; order: 2;
font-size: var(--font-down-1); font-size: var(--font-down-1);
} }

View File

@ -1,4 +1,4 @@
.ai-persona-editor { .ai-agent-editor {
&__system_prompt, &__system_prompt,
&__description, &__description,
.select-kit.multi-select { .select-kit.multi-select {

View File

@ -45,7 +45,7 @@
} }
.ai-tool-list-editor__current, .ai-tool-list-editor__current,
.ai-persona-list-editor__current, .ai-agent-list-editor__current,
.ai-llms-list-editor__configured { .ai-llms-list-editor__configured {
.d-admin-table { .d-admin-table {
tr:hover { tr:hover {

View File

@ -128,7 +128,7 @@ ar:
flag_post: flag_post:
label: "الإبلاغ عن المنشور" label: "الإبلاغ عن المنشور"
description: "يبلغ عن المنشور (سواءً كان عشوائيًا أو للمراجعة)" description: "يبلغ عن المنشور (سواءً كان عشوائيًا أو للمراجعة)"
include_personal_messages: include_agentl_messages:
label: "تضمين الرسائل الشخصية" label: "تضمين الرسائل الشخصية"
description: "افحص الرسائل الشخصية وافرزها أيضًا" description: "افحص الرسائل الشخصية وافرزها أيضًا"
model: model:
@ -219,7 +219,7 @@ ar:
last_week: "الأسبوع الماضي" last_week: "الأسبوع الماضي"
last_month: "الشهر الماضي" last_month: "الشهر الماضي"
custom: "مُخصَّص..." custom: "مُخصَّص..."
ai_persona: ai_agent:
ai_tools: "الأدوات" ai_tools: "الأدوات"
tool_strategies: tool_strategies:
all: "التطبيق على كل الردود" all: "التطبيق على كل الردود"
@ -261,8 +261,8 @@ ar:
allow_chat_direct_messages_help: "إذا تم التفعيل، يمكن للمستخدمين في المجموعات المسموح بها إرسال رسالة مباشرة إلى هذه الشخصية." allow_chat_direct_messages_help: "إذا تم التفعيل، يمكن للمستخدمين في المجموعات المسموح بها إرسال رسالة مباشرة إلى هذه الشخصية."
allow_chat_channel_mentions: "السماح بالإشارات في قناة الدردشة" allow_chat_channel_mentions: "السماح بالإشارات في قناة الدردشة"
allow_chat_channel_mentions_help: "إذا تم التفعيل، يمكن للمستخدمين في المجموعات المسموح بها الإشارة إلى هذه الشخصية في قنوات الدردشة." allow_chat_channel_mentions_help: "إذا تم التفعيل، يمكن للمستخدمين في المجموعات المسموح بها الإشارة إلى هذه الشخصية في قنوات الدردشة."
allow_personal_messages: "السماح بالرسائل الشخصية" allow_agentl_messages: "السماح بالرسائل الشخصية"
allow_personal_messages_help: "إذا تم التفعيل، يمكن للمستخدمين في المجموعات المسموح بها إرسال رسائل شخصية إلى هذه الشخصية." allow_agentl_messages_help: "إذا تم التفعيل، يمكن للمستخدمين في المجموعات المسموح بها إرسال رسائل شخصية إلى هذه الشخصية."
allow_topic_mentions: "السماح بالإشارات في الموضوعات" allow_topic_mentions: "السماح بالإشارات في الموضوعات"
allow_topic_mentions_help: "إذا تم التفعيل، يمكن للمستخدمين في المجموعات المسموح بها الإشارة إلى هذه الشخصية في الموضوعات." allow_topic_mentions_help: "إذا تم التفعيل، يمكن للمستخدمين في المجموعات المسموح بها الإشارة إلى هذه الشخصية في الموضوعات."
force_default_llm: "استخدام نموذج اللغة الافتراضي دائمًا" force_default_llm: "استخدام نموذج اللغة الافتراضي دائمًا"
@ -274,7 +274,7 @@ ar:
allowed_groups: "المجموعات المسموح بها" allowed_groups: "المجموعات المسموح بها"
confirm_delete: "هل تريد بالتأكيد حذف هذه الشخصية؟" confirm_delete: "هل تريد بالتأكيد حذف هذه الشخصية؟"
new: "شخصية جديدة" new: "شخصية جديدة"
no_personas: "لم تُنشئ أي شخصيات بعد" no_agents: "لم تُنشئ أي شخصيات بعد"
title: "الشخصيات" title: "الشخصيات"
short_title: "الشخصيات" short_title: "الشخصيات"
delete: "حذف" delete: "حذف"
@ -287,7 +287,7 @@ ar:
tool_options: "خيارات الأداة" tool_options: "خيارات الأداة"
rag_conversation_chunks: "البحث في أجزاء المحادثة" rag_conversation_chunks: "البحث في أجزاء المحادثة"
rag_conversation_chunks_help: "عدد الأجزاء التي سيتم استخدامها لإي عمليات البحث ضمن نموذج RAG. يزداد مقدار السياق الذي يمكن للذكاء الاصطناعي استخدامه بزيادة القيمة." rag_conversation_chunks_help: "عدد الأجزاء التي سيتم استخدامها لإي عمليات البحث ضمن نموذج RAG. يزداد مقدار السياق الذي يمكن للذكاء الاصطناعي استخدامه بزيادة القيمة."
persona_description: "تُعد الشخصيات ميزة قوية تتيح لك تخصيص سلوك محرك الذكاء الاصطناعي في منتدى Discourse الخاص بك. إنها تعمل بمثابة \"رسالة نظام\" توجِّه ردود الذكاء الاصطناعي وتفاعلاته، مما يساعد في إنشاء تجربة مستخدم أكثر تخصيصًا وتفاعليةً." agent_description: "تُعد الشخصيات ميزة قوية تتيح لك تخصيص سلوك محرك الذكاء الاصطناعي في منتدى Discourse الخاص بك. إنها تعمل بمثابة \"رسالة نظام\" توجِّه ردود الذكاء الاصطناعي وتفاعلاته، مما يساعد في إنشاء تجربة مستخدم أكثر تخصيصًا وتفاعليةً."
response_format: response_format:
open_modal: "تعديل" open_modal: "تعديل"
modal: modal:
@ -380,7 +380,7 @@ ar:
usage: usage:
ai_bot: "روبوت الذكاء الاصطناعي" ai_bot: "روبوت الذكاء الاصطناعي"
ai_helper: "المساعد" ai_helper: "المساعد"
ai_persona: "الشخصية (%{persona})" ai_agent: "الشخصية (%{agent})"
ai_summarization: "تلخيص" ai_summarization: "تلخيص"
ai_embeddings_semantic_search: "البحث باستخدام الذكاء الاصطناعي" ai_embeddings_semantic_search: "البحث باستخدام الذكاء الاصطناعي"
ai_spam: "عشوائي" ai_spam: "عشوائي"

View File

@ -50,7 +50,7 @@ be:
summary: "вынік" summary: "вынік"
username: "Імя карыстальніка" username: "Імя карыстальніка"
total_requests: "Усяго запытаў" total_requests: "Усяго запытаў"
ai_persona: ai_agent:
back: "Назад" back: "Назад"
name: "імя" name: "імя"
edit: "рэдагаваць" edit: "рэдагаваць"

View File

@ -56,7 +56,7 @@ bg:
periods: periods:
last_day: "Последните 24 часа" last_day: "Последните 24 часа"
custom: "Ръчно задаване..." custom: "Ръчно задаване..."
ai_persona: ai_agent:
back: "Назад" back: "Назад"
name: "Име" name: "Име"
edit: "Редактирай" edit: "Редактирай"

View File

@ -51,7 +51,7 @@ bs_BA:
usage: usage:
summary: "Sažetak" summary: "Sažetak"
username: "Nadimak" username: "Nadimak"
ai_persona: ai_agent:
back: "Prethodno" back: "Prethodno"
name: "Ime" name: "Ime"
edit: "Edit" edit: "Edit"

View File

@ -55,7 +55,7 @@ ca:
total_requests: "Total de peticions" total_requests: "Total de peticions"
periods: periods:
last_day: "Últimes 24 hores" last_day: "Últimes 24 hores"
ai_persona: ai_agent:
back: "Enrere" back: "Enrere"
name: "Nom" name: "Nom"
edit: "Edita" edit: "Edita"
@ -100,7 +100,7 @@ ca:
success: "Èxit!" success: "Èxit!"
providers: providers:
google: "Google" google: "Google"
fake: "Personalitzat" fake: "Agentlitzat"
ai_helper: ai_helper:
context_menu: context_menu:
cancel: "Cancel·la" cancel: "Cancel·la"
@ -126,7 +126,7 @@ ca:
display_name: "Nom" display_name: "Nom"
providers: providers:
google: "Google" google: "Google"
fake: "Personalitzat" fake: "Agentlitzat"
ai_bot: ai_bot:
debug_ai_modal: debug_ai_modal:
request: "Sol·licita" request: "Sol·licita"

View File

@ -58,7 +58,7 @@ cs:
periods: periods:
last_day: "Posledních 24 hodin" last_day: "Posledních 24 hodin"
custom: "Vlastní…" custom: "Vlastní…"
ai_persona: ai_agent:
back: "Zpět" back: "Zpět"
name: "Jméno" name: "Jméno"
edit: "Upravit" edit: "Upravit"

View File

@ -59,7 +59,7 @@ da:
periods: periods:
last_day: "Seneste 24 timer" last_day: "Seneste 24 timer"
custom: "Tilpasset..." custom: "Tilpasset..."
ai_persona: ai_agent:
back: "Tilbage" back: "Tilbage"
name: "Navn" name: "Navn"
edit: "Rediger" edit: "Rediger"

View File

@ -12,8 +12,8 @@ de:
descriptions: descriptions:
discourse_ai: discourse_ai:
search: "Ermöglicht KI-Suche" search: "Ermöglicht KI-Suche"
stream_completion: "Ermöglicht das Streamen von KI-Persona-Vervollständigungen" stream_completion: "Ermöglicht das Streamen von KI-Agent-Vervollständigungen"
update_personas: "Ermöglicht die Aktualisierung von KI-Personas" update_agents: "Ermöglicht die Aktualisierung von KI-Agents"
site_settings: site_settings:
categories: categories:
discourse_ai: "Discourse-KI" discourse_ai: "Discourse-KI"
@ -102,17 +102,17 @@ de:
tool: tool:
label: "Werkzeug" label: "Werkzeug"
description: "Werkzeug für die Triage (das Werkzeug darf keine Parameter definiert haben)" description: "Werkzeug für die Triage (das Werkzeug darf keine Parameter definiert haben)"
llm_persona_triage: llm_agent_triage:
fields: fields:
persona: agent:
label: "Persona" label: "Agent"
description: "KI-Persona, die für die Triage verwendet werden soll (Standard-LLM und -Benutzer müssen eingestellt sein)" description: "KI-Agent, die für die Triage verwendet werden soll (Standard-LLM und -Benutzer müssen eingestellt sein)"
whisper: whisper:
label: "Als Flüstern antworten" label: "Als Flüstern antworten"
description: "Ob die Antwort der Persona ein Flüstern sein soll" description: "Ob die Antwort der Agent ein Flüstern sein soll"
silent_mode: silent_mode:
label: "Stiller Modus" label: "Stiller Modus"
description: "Im stillen Modus empfängt die Persona den Inhalt, schreibt aber nichts in das Forum - nützlich bei der Triage mit Tools" description: "Im stillen Modus empfängt die Agent den Inhalt, schreibt aber nichts in das Forum - nützlich bei der Triage mit Tools"
llm_triage: llm_triage:
fields: fields:
system_prompt: system_prompt:
@ -148,15 +148,15 @@ de:
flag_post: flag_post:
label: "Beitrag melden" label: "Beitrag melden"
description: "Meldet den Beitrag (entweder als Spam oder zur Überprüfung)" description: "Meldet den Beitrag (entweder als Spam oder zur Überprüfung)"
include_personal_messages: include_agentl_messages:
label: "Persönliche Nachrichten einbeziehen" label: "Persönliche Nachrichten einbeziehen"
description: "Auch persönliche Nachrichten scannen und sortieren" description: "Auch persönliche Nachrichten scannen und sortieren"
whisper: whisper:
label: "Als Flüstern antworten" label: "Als Flüstern antworten"
description: "Ob die Antwort der KI ein Flüstern sein soll" description: "Ob die Antwort der KI ein Flüstern sein soll"
reply_persona: reply_agent:
label: "Antwort Persona" label: "Antwort Agent"
description: "KI-Persona, die für Antworten verwendet werden soll (muss Standard-LLM haben), wird gegenüber vorgefertigten Antworten bevorzugt" description: "KI-Agent, die für Antworten verwendet werden soll (muss Standard-LLM haben), wird gegenüber vorgefertigten Antworten bevorzugt"
model: model:
label: "Modell" label: "Modell"
description: "Für die Triage verwendetes Sprachmodell" description: "Für die Triage verwendetes Sprachmodell"
@ -167,12 +167,12 @@ de:
title: "KI" title: "KI"
features: features:
short_title: "Funktionen" short_title: "Funktionen"
description: "Dies sind die KI-Funktionen, die den Besuchern deiner Website zur Verfügung stehen. Sie können so konfiguriert werden, dass sie bestimmte Personas und LLM verwenden, und der Zugriff kann mithilfe von Gruppen gesteuert werden." description: "Dies sind die KI-Funktionen, die den Besuchern deiner Website zur Verfügung stehen. Sie können so konfiguriert werden, dass sie bestimmte Agents und LLM verwenden, und der Zugriff kann mithilfe von Gruppen gesteuert werden."
back: "Zurück" back: "Zurück"
list: list:
header: header:
name: "Name" name: "Name"
persona: "Persona" agent: "Agent"
groups: "Gruppen" groups: "Gruppen"
edit: "Bearbeiten" edit: "Bearbeiten"
set_up: "Einrichten" set_up: "Einrichten"
@ -253,7 +253,7 @@ de:
last_week: "Letzte Woche" last_week: "Letzte Woche"
last_month: "Letzter Monat" last_month: "Letzter Monat"
custom: "Benutzerdefiniert …" custom: "Benutzerdefiniert …"
ai_persona: ai_agent:
ai_tools: "Tools" ai_tools: "Tools"
tool_strategies: tool_strategies:
all: "Auf alle Antworten anwenden" all: "Auf alle Antworten anwenden"
@ -265,7 +265,7 @@ de:
edit: "Bearbeiten" edit: "Bearbeiten"
description: "Beschreibung" description: "Beschreibung"
no_llm_selected: "Kein Sprachmodell ausgewählt" no_llm_selected: "Kein Sprachmodell ausgewählt"
use_parent_llm: "Verwende das Personas Sprachmodell" use_parent_llm: "Verwende das Agents Sprachmodell"
max_context_posts: "Max. Kontext-Beiträge" max_context_posts: "Max. Kontext-Beiträge"
max_context_posts_help: "Die maximale Anzahl von Beiträgen, die die KI als Kontext für die Antwort auf einen Nutzer verwenden soll (leer für Standardwert)." max_context_posts_help: "Die maximale Anzahl von Beiträgen, die die KI als Kontext für die Antwort auf einen Nutzer verwenden soll (leer für Standardwert)."
vision_enabled: Sehen aktiviert vision_enabled: Sehen aktiviert
@ -278,12 +278,12 @@ de:
tool_details: Tool-Details anzeigen tool_details: Tool-Details anzeigen
tool_details_help: Zeigt den Endnutzern Details darüber, welche Tools das Sprachmodell ausgelöst hat. tool_details_help: Zeigt den Endnutzern Details darüber, welche Tools das Sprachmodell ausgelöst hat.
mentionable: Erwähnungen zulassen mentionable: Erwähnungen zulassen
mentionable_help: Wenn diese Funktion aktiviert ist, können Nutzer in erlaubten Gruppen diesen Nutzer in Beiträgen erwähnen und die KI wird als diese Persona antworten. mentionable_help: Wenn diese Funktion aktiviert ist, können Nutzer in erlaubten Gruppen diesen Nutzer in Beiträgen erwähnen und die KI wird als diese Agent antworten.
user: Nutzer user: Nutzer
create_user: Benutzer erstellen create_user: Benutzer erstellen
create_user_help: Du kannst dieser Persona optional einen Nutzer zuordnen. Wenn du das tust, wird die KI diesen Nutzer verwenden, um auf Anfragen zu antworten. create_user_help: Du kannst dieser Agent optional einen Nutzer zuordnen. Wenn du das tust, wird die KI diesen Nutzer verwenden, um auf Anfragen zu antworten.
default_llm: Standard-Sprachmodell default_llm: Standard-Sprachmodell
default_llm_help: Das Standard-Sprachmodell, das für diese Persona verwendet werden soll. Erforderlich, wenn du die Persona in öffentlichen Beiträgen erwähnen möchtest. default_llm_help: Das Standard-Sprachmodell, das für diese Agent verwendet werden soll. Erforderlich, wenn du die Agent in öffentlichen Beiträgen erwähnen möchtest.
question_consolidator_llm: Sprachmodell für Fragenkonsolidierer question_consolidator_llm: Sprachmodell für Fragenkonsolidierer
question_consolidator_llm_help: Das Sprachmodell, das für den Fragenkonsolidierer verwendet werden soll. Du kannst ein weniger leistungsfähiges Modell wählen, um Kosten zu sparen. question_consolidator_llm_help: Das Sprachmodell, das für den Fragenkonsolidierer verwendet werden soll. Du kannst ein weniger leistungsfähiges Modell wählen, um Kosten zu sparen.
system_prompt: System-Eingabeaufforderung system_prompt: System-Eingabeaufforderung
@ -291,34 +291,34 @@ de:
allow_chat_direct_messages: "Chat-Direktnachrichten zulassen" allow_chat_direct_messages: "Chat-Direktnachrichten zulassen"
allow_chat_direct_messages_help: "Wenn aktiviert, können Benutzer in zulässigen Gruppen Direktnachrichten an diese Person senden." allow_chat_direct_messages_help: "Wenn aktiviert, können Benutzer in zulässigen Gruppen Direktnachrichten an diese Person senden."
allow_chat_channel_mentions: "Chat-Kanal-Erwähnungen zulassen" allow_chat_channel_mentions: "Chat-Kanal-Erwähnungen zulassen"
allow_chat_channel_mentions_help: "Wenn aktiviert, können Benutzer in zulässigen Gruppen diese Persona in Chatkanälen erwähnen." allow_chat_channel_mentions_help: "Wenn aktiviert, können Benutzer in zulässigen Gruppen diese Agent in Chatkanälen erwähnen."
allow_personal_messages: "Persönliche Nachrichten zulassen" allow_agentl_messages: "Persönliche Nachrichten zulassen"
allow_personal_messages_help: "Wenn aktiviert, können Benutzer in zulässigen Gruppen persönliche Nachrichten an diese Persona senden." allow_agentl_messages_help: "Wenn aktiviert, können Benutzer in zulässigen Gruppen persönliche Nachrichten an diese Agent senden."
allow_topic_mentions: "Themenerwähnungen zulassen" allow_topic_mentions: "Themenerwähnungen zulassen"
allow_topic_mentions_help: "Wenn aktiviert, können Benutzer in zulässigen Gruppen diese Persona in Themen erwähnen." allow_topic_mentions_help: "Wenn aktiviert, können Benutzer in zulässigen Gruppen diese Agent in Themen erwähnen."
force_default_llm: "Immer das Standard-Sprachmodell verwenden" force_default_llm: "Immer das Standard-Sprachmodell verwenden"
save: "Speichern" save: "Speichern"
saved: "Persona gespeichert" saved: "Agent gespeichert"
enabled: "Aktiviert?" enabled: "Aktiviert?"
tools: "Aktivierte Tools" tools: "Aktivierte Tools"
forced_tools: "Erzwungene Tools" forced_tools: "Erzwungene Tools"
allowed_groups: "Zulässige Gruppen" allowed_groups: "Zulässige Gruppen"
confirm_delete: "Bist du sicher, dass du diese Persona löschen willst?" confirm_delete: "Bist du sicher, dass du diese Agent löschen willst?"
new: "Neue Persona" new: "Neue Agent"
no_personas: "Du hast noch keine Personas erstellt" no_agents: "Du hast noch keine Agents erstellt"
title: "Personas" title: "Agents"
short_title: "Personas" short_title: "Agents"
delete: "Löschen" delete: "Löschen"
temperature: "Temperatur" temperature: "Temperatur"
temperature_help: "Temperatur, die für das LLM verwendet werden soll. Erhöhen, um die Kreativität zu steigern (leer lassen, um den Standardwert des Modells zu verwenden, im Allgemeinen ein Wert zwischen 0,0 und 2,0)" temperature_help: "Temperatur, die für das LLM verwendet werden soll. Erhöhen, um die Kreativität zu steigern (leer lassen, um den Standardwert des Modells zu verwenden, im Allgemeinen ein Wert zwischen 0,0 und 2,0)"
top_p: "Top P" top_p: "Top P"
top_p_help: "Top P für das LLM. Erhöhen, um die Zufälligkeit zu steigern (leer lassen, um den Standardwert des Modells zu verwenden, in der Regel ein Wert zwischen 0,0 und 1,0)" top_p_help: "Top P für das LLM. Erhöhen, um die Zufälligkeit zu steigern (leer lassen, um den Standardwert des Modells zu verwenden, in der Regel ein Wert zwischen 0,0 und 1,0)"
priority: "Priorität" priority: "Priorität"
priority_help: "Personas mit Priorität werden den Benutzern am Anfang der Persona-Liste angezeigt. Wenn mehrere Personas Priorität haben, werden sie alphabetisch sortiert." priority_help: "Agents mit Priorität werden den Benutzern am Anfang der Agent-Liste angezeigt. Wenn mehrere Agents Priorität haben, werden sie alphabetisch sortiert."
tool_options: "Tool-Optionen" tool_options: "Tool-Optionen"
rag_conversation_chunks: "Unterhaltungs-Chunks durchsuchen" rag_conversation_chunks: "Unterhaltungs-Chunks durchsuchen"
rag_conversation_chunks_help: "Die Anzahl der Chunks, die für die RAG-Modell-Suche verwendet werden. Erhöhen, um die Menge des Kontexts zu steigern, den die KI verwenden kann." rag_conversation_chunks_help: "Die Anzahl der Chunks, die für die RAG-Modell-Suche verwendet werden. Erhöhen, um die Menge des Kontexts zu steigern, den die KI verwenden kann."
persona_description: "Personas sind eine leistungsstarke Funktion, mit der du das Verhalten der KI-Engine in deinem Discourse-Forum anpassen kannst. Sie fungieren als „Systemnachricht“, welche die Antworten und Interaktionen der KI steuert und dazu beiträgt, ein persönlicheres und ansprechenderes Erlebnis für Benutzer zu schaffen." agent_description: "Agents sind eine leistungsstarke Funktion, mit der du das Verhalten der KI-Engine in deinem Discourse-Forum anpassen kannst. Sie fungieren als „Systemnachricht“, welche die Antworten und Interaktionen der KI steuert und dazu beiträgt, ein persönlicheres und ansprechenderes Erlebnis für Benutzer zu schaffen."
response_format: response_format:
title: "JSON-Antwortformat" title: "JSON-Antwortformat"
no_format: "Kein JSON-Format angegeben" no_format: "Kein JSON-Format angegeben"
@ -338,7 +338,7 @@ de:
enabled: "KI-Bot?" enabled: "KI-Bot?"
ai_bot: ai_bot:
title: "KI-Bot-Optionen" title: "KI-Bot-Optionen"
save_first: "Weitere KI-Bot-Optionen werden verfügbar, sobald du die Persona gespeichert hast." save_first: "Weitere KI-Bot-Optionen werden verfügbar, sobald du die Agent gespeichert hast."
rag: rag:
title: "RAG" title: "RAG"
options: options:
@ -369,7 +369,7 @@ de:
name_help: "Der Name wird in der Discourse-Benutzeroberfläche angezeigt und ist die Kurzkennung, die Du verwendest, um das Werkzeug in verschiedenen Einstellungen zu finden. Er sollte eindeutig sein (er ist erforderlich)." name_help: "Der Name wird in der Discourse-Benutzeroberfläche angezeigt und ist die Kurzkennung, die Du verwendest, um das Werkzeug in verschiedenen Einstellungen zu finden. Er sollte eindeutig sein (er ist erforderlich)."
new: "Neues Tool" new: "Neues Tool"
tool_name: "Werkzeugname" tool_name: "Werkzeugname"
tool_name_help: "Der Werkzeugname wird dem großen Sprachmodell präsentiert. Es ist nicht eindeutig, aber es ist von Person zu Person unterschiedlich. (Persona wird beim Speichern validiert)" tool_name_help: "Der Werkzeugname wird dem großen Sprachmodell präsentiert. Es ist nicht eindeutig, aber es ist von Person zu Person unterschiedlich. (Agent wird beim Speichern validiert)"
description: "Beschreibung" description: "Beschreibung"
description_help: "Eine klare Beschreibung des Zwecks des Tools für das Sprachmodell" description_help: "Eine klare Beschreibung des Zwecks des Tools für das Sprachmodell"
subheader_description: "Tools erweitern die Fähigkeiten von KI-Bots mit benutzerdefinierten JavaScript-Funktionen." subheader_description: "Tools erweitern die Fähigkeiten von KI-Bots mit benutzerdefinierten JavaScript-Funktionen."
@ -445,7 +445,7 @@ de:
ai_bot: "KI-Bot" ai_bot: "KI-Bot"
ai_helper: "Helfer" ai_helper: "Helfer"
ai_helper_image_caption: "Bildbeschriftungen" ai_helper_image_caption: "Bildbeschriftungen"
ai_persona: "Persona (%{persona})" ai_agent: "Agent (%{agent})"
ai_summarization: "Zusammenfassen" ai_summarization: "Zusammenfassen"
ai_embeddings_semantic_search: "KI-Suche" ai_embeddings_semantic_search: "KI-Suche"
ai_spam: "Spam" ai_spam: "Spam"
@ -658,7 +658,7 @@ de:
collapse_view_label: "Vollbild verlassen (ESC- oder Zurück-Taste)" collapse_view_label: "Vollbild verlassen (ESC- oder Zurück-Taste)"
click_to_run_label: "Artefakt ausführen" click_to_run_label: "Artefakt ausführen"
ai_bot: ai_bot:
persona: "Persona" agent: "Agent"
llm: "Modell" llm: "Modell"
pm_warning: "KI-Chatbot-Nachrichten werden regelmäßig von Moderatoren überwacht." pm_warning: "KI-Chatbot-Nachrichten werden regelmäßig von Moderatoren überwacht."
cancel_streaming: "Antwort abbrechen" cancel_streaming: "Antwort abbrechen"

View File

@ -57,7 +57,7 @@ el:
periods: periods:
last_day: "Τελευταίες 24 ώρες" last_day: "Τελευταίες 24 ώρες"
custom: "Προσαρμοσμένο..." custom: "Προσαρμοσμένο..."
ai_persona: ai_agent:
back: "Πίσω" back: "Πίσω"
name: "Όνομα" name: "Όνομα"
edit: "Επεξεργασία" edit: "Επεξεργασία"

View File

@ -6,8 +6,8 @@ en:
descriptions: descriptions:
discourse_ai: discourse_ai:
search: "Allows AI search" search: "Allows AI search"
stream_completion: "Allows streaming AI persona completions" stream_completion: "Allows streaming AI agent completions"
update_personas: "Allows updating AI personas" update_agents: "Allows updating AI agents"
site_settings: site_settings:
categories: categories:
@ -100,17 +100,17 @@ en:
label: "Tool" label: "Tool"
description: "Tool to use for triage (tool must have no parameters defined)" description: "Tool to use for triage (tool must have no parameters defined)"
llm_persona_triage: llm_agent_triage:
fields: fields:
persona: agent:
label: "Persona" label: "Agent"
description: "AI Persona to use for triage (must have default LLM and User set)" description: "AI Agent to use for triage (must have default LLM and User set)"
whisper: whisper:
label: "Reply as Whisper" label: "Reply as Whisper"
description: "Whether the persona's response should be a whisper" description: "Whether the agent's response should be a whisper"
silent_mode: silent_mode:
label: "Silent Mode" label: "Silent Mode"
description: "In silent mode persona will receive the content but will not post anything on the forum - useful when performing triage using tools" description: "In silent mode agent will receive the content but will not post anything on the forum - useful when performing triage using tools"
llm_triage: llm_triage:
fields: fields:
system_prompt: system_prompt:
@ -146,15 +146,15 @@ en:
flag_post: flag_post:
label: "Flag post" label: "Flag post"
description: "Flags post (either as spam or for review)" description: "Flags post (either as spam or for review)"
include_personal_messages: include_agentl_messages:
label: "Include personal messages" label: "Include agentl messages"
description: "Also scan and triage personal messages" description: "Also scan and triage agentl messages"
whisper: whisper:
label: "Reply as Whisper" label: "Reply as Whisper"
description: "Whether the AI's response should be a whisper" description: "Whether the AI's response should be a whisper"
reply_persona: reply_agent:
label: "Reply Persona" label: "Reply Agent"
description: "AI Persona to use for replies (must have default LLM), will be prioritized over canned reply" description: "AI Agent to use for replies (must have default LLM), will be prioritized over canned reply"
model: model:
label: "Model" label: "Model"
description: "Language model used for triage" description: "Language model used for triage"
@ -167,12 +167,12 @@ en:
features: features:
short_title: "Features" short_title: "Features"
description: "These are the AI features available to visitors on your site. These can be configured to use specific personas and LLMs, and can be access controlled by groups." description: "These are the AI features available to visitors on your site. These can be configured to use specific agents and LLMs, and can be access controlled by groups."
back: "Back" back: "Back"
list: list:
header: header:
name: "Name" name: "Name"
persona: "Persona" agent: "Agent"
groups: "Groups" groups: "Groups"
edit: "Edit" edit: "Edit"
set_up: "Set up" set_up: "Set up"
@ -257,7 +257,7 @@ en:
last_month: "Last month" last_month: "Last month"
custom: "Custom..." custom: "Custom..."
ai_persona: ai_agent:
ai_tools: "Tools" ai_tools: "Tools"
tool_strategies: tool_strategies:
all: "Apply to all replies" all: "Apply to all replies"
@ -269,7 +269,7 @@ en:
edit: "Edit" edit: "Edit"
description: "Description" description: "Description"
no_llm_selected: "No language model selected" no_llm_selected: "No language model selected"
use_parent_llm: "Use personas language model" use_parent_llm: "Use agents language model"
max_context_posts: "Max context posts" max_context_posts: "Max context posts"
max_context_posts_help: "The maximum number of posts to use as context for the AI when responding to a user. (empty for default)" max_context_posts_help: "The maximum number of posts to use as context for the AI when responding to a user. (empty for default)"
vision_enabled: Vision enabled vision_enabled: Vision enabled
@ -282,47 +282,47 @@ en:
tool_details: Show tool details tool_details: Show tool details
tool_details_help: Will show end users details on which tools the language model has triggered. tool_details_help: Will show end users details on which tools the language model has triggered.
mentionable: Allow mentions mentionable: Allow mentions
mentionable_help: If enabled, users in allowed groups can mention this user in posts, the AI will respond as this persona. mentionable_help: If enabled, users in allowed groups can mention this user in posts, the AI will respond as this agent.
user: User user: User
create_user: Create user create_user: Create user
create_user_help: You can optionally attach a user to this persona. If you do, the AI will use this user to respond to requests. create_user_help: You can optionally attach a user to this agent. If you do, the AI will use this user to respond to requests.
default_llm: Default language model default_llm: Default language model
default_llm_help: The default language model to use for this persona. Required if you wish to mention persona on public posts. default_llm_help: The default language model to use for this agent. Required if you wish to mention agent on public posts.
question_consolidator_llm: Language Model for Question Consolidator question_consolidator_llm: Language Model for Question Consolidator
question_consolidator_llm_help: The language model to use for the question consolidator, you may choose a less powerful model to save costs. question_consolidator_llm_help: The language model to use for the question consolidator, you may choose a less powerful model to save costs.
system_prompt: System prompt system_prompt: System prompt
forced_tool_strategy: Forced tool strategy forced_tool_strategy: Forced tool strategy
allow_chat_direct_messages: "Allow chat direct messages" allow_chat_direct_messages: "Allow chat direct messages"
allow_chat_direct_messages_help: "If enabled, users in allowed groups can send direct messages to this persona." allow_chat_direct_messages_help: "If enabled, users in allowed groups can send direct messages to this agent."
allow_chat_channel_mentions: "Allow chat channel mentions" allow_chat_channel_mentions: "Allow chat channel mentions"
allow_chat_channel_mentions_help: "If enabled, users in allowed groups can mention this persona in chat channels." allow_chat_channel_mentions_help: "If enabled, users in allowed groups can mention this agent in chat channels."
allow_personal_messages: "Allow personal messages" allow_agentl_messages: "Allow agentl messages"
allow_personal_messages_help: "If enabled, users in allowed groups can send personal messages to this persona." allow_agentl_messages_help: "If enabled, users in allowed groups can send agentl messages to this agent."
allow_topic_mentions: "Allow topic mentions" allow_topic_mentions: "Allow topic mentions"
allow_topic_mentions_help: "If enabled, users in allowed groups can mention this persona in topics." allow_topic_mentions_help: "If enabled, users in allowed groups can mention this agent in topics."
force_default_llm: "Always use default language model" force_default_llm: "Always use default language model"
save: "Save" save: "Save"
saved: "Persona saved" saved: "Agent saved"
enabled: "Enabled?" enabled: "Enabled?"
tools: "Enabled tools" tools: "Enabled tools"
forced_tools: "Forced tools" forced_tools: "Forced tools"
allowed_groups: "Allowed groups" allowed_groups: "Allowed groups"
confirm_delete: "Are you sure you want to delete this persona?" confirm_delete: "Are you sure you want to delete this agent?"
new: "New persona" new: "New agent"
no_personas: "You have not created any personas yet" no_agents: "You have not created any agents yet"
title: "Personas" title: "Agents"
short_title: "Personas" short_title: "Agents"
delete: "Delete" delete: "Delete"
temperature: "Temperature" 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)" 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)"
top_p: "Top P" top_p: "Top P"
top_p_help: "Top P to use for the LLM, increase to increase randomness (leave empty to use model default, generally a value from 0.0 to 1.0)" top_p_help: "Top P to use for the LLM, increase to increase randomness (leave empty to use model default, generally a value from 0.0 to 1.0)"
priority: "Priority" 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." priority_help: "Priority agents are displayed to users at the top of the agent list. If multiple agents have priority, they will be sorted alphabetically."
tool_options: "Tool options" tool_options: "Tool options"
rag_conversation_chunks: "Search conversation chunks" rag_conversation_chunks: "Search conversation chunks"
rag_conversation_chunks_help: "The number of chunks to use for the RAG model searches. Increase to increase the amount of context the AI can use." rag_conversation_chunks_help: "The number of chunks to use for the RAG model searches. Increase to increase the amount of context the AI can use."
persona_description: "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." agent_description: "Agents 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 agentlized and engaging user experience."
response_format: response_format:
title: "JSON response format" title: "JSON response format"
no_format: "No JSON format specified" no_format: "No JSON format specified"
@ -344,7 +344,7 @@ en:
ai_bot: ai_bot:
title: "AI bot options" title: "AI bot options"
save_first: "More AI bot options will become available once you save the persona." save_first: "More AI bot options will become available once you save the agent."
rag: rag:
title: "RAG" title: "RAG"
@ -377,7 +377,7 @@ en:
name_help: "Name will show up in the Discourse UI and is the short identifier you will use to find the tool in various settings, it should be distinct (it is required)" name_help: "Name will show up in the Discourse UI and is the short identifier you will use to find the tool in various settings, it should be distinct (it is required)"
new: "New tool" new: "New tool"
tool_name: "Tool Name" tool_name: "Tool Name"
tool_name_help: "Tool Name is presented to the large language model. It is not distinct, but it is distinct per persona. (persona validates on save)" tool_name_help: "Tool Name is presented to the large language model. It is not distinct, but it is distinct per agent. (agent validates on save)"
description: "Description" description: "Description"
description_help: "A clear description of the tool's purpose for the language model" description_help: "A clear description of the tool's purpose for the language model"
subheader_description: "Tools extend the capabilities of AI bots with user-defined JavaScript functions." subheader_description: "Tools extend the capabilities of AI bots with user-defined JavaScript functions."
@ -455,7 +455,7 @@ en:
ai_bot: "AI bot" ai_bot: "AI bot"
ai_helper: "Helper" ai_helper: "Helper"
ai_helper_image_caption: "Image caption" ai_helper_image_caption: "Image caption"
ai_persona: "Persona (%{persona})" ai_agent: "Agent (%{agent})"
ai_summarization: "Summarize" ai_summarization: "Summarize"
ai_embeddings_semantic_search: "AI search" ai_embeddings_semantic_search: "AI search"
ai_spam: "Spam" ai_spam: "Spam"
@ -681,7 +681,7 @@ en:
click_to_run_label: "Run Artifact" click_to_run_label: "Run Artifact"
ai_bot: ai_bot:
persona: "Persona" agent: "Agent"
llm: "Model" llm: "Model"
pm_warning: "AI chatbot messages are monitored regularly by moderators." pm_warning: "AI chatbot messages are monitored regularly by moderators."
cancel_streaming: "Stop reply" cancel_streaming: "Stop reply"

View File

@ -15,7 +15,7 @@ en_GB:
discourse_ai: discourse_ai:
usage: usage:
summary: "Summary" summary: "Summary"
ai_persona: ai_agent:
description: "Description" description: "Description"
tools: tools:
description: "Description" description: "Description"

View File

@ -12,7 +12,7 @@ es:
descriptions: descriptions:
discourse_ai: discourse_ai:
search: "Permite la búsqueda de IA" search: "Permite la búsqueda de IA"
stream_completion: "Permite la transmisión de realización de personas de IA" stream_completion: "Permite la transmisión de realización de agents de IA"
site_settings: site_settings:
categories: categories:
discourse_ai: "Discourse AI" discourse_ai: "Discourse AI"
@ -128,9 +128,9 @@ es:
flag_post: flag_post:
label: "Denunciar publicación" label: "Denunciar publicación"
description: "Denuncia la publicación (como spam o para revisión)" description: "Denuncia la publicación (como spam o para revisión)"
include_personal_messages: include_agentl_messages:
label: "Incluir mensajes personales" label: "Incluir mensajes agentles"
description: "También escanea y clasifica los mensajes personales" description: "También escanea y clasifica los mensajes agentles"
model: model:
label: "Modelo" label: "Modelo"
description: "Modelo lingüístico utilizado para el triaje" description: "Modelo lingüístico utilizado para el triaje"
@ -152,8 +152,8 @@ es:
short_title: "Spam" short_title: "Spam"
title: "Configurar el manejo de correo no deseado" title: "Configurar el manejo de correo no deseado"
select_llm: "Seleccionar LLM" select_llm: "Seleccionar LLM"
custom_instructions: "Instrucciones personalizadas" custom_instructions: "Instrucciones agentlizadas"
custom_instructions_help: "Instrucciones personalizadas específicas de tu sitio para ayudar a guiar a la IA en la identificación del correo no deseado, por ejemplo: «Sé más agresivo a la hora de escanear los mensajes que no estén en inglés»." custom_instructions_help: "Instrucciones agentlizadas específicas de tu sitio para ayudar a guiar a la IA en la identificación del correo no deseado, por ejemplo: «Sé más agresivo a la hora de escanear los mensajes que no estén en inglés»."
last_seven_days: "Últimos 7 días" last_seven_days: "Últimos 7 días"
scanned_count: "Publicaciones escaneadas" scanned_count: "Publicaciones escaneadas"
false_positives: "Denunciado incorrectamente" false_positives: "Denunciado incorrectamente"
@ -218,8 +218,8 @@ es:
last_day: "Últimas 24 horas" last_day: "Últimas 24 horas"
last_week: "Última semana" last_week: "Última semana"
last_month: "Último mes" last_month: "Último mes"
custom: "Personalizado..." custom: "Agentlizado..."
ai_persona: ai_agent:
ai_tools: "Herramientas" ai_tools: "Herramientas"
tool_strategies: tool_strategies:
all: "Aplicar a todas las respuestas" all: "Aplicar a todas las respuestas"
@ -243,47 +243,47 @@ es:
tool_details: Mostrar detalles de la herramienta tool_details: Mostrar detalles de la herramienta
tool_details_help: Mostrará a los usuarios finales detalles sobre qué herramientas ha activado el modelo de lenguaje. tool_details_help: Mostrará a los usuarios finales detalles sobre qué herramientas ha activado el modelo de lenguaje.
mentionable: Permitir menciones mentionable: Permitir menciones
mentionable_help: Si está activada, los usuarios de los grupos permitidos pueden mencionar a este usuario en sus mensajes, y la IA responderá como esta persona. mentionable_help: Si está activada, los usuarios de los grupos permitidos pueden mencionar a este usuario en sus mensajes, y la IA responderá como esta agent.
user: Usuario user: Usuario
create_user: Crear usuario create_user: Crear usuario
create_user_help: Opcionalmente, puedes adjuntar un usuario a esta persona. Si lo haces, la IA utilizará a este usuario para responder a las solicitudes. create_user_help: Opcionalmente, puedes adjuntar un usuario a esta agent. Si lo haces, la IA utilizará a este usuario para responder a las solicitudes.
default_llm: Modelo lingüístico por defecto default_llm: Modelo lingüístico por defecto
default_llm_help: El modelo de idioma por defecto que se utilizará para esta persona. Obligatorio si deseas mencionar a la persona en publicaciones públicas. default_llm_help: El modelo de idioma por defecto que se utilizará para esta agent. Obligatorio si deseas mencionar a la agent en publicaciones públicas.
question_consolidator_llm: Modelo lingüístico para el consolidador de preguntas question_consolidator_llm: Modelo lingüístico para el consolidador de preguntas
question_consolidator_llm_help: El modelo lingüístico a utilizar para el consolidador de preguntas, puedes elegir un modelo menos potente para ahorrar costes. question_consolidator_llm_help: El modelo lingüístico a utilizar para el consolidador de preguntas, puedes elegir un modelo menos potente para ahorrar costes.
system_prompt: Aviso del sistema system_prompt: Aviso del sistema
forced_tool_strategy: Estrategia de herramienta forzada forced_tool_strategy: Estrategia de herramienta forzada
allow_chat_direct_messages: "Permitir mensajes directos de chat" allow_chat_direct_messages: "Permitir mensajes directos de chat"
allow_chat_direct_messages_help: "Si se activa, los usuarios de los grupos permitidos pueden enviar mensajes directos a esta persona." allow_chat_direct_messages_help: "Si se activa, los usuarios de los grupos permitidos pueden enviar mensajes directos a esta agent."
allow_chat_channel_mentions: "Permitir menciones en el canal de chat" allow_chat_channel_mentions: "Permitir menciones en el canal de chat"
allow_chat_channel_mentions_help: "Si se activa, los usuarios de los grupos permitidos pueden mencionar a esta persona en los canales de chat." allow_chat_channel_mentions_help: "Si se activa, los usuarios de los grupos permitidos pueden mencionar a esta agent en los canales de chat."
allow_personal_messages: "Permitir mensajes personales" allow_agentl_messages: "Permitir mensajes agentles"
allow_personal_messages_help: "Si se activa, los usuarios de los grupos permitidos pueden enviar mensajes personales a esta persona." allow_agentl_messages_help: "Si se activa, los usuarios de los grupos permitidos pueden enviar mensajes agentles a esta agent."
allow_topic_mentions: "Permitir menciones en temas" allow_topic_mentions: "Permitir menciones en temas"
allow_topic_mentions_help: "Si se activa, los usuarios de los grupos permitidos pueden mencionar a esta persona en los temas." allow_topic_mentions_help: "Si se activa, los usuarios de los grupos permitidos pueden mencionar a esta agent en los temas."
force_default_llm: "Utilizar siempre el modelo de idioma por defecto" force_default_llm: "Utilizar siempre el modelo de idioma por defecto"
save: "Guardar" save: "Guardar"
saved: "Persona guardada" saved: "Agent guardada"
enabled: "¿Activado?" enabled: "¿Activado?"
tools: "Herramientas habilitadas" tools: "Herramientas habilitadas"
forced_tools: "Herramientas forzadas" forced_tools: "Herramientas forzadas"
allowed_groups: "Grupos permitidos" allowed_groups: "Grupos permitidos"
confirm_delete: "¿Seguro que quieres eliminar esta persona?" confirm_delete: "¿Seguro que quieres eliminar esta agent?"
new: "Nueva persona" new: "Nueva agent"
no_personas: "Aún no has creado ninguna persona" no_agents: "Aún no has creado ninguna agent"
title: "Personas" title: "Agents"
short_title: "Personas" short_title: "Agents"
delete: "Eliminar" delete: "Eliminar"
temperature: "Temperatura" temperature: "Temperatura"
temperature_help: "Temperatura que se utilizará para el LLM. Aumentar para aumentar la creatividad (dejar vacío para utilizar el valor por defecto del modelo, generalmente un valor de 0,0 a 2,0)" temperature_help: "Temperatura que se utilizará para el LLM. Aumentar para aumentar la creatividad (dejar vacío para utilizar el valor por defecto del modelo, generalmente un valor de 0,0 a 2,0)"
top_p: "Top P" top_p: "Top P"
top_p_help: "Top P a utilizar para el LLM, aumentar para aumentar la aleatoriedad (dejar vacío para utilizar el modelo por defecto, generalmente un valor de 0,0 a 1,0)" top_p_help: "Top P a utilizar para el LLM, aumentar para aumentar la aleatoriedad (dejar vacío para utilizar el modelo por defecto, generalmente un valor de 0,0 a 1,0)"
priority: "Prioridad" priority: "Prioridad"
priority_help: "Las personas prioritarias se muestran a los usuarios en la parte superior de la lista de personas. Si varias personas tienen prioridad, se ordenarán alfabéticamente." priority_help: "Las agents prioritarias se muestran a los usuarios en la parte superior de la lista de agents. Si varias agents tienen prioridad, se ordenarán alfabéticamente."
tool_options: "Opciones de herramientas" tool_options: "Opciones de herramientas"
rag_conversation_chunks: "Buscar fragmentos de conversación" rag_conversation_chunks: "Buscar fragmentos de conversación"
rag_conversation_chunks_help: "El número de fragmentos a utilizar para las búsquedas del modelo RAG. Aumentar para incrementar la cantidad de contexto que puede utilizar la IA." rag_conversation_chunks_help: "El número de fragmentos a utilizar para las búsquedas del modelo RAG. Aumentar para incrementar la cantidad de contexto que puede utilizar la IA."
persona_description: "Las personas son una potente característica que te permite personalizar el comportamiento del motor de IA en tu foro de Discourse. Actúan como un «mensaje del sistema» que guía las respuestas e interacciones de la IA, ayudando a crear una experiencia de usuario más personalizada y atractiva." agent_description: "Las agents son una potente característica que te permite agentlizar el comportamiento del motor de IA en tu foro de Discourse. Actúan como un «mensaje del sistema» que guía las respuestas e interacciones de la IA, ayudando a crear una experiencia de usuario más agentlizada y atractiva."
response_format: response_format:
open_modal: "Editar" open_modal: "Editar"
modal: modal:
@ -369,14 +369,14 @@ es:
six_hours: "6 horas" six_hours: "6 horas"
day: "24 horas" day: "24 horas"
week: "7 días" week: "7 días"
custom: "Personalizado..." custom: "Agentlizado..."
hours: "horas" hours: "horas"
max_tokens_help: "Número máximo de tokens (palabras y caracteres) que cada usuario de este grupo puede utilizar dentro de la duración especificada. Los tokens son las unidades que utilizan los modelos de IA para procesar texto: aproximadamente 1 token = 4 caracteres o 3/4 de una palabra." max_tokens_help: "Número máximo de tokens (palabras y caracteres) que cada usuario de este grupo puede utilizar dentro de la duración especificada. Los tokens son las unidades que utilizan los modelos de IA para procesar texto: aproximadamente 1 token = 4 caracteres o 3/4 de una palabra."
max_usages_help: "Número máximo de veces que cada usuario de este grupo puede utilizar el modelo de IA dentro de la duración especificada. Esta cuota se controla por usuario individual, no se comparte con todo el grupo." max_usages_help: "Número máximo de veces que cada usuario de este grupo puede utilizar el modelo de IA dentro de la duración especificada. Esta cuota se controla por usuario individual, no se comparte con todo el grupo."
usage: usage:
ai_bot: "Bot de IA" ai_bot: "Bot de IA"
ai_helper: "Ayudante" ai_helper: "Ayudante"
ai_persona: "Persona (%{persona})" ai_agent: "Agent (%{agent})"
ai_summarization: "Resumir" ai_summarization: "Resumir"
ai_embeddings_semantic_search: "Búsqueda de IA" ai_embeddings_semantic_search: "Búsqueda de IA"
ai_spam: "Spam" ai_spam: "Spam"
@ -429,7 +429,7 @@ es:
samba_nova: "SambaNova" samba_nova: "SambaNova"
mistral: "Mistral" mistral: "Mistral"
open_router: "OpenRouter" open_router: "OpenRouter"
fake: "Personalizado" fake: "Agentlizado"
provider_fields: provider_fields:
access_key_id: "ID de la clave de acceso a AWS Bedrock" access_key_id: "ID de la clave de acceso a AWS Bedrock"
region: "Región de AWS Bedrock" region: "Región de AWS Bedrock"
@ -463,8 +463,8 @@ es:
discard: "Descartar" discard: "Descartar"
changes: "Ediciones sugeridas" changes: "Ediciones sugeridas"
custom_prompt: custom_prompt:
title: "Instruccón personalizada" title: "Instruccón agentlizada"
placeholder: "Introduzca un aviso personalizado..." placeholder: "Introduzca un aviso agentlizado..."
submit: "Enviar instrucción" submit: "Enviar instrucción"
translate_prompt: "Traducir a %{language}" translate_prompt: "Traducir a %{language}"
post_options_menu: post_options_menu:
@ -542,7 +542,7 @@ es:
google: "Google" google: "Google"
cloudflare: "Cloudflare" cloudflare: "Cloudflare"
CDCK: "CDCK" CDCK: "CDCK"
fake: "Personalizado" fake: "Agentlizado"
provider_fields: provider_fields:
model_name: "Nombre del modelo" model_name: "Nombre del modelo"
semantic_search: "Temas (semánticos)" semantic_search: "Temas (semánticos)"

View File

@ -52,7 +52,7 @@ et:
summary: "Kokkuvõte" summary: "Kokkuvõte"
username: "Kasutajanimi" username: "Kasutajanimi"
total_requests: "Kokku päringuid" total_requests: "Kokku päringuid"
ai_persona: ai_agent:
back: "Tagasi" back: "Tagasi"
name: "Nimi" name: "Nimi"
edit: "Muuda" edit: "Muuda"

View File

@ -83,7 +83,7 @@ fa_IR:
periods: periods:
last_day: "۲۴ ساعت گذشته" last_day: "۲۴ ساعت گذشته"
custom: "سفارشی..." custom: "سفارشی..."
ai_persona: ai_agent:
back: "بازگشت" back: "بازگشت"
name: "نام" name: "نام"
edit: "ویرایش" edit: "ویرایش"

View File

@ -128,7 +128,7 @@ fi:
flag_post: flag_post:
label: "Liputa viesti" label: "Liputa viesti"
description: "Liputtaa viestin (joko roskapostiksi tai käsiteltäväksi)" description: "Liputtaa viestin (joko roskapostiksi tai käsiteltäväksi)"
include_personal_messages: include_agentl_messages:
label: "Sisällytä yksityisviestit" label: "Sisällytä yksityisviestit"
description: "Skannaa ja luokittele myös yksityisviestit" description: "Skannaa ja luokittele myös yksityisviestit"
model: model:
@ -219,7 +219,7 @@ fi:
last_week: "Viime viikko" last_week: "Viime viikko"
last_month: "Viime kuukausi" last_month: "Viime kuukausi"
custom: "Mukautettu..." custom: "Mukautettu..."
ai_persona: ai_agent:
ai_tools: "Työkalut" ai_tools: "Työkalut"
tool_strategies: tool_strategies:
all: "Käytä kaikkiin vastauksiin" all: "Käytä kaikkiin vastauksiin"
@ -257,8 +257,8 @@ fi:
allow_chat_direct_messages_help: "Jos tämä on käytössä, sallittujen ryhmien käyttäjät voivat lähettää yksityisviestejä tälle persoonalle." allow_chat_direct_messages_help: "Jos tämä on käytössä, sallittujen ryhmien käyttäjät voivat lähettää yksityisviestejä tälle persoonalle."
allow_chat_channel_mentions: "Salli chat-kanavamaininnat" allow_chat_channel_mentions: "Salli chat-kanavamaininnat"
allow_chat_channel_mentions_help: "Jos tämä on käytössä, sallittujen ryhmien käyttäjät voivat mainita tämän persoonan chat-kanavilla." allow_chat_channel_mentions_help: "Jos tämä on käytössä, sallittujen ryhmien käyttäjät voivat mainita tämän persoonan chat-kanavilla."
allow_personal_messages: "Salli yksityisviestit" allow_agentl_messages: "Salli yksityisviestit"
allow_personal_messages_help: "Jos tämä on käytössä, sallittujen ryhmien käyttäjät voivat lähettää yksityisviestejä tälle persoonalle." allow_agentl_messages_help: "Jos tämä on käytössä, sallittujen ryhmien käyttäjät voivat lähettää yksityisviestejä tälle persoonalle."
allow_topic_mentions: "Salli ketjumaininnat" allow_topic_mentions: "Salli ketjumaininnat"
allow_topic_mentions_help: "Jos tämä on käytössä, sallittujen ryhmien käyttäjät voivat mainita tämän persoonan ketjuissa." allow_topic_mentions_help: "Jos tämä on käytössä, sallittujen ryhmien käyttäjät voivat mainita tämän persoonan ketjuissa."
force_default_llm: "Käytä aina oletuskielimallia" force_default_llm: "Käytä aina oletuskielimallia"
@ -270,7 +270,7 @@ fi:
allowed_groups: "Sallitut ryhmät" allowed_groups: "Sallitut ryhmät"
confirm_delete: "Oletko varma, että haluat poistaa tämän persoonan?" confirm_delete: "Oletko varma, että haluat poistaa tämän persoonan?"
new: "Uusi persoona" new: "Uusi persoona"
no_personas: "Et ole vielä luonut persoonia" no_agents: "Et ole vielä luonut persoonia"
title: "Persoonat" title: "Persoonat"
short_title: "Persoonat" short_title: "Persoonat"
delete: "Poista" delete: "Poista"
@ -283,7 +283,7 @@ fi:
tool_options: "Työkaluasetukset" tool_options: "Työkaluasetukset"
rag_conversation_chunks: "Hakukeskustelulohkot" rag_conversation_chunks: "Hakukeskustelulohkot"
rag_conversation_chunks_help: "RAG-mallin hauissa käytettävien lohkojen määrä. Lisää kontekstin määrää, jota tekoäly voi käyttää, kasvattamalla arvoa." rag_conversation_chunks_help: "RAG-mallin hauissa käytettävien lohkojen määrä. Lisää kontekstin määrää, jota tekoäly voi käyttää, kasvattamalla arvoa."
persona_description: "Personat ovat tehokas ominaisuus, jonka avulla voit mukauttaa tekoälymoduulin toimintaa Discourse-foorumillasi. Ne toimivat \"järjestelmäviestinä\", joka ohjaa tekoälyn vastauksia ja vuorovaikutusta ja auttaa luomaan personoidumman ja kiinnostavamman käyttökokemuksen." agent_description: "Agentt ovat tehokas ominaisuus, jonka avulla voit mukauttaa tekoälymoduulin toimintaa Discourse-foorumillasi. Ne toimivat \"järjestelmäviestinä\", joka ohjaa tekoälyn vastauksia ja vuorovaikutusta ja auttaa luomaan personoidumman ja kiinnostavamman käyttökokemuksen."
response_format: response_format:
open_modal: "Muokkaa" open_modal: "Muokkaa"
modal: modal:
@ -376,7 +376,7 @@ fi:
usage: usage:
ai_bot: "Tekoälyrobotti" ai_bot: "Tekoälyrobotti"
ai_helper: "Apuri" ai_helper: "Apuri"
ai_persona: "Persoona (%{persona})" ai_agent: "Persoona (%{agent})"
ai_summarization: "Tee yhteenveto" ai_summarization: "Tee yhteenveto"
ai_embeddings_semantic_search: "Tekoälyhaku" ai_embeddings_semantic_search: "Tekoälyhaku"
ai_spam: "Roskaposti" ai_spam: "Roskaposti"

View File

@ -128,7 +128,7 @@ fr:
flag_post: flag_post:
label: "Signaler cette publication" label: "Signaler cette publication"
description: "Signale la publication (soit comme spam ou pour examen)" description: "Signale la publication (soit comme spam ou pour examen)"
include_personal_messages: include_agentl_messages:
label: "Inclure les messages personnels" label: "Inclure les messages personnels"
description: "Analysez et triez également les messages personnels" description: "Analysez et triez également les messages personnels"
model: model:
@ -219,7 +219,7 @@ fr:
last_week: "La semaine dernière" last_week: "La semaine dernière"
last_month: "Le mois dernier" last_month: "Le mois dernier"
custom: "Personnalisé…" custom: "Personnalisé…"
ai_persona: ai_agent:
ai_tools: "Outils" ai_tools: "Outils"
tool_strategies: tool_strategies:
all: "Appliquer à toutes les réponses" all: "Appliquer à toutes les réponses"
@ -257,8 +257,8 @@ fr:
allow_chat_direct_messages_help: "Si cette option est activée, les utilisateurs des groupes autorisés peuvent envoyer des messages directs à ce personnage." allow_chat_direct_messages_help: "Si cette option est activée, les utilisateurs des groupes autorisés peuvent envoyer des messages directs à ce personnage."
allow_chat_channel_mentions: "Autoriser les mentions du canal de discussion" allow_chat_channel_mentions: "Autoriser les mentions du canal de discussion"
allow_chat_channel_mentions_help: "Si cette option est activée, les utilisateurs des groupes autorisés peuvent mentionner ce personnage dans les canaux de discussion." allow_chat_channel_mentions_help: "Si cette option est activée, les utilisateurs des groupes autorisés peuvent mentionner ce personnage dans les canaux de discussion."
allow_personal_messages: "Autoriser les messages personnels" allow_agentl_messages: "Autoriser les messages personnels"
allow_personal_messages_help: "Si cette option est activée, les utilisateurs des groupes autorisés peuvent envoyer des messages personnels à ce personnage." allow_agentl_messages_help: "Si cette option est activée, les utilisateurs des groupes autorisés peuvent envoyer des messages personnels à ce personnage."
allow_topic_mentions: "Autoriser les mentions de sujets" allow_topic_mentions: "Autoriser les mentions de sujets"
allow_topic_mentions_help: "Si cette option est activée, les utilisateurs des groupes autorisés peuvent mentionner ce personnage dans les sujets." allow_topic_mentions_help: "Si cette option est activée, les utilisateurs des groupes autorisés peuvent mentionner ce personnage dans les sujets."
force_default_llm: "Toujours utiliser le modèle linguistique par défaut" force_default_llm: "Toujours utiliser le modèle linguistique par défaut"
@ -270,7 +270,7 @@ fr:
allowed_groups: "Groupes autorisés" allowed_groups: "Groupes autorisés"
confirm_delete: "Voulez-vous vraiment supprimer ce personnage ?" confirm_delete: "Voulez-vous vraiment supprimer ce personnage ?"
new: "Nouveau personnage" new: "Nouveau personnage"
no_personas: "Vous n'avez pas encore créé de personnage" no_agents: "Vous n'avez pas encore créé de personnage"
title: "Personnages" title: "Personnages"
short_title: "Personnages" short_title: "Personnages"
delete: "Supprimer" delete: "Supprimer"
@ -283,7 +283,7 @@ fr:
tool_options: "Options de l'outil" tool_options: "Options de l'outil"
rag_conversation_chunks: "Rechercher des morceaux de conversation" rag_conversation_chunks: "Rechercher des morceaux de conversation"
rag_conversation_chunks_help: "Le nombre de segments à utiliser pour les recherches de modèles RAG. Augmentez pour augmenter la quantité de contexte que l'IA peut utiliser." rag_conversation_chunks_help: "Le nombre de segments à utiliser pour les recherches de modèles RAG. Augmentez pour augmenter la quantité de contexte que l'IA peut utiliser."
persona_description: "Les personnages sont une fonctionnalité puissante qui vous permet de personnaliser le comportement du moteur d'IA dans votre forum Discourse. Ils agissent comme un « message système » qui guide les réponses et les interactions de l'IA, en contribuant ainsi à créer une expérience utilisateur plus personnalisée et plus interactive." agent_description: "Les personnages sont une fonctionnalité puissante qui vous permet de personnaliser le comportement du moteur d'IA dans votre forum Discourse. Ils agissent comme un « message système » qui guide les réponses et les interactions de l'IA, en contribuant ainsi à créer une expérience utilisateur plus personnalisée et plus interactive."
response_format: response_format:
open_modal: "Modifier" open_modal: "Modifier"
modal: modal:
@ -376,7 +376,7 @@ fr:
usage: usage:
ai_bot: "Robot IA" ai_bot: "Robot IA"
ai_helper: "Assistant" ai_helper: "Assistant"
ai_persona: "Personnage (%{persona})" ai_agent: "Personnage (%{agent})"
ai_summarization: "Résumer" ai_summarization: "Résumer"
ai_embeddings_semantic_search: "Recherche IA" ai_embeddings_semantic_search: "Recherche IA"
ai_spam: "Spam" ai_spam: "Spam"

View File

@ -55,8 +55,8 @@ gl:
username: "Nome de usuario" username: "Nome de usuario"
total_requests: "Solicitudes totais" total_requests: "Solicitudes totais"
periods: periods:
custom: "Personalizar..." custom: "Agentlizar..."
ai_persona: ai_agent:
back: "Volver" back: "Volver"
name: "Nome" name: "Nome"
edit: "Editar" edit: "Editar"
@ -97,7 +97,7 @@ gl:
hour: "1 hora" hour: "1 hora"
six_hours: "6 horas" six_hours: "6 horas"
day: "24 horas" day: "24 horas"
custom: "Personalizar..." custom: "Agentlizar..."
hours: "horas" hours: "horas"
usage: usage:
ai_spam: "Lixo" ai_spam: "Lixo"
@ -107,7 +107,7 @@ gl:
success: "Feito!" success: "Feito!"
providers: providers:
google: "Google" google: "Google"
fake: "Personalizado" fake: "Agentlizado"
ai_helper: ai_helper:
context_menu: context_menu:
cancel: "Cancelar" cancel: "Cancelar"
@ -133,7 +133,7 @@ gl:
display_name: "Nome" display_name: "Nome"
providers: providers:
google: "Google" google: "Google"
fake: "Personalizado" fake: "Agentlizado"
ai_bot: ai_bot:
debug_ai_modal: debug_ai_modal:
request: "Petición" request: "Petición"

View File

@ -13,7 +13,7 @@ he:
discourse_ai: discourse_ai:
search: "מאפשר חיפוש בינה מלאכותית" search: "מאפשר חיפוש בינה מלאכותית"
stream_completion: "מאפשר הזרמת השלמות דמות בינה מלאכותית" stream_completion: "מאפשר הזרמת השלמות דמות בינה מלאכותית"
update_personas: "מאפשר לעדכן דמויות בינה מלאכותית" update_agents: "מאפשר לעדכן דמויות בינה מלאכותית"
site_settings: site_settings:
categories: categories:
discourse_ai: "בינה מלאכותית ב־Discourse" discourse_ai: "בינה מלאכותית ב־Discourse"
@ -100,9 +100,9 @@ he:
label: "מודל" label: "מודל"
tool: tool:
label: "כלי" label: "כלי"
llm_persona_triage: llm_agent_triage:
fields: fields:
persona: agent:
label: "דמות" label: "דמות"
silent_mode: silent_mode:
label: "מצב שקט" label: "מצב שקט"
@ -141,10 +141,10 @@ he:
flag_post: flag_post:
label: "סימון פוסט" label: "סימון פוסט"
description: "סימון פוסט (או כספאם או לסקירה)" description: "סימון פוסט (או כספאם או לסקירה)"
include_personal_messages: include_agentl_messages:
label: "כולל הודעות פרטיות" label: "כולל הודעות פרטיות"
description: "לסרוק ולאמת הודעות אישיות" description: "לסרוק ולאמת הודעות אישיות"
reply_persona: reply_agent:
label: "דמות לתגובה" label: "דמות לתגובה"
model: model:
label: "מודל" label: "מודל"
@ -161,7 +161,7 @@ he:
list: list:
header: header:
name: "שם" name: "שם"
persona: "דמות" agent: "דמות"
groups: "קבוצות" groups: "קבוצות"
edit: "עריכה" edit: "עריכה"
set_up: "הגדרה" set_up: "הגדרה"
@ -234,7 +234,7 @@ he:
last_week: "בשבוע שעבר" last_week: "בשבוע שעבר"
last_month: "בחודש שעבר" last_month: "בחודש שעבר"
custom: "התאמה אישית…" custom: "התאמה אישית…"
ai_persona: ai_agent:
ai_tools: "כלים" ai_tools: "כלים"
tool_strategies: tool_strategies:
all: "החלה על כל התגובות" all: "החלה על כל התגובות"
@ -275,8 +275,8 @@ he:
allow_chat_direct_messages_help: "אם האפשרות פעילה, משתמשים בקבוצות המורשות יכולים לשלוח הודעות ישירות לדמות הזאת." allow_chat_direct_messages_help: "אם האפשרות פעילה, משתמשים בקבוצות המורשות יכולים לשלוח הודעות ישירות לדמות הזאת."
allow_chat_channel_mentions: "לאפשר אזכורים בערוצי צ׳אט" allow_chat_channel_mentions: "לאפשר אזכורים בערוצי צ׳אט"
allow_chat_channel_mentions_help: "אם האפשרות פעילה, משתמשים בקבוצות המורשות יכולים לאזכר את הדמות הזאת בערוצי צ׳אט." allow_chat_channel_mentions_help: "אם האפשרות פעילה, משתמשים בקבוצות המורשות יכולים לאזכר את הדמות הזאת בערוצי צ׳אט."
allow_personal_messages: "לאפשר הודעות פרטיות" allow_agentl_messages: "לאפשר הודעות פרטיות"
allow_personal_messages_help: "אם האפשרות פעילה, משתמשים בקבוצות המורשות יכולים לשלוח הודעות פרטיות לדמות הזאת." allow_agentl_messages_help: "אם האפשרות פעילה, משתמשים בקבוצות המורשות יכולים לשלוח הודעות פרטיות לדמות הזאת."
allow_topic_mentions: "לאפשר אזכורים בנושאים" allow_topic_mentions: "לאפשר אזכורים בנושאים"
allow_topic_mentions_help: "אם האפשרות פעילה, משתמשים בקבוצות המורשות יכולים לאזכר את הדמות הזאת בנושאים." allow_topic_mentions_help: "אם האפשרות פעילה, משתמשים בקבוצות המורשות יכולים לאזכר את הדמות הזאת בנושאים."
force_default_llm: "תמיד להשתמש במודל השפה כברירת מחדל" force_default_llm: "תמיד להשתמש במודל השפה כברירת מחדל"
@ -288,7 +288,7 @@ he:
allowed_groups: "קבוצות מורשות" allowed_groups: "קבוצות מורשות"
confirm_delete: "למחוק את הדמות?" confirm_delete: "למחוק את הדמות?"
new: "דמות חדשה" new: "דמות חדשה"
no_personas: "לא יצרת דמויות עדיין" no_agents: "לא יצרת דמויות עדיין"
title: "דמויות" title: "דמויות"
short_title: "דמויות" short_title: "דמויות"
delete: "מחיקה" delete: "מחיקה"
@ -301,7 +301,7 @@ he:
tool_options: "אפשרויות כלי" tool_options: "אפשרויות כלי"
rag_conversation_chunks: "חיפוש בחלקי הדיון" rag_conversation_chunks: "חיפוש בחלקי הדיון"
rag_conversation_chunks_help: "מספר הנתחים לשימוש לחיפושים עם מודל ה־RAG. הגדלה תגדיל את כמות ההקשר בו יכולה להשתמש הבינה המלאכותית." rag_conversation_chunks_help: "מספר הנתחים לשימוש לחיפושים עם מודל ה־RAG. הגדלה תגדיל את כמות ההקשר בו יכולה להשתמש הבינה המלאכותית."
persona_description: "דמויות הן יכולות רבות עוצמה שמאפשר להתאים את התנהגות מנוע הבינה המלאכותית בפורום הדיסקורס שלך. הן מתנהגות כמו ‚הודעות מערכת’ שמנחות את תגובות והתנהלות הבינה המלאכותית, כדי לסייע ליצור חוויית משתמש מותאמת ומקרבת יותר." agent_description: "דמויות הן יכולות רבות עוצמה שמאפשר להתאים את התנהגות מנוע הבינה המלאכותית בפורום הדיסקורס שלך. הן מתנהגות כמו ‚הודעות מערכת’ שמנחות את תגובות והתנהלות הבינה המלאכותית, כדי לסייע ליצור חוויית משתמש מותאמת ומקרבת יותר."
response_format: response_format:
title: "תבנית תגובת JSON" title: "תבנית תגובת JSON"
no_format: "לא צוינה תבנית JSON" no_format: "לא צוינה תבנית JSON"
@ -422,7 +422,7 @@ he:
ai_bot: "בוט בינה מלאכותית" ai_bot: "בוט בינה מלאכותית"
ai_helper: "מסייע" ai_helper: "מסייע"
ai_helper_image_caption: "כותרת תמונה" ai_helper_image_caption: "כותרת תמונה"
ai_persona: "דמות (%{persona})" ai_agent: "דמות (%{agent})"
ai_summarization: "סיכום" ai_summarization: "סיכום"
ai_embeddings_semantic_search: "חיפוש בינה מלאכותית" ai_embeddings_semantic_search: "חיפוש בינה מלאכותית"
ai_spam: "ספאם" ai_spam: "ספאם"
@ -623,7 +623,7 @@ he:
collapse_view_label: "יציאה ממסך מלא (כפתורי ESC או Back)" collapse_view_label: "יציאה ממסך מלא (כפתורי ESC או Back)"
click_to_run_label: "הרצת תוצר" click_to_run_label: "הרצת תוצר"
ai_bot: ai_bot:
persona: "דמות" agent: "דמות"
llm: "מודל" llm: "מודל"
pm_warning: "הודעות בוט שיח בינה מלאכותית לא נאכפות דרך קבע על ידי המפקחים." pm_warning: "הודעות בוט שיח בינה מלאכותית לא נאכפות דרך קבע על ידי המפקחים."
cancel_streaming: "עצירת התגובה" cancel_streaming: "עצירת התגובה"

View File

@ -58,7 +58,7 @@ hr:
periods: periods:
last_day: "Posljednja 24 sata" last_day: "Posljednja 24 sata"
custom: "Prilagođeno..." custom: "Prilagođeno..."
ai_persona: ai_agent:
back: "Natrag" back: "Natrag"
name: "Ime" name: "Ime"
edit: "Uredi" edit: "Uredi"

View File

@ -59,7 +59,7 @@ hu:
periods: periods:
last_day: "Elmúlt 24 óra" last_day: "Elmúlt 24 óra"
custom: "Egyéni…" custom: "Egyéni…"
ai_persona: ai_agent:
back: "Vissza" back: "Vissza"
name: "Név" name: "Név"
edit: "Szerkesztés" edit: "Szerkesztés"

View File

@ -52,7 +52,7 @@ hy:
summary: "Ամփոփումը" summary: "Ամփոփումը"
username: "Օգտանուն" username: "Օգտանուն"
total_requests: "Ընդհանուր հարցումներ" total_requests: "Ընդհանուր հարցումներ"
ai_persona: ai_agent:
back: "Ետ" back: "Ետ"
name: "Անուն" name: "Անուն"
edit: "Խմբագրել" edit: "Խմբագրել"

View File

@ -116,12 +116,12 @@ id:
username: "Nama Pengguna" username: "Nama Pengguna"
periods: periods:
last_day: "24 jam terakhir" last_day: "24 jam terakhir"
ai_persona: ai_agent:
back: "Kembali" back: "Kembali"
name: "Nama" name: "Nama"
edit: "Ubah" edit: "Ubah"
description: "Deskripsi" description: "Deskripsi"
mentionable_help: Jika diaktifkan, pengguna di grup yang diizinkan dapat menyebut pengguna ini di posting, AI akan merespons sebagai persona ini. mentionable_help: Jika diaktifkan, pengguna di grup yang diizinkan dapat menyebut pengguna ini di posting, AI akan merespons sebagai agent ini.
user: Pengguna user: Pengguna
question_consolidator_llm: Model Bahasa untuk Konsolidator Pertanyaan question_consolidator_llm: Model Bahasa untuk Konsolidator Pertanyaan
question_consolidator_llm_help: Model bahasa yang digunakan untuk konsolidator pertanyaan, Anda dapat memilih model yang kurang kuat untuk menghemat biaya. question_consolidator_llm_help: Model bahasa yang digunakan untuk konsolidator pertanyaan, Anda dapat memilih model yang kurang kuat untuk menghemat biaya.

View File

@ -12,7 +12,7 @@ it:
descriptions: descriptions:
discourse_ai: discourse_ai:
search: "Consente la ricerca IA" search: "Consente la ricerca IA"
stream_completion: "Consente lo streaming di completamenti di personaggi IA" stream_completion: "Consente lo streaming di completamenti di agentggi IA"
site_settings: site_settings:
categories: categories:
discourse_ai: "Discourse AI" discourse_ai: "Discourse AI"
@ -128,9 +128,9 @@ it:
flag_post: flag_post:
label: "Segnala messaggio" label: "Segnala messaggio"
description: "Segnala il post (come spam o per la revisione)" description: "Segnala il post (come spam o per la revisione)"
include_personal_messages: include_agentl_messages:
label: "Includi messaggi personali" label: "Includi messaggi agentli"
description: "Esegui anche la scansione e la selezione dei messaggi personali" description: "Esegui anche la scansione e la selezione dei messaggi agentli"
model: model:
label: "Modello" label: "Modello"
description: "Modello linguistico utilizzato per il triage" description: "Modello linguistico utilizzato per il triage"
@ -152,8 +152,8 @@ it:
short_title: "Spam" short_title: "Spam"
title: "Configura la gestione dello spam" title: "Configura la gestione dello spam"
select_llm: "Seleziona LLM" select_llm: "Seleziona LLM"
custom_instructions: "Istruzioni personalizzate" custom_instructions: "Istruzioni agentlizzate"
custom_instructions_help: "Istruzioni personalizzate specifiche per il tuo sito per aiutare l'intelligenza artificiale a identificare lo spam, ad esempio \"Sii più aggressivo nell'analizzare i post in una lingua diversa dall'italiano\"." custom_instructions_help: "Istruzioni agentlizzate specifiche per il tuo sito per aiutare l'intelligenza artificiale a identificare lo spam, ad esempio \"Sii più aggressivo nell'analizzare i post in una lingua diversa dall'italiano\"."
last_seven_days: "Ultimi 7 giorni" last_seven_days: "Ultimi 7 giorni"
scanned_count: "Messaggi scansionati" scanned_count: "Messaggi scansionati"
false_positives: "Segnalato in modo errato" false_positives: "Segnalato in modo errato"
@ -218,8 +218,8 @@ it:
last_day: "Ultime 24 ore" last_day: "Ultime 24 ore"
last_week: "Ultima settimana" last_week: "Ultima settimana"
last_month: "Ultimo mese" last_month: "Ultimo mese"
custom: "Personalizza..." custom: "Agentlizza..."
ai_persona: ai_agent:
ai_tools: "Strumenti" ai_tools: "Strumenti"
tool_strategies: tool_strategies:
all: "Applica a tutte le risposte" all: "Applica a tutte le risposte"
@ -243,47 +243,47 @@ it:
tool_details: Mostra i dettagli dello strumento tool_details: Mostra i dettagli dello strumento
tool_details_help: Mostrerà agli utenti finali i dettagli su quali strumenti ha attivato il modello linguistico. tool_details_help: Mostrerà agli utenti finali i dettagli su quali strumenti ha attivato il modello linguistico.
mentionable: Consenti menzioni mentionable: Consenti menzioni
mentionable_help: Se l'opzione è abilitata, gli utenti nei gruppi consentiti possono menzionare questo utente nei post, l'IA risponderà come questa persona. mentionable_help: Se l'opzione è abilitata, gli utenti nei gruppi consentiti possono menzionare questo utente nei post, l'IA risponderà come questa agent.
user: Utente user: Utente
create_user: Crea utente create_user: Crea utente
create_user_help: Facoltativamente, è possibile associare un utente a questa persona. In tal caso, l'IA utilizzerà questo utente per rispondere alle richieste. create_user_help: Facoltativamente, è possibile associare un utente a questa agent. In tal caso, l'IA utilizzerà questo utente per rispondere alle richieste.
default_llm: Modello linguistico predefinito default_llm: Modello linguistico predefinito
default_llm_help: Il modello linguistico predefinito da utilizzare per questa persona. Obbligatorio se desideri menzionare la persona nei post pubblici. default_llm_help: Il modello linguistico predefinito da utilizzare per questa agent. Obbligatorio se desideri menzionare la agent nei post pubblici.
question_consolidator_llm: Modello linguistico per il consolidatore di domande question_consolidator_llm: Modello linguistico per il consolidatore di domande
question_consolidator_llm_help: Il modello linguistico da utilizzare per il consolidatore di domande. È possibile scegliere un modello meno potente per risparmiare sui costi. question_consolidator_llm_help: Il modello linguistico da utilizzare per il consolidatore di domande. È possibile scegliere un modello meno potente per risparmiare sui costi.
system_prompt: Comando di sistema system_prompt: Comando di sistema
forced_tool_strategy: Strategia degli strumenti forzati forced_tool_strategy: Strategia degli strumenti forzati
allow_chat_direct_messages: "Consenti messaggi diretti in chat" allow_chat_direct_messages: "Consenti messaggi diretti in chat"
allow_chat_direct_messages_help: "Se l'opzione è abilitata, gli utenti nei gruppi consentiti possono inviare messaggi diretti a questa persona." allow_chat_direct_messages_help: "Se l'opzione è abilitata, gli utenti nei gruppi consentiti possono inviare messaggi diretti a questa agent."
allow_chat_channel_mentions: "Consenti menzioni nei canali di chat" allow_chat_channel_mentions: "Consenti menzioni nei canali di chat"
allow_chat_channel_mentions_help: "Se abilitato, gli utenti nei gruppi consentiti possono menzionare questo personaggio nei canali di chat." allow_chat_channel_mentions_help: "Se abilitato, gli utenti nei gruppi consentiti possono menzionare questo agentggio nei canali di chat."
allow_personal_messages: "Consenti messaggi personali" allow_agentl_messages: "Consenti messaggi agentli"
allow_personal_messages_help: "Se l'opzione è abilitata, gli utenti nei gruppi consentiti possono inviare messaggi personali a questo personaggio." allow_agentl_messages_help: "Se l'opzione è abilitata, gli utenti nei gruppi consentiti possono inviare messaggi agentli a questo agentggio."
allow_topic_mentions: "Consenti menzioni nell'argomento" allow_topic_mentions: "Consenti menzioni nell'argomento"
allow_topic_mentions_help: "Se abilitato, gli utenti nei gruppi consentiti possono menzionare questa persona negli argomenti." allow_topic_mentions_help: "Se abilitato, gli utenti nei gruppi consentiti possono menzionare questa agent negli argomenti."
force_default_llm: "Usa sempre il modello linguistico predefinito" force_default_llm: "Usa sempre il modello linguistico predefinito"
save: "Salva" save: "Salva"
saved: "Persona salvata" saved: "Agent salvata"
enabled: "Abilitato?" enabled: "Abilitato?"
tools: "Strumenti abilitati" tools: "Strumenti abilitati"
forced_tools: "Strumenti forzati" forced_tools: "Strumenti forzati"
allowed_groups: "Gruppi ammessi" allowed_groups: "Gruppi ammessi"
confirm_delete: "Vuoi davvero eliminare questo personaggio?" confirm_delete: "Vuoi davvero eliminare questo agentggio?"
new: "Nuovo personaggio" new: "Nuovo agentggio"
no_personas: "Non hai ancora creato nessun personaggio" no_agents: "Non hai ancora creato nessun agentggio"
title: "Personaggi" title: "Agentggi"
short_title: "Personaggi" short_title: "Agentggi"
delete: "Elimina" delete: "Elimina"
temperature: "Temperatura" temperature: "Temperatura"
temperature_help: "Temperatura da utilizzare per LLM. Aumenta per aumentare la creatività (lascia vuoto per utilizzare il modello predefinito, generalmente un valore compreso tra 0,0 e 2,0)" temperature_help: "Temperatura da utilizzare per LLM. Aumenta per aumentare la creatività (lascia vuoto per utilizzare il modello predefinito, generalmente un valore compreso tra 0,0 e 2,0)"
top_p: "P superiore" top_p: "P superiore"
top_p_help: "P superiore da utilizzare per LLM, aumenta per aumentare la casualità (lascia vuoto per utilizzare l'impostazione predefinita del modello, generalmente un valore compreso tra 0,0 e 1,0)" top_p_help: "P superiore da utilizzare per LLM, aumenta per aumentare la casualità (lascia vuoto per utilizzare l'impostazione predefinita del modello, generalmente un valore compreso tra 0,0 e 1,0)"
priority: "Priorità" priority: "Priorità"
priority_help: "I personaggi prioritari vengono visualizzati agli utenti nella parte superiore dell'elenco dei personaggi. Se più personaggi hanno la priorità, verranno ordinati in ordine alfabetico." priority_help: "I agentggi prioritari vengono visualizzati agli utenti nella parte superiore dell'elenco dei agentggi. Se più agentggi hanno la priorità, verranno ordinati in ordine alfabetico."
tool_options: "Opzioni dello strumento" tool_options: "Opzioni dello strumento"
rag_conversation_chunks: "Cerca blocchi di conversazione" rag_conversation_chunks: "Cerca blocchi di conversazione"
rag_conversation_chunks_help: "Il numero di blocchi da utilizzare per le ricerche del modello RAG. Aumenta per aumentare la quantità di contesto che l'IA può utilizzare." rag_conversation_chunks_help: "Il numero di blocchi da utilizzare per le ricerche del modello RAG. Aumenta per aumentare la quantità di contesto che l'IA può utilizzare."
persona_description: "I personaggi sono una potente funzionalità che ti consente di personalizzare il comportamento del motore IA nel tuo forum Discourse. Agiscono come un \"messaggio di sistema\" che guida le risposte e le interazioni dell'IA, aiutando a creare un'esperienza utente più personalizzata e coinvolgente." agent_description: "I agentggi sono una potente funzionalità che ti consente di agentlizzare il comportamento del motore IA nel tuo forum Discourse. Agiscono come un \"messaggio di sistema\" che guida le risposte e le interazioni dell'IA, aiutando a creare un'esperienza utente più agentlizzata e coinvolgente."
response_format: response_format:
open_modal: "Modifica" open_modal: "Modifica"
modal: modal:
@ -369,14 +369,14 @@ it:
six_hours: "6 ore" six_hours: "6 ore"
day: "24 ore" day: "24 ore"
week: "7 giorni" week: "7 giorni"
custom: "Personalizza..." custom: "Agentlizza..."
hours: "ore" hours: "ore"
max_tokens_help: "Numero massimo di token (parole e caratteri) che ogni utente di questo gruppo può utilizzare entro la durata specificata. I token sono le unità utilizzate dai modelli IA per elaborare il testo: circa 1 token = 4 caratteri o 3/4 di parola." max_tokens_help: "Numero massimo di token (parole e caratteri) che ogni utente di questo gruppo può utilizzare entro la durata specificata. I token sono le unità utilizzate dai modelli IA per elaborare il testo: circa 1 token = 4 caratteri o 3/4 di parola."
max_usages_help: "Numero massimo di volte in cui ogni utente in questo gruppo può usare il modello IA entro la durata specificata. Questa quota viene tracciata per singolo utente, non condivisa tra il gruppo." max_usages_help: "Numero massimo di volte in cui ogni utente in questo gruppo può usare il modello IA entro la durata specificata. Questa quota viene tracciata per singolo utente, non condivisa tra il gruppo."
usage: usage:
ai_bot: "Bot IA" ai_bot: "Bot IA"
ai_helper: "Assistente" ai_helper: "Assistente"
ai_persona: "Personaggio (%{persona})" ai_agent: "Agentggio (%{agent})"
ai_summarization: "Riassumi" ai_summarization: "Riassumi"
ai_embeddings_semantic_search: "Ricerca IA" ai_embeddings_semantic_search: "Ricerca IA"
ai_spam: "Spam" ai_spam: "Spam"
@ -429,7 +429,7 @@ it:
samba_nova: "SambaNova" samba_nova: "SambaNova"
mistral: "Mistral" mistral: "Mistral"
open_router: "OpenRouter" open_router: "OpenRouter"
fake: "Personalizzato" fake: "Agentlizzato"
provider_fields: provider_fields:
access_key_id: "ID chiave di accesso AWS Bedrock" access_key_id: "ID chiave di accesso AWS Bedrock"
region: "Regione AWS Bedrock" region: "Regione AWS Bedrock"
@ -463,8 +463,8 @@ it:
discard: "Elimina" discard: "Elimina"
changes: "Modifiche suggerite" changes: "Modifiche suggerite"
custom_prompt: custom_prompt:
title: "Comando personalizzato" title: "Comando agentlizzato"
placeholder: "Inserisci un comando personalizzato..." placeholder: "Inserisci un comando agentlizzato..."
submit: "Invia comando" submit: "Invia comando"
translate_prompt: "Traduci in %{language}" translate_prompt: "Traduci in %{language}"
post_options_menu: post_options_menu:
@ -542,7 +542,7 @@ it:
google: "Google" google: "Google"
cloudflare: "Cloudflare" cloudflare: "Cloudflare"
CDCK: "CDCK" CDCK: "CDCK"
fake: "Personalizzato" fake: "Agentlizzato"
provider_fields: provider_fields:
model_name: "Nome del modello" model_name: "Nome del modello"
semantic_search: "Argomenti (semantici)" semantic_search: "Argomenti (semantici)"

View File

@ -128,7 +128,7 @@ ja:
flag_post: flag_post:
label: "投稿を通報" label: "投稿を通報"
description: "投稿を通報 (迷惑またはレビュー対象)" description: "投稿を通報 (迷惑またはレビュー対象)"
include_personal_messages: include_agentl_messages:
label: "個人メッセージを含める" label: "個人メッセージを含める"
description: "個人メッセージのスキャンとトリアージも行う" description: "個人メッセージのスキャンとトリアージも行う"
model: model:
@ -218,7 +218,7 @@ ja:
last_week: "先週" last_week: "先週"
last_month: "先月" last_month: "先月"
custom: "カスタム..." custom: "カスタム..."
ai_persona: ai_agent:
ai_tools: "ツール" ai_tools: "ツール"
tool_strategies: tool_strategies:
all: "すべての返信に適用" all: "すべての返信に適用"
@ -255,8 +255,8 @@ ja:
allow_chat_direct_messages_help: "有効にすると、許可されているグループのユーザーはこのペルソナにダイレクトメッセージを送信できます。" allow_chat_direct_messages_help: "有効にすると、許可されているグループのユーザーはこのペルソナにダイレクトメッセージを送信できます。"
allow_chat_channel_mentions: "チャットチャンネルのメンションを許可" allow_chat_channel_mentions: "チャットチャンネルのメンションを許可"
allow_chat_channel_mentions_help: "有効にすると、許可されたグループ内のユーザーはチャットチャンネルでこのペルソナをメンションできます。" allow_chat_channel_mentions_help: "有効にすると、許可されたグループ内のユーザーはチャットチャンネルでこのペルソナをメンションできます。"
allow_personal_messages: "個人メッセージを許可" allow_agentl_messages: "個人メッセージを許可"
allow_personal_messages_help: "有効にすると、許可されているグループのユーザーはこのペルソナに個人メッセージを送信できます。" allow_agentl_messages_help: "有効にすると、許可されているグループのユーザーはこのペルソナに個人メッセージを送信できます。"
allow_topic_mentions: "トピックのメンションを許可" allow_topic_mentions: "トピックのメンションを許可"
allow_topic_mentions_help: "有効にすると、許可されたグループ内のユーザーはトピックでこのペルソナをメンションできます。" allow_topic_mentions_help: "有効にすると、許可されたグループ内のユーザーはトピックでこのペルソナをメンションできます。"
force_default_llm: "常にデフォルトの言語モデルを使用する" force_default_llm: "常にデフォルトの言語モデルを使用する"
@ -268,7 +268,7 @@ ja:
allowed_groups: "許可されたグループ" allowed_groups: "許可されたグループ"
confirm_delete: "このペルソナを削除してもよろしいですか?" confirm_delete: "このペルソナを削除してもよろしいですか?"
new: "新しいペルソナ" new: "新しいペルソナ"
no_personas: "ペルソナをまだ作成していません" no_agents: "ペルソナをまだ作成していません"
title: "ペルソナ" title: "ペルソナ"
short_title: "ペルソナ" short_title: "ペルソナ"
delete: "削除" delete: "削除"
@ -281,7 +281,7 @@ ja:
tool_options: "ツールのオプション" tool_options: "ツールのオプション"
rag_conversation_chunks: "会話チャンクを検索" rag_conversation_chunks: "会話チャンクを検索"
rag_conversation_chunks_help: "RAG モデル検索に使用するチャンクの数。値を増やすと、AI が使用できるコンテキストの量が増えます。" rag_conversation_chunks_help: "RAG モデル検索に使用するチャンクの数。値を増やすと、AI が使用できるコンテキストの量が増えます。"
persona_description: "ペルソナは、Discourse フォーラムの AI エンジンの動作をカスタマイズできる強力な機能です。AI の応答と対話を誘導する「システムメッセージ」として機能し、よりパーソナライズされた魅力的なユーザーエクスペリエンスの作成に役立ちます。" agent_description: "ペルソナは、Discourse フォーラムの AI エンジンの動作をカスタマイズできる強力な機能です。AI の応答と対話を誘導する「システムメッセージ」として機能し、よりパーソナライズされた魅力的なユーザーエクスペリエンスの作成に役立ちます。"
response_format: response_format:
open_modal: "編集" open_modal: "編集"
modal: modal:
@ -374,7 +374,7 @@ ja:
usage: usage:
ai_bot: "AI ボット" ai_bot: "AI ボット"
ai_helper: "ヘルパー" ai_helper: "ヘルパー"
ai_persona: "ペルソナ (%{persona})" ai_agent: "ペルソナ (%{agent})"
ai_summarization: "要約" ai_summarization: "要約"
ai_embeddings_semantic_search: "AI 検索" ai_embeddings_semantic_search: "AI 検索"
ai_spam: "迷惑" ai_spam: "迷惑"

View File

@ -60,7 +60,7 @@ ko:
periods: periods:
last_day: "지난 24시간" last_day: "지난 24시간"
custom: "사용자 지정..." custom: "사용자 지정..."
ai_persona: ai_agent:
back: "뒤로" back: "뒤로"
name: "그룹명" name: "그룹명"
edit: "편집" edit: "편집"

View File

@ -95,7 +95,7 @@ lt:
periods: periods:
last_day: "Paskutinės 24 valandos" last_day: "Paskutinės 24 valandos"
custom: "Pasirinktinis..." custom: "Pasirinktinis..."
ai_persona: ai_agent:
back: "Atgal" back: "Atgal"
name: "Vardas" name: "Vardas"
edit: "Redaguoti" edit: "Redaguoti"

View File

@ -54,7 +54,7 @@ lv:
username: "Lietotājvārds" username: "Lietotājvārds"
periods: periods:
last_day: "Pēdējās 24 stundas" last_day: "Pēdējās 24 stundas"
ai_persona: ai_agent:
back: "Atpakaļ" back: "Atpakaļ"
name: "Vārds" name: "Vārds"
edit: "Rediģēt" edit: "Rediģēt"

View File

@ -55,7 +55,7 @@ nb_NO:
total_requests: "Totalt forespørsler" total_requests: "Totalt forespørsler"
periods: periods:
last_day: "Siste 24 timer" last_day: "Siste 24 timer"
ai_persona: ai_agent:
back: "Forrige" back: "Forrige"
name: "Navn" name: "Navn"
edit: "Endre" edit: "Endre"

View File

@ -12,7 +12,7 @@ nl:
descriptions: descriptions:
discourse_ai: discourse_ai:
search: "Staat AI zoeken toe" search: "Staat AI zoeken toe"
stream_completion: "Maakt streamen van voltooiingen van AI persona's mogelijk" stream_completion: "Maakt streamen van voltooiingen van AI agent's mogelijk"
site_settings: site_settings:
categories: categories:
discourse_ai: "Discourse AI" discourse_ai: "Discourse AI"
@ -128,7 +128,7 @@ nl:
flag_post: flag_post:
label: "Bericht markeren" label: "Bericht markeren"
description: "Markeert berichten (als spam of ter beoordeling)" description: "Markeert berichten (als spam of ter beoordeling)"
include_personal_messages: include_agentl_messages:
label: "Persoonlijke berichten opnemen" label: "Persoonlijke berichten opnemen"
description: "Scan en triageer ook persoonlijke berichten" description: "Scan en triageer ook persoonlijke berichten"
model: model:
@ -219,7 +219,7 @@ nl:
last_week: "Vorige week" last_week: "Vorige week"
last_month: "Vorige maand" last_month: "Vorige maand"
custom: "Aangepast..." custom: "Aangepast..."
ai_persona: ai_agent:
ai_tools: "Tools" ai_tools: "Tools"
tool_strategies: tool_strategies:
all: "Toepassen op alle antwoorden" all: "Toepassen op alle antwoorden"
@ -243,47 +243,47 @@ nl:
tool_details: Tooldetails weergeven tool_details: Tooldetails weergeven
tool_details_help: Toont eindgebruikers informatie over welke tools het taalmodel heeft geactiveerd. tool_details_help: Toont eindgebruikers informatie over welke tools het taalmodel heeft geactiveerd.
mentionable: Vermeldingen toestaan mentionable: Vermeldingen toestaan
mentionable_help: Indien ingeschakeld, kunnen gebruikers in toegestane groepen deze gebruiker vermelden in berichten. De AI reageert als deze persona. mentionable_help: Indien ingeschakeld, kunnen gebruikers in toegestane groepen deze gebruiker vermelden in berichten. De AI reageert als deze agent.
user: Gebruiker user: Gebruiker
create_user: Gebruiker maken create_user: Gebruiker maken
create_user_help: Je kunt optioneel een gebruiker aan deze persona koppelen. Als je dat doet, gebruikt de AI deze gebruiker om op verzoeken te antwoorden. create_user_help: Je kunt optioneel een gebruiker aan deze agent koppelen. Als je dat doet, gebruikt de AI deze gebruiker om op verzoeken te antwoorden.
default_llm: Standaard taalmodel default_llm: Standaard taalmodel
default_llm_help: Het standaard taalmodel dat voor deze persona moet worden gebruikt. Vereist als je de persona wilt vermelden in openbare berichten. default_llm_help: Het standaard taalmodel dat voor deze agent moet worden gebruikt. Vereist als je de agent wilt vermelden in openbare berichten.
question_consolidator_llm: Taalmodel voor Vragenconsolidator question_consolidator_llm: Taalmodel voor Vragenconsolidator
question_consolidator_llm_help: Het te gebruiken taalmodel voor de vragenconsolidator. Je kunt een minder krachtig model kiezen om kosten te besparen. question_consolidator_llm_help: Het te gebruiken taalmodel voor de vragenconsolidator. Je kunt een minder krachtig model kiezen om kosten te besparen.
system_prompt: Systeemprompt system_prompt: Systeemprompt
forced_tool_strategy: Gedwongen toolstrategie forced_tool_strategy: Gedwongen toolstrategie
allow_chat_direct_messages: "Directe chatberichten toestaan" allow_chat_direct_messages: "Directe chatberichten toestaan"
allow_chat_direct_messages_help: "Indien ingeschakeld, kunnen gebruikers in toegestane groepen directe berichten naar deze persona sturen." allow_chat_direct_messages_help: "Indien ingeschakeld, kunnen gebruikers in toegestane groepen directe berichten naar deze agent sturen."
allow_chat_channel_mentions: "Vermelding in chatkanalen toestaan" allow_chat_channel_mentions: "Vermelding in chatkanalen toestaan"
allow_chat_channel_mentions_help: "Indien ingeschakeld, kunnen gebruikers in toegestane groepen deze persona vermelden in chatkanalen." allow_chat_channel_mentions_help: "Indien ingeschakeld, kunnen gebruikers in toegestane groepen deze agent vermelden in chatkanalen."
allow_personal_messages: "Persoonlijke berichten toestaan" allow_agentl_messages: "Persoonlijke berichten toestaan"
allow_personal_messages_help: "Indien ingeschakeld, kunnen gebruikers in toegestane groepen persoonlijke berichten naar deze persona sturen." allow_agentl_messages_help: "Indien ingeschakeld, kunnen gebruikers in toegestane groepen persoonlijke berichten naar deze agent sturen."
allow_topic_mentions: "Vermelding in topics toestaan" allow_topic_mentions: "Vermelding in topics toestaan"
allow_topic_mentions_help: "Indien ingeschakeld, kunnen gebruikers in toegestane groepen deze persona vermelden in topics." allow_topic_mentions_help: "Indien ingeschakeld, kunnen gebruikers in toegestane groepen deze agent vermelden in topics."
force_default_llm: "Altijd standaard taalmodel gebruiken" force_default_llm: "Altijd standaard taalmodel gebruiken"
save: "Opslaan" save: "Opslaan"
saved: "Persona opgeslagen" saved: "Agent opgeslagen"
enabled: "Ingeschakeld?" enabled: "Ingeschakeld?"
tools: "Ingeschakelde tools" tools: "Ingeschakelde tools"
forced_tools: "Geforceerde tools" forced_tools: "Geforceerde tools"
allowed_groups: "Toegestane groepen" allowed_groups: "Toegestane groepen"
confirm_delete: "Weet je zeker dat je deze persona wilt verwijderen?" confirm_delete: "Weet je zeker dat je deze agent wilt verwijderen?"
new: "Nieuwe persona" new: "Nieuwe agent"
no_personas: "Je hebt nog geen persona's gemaakt" no_agents: "Je hebt nog geen agent's gemaakt"
title: "Persona's" title: "Agent's"
short_title: "Persona's" short_title: "Agent's"
delete: "Verwijderen" delete: "Verwijderen"
temperature: "Temperatuur" temperature: "Temperatuur"
temperature_help: "Te gebruiken temperatuur voor de LLM. Verhoog deze om de creativiteit te vergroten (laat dit leeg om de standaardinstelling van het model te gebruiken, doorgaans een waarde van 0,0 tot 2,0)" temperature_help: "Te gebruiken temperatuur voor de LLM. Verhoog deze om de creativiteit te vergroten (laat dit leeg om de standaardinstelling van het model te gebruiken, doorgaans een waarde van 0,0 tot 2,0)"
top_p: "Top P" top_p: "Top P"
top_p_help: "Te gebruiken Top P voor de LLM. Verhoog deze om de willekeurigheid te vergroten (laat dit leeg om de standaardinstelling van het model te gebruiken, doorgaans een waarde van 0,0 tot 2,0)" top_p_help: "Te gebruiken Top P voor de LLM. Verhoog deze om de willekeurigheid te vergroten (laat dit leeg om de standaardinstelling van het model te gebruiken, doorgaans een waarde van 0,0 tot 2,0)"
priority: "Prioriteit" priority: "Prioriteit"
priority_help: "Prioritaire persona's worden bovenaan de personalijst weergegeven voor gebruikers. Als meerdere persona's prioriteit hebben, worden deze alfabetisch gesorteerd." priority_help: "Prioritaire agent's worden bovenaan de agentlijst weergegeven voor gebruikers. Als meerdere agent's prioriteit hebben, worden deze alfabetisch gesorteerd."
tool_options: "Toolopties" tool_options: "Toolopties"
rag_conversation_chunks: "Conversatiechunks zoeken" rag_conversation_chunks: "Conversatiechunks zoeken"
rag_conversation_chunks_help: "Het te gebruiken aantal chunks voor zoeken door het RAG-model. Verhoog dit om de hoeveelheid context te vergroten die de AI kan gebruiken." rag_conversation_chunks_help: "Het te gebruiken aantal chunks voor zoeken door het RAG-model. Verhoog dit om de hoeveelheid context te vergroten die de AI kan gebruiken."
persona_description: "Persona's zijn een krachtige functie waarmee je het gedrag van de AI-engine kunt aanpassen in je Discourse-forum. Ze fungeren als een 'systeembericht' dat de reacties en interacties van de AI stuurt, waardoor je een persoonlijkere en boeiendere gebruikerservaring creëert." agent_description: "Agent's zijn een krachtige functie waarmee je het gedrag van de AI-engine kunt aanpassen in je Discourse-forum. Ze fungeren als een 'systeembericht' dat de reacties en interacties van de AI stuurt, waardoor je een persoonlijkere en boeiendere gebruikerservaring creëert."
response_format: response_format:
open_modal: "Bewerken" open_modal: "Bewerken"
modal: modal:
@ -376,7 +376,7 @@ nl:
usage: usage:
ai_bot: "AI-bot" ai_bot: "AI-bot"
ai_helper: "Helper" ai_helper: "Helper"
ai_persona: "Persona (%{persona})" ai_agent: "Agent (%{agent})"
ai_summarization: "Samenvatten" ai_summarization: "Samenvatten"
ai_embeddings_semantic_search: "AI zoeken" ai_embeddings_semantic_search: "AI zoeken"
ai_spam: "Spam" ai_spam: "Spam"

View File

@ -95,13 +95,13 @@ pl_PL:
description: "Domyślny model językowy używany do selekcji" description: "Domyślny model językowy używany do selekcji"
tool: tool:
label: "Narzędzie" label: "Narzędzie"
llm_persona_triage: llm_agent_triage:
fields: fields:
persona: agent:
label: "Osobowość" label: "Osobowość"
silent_mode: silent_mode:
label: "Tryb cichy" label: "Tryb cichy"
description: "W trybie cichym persona otrzyma zawartość, ale nie opublikuje niczego na forum - przydatne podczas przeprowadzania selekcji przy użyciu narzędzi." description: "W trybie cichym agent otrzyma zawartość, ale nie opublikuje niczego na forum - przydatne podczas przeprowadzania selekcji przy użyciu narzędzi."
llm_triage: llm_triage:
fields: fields:
system_prompt: system_prompt:
@ -136,12 +136,12 @@ pl_PL:
flag_post: flag_post:
label: "Oflaguj post" label: "Oflaguj post"
description: "Oflaguj post (jako spam lub do sprawdzenia)" description: "Oflaguj post (jako spam lub do sprawdzenia)"
include_personal_messages: include_agentl_messages:
label: "Dołącz osobiste wiadomości" label: "Dołącz osobiste wiadomości"
description: "Skanuj i sortuj również wiadomości prywatne" description: "Skanuj i sortuj również wiadomości prywatne"
reply_persona: reply_agent:
label: "Persona odpowiedzi" label: "Agent odpowiedzi"
description: "AI Persona użyta do odpowiedzi (musi mieć domyślną wartość LLM), będzie traktowana priorytetowo nad gotową odpowiedzią" description: "AI Agent użyta do odpowiedzi (musi mieć domyślną wartość LLM), będzie traktowana priorytetowo nad gotową odpowiedzią"
model: model:
label: "Model" label: "Model"
description: "Model językowy używany do selekcji" description: "Model językowy używany do selekcji"
@ -155,7 +155,7 @@ pl_PL:
list: list:
header: header:
name: "Nazwa" name: "Nazwa"
persona: "Osobowość" agent: "Osobowość"
groups: "Grupy" groups: "Grupy"
edit: "Edytuj" edit: "Edytuj"
set_up: "Skonfiguruj" set_up: "Skonfiguruj"
@ -227,7 +227,7 @@ pl_PL:
last_week: "Ostatni tydzień" last_week: "Ostatni tydzień"
last_month: "Ostatni miesiąc" last_month: "Ostatni miesiąc"
custom: "Niestandardowy..." custom: "Niestandardowy..."
ai_persona: ai_agent:
ai_tools: "Narzędzia" ai_tools: "Narzędzia"
tool_strategies: tool_strategies:
all: "Zastosuj do wszystkich odpowiedzi" all: "Zastosuj do wszystkich odpowiedzi"
@ -254,20 +254,20 @@ pl_PL:
default_llm: Domyślny model językowy default_llm: Domyślny model językowy
default_llm_help: Domyślny model językowy używany dla tej persony. Wymagane, jeśli chcesz wspomnieć o osobie w postach publicznych. default_llm_help: Domyślny model językowy używany dla tej persony. Wymagane, jeśli chcesz wspomnieć o osobie w postach publicznych.
system_prompt: Prompt systemowy system_prompt: Prompt systemowy
allow_personal_messages: "Zezwalaj na wiadomości osobiste" allow_agentl_messages: "Zezwalaj na wiadomości osobiste"
allow_personal_messages_help: "Jeśli ta opcja jest włączona, użytkownicy w dozwolonych grupach mogą wysyłać osobiste wiadomości do tej persony." allow_agentl_messages_help: "Jeśli ta opcja jest włączona, użytkownicy w dozwolonych grupach mogą wysyłać osobiste wiadomości do tej persony."
allow_topic_mentions: "Zezwalaj na wzmianki o temacie" allow_topic_mentions: "Zezwalaj na wzmianki o temacie"
allow_topic_mentions_help: "Jeśli ta opcja jest włączona, użytkownicy w dozwolonych grupach mogą wspominać o tej personie w tematach." allow_topic_mentions_help: "Jeśli ta opcja jest włączona, użytkownicy w dozwolonych grupach mogą wspominać o tej personie w tematach."
force_default_llm: "Zawsze używaj domyślnego modelu języka" force_default_llm: "Zawsze używaj domyślnego modelu języka"
save: "Zapisz" save: "Zapisz"
saved: "Persona zapisana" saved: "Agent zapisana"
enabled: "Włączona?" enabled: "Włączona?"
tools: "Włączone narzędzia" tools: "Włączone narzędzia"
forced_tools: "Narzędzia wymuszone" forced_tools: "Narzędzia wymuszone"
allowed_groups: "Dozwolone grupy" allowed_groups: "Dozwolone grupy"
confirm_delete: "Czy na pewno chcesz usunąć tę personę?" confirm_delete: "Czy na pewno chcesz usunąć tę personę?"
new: "Nowa persona" new: "Nowa agent"
no_personas: "Nie utworzyłeś jeszcze żadnych person" no_agents: "Nie utworzyłeś jeszcze żadnych person"
title: "Persony" title: "Persony"
short_title: "Persony" short_title: "Persony"
delete: "Usuń" delete: "Usuń"
@ -306,7 +306,7 @@ pl_PL:
name_help: "Nazwa pojawi się w interfejsie użytkownika Discourse i będzie krótkim identyfikatorem, którego będziesz używać do znajdowania narzędzia w różnych ustawieniach. Powinna być ona unikatowa (jest wymagana)" name_help: "Nazwa pojawi się w interfejsie użytkownika Discourse i będzie krótkim identyfikatorem, którego będziesz używać do znajdowania narzędzia w różnych ustawieniach. Powinna być ona unikatowa (jest wymagana)"
new: "Nowe narzędzie" new: "Nowe narzędzie"
tool_name: "Nazwa narzędzia" tool_name: "Nazwa narzędzia"
tool_name_help: "Nazwa narzędzia jest prezentowana w dużym modelu językowym. Nie jest ona odrębna, ale jest odrębna dla każdej persony. (persona sprawdza poprawność przy zapisywaniu)" tool_name_help: "Nazwa narzędzia jest prezentowana w dużym modelu językowym. Nie jest ona odrębna, ale jest odrębna dla każdej persony. (agent sprawdza poprawność przy zapisywaniu)"
description: "Opis" description: "Opis"
description_help: "Jasny opis celu narzędzia dla modelu językowego" description_help: "Jasny opis celu narzędzia dla modelu językowego"
subheader_description: "Narzędzia rozszerzają możliwości botów AI o zdefiniowane przez użytkownika funkcje JavaScript." subheader_description: "Narzędzia rozszerzają możliwości botów AI o zdefiniowane przez użytkownika funkcje JavaScript."
@ -374,7 +374,7 @@ pl_PL:
usage: usage:
ai_bot: "Bot AI" ai_bot: "Bot AI"
ai_helper: "Pomocnik" ai_helper: "Pomocnik"
ai_persona: "Persona (%{persona})" ai_agent: "Agent (%{agent})"
ai_summarization: "Podsumuj" ai_summarization: "Podsumuj"
ai_embeddings_semantic_search: "Wyszukiwanie AI" ai_embeddings_semantic_search: "Wyszukiwanie AI"
ai_spam: "Spam" ai_spam: "Spam"
@ -505,7 +505,7 @@ pl_PL:
expand_view_label: "Rozszerz widok" expand_view_label: "Rozszerz widok"
collapse_view_label: "Wyjdź z trybu pełnoekranowego (przycisk ESC lub Wstecz)" collapse_view_label: "Wyjdź z trybu pełnoekranowego (przycisk ESC lub Wstecz)"
ai_bot: ai_bot:
persona: "Osobowość" agent: "Osobowość"
llm: "Model" llm: "Model"
pm_warning: "Wiadomości wysyłane przez chatboty AI są regularnie monitorowane przez moderatorów." pm_warning: "Wiadomości wysyłane przez chatboty AI są regularnie monitorowane przez moderatorów."
cancel_streaming: "Zatrzymaj odpowiedź" cancel_streaming: "Zatrzymaj odpowiedź"

View File

@ -55,8 +55,8 @@ pt:
total_requests: "Total de pedidos" total_requests: "Total de pedidos"
periods: periods:
last_day: "Últimas 24 horas" last_day: "Últimas 24 horas"
custom: "Personalizar..." custom: "Agentlizar..."
ai_persona: ai_agent:
back: "Retroceder" back: "Retroceder"
name: "Nome" name: "Nome"
edit: "Editar" edit: "Editar"
@ -99,7 +99,7 @@ pt:
six_hours: "6 horas" six_hours: "6 horas"
day: "24 horas" day: "24 horas"
week: "7 dias" week: "7 dias"
custom: "Personalizar..." custom: "Agentlizar..."
hours: "horas" hours: "horas"
usage: usage:
ai_summarization: "Resumir" ai_summarization: "Resumir"
@ -108,7 +108,7 @@ pt:
title: "Próximo" title: "Próximo"
providers: providers:
google: "Google" google: "Google"
fake: "Personalizar" fake: "Agentlizar"
ai_helper: ai_helper:
context_menu: context_menu:
cancel: "Cancelar" cancel: "Cancelar"
@ -133,7 +133,7 @@ pt:
display_name: "Nome" display_name: "Nome"
providers: providers:
google: "Google" google: "Google"
fake: "Personalizar" fake: "Agentlizar"
ai_bot: ai_bot:
debug_ai_modal: debug_ai_modal:
request: "Pedido" request: "Pedido"

View File

@ -12,7 +12,7 @@ pt_BR:
descriptions: descriptions:
discourse_ai: discourse_ai:
search: "Permite pesquisa com IA" search: "Permite pesquisa com IA"
stream_completion: "Permite transmissão de conclusão com persona de IA" stream_completion: "Permite transmissão de conclusão com agent de IA"
site_settings: site_settings:
categories: categories:
discourse_ai: "Discourse IA" discourse_ai: "Discourse IA"
@ -128,7 +128,7 @@ pt_BR:
flag_post: flag_post:
label: "Sinalizar postagem" label: "Sinalizar postagem"
description: "Sinaliza a postagem (como spam ou para revisão)" description: "Sinaliza a postagem (como spam ou para revisão)"
include_personal_messages: include_agentl_messages:
label: "Incluir mensagens pessoais" label: "Incluir mensagens pessoais"
description: "Também verificar e fazer triagem de mensagens pessoais" description: "Também verificar e fazer triagem de mensagens pessoais"
model: model:
@ -152,7 +152,7 @@ pt_BR:
short_title: "Spam" short_title: "Spam"
title: "Configurar tratamento de spam" title: "Configurar tratamento de spam"
select_llm: "Selecionar LLM" select_llm: "Selecionar LLM"
custom_instructions: "Instruções personalizadas" custom_instructions: "Instruções agentlizadas"
custom_instructions_help: "Instruções específicas para seu site para ajudar a orientar a IA na identificação de spam, por exemplo: \"Verificar com mais agressividade postagens que não estão em inglês\"." custom_instructions_help: "Instruções específicas para seu site para ajudar a orientar a IA na identificação de spam, por exemplo: \"Verificar com mais agressividade postagens que não estão em inglês\"."
last_seven_days: "Últimos sete dias" last_seven_days: "Últimos sete dias"
scanned_count: "Postagens verificadas" scanned_count: "Postagens verificadas"
@ -218,8 +218,8 @@ pt_BR:
last_day: "Últimas 24 horas" last_day: "Últimas 24 horas"
last_week: "Semana passada" last_week: "Semana passada"
last_month: "Mês passado" last_month: "Mês passado"
custom: "Personalizado..." custom: "Agentlizado..."
ai_persona: ai_agent:
ai_tools: "Ferramentas" ai_tools: "Ferramentas"
tool_strategies: tool_strategies:
all: "Aplicar a todas as respostas" all: "Aplicar a todas as respostas"
@ -243,47 +243,47 @@ pt_BR:
tool_details: Exibir detalhes da ferramenta tool_details: Exibir detalhes da ferramenta
tool_details_help: Serão exibidos aos(às) usuários(as) finais as ferramentas nas quais o modelo de linguagem foi acionado. tool_details_help: Serão exibidos aos(às) usuários(as) finais as ferramentas nas quais o modelo de linguagem foi acionado.
mentionable: Permitir menções mentionable: Permitir menções
mentionable_help: Ative para que os(as) usuários(as) nos grupos permitidos possam mencionar este(a) usuário(a) nas postagens. A IA responderá como esta persona. mentionable_help: Ative para que os(as) usuários(as) nos grupos permitidos possam mencionar este(a) usuário(a) nas postagens. A IA responderá como esta agent.
user: Usuário(a) user: Usuário(a)
create_user: Criar usuário(a) create_user: Criar usuário(a)
create_user_help: Como alternativa, você poderá anexar um(a) usuário(a) a esta persona. Se fizer isso, a IA usará este(a) usuário(a) para responder aos pedidos. create_user_help: Como alternativa, você poderá anexar um(a) usuário(a) a esta agent. Se fizer isso, a IA usará este(a) usuário(a) para responder aos pedidos.
default_llm: Modelo de linguagem padrão default_llm: Modelo de linguagem padrão
default_llm_help: O modelo de linguagem padrão a ser usado para esta persona. É obrigatório se você quiser mencionar a persona em postagens públicas. default_llm_help: O modelo de linguagem padrão a ser usado para esta agent. É obrigatório se você quiser mencionar a agent em postagens públicas.
question_consolidator_llm: Modelo de linguagem para consolidador de pergunta question_consolidator_llm: Modelo de linguagem para consolidador de pergunta
question_consolidator_llm_help: O modelo de linguagem a ser usado para o consolidador de pergunta. Para economizar, você pode escolher um modelo menos robusto. question_consolidator_llm_help: O modelo de linguagem a ser usado para o consolidador de pergunta. Para economizar, você pode escolher um modelo menos robusto.
system_prompt: Prompt do sistema system_prompt: Prompt do sistema
forced_tool_strategy: Estratégia de ferramenta forçada forced_tool_strategy: Estratégia de ferramenta forçada
allow_chat_direct_messages: "Permitir mensagens diretas do chat" allow_chat_direct_messages: "Permitir mensagens diretas do chat"
allow_chat_direct_messages_help: "Ative para que os(às) usuários(as) nos grupos permitidos possam enviar mensagens diretas a esta persona." allow_chat_direct_messages_help: "Ative para que os(às) usuários(as) nos grupos permitidos possam enviar mensagens diretas a esta agent."
allow_chat_channel_mentions: "Permitir menções no canal de chat" allow_chat_channel_mentions: "Permitir menções no canal de chat"
allow_chat_channel_mentions_help: "Ative para os(as) usuários(as) nos grupos permitidos poderem mencionar esta persona nos canais de chat" allow_chat_channel_mentions_help: "Ative para os(as) usuários(as) nos grupos permitidos poderem mencionar esta agent nos canais de chat"
allow_personal_messages: "Permitir mensagens pessoais" allow_agentl_messages: "Permitir mensagens pessoais"
allow_personal_messages_help: "Ative para que os(as) usuários(as) nos grupos permitidos possam enviar mensagens pessoais a esta persona." allow_agentl_messages_help: "Ative para que os(as) usuários(as) nos grupos permitidos possam enviar mensagens pessoais a esta agent."
allow_topic_mentions: "Permtir menções de tópicos" allow_topic_mentions: "Permtir menções de tópicos"
allow_topic_mentions_help: "Ative para os(as) usuários(as) nos grupos permitidos poderem mencionar esta persona nos tópicos." allow_topic_mentions_help: "Ative para os(as) usuários(as) nos grupos permitidos poderem mencionar esta agent nos tópicos."
force_default_llm: "Usar sempre o modelo de linguagem padrão" force_default_llm: "Usar sempre o modelo de linguagem padrão"
save: "Salvar" save: "Salvar"
saved: "Persona salva" saved: "Agent salva"
enabled: "Ativado(a)?" enabled: "Ativado(a)?"
tools: "Ferramentas ativadas" tools: "Ferramentas ativadas"
forced_tools: "Ferramentas forçadas" forced_tools: "Ferramentas forçadas"
allowed_groups: "Grupos permitidos" allowed_groups: "Grupos permitidos"
confirm_delete: "Você tem certeza de que deseja excluir esta persona?" confirm_delete: "Você tem certeza de que deseja excluir esta agent?"
new: "Nova persona" new: "Nova agent"
no_personas: "Você ainda não criou nenhuma persona" no_agents: "Você ainda não criou nenhuma agent"
title: "Personas" title: "Agents"
short_title: "Personas" short_title: "Agents"
delete: "Excluir" delete: "Excluir"
temperature: "Temperatura" temperature: "Temperatura"
temperature_help: "A Temperatura a ser usada para o LLM. Aumente para incrementar a criatividade (deixe vazio para usar o padrão do modelo, que geralmente é um valor que varia entre 0.0 e 2.0)" temperature_help: "A Temperatura a ser usada para o LLM. Aumente para incrementar a criatividade (deixe vazio para usar o padrão do modelo, que geralmente é um valor que varia entre 0.0 e 2.0)"
top_p: "P Máximo" top_p: "P Máximo"
top_p_help: "O P Máximo a ser usado para o LLM, aumente para incrementar o fator aleatório (deixe vazio para usar o padrão do modelo, que geralmente é um valor que varia entre 0.0 e 1.0)" top_p_help: "O P Máximo a ser usado para o LLM, aumente para incrementar o fator aleatório (deixe vazio para usar o padrão do modelo, que geralmente é um valor que varia entre 0.0 e 1.0)"
priority: "Prioridade" priority: "Prioridade"
priority_help: "Personas de prioridade são exibidas aos(às) usuários(as) no topo da lista de personas. Se várias personas tiverem prioridade, serão escolhidas em ordem alfabética." priority_help: "Agents de prioridade são exibidas aos(às) usuários(as) no topo da lista de agents. Se várias agents tiverem prioridade, serão escolhidas em ordem alfabética."
tool_options: "Opções de ferramenta" tool_options: "Opções de ferramenta"
rag_conversation_chunks: "Pesquisar pedaços de conversa" rag_conversation_chunks: "Pesquisar pedaços de conversa"
rag_conversation_chunks_help: "O número de pedaços a serem usados para pesquisas de modelo RAG. Aumente para incrementar a quantidade de contexto que a IA pode usar." rag_conversation_chunks_help: "O número de pedaços a serem usados para pesquisas de modelo RAG. Aumente para incrementar a quantidade de contexto que a IA pode usar."
persona_description: "Personas são um recurso poderoso que permite personalizar o comportamento da engine de IA no seu fórum do Discourse. Atuam como uma \"mensagem de sistema\" que orienta as respostas e as interações da IA, ajudando a criar uma experiência mais personzalidada e envolvente para o(a) usuário(a)." agent_description: "Agents são um recurso poderoso que permite agentlizar o comportamento da engine de IA no seu fórum do Discourse. Atuam como uma \"mensagem de sistema\" que orienta as respostas e as interações da IA, ajudando a criar uma experiência mais personzalidada e envolvente para o(a) usuário(a)."
response_format: response_format:
open_modal: "Editar" open_modal: "Editar"
modal: modal:
@ -369,14 +369,14 @@ pt_BR:
six_hours: "6 horas" six_hours: "6 horas"
day: "24 horas" day: "24 horas"
week: "Sete dias" week: "Sete dias"
custom: "Personalizado..." custom: "Agentlizado..."
hours: "horas" hours: "horas"
max_tokens_help: "Quantidade máxima de tokens (palavras e caracteres) que podem ser usados por cada usuário(a) neste grupo durante o período especificado. Tokens são unidades usadas para modelos de IA processarem texto: 1 token equivale a aproximadamente 4 caracteres ou 3/4 de uma palavra." max_tokens_help: "Quantidade máxima de tokens (palavras e caracteres) que podem ser usados por cada usuário(a) neste grupo durante o período especificado. Tokens são unidades usadas para modelos de IA processarem texto: 1 token equivale a aproximadamente 4 caracteres ou 3/4 de uma palavra."
max_usages_help: "A quantidade máxima de vezes que cada usuário(a) neste grupo pode usar o modelo de IA durante o período especificado. Essa cota é rastreada por cada usuário(a) individual e não é compartilhada no grupo." max_usages_help: "A quantidade máxima de vezes que cada usuário(a) neste grupo pode usar o modelo de IA durante o período especificado. Essa cota é rastreada por cada usuário(a) individual e não é compartilhada no grupo."
usage: usage:
ai_bot: "Bot de IA" ai_bot: "Bot de IA"
ai_helper: "Ajudante" ai_helper: "Ajudante"
ai_persona: "Persona (%{persona})" ai_agent: "Agent (%{agent})"
ai_summarization: "Resumir" ai_summarization: "Resumir"
ai_embeddings_semantic_search: "Pesquisa com IA" ai_embeddings_semantic_search: "Pesquisa com IA"
ai_spam: "Spam" ai_spam: "Spam"
@ -429,7 +429,7 @@ pt_BR:
samba_nova: "SambaNova" samba_nova: "SambaNova"
mistral: "Mistral" mistral: "Mistral"
open_router: "OpenRouter" open_router: "OpenRouter"
fake: "Personalizados(as)" fake: "Agentlizados(as)"
provider_fields: provider_fields:
access_key_id: "ID da chave de acesso do AWS Bedrock" access_key_id: "ID da chave de acesso do AWS Bedrock"
region: "Região do AWS Bedrock" region: "Região do AWS Bedrock"
@ -463,8 +463,8 @@ pt_BR:
discard: "Descartar" discard: "Descartar"
changes: "Edições sugeridas" changes: "Edições sugeridas"
custom_prompt: custom_prompt:
title: "Prompt personalizado" title: "Prompt agentlizado"
placeholder: "Insira um prompt personalizado..." placeholder: "Insira um prompt agentlizado..."
submit: "Enviar prompt" submit: "Enviar prompt"
translate_prompt: "Traduzir para %{language}" translate_prompt: "Traduzir para %{language}"
post_options_menu: post_options_menu:
@ -542,7 +542,7 @@ pt_BR:
google: "Google" google: "Google"
cloudflare: "Cloudflare" cloudflare: "Cloudflare"
CDCK: "CDCK" CDCK: "CDCK"
fake: "Personalizados(as)" fake: "Agentlizados(as)"
provider_fields: provider_fields:
model_name: "Nome do modelo" model_name: "Nome do modelo"
semantic_search: "Tópicos (semântica)" semantic_search: "Tópicos (semântica)"

View File

@ -57,8 +57,8 @@ ro:
total_requests: "Total cereri" total_requests: "Total cereri"
periods: periods:
last_day: "Ultimele 24 de ore" last_day: "Ultimele 24 de ore"
custom: "Personalizat..." custom: "Agentlizat..."
ai_persona: ai_agent:
back: "Înapoi" back: "Înapoi"
name: "Nume" name: "Nume"
edit: "Modifică" edit: "Modifică"
@ -96,7 +96,7 @@ ro:
hour: "o oră" hour: "o oră"
six_hours: "6 de ore" six_hours: "6 de ore"
day: "24 de ore" day: "24 de ore"
custom: "Personalizat..." custom: "Agentlizat..."
hours: "de ore" hours: "de ore"
usage: usage:
ai_summarization: "Rezumat" ai_summarization: "Rezumat"
@ -107,7 +107,7 @@ ro:
success: "Succes!" success: "Succes!"
providers: providers:
google: "Google" google: "Google"
fake: "Personalizat" fake: "Agentlizat"
ai_helper: ai_helper:
context_menu: context_menu:
cancel: "Anulare" cancel: "Anulare"
@ -133,7 +133,7 @@ ro:
display_name: "Nume" display_name: "Nume"
providers: providers:
google: "Google" google: "Google"
fake: "Personalizat" fake: "Agentlizat"
ai_bot: ai_bot:
debug_ai_modal: debug_ai_modal:
request: "Cere" request: "Cere"

View File

@ -128,7 +128,7 @@ ru:
flag_post: flag_post:
label: "Пометить публикацию" label: "Пометить публикацию"
description: "Пометить публикацию (как спам или для отправки на проверку)" description: "Пометить публикацию (как спам или для отправки на проверку)"
include_personal_messages: include_agentl_messages:
label: "Включать личные сообщения" label: "Включать личные сообщения"
description: "Также сканировать и выполнять триаж личных сообщений" description: "Также сканировать и выполнять триаж личных сообщений"
model: model:
@ -219,7 +219,7 @@ ru:
last_week: "На прошлой неделе" last_week: "На прошлой неделе"
last_month: "В прошлом месяце" last_month: "В прошлом месяце"
custom: "Другое…" custom: "Другое…"
ai_persona: ai_agent:
ai_tools: "Инструменты" ai_tools: "Инструменты"
tool_strategies: tool_strategies:
all: "Применить ко всем ответам" all: "Применить ко всем ответам"
@ -259,8 +259,8 @@ ru:
allow_chat_direct_messages_help: "Если параметр включен, пользователи в разрешенных группах смогут отправлять прямые сообщения этой персоне." allow_chat_direct_messages_help: "Если параметр включен, пользователи в разрешенных группах смогут отправлять прямые сообщения этой персоне."
allow_chat_channel_mentions: "Разрешить упоминания в каналах чата" allow_chat_channel_mentions: "Разрешить упоминания в каналах чата"
allow_chat_channel_mentions_help: "Если параметр включен, пользователи в разрешенных группах смогут упоминать эту персону в каналах чата." allow_chat_channel_mentions_help: "Если параметр включен, пользователи в разрешенных группах смогут упоминать эту персону в каналах чата."
allow_personal_messages: "Разрешить личные сообщения" allow_agentl_messages: "Разрешить личные сообщения"
allow_personal_messages_help: "Если параметр включен, пользователи в разрешенных группах смогут отправлять личные сообщения этой персоне." allow_agentl_messages_help: "Если параметр включен, пользователи в разрешенных группах смогут отправлять личные сообщения этой персоне."
allow_topic_mentions: "Разрешить упоминания в темах" allow_topic_mentions: "Разрешить упоминания в темах"
allow_topic_mentions_help: "Если параметр включен, пользователи в разрешенных группах смогут упоминать эту персону в темах." allow_topic_mentions_help: "Если параметр включен, пользователи в разрешенных группах смогут упоминать эту персону в темах."
force_default_llm: "Всегда использовать языковую модель по умолчанию" force_default_llm: "Всегда использовать языковую модель по умолчанию"
@ -272,7 +272,7 @@ ru:
allowed_groups: "Разрешённые группы" allowed_groups: "Разрешённые группы"
confirm_delete: "Точно удалить эту персону?" confirm_delete: "Точно удалить эту персону?"
new: "Новая персона" new: "Новая персона"
no_personas: "Вы еще не создали ни одной персоны" no_agents: "Вы еще не создали ни одной персоны"
title: "Персоны" title: "Персоны"
short_title: "Персоны" short_title: "Персоны"
delete: "Удалить" delete: "Удалить"
@ -285,7 +285,7 @@ ru:
tool_options: "Параметры инструмента" tool_options: "Параметры инструмента"
rag_conversation_chunks: "Фрагменты разговора для поиска" rag_conversation_chunks: "Фрагменты разговора для поиска"
rag_conversation_chunks_help: "Количество фрагментов для поиска в модели RAG. Увеличьте это значение, чтобы увеличить объем контекста, который может использовать AI." rag_conversation_chunks_help: "Количество фрагментов для поиска в модели RAG. Увеличьте это значение, чтобы увеличить объем контекста, который может использовать AI."
persona_description: "Персоны — полезная функция, с помощью которой вы можете настроить поведение движка AI на вашем форуме Discourse. Они действуют как «системное сообщение», задающее направление для ответов AI и обеспечивающее более персонализированное взаимодействие с пользователями." agent_description: "Персоны — полезная функция, с помощью которой вы можете настроить поведение движка AI на вашем форуме Discourse. Они действуют как «системное сообщение», задающее направление для ответов AI и обеспечивающее более персонализированное взаимодействие с пользователями."
response_format: response_format:
open_modal: "Изменить" open_modal: "Изменить"
modal: modal:
@ -378,7 +378,7 @@ ru:
usage: usage:
ai_bot: "AI-бот" ai_bot: "AI-бот"
ai_helper: "Помощник" ai_helper: "Помощник"
ai_persona: "Персона (%{persona})" ai_agent: "Персона (%{agent})"
ai_summarization: "Сводка" ai_summarization: "Сводка"
ai_embeddings_semantic_search: "AI-поиск" ai_embeddings_semantic_search: "AI-поиск"
ai_spam: "Спам" ai_spam: "Спам"

View File

@ -61,7 +61,7 @@ sk:
periods: periods:
last_day: "Posledných 24 hodín" last_day: "Posledných 24 hodín"
custom: "Vlastné..." custom: "Vlastné..."
ai_persona: ai_agent:
back: "Späť" back: "Späť"
name: "Meno" name: "Meno"
edit: "Upraviť" edit: "Upraviť"

View File

@ -55,7 +55,7 @@ sl:
periods: periods:
last_day: "Zadnjih 24 ur" last_day: "Zadnjih 24 ur"
custom: "Po meri..." custom: "Po meri..."
ai_persona: ai_agent:
back: "Nazaj" back: "Nazaj"
name: "Ime" name: "Ime"
edit: "Uredi" edit: "Uredi"

View File

@ -52,7 +52,7 @@ sq:
summary: "Përmbledhja" summary: "Përmbledhja"
username: "Emri i përdoruesit" username: "Emri i përdoruesit"
total_requests: "Total requests" total_requests: "Total requests"
ai_persona: ai_agent:
back: "Kthehu mbrapa" back: "Kthehu mbrapa"
name: "Emri" name: "Emri"
edit: "Redakto" edit: "Redakto"

Some files were not shown because too many files have changed in this diff Show More