113 lines
3.2 KiB
Ruby
113 lines
3.2 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module DiscourseAi
|
|
module Admin
|
|
class AiSpamController < ::Admin::AdminController
|
|
requires_plugin "discourse-ai"
|
|
|
|
def show
|
|
render json: AiSpamSerializer.new(spam_config, root: false)
|
|
end
|
|
|
|
def update
|
|
updated_params = {}
|
|
if allowed_params.key?(:llm_model_id)
|
|
llm_model_id = updated_params[:llm_model_id] = allowed_params[:llm_model_id]
|
|
if llm_model_id.to_i < 0 &&
|
|
!SiteSetting.ai_spam_detection_model_allowed_seeded_models_map.include?(
|
|
"custom:#{llm_model_id}",
|
|
)
|
|
return(
|
|
render_json_error(
|
|
I18n.t("discourse_ai.llm.configuration.invalid_seeded_model"),
|
|
status: 422,
|
|
)
|
|
)
|
|
end
|
|
end
|
|
updated_params[:data] = {
|
|
custom_instructions: allowed_params[:custom_instructions],
|
|
} if allowed_params.key?(:custom_instructions)
|
|
|
|
if updated_params.present?
|
|
# not using upsert cause we will not get the correct validation errors
|
|
if AiModerationSetting.spam
|
|
AiModerationSetting.spam.update!(updated_params)
|
|
else
|
|
AiModerationSetting.create!(updated_params.merge(setting_type: :spam))
|
|
end
|
|
end
|
|
|
|
is_enabled = ActiveModel::Type::Boolean.new.cast(allowed_params[:is_enabled])
|
|
|
|
if allowed_params.key?(:is_enabled)
|
|
if is_enabled && !AiModerationSetting.spam&.llm_model_id
|
|
return(
|
|
render_json_error(
|
|
I18n.t("discourse_ai.llm.configuration.must_select_model"),
|
|
status: 422,
|
|
)
|
|
)
|
|
end
|
|
|
|
SiteSetting.ai_spam_detection_enabled = is_enabled
|
|
end
|
|
|
|
render json: AiSpamSerializer.new(spam_config, root: false)
|
|
end
|
|
|
|
def test
|
|
url = params[:post_url].to_s
|
|
post = nil
|
|
|
|
if url.match?(/^\d+$/)
|
|
post_id = url.to_i
|
|
post = Post.find_by(id: post_id)
|
|
end
|
|
|
|
route = UrlHelper.rails_route_from_url(url) if !post
|
|
|
|
if route
|
|
if route[:controller] == "topics"
|
|
post_number = route[:post_number] || 1
|
|
post = Post.with_deleted.find_by(post_number: post_number, topic_id: route[:topic_id])
|
|
end
|
|
end
|
|
|
|
raise Discourse::NotFound if !post
|
|
|
|
result =
|
|
DiscourseAi::AiModeration::SpamScanner.test_post(
|
|
post,
|
|
custom_instructions: params[:custom_instructions],
|
|
llm_id: params[:llm_id],
|
|
)
|
|
|
|
render json: result
|
|
end
|
|
|
|
private
|
|
|
|
def allowed_params
|
|
params.permit(:is_enabled, :llm_model_id, :custom_instructions)
|
|
end
|
|
|
|
def spam_config
|
|
spam_config = {
|
|
enabled: SiteSetting.ai_spam_detection_enabled,
|
|
settings: AiModerationSetting.spam,
|
|
}
|
|
|
|
spam_config[:stats] = DiscourseAi::AiModeration::SpamReport.generate(min_date: 1.week.ago)
|
|
|
|
if spam_config[:stats].scanned_count > 0
|
|
spam_config[
|
|
:flagging_username
|
|
] = DiscourseAi::AiModeration::SpamScanner.flagging_user&.username
|
|
end
|
|
spam_config
|
|
end
|
|
end
|
|
end
|
|
end
|