a2ui_base/protocol/
client_to_server.rs1use std::collections::HashMap;
6
7use serde::{Deserialize, Serialize};
8
9#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
15pub struct ClientMessage {
16 pub version: String,
17 #[serde(flatten)]
18 pub payload: ClientPayload,
19}
20
21#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
23#[serde(untagged)]
24pub enum ClientPayload {
25 Action(ActionPayload),
26 FunctionResponse(FunctionResponsePayload),
27 Error(ErrorPayload),
28}
29
30#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
35pub struct ActionPayload {
36 pub action: ActionData,
37}
38
39#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
40#[serde(rename_all = "camelCase")]
41pub struct ActionData {
42 pub name: String,
43 pub surface_id: String,
44 pub source_component_id: String,
45 pub timestamp: String,
46 pub context: HashMap<String, serde_json::Value>,
47 #[serde(default, skip_serializing_if = "Option::is_none")]
48 pub want_response: Option<bool>,
49 #[serde(default, skip_serializing_if = "Option::is_none")]
50 pub action_id: Option<String>,
51}
52
53#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
58pub struct FunctionResponsePayload {
59 pub function_response: FunctionResponseData,
60}
61
62#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
63pub struct FunctionResponseData {
64 pub function_call_id: String,
65 pub call: String,
66 pub value: serde_json::Value,
67}
68
69#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
74pub struct ErrorPayload {
75 pub error: ErrorData,
76}
77
78#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
79pub struct ErrorData {
80 pub code: String,
81 pub message: String,
82 #[serde(default, skip_serializing_if = "Option::is_none")]
83 pub surface_id: Option<String>,
84 #[serde(default, skip_serializing_if = "Option::is_none")]
85 pub function_call_id: Option<String>,
86}