Multi-agent orchestration
A lead orchestrator plans the investigation, specialist agents query each engine, and a synthesizer consolidates the findings.
Ask a plain-English question — "why did my EMR job on cluster j-ABC123 fail?" — and a team of specialist agents investigates across your AWS analytics engines, then returns a root-cause answer with a recommended fix.
The system treats an investigation like an on-call engineer would: form a plan, gather evidence from whichever engines are relevant, then reason over it — grounded against a library of known failure patterns.
Planning is structured through forced tool calls; each specialist fails independently so one dead engine never sinks the whole investigation.
Built to turn “grep through terabytes of logs” into a conversation.
A lead orchestrator plans the investigation, specialist agents query each engine, and a synthesizer consolidates the findings.
Independent queries are dispatched concurrently via a thread pool; dependent steps (e.g. reading the actual S3 log file) wait on upstream evidence.
CloudWatch Logs Insights, Athena, EMR, S3 log files, OpenSearch, and Redshift — pick the right tool per question.
Answers are grounded against a Chroma vector store of 160 public failure patterns for Spark, EMR, S3, and CloudWatch.
Runs on the Anthropic API or Amazon Bedrock, switched with a single environment variable.
Every tool operates in strict read-only mode. Context is optimized with capped S3 reads (~200 KB) to stay inside the window.
Python 3.10+ with the Anthropic SDK, over the AWS analytics stack.
A CLI and a Python API, both read-only.
# install
git clone https://github.com/mannem/aws-log-detective-ai.git
cd aws-log-detective-ai
pip install -e .
# ask a question
log-detective "why did my EMR job on cluster j-ABC123 fail?"
# scope engines + get JSON, on Bedrock
log-detective "find 5xx spikes in my ALB logs in the last 6h" \
--engines athena,cloudwatch --backend bedrock --jsonfrom log_detective import Orchestrator, Settings
orch = Orchestrator(Settings.from_env())
result = orch.investigate("why did my emr job j-ABC123 fail?")
print(result.answer)