use serde::{Deserialize, Serialize};
use serde_json::{Map, Value};
use crate::{
request::{OutputMode, PreparedInstruction},
settings::ThinkingSettings,
transport::HttpRequestOptions,
};
#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
pub struct ModelRequestParameters {
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub tools: Vec<ToolDefinition>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub native_tools: Vec<NativeToolDefinition>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub output_schema: Option<Value>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub output_mode: Option<OutputMode>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub instructions: Vec<PreparedInstruction>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub thinking: Option<ThinkingSettings>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub allow_text_output: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub allow_image_output: Option<bool>,
#[serde(default)]
pub http: HttpRequestOptions,
#[serde(default, skip_serializing_if = "Map::is_empty")]
pub extra_body: Map<String, Value>,
#[serde(default, skip_serializing_if = "Map::is_empty")]
pub metadata: Map<String, Value>,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct ToolDefinition {
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(default)]
pub parameters: Value,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub return_schema: Option<Value>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub strict: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub sequential: Option<bool>,
#[serde(default, skip_serializing_if = "Map::is_empty")]
pub metadata: Map<String, Value>,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct NativeToolDefinition {
pub tool_type: String,
#[serde(default, skip_serializing_if = "Map::is_empty")]
pub config: Map<String, Value>,
#[serde(default, skip_serializing_if = "Map::is_empty")]
pub metadata: Map<String, Value>,
}
impl NativeToolDefinition {
#[must_use]
pub fn new(tool_type: impl Into<String>) -> Self {
Self {
tool_type: tool_type.into(),
config: Map::new(),
metadata: Map::new(),
}
}
#[must_use]
pub fn with_config(mut self, config: Map<String, Value>) -> Self {
self.config = config;
self
}
#[must_use]
pub fn with_metadata(mut self, metadata: Map<String, Value>) -> Self {
self.metadata = metadata;
self
}
}