Skip to content

Commit bd31652

Browse files
authored
Merge branch 'zed-industries:main' into main
2 parents abbcedd + ee56706 commit bd31652

File tree

75 files changed

+1264
-21849
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

75 files changed

+1264
-21849
lines changed

crates/agent/src/active_thread.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -1411,6 +1411,7 @@ impl ActiveThread {
14111411
mode: None,
14121412
messages: vec![request_message],
14131413
tools: vec![],
1414+
tool_choice: None,
14141415
stop: vec![],
14151416
temperature: AssistantSettings::temperature_for_model(
14161417
&configured_model.model,
@@ -3256,7 +3257,7 @@ impl ActiveThread {
32563257
c.tool_use_id.clone(),
32573258
c.ui_text.clone(),
32583259
c.input.clone(),
3259-
&c.messages,
3260+
c.request.clone(),
32603261
c.tool.clone(),
32613262
configured.model,
32623263
Some(window.window_handle()),

crates/agent/src/agent_configuration/manage_profiles_modal.rs

+22-14
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ impl ManageProfilesModal {
124124
let mut this = Self::new(fs, tools, thread_store, window, cx);
125125

126126
if let Some(profile_id) = action.customize_tools.clone() {
127-
this.configure_tools(profile_id, window, cx);
127+
this.configure_builtin_tools(profile_id, window, cx);
128128
}
129129

130130
this
@@ -190,7 +190,7 @@ impl ManageProfilesModal {
190190
self.focus_handle(cx).focus(window);
191191
}
192192

193-
fn configure_mcps(
193+
fn configure_mcp_tools(
194194
&mut self,
195195
profile_id: AgentProfileId,
196196
window: &mut Window,
@@ -228,7 +228,7 @@ impl ManageProfilesModal {
228228
self.focus_handle(cx).focus(window);
229229
}
230230

231-
fn configure_tools(
231+
fn configure_builtin_tools(
232232
&mut self,
233233
profile_id: AgentProfileId,
234234
window: &mut Window,
@@ -581,16 +581,20 @@ impl ManageProfilesModal {
581581
)
582582
.child(
583583
div()
584-
.id("configure-tools")
584+
.id("configure-builtin-tools")
585585
.track_focus(&mode.configure_tools.focus_handle)
586586
.on_action({
587587
let profile_id = mode.profile_id.clone();
588588
cx.listener(move |this, _: &menu::Confirm, window, cx| {
589-
this.configure_tools(profile_id.clone(), window, cx);
589+
this.configure_builtin_tools(
590+
profile_id.clone(),
591+
window,
592+
cx,
593+
);
590594
})
591595
})
592596
.child(
593-
ListItem::new("configure-tools")
597+
ListItem::new("configure-builtin-tools-item")
594598
.toggle_state(
595599
mode.configure_tools
596600
.focus_handle
@@ -603,11 +607,11 @@ impl ManageProfilesModal {
603607
.size(IconSize::Small)
604608
.color(Color::Muted),
605609
)
606-
.child(Label::new("Configure Tools"))
610+
.child(Label::new("Configure Built-in Tools"))
607611
.on_click({
608612
let profile_id = mode.profile_id.clone();
609613
cx.listener(move |this, _, window, cx| {
610-
this.configure_tools(
614+
this.configure_builtin_tools(
611615
profile_id.clone(),
612616
window,
613617
cx,
@@ -623,11 +627,11 @@ impl ManageProfilesModal {
623627
.on_action({
624628
let profile_id = mode.profile_id.clone();
625629
cx.listener(move |this, _: &menu::Confirm, window, cx| {
626-
this.configure_mcps(profile_id.clone(), window, cx);
630+
this.configure_mcp_tools(profile_id.clone(), window, cx);
627631
})
628632
})
629633
.child(
630-
ListItem::new("configure-mcps")
634+
ListItem::new("configure-mcp-tools")
631635
.toggle_state(
632636
mode.configure_mcps
633637
.focus_handle
@@ -640,11 +644,15 @@ impl ManageProfilesModal {
640644
.size(IconSize::Small)
641645
.color(Color::Muted),
642646
)
643-
.child(Label::new("Configure MCP Servers"))
647+
.child(Label::new("Configure MCP Tools"))
644648
.on_click({
645649
let profile_id = mode.profile_id.clone();
646650
cx.listener(move |this, _, window, cx| {
647-
this.configure_mcps(profile_id.clone(), window, cx);
651+
this.configure_mcp_tools(
652+
profile_id.clone(),
653+
window,
654+
cx,
655+
);
648656
})
649657
}),
650658
),
@@ -777,7 +785,7 @@ impl Render for ManageProfilesModal {
777785
v_flex()
778786
.pb_1()
779787
.child(ProfileModalHeader::new(
780-
format!("{profile_name} — Configure Tools"),
788+
format!("{profile_name} — Configure Built-in Tools"),
781789
Some(IconName::Cog),
782790
))
783791
.child(ListSeparator)
@@ -800,7 +808,7 @@ impl Render for ManageProfilesModal {
800808
v_flex()
801809
.pb_1()
802810
.child(ProfileModalHeader::new(
803-
format!("{profile_name} — Configure MCP Servers"),
811+
format!("{profile_name} — Configure MCP Tools"),
804812
Some(IconName::Hammer),
805813
))
806814
.child(ListSeparator)

crates/agent/src/agent_configuration/tool_picker.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ impl PickerDelegate for ToolPickerDelegate {
176176
fn placeholder_text(&self, _window: &mut Window, _cx: &mut App) -> Arc<str> {
177177
match self.mode {
178178
ToolPickerMode::BuiltinTools => "Search built-in tools…",
179-
ToolPickerMode::McpTools => "Search MCP servers…",
179+
ToolPickerMode::McpTools => "Search MCP tools…",
180180
}
181181
.into()
182182
}

crates/agent/src/buffer_codegen.rs

+1
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,7 @@ impl CodegenAlternative {
466466
prompt_id: None,
467467
mode: None,
468468
tools: Vec::new(),
469+
tool_choice: None,
469470
stop: Vec::new(),
470471
temperature,
471472
messages: vec![request_message],

crates/agent/src/context_server_tool.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use anyhow::{Result, anyhow, bail};
44
use assistant_tool::{ActionLog, Tool, ToolResult, ToolSource};
55
use context_server::{ContextServerId, types};
66
use gpui::{AnyWindowHandle, App, Entity, Task};
7-
use language_model::{LanguageModel, LanguageModelRequestMessage, LanguageModelToolSchemaFormat};
7+
use language_model::{LanguageModel, LanguageModelRequest, LanguageModelToolSchemaFormat};
88
use project::{Project, context_server_store::ContextServerStore};
99
use ui::IconName;
1010

@@ -72,7 +72,7 @@ impl Tool for ContextServerTool {
7272
fn run(
7373
self: Arc<Self>,
7474
input: serde_json::Value,
75-
_messages: &[LanguageModelRequestMessage],
75+
_request: Arc<LanguageModelRequest>,
7676
_project: Entity<Project>,
7777
_action_log: Entity<ActionLog>,
7878
_model: Arc<dyn LanguageModel>,

crates/agent/src/message_editor.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1245,6 +1245,7 @@ impl MessageEditor {
12451245
mode: None,
12461246
messages: vec![request_message],
12471247
tools: vec![],
1248+
tool_choice: None,
12481249
stop: vec![],
12491250
temperature: AssistantSettings::temperature_for_model(&model.model, cx),
12501251
};

crates/agent/src/terminal_inline_assistant.rs

+1
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,7 @@ impl TerminalInlineAssistant {
293293
mode: None,
294294
messages: vec![request_message],
295295
tools: Vec::new(),
296+
tool_choice: None,
296297
stop: Vec::new(),
297298
temperature,
298299
}

crates/agent/src/thread.rs

+54-21
Original file line numberDiff line numberDiff line change
@@ -1183,6 +1183,7 @@ impl Thread {
11831183
mode: None,
11841184
messages: vec![],
11851185
tools: Vec::new(),
1186+
tool_choice: None,
11861187
stop: Vec::new(),
11871188
temperature: AssistantSettings::temperature_for_model(&model, cx),
11881189
};
@@ -1227,6 +1228,7 @@ impl Thread {
12271228
}));
12281229
}
12291230

1231+
let mut message_ix_to_cache = None;
12301232
for message in &self.messages {
12311233
let mut request_message = LanguageModelRequestMessage {
12321234
role: message.role,
@@ -1263,19 +1265,57 @@ impl Thread {
12631265
};
12641266
}
12651267

1266-
self.tool_use
1267-
.attach_tool_uses(message.id, &mut request_message);
1268+
let mut cache_message = true;
1269+
let mut tool_results_message = LanguageModelRequestMessage {
1270+
role: Role::User,
1271+
content: Vec::new(),
1272+
cache: false,
1273+
};
1274+
for (tool_use, tool_result) in self.tool_use.tool_results(message.id) {
1275+
if let Some(tool_result) = tool_result {
1276+
request_message
1277+
.content
1278+
.push(MessageContent::ToolUse(tool_use.clone()));
1279+
tool_results_message
1280+
.content
1281+
.push(MessageContent::ToolResult(LanguageModelToolResult {
1282+
tool_use_id: tool_use.id.clone(),
1283+
tool_name: tool_result.tool_name.clone(),
1284+
is_error: tool_result.is_error,
1285+
content: if tool_result.content.is_empty() {
1286+
// Surprisingly, the API fails if we return an empty string here.
1287+
// It thinks we are sending a tool use without a tool result.
1288+
"<Tool returned an empty string>".into()
1289+
} else {
1290+
tool_result.content.clone()
1291+
},
1292+
output: None,
1293+
}));
1294+
} else {
1295+
cache_message = false;
1296+
log::debug!(
1297+
"skipped tool use {:?} because it is still pending",
1298+
tool_use
1299+
);
1300+
}
1301+
}
12681302

1303+
if cache_message {
1304+
message_ix_to_cache = Some(request.messages.len());
1305+
}
12691306
request.messages.push(request_message);
12701307

1271-
if let Some(tool_results_message) = self.tool_use.tool_results_message(message.id) {
1308+
if !tool_results_message.content.is_empty() {
1309+
if cache_message {
1310+
message_ix_to_cache = Some(request.messages.len());
1311+
}
12721312
request.messages.push(tool_results_message);
12731313
}
12741314
}
12751315

12761316
// https://docs.anthropic.com/en/docs/build-with-claude/prompt-caching
1277-
if let Some(last) = request.messages.last_mut() {
1278-
last.cache = true;
1317+
if let Some(message_ix_to_cache) = message_ix_to_cache {
1318+
request.messages[message_ix_to_cache].cache = true;
12791319
}
12801320

12811321
self.attached_tracked_files_state(&mut request.messages, cx);
@@ -1302,6 +1342,7 @@ impl Thread {
13021342
mode: None,
13031343
messages: vec![],
13041344
tools: Vec::new(),
1345+
tool_choice: None,
13051346
stop: Vec::new(),
13061347
temperature: AssistantSettings::temperature_for_model(model, cx),
13071348
};
@@ -1918,8 +1959,7 @@ impl Thread {
19181959
model: Arc<dyn LanguageModel>,
19191960
) -> Vec<PendingToolUse> {
19201961
self.auto_capture_telemetry(cx);
1921-
let request = self.to_completion_request(model.clone(), cx);
1922-
let messages = Arc::new(request.messages);
1962+
let request = Arc::new(self.to_completion_request(model.clone(), cx));
19231963
let pending_tool_uses = self
19241964
.tool_use
19251965
.pending_tool_uses()
@@ -1937,7 +1977,7 @@ impl Thread {
19371977
tool_use.id.clone(),
19381978
tool_use.ui_text.clone(),
19391979
tool_use.input.clone(),
1940-
messages.clone(),
1980+
request.clone(),
19411981
tool,
19421982
);
19431983
cx.emit(ThreadEvent::ToolConfirmationNeeded);
@@ -1946,7 +1986,7 @@ impl Thread {
19461986
tool_use.id.clone(),
19471987
tool_use.ui_text.clone(),
19481988
tool_use.input.clone(),
1949-
&messages,
1989+
request.clone(),
19501990
tool,
19511991
model.clone(),
19521992
window,
@@ -2041,29 +2081,22 @@ impl Thread {
20412081
tool_use_id: LanguageModelToolUseId,
20422082
ui_text: impl Into<SharedString>,
20432083
input: serde_json::Value,
2044-
messages: &[LanguageModelRequestMessage],
2084+
request: Arc<LanguageModelRequest>,
20452085
tool: Arc<dyn Tool>,
20462086
model: Arc<dyn LanguageModel>,
20472087
window: Option<AnyWindowHandle>,
20482088
cx: &mut Context<Thread>,
20492089
) {
2050-
let task = self.spawn_tool_use(
2051-
tool_use_id.clone(),
2052-
messages,
2053-
input,
2054-
tool,
2055-
model,
2056-
window,
2057-
cx,
2058-
);
2090+
let task =
2091+
self.spawn_tool_use(tool_use_id.clone(), request, input, tool, model, window, cx);
20592092
self.tool_use
20602093
.run_pending_tool(tool_use_id, ui_text.into(), task);
20612094
}
20622095

20632096
fn spawn_tool_use(
20642097
&mut self,
20652098
tool_use_id: LanguageModelToolUseId,
2066-
messages: &[LanguageModelRequestMessage],
2099+
request: Arc<LanguageModelRequest>,
20672100
input: serde_json::Value,
20682101
tool: Arc<dyn Tool>,
20692102
model: Arc<dyn LanguageModel>,
@@ -2077,7 +2110,7 @@ impl Thread {
20772110
} else {
20782111
tool.run(
20792112
input,
2080-
messages,
2113+
request,
20812114
self.project.clone(),
20822115
self.action_log.clone(),
20832116
model,

0 commit comments

Comments
 (0)