diff --git a/examples/assistant.rs b/examples/assistant.rs index ccec960..c5acb83 100644 --- a/examples/assistant.rs +++ b/examples/assistant.rs @@ -1,6 +1,6 @@ use openai_api_rs::v1::api::Client; use openai_api_rs::v1::assistant::AssistantRequest; -use openai_api_rs::v1::common::GPT4_1106_PREVIEW; +use openai_api_rs::v1::common::GPT4_O; use openai_api_rs::v1::message::{CreateMessageRequest, MessageRole}; use openai_api_rs::v1::run::CreateRunRequest; use openai_api_rs::v1::thread::CreateThreadRequest; @@ -13,20 +13,20 @@ fn main() -> Result<(), Box> { let mut tools = HashMap::new(); tools.insert("type".to_string(), "code_interpreter".to_string()); - let req = AssistantRequest::new(GPT4_1106_PREVIEW.to_string()); + let req = AssistantRequest::new(GPT4_O.to_string()); let req = req .clone() .description("this is a test assistant".to_string()); let req = req.clone().instructions("You are a personal math tutor. When asked a question, write and run Python code to answer the question.".to_string()); let req = req.clone().tools(vec![tools]); - println!("{:?}", req); + println!("AssistantRequest: {:?}", req); let result = client.create_assistant(req)?; - println!("{:?}", result.id); + println!("Create Assistant Result ID: {:?}", result.id); let thread_req = CreateThreadRequest::new(); let thread_result = client.create_thread(thread_req)?; - println!("{:?}", thread_result.id.clone()); + println!("Create Thread Result ID: {:?}", thread_result.id.clone()); let message_req = CreateMessageRequest::new( MessageRole::user, @@ -34,10 +34,11 @@ fn main() -> Result<(), Box> { ); let message_result = client.create_message(thread_result.id.clone(), message_req)?; - println!("{:?}", message_result.id.clone()); + println!("Create Message Result ID: {:?}", message_result.id.clone()); let run_req = CreateRunRequest::new(result.id); let run_result = client.create_run(thread_result.id.clone(), run_req)?; + println!("Create Run Result ID: {:?}", run_result.id.clone()); loop { let run_result = client diff --git a/src/v1/api.rs b/src/v1/api.rs index dd1e112..b4c36ef 100644 --- a/src/v1/api.rs +++ b/src/v1/api.rs @@ -93,7 +93,7 @@ impl Client { request = request.with_header("openai-organization", organization); } if is_beta { - request = request.with_header("OpenAI-Beta", "assistants=v1"); + request = request.with_header("OpenAI-Beta", "assistants=v2"); } if let Some(proxy) = &self.proxy { request = request.with_proxy(minreq::Proxy::new(proxy).unwrap()); diff --git a/src/v1/assistant.rs b/src/v1/assistant.rs index 3b62b97..0a68743 100644 --- a/src/v1/assistant.rs +++ b/src/v1/assistant.rs @@ -15,7 +15,7 @@ pub struct AssistantRequest { #[serde(skip_serializing_if = "Option::is_none")] pub tools: Option>>, #[serde(skip_serializing_if = "Option::is_none")] - pub file_ids: Option>, + pub tool_resources: Option, #[serde(skip_serializing_if = "Option::is_none")] pub metadata: Option>, } @@ -28,7 +28,7 @@ impl AssistantRequest { description: None, instructions: None, tools: None, - file_ids: None, + tool_resources: None, metadata: None, } } @@ -40,7 +40,7 @@ impl_builder_methods!( description: String, instructions: String, tools: Vec>, - file_ids: Vec, + tool_resources: ToolResource, metadata: HashMap ); @@ -57,11 +57,44 @@ pub struct AssistantObject { #[serde(skip_serializing_if = "Option::is_none")] pub instructions: Option, pub tools: Vec>, - pub file_ids: Vec, - pub metadata: HashMap, + #[serde(skip_serializing_if = "Option::is_none")] + pub tool_resources: Option, + pub metadata: Option>, pub headers: Option>, } +#[derive(Debug, Deserialize, Serialize, Clone)] +pub struct ToolResource { + #[serde(skip_serializing_if = "Option::is_none")] + pub code_interpreter: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub file_search: Option, +} + +#[derive(Debug, Deserialize, Serialize, Clone)] +pub struct CodeInterpreter { + #[serde(skip_serializing_if = "Option::is_none")] + pub file_ids: Option>, +} + +#[derive(Debug, Deserialize, Serialize, Clone)] +pub struct FileSearch { + #[serde(skip_serializing_if = "Option::is_none")] + pub vector_store_ids: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + pub vector_stores: Option, +} + +#[derive(Debug, Deserialize, Serialize, Clone)] +pub struct VectorStores { + #[serde(skip_serializing_if = "Option::is_none")] + pub file_ids: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + pub chunking_strategy: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub metadata: Option>, +} + #[derive(Debug, Deserialize, Serialize)] pub struct DeletionStatus { pub id: String, diff --git a/src/v1/message.rs b/src/v1/message.rs index 7942dd5..e82644b 100644 --- a/src/v1/message.rs +++ b/src/v1/message.rs @@ -8,7 +8,7 @@ pub struct CreateMessageRequest { pub role: MessageRole, pub content: String, #[serde(skip_serializing_if = "Option::is_none")] - pub file_ids: Option>, + pub attachments: Option>, #[serde(skip_serializing_if = "Option::is_none")] pub metadata: Option>, } @@ -18,7 +18,7 @@ impl CreateMessageRequest { Self { role, content, - file_ids: None, + attachments: None, metadata: None, } } @@ -26,7 +26,7 @@ impl CreateMessageRequest { impl_builder_methods!( CreateMessageRequest, - file_ids: Vec, + attachments: Vec, metadata: HashMap ); @@ -65,11 +65,23 @@ pub struct MessageObject { pub assistant_id: Option, #[serde(skip_serializing_if = "Option::is_none")] pub run_id: Option, - pub file_ids: Vec, - pub metadata: HashMap, + #[serde(skip_serializing_if = "Option::is_none")] + pub attachments: Option>, + pub metadata: Option>, pub headers: Option>, } +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct Attachment { + pub file_id: Option, + pub tools: Vec, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct Tool { + pub r#type: String, +} + #[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)] #[allow(non_camel_case_types)] pub enum MessageRole { diff --git a/src/v1/run.rs b/src/v1/run.rs index 392bc5e..77f06e9 100644 --- a/src/v1/run.rs +++ b/src/v1/run.rs @@ -85,7 +85,6 @@ pub struct RunObject { pub model: String, pub instructions: Option, pub tools: Vec>, - pub file_ids: Vec, pub metadata: HashMap, pub headers: Option>, } diff --git a/src/v1/thread.rs b/src/v1/thread.rs index cd591cd..57e0b5c 100644 --- a/src/v1/thread.rs +++ b/src/v1/thread.rs @@ -8,6 +8,32 @@ pub struct CreateThreadRequest { #[serde(skip_serializing_if = "Option::is_none")] pub messages: Option>, #[serde(skip_serializing_if = "Option::is_none")] + pub tool_resources: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub metadata: Option>, +} + +#[derive(Debug, Deserialize, Serialize, Clone)] +pub struct ToolResource { + pub code_interpreter: Option, + pub file_search: Option, +} + +#[derive(Debug, Deserialize, Serialize, Clone)] +pub struct CodeInterpreter { + pub file_ids: Option>, +} + +#[derive(Debug, Deserialize, Serialize, Clone)] +pub struct FileSearch { + pub vector_store_ids: Option>, + pub vector_stores: Option, +} + +#[derive(Debug, Deserialize, Serialize, Clone)] +pub struct VectorStores { + pub file_ids: Option>, + pub chunking_strategy: Option, pub metadata: Option>, } @@ -15,6 +41,7 @@ impl CreateThreadRequest { pub fn new() -> Self { Self { messages: None, + tool_resources: None, metadata: None, } } @@ -27,9 +54,9 @@ impl Default for CreateThreadRequest { } impl_builder_methods!( - CreateThreadRequest, - messages: Vec, - metadata: HashMap + CreateThreadRequest, + messages: Vec, + tool_resources: ToolResource ); #[derive(Debug, Deserialize, Serialize)] @@ -38,17 +65,52 @@ pub struct ThreadObject { pub object: String, pub created_at: i64, pub metadata: HashMap, + #[serde(skip_serializing_if = "Option::is_none")] + pub tool_resources: Option, + #[serde(skip_serializing_if = "Option::is_none")] pub headers: Option>, } #[derive(Debug, Deserialize, Serialize, Clone)] pub struct Message { + pub id: String, + pub object: String, + pub created_at: i64, + pub thread_id: String, pub role: MessageRole, - pub content: String, + pub content: Vec, + #[serde(skip_serializing_if = "Option::is_none")] + pub assistant_id: Option, #[serde(skip_serializing_if = "Option::is_none")] - pub file_ids: Option, + pub run_id: Option, #[serde(skip_serializing_if = "Option::is_none")] + pub attachments: Option>, pub metadata: Option>, + pub headers: Option>, +} + +#[derive(Debug, Deserialize, Serialize, Clone)] +pub struct Content { + #[serde(rename = "type")] + pub content_type: String, + pub text: ContentText, +} + +#[derive(Debug, Deserialize, Serialize, Clone)] +pub struct ContentText { + pub value: String, + pub annotations: Vec, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct Attachment { + pub file_id: String, + pub tools: Vec, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct Tool { + pub r#type: String, } #[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)]