
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>
32 lines
760 B
Rust
32 lines
760 B
Rust
use anyhow::Result;
|
|
use handlebars::Handlebars;
|
|
use rust_embed::RustEmbed;
|
|
use serde::Serialize;
|
|
use std::sync::Arc;
|
|
|
|
#[derive(RustEmbed)]
|
|
#[folder = "src/templates"]
|
|
#[include = "*.hbs"]
|
|
struct Assets;
|
|
|
|
pub struct Templates(Handlebars<'static>);
|
|
|
|
impl Templates {
|
|
pub fn new() -> Arc<Self> {
|
|
let mut handlebars = Handlebars::new();
|
|
handlebars.register_embed_templates::<Assets>().unwrap();
|
|
handlebars.register_escape_fn(|text| text.into());
|
|
Arc::new(Self(handlebars))
|
|
}
|
|
}
|
|
|
|
pub trait Template: Sized {
|
|
const TEMPLATE_NAME: &'static str;
|
|
|
|
fn render(&self, templates: &Templates) -> Result<String>
|
|
where
|
|
Self: Serialize + Sized,
|
|
{
|
|
Ok(templates.0.render(Self::TEMPLATE_NAME, self)?)
|
|
}
|
|
}
|