Inspiration
Most people with money invested have no real idea if they're on track. They see a balance going up or down but get no explanation, no context, and no forward-looking guidance. A real financial advisor costs hundreds of dollars an hour - that's not realistic for most retail investors.
When the Amazon Nova Hackathon came up, I saw a chance to build something I genuinely wanted to exist: an AI advisor that doesn't just show you data but actually explains your money, tells you what your allocation means, and gives you a real probability of hitting your retirement goals.
What it does
Stratos is a multi-agent AI financial advisor. You add your investment accounts and positions, set your retirement goal and target income, and hit one button. Six AI agents - all powered by Amazon Nova Pro on Bedrock - go to work:
- A Portfolio Reporter writes a full written analysis of your holdings, diversification, risk exposure, and actionable recommendations
- A Charter generates interactive visualizations of your asset allocation, geographic exposure, and sector breakdown
- A Retirement agent runs 500 Monte Carlo simulations and tells you the probability you can sustain your target income across a 30-year retirement
- A Tagger automatically classifies any new instruments by asset class, sector, and region
- A Planner orchestrates the whole pipeline
- A Researcher runs autonomously every two hours, browsing financial websites and building a live knowledge base that enriches every report with current market context
You get a complete financial picture in under a minute - report, charts, and retirement projection - all in one place.
How we built it
Agent framework: OpenAI Agents SDK with LiteLLM routing all calls to Amazon Nova Pro via Bedrock. Every agent is a separate Lambda function with its own prompt, tools, and output contract enforced by Pydantic.
Orchestration: When a user triggers an analysis, the API drops a message onto an SQS queue with a dead-letter queue for fault tolerance. The Planner Lambda picks it up, runs the Tagger synchronously, then invokes the Reporter, Charter, and Retirement agents in parallel. Each agent writes its result to its own dedicated JSONB column in Aurora Serverless v2, eliminating any write conflicts.
RAG pipeline: The Researcher agent runs on a rate(2 hours) EventBridge schedule inside an App Runner container. It uses Playwright MCP to autonomously browse financial websites, synthesizes the content, and sends it to an Ingest Lambda that embeds the text via a SageMaker Serverless endpoint (all-MiniLM-L6-v2, 384 dimensions) and stores the vectors in S3 Vectors. The Reporter queries topK=3 matches at report time to ground its analysis in recent market context.
Quality gate: After the Reporter writes its output, a Judge agent - also Nova Pro - reads the report and scores it 0-100. If the score falls below the threshold, the report is rejected and retried automatically. This is baked directly into the pipeline.
Infrastructure: Fully serverless on AWS - Lambda, Aurora Serverless v2, SageMaker Serverless, App Runner, CloudFront. All provisioned with Terraform across 8 independent modules. CloudWatch dashboards monitor Nova Pro token usage and agent performance across every run.
Frontend: Next.js 15 static export with Tailwind CSS v4, served via CloudFront CDN. Clerk handles authentication and JWT validation on every API request.
Challenges we ran into
Parallel write conflicts. When three Lambda functions finish at different times and try to update the same database record, race conditions are a real problem. The fix was giving each agent its own dedicated column - report_payload, charts_payload, retirement_payload - so they never touch the same data. Bedrock rate limits under load. During testing with multiple simultaneous analysis runs, Bedrock rate limit errors surfaced frequently. We implemented Tenacity-based exponential backoff across every agent (4–60 second windows, up to 5 retries) to handle this transparently without surfacing errors to the user. Researcher reliability. Financial websites have paywalls, dynamic JavaScript content, and bot detection. Getting the Playwright MCP integration to extract consistently useful content - and having the agent gracefully skip pages it couldn't read rather than failing entirely - required significant prompt tuning and fallback handling. Making a 60-second wait feel alive. When the pipeline takes up to a minute to complete, a blank loading spinner kills the experience. We built a real-time agent progress visualization on the Advisor Team page - each agent lights up as it activates - so the wait feels intentional.
Accomplishments that we're proud of
The LLM-as-a-Judge quality gate. Using Nova Pro to evaluate its own pipeline's output - and automatically rejecting reports below a quality threshold - is something that genuinely works in practice. Seeing it catch and discard poor reports in testing validated the entire approach.
S3 Vectors for RAG. Replacing OpenSearch Serverless with S3 Vectors cut the idle infrastructure cost of the knowledge base by roughly 90% - from ~$200–300/month down to ~$20–30 - with no meaningful tradeoff in retrieval quality for this use case.
Fully autonomous research loop. The Researcher agent running on a schedule, browsing the web, and enriching the knowledge base without any human trigger is the piece that makes Stratos feel like a living system rather than a static tool.
End-to-end production infrastructure. Eight Terraform modules, dead-letter queues, exponential backoff on every agent, Clerk JWT auth, LangFuse tracing, CloudWatch dashboards - this is built to the standard of something you'd actually ship.
What we learned
The biggest lesson was how much agent design matters. Early versions used one large prompt and produced inconsistent output. Breaking the work into six focused agents - each with a single responsibility, typed inputs, and validated outputs - made quality dramatically more predictable and each piece independently debuggable.
We also learned that structured output is non-negotiable for multi-agent systems. The Tagger returning a clean Pydantic model, the Charter returning valid Recharts JSON, the retirement agent returning typed projections — every downstream agent depends on the one before being correct. Pydantic validation at every boundary caught bugs early that would have been invisible otherwise.
And practically: never plan on fixing quality problems with a bigger prompt. The Judge pattern - a second model evaluating the first - is a far more reliable quality mechanism than trying to engineer a single perfect prompt.
What's next for Stratos
Multi-account tax optimization. The database already models multiple accounts per user. The logical next step is a Tax agent that analyzes asset location - which holdings belong in taxable vs. tax-advantaged accounts - and surfaces concrete rebalancing recommendations.
Portfolio rebalancing suggestions. The Planner currently reports on where you are. Adding a Rebalancer agent that generates a specific trade list to bring your allocation in line with your targets is a natural extension.
Real brokerage connections. Right now users enter positions manually. Integrating with brokerage APIs to pull positions automatically would remove the biggest friction point in the onboarding experience.
Alerts and scheduled reports. Running the full analysis pipeline on a weekly schedule and delivering the report by email - without the user needing to log in and trigger it manually.
Built With
- amazon-api-gateway
- amazon-cloudfront
- amazon-cloudwatch
- amazon-eventbridge
- amazon-sqs
- amazon-web-services
- aurora
- aws-app-runner
- aws-lambda
- bedrock-(nova-pro
- claude-3.7-sonnet)
- docker
- massive
- python
- s3
- terraform
- typescript
Log in or sign up for Devpost to join the conversation.