adk_server/a2a/
events.rs

1use crate::a2a::{metadata::to_a2a_meta_key, parts, Message, Role};
2use adk_core::{Content, Event, EventActions, Result};
3use serde_json::{Map, Value};
4
5pub fn event_to_message(event: &Event) -> Result<Message> {
6    let role = if event.author == "user" { Role::User } else { Role::Agent };
7
8    let content = event
9        .llm_response
10        .content
11        .as_ref()
12        .ok_or_else(|| adk_core::AdkError::Agent("Event has no content".to_string()))?;
13
14    let a2a_parts = parts::adk_parts_to_a2a(&content.parts, &[])?;
15
16    let mut metadata = Map::new();
17    if event.actions.escalate {
18        metadata.insert(to_a2a_meta_key("escalate"), Value::Bool(true));
19    }
20    if let Some(agent) = &event.actions.transfer_to_agent {
21        metadata.insert(to_a2a_meta_key("transfer_to_agent"), Value::String(agent.clone()));
22    }
23
24    Ok(Message::builder()
25        .role(role)
26        .parts(a2a_parts)
27        .message_id(event.invocation_id.clone())
28        .metadata(if metadata.is_empty() { None } else { Some(metadata) })
29        .build())
30}
31
32pub fn message_to_event(message: &Message, invocation_id: String) -> Result<Event> {
33    let adk_parts = parts::a2a_parts_to_adk(&message.parts)?;
34
35    let mut actions = EventActions::default();
36    if let Some(meta) = &message.metadata {
37        if let Some(Value::Bool(true)) = meta.get(&to_a2a_meta_key("escalate")) {
38            actions.escalate = true;
39        }
40        if let Some(Value::String(agent)) = meta.get(&to_a2a_meta_key("transfer_to_agent")) {
41            actions.transfer_to_agent = Some(agent.clone());
42        }
43    }
44
45    let author = match message.role {
46        Role::User => "user".to_string(),
47        Role::Agent => "agent".to_string(),
48    };
49
50    let mut event = Event::new(invocation_id);
51    event.author = author;
52    event.llm_response.content = Some(Content { role: "user".to_string(), parts: adk_parts });
53    event.actions = actions;
54    Ok(event)
55}
56
57#[cfg(test)]
58mod tests {
59    use super::*;
60
61    #[test]
62    fn test_message_to_event() {
63        let message = Message::builder()
64            .role(Role::User)
65            .parts(vec![crate::a2a::Part::text("Hello".to_string())])
66            .message_id("msg-123".to_string())
67            .build();
68
69        let event = message_to_event(&message, "inv-123".to_string()).unwrap();
70        assert_eq!(event.invocation_id, "inv-123");
71        assert_eq!(event.author, "user");
72    }
73}