
This pull request introduces a new tool for streaming edits. The short-term goal is for this tool to replace the existing `EditFileTool`, but we want to get this out the door as soon as possible so that we can start testing it. `StreamingEditFileTool` is mutually exclusive with `EditFileTool`. It will be enabled by default for anyone who has the `agent-stream-edits` feature flag, as well as people that set `assistant.stream_edits` to `true` in their settings. ### Implementation Streaming is achieved by requesting a completion while the `edit_file` tool gets called. We invoke the model by taking the existing conversation with the agent and appending a prompt specifically tailored for editing. In that prompt, we ask the model to produce a stream of `<old_text>`/`<new_text>` tags. As the model streams text in, we incrementally parse it and start editing as soon as we can. ### Evals Note that, as part of this pull request, I also defined some new evals that I used to drive the behavior of the recursive LLM call. To run them, use this command: ```bash cargo test --package=assistant_tools --features eval -- eval_extract_handle_command_output ``` Or comment out the `#[cfg_attr(not(feature = "eval"), ignore)]` macro. I recommend running them one at a time, because right now we don't really have a way of orchestrating of all these evals. I think we should invest into that effort once the new agent panel goes live. Release Notes: - N/A --------- Co-authored-by: Nathan Sobo <nathan@zed.dev> Co-authored-by: Bennet Bo Fenner <bennetbo@gmx.de> Co-authored-by: Oleksiy Syvokon <oleksiy.syvokon@gmail.com>
49 lines
1.6 KiB
Handlebars
49 lines
1.6 KiB
Handlebars
You are an expert text editor and your task is to produce a series of edits to a file given a description of the changes you need to make.
|
|
|
|
You MUST respond with a series of edits to that one file in the following format:
|
|
|
|
```
|
|
<edits>
|
|
|
|
<old_text>
|
|
OLD TEXT 1 HERE
|
|
</old_text>
|
|
<new_text>
|
|
NEW TEXT 1 HERE
|
|
</new_text>
|
|
|
|
<old_text>
|
|
OLD TEXT 2 HERE
|
|
</old_text>
|
|
<new_text>
|
|
NEW TEXT 2 HERE
|
|
</new_text>
|
|
|
|
<old_text>
|
|
OLD TEXT 3 HERE
|
|
</old_text>
|
|
<new_text>
|
|
NEW TEXT 3 HERE
|
|
</new_text>
|
|
|
|
</edits>
|
|
```
|
|
|
|
Rules for editing:
|
|
|
|
- `old_text` represents lines in the input file that will be replaced with `new_text`. `old_text` MUST exactly match the existing file content, character for character, including indentation.
|
|
- Always include enough context around the lines you want to replace in `old_text` such that it's impossible to mistake them for other lines.
|
|
- If you want to replace many occurrences of the same text, repeat the same `old_text`/`new_text` pair multiple times and I will apply them sequentially, one occurrence at a time.
|
|
- When reporting multiple edits, each edit assumes the previous one has already been applied! Therefore, you must ensure `old_text` doesn't reference text that has already been modified by a previous edit.
|
|
- Don't explain the edits, just report them.
|
|
- Only edit the file specified in `<file_to_edit>` and NEVER include edits to other files!
|
|
- If you open an <old_text> tag, you MUST close it using </old_text>
|
|
- If you open an <new_text> tag, you MUST close it using </new_text>
|
|
|
|
<file_to_edit>
|
|
{{path}}
|
|
</file_to_edit>
|
|
|
|
<edit_description>
|
|
{{edit_description}}
|
|
</edit_description>
|