Module: OpenTelemetry::Instrumentation::RubyLLM::Patches::Embedding

Defined in:
lib/opentelemetry/instrumentation/ruby_llm/patches/embedding.rb

Instance Method Summary collapse

Instance Method Details

#embed(text, model: nil, provider: nil, assume_model_exists: false, context: nil, dimensions: nil) ⇒ Object



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/opentelemetry/instrumentation/ruby_llm/patches/embedding.rb', line 8

def embed(text, model: nil, provider: nil, assume_model_exists: false, context: nil, dimensions: nil)
  config = context&.config || ::RubyLLM.config
  resolved_model = model || config.default_embedding_model
  model_obj, _provider_instance = ::RubyLLM::Models.resolve(
    resolved_model, provider: provider, assume_exists: assume_model_exists, config: config
  )
  model_id = model_obj.id
  provider_name = model_obj.provider || "unknown"

  attributes = {
    "gen_ai.operation.name" => "embeddings",
    "gen_ai.provider.name" => provider_name,
    "gen_ai.request.model" => model_id
  }

  tracer.in_span("embeddings #{model_id}", attributes: attributes, kind: OpenTelemetry::Trace::SpanKind::CLIENT) do |span|
    begin
      result = super
    rescue => e
      span.record_exception(e)
      span.status = OpenTelemetry::Trace::Status.error(e.message)
      span.set_attribute("error.type", e.class.name)
      raise
    end

    span.set_attribute("gen_ai.response.model", result.model) if result.model
    span.set_attribute("gen_ai.usage.input_tokens", result.input_tokens) if result.input_tokens&.positive?

    if result.vectors.is_a?(Array)
      first = result.vectors.first
      vector = first.is_a?(Array) ? first : result.vectors
      span.set_attribute("gen_ai.embeddings.dimension.count", vector.length) if vector.is_a?(Array)
    end

    result
  end
end