48 lines
1.4 KiB
Ruby
48 lines
1.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module ::DiscourseAi
|
|
module Inference
|
|
class DiscourseClassifier
|
|
def initialize(endpoint, api_key, model, referer = Discourse.base_url)
|
|
@endpoint = endpoint
|
|
@api_key = api_key
|
|
@model = model
|
|
@referer = referer
|
|
end
|
|
|
|
def self.instance(model)
|
|
endpoint =
|
|
if SiteSetting.ai_embeddings_discourse_service_api_endpoint_srv.present?
|
|
service =
|
|
DiscourseAi::Utils::DnsSrv.lookup(
|
|
SiteSetting.ai_embeddings_discourse_service_api_endpoint_srv,
|
|
)
|
|
"https://#{service.target}:#{service.port}"
|
|
else
|
|
SiteSetting.ai_embeddings_discourse_service_api_endpoint
|
|
end
|
|
|
|
new(
|
|
"#{endpoint}/api/v1/classify",
|
|
SiteSetting.ai_embeddings_discourse_service_api_key,
|
|
model,
|
|
)
|
|
end
|
|
|
|
attr_reader :endpoint, :api_key, :model, :referer
|
|
|
|
def perform!(content)
|
|
headers = { "Referer" => referer, "Content-Type" => "application/json" }
|
|
headers["X-API-KEY"] = api_key if api_key.present?
|
|
|
|
conn = Faraday.new { |f| f.adapter FinalDestination::FaradayAdapter }
|
|
response = conn.post(endpoint, { model: model, content: content }.to_json, headers)
|
|
|
|
raise Net::HTTPBadResponse if ![200, 415].include?(response.status)
|
|
|
|
JSON.parse(response.body, symbolize_names: true)
|
|
end
|
|
end
|
|
end
|
|
end
|