Use tool calling instead of XML parsing to generate edit operations (#15385)
Release Notes: - N/A --------- Co-authored-by: Nathan <nathan@zed.dev>
This commit is contained in:
co-authored by
Nathan
parent
f6012cd86e
commit
6e1f7c6e1d
@@ -26,7 +26,9 @@ anyhow.workspace = true
|
||||
futures.workspace = true
|
||||
gpui.workspace = true
|
||||
language_model.workspace = true
|
||||
schemars.workspace = true
|
||||
serde.workspace = true
|
||||
serde_json.workspace = true
|
||||
settings.workspace = true
|
||||
smol.workspace = true
|
||||
ui.workspace = true
|
||||
|
||||
@@ -3,10 +3,13 @@ use futures::{future::BoxFuture, stream::BoxStream, StreamExt};
|
||||
use gpui::{AppContext, Global, Model, ModelContext, Task};
|
||||
use language_model::{
|
||||
LanguageModel, LanguageModelProvider, LanguageModelProviderId, LanguageModelRegistry,
|
||||
LanguageModelRequest,
|
||||
LanguageModelRequest, LanguageModelTool,
|
||||
};
|
||||
use smol::lock::{Semaphore, SemaphoreGuardArc};
|
||||
use std::{pin::Pin, sync::Arc, task::Poll};
|
||||
use smol::{
|
||||
future::FutureExt,
|
||||
lock::{Semaphore, SemaphoreGuardArc},
|
||||
};
|
||||
use std::{future, pin::Pin, sync::Arc, task::Poll};
|
||||
use ui::Context;
|
||||
|
||||
pub fn init(cx: &mut AppContext) {
|
||||
@@ -143,11 +146,11 @@ impl LanguageModelCompletionProvider {
|
||||
&self,
|
||||
request: LanguageModelRequest,
|
||||
cx: &AppContext,
|
||||
) -> Option<BoxFuture<'static, Result<usize>>> {
|
||||
) -> BoxFuture<'static, Result<usize>> {
|
||||
if let Some(model) = self.active_model() {
|
||||
Some(model.count_tokens(request, cx))
|
||||
model.count_tokens(request, cx)
|
||||
} else {
|
||||
None
|
||||
future::ready(Err(anyhow!("no active model"))).boxed()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -183,6 +186,29 @@ impl LanguageModelCompletionProvider {
|
||||
Ok(completion)
|
||||
})
|
||||
}
|
||||
|
||||
pub fn use_tool<T: LanguageModelTool>(
|
||||
&self,
|
||||
request: LanguageModelRequest,
|
||||
cx: &AppContext,
|
||||
) -> Task<Result<T>> {
|
||||
if let Some(language_model) = self.active_model() {
|
||||
cx.spawn(|cx| async move {
|
||||
let schema = schemars::schema_for!(T);
|
||||
let schema_json = serde_json::to_value(&schema).unwrap();
|
||||
let request =
|
||||
language_model.use_tool(request, T::name(), T::description(), schema_json, &cx);
|
||||
let response = request.await?;
|
||||
Ok(serde_json::from_value(response)?)
|
||||
})
|
||||
} else {
|
||||
Task::ready(Err(anyhow!("No active model set")))
|
||||
}
|
||||
}
|
||||
|
||||
pub fn active_model_telemetry_id(&self) -> Option<String> {
|
||||
self.active_model.as_ref().map(|m| m.telemetry_id())
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
|
||||
Reference in New Issue
Block a user