diff options
Diffstat (limited to 'src/config/role.rs')
| -rw-r--r-- | src/config/role.rs | 64 |
1 files changed, 36 insertions, 28 deletions
diff --git a/src/config/role.rs b/src/config/role.rs index 2a4b30c..27858a3 100644 --- a/src/config/role.rs +++ b/src/config/role.rs @@ -1,4 +1,5 @@ use super::Input; + use crate::{ client::{Message, MessageContent, MessageRole, Model}, utils::{detect_os, detect_shell}, @@ -18,10 +19,17 @@ pub const INPUT_PLACEHOLDER: &str = "__INPUT__"; pub struct Role { pub name: String, pub prompt: String, - #[serde(rename(serialize = "model", deserialize = "model"))] + #[serde( + rename(serialize = "model", deserialize = "model"), + skip_serializing_if = "Option::is_none" + )] pub model_id: Option<String>, + #[serde(skip_serializing_if = "Option::is_none")] pub temperature: Option<f64>, + #[serde(skip_serializing_if = "Option::is_none")] pub top_p: Option<f64>, + #[serde(skip_serializing_if = "Option::is_none")] + pub function_filter: Option<String>, } impl Role { @@ -32,12 +40,13 @@ impl Role { temperature: None, model_id: None, top_p: None, + function_filter: None, } } pub fn builtin() -> Vec<Role> { [ - (SHELL_ROLE, shell_prompt()), + (SHELL_ROLE, shell_prompt(), None), ( EXPLAIN_SHELL_ROLE, r#"Provide a terse, single sentence description of the given shell command. @@ -45,6 +54,7 @@ Describe each argument and option of the command. Provide short responses in about 80 words. APPLY MARKDOWN formatting when possible."# .into(), + None, ), ( CODE_ROLE, @@ -59,15 +69,18 @@ async function timeout(ms) { ``` "# .into(), + None, ), + ("%functions%", String::new(), Some(".*".into())), ] .into_iter() - .map(|(name, prompt)| Self { + .map(|(name, prompt, function_filter)| Self { name: name.into(), prompt, model_id: None, temperature: None, top_p: None, + function_filter, }) .collect() } @@ -78,7 +91,11 @@ async function timeout(ms) { Ok(output.trim_end().to_string()) } - pub fn embedded(&self) -> bool { + pub fn empty_prompt(&self) -> bool { + self.prompt.is_empty() + } + + pub fn embedded_prompt(&self) -> bool { self.prompt.contains(INPUT_PLACEHOLDER) } @@ -111,7 +128,9 @@ async function timeout(ms) { pub fn echo_messages(&self, input: &Input) -> String { let input_markdown = input.render(); - if self.embedded() { + if self.empty_prompt() { + input_markdown + } else if self.embedded_prompt() { self.prompt.replace(INPUT_PLACEHOLDER, &input_markdown) } else { format!("{}\n\n{}", self.prompt, input.render()) @@ -119,41 +138,30 @@ async function timeout(ms) { } pub fn build_messages(&self, input: &Input) -> Vec<Message> { - let mut content = input.to_message_content(); - - if self.embedded() { + let mut content = input.message_content(); + if self.empty_prompt() { + vec![Message::new(MessageRole::User, content)] + } else if self.embedded_prompt() { content.merge_prompt(|v: &str| self.prompt.replace(INPUT_PLACEHOLDER, v)); - vec![Message { - role: MessageRole::User, - content, - }] + vec![Message::new(MessageRole::User, content)] } else { let mut messages = vec![]; let (system, cases) = parse_structure_prompt(&self.prompt); if !system.is_empty() { - messages.push(Message { - role: MessageRole::System, - content: MessageContent::Text(system.to_string()), - }) + messages.push(Message::new( + MessageRole::System, + MessageContent::Text(system.to_string()), + )); } if !cases.is_empty() { messages.extend(cases.into_iter().flat_map(|(i, o)| { vec![ - Message { - role: MessageRole::User, - content: MessageContent::Text(i.to_string()), - }, - Message { - role: MessageRole::Assistant, - content: MessageContent::Text(o.to_string()), - }, + Message::new(MessageRole::User, MessageContent::Text(i.to_string())), + Message::new(MessageRole::Assistant, MessageContent::Text(o.to_string())), ] })); } - messages.push(Message { - role: MessageRole::User, - content, - }); + messages.push(Message::new(MessageRole::User, content)); messages } } |
