| 
									
										
										
										
											2023-06-13 14:32:26 -03:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module DiscourseAi | 
					
						
							|  |  |  |   module Summarization | 
					
						
							| 
									
										
										
										
											2023-06-27 12:26:33 -03:00
										 |  |  |     module Models | 
					
						
							|  |  |  |       class Discourse < Base | 
					
						
							| 
									
										
										
										
											2023-06-13 14:32:26 -03:00
										 |  |  |         def display_name | 
					
						
							|  |  |  |           "Discourse AI's #{model}" | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def correctly_configured? | 
					
						
							|  |  |  |           SiteSetting.ai_summarization_discourse_service_api_endpoint.present? && | 
					
						
							|  |  |  |             SiteSetting.ai_summarization_discourse_service_api_key.present? | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def configuration_hint | 
					
						
							|  |  |  |           I18n.t( | 
					
						
							|  |  |  |             "discourse_ai.summarization.configuration_hint", | 
					
						
							|  |  |  |             count: 2, | 
					
						
							|  |  |  |             settings: | 
					
						
							|  |  |  |               "ai_summarization_discourse_service_api_endpoint, ai_summarization_discourse_service_api_key", | 
					
						
							|  |  |  |           ) | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-27 12:26:33 -03:00
										 |  |  |         def concatenate_summaries(summaries) | 
					
						
							|  |  |  |           completion(summaries.join("\n")) | 
					
						
							| 
									
										
										
										
											2023-06-13 14:32:26 -03:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-27 12:26:33 -03:00
										 |  |  |         def summarize_with_truncation(contents, opts) | 
					
						
							|  |  |  |           text_to_summarize = contents.map { |c| format_content_item(c) }.join | 
					
						
							|  |  |  |           truncated_content = | 
					
						
							| 
									
										
										
										
											2023-07-13 17:05:41 -03:00
										 |  |  |             ::DiscourseAi::Tokenizer::BertTokenizer.truncate(text_to_summarize, available_tokens) | 
					
						
							| 
									
										
										
										
											2023-06-27 12:26:33 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  |           completion(truncated_content) | 
					
						
							| 
									
										
										
										
											2023-06-13 14:32:26 -03:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-13 17:05:41 -03:00
										 |  |  |         def summarize_single(chunk_text, _opts) | 
					
						
							|  |  |  |           completion(chunk_text) | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-13 14:32:26 -03:00
										 |  |  |         private | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-27 12:26:33 -03:00
										 |  |  |         def summarize_chunk(chunk_text, _opts) | 
					
						
							|  |  |  |           completion(chunk_text) | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def reserved_tokens | 
					
						
							|  |  |  |           0
 | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def completion(prompt) | 
					
						
							|  |  |  |           ::DiscourseAi::Inference::DiscourseClassifier.perform!( | 
					
						
							|  |  |  |             "#{SiteSetting.ai_summarization_discourse_service_api_endpoint}/api/v1/classify", | 
					
						
							|  |  |  |             model, | 
					
						
							|  |  |  |             prompt, | 
					
						
							|  |  |  |             SiteSetting.ai_summarization_discourse_service_api_key, | 
					
						
							|  |  |  |           ).dig(:summary_text) | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2023-06-13 14:32:26 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-27 12:26:33 -03:00
										 |  |  |         def tokenizer | 
					
						
							|  |  |  |           DiscourseAi::Tokenizer::BertTokenizer | 
					
						
							| 
									
										
										
										
											2023-06-13 14:32:26 -03:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |