use allama::mock::MockProvider;
use allama::prelude::*;
use allama::wrappers::TracingProvider;
use opentelemetry::trace::TracerProvider as _;
use opentelemetry_sdk::trace::{InMemorySpanExporter, SdkTracerProvider};
use tracing_subscriber::layer::SubscriberExt as _;
use tracing_subscriber::util::SubscriberInitExt as _;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let exporter = InMemorySpanExporter::default();
let tracer_provider = SdkTracerProvider::builder()
.with_simple_exporter(exporter.clone())
.build();
let layer = tracing_opentelemetry::layer()
.with_tracer(tracer_provider.tracer("my-app"))
.with_location(false)
.with_threads(false)
.with_target(false)
.with_tracked_inactivity(false);
tracing_subscriber::registry().with(layer).init();
let provider = TracingProvider::new(MockProvider::with_text("Hello from a traced call."));
let request = ChatRequest::new("demo-model").user("Say hello");
let response = provider.chat(&request).await?;
println!("{}", response.text_or_empty());
tracer_provider.force_flush()?;
let spans = exporter.get_finished_spans()?;
let chat = spans
.iter()
.find(|span| span.name == "chat demo-model")
.ok_or_else(|| anyhow::anyhow!("no `chat demo-model` span was exported"))?;
println!("exported span `{}` ({:?})", chat.name, chat.span_kind);
for attribute in &chat.attributes {
println!(" {} = {}", attribute.key, attribute.value);
}
tracer_provider.shutdown()?;
Ok(())
}