gproxy_protocol/protocol/openai/generate_content/response_items/
message.rs1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize, de};
4use serde_json::Value;
5
6use super::super::super::common::*;
7use super::{ResponseEasyInputContent, ResponseInputContentPart, ResponseMessageOutputContentPart};
8
9#[derive(Debug, Clone, PartialEq, Serialize)]
10#[serde(untagged)]
11#[non_exhaustive]
12pub enum ResponseMessageItem {
13 Output(ResponseOutputMessageItem),
14 Input(ResponseInputMessageItem),
15 EasyInput(ResponseEasyInputMessageItem),
16}
17
18impl<'de> Deserialize<'de> for ResponseMessageItem {
19 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
20 where
21 D: serde::Deserializer<'de>,
22 {
23 let value = Value::deserialize(deserializer)?;
24 let role = value.get("role").and_then(Value::as_str);
25 let has_id = value.get("id").is_some();
26 let has_status = value.get("status").is_some();
27
28 if role == Some("assistant") && has_id && has_status {
29 return serde_json::from_value(value)
30 .map(Self::Output)
31 .map_err(de::Error::custom);
32 }
33
34 if has_id || has_status {
35 return serde_json::from_value(value)
36 .map(Self::Input)
37 .map_err(de::Error::custom);
38 }
39
40 serde_json::from_value(value)
41 .map(Self::EasyInput)
42 .map_err(de::Error::custom)
43 }
44}
45
46#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
47#[non_exhaustive]
48pub struct ResponseOutputMessageItem {
49 #[serde(rename = "type")]
50 pub type_: ResponseMessageItemType,
51 pub id: String,
52 pub role: ResponseOutputMessageRole,
53 pub content: Vec<ResponseMessageOutputContentPart>,
54 pub status: ResponseItemLifecycleStatus,
55 #[serde(skip_serializing_if = "Option::is_none")]
56 pub phase: Option<ResponsePhase>,
57 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
58 pub extra: Extra,
59}
60
61#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
62#[non_exhaustive]
63pub struct ResponseInputMessageItem {
64 #[serde(skip_serializing_if = "Option::is_none")]
65 pub id: Option<String>,
66 #[serde(rename = "type", skip_serializing_if = "Option::is_none")]
67 pub type_: Option<ResponseMessageItemType>,
68 pub role: ResponseInputMessageRole,
69 pub content: Vec<ResponseInputContentPart>,
70 #[serde(skip_serializing_if = "Option::is_none")]
71 pub status: Option<ResponseItemLifecycleStatus>,
72 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
73 pub extra: Extra,
74}
75
76#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
77#[non_exhaustive]
78pub struct ResponseEasyInputMessageItem {
79 #[serde(rename = "type", skip_serializing_if = "Option::is_none")]
80 pub type_: Option<ResponseMessageItemType>,
81 pub role: ResponseEasyInputMessageRole,
82 pub content: ResponseEasyInputContent,
83 #[serde(skip_serializing_if = "Option::is_none")]
84 pub phase: Option<ResponsePhase>,
85 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
86 pub extra: Extra,
87}
88
89#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
90#[non_exhaustive]
91pub enum ResponseMessageItemType {
92 #[serde(rename = "message")]
93 Message,
94}
95
96#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
97#[non_exhaustive]
98pub enum ResponseOutputMessageRole {
99 #[serde(rename = "assistant")]
100 Assistant,
101}
102
103#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
104#[non_exhaustive]
105pub enum ResponseInputMessageRole {
106 #[serde(rename = "user")]
107 User,
108 #[serde(rename = "system")]
109 System,
110 #[serde(rename = "developer")]
111 Developer,
112}
113
114#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
115#[non_exhaustive]
116pub enum ResponseEasyInputMessageRole {
117 #[serde(rename = "user")]
118 User,
119 #[serde(rename = "assistant")]
120 Assistant,
121 #[serde(rename = "system")]
122 System,
123 #[serde(rename = "developer")]
124 Developer,
125}
126
127#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
128#[non_exhaustive]
129pub struct ResponseAgent {
130 pub agent_name: String,
131 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
132 pub extra: Extra,
133}
134
135#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
136#[serde(tag = "type")]
137#[non_exhaustive]
138pub enum ResponseCaller {
139 #[serde(rename = "direct")]
140 Direct {
141 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
142 extra: Extra,
143 },
144 #[serde(rename = "program")]
145 Program {
146 caller_id: String,
147 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
148 extra: Extra,
149 },
150}