Detailed changes
@@ -531,6 +531,7 @@ dependencies = [
"workspace",
"workspace-hack",
"zed_actions",
+ "zed_llm_client",
]
[[package]]
@@ -5043,6 +5044,7 @@ dependencies = [
"util",
"uuid",
"workspace-hack",
+ "zed_llm_client",
]
[[package]]
@@ -6146,6 +6148,7 @@ dependencies = [
"workspace",
"workspace-hack",
"zed_actions",
+ "zed_llm_client",
]
[[package]]
@@ -19888,9 +19891,9 @@ dependencies = [
[[package]]
name = "zed_llm_client"
-version = "0.8.2"
+version = "0.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9be71e2f9b271e1eb8eb3e0d986075e770d1a0a299fb036abc3f1fc13a2fa7eb"
+checksum = "de7d9523255f4e00ee3d0918e5407bd252d798a4a8e71f6d37f23317a1588203"
dependencies = [
"anyhow",
"serde",
@@ -616,7 +616,7 @@ wasmtime-wasi = "29"
which = "6.0.0"
wit-component = "0.221"
workspace-hack = "0.1.0"
-zed_llm_client = "0.8.2"
+zed_llm_client = "0.8.4"
zstd = "0.11"
[workspace.dependencies.async-stripe]
@@ -54,6 +54,7 @@ use util::ResultExt as _;
use util::markdown::MarkdownCodeBlock;
use workspace::Workspace;
use zed_actions::assistant::OpenRulesLibrary;
+use zed_llm_client::CompletionIntent;
pub struct ActiveThread {
context_store: Entity<ContextStore>,
@@ -1412,6 +1413,7 @@ impl ActiveThread {
let request = language_model::LanguageModelRequest {
thread_id: None,
prompt_id: None,
+ intent: None,
mode: None,
messages: vec![request_message],
tools: vec![],
@@ -1573,7 +1575,12 @@ impl ActiveThread {
this.thread.update(cx, |thread, cx| {
thread.advance_prompt_id();
- thread.send_to_model(model.model, Some(window.window_handle()), cx);
+ thread.send_to_model(
+ model.model,
+ CompletionIntent::UserPrompt,
+ Some(window.window_handle()),
+ cx,
+ );
});
this._load_edited_message_context_task = None;
cx.notify();
@@ -34,6 +34,7 @@ use std::{
};
use streaming_diff::{CharOperation, LineDiff, LineOperation, StreamingDiff};
use telemetry_events::{AssistantEventData, AssistantKind, AssistantPhase};
+use zed_llm_client::CompletionIntent;
pub struct BufferCodegen {
alternatives: Vec<Entity<CodegenAlternative>>,
@@ -464,6 +465,7 @@ impl CodegenAlternative {
LanguageModelRequest {
thread_id: None,
prompt_id: None,
+ intent: Some(CompletionIntent::InlineAssist),
mode: None,
tools: Vec::new(),
tool_choice: None,
@@ -41,6 +41,7 @@ use theme::ThemeSettings;
use ui::{Disclosure, KeyBinding, PopoverMenuHandle, Tooltip, prelude::*};
use util::{ResultExt as _, maybe};
use workspace::{CollaboratorId, Workspace};
+use zed_llm_client::CompletionIntent;
use crate::context_picker::{ContextPicker, ContextPickerCompletionProvider, crease_for_mention};
use crate::context_store::ContextStore;
@@ -358,7 +359,12 @@ impl MessageEditor {
thread
.update(cx, |thread, cx| {
thread.advance_prompt_id();
- thread.send_to_model(model, Some(window_handle), cx);
+ thread.send_to_model(
+ model,
+ CompletionIntent::UserPrompt,
+ Some(window_handle),
+ cx,
+ );
})
.log_err();
})
@@ -1248,6 +1254,7 @@ impl MessageEditor {
let request = language_model::LanguageModelRequest {
thread_id: None,
prompt_id: None,
+ intent: None,
mode: None,
messages: vec![request_message],
tools: vec![],
@@ -25,6 +25,7 @@ use terminal_view::TerminalView;
use ui::prelude::*;
use util::ResultExt;
use workspace::{Toast, Workspace, notifications::NotificationId};
+use zed_llm_client::CompletionIntent;
pub fn init(
fs: Arc<dyn Fs>,
@@ -291,6 +292,7 @@ impl TerminalInlineAssistant {
thread_id: None,
prompt_id: None,
mode: None,
+ intent: Some(CompletionIntent::TerminalInlineAssist),
messages: vec![request_message],
tools: Vec::new(),
tool_choice: None,
@@ -38,7 +38,7 @@ use thiserror::Error;
use ui::Window;
use util::{ResultExt as _, post_inc};
use uuid::Uuid;
-use zed_llm_client::CompletionRequestStatus;
+use zed_llm_client::{CompletionIntent, CompletionRequestStatus};
use crate::ThreadStore;
use crate::context::{AgentContext, AgentContextHandle, ContextLoadResult, LoadedContext};
@@ -1157,6 +1157,7 @@ impl Thread {
pub fn send_to_model(
&mut self,
model: Arc<dyn LanguageModel>,
+ intent: CompletionIntent,
window: Option<AnyWindowHandle>,
cx: &mut Context<Self>,
) {
@@ -1166,7 +1167,7 @@ impl Thread {
self.remaining_turns -= 1;
- let request = self.to_completion_request(model.clone(), cx);
+ let request = self.to_completion_request(model.clone(), intent, cx);
self.stream_completion(request, model, window, cx);
}
@@ -1186,11 +1187,13 @@ impl Thread {
pub fn to_completion_request(
&self,
model: Arc<dyn LanguageModel>,
+ intent: CompletionIntent,
cx: &mut Context<Self>,
) -> LanguageModelRequest {
let mut request = LanguageModelRequest {
thread_id: Some(self.id.to_string()),
prompt_id: Some(self.last_prompt_id.to_string()),
+ intent: Some(intent),
mode: None,
messages: vec![],
tools: Vec::new(),
@@ -1344,12 +1347,14 @@ impl Thread {
fn to_summarize_request(
&self,
model: &Arc<dyn LanguageModel>,
+ intent: CompletionIntent,
added_user_message: String,
cx: &App,
) -> LanguageModelRequest {
let mut request = LanguageModelRequest {
thread_id: None,
prompt_id: None,
+ intent: Some(intent),
mode: None,
messages: vec![],
tools: Vec::new(),
@@ -1826,7 +1831,12 @@ impl Thread {
If the conversation is about a specific subject, include it in the title. \
Be descriptive. DO NOT speak in the first person.";
- let request = self.to_summarize_request(&model.model, added_user_message.into(), cx);
+ let request = self.to_summarize_request(
+ &model.model,
+ CompletionIntent::ThreadSummarization,
+ added_user_message.into(),
+ cx,
+ );
self.summary = ThreadSummary::Generating;
@@ -1927,7 +1937,12 @@ impl Thread {
4. Any action items or next steps if any\n\
Format it in Markdown with headings and bullet points.";
- let request = self.to_summarize_request(&model, added_user_message.into(), cx);
+ let request = self.to_summarize_request(
+ &model,
+ CompletionIntent::ThreadContextSummarization,
+ added_user_message.into(),
+ cx,
+ );
*self.detailed_summary_tx.borrow_mut() = DetailedSummaryState::Generating {
message_id: last_message_id,
@@ -2019,7 +2034,8 @@ impl Thread {
model: Arc<dyn LanguageModel>,
) -> Vec<PendingToolUse> {
self.auto_capture_telemetry(cx);
- let request = Arc::new(self.to_completion_request(model.clone(), cx));
+ let request =
+ Arc::new(self.to_completion_request(model.clone(), CompletionIntent::ToolResults, cx));
let pending_tool_uses = self
.tool_use
.pending_tool_uses()
@@ -2215,7 +2231,7 @@ impl Thread {
if self.all_tools_finished() {
if let Some(ConfiguredModel { model, .. }) = self.configured_model.as_ref() {
if !canceled {
- self.send_to_model(model.clone(), window, cx);
+ self.send_to_model(model.clone(), CompletionIntent::ToolResults, window, cx);
}
self.auto_capture_telemetry(cx);
}
@@ -2902,7 +2918,7 @@ fn main() {{
// Check message in request
let request = thread.update(cx, |thread, cx| {
- thread.to_completion_request(model.clone(), cx)
+ thread.to_completion_request(model.clone(), CompletionIntent::UserPrompt, cx)
});
assert_eq!(request.messages.len(), 2);
@@ -2997,7 +3013,7 @@ fn main() {{
// Check entire request to make sure all contexts are properly included
let request = thread.update(cx, |thread, cx| {
- thread.to_completion_request(model.clone(), cx)
+ thread.to_completion_request(model.clone(), CompletionIntent::UserPrompt, cx)
});
// The request should contain all 3 messages
@@ -3104,7 +3120,7 @@ fn main() {{
// Check message in request
let request = thread.update(cx, |thread, cx| {
- thread.to_completion_request(model.clone(), cx)
+ thread.to_completion_request(model.clone(), CompletionIntent::UserPrompt, cx)
});
assert_eq!(request.messages.len(), 2);
@@ -3130,7 +3146,7 @@ fn main() {{
// Check that both messages appear in the request
let request = thread.update(cx, |thread, cx| {
- thread.to_completion_request(model.clone(), cx)
+ thread.to_completion_request(model.clone(), CompletionIntent::UserPrompt, cx)
});
assert_eq!(request.messages.len(), 3);
@@ -3174,7 +3190,7 @@ fn main() {{
// Create a request and check that it doesn't have a stale buffer warning yet
let initial_request = thread.update(cx, |thread, cx| {
- thread.to_completion_request(model.clone(), cx)
+ thread.to_completion_request(model.clone(), CompletionIntent::UserPrompt, cx)
});
// Make sure we don't have a stale file warning yet
@@ -3210,7 +3226,7 @@ fn main() {{
// Create a new request and check for the stale buffer warning
let new_request = thread.update(cx, |thread, cx| {
- thread.to_completion_request(model.clone(), cx)
+ thread.to_completion_request(model.clone(), CompletionIntent::UserPrompt, cx)
});
// We should have a stale file warning as the last message
@@ -3260,7 +3276,7 @@ fn main() {{
});
let request = thread.update(cx, |thread, cx| {
- thread.to_completion_request(model.clone(), cx)
+ thread.to_completion_request(model.clone(), CompletionIntent::UserPrompt, cx)
});
assert_eq!(request.temperature, Some(0.66));
@@ -3280,7 +3296,7 @@ fn main() {{
});
let request = thread.update(cx, |thread, cx| {
- thread.to_completion_request(model.clone(), cx)
+ thread.to_completion_request(model.clone(), CompletionIntent::UserPrompt, cx)
});
assert_eq!(request.temperature, Some(0.66));
@@ -3300,7 +3316,7 @@ fn main() {{
});
let request = thread.update(cx, |thread, cx| {
- thread.to_completion_request(model.clone(), cx)
+ thread.to_completion_request(model.clone(), CompletionIntent::UserPrompt, cx)
});
assert_eq!(request.temperature, Some(0.66));
@@ -3320,7 +3336,7 @@ fn main() {{
});
let request = thread.update(cx, |thread, cx| {
- thread.to_completion_request(model.clone(), cx)
+ thread.to_completion_request(model.clone(), CompletionIntent::UserPrompt, cx)
});
assert_eq!(request.temperature, None);
}
@@ -3352,7 +3368,12 @@ fn main() {{
// Send a message
thread.update(cx, |thread, cx| {
thread.insert_user_message("Hi!", ContextLoadResult::default(), None, vec![], cx);
- thread.send_to_model(model.clone(), None, cx);
+ thread.send_to_model(
+ model.clone(),
+ CompletionIntent::ThreadSummarization,
+ None,
+ cx,
+ );
});
let fake_model = model.as_fake();
@@ -3447,7 +3468,7 @@ fn main() {{
vec![],
cx,
);
- thread.send_to_model(model.clone(), None, cx);
+ thread.send_to_model(model.clone(), CompletionIntent::UserPrompt, None, cx);
});
let fake_model = model.as_fake();
@@ -3485,7 +3506,12 @@ fn main() {{
) {
thread.update(cx, |thread, cx| {
thread.insert_user_message("Hi!", ContextLoadResult::default(), None, vec![], cx);
- thread.send_to_model(model.clone(), None, cx);
+ thread.send_to_model(
+ model.clone(),
+ CompletionIntent::ThreadSummarization,
+ None,
+ cx,
+ );
});
let fake_model = model.as_fake();
@@ -57,6 +57,7 @@ uuid.workspace = true
workspace-hack.workspace = true
workspace.workspace = true
zed_actions.workspace = true
+zed_llm_client.workspace = true
[dev-dependencies]
language_model = { workspace = true, features = ["test-support"] }
@@ -44,6 +44,7 @@ use text::{BufferSnapshot, ToPoint};
use ui::IconName;
use util::{ResultExt, TryFutureExt, post_inc};
use uuid::Uuid;
+use zed_llm_client::CompletionIntent;
#[derive(Clone, Debug, Eq, PartialEq, Hash, PartialOrd, Ord, Serialize, Deserialize)]
pub struct ContextId(String);
@@ -2262,6 +2263,7 @@ impl AssistantContext {
let mut completion_request = LanguageModelRequest {
thread_id: None,
prompt_id: None,
+ intent: Some(CompletionIntent::UserPrompt),
mode: None,
messages: Vec::new(),
tools: Vec::new(),
@@ -25,6 +25,7 @@ use serde::{Deserialize, Serialize};
use std::{cmp, iter, mem, ops::Range, path::PathBuf, sync::Arc, task::Poll};
use streaming_diff::{CharOperation, StreamingDiff};
use util::debug_panic;
+use zed_llm_client::CompletionIntent;
#[derive(Serialize)]
struct CreateFilePromptTemplate {
@@ -102,7 +103,9 @@ impl EditAgent {
edit_description,
}
.render(&this.templates)?;
- let new_chunks = this.request(conversation, prompt, cx).await?;
+ let new_chunks = this
+ .request(conversation, CompletionIntent::CreateFile, prompt, cx)
+ .await?;
let (output, mut inner_events) = this.overwrite_with_chunks(buffer, new_chunks, cx);
while let Some(event) = inner_events.next().await {
@@ -226,7 +229,9 @@ impl EditAgent {
edit_description,
}
.render(&this.templates)?;
- let edit_chunks = this.request(conversation, prompt, cx).await?;
+ let edit_chunks = this
+ .request(conversation, CompletionIntent::EditFile, prompt, cx)
+ .await?;
let (output, mut inner_events) = this.apply_edit_chunks(buffer, edit_chunks, cx);
while let Some(event) = inner_events.next().await {
@@ -517,6 +522,7 @@ impl EditAgent {
async fn request(
&self,
mut conversation: LanguageModelRequest,
+ intent: CompletionIntent,
prompt: String,
cx: &mut AsyncApp,
) -> Result<BoxStream<'static, Result<String, LanguageModelCompletionError>>> {
@@ -574,6 +580,7 @@ impl EditAgent {
let request = LanguageModelRequest {
thread_id: conversation.thread_id,
prompt_id: conversation.prompt_id,
+ intent: Some(intent),
mode: conversation.mode,
messages: conversation.messages,
tool_choice,
@@ -67,3 +67,4 @@ unindent.workspace = true
util.workspace = true
uuid.workspace = true
workspace-hack.workspace = true
+zed_llm_client.workspace = true
@@ -19,6 +19,7 @@ use collections::HashMap;
use futures::{FutureExt as _, StreamExt, channel::mpsc, select_biased};
use gpui::{App, AppContext, AsyncApp, Entity};
use language_model::{LanguageModel, Role, StopReason};
+use zed_llm_client::CompletionIntent;
pub const THREAD_EVENT_TIMEOUT: Duration = Duration::from_secs(60 * 2);
@@ -307,7 +308,7 @@ impl ExampleContext {
let message_count_before = self.app.update_entity(&self.agent_thread, |thread, cx| {
thread.set_remaining_turns(iterations);
- thread.send_to_model(model, None, cx);
+ thread.send_to_model(model, CompletionIntent::UserPrompt, None, cx);
thread.messages().len()
})?;
@@ -576,6 +576,7 @@ impl ExampleInstance {
thread_id: None,
prompt_id: None,
mode: None,
+ intent: None,
messages: vec![LanguageModelRequestMessage {
role: Role::User,
content: vec![MessageContent::Text(to_prompt(assertion.description))],
@@ -59,6 +59,7 @@ util.workspace = true
workspace.workspace = true
zed_actions.workspace = true
workspace-hack.workspace = true
+zed_llm_client.workspace = true
[target.'cfg(windows)'.dependencies]
windows.workspace = true
@@ -13,7 +13,6 @@ use anyhow::Context as _;
use askpass::AskPassDelegate;
use assistant_settings::AssistantSettings;
use db::kvp::KEY_VALUE_STORE;
-
use editor::{
Editor, EditorElement, EditorMode, EditorSettings, MultiBuffer, ShowScrollbar,
scroll::ScrollbarAutoHide,
@@ -42,6 +41,7 @@ use language_model::{
};
use menu::{Confirm, SecondaryConfirm, SelectFirst, SelectLast, SelectNext, SelectPrevious};
use multi_buffer::ExcerptInfo;
+use notifications::status_toast::{StatusToast, ToastIcon};
use panel::{
PanelHeader, panel_button, panel_editor_container, panel_editor_style, panel_filled_button,
panel_icon_button,
@@ -64,13 +64,12 @@ use ui::{
};
use util::{ResultExt, TryFutureExt, maybe};
use workspace::AppState;
-
-use notifications::status_toast::{StatusToast, ToastIcon};
use workspace::{
Workspace,
dock::{DockPosition, Panel, PanelEvent},
notifications::DetachAndPromptErr,
};
+use zed_llm_client::CompletionIntent;
actions!(
git_panel,
@@ -1765,6 +1764,7 @@ impl GitPanel {
let request = LanguageModelRequest {
thread_id: None,
prompt_id: None,
+ intent: Some(CompletionIntent::GenerateGitCommitMessage),
mode: None,
messages: vec![LanguageModelRequestMessage {
role: Role::User,
@@ -12,7 +12,7 @@ use gpui::{
use image::codecs::png::PngEncoder;
use serde::{Deserialize, Serialize};
use util::ResultExt;
-use zed_llm_client::CompletionMode;
+use zed_llm_client::{CompletionIntent, CompletionMode};
#[derive(Clone, PartialEq, Eq, Serialize, Deserialize, Hash)]
pub struct LanguageModelImage {
@@ -281,6 +281,7 @@ pub enum LanguageModelToolChoice {
pub struct LanguageModelRequest {
pub thread_id: Option<String>,
pub prompt_id: Option<String>,
+ pub intent: Option<CompletionIntent>,
pub mode: Option<CompletionMode>,
pub messages: Vec<LanguageModelRequestMessage>,
pub tools: Vec<LanguageModelRequestTool>,
@@ -801,6 +801,7 @@ impl LanguageModel for CloudLanguageModel {
> {
let thread_id = request.thread_id.clone();
let prompt_id = request.prompt_id.clone();
+ let intent = request.intent;
let mode = request.mode;
let app_version = cx.update(|cx| AppVersion::global(cx)).ok();
match &self.model {
@@ -827,6 +828,7 @@ impl LanguageModel for CloudLanguageModel {
CompletionBody {
thread_id,
prompt_id,
+ intent,
mode,
provider: zed_llm_client::LanguageModelProvider::Anthropic,
model: request.model.clone(),
@@ -879,6 +881,7 @@ impl LanguageModel for CloudLanguageModel {
CompletionBody {
thread_id,
prompt_id,
+ intent,
mode,
provider: zed_llm_client::LanguageModelProvider::OpenAi,
model: request.model.clone(),
@@ -916,6 +919,7 @@ impl LanguageModel for CloudLanguageModel {
CompletionBody {
thread_id,
prompt_id,
+ intent,
mode,
provider: zed_llm_client::LanguageModelProvider::Google,
model: request.model.model_id.clone(),
@@ -820,6 +820,7 @@ mod tests {
tool_choice: None,
thread_id: None,
prompt_id: None,
+ intent: None,
mode: None,
stop: Vec::new(),
};
@@ -858,6 +858,7 @@ mod tests {
let request = LanguageModelRequest {
thread_id: None,
prompt_id: None,
+ intent: None,
mode: None,
messages: vec![LanguageModelRequestMessage {
role: Role::User,
@@ -922,6 +922,7 @@ impl RulesLibrary {
LanguageModelRequest {
thread_id: None,
prompt_id: None,
+ intent: None,
mode: None,
messages: vec![LanguageModelRequestMessage {
role: Role::System,
@@ -560,6 +560,7 @@ impl SummaryIndex {
thread_id: None,
prompt_id: None,
mode: None,
+ intent: None,
messages: vec![LanguageModelRequestMessage {
role: Role::User,
content: vec![prompt.into()],