use std::collections::HashMap;
use liteforge::{AsyncForgeClient, ChatCompletionRequest, Message, OtelConfig, ForgeConfig};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut otel_headers = HashMap::new();
if let Ok(token) = std::env::var("DYNATRACE_API_TOKEN") {
otel_headers.insert("Authorization".to_string(), format!("Api-Token {}", token));
}
let otel = OtelConfig {
endpoint: std::env::var("OTEL_EXPORTER_OTLP_ENDPOINT")
.ok()
.or_else(|| Some("http://localhost:4318/v1/traces".to_string())),
headers: otel_headers,
service_name: Some("liteforge-example".to_string()),
resource_attributes: HashMap::from([(
"deployment.environment".to_string(),
"local".to_string(),
)]),
capture_prompts: false,
};
liteforge::init_otel(&otel)?;
println!(
"otel feature enabled at compile time = {}",
liteforge::otel_feature_enabled()
);
let mut sticky = HashMap::new();
sticky.insert("app".to_string(), serde_json::json!("btsales"));
sticky.insert("deployment_env".to_string(), serde_json::json!("local"));
let config = ForgeConfig::builder()
.default_metadata(sticky)
.otel(otel)
.build();
let client = AsyncForgeClient::with_config(config);
let mut per_request = HashMap::new();
per_request.insert("session_id".to_string(), serde_json::json!("session-001"));
per_request.insert("user_eid".to_string(), serde_json::json!("EXAMPLE"));
per_request.insert("purpose".to_string(), serde_json::json!("agent"));
let request = ChatCompletionRequest::new(
std::env::var("LITEFORGE_DEFAULT_MODEL")
.unwrap_or_else(|_| "claude-haiku-4.5".to_string()),
vec![Message::user("Reply with the single word 'pong'")],
)
.max_tokens(8)
.metadata(per_request);
let response = client.chat_completions(request).await?;
println!(
"response: {:?}",
response.choices.first().map(|c| &c.message)
);
println!(
"tokens: input={} output={} total={}",
response
.usage
.as_ref()
.map(|u| u.prompt_tokens)
.unwrap_or(0),
response
.usage
.as_ref()
.map(|u| u.completion_tokens)
.unwrap_or(0),
response.usage.as_ref().map(|u| u.total_tokens).unwrap_or(0),
);
tokio::time::sleep(std::time::Duration::from_secs(2)).await;
Ok(())
}