diff options
| author | sigoden <sigoden@gmail.com> | 2023-10-28 21:39:17 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-10-28 21:39:17 +0800 |
| commit | bc44026ff8828f532e9eba138e2ba35f7c247271 (patch) | |
| tree | 98c55ad31a543ff3cd56e297751d32ee9ca960a7 /src/config/conversation.rs | |
| parent | 1575d441724a27854c8f9fe1510a47a3050ae28d (diff) | |
| download | aichat-bc44026ff8828f532e9eba138e2ba35f7c247271.tar.gz | |
feat: enhance session/conversation (#162)
* feat: enhance session/conversation
* updates
* updates
* cut version v0.9.0-rc2
* add .session name completion
Diffstat (limited to 'src/config/conversation.rs')
| -rw-r--r-- | src/config/conversation.rs | 91 |
1 files changed, 0 insertions, 91 deletions
diff --git a/src/config/conversation.rs b/src/config/conversation.rs deleted file mode 100644 index b9a0793..0000000 --- a/src/config/conversation.rs +++ /dev/null @@ -1,91 +0,0 @@ -use super::message::{num_tokens_from_messages, Message, MessageRole}; -use super::role::Role; - -use anyhow::{bail, Result}; -use serde::{Deserialize, Serialize}; - -#[derive(Debug, Clone, Deserialize, Serialize)] -pub struct Conversation { - pub tokens: usize, - pub role: Option<Role>, - pub messages: Vec<Message>, -} - -impl Conversation { - pub fn new(role: Option<Role>) -> Self { - let mut value = Self { - tokens: 0, - role, - messages: vec![], - }; - value.update_tokens(); - value - } - - pub fn update_role(&mut self, role: &Role) -> Result<()> { - if self.messages.is_empty() { - self.role = Some(role.clone()); - self.update_tokens(); - } else { - bail!("Error: Cannot perform this action in the middle of conversation") - } - Ok(()) - } - - pub fn can_clear_role(&self) -> Result<()> { - if self.messages.is_empty() { - return Ok(()); - } - bail!("Error: Cannot perform this action in the middle of conversation") - } - - pub fn update_tokens(&mut self) { - self.tokens = num_tokens_from_messages(&self.build_emssages("")); - } - - #[allow(clippy::unnecessary_wraps)] - pub fn add_message(&mut self, input: &str, output: &str) -> Result<()> { - let mut need_add_msg = true; - if self.messages.is_empty() { - if let Some(role) = self.role.as_ref() { - self.messages.extend(role.build_messages(input)); - need_add_msg = false; - } - } - if need_add_msg { - self.messages.push(Message { - role: MessageRole::User, - content: input.to_string(), - }); - } - self.messages.push(Message { - role: MessageRole::Assistant, - content: output.to_string(), - }); - self.tokens = num_tokens_from_messages(&self.messages); - Ok(()) - } - - pub fn echo_messages(&self, content: &str) -> String { - let messages = self.build_emssages(content); - serde_yaml::to_string(&messages).unwrap_or_else(|_| "Unable to echo message".into()) - } - - pub fn build_emssages(&self, content: &str) -> Vec<Message> { - let mut messages = self.messages.clone(); - let mut need_add_msg = true; - if messages.is_empty() { - if let Some(role) = self.role.as_ref() { - messages = role.build_messages(content); - need_add_msg = false; - } - }; - if need_add_msg { - messages.push(Message { - role: MessageRole::User, - content: content.into(), - }); - } - messages - } -} |
