use crate::error::Result;
use crate::models::run::RunType;
use crate::tracing::tracer::Tracer;
use crate::utils::serialization::{ensure_inputs_object, ensure_outputs_object};
use serde::Serialize;
use std::future::Future;
pub async fn trace_node<F, Fut, I, O>(
name: &str,
run_type: RunType,
inputs: I,
f: F,
) -> Result<O>
where
F: FnOnce(I) -> Fut,
Fut: Future<Output = Result<O>>,
I: Serialize,
O: Serialize,
{
if !crate::config::Config::is_tracing_enabled() {
return f(inputs).await;
}
let inputs_value = ensure_inputs_object(&inputs)
.map_err(|e| crate::error::LangSmithError::Serialization(e))?;
let mut tracer = Tracer::new(name, run_type, inputs_value);
if let Err(e) = tracer.post().await {
eprintln!("LangSmith tracing error (post): {}", e);
}
match f(inputs).await {
Ok(output) => {
let output_value = ensure_outputs_object(&output)
.map_err(|e| crate::error::LangSmithError::Serialization(e))?;
tracer.end(output_value);
if let Err(e) = tracer.patch().await {
eprintln!("LangSmith tracing error (patch): {}", e);
}
Ok(output)
}
Err(e) => {
tracer.set_error(&e.to_string());
if let Err(trace_err) = tracer.patch().await {
eprintln!("LangSmith tracing error (patch): {}", trace_err);
}
Err(e)
}
}
}
pub fn trace_node_sync<F, I, O>(
name: &str,
run_type: RunType,
inputs: I,
f: F,
) -> Result<O>
where
F: FnOnce(I) -> Result<O>,
I: Serialize,
O: Serialize,
{
if !crate::config::Config::is_tracing_enabled() {
return f(inputs);
}
let inputs_value = ensure_inputs_object(&inputs)
.map_err(|e| crate::error::LangSmithError::Serialization(e))?;
let mut tracer = Tracer::new(name, run_type, inputs_value);
let rt = tokio::runtime::Runtime::new().unwrap();
if let Err(e) = rt.block_on(tracer.post()) {
eprintln!("LangSmith tracing error (post): {}", e);
}
match f(inputs) {
Ok(output) => {
let output_value = ensure_outputs_object(&output)
.map_err(|e| crate::error::LangSmithError::Serialization(e))?;
tracer.end(output_value);
if let Err(e) = rt.block_on(tracer.patch()) {
eprintln!("LangSmith tracing error (patch): {}", e);
}
Ok(output)
}
Err(e) => {
tracer.set_error(&e.to_string());
if let Err(trace_err) = rt.block_on(tracer.patch()) {
eprintln!("LangSmith tracing error (patch): {}", trace_err);
}
Err(e)
}
}
}