From e86ad7dc165ba19fbe01d822a54a9975e4b17862 Mon Sep 17 00:00:00 2001 From: sigoden Date: Mon, 30 Oct 2023 19:26:06 +0800 Subject: feat: add `.info role` and `.info session` (#183) --- src/config/mod.rs | 36 +++++++++++++++++------------------- src/config/session.rs | 37 ++++++++++++++++++++++++++++++++++++- 2 files changed, 53 insertions(+), 20 deletions(-) (limited to 'src/config') diff --git a/src/config/mod.rs b/src/config/mod.rs index e6d9238..9f4a11a 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -148,12 +148,16 @@ impl Config { Ok(config) } - pub fn get_role(&self, name: &str) -> Option { - self.roles.iter().find(|v| v.match_name(name)).map(|v| { - let mut role = v.clone(); - role.complete_prompt_args(name); - role - }) + pub fn retrieve_role(&self, name: &str) -> Result { + self.roles + .iter() + .find(|v| v.match_name(name)) + .map(|v| { + let mut role = v.clone(); + role.complete_prompt_args(name); + role + }) + .ok_or_else(|| anyhow!("Unknown role `{name}`")) } pub fn config_dir() -> Result { @@ -235,20 +239,14 @@ impl Config { Ok(path) } - pub fn set_role(&mut self, name: &str) -> Result { - match self.get_role(name) { - Some(role) => { - if let Some(session) = self.session.as_mut() { - session.update_role(Some(role.clone()))?; - } - let output = serde_yaml::to_string(&role) - .unwrap_or_else(|_| "Unable to echo role details".into()); - self.temperature = role.temperature; - self.role = Some(role); - Ok(output) - } - None => bail!("Unknown role `{name}`"), + pub fn set_role(&mut self, name: &str) -> Result<()> { + let role = self.retrieve_role(name)?; + if let Some(session) = self.session.as_mut() { + session.update_role(Some(role.clone()))?; } + self.temperature = role.temperature; + self.role = Some(role); + Ok(()) } pub fn clear_role(&mut self) -> Result<()> { diff --git a/src/config/session.rs b/src/config/session.rs index 75b863f..4cc172d 100644 --- a/src/config/session.rs +++ b/src/config/session.rs @@ -1,6 +1,8 @@ use super::message::{num_tokens_from_messages, Message, MessageRole}; use super::role::Role; +use crate::render::MarkdownRender; + use anyhow::{bail, Context, Result}; use serde::{Deserialize, Serialize}; use std::fs::{self, read_to_string}; @@ -52,13 +54,46 @@ impl Session { Ok(session) } - pub fn info(&self) -> Result { + pub fn export(&self) -> Result { self.guard_save()?; let output = serde_yaml::to_string(&self) .with_context(|| format!("Unable to show info about session {}", &self.name))?; Ok(output) } + pub fn render(&self, render: &mut MarkdownRender) -> Result { + let temperature = self + .temperature + .map_or_else(|| String::from("-"), |v| v.to_string()); + let items = vec![ + ("path", self.path.clone().unwrap_or_else(|| "-".into())), + ("model", self.model.clone()), + ("tokens", self.tokens.to_string()), + ("temperature", temperature), + ]; + let mut lines = vec![]; + for (name, value) in items { + lines.push(format!("{name:<20}{value}")); + } + lines.push("".into()); + for message in &self.messages { + match message.role { + MessageRole::System => { + continue; + } + MessageRole::Assistant => { + lines.push(render.render(&message.content)); + lines.push("".into()); + } + MessageRole::User => { + lines.push(format!("{}){}", self.name, message.content)); + } + } + } + let output = lines.join("\n"); + Ok(output) + } + pub fn update_role(&mut self, role: Option) -> Result<()> { self.guard_empty()?; self.temperature = role.as_ref().and_then(|v| v.temperature); -- cgit v1.2.3