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
|