Class: Jekyll::ClientSearch::QueryEmbedderConfiguration

Inherits:
Object
  • Object
show all
Defined in:
lib/jekyll/client_search/query_embedder_configuration.rb

Overview

Normalizes browser query-embedder settings.

Constant Summary collapse

TYPES =
%w[transformers ollama_api none].freeze
MODEL_MAP =
{
  "embeddinggemma:300m" => "onnx-community/embeddinggemma-300m-ONNX",
  "all-minilm" => "Xenova/all-MiniLM-L6-v2"
}.freeze
DEFAULT_LIBRARY_URL =
"https://cdn.jsdelivr.net/npm/@huggingface/transformers@3.8.1"
DEFAULTS =
{
  "type" => "transformers",
  "library_url" => DEFAULT_LIBRARY_URL,
  "dtype" => "q8",
  "worker" => true,
  "timeout_ms" => 300_000,
  "retry_attempts" => 1,
  "max_tokens" => 512
}.freeze
JSON_KEYS =
{
  "library_url" => "libraryUrl",
  "model_base_url" => "modelBaseUrl",
  "wasm_base_url" => "wasmBaseUrl",
  "worker_url" => "workerUrl",
  "device" => "device",
  "dtype" => "dtype",
  "worker" => "worker",
  "timeout_ms" => "timeoutMs",
  "retry_attempts" => "retryAttempts",
  "max_tokens" => "maxTokens"
}.freeze

Instance Method Summary collapse

Constructor Details

#initialize(config, build_model:, build_base_url:, query_prefix:) ⇒ QueryEmbedderConfiguration

Returns a new instance of QueryEmbedderConfiguration.



39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/jekyll/client_search/query_embedder_configuration.rb', line 39

def initialize(config, build_model:, build_base_url:, query_prefix:)
  unless config.is_a?(Hash)
    raise Jekyll::Errors::FatalException,
          "client_search embedding.query_embedder configuration must be a mapping"
  end

  @values = DEFAULTS.merge(config)
  @values["timeout_ms"] = 30_000 if @values["type"] == "ollama_api" && !config.key?("timeout_ms")
  @build_model = build_model
  @build_base_url = build_base_url
  @query_prefix = query_prefix
  validate!
end

Instance Method Details

#api_urlObject



66
67
68
# File 'lib/jekyll/client_search/query_embedder_configuration.rb', line 66

def api_url
  @values.fetch("api_url", "#{@build_base_url}/api/embed")
end

#assetObject



83
84
85
# File 'lib/jekyll/client_search/query_embedder_configuration.rb', line 83

def asset
  assets.first
end

#assetsObject



70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/jekyll/client_search/query_embedder_configuration.rb', line 70

def assets
  case type
  when "transformers"
    files = ["assets/query-embedders/transformers.js"]
    files << "assets/query-embedders/transformers-worker.js" if @values["worker"]
    files
  when "ollama_api"
    ["assets/query-embedders/ollama-api.js"]
  else
    []
  end
end

#modelObject

Raises:

  • (Jekyll::Errors::FatalException)


57
58
59
60
61
62
63
64
# File 'lib/jekyll/client_search/query_embedder_configuration.rb', line 57

def model
  return @values.fetch("model") if @values.key?("model")
  return @build_model unless type == "transformers"
  return MODEL_MAP.fetch(@build_model) if MODEL_MAP.key?(@build_model)

  raise Jekyll::Errors::FatalException,
        "embedding query_embedder.model is required for #{@build_model.inspect}"
end

#to_jsonObject



87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/jekyll/client_search/query_embedder_configuration.rb', line 87

def to_json(*)
  config = {
    "type" => type,
    "model" => model,
    "apiUrl" => api_url,
    "buildModel" => @build_model,
    "queryPrefix" => @query_prefix
  }
  JSON_KEYS.each do |source, target|
    config[target] = @values[source] if @values.key?(source)
  end
  config.to_json
end

#typeObject



53
54
55
# File 'lib/jekyll/client_search/query_embedder_configuration.rb', line 53

def type
  @values.fetch("type")
end