mirror of
https://github.com/mii443/openai-api-rs.git
synced 2025-08-22 23:25:39 +00:00
64
examples/assistant.rs
Normal file
64
examples/assistant.rs
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
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::message::{CreateMessageRequest, MessageRole};
|
||||||
|
use openai_api_rs::v1::run::CreateRunRequest;
|
||||||
|
use openai_api_rs::v1::thread::CreateThreadRequest;
|
||||||
|
use std::collections::HashMap;
|
||||||
|
use std::env;
|
||||||
|
|
||||||
|
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
|
let client = Client::new(env::var("OPENAI_API_KEY").unwrap().to_string());
|
||||||
|
|
||||||
|
let mut tools = HashMap::new();
|
||||||
|
tools.insert("type".to_string(), "code_interpreter".to_string());
|
||||||
|
|
||||||
|
let req = AssistantRequest::new(GPT4_1106_PREVIEW.to_string());
|
||||||
|
req.clone()
|
||||||
|
.description("this is a test assistant".to_string());
|
||||||
|
req.clone().instructions("You are a personal math tutor. When asked a question, write and run Python code to answer the question.".to_string());
|
||||||
|
req.clone().tools(vec![tools]);
|
||||||
|
let result = client.create_assistant(req)?;
|
||||||
|
println!("{:?}", result.id);
|
||||||
|
|
||||||
|
let thread_req = CreateThreadRequest::new();
|
||||||
|
let thread_result = client.create_thread(thread_req)?;
|
||||||
|
println!("{:?}", thread_result.id.clone());
|
||||||
|
|
||||||
|
let message_req = CreateMessageRequest::new(
|
||||||
|
MessageRole::user,
|
||||||
|
"`I need to solve the equation 3x + 11 = 14. Can you help me?".to_string(),
|
||||||
|
);
|
||||||
|
|
||||||
|
let message_result = client.create_message(thread_result.id.clone(), message_req)?;
|
||||||
|
println!("{:?}", message_result.id.clone());
|
||||||
|
|
||||||
|
let run_req = CreateRunRequest::new(result.id);
|
||||||
|
let run_result = client.create_run(thread_result.id.clone(), run_req)?;
|
||||||
|
|
||||||
|
loop {
|
||||||
|
let run_result = client
|
||||||
|
.retrieve_run(thread_result.id.clone(), run_result.id.clone())
|
||||||
|
.unwrap();
|
||||||
|
if run_result.status == "completed" {
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
println!("waiting...");
|
||||||
|
std::thread::sleep(std::time::Duration::from_secs(1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let list_message_result = client.list_messages(thread_result.id.clone()).unwrap();
|
||||||
|
for data in list_message_result.data {
|
||||||
|
for content in data.content {
|
||||||
|
println!(
|
||||||
|
"{:?}: {:?} {:?}",
|
||||||
|
data.role, content.text.value, content.text.annotations
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
// OPENAI_API_KEY=xxxx cargo run --package openai-api-rs --example assistant
|
@ -1,12 +1,13 @@
|
|||||||
use openai_api_rs::v1::api::Client;
|
use openai_api_rs::v1::api::Client;
|
||||||
use openai_api_rs::v1::chat_completion::{self, ChatCompletionRequest};
|
use openai_api_rs::v1::chat_completion::{self, ChatCompletionRequest};
|
||||||
|
use openai_api_rs::v1::common::GPT4;
|
||||||
use std::env;
|
use std::env;
|
||||||
|
|
||||||
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
let client = Client::new(env::var("OPENAI_API_KEY").unwrap().to_string());
|
let client = Client::new(env::var("OPENAI_API_KEY").unwrap().to_string());
|
||||||
|
|
||||||
let req = ChatCompletionRequest::new(
|
let req = ChatCompletionRequest::new(
|
||||||
chat_completion::GPT4.to_string(),
|
GPT4.to_string(),
|
||||||
vec![chat_completion::ChatCompletionMessage {
|
vec![chat_completion::ChatCompletionMessage {
|
||||||
role: chat_completion::MessageRole::user,
|
role: chat_completion::MessageRole::user,
|
||||||
content: String::from("What is Bitcoin?"),
|
content: String::from("What is Bitcoin?"),
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
use openai_api_rs::v1::api::Client;
|
use openai_api_rs::v1::api::Client;
|
||||||
use openai_api_rs::v1::chat_completion::{self, ChatCompletionRequest, FunctionCallType};
|
use openai_api_rs::v1::chat_completion::{self, ChatCompletionRequest, FunctionCallType};
|
||||||
|
use openai_api_rs::v1::common::GPT3_5_TURBO_0613;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::{env, vec};
|
use std::{env, vec};
|
||||||
@ -30,7 +31,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||||||
);
|
);
|
||||||
|
|
||||||
let req = ChatCompletionRequest::new(
|
let req = ChatCompletionRequest::new(
|
||||||
chat_completion::GPT3_5_TURBO_0613.to_string(),
|
GPT3_5_TURBO_0613.to_string(),
|
||||||
vec![chat_completion::ChatCompletionMessage {
|
vec![chat_completion::ChatCompletionMessage {
|
||||||
role: chat_completion::MessageRole::user,
|
role: chat_completion::MessageRole::user,
|
||||||
content: String::from("What is the price of Ethereum?"),
|
content: String::from("What is the price of Ethereum?"),
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
use openai_api_rs::v1::api::Client;
|
use openai_api_rs::v1::api::Client;
|
||||||
use openai_api_rs::v1::chat_completion::{self, ChatCompletionRequest};
|
use openai_api_rs::v1::chat_completion::{self, ChatCompletionRequest};
|
||||||
|
use openai_api_rs::v1::common::GPT3_5_TURBO_0613;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::{env, vec};
|
use std::{env, vec};
|
||||||
@ -30,7 +31,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||||||
);
|
);
|
||||||
|
|
||||||
let req = ChatCompletionRequest::new(
|
let req = ChatCompletionRequest::new(
|
||||||
chat_completion::GPT3_5_TURBO_0613.to_string(),
|
GPT3_5_TURBO_0613.to_string(),
|
||||||
vec![chat_completion::ChatCompletionMessage {
|
vec![chat_completion::ChatCompletionMessage {
|
||||||
role: chat_completion::MessageRole::user,
|
role: chat_completion::MessageRole::user,
|
||||||
content: String::from("What is the price of Ethereum?"),
|
content: String::from("What is the price of Ethereum?"),
|
||||||
@ -70,7 +71,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||||||
let coin = c.coin;
|
let coin = c.coin;
|
||||||
|
|
||||||
let req = ChatCompletionRequest::new(
|
let req = ChatCompletionRequest::new(
|
||||||
chat_completion::GPT3_5_TURBO_0613.to_string(),
|
GPT3_5_TURBO_0613.to_string(),
|
||||||
vec![
|
vec![
|
||||||
chat_completion::ChatCompletionMessage {
|
chat_completion::ChatCompletionMessage {
|
||||||
role: chat_completion::MessageRole::user,
|
role: chat_completion::MessageRole::user,
|
||||||
|
414
src/v1/api.rs
414
src/v1/api.rs
@ -1,3 +1,7 @@
|
|||||||
|
use crate::v1::assistant::{
|
||||||
|
AssistantFileObject, AssistantFileRequest, AssistantObject, AssistantRequest, DeletionStatus,
|
||||||
|
ListAssistant, ListAssistantFile,
|
||||||
|
};
|
||||||
use crate::v1::audio::{
|
use crate::v1::audio::{
|
||||||
AudioTranscriptionRequest, AudioTranscriptionResponse, AudioTranslationRequest,
|
AudioTranscriptionRequest, AudioTranscriptionResponse, AudioTranslationRequest,
|
||||||
AudioTranslationResponse,
|
AudioTranslationResponse,
|
||||||
@ -22,7 +26,16 @@ use crate::v1::image::{
|
|||||||
ImageEditRequest, ImageEditResponse, ImageGenerationRequest, ImageGenerationResponse,
|
ImageEditRequest, ImageEditResponse, ImageGenerationRequest, ImageGenerationResponse,
|
||||||
ImageVariationRequest, ImageVariationResponse,
|
ImageVariationRequest, ImageVariationResponse,
|
||||||
};
|
};
|
||||||
|
use crate::v1::message::{
|
||||||
|
CreateMessageRequest, ListMessage, ListMessageFile, MessageFileObject, MessageObject,
|
||||||
|
ModifyMessageRequest,
|
||||||
|
};
|
||||||
use crate::v1::moderation::{CreateModerationRequest, CreateModerationResponse};
|
use crate::v1::moderation::{CreateModerationRequest, CreateModerationResponse};
|
||||||
|
use crate::v1::run::{
|
||||||
|
CreateRunRequest, CreateThreadAndRunRequest, ListRun, ListRunStep, ModifyRunRequest, RunObject,
|
||||||
|
RunStepObject,
|
||||||
|
};
|
||||||
|
use crate::v1::thread::{CreateThreadRequest, ModifyThreadRequest, ThreadObject};
|
||||||
|
|
||||||
use minreq::Response;
|
use minreq::Response;
|
||||||
|
|
||||||
@ -57,13 +70,16 @@ impl Client {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn build_request(&self, request: minreq::Request) -> minreq::Request {
|
pub fn build_request(&self, request: minreq::Request, is_beta: bool) -> minreq::Request {
|
||||||
let mut request = request
|
let mut request = request
|
||||||
.with_header("Content-Type", "application/json")
|
.with_header("Content-Type", "application/json")
|
||||||
.with_header("Authorization", format!("Bearer {}", self.api_key));
|
.with_header("Authorization", format!("Bearer {}", self.api_key));
|
||||||
if let Some(organization) = &self.organization {
|
if let Some(organization) = &self.organization {
|
||||||
request = request.with_header("openai-organization", organization);
|
request = request.with_header("openai-organization", organization);
|
||||||
}
|
}
|
||||||
|
if is_beta {
|
||||||
|
request = request.with_header("OpenAI-Beta", "assistants=v1");
|
||||||
|
}
|
||||||
request
|
request
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -77,8 +93,7 @@ impl Client {
|
|||||||
api_endpoint = self.api_endpoint,
|
api_endpoint = self.api_endpoint,
|
||||||
path = path
|
path = path
|
||||||
);
|
);
|
||||||
|
let request = self.build_request(minreq::post(url), Self::is_beta(path));
|
||||||
let request = self.build_request(minreq::post(url));
|
|
||||||
let res = request.with_json(params).unwrap().send();
|
let res = request.with_json(params).unwrap().send();
|
||||||
match res {
|
match res {
|
||||||
Ok(res) => {
|
Ok(res) => {
|
||||||
@ -100,8 +115,7 @@ impl Client {
|
|||||||
api_endpoint = self.api_endpoint,
|
api_endpoint = self.api_endpoint,
|
||||||
path = path
|
path = path
|
||||||
);
|
);
|
||||||
|
let request = self.build_request(minreq::get(url), Self::is_beta(path));
|
||||||
let request = self.build_request(minreq::get(url));
|
|
||||||
let res = request.send();
|
let res = request.send();
|
||||||
match res {
|
match res {
|
||||||
Ok(res) => {
|
Ok(res) => {
|
||||||
@ -123,8 +137,7 @@ impl Client {
|
|||||||
api_endpoint = self.api_endpoint,
|
api_endpoint = self.api_endpoint,
|
||||||
path = path
|
path = path
|
||||||
);
|
);
|
||||||
|
let request = self.build_request(minreq::delete(url), Self::is_beta(path));
|
||||||
let request = self.build_request(minreq::delete(url));
|
|
||||||
let res = request.send();
|
let res = request.send();
|
||||||
match res {
|
match res {
|
||||||
Ok(res) => {
|
Ok(res) => {
|
||||||
@ -368,9 +381,396 @@ impl Client {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn create_assistant(&self, req: AssistantRequest) -> Result<AssistantObject, APIError> {
|
||||||
|
let res = self.post("/assistants", &req)?;
|
||||||
|
let r = res.json::<AssistantObject>();
|
||||||
|
match r {
|
||||||
|
Ok(r) => Ok(r),
|
||||||
|
Err(e) => Err(self.new_error(e)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn retrieve_assistant(&self, assistant_id: String) -> Result<AssistantObject, APIError> {
|
||||||
|
let res = self.get(&format!("/assistants/{}", assistant_id))?;
|
||||||
|
let r = res.json::<AssistantObject>();
|
||||||
|
match r {
|
||||||
|
Ok(r) => Ok(r),
|
||||||
|
Err(e) => Err(self.new_error(e)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn modify_assistant(
|
||||||
|
&self,
|
||||||
|
assistant_id: String,
|
||||||
|
req: AssistantRequest,
|
||||||
|
) -> Result<AssistantObject, APIError> {
|
||||||
|
let res = self.post(&format!("/assistants/{}", assistant_id), &req)?;
|
||||||
|
let r = res.json::<AssistantObject>();
|
||||||
|
match r {
|
||||||
|
Ok(r) => Ok(r),
|
||||||
|
Err(e) => Err(self.new_error(e)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn delete_assistant(&self, assistant_id: String) -> Result<DeletionStatus, APIError> {
|
||||||
|
let res = self.delete(&format!("/assistants/{}", assistant_id))?;
|
||||||
|
let r = res.json::<DeletionStatus>();
|
||||||
|
match r {
|
||||||
|
Ok(r) => Ok(r),
|
||||||
|
Err(e) => Err(self.new_error(e)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn list_assistant(
|
||||||
|
&self,
|
||||||
|
limit: Option<i64>,
|
||||||
|
order: Option<String>,
|
||||||
|
after: Option<String>,
|
||||||
|
before: Option<String>,
|
||||||
|
) -> Result<ListAssistant, APIError> {
|
||||||
|
let mut url = "/assistants".to_owned();
|
||||||
|
url = Self::query_params(limit, order, after, before, url);
|
||||||
|
let res = self.get(&url)?;
|
||||||
|
let r = res.json::<ListAssistant>();
|
||||||
|
match r {
|
||||||
|
Ok(r) => Ok(r),
|
||||||
|
Err(e) => Err(self.new_error(e)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn create_assistant_file(
|
||||||
|
&self,
|
||||||
|
assistant_id: String,
|
||||||
|
req: AssistantFileRequest,
|
||||||
|
) -> Result<AssistantFileObject, APIError> {
|
||||||
|
let res = self.post(&format!("/assistants/{}/files", assistant_id), &req)?;
|
||||||
|
let r = res.json::<AssistantFileObject>();
|
||||||
|
match r {
|
||||||
|
Ok(r) => Ok(r),
|
||||||
|
Err(e) => Err(self.new_error(e)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn retrieve_assistant_file(
|
||||||
|
&self,
|
||||||
|
assistant_id: String,
|
||||||
|
file_id: String,
|
||||||
|
) -> Result<AssistantFileObject, APIError> {
|
||||||
|
let res = self.get(&format!("/assistants/{}/files/{}", assistant_id, file_id))?;
|
||||||
|
let r = res.json::<AssistantFileObject>();
|
||||||
|
match r {
|
||||||
|
Ok(r) => Ok(r),
|
||||||
|
Err(e) => Err(self.new_error(e)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn delete_assistant_file(
|
||||||
|
&self,
|
||||||
|
assistant_id: String,
|
||||||
|
file_id: String,
|
||||||
|
) -> Result<DeletionStatus, APIError> {
|
||||||
|
let res = self.delete(&format!("/assistants/{}/files/{}", assistant_id, file_id))?;
|
||||||
|
let r = res.json::<DeletionStatus>();
|
||||||
|
match r {
|
||||||
|
Ok(r) => Ok(r),
|
||||||
|
Err(e) => Err(self.new_error(e)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn list_assistant_file(
|
||||||
|
&self,
|
||||||
|
assistant_id: String,
|
||||||
|
limit: Option<i64>,
|
||||||
|
order: Option<String>,
|
||||||
|
after: Option<String>,
|
||||||
|
before: Option<String>,
|
||||||
|
) -> Result<ListAssistantFile, APIError> {
|
||||||
|
let mut url = format!("/assistants/{}/files", assistant_id);
|
||||||
|
url = Self::query_params(limit, order, after, before, url);
|
||||||
|
let res = self.get(&url)?;
|
||||||
|
let r = res.json::<ListAssistantFile>();
|
||||||
|
match r {
|
||||||
|
Ok(r) => Ok(r),
|
||||||
|
Err(e) => Err(self.new_error(e)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn create_thread(&self, req: CreateThreadRequest) -> Result<ThreadObject, APIError> {
|
||||||
|
let res = self.post("/threads", &req)?;
|
||||||
|
let r = res.json::<ThreadObject>();
|
||||||
|
match r {
|
||||||
|
Ok(r) => Ok(r),
|
||||||
|
Err(e) => Err(self.new_error(e)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn retrieve_thread(&self, thread_id: String) -> Result<ThreadObject, APIError> {
|
||||||
|
let res = self.get(&format!("/threads/{}", thread_id))?;
|
||||||
|
let r = res.json::<ThreadObject>();
|
||||||
|
match r {
|
||||||
|
Ok(r) => Ok(r),
|
||||||
|
Err(e) => Err(self.new_error(e)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn modify_thread(
|
||||||
|
&self,
|
||||||
|
thread_id: String,
|
||||||
|
req: ModifyThreadRequest,
|
||||||
|
) -> Result<ThreadObject, APIError> {
|
||||||
|
let res = self.post(&format!("/threads/{}", thread_id), &req)?;
|
||||||
|
let r = res.json::<ThreadObject>();
|
||||||
|
match r {
|
||||||
|
Ok(r) => Ok(r),
|
||||||
|
Err(e) => Err(self.new_error(e)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn delete_thread(&self, thread_id: String) -> Result<DeletionStatus, APIError> {
|
||||||
|
let res = self.delete(&format!("/threads/{}", thread_id))?;
|
||||||
|
let r = res.json::<DeletionStatus>();
|
||||||
|
match r {
|
||||||
|
Ok(r) => Ok(r),
|
||||||
|
Err(e) => Err(self.new_error(e)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn create_message(
|
||||||
|
&self,
|
||||||
|
thread_id: String,
|
||||||
|
req: CreateMessageRequest,
|
||||||
|
) -> Result<MessageObject, APIError> {
|
||||||
|
let res = self.post(&format!("/threads/{}/messages", thread_id), &req)?;
|
||||||
|
let r = res.json::<MessageObject>();
|
||||||
|
match r {
|
||||||
|
Ok(r) => Ok(r),
|
||||||
|
Err(e) => Err(self.new_error(e)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn retrieve_message(
|
||||||
|
&self,
|
||||||
|
thread_id: String,
|
||||||
|
message_id: String,
|
||||||
|
) -> Result<MessageObject, APIError> {
|
||||||
|
let res = self.get(&format!("/threads/{}/messages/{}", thread_id, message_id))?;
|
||||||
|
let r = res.json::<MessageObject>();
|
||||||
|
match r {
|
||||||
|
Ok(r) => Ok(r),
|
||||||
|
Err(e) => Err(self.new_error(e)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn modify_message(
|
||||||
|
&self,
|
||||||
|
thread_id: String,
|
||||||
|
message_id: String,
|
||||||
|
req: ModifyMessageRequest,
|
||||||
|
) -> Result<MessageObject, APIError> {
|
||||||
|
let res = self.post(
|
||||||
|
&format!("/threads/{}/messages/{}", thread_id, message_id),
|
||||||
|
&req,
|
||||||
|
)?;
|
||||||
|
let r = res.json::<MessageObject>();
|
||||||
|
match r {
|
||||||
|
Ok(r) => Ok(r),
|
||||||
|
Err(e) => Err(self.new_error(e)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn list_messages(&self, thread_id: String) -> Result<ListMessage, APIError> {
|
||||||
|
let res = self.get(&format!("/threads/{}/messages", thread_id))?;
|
||||||
|
let r = res.json::<ListMessage>();
|
||||||
|
match r {
|
||||||
|
Ok(r) => Ok(r),
|
||||||
|
Err(e) => Err(self.new_error(e)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn retrieve_message_file(
|
||||||
|
&self,
|
||||||
|
thread_id: String,
|
||||||
|
message_id: String,
|
||||||
|
file_id: String,
|
||||||
|
) -> Result<MessageFileObject, APIError> {
|
||||||
|
let res = self.get(&format!(
|
||||||
|
"/threads/{}/messages/{}/files/{}",
|
||||||
|
thread_id, message_id, file_id
|
||||||
|
))?;
|
||||||
|
let r = res.json::<MessageFileObject>();
|
||||||
|
match r {
|
||||||
|
Ok(r) => Ok(r),
|
||||||
|
Err(e) => Err(self.new_error(e)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn list_message_file(
|
||||||
|
&self,
|
||||||
|
thread_id: String,
|
||||||
|
message_id: String,
|
||||||
|
limit: Option<i64>,
|
||||||
|
order: Option<String>,
|
||||||
|
after: Option<String>,
|
||||||
|
before: Option<String>,
|
||||||
|
) -> Result<ListMessageFile, APIError> {
|
||||||
|
let mut url = format!("/threads/{}/messages/{}/files", thread_id, message_id);
|
||||||
|
url = Self::query_params(limit, order, after, before, url);
|
||||||
|
let res = self.get(&url)?;
|
||||||
|
let r = res.json::<ListMessageFile>();
|
||||||
|
match r {
|
||||||
|
Ok(r) => Ok(r),
|
||||||
|
Err(e) => Err(self.new_error(e)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn create_run(
|
||||||
|
&self,
|
||||||
|
thread_id: String,
|
||||||
|
req: CreateRunRequest,
|
||||||
|
) -> Result<RunObject, APIError> {
|
||||||
|
let res = self.post(&format!("/threads/{}/runs", thread_id), &req)?;
|
||||||
|
let r = res.json::<RunObject>();
|
||||||
|
match r {
|
||||||
|
Ok(r) => Ok(r),
|
||||||
|
Err(e) => Err(self.new_error(e)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn retrieve_run(&self, thread_id: String, run_id: String) -> Result<RunObject, APIError> {
|
||||||
|
let res = self.get(&format!("/threads/{}/runs/{}", thread_id, run_id))?;
|
||||||
|
let r = res.json::<RunObject>();
|
||||||
|
match r {
|
||||||
|
Ok(r) => Ok(r),
|
||||||
|
Err(e) => Err(self.new_error(e)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn modify_run(
|
||||||
|
&self,
|
||||||
|
thread_id: String,
|
||||||
|
run_id: String,
|
||||||
|
req: ModifyRunRequest,
|
||||||
|
) -> Result<RunObject, APIError> {
|
||||||
|
let res = self.post(&format!("/threads/{}/runs/{}", thread_id, run_id), &req)?;
|
||||||
|
let r = res.json::<RunObject>();
|
||||||
|
match r {
|
||||||
|
Ok(r) => Ok(r),
|
||||||
|
Err(e) => Err(self.new_error(e)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn list_run(
|
||||||
|
&self,
|
||||||
|
thread_id: String,
|
||||||
|
limit: Option<i64>,
|
||||||
|
order: Option<String>,
|
||||||
|
after: Option<String>,
|
||||||
|
before: Option<String>,
|
||||||
|
) -> Result<ListRun, APIError> {
|
||||||
|
let mut url = format!("/threads/{}/runs", thread_id);
|
||||||
|
url = Self::query_params(limit, order, after, before, url);
|
||||||
|
let res = self.get(&url)?;
|
||||||
|
let r = res.json::<ListRun>();
|
||||||
|
match r {
|
||||||
|
Ok(r) => Ok(r),
|
||||||
|
Err(e) => Err(self.new_error(e)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn cancel_run(&self, thread_id: String, run_id: String) -> Result<RunObject, APIError> {
|
||||||
|
let empty_req = ModifyRunRequest::new();
|
||||||
|
let res = self.post(
|
||||||
|
&format!("/threads/{}/runs/{}/cancel", thread_id, run_id),
|
||||||
|
&empty_req,
|
||||||
|
)?;
|
||||||
|
let r = res.json::<RunObject>();
|
||||||
|
match r {
|
||||||
|
Ok(r) => Ok(r),
|
||||||
|
Err(e) => Err(self.new_error(e)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn create_thread_and_run(
|
||||||
|
&self,
|
||||||
|
req: CreateThreadAndRunRequest,
|
||||||
|
) -> Result<RunObject, APIError> {
|
||||||
|
let res = self.post("/threads/runs", &req)?;
|
||||||
|
let r = res.json::<RunObject>();
|
||||||
|
match r {
|
||||||
|
Ok(r) => Ok(r),
|
||||||
|
Err(e) => Err(self.new_error(e)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn retrieve_run_step(
|
||||||
|
&self,
|
||||||
|
thread_id: String,
|
||||||
|
run_id: String,
|
||||||
|
step_id: String,
|
||||||
|
) -> Result<RunStepObject, APIError> {
|
||||||
|
let res = self.get(&format!(
|
||||||
|
"/threads/{}/runs/{}/steps/{}",
|
||||||
|
thread_id, run_id, step_id
|
||||||
|
))?;
|
||||||
|
let r = res.json::<RunStepObject>();
|
||||||
|
match r {
|
||||||
|
Ok(r) => Ok(r),
|
||||||
|
Err(e) => Err(self.new_error(e)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn list_run_step(
|
||||||
|
&self,
|
||||||
|
thread_id: String,
|
||||||
|
run_id: String,
|
||||||
|
limit: Option<i64>,
|
||||||
|
order: Option<String>,
|
||||||
|
after: Option<String>,
|
||||||
|
before: Option<String>,
|
||||||
|
) -> Result<ListRunStep, APIError> {
|
||||||
|
let mut url = format!("/threads/{}/runs/{}/steps", thread_id, run_id);
|
||||||
|
url = Self::query_params(limit, order, after, before, url);
|
||||||
|
let res = self.get(&url)?;
|
||||||
|
let r = res.json::<ListRunStep>();
|
||||||
|
match r {
|
||||||
|
Ok(r) => Ok(r),
|
||||||
|
Err(e) => Err(self.new_error(e)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn new_error(&self, err: minreq::Error) -> APIError {
|
fn new_error(&self, err: minreq::Error) -> APIError {
|
||||||
APIError {
|
APIError {
|
||||||
message: err.to_string(),
|
message: err.to_string(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn is_beta(path: &str) -> bool {
|
||||||
|
path.starts_with("/assistants") || path.starts_with("/threads")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn query_params(
|
||||||
|
limit: Option<i64>,
|
||||||
|
order: Option<String>,
|
||||||
|
after: Option<String>,
|
||||||
|
before: Option<String>,
|
||||||
|
mut url: String,
|
||||||
|
) -> String {
|
||||||
|
let mut params = vec![];
|
||||||
|
if let Some(limit) = limit {
|
||||||
|
params.push(format!("limit={}", limit));
|
||||||
|
}
|
||||||
|
if let Some(order) = order {
|
||||||
|
params.push(format!("order={}", order));
|
||||||
|
}
|
||||||
|
if let Some(after) = after {
|
||||||
|
params.push(format!("after={}", after));
|
||||||
|
}
|
||||||
|
if let Some(before) = before {
|
||||||
|
params.push(format!("before={}", before));
|
||||||
|
}
|
||||||
|
if !params.is_empty() {
|
||||||
|
url = format!("{}?{}", url, params.join("&"));
|
||||||
|
}
|
||||||
|
url
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
94
src/v1/assistant.rs
Normal file
94
src/v1/assistant.rs
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
use crate::impl_builder_methods;
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Clone)]
|
||||||
|
pub struct AssistantRequest {
|
||||||
|
pub model: String,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub name: Option<String>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub description: Option<String>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub instructions: Option<String>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub tools: Option<Vec<HashMap<String, String>>>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub file_ids: Option<Vec<String>>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub metadata: Option<HashMap<String, String>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl AssistantRequest {
|
||||||
|
pub fn new(model: String) -> Self {
|
||||||
|
Self {
|
||||||
|
model,
|
||||||
|
name: None,
|
||||||
|
description: None,
|
||||||
|
instructions: None,
|
||||||
|
tools: None,
|
||||||
|
file_ids: None,
|
||||||
|
metadata: None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl_builder_methods!(
|
||||||
|
AssistantRequest,
|
||||||
|
name: String,
|
||||||
|
description: String,
|
||||||
|
instructions: String,
|
||||||
|
tools: Vec<HashMap<String, String>>,
|
||||||
|
file_ids: Vec<String>,
|
||||||
|
metadata: HashMap<String, String>
|
||||||
|
);
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
|
pub struct AssistantObject {
|
||||||
|
pub id: String,
|
||||||
|
pub object: String,
|
||||||
|
pub created_at: i64,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub name: Option<String>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub description: Option<String>,
|
||||||
|
pub model: String,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub instructions: Option<String>,
|
||||||
|
pub tools: Vec<String>,
|
||||||
|
pub file_ids: Vec<String>,
|
||||||
|
pub metadata: HashMap<String, String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
|
pub struct DeletionStatus {
|
||||||
|
pub id: String,
|
||||||
|
pub object: String,
|
||||||
|
pub deleted: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
|
pub struct ListAssistant {
|
||||||
|
pub object: String,
|
||||||
|
pub data: Vec<AssistantObject>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Clone)]
|
||||||
|
pub struct AssistantFileRequest {
|
||||||
|
pub file_id: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
|
pub struct AssistantFileObject {
|
||||||
|
pub id: String,
|
||||||
|
pub object: String,
|
||||||
|
pub created_at: i64,
|
||||||
|
pub assistant_id: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
|
pub struct ListAssistantFile {
|
||||||
|
pub object: String,
|
||||||
|
pub data: Vec<AssistantFileObject>,
|
||||||
|
}
|
@ -4,7 +4,7 @@ use crate::impl_builder_methods;
|
|||||||
|
|
||||||
pub const WHISPER_1: &str = "whisper-1";
|
pub const WHISPER_1: &str = "whisper-1";
|
||||||
|
|
||||||
#[derive(Debug, Serialize)]
|
#[derive(Debug, Serialize, Clone)]
|
||||||
pub struct AudioTranscriptionRequest {
|
pub struct AudioTranscriptionRequest {
|
||||||
pub file: String,
|
pub file: String,
|
||||||
pub model: String,
|
pub model: String,
|
||||||
@ -44,7 +44,7 @@ pub struct AudioTranscriptionResponse {
|
|||||||
pub text: String,
|
pub text: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize)]
|
#[derive(Debug, Serialize, Clone)]
|
||||||
pub struct AudioTranslationRequest {
|
pub struct AudioTranslationRequest {
|
||||||
pub file: String,
|
pub file: String,
|
||||||
pub model: String,
|
pub model: String,
|
||||||
|
@ -6,35 +6,14 @@ use std::collections::HashMap;
|
|||||||
use crate::impl_builder_methods;
|
use crate::impl_builder_methods;
|
||||||
use crate::v1::common;
|
use crate::v1::common;
|
||||||
|
|
||||||
// https://platform.openai.com/docs/models/gpt-3-5
|
#[derive(Debug, Serialize, Clone)]
|
||||||
pub const GPT3_5_TURBO_1106: &str = "gpt-3.5-turbo-1106";
|
|
||||||
pub const GPT3_5_TURBO: &str = "gpt-3.5-turbo";
|
|
||||||
pub const GPT3_5_TURBO_16K: &str = "gpt-3.5-turbo-16k";
|
|
||||||
pub const GPT3_5_TURBO_INSTRUCT: &str = "gpt-3.5-turbo-instruct";
|
|
||||||
// - legacy
|
|
||||||
pub const GPT3_5_TURBO_0613: &str = "gpt-3.5-turbo-0613";
|
|
||||||
pub const GPT3_5_TURBO_16K_0613: &str = "gpt-3.5-turbo-16k-0613";
|
|
||||||
pub const GPT3_5_TURBO_0301: &str = "gpt-3.5-turbo-0301";
|
|
||||||
|
|
||||||
// https://platform.openai.com/docs/models/gpt-4-and-gpt-4-turbo
|
|
||||||
pub const GPT4_1106_PREVIEW: &str = "gpt-4-1106-preview";
|
|
||||||
pub const GPT4_VISION_PREVIEW: &str = "gpt-4-vision-preview";
|
|
||||||
pub const GPT4: &str = "gpt-4";
|
|
||||||
pub const GPT4_32K: &str = "gpt-4-32k";
|
|
||||||
pub const GPT4_0613: &str = "gpt-4-0613";
|
|
||||||
pub const GPT4_32K_0613: &str = "gpt-4-32k-0613";
|
|
||||||
// - legacy
|
|
||||||
pub const GPT4_0314: &str = "gpt-4-0314";
|
|
||||||
pub const GPT4_32K_0314: &str = "gpt-4-32k-0314";
|
|
||||||
|
|
||||||
#[derive(Debug, Serialize)]
|
|
||||||
pub enum FunctionCallType {
|
pub enum FunctionCallType {
|
||||||
None,
|
None,
|
||||||
Auto,
|
Auto,
|
||||||
Function { name: String },
|
Function { name: String },
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize)]
|
#[derive(Debug, Serialize, Clone)]
|
||||||
pub struct ChatCompletionRequest {
|
pub struct ChatCompletionRequest {
|
||||||
pub model: String,
|
pub model: String,
|
||||||
pub messages: Vec<ChatCompletionMessage>,
|
pub messages: Vec<ChatCompletionMessage>,
|
||||||
@ -153,7 +132,7 @@ pub struct ChatCompletionResponse {
|
|||||||
pub usage: common::Usage,
|
pub usage: common::Usage,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize)]
|
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||||
pub struct Function {
|
pub struct Function {
|
||||||
pub name: String,
|
pub name: String,
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
@ -161,7 +140,7 @@ pub struct Function {
|
|||||||
pub parameters: FunctionParameters,
|
pub parameters: FunctionParameters,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize)]
|
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||||
#[serde(rename_all = "lowercase")]
|
#[serde(rename_all = "lowercase")]
|
||||||
pub enum JSONSchemaType {
|
pub enum JSONSchemaType {
|
||||||
Object,
|
Object,
|
||||||
@ -172,7 +151,7 @@ pub enum JSONSchemaType {
|
|||||||
Boolean,
|
Boolean,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize)]
|
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||||
pub struct JSONSchemaDefine {
|
pub struct JSONSchemaDefine {
|
||||||
#[serde(rename = "type")]
|
#[serde(rename = "type")]
|
||||||
pub schema_type: Option<JSONSchemaType>,
|
pub schema_type: Option<JSONSchemaType>,
|
||||||
@ -188,7 +167,7 @@ pub struct JSONSchemaDefine {
|
|||||||
pub items: Option<Box<JSONSchemaDefine>>,
|
pub items: Option<Box<JSONSchemaDefine>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize)]
|
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||||
pub struct FunctionParameters {
|
pub struct FunctionParameters {
|
||||||
#[serde(rename = "type")]
|
#[serde(rename = "type")]
|
||||||
pub schema_type: JSONSchemaType,
|
pub schema_type: JSONSchemaType,
|
||||||
|
@ -20,3 +20,24 @@ macro_rules! impl_builder_methods {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// https://platform.openai.com/docs/models/gpt-3-5
|
||||||
|
pub const GPT3_5_TURBO_1106: &str = "gpt-3.5-turbo-1106";
|
||||||
|
pub const GPT3_5_TURBO: &str = "gpt-3.5-turbo";
|
||||||
|
pub const GPT3_5_TURBO_16K: &str = "gpt-3.5-turbo-16k";
|
||||||
|
pub const GPT3_5_TURBO_INSTRUCT: &str = "gpt-3.5-turbo-instruct";
|
||||||
|
// - legacy
|
||||||
|
pub const GPT3_5_TURBO_0613: &str = "gpt-3.5-turbo-0613";
|
||||||
|
pub const GPT3_5_TURBO_16K_0613: &str = "gpt-3.5-turbo-16k-0613";
|
||||||
|
pub const GPT3_5_TURBO_0301: &str = "gpt-3.5-turbo-0301";
|
||||||
|
|
||||||
|
// https://platform.openai.com/docs/models/gpt-4-and-gpt-4-turbo
|
||||||
|
pub const GPT4_1106_PREVIEW: &str = "gpt-4-1106-preview";
|
||||||
|
pub const GPT4_VISION_PREVIEW: &str = "gpt-4-vision-preview";
|
||||||
|
pub const GPT4: &str = "gpt-4";
|
||||||
|
pub const GPT4_32K: &str = "gpt-4-32k";
|
||||||
|
pub const GPT4_0613: &str = "gpt-4-0613";
|
||||||
|
pub const GPT4_32K_0613: &str = "gpt-4-32k-0613";
|
||||||
|
// - legacy
|
||||||
|
pub const GPT4_0314: &str = "gpt-4-0314";
|
||||||
|
pub const GPT4_32K_0314: &str = "gpt-4-32k-0314";
|
||||||
|
@ -18,7 +18,7 @@ pub const GPT3_CURIE: &str = "curie";
|
|||||||
pub const GPT3_ADA: &str = "ada";
|
pub const GPT3_ADA: &str = "ada";
|
||||||
pub const GPT3_BABBAGE: &str = "babbage";
|
pub const GPT3_BABBAGE: &str = "babbage";
|
||||||
|
|
||||||
#[derive(Debug, Serialize)]
|
#[derive(Debug, Serialize, Clone)]
|
||||||
pub struct CompletionRequest {
|
pub struct CompletionRequest {
|
||||||
pub model: String,
|
pub model: String,
|
||||||
pub prompt: String,
|
pub prompt: String,
|
||||||
|
@ -4,7 +4,7 @@ use std::option::Option;
|
|||||||
use crate::impl_builder_methods;
|
use crate::impl_builder_methods;
|
||||||
use crate::v1::common;
|
use crate::v1::common;
|
||||||
|
|
||||||
#[derive(Debug, Serialize)]
|
#[derive(Debug, Serialize, Clone)]
|
||||||
pub struct EditRequest {
|
pub struct EditRequest {
|
||||||
pub model: String,
|
pub model: String,
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
@ -10,7 +10,7 @@ pub struct EmbeddingData {
|
|||||||
pub index: i32,
|
pub index: i32,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize)]
|
#[derive(Debug, Serialize, Clone)]
|
||||||
pub struct EmbeddingRequest {
|
pub struct EmbeddingRequest {
|
||||||
pub model: String,
|
pub model: String,
|
||||||
pub input: String,
|
pub input: String,
|
||||||
|
@ -2,7 +2,7 @@ use serde::{Deserialize, Serialize};
|
|||||||
|
|
||||||
use crate::impl_builder_methods;
|
use crate::impl_builder_methods;
|
||||||
|
|
||||||
#[derive(Debug, Serialize)]
|
#[derive(Debug, Serialize, Clone)]
|
||||||
pub struct CreateFineTuneRequest {
|
pub struct CreateFineTuneRequest {
|
||||||
pub training_file: String,
|
pub training_file: String,
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
@ -8,7 +8,7 @@ pub struct ImageData {
|
|||||||
pub url: String,
|
pub url: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize)]
|
#[derive(Debug, Serialize, Clone)]
|
||||||
pub struct ImageGenerationRequest {
|
pub struct ImageGenerationRequest {
|
||||||
pub prompt: String,
|
pub prompt: String,
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
@ -47,7 +47,7 @@ pub struct ImageGenerationResponse {
|
|||||||
pub data: Vec<ImageData>,
|
pub data: Vec<ImageData>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize)]
|
#[derive(Debug, Serialize, Clone)]
|
||||||
pub struct ImageEditRequest {
|
pub struct ImageEditRequest {
|
||||||
pub image: String,
|
pub image: String,
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
@ -92,7 +92,7 @@ pub struct ImageEditResponse {
|
|||||||
pub data: Vec<ImageData>,
|
pub data: Vec<ImageData>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize)]
|
#[derive(Debug, Serialize, Clone)]
|
||||||
pub struct ImageVariationRequest {
|
pub struct ImageVariationRequest {
|
||||||
pub image: String,
|
pub image: String,
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
118
src/v1/message.rs
Normal file
118
src/v1/message.rs
Normal file
@ -0,0 +1,118 @@
|
|||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
use crate::impl_builder_methods;
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Clone)]
|
||||||
|
pub struct CreateMessageRequest {
|
||||||
|
pub role: MessageRole,
|
||||||
|
pub content: String,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub file_ids: Option<Vec<String>>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub metadata: Option<HashMap<String, String>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl CreateMessageRequest {
|
||||||
|
pub fn new(role: MessageRole, content: String) -> Self {
|
||||||
|
Self {
|
||||||
|
role,
|
||||||
|
content,
|
||||||
|
file_ids: None,
|
||||||
|
metadata: None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl_builder_methods!(
|
||||||
|
CreateMessageRequest,
|
||||||
|
file_ids: Vec<String>,
|
||||||
|
metadata: HashMap<String, String>
|
||||||
|
);
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Clone)]
|
||||||
|
pub struct ModifyMessageRequest {
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub metadata: Option<HashMap<String, String>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ModifyMessageRequest {
|
||||||
|
pub fn new() -> Self {
|
||||||
|
Self { metadata: None }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for ModifyMessageRequest {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::new()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl_builder_methods!(
|
||||||
|
ModifyMessageRequest,
|
||||||
|
metadata: HashMap<String, String>
|
||||||
|
);
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize)]
|
||||||
|
pub struct MessageObject {
|
||||||
|
pub id: String,
|
||||||
|
pub object: String,
|
||||||
|
pub created_at: i64,
|
||||||
|
pub thread_id: String,
|
||||||
|
pub role: MessageRole,
|
||||||
|
pub content: Vec<Content>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub assistant_id: Option<String>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub run_id: Option<String>,
|
||||||
|
pub file_ids: Vec<String>,
|
||||||
|
pub metadata: HashMap<String, String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||||
|
#[allow(non_camel_case_types)]
|
||||||
|
pub enum MessageRole {
|
||||||
|
user,
|
||||||
|
system,
|
||||||
|
assistant,
|
||||||
|
function,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize)]
|
||||||
|
pub struct Content {
|
||||||
|
#[serde(rename = "type")]
|
||||||
|
pub content_type: String,
|
||||||
|
pub text: ContentText,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize)]
|
||||||
|
pub struct ContentText {
|
||||||
|
pub value: String,
|
||||||
|
pub annotations: Vec<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize)]
|
||||||
|
pub struct ListMessage {
|
||||||
|
pub object: String,
|
||||||
|
pub data: Vec<MessageObject>,
|
||||||
|
pub first_id: String,
|
||||||
|
pub last_id: String,
|
||||||
|
pub has_more: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize)]
|
||||||
|
pub struct MessageFileObject {
|
||||||
|
pub id: String,
|
||||||
|
pub object: String,
|
||||||
|
pub created_at: i64,
|
||||||
|
pub message_id: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize)]
|
||||||
|
pub struct ListMessageFile {
|
||||||
|
pub object: String,
|
||||||
|
pub data: Vec<MessageFileObject>,
|
||||||
|
pub first_id: String,
|
||||||
|
pub last_id: String,
|
||||||
|
pub has_more: bool,
|
||||||
|
}
|
@ -11,4 +11,10 @@ pub mod fine_tune;
|
|||||||
pub mod image;
|
pub mod image;
|
||||||
pub mod moderation;
|
pub mod moderation;
|
||||||
|
|
||||||
|
// beta
|
||||||
|
pub mod assistant;
|
||||||
|
pub mod message;
|
||||||
|
pub mod run;
|
||||||
|
pub mod thread;
|
||||||
|
|
||||||
pub mod api;
|
pub mod api;
|
||||||
|
@ -2,7 +2,7 @@ use serde::{Deserialize, Serialize};
|
|||||||
|
|
||||||
use crate::impl_builder_methods;
|
use crate::impl_builder_methods;
|
||||||
|
|
||||||
#[derive(Debug, Serialize)]
|
#[derive(Debug, Serialize, Clone)]
|
||||||
pub struct CreateModerationRequest {
|
pub struct CreateModerationRequest {
|
||||||
pub input: String,
|
pub input: String,
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
150
src/v1/run.rs
Normal file
150
src/v1/run.rs
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
use super::thread::CreateThreadRequest;
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
use crate::impl_builder_methods;
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Clone)]
|
||||||
|
pub struct CreateRunRequest {
|
||||||
|
assistant_id: String,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub model: Option<String>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub instructions: Option<String>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub tools: Option<Vec<HashMap<String, String>>>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub metadata: Option<HashMap<String, String>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl CreateRunRequest {
|
||||||
|
pub fn new(assistant_id: String) -> Self {
|
||||||
|
Self {
|
||||||
|
assistant_id,
|
||||||
|
model: None,
|
||||||
|
instructions: None,
|
||||||
|
tools: None,
|
||||||
|
metadata: None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl_builder_methods!(
|
||||||
|
CreateRunRequest,
|
||||||
|
model: String,
|
||||||
|
instructions: String,
|
||||||
|
tools: Vec<HashMap<String, String>>,
|
||||||
|
metadata: HashMap<String, String>
|
||||||
|
);
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Clone)]
|
||||||
|
pub struct ModifyRunRequest {
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub metadata: Option<HashMap<String, String>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ModifyRunRequest {
|
||||||
|
pub fn new() -> Self {
|
||||||
|
Self { metadata: None }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for ModifyRunRequest {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::new()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl_builder_methods!(
|
||||||
|
ModifyRunRequest,
|
||||||
|
metadata: HashMap<String, String>
|
||||||
|
);
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize)]
|
||||||
|
pub struct RunObject {
|
||||||
|
pub id: String,
|
||||||
|
pub object: String,
|
||||||
|
pub created_at: i64,
|
||||||
|
pub thread_id: String,
|
||||||
|
pub assistant_id: String,
|
||||||
|
pub status: String,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub required_action: Option<HashMap<String, String>>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub last_error: Option<String>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub expires_at: Option<i64>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub started_at: Option<i64>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub cancelled_at: Option<i64>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub failed_at: Option<i64>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub completed_at: Option<i64>,
|
||||||
|
pub model: String,
|
||||||
|
pub instructions: Option<String>,
|
||||||
|
pub tools: Vec<HashMap<String, String>>,
|
||||||
|
pub file_ids: Vec<String>,
|
||||||
|
pub metadata: HashMap<String, String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize)]
|
||||||
|
pub struct ListRun {
|
||||||
|
pub object: String,
|
||||||
|
pub data: Vec<RunObject>,
|
||||||
|
pub first_id: String,
|
||||||
|
pub last_id: String,
|
||||||
|
pub has_more: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Clone)]
|
||||||
|
pub struct CreateThreadAndRunRequest {
|
||||||
|
pub assistant_id: String,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub thread: Option<CreateThreadRequest>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub model: Option<String>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub instructions: Option<String>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub tools: Option<Vec<HashMap<String, String>>>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub metadata: Option<HashMap<String, String>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize, Clone)]
|
||||||
|
pub struct RunStepObject {
|
||||||
|
pub id: String,
|
||||||
|
pub object: String,
|
||||||
|
pub created_at: i64,
|
||||||
|
pub assistant_id: String,
|
||||||
|
pub thread_id: String,
|
||||||
|
pub run_id: String,
|
||||||
|
#[serde(rename = "type")]
|
||||||
|
pub run_step_type: String,
|
||||||
|
pub status: String,
|
||||||
|
pub step_details: HashMap<String, String>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub last_error: Option<String>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub expires_at: Option<i64>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub started_at: Option<i64>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub cancelled_at: Option<i64>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub failed_at: Option<i64>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub completed_at: Option<i64>,
|
||||||
|
pub metadata: HashMap<String, String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize, Clone)]
|
||||||
|
pub struct ListRunStep {
|
||||||
|
pub object: String,
|
||||||
|
pub data: Vec<RunStepObject>,
|
||||||
|
pub first_id: String,
|
||||||
|
pub last_id: String,
|
||||||
|
pub has_more: bool,
|
||||||
|
}
|
83
src/v1/thread.rs
Normal file
83
src/v1/thread.rs
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
use crate::impl_builder_methods;
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Clone)]
|
||||||
|
pub struct CreateThreadRequest {
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub messages: Option<Vec<Message>>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub metadata: Option<HashMap<String, String>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl CreateThreadRequest {
|
||||||
|
pub fn new() -> Self {
|
||||||
|
Self {
|
||||||
|
messages: None,
|
||||||
|
metadata: None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for CreateThreadRequest {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::new()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl_builder_methods!(
|
||||||
|
CreateThreadRequest,
|
||||||
|
messages: Vec<Message>,
|
||||||
|
metadata: HashMap<String, String>
|
||||||
|
);
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
|
pub struct ThreadObject {
|
||||||
|
pub id: String,
|
||||||
|
pub object: String,
|
||||||
|
pub created_at: i64,
|
||||||
|
pub metadata: HashMap<String, String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||||
|
pub struct Message {
|
||||||
|
pub role: MessageRole,
|
||||||
|
pub content: String,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub file_ids: Option<String>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub metadata: Option<HashMap<String, String>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||||
|
#[allow(non_camel_case_types)]
|
||||||
|
pub enum MessageRole {
|
||||||
|
user,
|
||||||
|
system,
|
||||||
|
assistant,
|
||||||
|
function,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Clone)]
|
||||||
|
pub struct ModifyThreadRequest {
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub metadata: Option<HashMap<String, String>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ModifyThreadRequest {
|
||||||
|
pub fn new() -> Self {
|
||||||
|
Self { metadata: None }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for ModifyThreadRequest {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::new()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl_builder_methods!(
|
||||||
|
ModifyThreadRequest,
|
||||||
|
metadata: HashMap<String, String>
|
||||||
|
);
|
Reference in New Issue
Block a user