use crate::error::OpenAIError;
pub use crate::types::{
CompletionTokensDetails, ImageDetail, PromptTokensDetails, ReasoningEffort,
ResponseFormatJsonSchema,
};
use derive_builder::Builder;
use futures::Stream;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::collections::HashMap;
use std::pin::Pin;
#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum Role {
User,
Assistant,
System,
Developer,
}
#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum OutputStatus {
InProgress,
Completed,
Incomplete,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(untagged)]
pub enum Input {
Text(String),
Items(Vec<InputItem>),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(untagged, rename_all = "snake_case")]
pub enum InputItem {
Message(InputMessage),
Custom(serde_json::Value),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
#[builder(
name = "InputMessageArgs",
pattern = "mutable",
setter(into, strip_option),
default
)]
#[builder(build_fn(error = "OpenAIError"))]
pub struct InputMessage {
#[serde(default, rename = "type")]
pub kind: InputMessageType,
pub role: Role,
pub content: InputContent,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)]
#[serde(rename_all = "snake_case")]
pub enum InputMessageType {
#[default]
Message,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(untagged)]
pub enum InputContent {
TextInput(String),
InputItemContentList(Vec<ContentType>),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ContentType {
InputText(InputText),
InputImage(InputImage),
InputVideo(InputVideo),
InputAudio(InputAudio),
InputFile(InputFile),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct InputText {
text: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
#[builder(
name = "InputImageArgs",
pattern = "mutable",
setter(into, strip_option),
default
)]
#[builder(build_fn(error = "OpenAIError"))]
pub struct InputImage {
detail: ImageDetail,
#[serde(skip_serializing_if = "Option::is_none")]
file_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
image_url: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
#[builder(
name = "InputVideoArgs",
pattern = "mutable",
setter(into, strip_option),
default
)]
#[builder(build_fn(error = "OpenAIError"))]
pub struct InputVideo {
detail: ImageDetail,
#[serde(skip_serializing_if = "Option::is_none")]
file_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
video_url: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
#[builder(
name = "InputAudioArgs",
pattern = "mutable",
setter(into, strip_option),
default
)]
#[builder(build_fn(error = "OpenAIError"))]
pub struct InputAudio {
#[serde(skip_serializing_if = "Option::is_none")]
file_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
audio_url: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
#[builder(
name = "InputFileArgs",
pattern = "mutable",
setter(into, strip_option),
default
)]
#[builder(build_fn(error = "OpenAIError"))]
pub struct InputFile {
#[serde(skip_serializing_if = "Option::is_none")]
file_data: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
file_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
filename: Option<String>,
}
#[derive(Clone, Serialize, Deserialize, Debug, Default, Builder, PartialEq)]
#[builder(
name = "CreateResponseArgs",
pattern = "mutable",
setter(into, strip_option),
default
)]
#[builder(build_fn(error = "OpenAIError"))]
pub struct CreateResponse {
pub input: Input,
pub model: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub background: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub include: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub instructions: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_output_tokens: Option<u32>,
pub max_tool_calls: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parallel_tool_calls: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub previous_response_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub prompt: Option<PromptConfig>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reasoning: Option<ReasoningConfig>,
#[serde(skip_serializing_if = "Option::is_none")]
pub service_tier: Option<ServiceTier>,
#[serde(skip_serializing_if = "Option::is_none")]
pub store: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub stream: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub temperature: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub text: Option<TextConfig>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_choice: Option<ToolChoice>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<Vec<ToolDefinition>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub top_logprobs: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub top_p: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub truncation: Option<Truncation>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct PromptConfig {
pub id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub variables: Option<HashMap<String, String>>,
}
#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum ServiceTier {
Auto,
Default,
Flex,
}
#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum Truncation {
Auto,
Disabled,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
#[builder(
name = "ReasoningConfigArgs",
pattern = "mutable",
setter(into, strip_option),
default
)]
#[builder(build_fn(error = "OpenAIError"))]
pub struct ReasoningConfig {
#[serde(skip_serializing_if = "Option::is_none")]
pub effort: Option<ReasoningEffort>,
#[serde(skip_serializing_if = "Option::is_none")]
pub summary: Option<ReasoningSummary>,
}
#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum ReasoningSummary {
Auto,
Concise,
Detailed,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct TextConfig {
pub format: TextResponseFormat,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum TextResponseFormat {
Text,
JsonObject,
JsonSchema(ResponseFormatJsonSchema),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ToolDefinition {
FileSearch(FileSearch),
Function(Function),
WebSearchPreview(WebSearchPreview),
ComputerUsePreview(ComputerUsePreview),
Mcp(Mcp),
CodeInterpreter(CodeInterpreter),
ImageGeneration(ImageGeneration),
LocalShell,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
#[builder(
name = "FileSearchArgs",
pattern = "mutable",
setter(into, strip_option),
default
)]
#[builder(build_fn(error = "OpenAIError"))]
pub struct FileSearch {
pub vector_store_ids: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_num_results: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub filters: Option<Filter>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ranking_options: Option<RankingOptions>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
#[builder(
name = "FunctionArgs",
pattern = "mutable",
setter(into, strip_option),
default
)]
pub struct Function {
pub name: String,
pub parameters: serde_json::Value,
pub strict: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
#[builder(
name = "WebSearchPreviewArgs",
pattern = "mutable",
setter(into, strip_option),
default
)]
pub struct WebSearchPreview {
#[serde(skip_serializing_if = "Option::is_none")]
pub user_location: Option<Location>,
#[serde(skip_serializing_if = "Option::is_none")]
pub search_context_size: Option<WebSearchContextSize>,
}
#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum WebSearchContextSize {
Low,
Medium,
High,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
#[builder(
name = "ComputerUsePreviewArgs",
pattern = "mutable",
setter(into, strip_option),
default
)]
pub struct ComputerUsePreview {
environment: String,
display_width: u32,
display_height: u32,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct RankingOptions {
pub ranker: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub score_threshold: Option<f32>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(untagged)]
pub enum Filter {
Comparison(ComparisonFilter),
Compound(CompoundFilter),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct ComparisonFilter {
#[serde(rename = "type")]
pub op: ComparisonType,
pub key: String,
pub value: serde_json::Value,
}
#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
pub enum ComparisonType {
#[serde(rename = "eq")]
Equals,
#[serde(rename = "ne")]
NotEquals,
#[serde(rename = "gt")]
GreaterThan,
#[serde(rename = "gte")]
GreaterThanOrEqualTo,
#[serde(rename = "lt")]
LessThan,
#[serde(rename = "lte")]
LessThanOrEqualTo,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct CompoundFilter {
#[serde(rename = "type")]
pub op: ComparisonType,
pub filters: Vec<Filter>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum CompoundType {
And,
Or,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
#[builder(
name = "LocationArgs",
pattern = "mutable",
setter(into, strip_option),
default
)]
#[builder(build_fn(error = "OpenAIError"))]
pub struct Location {
#[serde(rename = "type")]
pub kind: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub city: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub country: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub region: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub timezone: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
#[builder(
name = "McpArgs",
pattern = "mutable",
setter(into, strip_option),
default
)]
#[builder(build_fn(error = "OpenAIError"))]
pub struct Mcp {
pub server_label: String,
pub server_url: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub allowed_tools: Option<AllowedTools>,
#[serde(skip_serializing_if = "Option::is_none")]
pub headers: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub require_approval: Option<RequireApproval>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(untagged)]
pub enum AllowedTools {
List(Vec<String>),
Filter(McpAllowedToolsFilter),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct McpAllowedToolsFilter {
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_names: Option<Vec<String>>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(untagged)]
pub enum RequireApproval {
Policy(RequireApprovalPolicy),
Filter(McpApprovalFilter),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum RequireApprovalPolicy {
Always,
Never,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct McpApprovalFilter {
#[serde(skip_serializing_if = "Option::is_none")]
pub always: Option<McpAllowedToolsFilter>,
#[serde(skip_serializing_if = "Option::is_none")]
pub never: Option<McpAllowedToolsFilter>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(untagged)]
pub enum CodeInterpreterContainer {
Id(String),
Container(CodeInterpreterContainerKind),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum CodeInterpreterContainerKind {
Auto {
#[serde(skip_serializing_if = "Option::is_none")]
file_ids: Option<Vec<String>>,
},
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
#[builder(
name = "CodeInterpreterArgs",
pattern = "mutable",
setter(into, strip_option),
default
)]
#[builder(build_fn(error = "OpenAIError"))]
pub struct CodeInterpreter {
pub container: CodeInterpreterContainer,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct InputImageMask {
#[serde(skip_serializing_if = "Option::is_none")]
pub image_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub file_id: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
#[builder(
name = "ImageGenerationArgs",
pattern = "mutable",
setter(into, strip_option),
default
)]
#[builder(build_fn(error = "OpenAIError"))]
pub struct ImageGeneration {
#[serde(skip_serializing_if = "Option::is_none")]
pub background: Option<ImageGenerationBackground>,
#[serde(skip_serializing_if = "Option::is_none")]
pub input_image_mask: Option<InputImageMask>,
#[serde(skip_serializing_if = "Option::is_none")]
pub model: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub moderation: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub output_compression: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
pub output_format: Option<ImageGenerationOutputFormat>,
#[serde(skip_serializing_if = "Option::is_none")]
pub partial_images: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
pub quality: Option<ImageGenerationQuality>,
#[serde(skip_serializing_if = "Option::is_none")]
pub size: Option<ImageGenerationSize>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum ImageGenerationBackground {
Transparent,
Opaque,
Auto,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum ImageGenerationOutputFormat {
Png,
Webp,
Jpeg,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum ImageGenerationQuality {
Low,
Medium,
High,
Auto,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum ImageGenerationSize {
Auto,
#[serde(rename = "1024x1024")]
Size1024x1024,
#[serde(rename = "1024x1536")]
Size1024x1536,
#[serde(rename = "1536x1024")]
Size1536x1024,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(untagged)]
pub enum ToolChoice {
Mode(ToolChoiceMode),
Hosted {
#[serde(rename = "type")]
kind: HostedToolType,
},
Function {
name: String,
},
}
#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum ToolChoiceMode {
None,
Auto,
Required,
}
#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum HostedToolType {
FileSearch,
WebSearchPreview,
ComputerUsePreview,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct ErrorObject {
pub code: String,
pub message: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct IncompleteDetails {
pub reason: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct OutputText {
pub annotations: Vec<Annotation>,
pub text: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum Annotation {
FileCitation(FileCitation),
UrlCitation(UrlCitation),
FilePath(FilePath),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct FileCitation {
file_id: String,
index: u32,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct UrlCitation {
end_index: u32,
start_index: u32,
title: String,
url: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct FilePath {
file_id: String,
index: u32,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct Refusal {
pub refusal: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct OutputMessage {
pub content: Vec<Content>,
pub id: String,
pub role: Role,
pub status: OutputStatus,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum Content {
OutputText(OutputText),
Refusal(Refusal),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum OutputContent {
Message(OutputMessage),
FileSearchCall(FileSearchCallOutput),
FunctionCall(FunctionCall),
WebSearchCall(WebSearchCallOutput),
ComputerCall(ComputerCallOutput),
Reasoning(ReasoningItem),
ImageGenerationCall(ImageGenerationCallOutput),
CodeInterpreterCall(CodeInterpreterCallOutput),
LocalShellCall(LocalShellCallOutput),
McpCall(McpCallOutput),
McpListTools(McpListToolsOutput),
McpApprovalRequest(McpApprovalRequestOutput),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct ReasoningItem {
pub id: String,
pub summary: Vec<SummaryText>,
#[serde(skip_serializing_if = "Option::is_none")]
pub encrypted_content: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<OutputStatus>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct SummaryText {
pub text: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct FileSearchCallOutput {
pub id: String,
pub queries: Vec<String>,
pub status: FileSearchCallOutputStatus,
#[serde(skip_serializing_if = "Option::is_none")]
pub results: Option<Vec<FileSearchResult>>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum FileSearchCallOutputStatus {
InProgress,
Searching,
Incomplete,
Failed,
Completed,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct FileSearchResult {
pub file_id: String,
pub filename: String,
pub score: f32,
pub text: String,
pub attributes: HashMap<String, serde_json::Value>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct SafetyCheck {
pub id: String,
pub code: String,
pub message: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct WebSearchCallOutput {
pub id: String,
pub status: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct ComputerCallOutput {
pub action: ComputerCallAction,
pub call_id: String,
pub id: String,
pub pending_safety_checks: Vec<SafetyCheck>,
pub status: OutputStatus,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Point {
pub x: i32,
pub y: i32,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ComputerCallAction {
Click(Click),
DoubleClick(DoubleClick),
Drag(Drag),
KeyPress(KeyPress),
Move(MoveAction),
Screenshot,
Scroll(Scroll),
Type(TypeAction),
Wait,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ButtonPress {
Left,
Right,
Wheel,
Back,
Forward,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Click {
pub button: ButtonPress,
pub x: i32,
pub y: i32,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct DoubleClick {
pub x: i32,
pub y: i32,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Drag {
pub path: Vec<Point>,
pub x: i32,
pub y: i32,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct KeyPress {
pub keys: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct MoveAction {
pub x: i32,
pub y: i32,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Scroll {
pub scroll_x: i32,
pub scroll_y: i32,
pub x: i32,
pub y: i32,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct TypeAction {
pub text: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct FunctionCall {
pub id: String,
pub call_id: String,
pub name: String,
pub arguments: String,
pub status: OutputStatus,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct ImageGenerationCallOutput {
pub id: String,
pub result: Option<String>,
pub status: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct CodeInterpreterCallOutput {
pub code: String,
pub id: String,
pub status: String,
pub container_id: String,
pub results: Vec<CodeInterpreterResult>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum CodeInterpreterResult {
Logs(CodeInterpreterTextOutput),
Files(CodeInterpreterFileOutput),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct CodeInterpreterTextOutput {
pub logs: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct CodeInterpreterFileOutput {
pub files: Vec<CodeInterpreterFile>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct CodeInterpreterFile {
file_id: String,
mime_type: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct LocalShellCallOutput {
pub action: LocalShellAction,
pub call_id: String,
pub id: String,
pub status: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct LocalShellAction {
pub command: Vec<String>,
pub env: HashMap<String, String>,
pub timeout_ms: Option<u64>,
pub user: Option<String>,
pub working_directory: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct McpCallOutput {
pub arguments: String,
pub id: String,
pub name: String,
pub server_label: String,
pub error: Option<String>,
pub output: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct McpListToolsOutput {
pub id: String,
pub server_label: String,
pub tools: Vec<McpToolInfo>,
#[serde(skip_serializing_if = "Option::is_none")]
pub error: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct McpToolInfo {
pub name: String,
pub input_schema: Value,
#[serde(skip_serializing_if = "Option::is_none")]
pub annotations: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct McpApprovalRequestOutput {
pub arguments: String,
pub id: String,
pub name: String,
pub server_label: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct Usage {
pub input_tokens: u32,
pub input_tokens_details: PromptTokensDetails,
pub output_tokens: u32,
pub output_tokens_details: CompletionTokensDetails,
pub total_tokens: u32,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct Response {
pub created_at: u64,
#[serde(skip_serializing_if = "Option::is_none")]
pub error: Option<ErrorObject>,
pub id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub incomplete_details: Option<IncompleteDetails>,
#[serde(skip_serializing_if = "Option::is_none")]
pub instructions: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_output_tokens: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<serde_json::Value>,
pub model: String,
pub object: String,
pub output: Vec<OutputContent>,
#[serde(skip_serializing_if = "Option::is_none")]
pub output_text: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parallel_tool_calls: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub previous_response_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reasoning: Option<ReasoningConfig>,
#[serde(skip_serializing_if = "Option::is_none")]
pub store: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub service_tier: Option<ServiceTier>,
pub status: Status,
#[serde(skip_serializing_if = "Option::is_none")]
pub temperature: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub text: Option<TextConfig>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_choice: Option<ToolChoice>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<Vec<ToolDefinition>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub top_p: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub truncation: Option<Truncation>,
#[serde(skip_serializing_if = "Option::is_none")]
pub usage: Option<Usage>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum Status {
Completed,
Failed,
InProgress,
Incomplete,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(tag = "type")]
#[non_exhaustive] pub enum ResponseEvent {
#[serde(rename = "response.created")]
ResponseCreated(ResponseCreated),
#[serde(rename = "response.in_progress")]
ResponseInProgress(ResponseInProgress),
#[serde(rename = "response.completed")]
ResponseCompleted(ResponseCompleted),
#[serde(rename = "response.failed")]
ResponseFailed(ResponseFailed),
#[serde(rename = "response.incomplete")]
ResponseIncomplete(ResponseIncomplete),
#[serde(rename = "response.queued")]
ResponseQueued(ResponseQueued),
#[serde(rename = "response.output_item.added")]
ResponseOutputItemAdded(ResponseOutputItemAdded),
#[serde(rename = "response.content_part.added")]
ResponseContentPartAdded(ResponseContentPartAdded),
#[serde(rename = "response.output_text.delta")]
ResponseOutputTextDelta(ResponseOutputTextDelta),
#[serde(rename = "response.output_text.done")]
ResponseOutputTextDone(ResponseOutputTextDone),
#[serde(rename = "response.refusal.delta")]
ResponseRefusalDelta(ResponseRefusalDelta),
#[serde(rename = "response.refusal.done")]
ResponseRefusalDone(ResponseRefusalDone),
#[serde(rename = "response.content_part.done")]
ResponseContentPartDone(ResponseContentPartDone),
#[serde(rename = "response.output_item.done")]
ResponseOutputItemDone(ResponseOutputItemDone),
#[serde(rename = "response.function_call_arguments.delta")]
ResponseFunctionCallArgumentsDelta(ResponseFunctionCallArgumentsDelta),
#[serde(rename = "response.function_call_arguments.done")]
ResponseFunctionCallArgumentsDone(ResponseFunctionCallArgumentsDone),
#[serde(rename = "response.file_search_call.in_progress")]
ResponseFileSearchCallInProgress(ResponseFileSearchCallInProgress),
#[serde(rename = "response.file_search_call.searching")]
ResponseFileSearchCallSearching(ResponseFileSearchCallSearching),
#[serde(rename = "response.file_search_call.completed")]
ResponseFileSearchCallCompleted(ResponseFileSearchCallCompleted),
#[serde(rename = "response.web_search_call.in_progress")]
ResponseWebSearchCallInProgress(ResponseWebSearchCallInProgress),
#[serde(rename = "response.web_search_call.searching")]
ResponseWebSearchCallSearching(ResponseWebSearchCallSearching),
#[serde(rename = "response.web_search_call.completed")]
ResponseWebSearchCallCompleted(ResponseWebSearchCallCompleted),
#[serde(rename = "response.reasoning_summary_part.added")]
ResponseReasoningSummaryPartAdded(ResponseReasoningSummaryPartAdded),
#[serde(rename = "response.reasoning_summary_part.done")]
ResponseReasoningSummaryPartDone(ResponseReasoningSummaryPartDone),
#[serde(rename = "response.reasoning_summary_text.delta")]
ResponseReasoningSummaryTextDelta(ResponseReasoningSummaryTextDelta),
#[serde(rename = "response.reasoning_summary_text.done")]
ResponseReasoningSummaryTextDone(ResponseReasoningSummaryTextDone),
#[serde(rename = "response.reasoning_summary.delta")]
ResponseReasoningSummaryDelta(ResponseReasoningSummaryDelta),
#[serde(rename = "response.reasoning_summary.done")]
ResponseReasoningSummaryDone(ResponseReasoningSummaryDone),
#[serde(rename = "response.image_generation_call.in_progress")]
ResponseImageGenerationCallInProgress(ResponseImageGenerationCallInProgress),
#[serde(rename = "response.image_generation_call.generating")]
ResponseImageGenerationCallGenerating(ResponseImageGenerationCallGenerating),
#[serde(rename = "response.image_generation_call.partial_image")]
ResponseImageGenerationCallPartialImage(ResponseImageGenerationCallPartialImage),
#[serde(rename = "response.image_generation_call.completed")]
ResponseImageGenerationCallCompleted(ResponseImageGenerationCallCompleted),
#[serde(rename = "response.mcp_call_arguments.delta")]
ResponseMcpCallArgumentsDelta(ResponseMcpCallArgumentsDelta),
#[serde(rename = "response.mcp_call_arguments.done")]
ResponseMcpCallArgumentsDone(ResponseMcpCallArgumentsDone),
#[serde(rename = "response.mcp_call.completed")]
ResponseMcpCallCompleted(ResponseMcpCallCompleted),
#[serde(rename = "response.mcp_call.failed")]
ResponseMcpCallFailed(ResponseMcpCallFailed),
#[serde(rename = "response.mcp_call.in_progress")]
ResponseMcpCallInProgress(ResponseMcpCallInProgress),
#[serde(rename = "response.mcp_list_tools.completed")]
ResponseMcpListToolsCompleted(ResponseMcpListToolsCompleted),
#[serde(rename = "response.mcp_list_tools.failed")]
ResponseMcpListToolsFailed(ResponseMcpListToolsFailed),
#[serde(rename = "response.mcp_list_tools.in_progress")]
ResponseMcpListToolsInProgress(ResponseMcpListToolsInProgress),
#[serde(rename = "response.code_interpreter_call.in_progress")]
ResponseCodeInterpreterCallInProgress(ResponseCodeInterpreterCallInProgress),
#[serde(rename = "response.code_interpreter_call.interpreting")]
ResponseCodeInterpreterCallInterpreting(ResponseCodeInterpreterCallInterpreting),
#[serde(rename = "response.code_interpreter_call.completed")]
ResponseCodeInterpreterCallCompleted(ResponseCodeInterpreterCallCompleted),
#[serde(rename = "response.code_interpreter_call_code.delta")]
ResponseCodeInterpreterCallCodeDelta(ResponseCodeInterpreterCallCodeDelta),
#[serde(rename = "response.code_interpreter_call_code.done")]
ResponseCodeInterpreterCallCodeDone(ResponseCodeInterpreterCallCodeDone),
#[serde(rename = "response.output_text.annotation.added")]
ResponseOutputTextAnnotationAdded(ResponseOutputTextAnnotationAdded),
#[serde(rename = "error")]
ResponseError(ResponseError),
#[serde(untagged)]
Unknown(serde_json::Value),
}
pub type ResponseStream = Pin<Box<dyn Stream<Item = Result<ResponseEvent, OpenAIError>> + Send>>;
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseCreated {
pub sequence_number: u64,
pub response: ResponseMetadata,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseInProgress {
pub sequence_number: u64,
pub response: ResponseMetadata,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseOutputItemAdded {
pub sequence_number: u64,
pub output_index: u32,
pub item: OutputItem,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseContentPartAdded {
pub sequence_number: u64,
pub item_id: String,
pub output_index: u32,
pub content_index: u32,
pub part: ContentPart,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseOutputTextDelta {
pub sequence_number: u64,
pub item_id: String,
pub output_index: u32,
pub content_index: u32,
pub delta: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub logprobs: Option<serde_json::Value>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseContentPartDone {
pub sequence_number: u64,
pub item_id: String,
pub output_index: u32,
pub content_index: u32,
pub part: ContentPart,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseOutputItemDone {
pub sequence_number: u64,
pub output_index: u32,
pub item: OutputItem,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseCompleted {
pub sequence_number: u64,
pub response: ResponseMetadata,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseFailed {
pub sequence_number: u64,
pub response: ResponseMetadata,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseIncomplete {
pub sequence_number: u64,
pub response: ResponseMetadata,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseQueued {
pub sequence_number: u64,
pub response: ResponseMetadata,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseOutputTextDone {
pub sequence_number: u64,
pub item_id: String,
pub output_index: u32,
pub content_index: u32,
pub text: String,
pub logprobs: Option<Vec<serde_json::Value>>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseRefusalDelta {
pub sequence_number: u64,
pub item_id: String,
pub output_index: u32,
pub content_index: u32,
pub delta: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseRefusalDone {
pub sequence_number: u64,
pub item_id: String,
pub output_index: u32,
pub content_index: u32,
pub refusal: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseFunctionCallArgumentsDelta {
pub sequence_number: u64,
pub item_id: String,
pub output_index: u32,
pub delta: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseFunctionCallArgumentsDone {
pub sequence_number: u64,
pub item_id: String,
pub output_index: u32,
pub arguments: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseError {
pub sequence_number: u64,
pub code: Option<String>,
pub message: String,
pub param: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseFileSearchCallInProgress {
pub sequence_number: u64,
pub output_index: u32,
pub item_id: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseFileSearchCallSearching {
pub sequence_number: u64,
pub output_index: u32,
pub item_id: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseFileSearchCallCompleted {
pub sequence_number: u64,
pub output_index: u32,
pub item_id: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseWebSearchCallInProgress {
pub sequence_number: u64,
pub output_index: u32,
pub item_id: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseWebSearchCallSearching {
pub sequence_number: u64,
pub output_index: u32,
pub item_id: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseWebSearchCallCompleted {
pub sequence_number: u64,
pub output_index: u32,
pub item_id: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseReasoningSummaryPartAdded {
pub sequence_number: u64,
pub item_id: String,
pub output_index: u32,
pub summary_index: u32,
pub part: serde_json::Value, }
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseReasoningSummaryPartDone {
pub sequence_number: u64,
pub item_id: String,
pub output_index: u32,
pub summary_index: u32,
pub part: serde_json::Value,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseReasoningSummaryTextDelta {
pub sequence_number: u64,
pub item_id: String,
pub output_index: u32,
pub summary_index: u32,
pub delta: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseReasoningSummaryTextDone {
pub sequence_number: u64,
pub item_id: String,
pub output_index: u32,
pub summary_index: u32,
pub text: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseReasoningSummaryDelta {
pub sequence_number: u64,
pub item_id: String,
pub output_index: u32,
pub summary_index: u32,
pub delta: serde_json::Value,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseReasoningSummaryDone {
pub sequence_number: u64,
pub item_id: String,
pub output_index: u32,
pub summary_index: u32,
pub text: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseImageGenerationCallInProgress {
pub sequence_number: u64,
pub output_index: u32,
pub item_id: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseImageGenerationCallGenerating {
pub sequence_number: u64,
pub output_index: u32,
pub item_id: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseImageGenerationCallPartialImage {
pub sequence_number: u64,
pub output_index: u32,
pub item_id: String,
pub partial_image_index: u32,
pub partial_image_b64: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseImageGenerationCallCompleted {
pub sequence_number: u64,
pub output_index: u32,
pub item_id: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseMcpCallArgumentsDelta {
pub sequence_number: u64,
pub output_index: u32,
pub item_id: String,
pub delta: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseMcpCallArgumentsDone {
pub sequence_number: u64,
pub output_index: u32,
pub item_id: String,
pub arguments: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseMcpCallCompleted {
pub sequence_number: u64,
pub output_index: u32,
pub item_id: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseMcpCallFailed {
pub sequence_number: u64,
pub output_index: u32,
pub item_id: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseMcpCallInProgress {
pub sequence_number: u64,
pub output_index: u32,
pub item_id: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseMcpListToolsCompleted {
pub sequence_number: u64,
pub output_index: u32,
pub item_id: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseMcpListToolsFailed {
pub sequence_number: u64,
pub output_index: u32,
pub item_id: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseMcpListToolsInProgress {
pub sequence_number: u64,
pub output_index: u32,
pub item_id: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseCodeInterpreterCallInProgress {
pub sequence_number: u64,
pub output_index: u32,
pub item_id: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseCodeInterpreterCallInterpreting {
pub sequence_number: u64,
pub output_index: u32,
pub item_id: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseCodeInterpreterCallCompleted {
pub sequence_number: u64,
pub output_index: u32,
pub item_id: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseCodeInterpreterCallCodeDelta {
pub sequence_number: u64,
pub output_index: u32,
pub item_id: String,
pub delta: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseCodeInterpreterCallCodeDone {
pub sequence_number: u64,
pub output_index: u32,
pub item_id: String,
pub code: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseMetadata {
pub id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub object: Option<String>,
pub created_at: u64,
pub status: Status,
#[serde(skip_serializing_if = "Option::is_none")]
pub model: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub usage: Option<Usage>,
#[serde(skip_serializing_if = "Option::is_none")]
pub error: Option<ErrorObject>,
#[serde(skip_serializing_if = "Option::is_none")]
pub incomplete_details: Option<IncompleteDetails>,
#[serde(skip_serializing_if = "Option::is_none")]
pub input: Option<Input>,
#[serde(skip_serializing_if = "Option::is_none")]
pub instructions: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_output_tokens: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub background: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub service_tier: Option<ServiceTier>,
#[serde(skip_serializing_if = "Option::is_none")]
pub top_logprobs: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_tool_calls: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub output: Option<Vec<OutputItem>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parallel_tool_calls: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub previous_response_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reasoning: Option<ReasoningConfig>,
#[serde(skip_serializing_if = "Option::is_none")]
pub store: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub temperature: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub text: Option<TextConfig>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_choice: Option<ToolChoice>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<Vec<ToolDefinition>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub top_p: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub truncation: Option<Truncation>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub prompt_cache_key: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub safety_identifier: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct OutputItem {
pub id: String,
#[serde(rename = "type")]
pub item_type: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub content: Option<Vec<ContentPart>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub role: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub summary: Option<Vec<serde_json::Value>>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ContentPart {
#[serde(rename = "type")]
pub part_type: String,
pub text: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub annotations: Option<Vec<serde_json::Value>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub logprobs: Option<Vec<serde_json::Value>>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct ResponseOutputTextAnnotationAdded {
pub sequence_number: u64,
pub item_id: String,
pub output_index: u32,
pub content_index: u32,
pub annotation_index: u32,
pub annotation: TextAnnotation,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct TextAnnotation {
#[serde(rename = "type")]
pub annotation_type: String,
pub text: String,
pub start: u32,
pub end: u32,
}