A multi-agent business automation system built with PydanticAI that provides web research, email communication, database analysis, and workflow automation capabilities through a FastAPI backend and Streamlit frontend
Single tool (search_web_tool) with complete input schema and reasonable description. Naming follows verb_noun pattern (search_web). Schema includes proper types, descriptions, and constraints (count 1-20, defaults). However, output schema is not formally documented, only inferred from code comments. Error handling is present but generic (ValueError, Exception). No tool annotations (readOnlyHint, destructiveHint). Description is 94 chars, adequate but could be more prescriptive about when to use vs alternatives. Parameters are well-described with ranges and nullable flags. Risk classification (READ_ONLY) is correct but not exposed in schema metadata.
Pure function to search the web using Brave Search API.
Output schema not formally documented. Code returns List[Dict[str, Any]] with fields 'title', 'url', 'description', 'score', but no JSON Schema definition visible in tool registration or docstring.
API key exposed as tool parameter. Brave Search API key should be injected server-side via environment variable, not passed as a parameter. Secrets in tool params leak into logs and traces.
No tool annotations. Tool lacks readOnlyHint (true for search), destructiveHint, or idempotentHint metadata. LLMs cannot infer safety properties without explicit hints.
Error messages are generic. 'Rate limit exceeded' and 'Invalid Brave API key' are helpful, but no recovery guidance (e.g., 'Retry after 60 seconds' or 'Check your Brave dashboard for quota status').
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 54 | 2026-07-28+ | v2 |
No pagination support. Tool accepts offset/count but does not return total_count or next_cursor. Large result sets cannot be iterated safely.