Skip to main content

gproxy_protocol/protocol/openai/generate_content/response_items/
message.rs

1use 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}