use serde::{Deserialize, Serialize};
use crate::json::JsonValue;
use crate::shared::{ProviderMetadata, Warning};
use crate::shared::FileData;
use super::content::{Source, ToolApprovalRequest, ToolResult};
use super::finish_reason::FinishReason;
use super::prompt::{FilePart, ToolCallPart};
use super::result::ResponseMetadata;
use super::usage::Usage;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type", rename_all = "kebab-case")]
pub enum StreamPart {
TextStart {
id: String,
#[serde(
default,
rename = "providerMetadata",
skip_serializing_if = "Option::is_none"
)]
provider_metadata: Option<ProviderMetadata>,
},
TextDelta {
id: String,
delta: String,
#[serde(
default,
rename = "providerMetadata",
skip_serializing_if = "Option::is_none"
)]
provider_metadata: Option<ProviderMetadata>,
},
TextEnd {
id: String,
#[serde(
default,
rename = "providerMetadata",
skip_serializing_if = "Option::is_none"
)]
provider_metadata: Option<ProviderMetadata>,
},
ReasoningStart {
id: String,
#[serde(
default,
rename = "providerMetadata",
skip_serializing_if = "Option::is_none"
)]
provider_metadata: Option<ProviderMetadata>,
},
ReasoningDelta {
id: String,
delta: String,
#[serde(
default,
rename = "providerMetadata",
skip_serializing_if = "Option::is_none"
)]
provider_metadata: Option<ProviderMetadata>,
},
ReasoningEnd {
id: String,
#[serde(
default,
rename = "providerMetadata",
skip_serializing_if = "Option::is_none"
)]
provider_metadata: Option<ProviderMetadata>,
},
ToolInputStart {
id: String,
#[serde(rename = "toolName")]
tool_name: String,
#[serde(
default,
rename = "providerExecuted",
skip_serializing_if = "Option::is_none"
)]
provider_executed: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
dynamic: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
title: Option<String>,
#[serde(
default,
rename = "providerMetadata",
skip_serializing_if = "Option::is_none"
)]
provider_metadata: Option<ProviderMetadata>,
},
ToolInputDelta {
id: String,
delta: String,
#[serde(
default,
rename = "providerMetadata",
skip_serializing_if = "Option::is_none"
)]
provider_metadata: Option<ProviderMetadata>,
},
ToolInputEnd {
id: String,
#[serde(
default,
rename = "providerMetadata",
skip_serializing_if = "Option::is_none"
)]
provider_metadata: Option<ProviderMetadata>,
},
ToolApprovalRequest(ToolApprovalRequest),
ToolCall(ToolCallPart),
ToolResult(ToolResult),
Custom {
kind: String,
#[serde(
default,
rename = "providerMetadata",
skip_serializing_if = "Option::is_none"
)]
provider_metadata: Option<ProviderMetadata>,
},
Source(Source),
File(FilePart),
ReasoningFile {
data: FileData,
#[serde(rename = "mediaType")]
media_type: String,
#[serde(
default,
rename = "providerMetadata",
skip_serializing_if = "Option::is_none"
)]
provider_metadata: Option<ProviderMetadata>,
},
StreamStart {
warnings: Vec<Warning>,
},
ResponseMetadata(ResponseMetadata),
Finish {
usage: Usage,
#[serde(rename = "finishReason")]
finish_reason: FinishReason,
#[serde(
default,
rename = "providerMetadata",
skip_serializing_if = "Option::is_none"
)]
provider_metadata: Option<ProviderMetadata>,
},
Raw {
#[serde(rename = "rawValue")]
raw_value: JsonValue,
},
Error {
error: JsonValue,
},
}