@@ -55,7 +55,6 @@ def bulk_classify!(relation)
5555
5656 available_classifiers = classifiers
5757 return if available_classifiers . blank?
58- base_url = Discourse . base_url
5958
6059 promised_classifications =
6160 relation
@@ -70,12 +69,14 @@ def bulk_classify!(relation)
7069 already_classified = w_text [ :target ] . sentiment_classifications . map ( &:model_used )
7170
7271 classifiers_for_target =
73- available_classifiers . reject { |ac | already_classified . include? ( ac . model_name ) }
72+ available_classifiers . reject do |ac |
73+ already_classified . include? ( ac [ :model_name ] )
74+ end
7475
7576 promised_target_results =
76- classifiers_for_target . map do |c |
77+ classifiers_for_target . map do |cft |
7778 Concurrent ::Promises . future_on ( pool ) do
78- results [ c . model_name ] = request_with ( w_text [ :text ] , c , base_url )
79+ results [ cft [ : model_name] ] = request_with ( cft [ :client ] , w_text [ :text ] )
7980 end
8081 end
8182
@@ -98,26 +99,40 @@ def bulk_classify!(relation)
9899
99100 def classify! ( target )
100101 return if target . blank?
101- return if classifiers . blank?
102+ available_classifiers = classifiers
103+ return if available_classifiers . blank?
102104
103105 to_classify = prepare_text ( target )
104106 return if to_classify . blank?
105107
106108 already_classified = target . sentiment_classifications . map ( &:model_used )
107109 classifiers_for_target =
108- classifiers . reject { |ac | already_classified . include? ( ac . model_name ) }
110+ available_classifiers . reject { |ac | already_classified . include? ( ac [ : model_name] ) }
109111
110112 results =
111- classifiers_for_target . reduce ( { } ) do |memo , model |
112- memo [ model . model_name ] = request_with ( to_classify , model )
113+ classifiers_for_target . reduce ( { } ) do |memo , cft |
114+ memo [ cft [ : model_name] ] = request_with ( cft [ :client ] , to_classify )
113115 memo
114116 end
115117
116118 store_classification ( target , results )
117119 end
118120
119121 def classifiers
120- DiscourseAi ::Sentiment ::SentimentSiteSettingJsonSchema . values
122+ DiscourseAi ::Sentiment ::SentimentSiteSettingJsonSchema . values . map do |config |
123+ api_endpoint = config . endpoint
124+
125+ if api_endpoint . present? && api_endpoint . start_with? ( "srv://" )
126+ service = DiscourseAi ::Utils ::DnsSrv . lookup ( api_endpoint . delete_prefix ( "srv://" ) )
127+ api_endpoint = "https://#{ service . target } :#{ service . port } "
128+ end
129+
130+ {
131+ model_name : config . model_name ,
132+ client :
133+ DiscourseAi ::Inference ::HuggingFaceTextEmbeddings . new ( api_endpoint , config . api_key ) ,
134+ }
135+ end
121136 end
122137
123138 def has_classifiers?
@@ -137,9 +152,9 @@ def prepare_text(target)
137152 Tokenizer ::BertTokenizer . truncate ( content , 512 )
138153 end
139154
140- def request_with ( content , config , base_url = Discourse . base_url )
141- result =
142- DiscourseAi :: Inference :: HuggingFaceTextEmbeddings . classify ( content , config , base_url )
155+ def request_with ( client , content )
156+ result = client . classify_by_sentiment! ( content )
157+
143158 transform_result ( result )
144159 end
145160
0 commit comments