otel_genai_bridge/lib.rs
1//! Translate LLM telemetry attributes between OpenInference and the
2//! OpenTelemetry GenAI semantic conventions.
3//!
4//! Two specs in flight:
5//!
6//! - **OpenInference** — Arize's instrumentation lib. Names like
7//! `llm.model_name`, `llm.token_count.prompt`.
8//! - **OpenTelemetry GenAI semantic conventions** — the upcoming standard.
9//! Names like `gen_ai.request.model`, `gen_ai.usage.input_tokens`.
10//!
11//! Phoenix wants OTel GenAI ([Arize-ai/phoenix#10622](https://github.com/Arize-ai/phoenix/issues/10622)),
12//! Traceloop wants the new keys ([traceloop/openllmetry#3515](https://github.com/traceloop/openllmetry/issues/3515)),
13//! but most existing instrumentation emits OpenInference. Until backends
14//! converge, you ingest one and may want to read or emit the other.
15//! `otel-genai-bridge` is the smallest possible primitive that translates.
16//!
17//! # Quick start
18//!
19//! ```
20//! use otel_genai_bridge::{to_otel_genai, to_openinference};
21//! use serde_json::{json, Value};
22//! use std::collections::HashMap;
23//!
24//! let mut openinference: HashMap<String, Value> = HashMap::new();
25//! openinference.insert("llm.model_name".into(), json!("claude-sonnet-4"));
26//! openinference.insert("llm.token_count.prompt".into(), json!(1234));
27//! openinference.insert("llm.token_count.completion".into(), json!(56));
28//!
29//! let otel = to_otel_genai(&openinference);
30//! assert_eq!(otel.get("gen_ai.request.model").unwrap(), &json!("claude-sonnet-4"));
31//! assert_eq!(otel.get("gen_ai.usage.input_tokens").unwrap(), &json!(1234));
32//! assert_eq!(otel.get("gen_ai.usage.output_tokens").unwrap(), &json!(56));
33//!
34//! // Round-trip back to OpenInference:
35//! let back = to_openinference(&otel);
36//! assert_eq!(back.get("llm.model_name").unwrap(), &json!("claude-sonnet-4"));
37//! ```
38#![forbid(unsafe_code)]
39#![warn(missing_docs)]
40#![warn(rust_2018_idioms)]
41
42mod bridge;
43
44pub use crate::bridge::{
45 known_mappings, to_openinference, to_otel_genai, OPENINFERENCE_TO_OTEL, OTEL_TO_OPENINFERENCE,
46};