diff --git a/examples/function_call.rs b/examples/function_call.rs index ddf1d3d..95d263f 100644 --- a/examples/function_call.rs +++ b/examples/function_call.rs @@ -1,6 +1,7 @@ use openai_api_rs::v1::api::OpenAIClient; use openai_api_rs::v1::chat_completion::{self, ChatCompletionRequest}; use openai_api_rs::v1::common::GPT4_O; +use openai_api_rs::v1::types; use serde::{Deserialize, Serialize}; use std::collections::HashMap; use std::{env, vec}; @@ -21,8 +22,8 @@ async fn main() -> Result<(), Box> { let mut properties = HashMap::new(); properties.insert( "coin".to_string(), - Box::new(chat_completion::JSONSchemaDefine { - schema_type: Some(chat_completion::JSONSchemaType::String), + Box::new(types::JSONSchemaDefine { + schema_type: Some(types::JSONSchemaType::String), description: Some("The cryptocurrency to get the price of".to_string()), ..Default::default() }), @@ -40,11 +41,11 @@ async fn main() -> Result<(), Box> { ) .tools(vec![chat_completion::Tool { r#type: chat_completion::ToolType::Function, - function: chat_completion::Function { + function: types::Function { name: String::from("get_coin_price"), description: Some(String::from("Get the price of a cryptocurrency")), - parameters: chat_completion::FunctionParameters { - schema_type: chat_completion::JSONSchemaType::Object, + parameters: types::FunctionParameters { + schema_type: types::JSONSchemaType::Object, properties: Some(properties), required: Some(vec![String::from("coin")]), }, diff --git a/examples/function_call_role.rs b/examples/function_call_role.rs index 38463a5..613cd4e 100644 --- a/examples/function_call_role.rs +++ b/examples/function_call_role.rs @@ -1,6 +1,7 @@ use openai_api_rs::v1::api::OpenAIClient; use openai_api_rs::v1::chat_completion::{self, ChatCompletionRequest}; use openai_api_rs::v1::common::GPT4_O; +use openai_api_rs::v1::types; use serde::{Deserialize, Serialize}; use std::collections::HashMap; use std::{env, vec}; @@ -21,8 +22,8 @@ async fn main() -> Result<(), Box> { let mut properties = HashMap::new(); properties.insert( "coin".to_string(), - Box::new(chat_completion::JSONSchemaDefine { - schema_type: Some(chat_completion::JSONSchemaType::String), + Box::new(types::JSONSchemaDefine { + schema_type: Some(types::JSONSchemaType::String), description: Some("The cryptocurrency to get the price of".to_string()), ..Default::default() }), @@ -40,11 +41,11 @@ async fn main() -> Result<(), Box> { ) .tools(vec![chat_completion::Tool { r#type: chat_completion::ToolType::Function, - function: chat_completion::Function { + function: types::Function { name: String::from("get_coin_price"), description: Some(String::from("Get the price of a cryptocurrency")), - parameters: chat_completion::FunctionParameters { - schema_type: chat_completion::JSONSchemaType::Object, + parameters: types::FunctionParameters { + schema_type: types::JSONSchemaType::Object, properties: Some(properties), required: Some(vec![String::from("coin")]), }, diff --git a/src/v1/assistant.rs b/src/v1/assistant.rs index 0a68743..9a42e1a 100644 --- a/src/v1/assistant.rs +++ b/src/v1/assistant.rs @@ -1,6 +1,7 @@ use serde::{Deserialize, Serialize}; use std::collections::HashMap; +use super::types; use crate::impl_builder_methods; #[derive(Debug, Serialize, Clone)] @@ -56,13 +57,53 @@ pub struct AssistantObject { pub model: String, #[serde(skip_serializing_if = "Option::is_none")] pub instructions: Option, - pub tools: Vec>, + pub tools: Vec, #[serde(skip_serializing_if = "Option::is_none")] pub tool_resources: Option, pub metadata: Option>, pub headers: Option>, } +#[derive(Debug, Deserialize, Serialize, Clone)] +#[serde(tag = "type")] +#[serde(rename_all = "snake_case")] +pub enum Tools { + CodeInterpreter, + FileSearch(ToolsFileSearch), + Function(ToolsFunction), +} + +#[derive(Debug, Deserialize, Serialize, Clone)] +pub struct ToolsFileSearch { + #[serde(skip_serializing_if = "Option::is_none")] + pub file_search: Option, +} + +#[derive(Debug, Deserialize, Serialize, Clone)] +pub struct ToolsFunction { + pub function: types::Function, +} + +#[derive(Debug, Deserialize, Serialize, Clone)] +pub struct ToolsFileSearchObject { + pub max_num_results: Option, + pub ranking_options: Option, +} + +#[derive(Debug, Deserialize, Serialize, Clone)] +pub struct FileSearchRankingOptions { + pub ranker: Option, + pub score_threshold: Option, +} + +#[derive(Debug, Deserialize, Serialize, Clone)] +pub enum FileSearchRanker { + #[serde(rename = "auto")] + Auto, + #[serde(rename = "default_2024_08_21")] + Default2024_08_21, +} + #[derive(Debug, Deserialize, Serialize, Clone)] pub struct ToolResource { #[serde(skip_serializing_if = "Option::is_none")] diff --git a/src/v1/chat_completion.rs b/src/v1/chat_completion.rs index b999b92..e20b827 100644 --- a/src/v1/chat_completion.rs +++ b/src/v1/chat_completion.rs @@ -1,5 +1,6 @@ +use super::{common, types}; use crate::impl_builder_methods; -use crate::v1::common; + use serde::de::{self, MapAccess, SeqAccess, Visitor}; use serde::ser::SerializeMap; use serde::{Deserialize, Deserializer, Serialize, Serializer}; @@ -185,6 +186,7 @@ impl<'de> Deserialize<'de> for Content { deserializer.deserialize_any(ContentVisitor) } } + #[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)] #[allow(non_camel_case_types)] pub enum ContentType { @@ -251,51 +253,6 @@ pub struct ChatCompletionResponse { pub headers: Option>, } -#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)] -pub struct Function { - pub name: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub description: Option, - pub parameters: FunctionParameters, -} - -#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)] -#[serde(rename_all = "lowercase")] -pub enum JSONSchemaType { - Object, - Number, - String, - Array, - Null, - Boolean, -} - -#[derive(Debug, Deserialize, Serialize, Clone, Default, PartialEq, Eq)] -pub struct JSONSchemaDefine { - #[serde(rename = "type")] - pub schema_type: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub description: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub enum_values: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - pub properties: Option>>, - #[serde(skip_serializing_if = "Option::is_none")] - pub required: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - pub items: Option>, -} - -#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)] -pub struct FunctionParameters { - #[serde(rename = "type")] - pub schema_type: JSONSchemaType, - #[serde(skip_serializing_if = "Option::is_none")] - pub properties: Option>>, - #[serde(skip_serializing_if = "Option::is_none")] - pub required: Option>, -} - #[derive(Debug, Deserialize, Serialize, PartialEq, Eq)] #[allow(non_camel_case_types)] pub enum FinishReason { @@ -352,7 +309,7 @@ where #[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)] pub struct Tool { pub r#type: ToolType, - pub function: Function, + pub function: types::Function, } #[derive(Debug, Deserialize, Serialize, Copy, Clone, PartialEq, Eq)] diff --git a/src/v1/mod.rs b/src/v1/mod.rs index 6eaf80c..5271472 100644 --- a/src/v1/mod.rs +++ b/src/v1/mod.rs @@ -1,5 +1,6 @@ pub mod common; pub mod error; +pub mod types; pub mod audio; pub mod batch; diff --git a/src/v1/types.rs b/src/v1/types.rs new file mode 100644 index 0000000..d07343d --- /dev/null +++ b/src/v1/types.rs @@ -0,0 +1,47 @@ +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; + +#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)] +pub struct Function { + pub name: String, + #[serde(skip_serializing_if = "Option::is_none")] + pub description: Option, + pub parameters: FunctionParameters, +} + +#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)] +pub struct FunctionParameters { + #[serde(rename = "type")] + pub schema_type: JSONSchemaType, + #[serde(skip_serializing_if = "Option::is_none")] + pub properties: Option>>, + #[serde(skip_serializing_if = "Option::is_none")] + pub required: Option>, +} + +#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)] +#[serde(rename_all = "lowercase")] +pub enum JSONSchemaType { + Object, + Number, + String, + Array, + Null, + Boolean, +} + +#[derive(Debug, Deserialize, Serialize, Clone, Default, PartialEq, Eq)] +pub struct JSONSchemaDefine { + #[serde(rename = "type")] + pub schema_type: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub description: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub enum_values: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + pub properties: Option>>, + #[serde(skip_serializing_if = "Option::is_none")] + pub required: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + pub items: Option>, +}