use serde::{Deserialize, Serialize};
#[cfg(feature = "openapi")]
use utoipa::ToSchema;
use crate::typed_id::{MessageId, TurnId};
use crate::user_facing_error::{UserFacingError, UserFacingErrorFields};
use super::*;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
pub struct InputMessageData {
pub message: Message,
}
impl InputMessageData {
pub fn new(message: Message) -> Self {
Self { message }
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
pub struct OutputMessageStartedData {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub reasoning_state: Option<everruns_provider::reasoning_updates::ReasoningState>,
#[cfg_attr(feature = "openapi", schema(value_type = String, example = "turn_01933b5a00007000800000000000001"))]
pub turn_id: TurnId,
#[cfg_attr(feature = "openapi", schema(value_type = String, example = "message_550e8400e29b41d4a716446655440000"))]
pub message_id: MessageId,
#[serde(skip_serializing_if = "Option::is_none")]
pub model: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub iteration: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub phase: Option<ExecutionPhase>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
pub struct OutputMessageDeltaData {
#[cfg_attr(feature = "openapi", schema(value_type = String, example = "turn_01933b5a00007000800000000000001"))]
pub turn_id: TurnId,
#[cfg_attr(feature = "openapi", schema(value_type = String, example = "message_550e8400e29b41d4a716446655440000"))]
pub message_id: MessageId,
pub delta: String,
pub accumulated: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub phase: Option<ExecutionPhase>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
pub struct OutputMessageCompletedData {
pub message: Message,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<ModelMetadata>,
#[serde(skip_serializing_if = "Option::is_none")]
pub usage: Option<TokenUsage>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub error_code: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
#[cfg_attr(feature = "openapi", schema(value_type = Option<Object>))]
pub error_fields: Option<UserFacingErrorFields>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub error_disclosure: Option<String>,
}
impl OutputMessageCompletedData {
pub fn new(message: Message) -> Self {
Self {
message,
metadata: None,
usage: None,
error_code: None,
error_fields: None,
error_disclosure: None,
}
}
pub fn with_metadata(mut self, metadata: ModelMetadata) -> Self {
self.metadata = Some(metadata);
self
}
pub fn with_usage(mut self, usage: TokenUsage) -> Self {
self.usage = Some(usage);
self
}
pub fn with_user_facing_error(mut self, error: &UserFacingError) -> Self {
error.apply_to_event_fields(&mut self.error_code, &mut self.error_fields);
self
}
pub fn with_error_disclosure(mut self, mode: crate::ErrorDisclosure) -> Self {
self.error_disclosure = Some(mode.as_str().to_string());
self
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
pub struct OutputMessageReplacedData {
#[cfg_attr(feature = "openapi", schema(value_type = String, example = "turn_01933b5a00007000800000000000001"))]
pub turn_id: TurnId,
#[cfg_attr(feature = "openapi", schema(value_type = String, example = "message_550e8400e29b41d4a716446655440000"))]
pub message_id: MessageId,
pub guardrail_capability_id: String,
pub guardrail_id: String,
pub reason_code: String,
pub replacement: String,
}