gproxy_protocol/aws/converse/
response.rs1use serde::{Deserialize, Serialize};
2use serde_json::Value;
3
4use crate::aws::{CacheTtl, Rest, StopReason};
5
6use super::{ConverseTrace, Message, PerformanceConfiguration, ServiceTier};
7
8#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
9#[serde(rename_all = "camelCase")]
10#[derive(gproxy_protocol_macros::WireBuilder)]
11#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
12pub struct ConverseResponse {
13 pub output: ConverseOutput,
14 pub stop_reason: StopReason,
15 pub usage: TokenUsage,
16 pub metrics: ConverseMetrics,
17 #[serde(skip_serializing_if = "Option::is_none")]
20 pub additional_model_response_fields: Option<Value>,
21 #[serde(skip_serializing_if = "Option::is_none")]
22 pub performance_config: Option<PerformanceConfiguration>,
23 #[serde(skip_serializing_if = "Option::is_none")]
24 pub service_tier: Option<ServiceTier>,
25 #[serde(skip_serializing_if = "Option::is_none")]
26 pub trace: Option<ConverseTrace>,
27 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
28 pub rest: Rest,
29}
30
31#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
32#[serde(untagged)]
33#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
34pub enum ConverseOutput {
35 Message {
36 message: Message,
37 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
38 rest: Rest,
39 },
40 Raw(Value),
41}
42
43#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
44#[serde(rename_all = "camelCase")]
45#[derive(gproxy_protocol_macros::WireBuilder)]
46#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
47pub struct TokenUsage {
48 pub input_tokens: u64,
49 pub output_tokens: u64,
50 pub total_tokens: u64,
51 #[serde(skip_serializing_if = "Option::is_none")]
52 pub cache_read_input_tokens: Option<u64>,
53 #[serde(skip_serializing_if = "Option::is_none")]
54 pub cache_write_input_tokens: Option<u64>,
55 #[serde(skip_serializing_if = "Option::is_none")]
56 pub cache_details: Option<Vec<CacheDetail>>,
57 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
58 pub rest: Rest,
59}
60
61#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
62#[serde(rename_all = "camelCase")]
63#[derive(gproxy_protocol_macros::WireBuilder)]
64#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
65pub struct CacheDetail {
66 pub input_tokens: u64,
67 pub ttl: CacheTtl,
68 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
69 pub rest: Rest,
70}
71
72#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
73#[serde(rename_all = "camelCase")]
74#[derive(gproxy_protocol_macros::WireBuilder)]
75#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
76pub struct ConverseMetrics {
77 pub latency_ms: u64,
78 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
79 pub rest: Rest,
80}