Skip to content

Commit

Permalink
feat: replace prompt for ollama smaller models (#1021)
Browse files Browse the repository at this point in the history
  • Loading branch information
michaelneale authored Feb 6, 2025
1 parent a51f453 commit 91ab336
Showing 1 changed file with 71 additions and 1 deletion.
72 changes: 71 additions & 1 deletion crates/goose/src/providers/ollama.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ use crate::model::ModelConfig;
use crate::providers::formats::openai::{create_request, get_usage, response_to_message};
use anyhow::Result;
use async_trait::async_trait;
use indoc::formatdoc;
use mcp_core::tool::Tool;
use reqwest::Client;
use serde_json::Value;
Expand Down Expand Up @@ -115,9 +116,78 @@ impl Provider for OllamaProvider {
messages: &[Message],
tools: &[Tool],
) -> Result<(Message, ProviderUsage), ProviderError> {
// Transform the system message to replace developer instructions
let modified_system = if let Some(dev_section) = system.split("## developer").nth(1) {
if let (Some(start_idx), Some(end_idx)) = (
dev_section.find("### Instructions"),
dev_section.find("operating system:"),
) {
let new_instructions = formatdoc! {r#"
The Developer extension enables you to edit code files, execute shell commands, and capture screen/window content. These tools allow for various development and debugging workflows.
Available Tools:
1. Shell Execution (`shell`)
Executes commands in the shell and returns the combined output and error messages.
Use cases:
- Running scripts: `python script.py`
- Installing dependencies: `pip install -r requirements.txt`
- Checking system information: `uname -a`, `df -h`
- Searching for files or text: **Use `rg` (ripgrep) instead of `find` or `ls -r`**
- Find a file: `rg --files | rg example.py`
- Search within files: `rg 'class Example'`
Best Practices:
- **Avoid commands with large output** (pipe them to a file if necessary).
- **Run background processes** if they take a long time (e.g., `uvicorn main:app &`).
- **git commands can be run on the shell, however if the git extension is installed, you should use the git tool instead.
- **If the shell command is a rm, mv, or cp, you should verify with the user before running the command.
2. Text Editor (`text_editor`)
Performs file-based operations such as viewing, writing, replacing text, and undoing edits.
Commands:
- view: Read the content of a file.
- write: Create or overwrite a file. Caution: Overwrites the entire file!
- str_replace: Replace a specific string in a file.
- undo_edit: Revert the last edit.
Example Usage:
text_editor(command="view", file_path="/absolute/path/to/file.py")
text_editor(command="write", file_path="/absolute/path/to/file.py", file_text="print('hello world')")
text_editor(command="str_replace", file_path="/absolute/path/to/file.py", old_str="hello world", new_str="goodbye world")
text_editor(command="undo_edit", file_path="/absolute/path/to/file.py")
Protocol for Text Editor:
For edit and replace commands, please verify what you are editing with the user before running the command.
- User: "Please edit the file /absolute/path/to/file.py"
- Assistant: "Ok sounds good, I'll be editing the file /absolute/path/to/file.py and creating modifications xyz to the file. Let me know whether you'd like to proceed."
- User: "Yes, please proceed."
- Assistant: "I've created the modifications xyz to the file /absolute/path/to/file.py"
3. List Windows (`list_windows`)
Lists all visible windows with their titles.
Use this to find window titles for screen capture.
4. Screen Capture (`screen_capture`)
Takes a screenshot of a display or specific window.
Options:
- Capture display: `screen_capture(display=0)` # Main display
- Capture window: `screen_capture(window_title="Window Title")`
Info: at the start of the session, the user's directory is:
"#};

let before_dev = system.split("## developer").next().unwrap_or("");
let after_marker = &dev_section[end_idx..];

format!(
"{}## developer{}### Instructions\n{}{}",
before_dev,
&dev_section[..start_idx],
new_instructions,
after_marker
)
} else {
system.to_string()
}
} else {
system.to_string()
};

let payload = create_request(
&self.model,
system,
&modified_system,
messages,
tools,
&super::utils::ImageFormat::OpenAi,
Expand Down

0 comments on commit 91ab336

Please sign in to comment.