use std::ops::Deref;
use langfuse_core::types::{ObservationType, UsageDetails};
use super::attributes;
use super::span::LangfuseSpan;
pub struct LangfuseEmbedding {
span: LangfuseSpan,
}
impl std::fmt::Debug for LangfuseEmbedding {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("LangfuseEmbedding")
.field("trace_id", &self.span.trace_id())
.field("span_id", &self.span.span_id())
.finish()
}
}
impl Clone for LangfuseEmbedding {
fn clone(&self) -> Self {
Self {
span: self.span.clone(),
}
}
}
impl LangfuseEmbedding {
#[must_use]
pub fn start(name: &str) -> Self {
use opentelemetry::trace::{TraceContextExt, Tracer};
let tracer = opentelemetry::global::tracer("langfuse");
let otel_span = tracer.start(name.to_owned());
let context = opentelemetry::Context::current().with_span(otel_span);
let span = LangfuseSpan::from_context(context);
if let Ok(serde_json::Value::String(s)) = serde_json::to_value(ObservationType::Embedding) {
span.set_string_attribute(attributes::LANGFUSE_OBSERVATION_TYPE, &s);
}
Self { span }
}
pub(crate) fn from_span(span: LangfuseSpan) -> Self {
Self { span }
}
pub fn set_model(&self, model: &str) -> &Self {
self.span
.set_string_attribute(attributes::LANGFUSE_MODEL, model);
self
}
pub fn set_usage(&self, usage: &UsageDetails) -> &Self {
self.span
.set_json_attribute(attributes::LANGFUSE_USAGE, usage);
self
}
}
impl Deref for LangfuseEmbedding {
type Target = LangfuseSpan;
fn deref(&self) -> &Self::Target {
&self.span
}
}