use std::path::Path;
use std::str::FromStr;
use ureq::{Agent, AgentBuilder};
use chrono::Local;
use reqwest::header::AUTHORIZATION;
use reqwest::{
header::{HeaderMap, HeaderValue},
Url,
};
use crate::converse::Conversation;
use crate::types::{ChatMessage, CompletionRequest, CompletionResponse, Role, ServerResponse};
#[derive(Debug, Clone)]
pub struct ChatGPT {
client: ureq::Agent,
token: String,
}
impl ChatGPT {
pub fn new<S: Into<String>>(api_key: S) -> crate::Result<Self> {
let api_key = api_key.into();
let token = format!("Bearer {api_key}");
let client = AgentBuilder::new().build();
Ok(Self { client, token})
}
pub fn new_conversation(&self) -> Conversation {
self.new_conversation_directed(format!("You are ChatGPT, an AI model developed by OpenAI. Answer as concisely as possible. Today is: {0}", Local::now().format("%d/%m/%Y %H:%M")))
}
pub fn new_conversation_directed<S: Into<String>>(&self, direction_message: S) -> Conversation {
Conversation::new(self.clone(), direction_message.into())
}
pub fn send_history(
&self,
history: &Vec<ChatMessage>,
) -> String {
let response = self
.client
.post("https://api.openai.com/v1/chat/completions")
.set("Authorization", &self.token)
.send_json(ureq::json!({
"model": "gpt-3.5-turbo",
"rust": true,
"messages": history
}))
.unwrap()
.into_string();
response.unwrap_or_default()
}
pub fn send_message<S: Into<String>>(
&self,
message: S,
) -> Result<CompletionResponse, ureq::Error> {
let response: CompletionResponse = self
.client
.post("https://api.openai.com/v1/chat/completions")
.set("Authorization", &self.token)
.send_json(ureq::json!({
"model": "gpt-3.5-turbo",
"messages": &vec![ChatMessage {
role: Role::User,
content: message.into(),
}],
}))
.unwrap()
.into_json()?;
Ok(response)
}
}