adk_server/a2a/
metadata.rs1use serde_json::Value;
2use std::collections::HashMap;
3
4pub const META_PREFIX: &str = "adk_";
5
6#[derive(Debug, Clone)]
7pub struct InvocationMeta {
8 pub user_id: String,
9 pub session_id: String,
10 pub event_meta: HashMap<String, Value>,
11}
12
13pub fn to_a2a_meta_key(key: &str) -> String {
14 format!("{}{}", META_PREFIX, key)
15}
16
17pub fn to_invocation_meta(
18 app_name: &str,
19 context_id: &str,
20 user_id: Option<&str>,
21) -> InvocationMeta {
22 let user_id =
23 user_id.map(|s| s.to_string()).unwrap_or_else(|| format!("A2A_USER_{}", context_id));
24 let session_id = context_id.to_string();
25
26 let mut event_meta = HashMap::new();
27 event_meta.insert(to_a2a_meta_key("app_name"), Value::String(app_name.to_string()));
28 event_meta.insert(to_a2a_meta_key("user_id"), Value::String(user_id.clone()));
29 event_meta.insert(to_a2a_meta_key("session_id"), Value::String(session_id.clone()));
30
31 InvocationMeta { user_id, session_id, event_meta }
32}
33
34pub fn to_event_meta(meta: &InvocationMeta, event: &adk_core::Event) -> HashMap<String, Value> {
35 let mut result = meta.event_meta.clone();
36
37 result.insert(to_a2a_meta_key("invocation_id"), Value::String(event.invocation_id.clone()));
38 result.insert(to_a2a_meta_key("author"), Value::String(event.author.clone()));
39 if !event.branch.is_empty() {
40 result.insert(to_a2a_meta_key("branch"), Value::String(event.branch.clone()));
41 }
42
43 result
44}
45
46pub fn set_actions_meta(
47 mut meta: HashMap<String, Value>,
48 actions: &adk_core::EventActions,
49) -> HashMap<String, Value> {
50 if actions.escalate {
51 meta.insert(to_a2a_meta_key("escalate"), Value::Bool(true));
52 }
53 if let Some(agent) = &actions.transfer_to_agent {
54 meta.insert(to_a2a_meta_key("transfer_to_agent"), Value::String(agent.clone()));
55 }
56 meta
57}