Skip to content

Commit

Permalink
mediate conversation with OpenAI
Browse files Browse the repository at this point in the history
  • Loading branch information
Charlie Bacon committed Jun 11, 2024
1 parent 9a9656c commit 5f9cb8b
Show file tree
Hide file tree
Showing 6 changed files with 56 additions and 79 deletions.
61 changes: 7 additions & 54 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 1 addition & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,4 @@ teloxide = { version = "0.12", features = ["macros"] }
log = "0.4"
pretty_env_logger = "0.4"
tokio = { version = "1.38", features = ["rt-multi-thread", "macros"] }
chrono = "0.4.38"
tokio-stream = "0.1.15"
string-builder = "0.2.0"
4 changes: 2 additions & 2 deletions src/bot.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use crate::gpt;
use crate::{consts, gpt};
use std::{collections::VecDeque, sync::Arc};
use teloxide::{prelude::*, utils::command::BotCommands};
use tokio::sync::RwLock;
Expand Down Expand Up @@ -59,7 +59,7 @@ pub async fn handle_commands(

pub async fn handle_messages(messages: Messages, msg: Message) -> ResponseResult<()> {
let mut messages_lock = messages.write().await;
if messages_lock.len() == 100 {
if messages_lock.len() == consts::STORE_CAPACITY {
messages_lock.pop_front();
}
messages_lock.push_back(msg.clone());
Expand Down
3 changes: 2 additions & 1 deletion src/consts.rs
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
pub const PERSONALITY: &str= "Eres un asistente andaluz con jerga informal y algo irónica. Ayudas a todo aquel que te necesite, no sin antes quejarte un poco, ya que eres algo vago.";
pub const STORE_CAPACITY: usize = 100;
pub const MEDIATE_QUERY: &str= "A partir de los siguientes mensajes, analiza una posible discusión y da la razón a alguno de los implicados, con una pequeña argumentación.";
pub const STORE_CAPACITY: usize = 200;
48 changes: 37 additions & 11 deletions src/gpt.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ use async_openai::{
Client,
};
use std::{env, error::Error};
use string_builder::Builder;

pub async fn ask(question: String) -> Result<String, Box<dyn Error>> {
let client = init_gpt_client()?;
Expand Down Expand Up @@ -35,20 +36,45 @@ pub async fn ask(question: String) -> Result<String, Box<dyn Error>> {
}
}

// TODO: Better user and message handling
pub async fn mediate(messages: Messages) -> Result<String, Box<dyn Error>> {
let messages_lock = messages.read().await;

let texts_array: Vec<(String, String)> = messages_lock
.iter()
.map(|message| {
(
message.from().unwrap().full_name(),
String::from(message.text().unwrap()),
)
})
.collect();

Ok(format!("{:#?}", texts_array))
let mut conversation = Builder::default();
let _ = messages_lock.iter().map(|message| {
conversation.append(message.from().unwrap().full_name());
conversation.append(": ");
conversation.append(message.text().unwrap());
conversation.append("\n");
});
drop(messages_lock);

let client = init_gpt_client()?;
let request = CreateChatCompletionRequestArgs::default()
.model("gpt-4o")
.max_tokens(4096u16)
.messages(vec![
ChatCompletionRequestSystemMessageArgs::default()
.content(crate::consts::PERSONALITY)
.build()?
.into(),
ChatCompletionRequestSystemMessageArgs::default()
.content(crate::consts::MEDIATE_QUERY)
.build()?
.into(),
ChatCompletionRequestSystemMessageArgs::default()
.content(conversation.string().unwrap())
.build()?
.into(),
])
.build()?;

let response = client.chat().create(request).await?;

match &response.choices[0].message.content {
Some(msg) => Ok(String::from(msg)),
None => Err("No response given".into()),
}
}

fn init_gpt_client() -> Result<Client<OpenAIConfig>, Box<dyn Error>> {
Expand Down
16 changes: 7 additions & 9 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,13 @@ async fn main() {
crate::consts::STORE_CAPACITY,
)));

let handler = Update::filter_message().branch(
dptree::entry()
.branch(
Update::filter_message()
.filter_command::<bot::Command>()
.endpoint(bot::handle_commands),
)
.branch(Update::filter_message().endpoint(bot::handle_messages)),
);
let handler = dptree::entry()
.branch(
Update::filter_message()
.filter_command::<bot::Command>()
.endpoint(bot::handle_commands),
)
.branch(Update::filter_message().endpoint(bot::handle_messages));

Dispatcher::builder(bot, handler)
.dependencies(dptree::deps![messages_store])
Expand Down

0 comments on commit 5f9cb8b

Please sign in to comment.