Skip to main content

gproxy_protocol/aws/converse/
response.rs

1use 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    /// `upstream_docs/aws/docs/Converse.md`, `additionalModelResponseFields`:
18    /// model-specific response fields documented as a JSON value.
19    #[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}