summaryrefslogtreecommitdiffstats
path: root/src/config/session.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/config/session.rs')
-rw-r--r--src/config/session.rs37
1 files changed, 36 insertions, 1 deletions
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);