summaryrefslogtreecommitdiffstats
path: root/src/config
diff options
context:
space:
mode:
authorsigoden <sigoden@gmail.com>2023-10-30 19:26:06 +0800
committerGitHub <noreply@github.com>2023-10-30 19:26:06 +0800
commite86ad7dc165ba19fbe01d822a54a9975e4b17862 (patch)
treea9c953d4e48cde477af329fc1434fb7a410213db /src/config
parent42339fac423136fb647c52429d7dd2228144ec98 (diff)
downloadaichat-e86ad7dc165ba19fbe01d822a54a9975e4b17862.tar.gz
feat: add `.info role` and `.info session` (#183)
Diffstat (limited to 'src/config')
-rw-r--r--src/config/mod.rs36
-rw-r--r--src/config/session.rs37
2 files changed, 53 insertions, 20 deletions
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<Role> {
- 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<Role> {
+ 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<PathBuf> {
@@ -235,20 +239,14 @@ impl Config {
Ok(path)
}
- pub fn set_role(&mut self, name: &str) -> Result<String> {
- 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<String> {
+ pub fn export(&self) -> Result<String> {
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<String> {
+ 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<Role>) -> Result<()> {
self.guard_empty()?;
self.temperature = role.as_ref().and_then(|v| v.temperature);