fix: improve error message formatting for prompt errors#2050
fix: improve error message formatting for prompt errors#2050
Conversation
* [feat]: Add a new semantic_search_client crate that provides vector embedding and
semantic search capabilities for the Amazon Q CLI. This implementation:
- Supports text embedding generation using Candle and ONNX runtimes
- Provides hardware acceleration via Metal on macOS
- Implements efficient vector indexing for semantic search
- Includes file processing utilities for various file types
- Supports persistent storage of semantic contexts
- Includes comprehensive test coverage
This crate will enable memory bank functionality for Amazon Q, allowing
users to create, manage, and search through semantic memory contexts.
🤖 Assisted by [Amazon Q Developer](https://aws.amazon.com/q/developer)
* Update semantic_search_client dependencies in Cargo.toml
* Refactor embedder implementation for Linux platforms to use trait objects
This change modifies the semantic search client to use Box<dyn TextEmbedderTrait>
on Linux platforms instead of directly using CandleTextEmbedder. This provides
more flexibility and consistency with the implementation on macOS and Windows,
allowing for better extensibility and polymorphic behavior across all platforms.
* Update Cargo.lock file
* Remove redundant CandleTextEmbedder import for non-macOS/Windows platforms
* fix(semantic_search): Update conditional compilation flags for embedders
Update conditional compilation flags to match the new embedding model selection logic:
- Replace target_env="musl" conditions with target_os conditions
- Update TextEmbedder trait implementation to use macOS/Windows condition
- Ensure consistent conditions across all files
🤖 Assisted by [Amazon Q Developer](https://aws.amazon.com/q/developer)
---------
Co-authored-by: Kenneth Sanchez V <kennvene@amazon.com>
Co-authored-by: Kenneth Sanchez V <kennvene@amazon.com>
* fix Build * fix: Removes flakey test --------- Co-authored-by: Kenneth Sanchez V <kennvene@amazon.com>
- Tools and prompts are sorted by MCP server alphabetically. Built-in tools always come come first - Within each category (MCP), they are sorted by name alphabetically. - Slightly adjust /tools footer.
… as default (aws#1888) - Removed ONNX embedder implementation and fastembed dependency - Updated conditional compilation to use Candle on all platforms except Linux ARM - Fixed duplicate implementations in error.rs - Updated benchmark tests to remove ONNX references 🤖 Assisted by [Amazon Q Developer](https://aws.amazon.com/q/developer) Co-authored-by: Kenneth Sanchez V <kennvene@amazon.com>
* chore: update amazon clients * chore: update windows-core in lockfile * chore: exclude semantic search crate
* Revert "chore: exclude semantic search crate" This reverts commit 6fe1e3e. * fix(semantic_search): Fix VectorIndex is_empty implementation The VectorIndex.is_empty() method was incorrectly checking if ef_construction was equal to 100 to determine if the index was empty. This approach was unreliable and caused test failures. This change adds a proper counter to track the number of elements in the index and updates is_empty() to check this counter instead. 🤖 Assisted by [Amazon Q Developer](https://aws.amazon.com/q/developer) --------- Co-authored-by: Kenneth Sanchez V <kennvene@amazon.com>
* precomputes total number of servers in loading prior to spawning display task * changes display task to use async task instead of spawn blocking * waits on notify instead of display task for initial loading * includes time taken in warning and error * adds slash command to show mcp server load messages * includes mcps that fail to start in /mcp * surfaces command error for mcp servers in non-interactive mode * only surfaces timeout warning in non-interactive mode with one or more server in the client list * adds copy change for /mcp * uses a hash set of server names to keep track of the number of initialized servers * only shows mcp non-interactive msg in non-interactive mode
* chore: add logs for refreshing token * fix: save device registration when launching chat
Co-authored-by: Brandon Kiser <bskiser@amazon.com>
* remove autocomplete * fix cargo * remove typos config * remove mise and fix deny * fix tests
Idea Honing - Requirements ClarificationThis document will contain questions and answers to refine the initial idea and develop a thorough specification. Question 1What specific issues are there with the current error messages when Answer 1The current error messages are hard to decipher. They display technical JSON error structures that aren't user-friendly. Example of current error: The issues include:
Question 2What would you like the improved error messages to look like? Do you have a specific format or style in mind? Answer 2The improved error messages should have:
Question 3Do you know which part of the codebase handles these error messages? If so, can you provide information about the relevant files or modules? Answer 3The error message is coming from line 2552 of Question 4Are there any specific constraints or requirements we need to consider when implementing this improvement? For example, compatibility with different terminal types, color support, or maintaining backward compatibility? Answer 4The implementation should:
Question 5Would you like to examine the current implementation in the codebase to better understand how the error messages are currently generated and displayed? |
Detailed Design: Improved Error Messages for Q CLIOverviewThis design document outlines the approach for improving error messages displayed to users when RequirementsBased on the requirements clarification, the improved error messages should:
ArchitectureThe solution will focus on modifying the error message display in Components and Interfaces
Data ModelsMCP Error StructureBased on the example error message, MCP errors have the following structure: {
"code": -32602,
"message": "MCP error -32602: Invalid arguments for prompt agent_script_coco_was_sev2_ticket_details_retrieve: [
{
"code": "invalid_type",
"expected": "object",
"received": "undefined",
"path": [],
"message": "Required"
}
]"
}The key components are:
Formatted Error StructureThe formatted error will maintain the same information but present it in a more readable way: Implementation DetailsNew Error Formatter FunctionWe'll create a new function
fn format_mcp_error(err: &serde_json::Value) -> String {
// Extract the message field
if let Some(message) = err.get("message").and_then(|m| m.as_str()) {
// Check if the message contains a JSON array
if let Some(start_idx) = message.find('[') {
if let Some(end_idx) = message.rfind(']') {
let prefix = &message[..start_idx].trim();
let nested_json = &message[start_idx..=end_idx];
// Try to parse the nested JSON
if let Ok(nested_value) = serde_json::from_str::<serde_json::Value>(nested_json) {
// Format the error message
return format!(
"{}\n{}",
prefix,
serde_json::to_string_pretty(&nested_value)
.unwrap_or_else(|_| nested_json.to_string())
);
}
}
}
// If we couldn't extract and parse nested JSON, return the original message
return message.to_string();
}
// Fallback to pretty-printing the entire error
serde_json::to_string_pretty(err).unwrap_or_else(|_| format!("{:?}", err))
}Integration with Existing CodeWe'll modify the existing error display code to use our new formatter: if let Some(err) = prompts.error {
// If we are running into error we should just display the error
// and abort.
let to_display = serde_json::json!(err);
queue!(
self.output,
style::Print("\n"),
style::SetAttribute(Attribute::Bold),
style::Print("Error encountered while retrieving prompt:"),
style::SetAttribute(Attribute::Reset),
style::Print("\n"),
style::SetForegroundColor(Color::Red),
style::Print(format_mcp_error(&to_display)),
style::SetForegroundColor(Color::Reset),
style::Print("\n"),
)?;
// ...
}Error HandlingThe error formatter will include fallback mechanisms to ensure that even if parsing fails, the user will still see an error message:
Testing StrategyThe implementation should be tested with various error message formats:
Unit tests should verify that:
Implementation Considerations
|
|
Result when arguments object is omitted: Result when arguments object is malformed: |
|
Hey, sorry for such a late reply - this PR is out of date with the current implementation so I'm going to close it. Please raise if there's some other update you'd like to make here, thank you! |
Issue #, if available: 2043
Description of changes:
Clean up the error message shown to Q CLI users when
@<prompt>is invoked with missing/malformed inputs. See comments for more details.By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.