use serde::{Deserialize, Serialize};
use serde_json::Value;
use crate::aws::{CacheTtl, Rest, StopReason};
use super::{ConverseTrace, Message, PerformanceConfiguration, ServiceTier};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[derive(gproxy_protocol_macros::WireBuilder)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
pub struct ConverseResponse {
pub output: ConverseOutput,
pub stop_reason: StopReason,
pub usage: TokenUsage,
pub metrics: ConverseMetrics,
#[serde(skip_serializing_if = "Option::is_none")]
pub additional_model_response_fields: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub performance_config: Option<PerformanceConfiguration>,
#[serde(skip_serializing_if = "Option::is_none")]
pub service_tier: Option<ServiceTier>,
#[serde(skip_serializing_if = "Option::is_none")]
pub trace: Option<ConverseTrace>,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
pub enum ConverseOutput {
Message {
message: Message,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
rest: Rest,
},
Raw(Value),
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[derive(gproxy_protocol_macros::WireBuilder)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
pub struct TokenUsage {
pub input_tokens: u64,
pub output_tokens: u64,
pub total_tokens: u64,
#[serde(skip_serializing_if = "Option::is_none")]
pub cache_read_input_tokens: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cache_write_input_tokens: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cache_details: Option<Vec<CacheDetail>>,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[derive(gproxy_protocol_macros::WireBuilder)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
pub struct CacheDetail {
pub input_tokens: u64,
pub ttl: CacheTtl,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[derive(gproxy_protocol_macros::WireBuilder)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
pub struct ConverseMetrics {
pub latency_ms: u64,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}