use serde_json::Value;
pub const RUNTIME_BACKEND: &str = "runtime_backend";
pub const PROVIDER_SESSION_ID: &str = "provider_session_id";
pub const PROVIDER_TURN_ID: &str = "provider_turn_id";
pub const PROVIDER_ITEM_ID: &str = "provider_item_id";
pub const PROVIDER_SUBAGENT_ID: &str = "provider_subagent_id";
pub const PROVIDER_TRACE_URL: &str = "provider_trace_url";
pub const PROVIDER_CORRELATION_KEYS: [&str; 6] = [
RUNTIME_BACKEND,
PROVIDER_SESSION_ID,
PROVIDER_TURN_ID,
PROVIDER_ITEM_ID,
PROVIDER_SUBAGENT_ID,
PROVIDER_TRACE_URL,
];
pub fn provider_correlation(metadata: Option<&Value>) -> Vec<(&'static str, String)> {
let Some(metadata) = metadata else {
return Vec::new();
};
PROVIDER_CORRELATION_KEYS
.iter()
.filter_map(|key| {
let value = metadata.get(*key)?.as_str()?;
(!value.is_empty()).then(|| (*key, value.to_string()))
})
.collect()
}
#[cfg(test)]
mod tests {
use super::*;
use serde_json::json;
#[test]
fn only_present_string_ids_are_correlated() {
let metadata = json!({
"runtime_backend": "openai_agents_api",
"provider_session_id": "sess_1",
"provider_turn_id": null,
"provider_item_id": "",
"unrelated": "x",
});
assert_eq!(
provider_correlation(Some(&metadata)),
vec![
(RUNTIME_BACKEND, "openai_agents_api".to_string()),
(PROVIDER_SESSION_ID, "sess_1".to_string()),
]
);
assert!(provider_correlation(None).is_empty());
}
}