# frozen_string_literal: true module DiscourseAi module Embeddings module VectorRepresentations class TextEmbedding3Large < Base class << self def name "text-embedding-3-large" end def correctly_configured? SiteSetting.ai_openai_api_key.present? end def dependant_setting_names %w[ai_openai_api_key] end end def id 7 end def version 1 end def dimensions # real dimentions are 3072, but we only support up to 2000 in the # indexes, so we downsample to 2000 via API 2000 end def max_sequence_length 8191 end def pg_function "<=>" end def pg_index_type "halfvec_cosine_ops" end def vector_from(text, asymetric: false) response = DiscourseAi::Inference::OpenAiEmbeddings.perform!( text, model: self.class.name, dimensions: dimensions, ) response[:data].first[:embedding] end def tokenizer DiscourseAi::Tokenizer::OpenAiTokenizer end end end end end