acp: Use ResourceLink
for agents that don't support embedded context (#36687)
The completion provider was already limiting the mention kinds according to `acp::PromptCapabilities`. However, it was still using `ContentBlock::EmbeddedResource` when `acp::PromptCapabilities::embedded_context` was `false`. We will now use `ResourceLink` in that case making it more complaint with the specification. Release Notes: - N/A
This commit is contained in:
parent
f23314bef4
commit
4bee06e507
1 changed files with 79 additions and 12 deletions
|
@ -709,9 +709,13 @@ impl MessageEditor {
|
||||||
window: &mut Window,
|
window: &mut Window,
|
||||||
cx: &mut Context<Self>,
|
cx: &mut Context<Self>,
|
||||||
) -> Task<Result<(Vec<acp::ContentBlock>, Vec<Entity<Buffer>>)>> {
|
) -> Task<Result<(Vec<acp::ContentBlock>, Vec<Entity<Buffer>>)>> {
|
||||||
let contents =
|
let contents = self.mention_set.contents(
|
||||||
self.mention_set
|
&self.project,
|
||||||
.contents(&self.project, self.prompt_store.as_ref(), window, cx);
|
self.prompt_store.as_ref(),
|
||||||
|
&self.prompt_capabilities.get(),
|
||||||
|
window,
|
||||||
|
cx,
|
||||||
|
);
|
||||||
let editor = self.editor.clone();
|
let editor = self.editor.clone();
|
||||||
let prevent_slash_commands = self.prevent_slash_commands;
|
let prevent_slash_commands = self.prevent_slash_commands;
|
||||||
|
|
||||||
|
@ -776,6 +780,17 @@ impl MessageEditor {
|
||||||
.map(|path| format!("file://{}", path.display())),
|
.map(|path| format!("file://{}", path.display())),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
Mention::UriOnly(uri) => {
|
||||||
|
acp::ContentBlock::ResourceLink(acp::ResourceLink {
|
||||||
|
name: uri.name(),
|
||||||
|
uri: uri.to_uri().to_string(),
|
||||||
|
annotations: None,
|
||||||
|
description: None,
|
||||||
|
mime_type: None,
|
||||||
|
size: None,
|
||||||
|
title: None,
|
||||||
|
})
|
||||||
|
}
|
||||||
};
|
};
|
||||||
chunks.push(chunk);
|
chunks.push(chunk);
|
||||||
ix = crease_range.end;
|
ix = crease_range.end;
|
||||||
|
@ -1418,6 +1433,7 @@ pub enum Mention {
|
||||||
tracked_buffers: Vec<Entity<Buffer>>,
|
tracked_buffers: Vec<Entity<Buffer>>,
|
||||||
},
|
},
|
||||||
Image(MentionImage),
|
Image(MentionImage),
|
||||||
|
UriOnly(MentionUri),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Eq, PartialEq)]
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||||
|
@ -1481,9 +1497,20 @@ impl MentionSet {
|
||||||
&self,
|
&self,
|
||||||
project: &Entity<Project>,
|
project: &Entity<Project>,
|
||||||
prompt_store: Option<&Entity<PromptStore>>,
|
prompt_store: Option<&Entity<PromptStore>>,
|
||||||
|
prompt_capabilities: &acp::PromptCapabilities,
|
||||||
_window: &mut Window,
|
_window: &mut Window,
|
||||||
cx: &mut App,
|
cx: &mut App,
|
||||||
) -> Task<Result<HashMap<CreaseId, Mention>>> {
|
) -> Task<Result<HashMap<CreaseId, Mention>>> {
|
||||||
|
if !prompt_capabilities.embedded_context {
|
||||||
|
let mentions = self
|
||||||
|
.uri_by_crease_id
|
||||||
|
.iter()
|
||||||
|
.map(|(crease_id, uri)| (*crease_id, Mention::UriOnly(uri.clone())))
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
return Task::ready(Ok(mentions));
|
||||||
|
}
|
||||||
|
|
||||||
let mut processed_image_creases = HashSet::default();
|
let mut processed_image_creases = HashSet::default();
|
||||||
|
|
||||||
let mut contents = self
|
let mut contents = self
|
||||||
|
@ -2180,11 +2207,21 @@ mod tests {
|
||||||
assert_eq!(fold_ranges(editor, cx).len(), 1);
|
assert_eq!(fold_ranges(editor, cx).len(), 1);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
let all_prompt_capabilities = acp::PromptCapabilities {
|
||||||
|
image: true,
|
||||||
|
audio: true,
|
||||||
|
embedded_context: true,
|
||||||
|
};
|
||||||
|
|
||||||
let contents = message_editor
|
let contents = message_editor
|
||||||
.update_in(&mut cx, |message_editor, window, cx| {
|
.update_in(&mut cx, |message_editor, window, cx| {
|
||||||
message_editor
|
message_editor.mention_set().contents(
|
||||||
.mention_set()
|
&project,
|
||||||
.contents(&project, None, window, cx)
|
None,
|
||||||
|
&all_prompt_capabilities,
|
||||||
|
window,
|
||||||
|
cx,
|
||||||
|
)
|
||||||
})
|
})
|
||||||
.await
|
.await
|
||||||
.unwrap()
|
.unwrap()
|
||||||
|
@ -2199,6 +2236,28 @@ mod tests {
|
||||||
pretty_assertions::assert_eq!(uri, &url_one.parse::<MentionUri>().unwrap());
|
pretty_assertions::assert_eq!(uri, &url_one.parse::<MentionUri>().unwrap());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let contents = message_editor
|
||||||
|
.update_in(&mut cx, |message_editor, window, cx| {
|
||||||
|
message_editor.mention_set().contents(
|
||||||
|
&project,
|
||||||
|
None,
|
||||||
|
&acp::PromptCapabilities::default(),
|
||||||
|
window,
|
||||||
|
cx,
|
||||||
|
)
|
||||||
|
})
|
||||||
|
.await
|
||||||
|
.unwrap()
|
||||||
|
.into_values()
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
|
{
|
||||||
|
let [Mention::UriOnly(uri)] = contents.as_slice() else {
|
||||||
|
panic!("Unexpected mentions");
|
||||||
|
};
|
||||||
|
pretty_assertions::assert_eq!(uri, &url_one.parse::<MentionUri>().unwrap());
|
||||||
|
}
|
||||||
|
|
||||||
cx.simulate_input(" ");
|
cx.simulate_input(" ");
|
||||||
|
|
||||||
editor.update(&mut cx, |editor, cx| {
|
editor.update(&mut cx, |editor, cx| {
|
||||||
|
@ -2234,9 +2293,13 @@ mod tests {
|
||||||
|
|
||||||
let contents = message_editor
|
let contents = message_editor
|
||||||
.update_in(&mut cx, |message_editor, window, cx| {
|
.update_in(&mut cx, |message_editor, window, cx| {
|
||||||
message_editor
|
message_editor.mention_set().contents(
|
||||||
.mention_set()
|
&project,
|
||||||
.contents(&project, None, window, cx)
|
None,
|
||||||
|
&all_prompt_capabilities,
|
||||||
|
window,
|
||||||
|
cx,
|
||||||
|
)
|
||||||
})
|
})
|
||||||
.await
|
.await
|
||||||
.unwrap()
|
.unwrap()
|
||||||
|
@ -2344,9 +2407,13 @@ mod tests {
|
||||||
|
|
||||||
let contents = message_editor
|
let contents = message_editor
|
||||||
.update_in(&mut cx, |message_editor, window, cx| {
|
.update_in(&mut cx, |message_editor, window, cx| {
|
||||||
message_editor
|
message_editor.mention_set().contents(
|
||||||
.mention_set()
|
&project,
|
||||||
.contents(&project, None, window, cx)
|
None,
|
||||||
|
&all_prompt_capabilities,
|
||||||
|
window,
|
||||||
|
cx,
|
||||||
|
)
|
||||||
})
|
})
|
||||||
.await
|
.await
|
||||||
.unwrap()
|
.unwrap()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue