mirror of
https://github.com/aaif-goose/goose.git
synced 2026-07-03 14:10:03 +02:00
Small model naming (#7394)
Co-authored-by: Douwe Osinga <douwe@squareup.com>
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
Generate a short title (four words or less) that describes the topic of the user's messages. Reply with only the title, nothing else.
|
||||
Generate a short title (four words or less) that describes the topic of the user's messages.
|
||||
Reply with only the title, nothing else. Do not show your reasoning.
|
||||
|
||||
Examples:
|
||||
- "how do I reverse a list in python?" → Python list reversal
|
||||
|
||||
@@ -33,6 +33,58 @@ fn strip_xml_tags(text: &str) -> String {
|
||||
TAG_RE.replace_all(&pass1, "").into_owned()
|
||||
}
|
||||
|
||||
fn extract_short_title(text: &str) -> String {
|
||||
let word_count = text.split_whitespace().count();
|
||||
if word_count <= 8 {
|
||||
return text.to_string();
|
||||
}
|
||||
|
||||
{
|
||||
let mut results = Vec::new();
|
||||
let mut quote_char: Option<char> = None;
|
||||
let mut current = String::new();
|
||||
let mut prev_char: Option<char> = None;
|
||||
|
||||
for ch in text.chars() {
|
||||
match quote_char {
|
||||
None => {
|
||||
if matches!(ch, '"' | '\'' | '`') {
|
||||
let after_alnum = prev_char.map(|p| p.is_alphanumeric()).unwrap_or(false);
|
||||
if !after_alnum {
|
||||
quote_char = Some(ch);
|
||||
current.clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
Some(q) => {
|
||||
if ch == q {
|
||||
let trimmed = current.trim().to_string();
|
||||
let wc = trimmed.split_whitespace().count();
|
||||
if (2..=8).contains(&wc) {
|
||||
results.push(trimmed);
|
||||
}
|
||||
quote_char = None;
|
||||
current.clear();
|
||||
} else {
|
||||
current.push(ch);
|
||||
}
|
||||
}
|
||||
}
|
||||
prev_char = Some(ch);
|
||||
}
|
||||
|
||||
if let Some(title) = results.last() {
|
||||
return title.clone();
|
||||
}
|
||||
}
|
||||
|
||||
if let Some(last) = text.lines().rev().find(|l| !l.trim().is_empty()) {
|
||||
return last.trim().to_string();
|
||||
}
|
||||
|
||||
text.to_string()
|
||||
}
|
||||
|
||||
/// A global store for the current model being used, we use this as when a provider returns, it tells us the real model, not an alias
|
||||
pub static CURRENT_MODEL: Lazy<Mutex<Option<String>>> = Lazy::new(|| Mutex::new(None));
|
||||
|
||||
@@ -632,7 +684,7 @@ pub trait Provider: Send + Sync {
|
||||
.collect::<Vec<_>>()
|
||||
.join(" ");
|
||||
|
||||
Ok(safe_truncate(&description, 100))
|
||||
Ok(safe_truncate(&extract_short_title(&description), 100))
|
||||
}
|
||||
|
||||
/// Configure OAuth authentication for this provider
|
||||
@@ -752,6 +804,60 @@ mod tests {
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_extract_short_title() {
|
||||
assert_eq!(extract_short_title("List files"), "List files");
|
||||
assert_eq!(
|
||||
extract_short_title(
|
||||
r#"blah blah blah blah blah blah blah blah blah "List files in folder""#
|
||||
),
|
||||
"List files in folder"
|
||||
);
|
||||
assert_eq!(
|
||||
extract_short_title(
|
||||
"blah blah blah blah blah blah blah blah blah `View current files`"
|
||||
),
|
||||
"View current files"
|
||||
);
|
||||
assert_eq!(
|
||||
extract_short_title(
|
||||
r#"stuff stuff stuff stuff stuff stuff stuff stuff "Abc title" "Zzz title""#
|
||||
),
|
||||
"Zzz title"
|
||||
);
|
||||
assert_eq!(
|
||||
extract_short_title(
|
||||
"long long long long long long long long long\nList files in folder"
|
||||
),
|
||||
"List files in folder"
|
||||
);
|
||||
assert_eq!(
|
||||
extract_short_title(
|
||||
r#"lots of words here and there and more and more "single" final line here"#
|
||||
),
|
||||
"lots of words here and there and more and more \"single\" final line here"
|
||||
);
|
||||
assert_eq!(extract_short_title("Hello world"), "Hello world");
|
||||
assert_eq!(
|
||||
extract_short_title(
|
||||
r#"1. Analyze the request. 2. The user's message says list files. 3. "List current folder files" fits perfectly. Result: List current folder files"#
|
||||
),
|
||||
"List current folder files"
|
||||
);
|
||||
assert_eq!(
|
||||
extract_short_title(
|
||||
r#"the user's phrasing is about listing files and the user's intent is clear. "List folder files" is best"#
|
||||
),
|
||||
"List folder files"
|
||||
);
|
||||
assert_eq!(
|
||||
extract_short_title(
|
||||
"lots of reasoning here about what to call it\nList current folder files"
|
||||
),
|
||||
"List current folder files"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_usage_creation() {
|
||||
let usage = Usage::new(Some(10), Some(20), Some(30));
|
||||
|
||||
Reference in New Issue
Block a user