use serde::{Deserialize, Serialize};
use crate::json::JsonSchema;
use crate::shared::{Headers, ProviderOptions};
use super::prompt::Prompt;
use super::tool::{Tool, ToolChoice};
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct CallOptions {
pub prompt: Prompt,
#[serde(
default,
rename = "maxOutputTokens",
skip_serializing_if = "Option::is_none"
)]
pub max_output_tokens: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub temperature: Option<f32>,
#[serde(
default,
rename = "stopSequences",
skip_serializing_if = "Option::is_none"
)]
pub stop_sequences: Option<Vec<String>>,
#[serde(default, rename = "topP", skip_serializing_if = "Option::is_none")]
pub top_p: Option<f32>,
#[serde(default, rename = "topK", skip_serializing_if = "Option::is_none")]
pub top_k: Option<u32>,
#[serde(
default,
rename = "presencePenalty",
skip_serializing_if = "Option::is_none"
)]
pub presence_penalty: Option<f32>,
#[serde(
default,
rename = "frequencyPenalty",
skip_serializing_if = "Option::is_none"
)]
pub frequency_penalty: Option<f32>,
#[serde(
default,
rename = "responseFormat",
skip_serializing_if = "Option::is_none"
)]
pub response_format: Option<ResponseFormat>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub seed: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tools: Option<Vec<Tool>>,
#[serde(
default,
rename = "toolChoice",
skip_serializing_if = "Option::is_none"
)]
pub tool_choice: Option<ToolChoice>,
#[serde(
default,
rename = "includeRawChunks",
skip_serializing_if = "Option::is_none"
)]
pub include_raw_chunks: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub headers: Option<Headers>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub reasoning: Option<ReasoningEffort>,
#[serde(
default,
rename = "providerOptions",
skip_serializing_if = "Option::is_none"
)]
pub provider_options: Option<ProviderOptions>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type", rename_all = "kebab-case")]
pub enum ResponseFormat {
Text,
Json {
#[serde(default, skip_serializing_if = "Option::is_none")]
schema: Option<JsonSchema>,
#[serde(default, skip_serializing_if = "Option::is_none")]
name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
description: Option<String>,
},
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Hash)]
#[serde(rename_all = "kebab-case")]
pub enum ReasoningEffort {
ProviderDefault,
None,
Minimal,
Low,
Medium,
High,
Xhigh,
}