@@ -11,6 +11,13 @@ def show
1111
1212 def update
1313 initial_settings = AiModerationSetting . spam
14+
15+ initial_data = {
16+ custom_instructions : initial_settings &.data &.dig ( "custom_instructions" ) ,
17+ llm_model_id : initial_settings &.llm_model_id ,
18+ ai_persona_id : initial_settings &.ai_persona_id ,
19+ }
20+
1421 initial_custom_instructions = initial_settings &.data &.dig ( "custom_instructions" )
1522 initial_llm_model_id = initial_settings &.llm_model_id
1623
@@ -29,6 +36,22 @@ def update
2936 )
3037 end
3138 end
39+
40+ if allowed_params . key? ( :ai_persona_id )
41+ updated_params [ :ai_persona_id ] = allowed_params [ :ai_persona_id ]
42+ persona = AiPersona . find_by ( id : allowed_params [ :ai_persona_id ] )
43+ if persona . nil? ||
44+ persona . response_format . to_a . none? { |rf |
45+ rf [ "key" ] == "spam" && rf [ "type" ] == "boolean"
46+ }
47+ return (
48+ render_json_error (
49+ I18n . t ( "discourse_ai.llm.configuration.invalid_persona_response_format" ) ,
50+ status : 422 ,
51+ )
52+ )
53+ end
54+ end
3255 updated_params [ :data ] = {
3356 custom_instructions : allowed_params [ :custom_instructions ] ,
3457 } if allowed_params . key? ( :custom_instructions )
@@ -41,7 +64,7 @@ def update
4164 AiModerationSetting . create! ( updated_params . merge ( setting_type : :spam ) )
4265 end
4366
44- log_ai_spam_update ( initial_llm_model_id , initial_custom_instructions , allowed_params )
67+ log_ai_spam_update ( initial_data , allowed_params )
4568 end
4669
4770 is_enabled = ActiveModel ::Type ::Boolean . new . cast ( allowed_params [ :is_enabled ] )
@@ -119,9 +142,10 @@ def fix_errors
119142
120143 private
121144
122- def log_ai_spam_update ( initial_llm_model_id , initial_custom_instructions , params )
145+ def log_ai_spam_update ( initial_data , params )
123146 changes_to_log = { }
124147
148+ initial_llm_model_id = initial_data [ :llm_model_id ]
125149 if params . key? ( :llm_model_id ) && initial_llm_model_id . to_s != params [ :llm_model_id ] . to_s
126150 old_model_name =
127151 LlmModel . find_by ( id : initial_llm_model_id ) &.display_name || initial_llm_model_id
@@ -131,11 +155,22 @@ def log_ai_spam_update(initial_llm_model_id, initial_custom_instructions, params
131155 changes_to_log [ :llm_model_id ] = "#{ old_model_name } → #{ new_model_name } "
132156 end
133157
158+ initial_custom_instructions = initial_data [ :custom_instructions ]
134159 if params . key? ( :custom_instructions ) &&
135160 initial_custom_instructions != params [ :custom_instructions ]
136161 changes_to_log [ :custom_instructions ] = params [ :custom_instructions ]
137162 end
138163
164+ initial_ai_persona_id = initial_data [ :ai_persona_id ]
165+ if params . key? ( :ai_persona_id ) && initial_ai_persona_id . to_s != params [ :ai_persona_id ] . to_s
166+ old_persona_name =
167+ AiPersona . find_by ( id : initial_ai_persona_id ) &.name || initial_ai_persona_id
168+ new_persona_name =
169+ AiPersona . find_by ( id : params [ :ai_persona_id ] ) &.name || params [ :ai_persona_id ]
170+
171+ changes_to_log [ :ai_persona_id ] = "#{ old_persona_name } → #{ new_persona_name } "
172+ end
173+
139174 if changes_to_log . present?
140175 changes_to_log [ :subject ] = I18n . t ( "discourse_ai.spam_detection.logging_subject" )
141176 logger = DiscourseAi ::Utils ::AiStaffActionLogger . new ( current_user )
@@ -144,7 +179,7 @@ def log_ai_spam_update(initial_llm_model_id, initial_custom_instructions, params
144179 end
145180
146181 def allowed_params
147- params . permit ( :is_enabled , :llm_model_id , :custom_instructions )
182+ params . permit ( :is_enabled , :llm_model_id , :custom_instructions , :ai_persona_id )
148183 end
149184
150185 def spam_config
0 commit comments