use serde::{Deserialize, Serialize};
use crate::json::{JsonObject, JsonSchema};
use crate::shared::ProviderOptions;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type", rename_all = "kebab-case")]
pub enum Tool {
#[serde(rename = "function")]
Function(FunctionTool),
#[serde(rename = "provider")]
Provider(ProviderTool),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct FunctionTool {
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(rename = "inputSchema")]
pub input_schema: JsonSchema,
#[serde(
default,
rename = "inputExamples",
skip_serializing_if = "Option::is_none"
)]
pub input_examples: Option<Vec<ToolInputExample>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub strict: Option<bool>,
#[serde(
default,
rename = "providerOptions",
skip_serializing_if = "Option::is_none"
)]
pub provider_options: Option<ProviderOptions>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ToolInputExample {
pub input: JsonObject,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ProviderTool {
pub id: String,
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub args: Option<JsonObject>,
#[serde(
default,
rename = "providerOptions",
skip_serializing_if = "Option::is_none"
)]
pub provider_options: Option<ProviderOptions>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type", rename_all = "kebab-case")]
pub enum ToolChoice {
#[default]
Auto,
None,
Required,
Tool {
#[serde(rename = "toolName")]
tool_name: String,
},
}