use serde::{Deserialize, Serialize};
use crate::json::JsonValue;
use crate::shared::{FileData, ProviderMetadata, ProviderOptions};
use super::prompt::{FilePart, TextPart};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type", rename_all = "kebab-case")]
pub enum Content {
Text(TextPart),
Reasoning(ReasoningPart),
Custom {
kind: String,
#[serde(
default,
rename = "providerOptions",
skip_serializing_if = "Option::is_none"
)]
provider_options: Option<ProviderOptions>,
},
ReasoningFile {
data: FileData,
#[serde(rename = "mediaType")]
media_type: String,
#[serde(
default,
rename = "providerOptions",
skip_serializing_if = "Option::is_none"
)]
provider_options: Option<ProviderOptions>,
},
File(FilePart),
ToolApprovalRequest(ToolApprovalRequest),
Source(Source),
ToolCall(super::prompt::ToolCallPart),
ToolResult(ToolResult),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ReasoningPart {
pub text: String,
#[serde(
default,
rename = "providerOptions",
skip_serializing_if = "Option::is_none"
)]
pub provider_options: Option<ProviderOptions>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "sourceType", rename_all = "kebab-case")]
pub enum Source {
Url {
id: String,
url: String,
#[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>,
},
Document {
id: String,
#[serde(rename = "mediaType")]
media_type: String,
title: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
filename: Option<String>,
#[serde(
default,
rename = "providerMetadata",
skip_serializing_if = "Option::is_none"
)]
provider_metadata: Option<ProviderMetadata>,
},
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ToolApprovalRequest {
#[serde(rename = "approvalId")]
pub approval_id: String,
#[serde(rename = "toolCall")]
pub tool_call: super::prompt::ToolCallPart,
#[serde(
default,
rename = "providerMetadata",
skip_serializing_if = "Option::is_none"
)]
pub provider_metadata: Option<ProviderMetadata>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ToolResult {
#[serde(rename = "toolCallId")]
pub tool_call_id: String,
#[serde(rename = "toolName")]
pub tool_name: String,
pub output: ToolResultOutput,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub preliminary: Option<bool>,
#[serde(
default,
rename = "providerMetadata",
skip_serializing_if = "Option::is_none"
)]
pub provider_metadata: Option<ProviderMetadata>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type", rename_all = "kebab-case")]
pub enum ToolResultOutput {
Text {
value: String,
#[serde(
default,
rename = "providerOptions",
skip_serializing_if = "Option::is_none"
)]
provider_options: Option<ProviderOptions>,
},
Json {
value: JsonValue,
#[serde(
default,
rename = "providerOptions",
skip_serializing_if = "Option::is_none"
)]
provider_options: Option<ProviderOptions>,
},
ExecutionDenied {
#[serde(default, skip_serializing_if = "Option::is_none")]
reason: Option<String>,
#[serde(
default,
rename = "providerOptions",
skip_serializing_if = "Option::is_none"
)]
provider_options: Option<ProviderOptions>,
},
ErrorText {
value: String,
#[serde(
default,
rename = "providerOptions",
skip_serializing_if = "Option::is_none"
)]
provider_options: Option<ProviderOptions>,
},
ErrorJson {
value: JsonValue,
#[serde(
default,
rename = "providerOptions",
skip_serializing_if = "Option::is_none"
)]
provider_options: Option<ProviderOptions>,
},
Content {
value: Vec<ToolOutputPart>,
},
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type", rename_all = "kebab-case")]
pub enum ToolOutputPart {
Text {
text: String,
#[serde(
default,
rename = "providerOptions",
skip_serializing_if = "Option::is_none"
)]
provider_options: Option<ProviderOptions>,
},
File {
data: FileData,
#[serde(rename = "mediaType")]
media_type: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
filename: Option<String>,
#[serde(
default,
rename = "providerOptions",
skip_serializing_if = "Option::is_none"
)]
provider_options: Option<ProviderOptions>,
},
Custom {
#[serde(
default,
rename = "providerOptions",
skip_serializing_if = "Option::is_none"
)]
provider_options: Option<ProviderOptions>,
},
}