summaryrefslogtreecommitdiffstats
path: root/src/config/role.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/config/role.rs')
-rw-r--r--src/config/role.rs64
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
}
}