discourse/plugins/discourse-ai/app/controllers/discourse_ai/discover/discoveries_controller.rb
Sam e3fae646d4
DEV: AI persona to agent migration (#38319)
Co-authored-by: Keegan George <kgeorge13@gmail.com>
2026-03-10 15:59:45 +11:00

82 lines
2.5 KiB
Ruby
Vendored

# frozen_string_literal: true
module DiscourseAi
module Discover
class DiscoveriesController < ::ApplicationController
include AiCreditLimitHandler
requires_plugin PLUGIN_NAME
requires_login
before_action :check_permissions
def reply
if ai_discover_agent.default_llm_id.blank? && SiteSetting.ai_default_llm_model.blank?
render_json_error "Discover agent is missing a default LLM model.", status: 503
return
end
query = params[:query]
raise Discourse::InvalidParameters.new("Missing query to discover") if query.blank?
RateLimiter.new(current_user, "ai_discover_#{current_user.id}", 8, 1.minute).performed!
Jobs.enqueue(:stream_discover_reply, user_id: current_user.id, query: query)
render json: {}, status: :ok
end
def continue_convo
raise Discourse::InvalidParameters.new("query") if !params[:query]
raise Discourse::InvalidParameters.new("context") if !params[:context]
bot_user_id = ai_discover_agent.user_id
bot_username = User.find_by(id: bot_user_id).username
RateLimiter.new(
current_user,
"ai_discover_#{current_user.id}_continue_convo",
3,
1.minute,
).performed!
query = params[:query]
context = "[quote]\n#{params[:context]}\n[/quote]"
post =
PostCreator.create!(
current_user,
title:
I18n.t("discourse_ai.ai_bot.discoveries.continue_conversation.title", query: query),
raw:
I18n.t(
"discourse_ai.ai_bot.discoveries.continue_conversation.raw",
query: query,
context: context,
),
archetype: Archetype.private_message,
target_usernames: bot_username,
skip_validations: true,
)
render json: success_json.merge(topic_id: post.topic_id)
rescue StandardError => e
render json: failed_json.merge(errors: [e.message]), status: :unprocessable_entity
end
private
def ai_discover_agent
@discover_agent ||= AiAgent.find_by_id_from_cache(SiteSetting.ai_discover_agent)
end
def check_permissions
if ai_discover_agent.nil? || current_user.nil? ||
!current_user.in_any_groups?(ai_discover_agent.allowed_group_ids.to_a)
raise Discourse::InvalidAccess.new
end
raise Discourse::InvalidAccess if guardian.is_silenced?
end
end
end
end