Base Template
This commit is contained in:
commit
35ced4fea7
|
@ -0,0 +1 @@
|
|||
/target
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,10 @@
|
|||
[package]
|
||||
name = "rust_gpt_assistant"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
async-openai = "0.17.1"
|
||||
tokio = { version = "1.35.0", features = ["full", "rt-multi-thread"] }
|
|
@ -0,0 +1,154 @@
|
|||
use async_openai::{
|
||||
types::{CreateMessageRequestArgs, CreateRunRequestArgs, CreateThreadRequestArgs, RunStatus, MessageContent, CreateAssistantRequestArgs},
|
||||
Client,
|
||||
};
|
||||
use std::error::Error;
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() -> Result<(), Box<dyn Error>> {
|
||||
let query = [("limit", "1")]; //limit the list responses to 1 message
|
||||
|
||||
//create a client
|
||||
let client = Client::new();
|
||||
|
||||
//create a thread for the conversation
|
||||
let thread_request = CreateThreadRequestArgs::default().build()?;
|
||||
let thread = client.threads().create(thread_request.clone()).await?;
|
||||
|
||||
//ask the user for the name of the assistant
|
||||
println!("--- Enter the name of your assistant");
|
||||
//get user input
|
||||
let mut assistant_name = String::new();
|
||||
std::io::stdin().read_line(&mut assistant_name).unwrap();
|
||||
|
||||
//ask the user for the instruction set for the assistant
|
||||
println!("--- Enter the instruction set for your new assistant");
|
||||
//get user input
|
||||
let mut instructions = String::new();
|
||||
std::io::stdin().read_line(&mut instructions).unwrap();
|
||||
|
||||
//create the assistant
|
||||
let assistant_request = CreateAssistantRequestArgs::default()
|
||||
.name(&assistant_name)
|
||||
.instructions(&instructions)
|
||||
.model("gpt-3.5-turbo-1106")
|
||||
.build()?;
|
||||
let assistant = client.assistants().create(assistant_request).await?;
|
||||
//get the id of the assistant
|
||||
let assistant_id = &assistant.id;
|
||||
|
||||
loop{
|
||||
println!("--- How can I help you?");
|
||||
//get user input
|
||||
let mut input = String::new();
|
||||
std::io::stdin().read_line(&mut input).unwrap();
|
||||
|
||||
//break out of the loop if the user enters exit()
|
||||
if input.trim() == "exit()" {
|
||||
break;
|
||||
}
|
||||
|
||||
//create a message for the thread
|
||||
let message = CreateMessageRequestArgs::default()
|
||||
.role("user")
|
||||
.content(input.clone())
|
||||
.build()?;
|
||||
|
||||
//attach message to the thread
|
||||
let _message_obj = client
|
||||
.threads()
|
||||
.messages(&thread.id)
|
||||
.create(message)
|
||||
.await?;
|
||||
|
||||
//create a run for the thread
|
||||
let run_request = CreateRunRequestArgs::default()
|
||||
.assistant_id(assistant_id)
|
||||
.build()?;
|
||||
let run = client
|
||||
.threads()
|
||||
.runs(&thread.id)
|
||||
.create(run_request)
|
||||
.await?;
|
||||
|
||||
//wait for the run to complete
|
||||
let mut awaiting_response = true;
|
||||
while awaiting_response {
|
||||
//retrieve the run
|
||||
let run = client
|
||||
.threads()
|
||||
.runs(&thread.id)
|
||||
.retrieve(&run.id)
|
||||
.await?;
|
||||
//check the status of the run
|
||||
match run.status {
|
||||
RunStatus::Completed => {
|
||||
awaiting_response = false;
|
||||
// once the run is completed we
|
||||
// get the response from the run
|
||||
// which will be the first message
|
||||
// in the thread
|
||||
|
||||
//retrieve the response from the run
|
||||
let response = client
|
||||
.threads()
|
||||
.messages(&thread.id)
|
||||
.list(&query)
|
||||
.await?;
|
||||
//get the message id from the response
|
||||
let message_id = response
|
||||
.data.get(0).unwrap()
|
||||
.id.clone();
|
||||
//get the message from the response
|
||||
let message = client
|
||||
.threads()
|
||||
.messages(&thread.id)
|
||||
.retrieve(&message_id)
|
||||
.await?;
|
||||
//get the content from the message
|
||||
let content = message
|
||||
.content.get(0).unwrap();
|
||||
//get the text from the content
|
||||
let text = match content {
|
||||
MessageContent::Text(text) => text.text.value.clone(),
|
||||
MessageContent::ImageFile(_) => panic!("imaged are not supported in the terminal"),
|
||||
};
|
||||
//print the text
|
||||
println!("--- Response: {}", text);
|
||||
println!("");
|
||||
|
||||
}
|
||||
RunStatus::Failed => {
|
||||
awaiting_response = false;
|
||||
println!("--- Run Failed: {:#?}", run);
|
||||
}
|
||||
RunStatus::Queued => {
|
||||
println!("--- Run Queued");
|
||||
},
|
||||
RunStatus::Cancelling => {
|
||||
println!("--- Run Cancelling");
|
||||
},
|
||||
RunStatus::Cancelled => {
|
||||
println!("--- Run Cancelled");
|
||||
},
|
||||
RunStatus::Expired => {
|
||||
println!("--- Run Expired");
|
||||
},
|
||||
RunStatus::RequiresAction => {
|
||||
println!("--- Run Requires Action");
|
||||
},
|
||||
RunStatus::InProgress => {
|
||||
println!("--- Waiting for response...");
|
||||
}
|
||||
}
|
||||
//wait for 1 second before checking the status again
|
||||
std::thread::sleep(std::time::Duration::from_secs(1));
|
||||
}
|
||||
}
|
||||
|
||||
//once we have broken from the main loop we can delete the assistant and thread
|
||||
client.assistants().delete(assistant_id).await?;
|
||||
client.threads().delete(&thread.id).await?;
|
||||
|
||||
Ok(())
|
||||
}
|
Loading…
Reference in New Issue