Skip to content

Commit f460c23

Browse files
authored
fix: deletes history on tool deny (#655)
* fix: deletes history on tool deny * fix: includes deny msg as well as stub tool use results on tool deny
1 parent 3635358 commit f460c23

File tree

2 files changed

+47
-1
lines changed

2 files changed

+47
-1
lines changed

crates/q_cli/src/cli/chat/conversation_state.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,36 @@ impl ConversationState {
169169
self.next_message = Some(msg);
170170
}
171171

172+
pub fn abandon_tool_use(&mut self, tools_to_be_abandoned: Vec<(String, super::tools::Tool)>, deny_input: String) {
173+
let tool_results = tools_to_be_abandoned
174+
.into_iter()
175+
.map(|(tool_use_id, _)| ToolResult {
176+
tool_use_id,
177+
content: vec![ToolResultContentBlock::Text(
178+
"Tool use was cancelled by the user".to_string(),
179+
)],
180+
status: fig_api_client::model::ToolResultStatus::Error,
181+
})
182+
.collect::<Vec<_>>();
183+
let user_input_message_context = UserInputMessageContext {
184+
shell_state: None,
185+
env_state: Some(build_env_state(None)),
186+
tool_results: Some(tool_results),
187+
tools: if self.tools.is_empty() {
188+
None
189+
} else {
190+
Some(self.tools.clone())
191+
},
192+
..Default::default()
193+
};
194+
let msg = Message(ChatMessage::UserInputMessage(UserInputMessage {
195+
content: deny_input,
196+
user_input_message_context: Some(user_input_message_context),
197+
user_intent: None,
198+
}));
199+
self.next_message = Some(msg);
200+
}
201+
172202
/// Returns a [FigConversationState] capable of being sent by
173203
/// [fig_api_client::StreamingClient] while preparing the current conversation state to be sent
174204
/// in the next message.

crates/q_cli/src/cli/chat/mod.rs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -627,7 +627,23 @@ Hi, I'm <g>Amazon Q</g>. Ask me anything.
627627
self.spinner = Some(Spinner::new(Spinners::Dots, "Thinking...".to_owned()));
628628
}
629629

630-
self.conversation_state.append_new_user_message(user_input).await;
630+
let should_abandon_tool_use = self
631+
.conversation_state
632+
.history
633+
.back()
634+
.and_then(|last_msg| match &last_msg.0 {
635+
fig_api_client::model::ChatMessage::AssistantResponseMessage(msg) => Some(msg),
636+
fig_api_client::model::ChatMessage::UserInputMessage(_) => None,
637+
})
638+
.and_then(|msg| msg.tool_uses.as_ref())
639+
.is_some_and(|tool_use| !tool_use.is_empty());
640+
641+
if should_abandon_tool_use {
642+
self.conversation_state.abandon_tool_use(queued_tools, user_input);
643+
} else {
644+
self.conversation_state.append_new_user_message(user_input).await;
645+
}
646+
631647
self.send_tool_use_telemetry().await;
632648
Ok(Some(
633649
self.client

0 commit comments

Comments
 (0)