Inspiration
Every day, tens of millions of people ask Alexa+ or a conversational AI assistant a deceptively simple question: "What's happening with the federal autonomous robotaxi bill?" or "Should schools ban smartphones?"
Behind the scenes, a single AI model compresses a contested reality into one confident voice response. In doing so, three dangerous things happen:
- Framing is disguised as fact: Different state-of-the-art models (Claude Opus 5.5, Claude Sonnet 5.5, GPT-6.1 Sol, Amazon Nova Pro, DeepSeek V4.1, and GLM-5.3) weigh economic velocity, precautionary regulation, local governance, and civil liberties very differently—even when reading the exact same primary news articles.
- Model agreement is mistaken for truth: Even when models agree, they may simply share training-data priors rather than independent verification.
- Blind spots vanish: What none of the models mention—such as disability paratransit equity, rural grid interconnection queues, or municipal enforcement budgets—is invisible to the consumer.
We built PRISM (One Story. Many AI Perspectives.) for the Build, Ship, Shape: Amazon Developer Hackathon so consumers on Alexa+ and the web can hear and see the full spectrum of frontier AI reasoning in seconds—never mistaking a single model's lens for the whole truth.
Core Technical Innovation: AWS Strands Agent Decider 2B & #context-memory
Naive multi-model apps dump raw outputs from multiple LLMs into a giant synthesizer prompt—suffering from "lost-in-the-middle" attention dilution, uncalibrated stance labels, and hallucinated quotes.
PRISM introduces a System-One / System-Two Decision-Model Architecture powered by the AWS Strands Agents SDK and our fine-tuned Strands Agent Decider 2B (StrandsAgents/strands-decider-2B-qwen3.5-v1-2610):
- 24-Slot Restricted Decision Head (
T = 1.0545): Built onQwen/Qwen3.5-2B-Basewith a merged LoRA adapter and a 24-token output vocabulary (no,yes,noui,0..9,A..J,unknown), the Decider produces temperature-calibrated softmax probability distributions in a single forward pass. - 42 Shared-Prefix Micro-Decisions per Story: Across our 6 frontier models, the Decider evaluates 7 structured decisions per model (reusing a cached KV prefix across all 7 queries):
- Refusal Gate (
noui): Separates refusals or non-answers (P(yes) >= 0.45) so they are never forced onto the stance spectrum. - 4-Way Calibrated Stance Classification (
choice): Computes calibrated probabilities across Pole A, Conditional Center, Pole B, and Unclear—mapping each model onto a continuous0..100spectrum and calculating the 0–100 AI Divergence Index. - Passage Relevance Scoring (
0..3): Scores every paragraph[P1..P4]of each model's response for direct argumentative signal.
- Refusal Gate (
#context-memoryStrands SDK Hook (ContextMemoryIntervention): Registers onBeforeModelCallEventinside the AWS StrandsAgent, pruning 35%–55% of low-signal filler text before synthesis while deterministically verifying 100% of featured quotes as exact character-for-character substrings of the selected passages.
6-Model Hybrid AWS Bedrock + Frontier Roster
PRISM combines Amazon Bedrock native inference with state-of-the-art OpenRouter Frontier models in parallel:
- Claude Opus 5.5 (
Anthropic,anthropic/claude-opus-5.5) - Claude Sonnet 5.5 (
Anthropic,anthropic/claude-sonnet-5.5) - GPT-6.1 Sol (
OpenAI,openai/gpt-6.1-sol) - Amazon Nova Pro (
Amazon · AWS Bedrock,us.amazon.nova-pro-v1:0) - DeepSeek V4.1 (
DeepSeek,deepseek/deepseek-v4.1-flash) - GLM-5.3 (
Z.AI,z-ai/glm-5.3)
What It Does — Three Experiences, One MCP Server
PRISM unifies three consumer experiences on the web and natively inside Alexa+ on Echo Show 15, all powered by a single production Streamable HTTP MCP server (2025-11-25):
1. Daily AI Divide (get_daily_ai_divide)
A daily briefing of the three breaking news stories where leading AI models diverge most sharply right now. Each story is scored with a 0–100 AI Divergence Index and distilled into a concise spoken briefing for Alexa+ alongside a rich visual card showing why models split.
2. Explore a Story (explore_story, list_stories, followup_question)
Select any breaking news story—or paste a live headline—and PRISM retrieves real reporting with clickable source citations, then refracts the story across six frontier AI families (Claude, GPT, Gemini, Grok, DeepSeek, and Amazon Nova). PRISM structures the output into:
- Shared Ground (Consensus): Empirical facts confirmed across models and primary sources.
- Fault Lines (Disagreements): The exact interpretive axes where models split (e.g., Federal Safety Uniformity vs. Municipal Street Control).
- Blind Spots: Crucial real-world context or affected groups omitted by standard AI summaries.
- Conversational Follow-Ups: Ask natural follow-up questions ("Why do Grok and Claude disagree on local city caps?") grounded strictly in the models' actual outputs and source articles.
3. Compare Perspectives (compare_perspectives, list_comparison_topics, followup_question)
Ask any complex policy, science, economic, or ethical question. Our fine-tuned Strands Agent Decider (Qwen3-1.7B) classifies the epistemic nature of the prompt (comparative, analytical, empathetic, or factual), sets epistemic calibration guardrails, dispatches parallel queries across leading model families, and audits every direct quotation against the primary source corpus using deterministic verbatim quote verification.
Interactive Echo Show 15 Alexa+ Simulator (Dual ElevenLabs Voices)
Because judges need to experience how PRISM feels on an actual Echo Show 15, we built a full-featured interactive Echo Show 15 Alexa+ Simulator right inside the web app:
- Real Autonomous MCP Tool Execution: Every spoken turn dispatches a real JSON-RPC 2.0
tools/callrequest to/mcp(get_daily_ai_divide→explore_story→followup_question→compare_perspectives), updating the Echo Show APL visual card and streaming the live MCP JSON-RPC payload in an inspectable developer drawer.
How We Built It
Streamable HTTP MCP Server (
backend/mcp_server.py):- Implemented the official
2025-11-25MCP specification (with backwards compatibility for2025-03-26) over Streamable HTTP at/mcp. - Supports
initialize,ping,tools/list,tools/call,resources/list,resources/read,prompts/list, andprompts/getwithMcp-Session-Idheader tracking. - Returns both Alexa+-ready spoken text (
content[].text) and rich structured data (structuredContent) for Echo Show APL cards.
- Implemented the official
AWS Strands Agent Decider &
#context-memoryOrchestration (backend/pipeline.py,patterns/context_memory/):- Uses a fine-tuned Qwen3-1.7B Strands Agent Decider hosted on AWS EC2 (
127.0.0.1:8099) to select the optimal epistemic strategy and inject anti-sycophancy, epistemic-calibration guardrails before multi-model fan-out. - Orchestrates every pipeline stage through our reusable
#context-memorypattern (ContextMemoryStore), recording explicitinput_fromlineage and SHA-256 content hashes for full auditability.
- Uses a fine-tuned Qwen3-1.7B Strands Agent Decider hosted on AWS EC2 (
Real News Retrieval, Caching & Deterministic Quote Auditing (
backend/news_engine.py,backend/followup.py):- Retrieves real news articles and primary sources (plus live Google News RSS & HackerNews Algolia search for custom story queries), caches structured multi-model analyses in
data/stories/anddata/topics/, and runsverify_quotes()to deterministically check every quoted span against primary sources.
- Retrieves real news articles and primary sources (plus live Google News RSS & HackerNews Algolia search for custom story queries), caches structured multi-model analyses in
Editorial Web app + Echo show 15 simulators (
frontend/src/):- Built with Next.js 15, React 19, Tailwind CSS v4, and Lucide Icons in a bespoke Edition Light design system (Warm Alabaster
#FAF7F2paper, Obsidian Ink#111318, Newsreader editorial serif headlines, Plus Jakarta Sans UI, and JetBrains Mono telemetry).
- Built with Next.js 15, React 19, Tailwind CSS v4, and Lucide Icons in a bespoke Edition Light design system (Warm Alabaster
Challenges We Ran Into
- Preventing Epistemic Overconfidence: Multi-model tools often treat "5 out of 6 models agree" as "factually true." We engineered explicit epistemic guardrails into both the MCP tool schemas and every UI surface: model consensus reflects shared training priors and source overlap, never factual verification, while direct quotes are audited deterministically against primary source text.
Accomplishments That We're Proud Of
One MCP Server Powering Both Web & Voice: The exact same
/mcpJSON-RPC endpoint powers our Echo Show 15 simulator, external MCP clients, and multi-turn voice drill-downs.Zero-Fabrication Multi-Model Transparency: Every story and comparison displays real model responses, explicit provenance metadata, and deterministic quote verification rates.
What We Learned
- MCP
structuredContentis a game-changer for multimodal assistants: By pairing conversationaltextblocks with typedstructuredContentin MCP2025-11-25tool responses, a single tool call can drive both natural Alexa+ speech and rich Echo Show visual cards without brittle client-side parsing. - Small Fine-Tuned Deciders + Frontier Perspectives: Using a fast 1.7B Strands Agent Decider to classify epistemic strategy and enforce calibration rules before fanning out to frontier models yields dramatically sharper, less repetitive multi-model comparisons.
What's Next for PRISM
- Personalized Blind-Spot Alerts on Alexa+: Let users subscribe to recurring topics (e.g., grid reliability, biotech regulation, municipal policy) and receive proactive Echo Show notifications when frontier AI models open a new fault line above an 85/100 Divergence Index.
- Expanded Multimodal Source Auditing: Extend deterministic quote verification to audio transcripts from congressional hearings, earnings calls, and primary video broadcasts.
Live Links & Submission Assets
Live Consumer Web App & Echo Show 15 Simulator: https://prism.arcumet.com Live Streamable HTTP MCP Endpoint (2025-11-25): https://prism.arcumet.com/mcp / https://prism.35-166-228-8.sslip.io/mcp Public GitHub Repository: https://github.com/Garinmckayl/prism
Amazon Developer Product Feedback, Feature Requests & Friction Log (10% Judging Bonus)
1. Product Feedback & Feature Requests (Alexa+ MCP & AWS Strands Agents SDK)
- What Worked Exceptionally Well:
- MCP
2025-11-25structuredContent+contentDual Payload: Returning a concise spoken script incontent[].textalongside a strongly typed JSON object instructuredContentmade it effortless to drive both Alexa+ voice synthesis and rich Echo Show 15 visual cards from a singletools/callinvocation. - AWS Strands Agents SDK
BeforeModelCallEventHook: TheHookProvider/BeforeModelCallEventinterface instrands.hooksenabled our#context-memorypattern (ContextMemoryIntervention) to inspect and compress multi-model context cleanly before the synthesis LLM call.
- MCP
- Actionable Feature Requests:
- Native APL Card Preview in Alexa+ MCP Inspector: When registering a Streamable HTTP MCP server for Alexa+, developers would benefit enormously from a built-in validator that previews how
structuredContentbinds to Echo Show APL templates alongside the spoken TTS waveform. - First-Class Logit-Slot / Calibrated Decision Node in Strands Agents SDK: Adding a native
DecisionModelNode(slots=24, temperature_scale=1.0545)primitive tostrands-agentswould let developers plug small 1B–2B calibrated System-One classifiers directly into multi-agent graphs without writing custom logit-extraction middleware.
- Native APL Card Preview in Alexa+ MCP Inspector: When registering a Streamable HTTP MCP server for Alexa+, developers would benefit enormously from a built-in validator that previews how
2. Structured Friction Log Entries
Friction Entry #1: Streamable HTTP MCP Session Header Case-Sensitivity Across Proxies
- Task Attempted: Exposing the
/mcpStreamable HTTP endpoint (2025-11-25) behind Nginx TLS termination for Alexa+ and browser-based MCP Inspector clients. - Steps Taken: Sent
POST /mcpwithinitialize, readMcp-Session-Idfrom response headers, and passedMcp-Session-Idon subsequenttools/callrequests. - Expected vs. Actual: Expected browser clients and cross-origin MCP bridges to read
Mcp-Session-Idautomatically; instead, browsers blocked client JS from readingMcp-Session-IdandMCP-Protocol-Versionunless explicitly listed inAccess-Control-Expose-Headers. - Severity Rating: Medium (Breaks browser-based Echo Show simulators and web MCP inspectors if omitted).
- Workaround Used: Added explicit
expose_headers=["Mcp-Session-Id", "MCP-Protocol-Version"]in FastAPICORSMiddlewareand mirroredsession_idinside the JSON-RPC response metadata. - Actionable Suggestion: Document required
Access-Control-Expose-Headers(Mcp-Session-Id,MCP-Protocol-Version) prominently in the Alexa+ Remote MCP Server setup guide and starter templates.
Friction Entry #2: Cross-Region Inference Profile IDs vs. Base Model IDs on Amazon Bedrock Converse API
- Task Attempted: Invoking
Amazon Nova Proand fallback models viaboto3.client("bedrock-runtime").converse()inus-west-2. - Steps Taken: Initially called
converse(modelId="amazon.nova-pro-v1:0", ...)alongside cross-region inference profile IDs (us.amazon.nova-pro-v1:0). - Expected vs. Actual: Expected base model IDs and regional profile IDs to share unified entitlement errors; instead, certain foundation model IDs returned
ValidationException: Operation not allowedwhen on-demand invocation required theus.cross-region inference profile prefix. - Severity Rating: Medium (Causes runtime failures during multi-model parallel fan-out if not handled).
- Workaround Used: Built a hybrid multi-tier router in
backend/pipeline.py(query_single_bedrock_model) that pairsus.amazon.nova-pro-v1:0on AWS Bedrock with OpenRouter frontier endpoints and automatic fallback chains. - Actionable Suggestion: In
bedrock-runtimeValidationExceptionmessages, explicitly suggest the correspondingus.<provider>.<model>cross-region inference profile ARN/ID when on-demand base model invocation is restricted.
Friction Entry #3: Token Budget Starvation on Reasoning-Enabled Frontier Models in Parallel Fan-Out
- Task Attempted: Querying 6 heterogeneous frontier models (
Claude Opus 5.5,Claude Sonnet 5.5,GPT-6.1 Sol,Amazon Nova Pro,DeepSeek V4.1,GLM-5.3) under a uniformmax_tokens=320latency budget for voice briefings. - Steps Taken: Dispatched parallel requests with
max_tokens=320to keep outputs around 150 words ([P1]..[P4]). - Expected vs. Actual: Reasoning-first models (
DeepSeek V4.1,GPT-6.1 Sol) consumed the entiremax_tokensallocation inside internalreasoning_tokens, returning an emptymessage.contentstring ("") and triggering falseUnavailablestatuses. - Severity Rating: High (Silently drops models from the 6-model comparison matrix).
- Workaround Used: Configured model-aware reasoning controls in
invoke_openrouter_chat()("reasoning": {"enabled": False}fordeepseek-v4.1-flashand"reasoning": {"effort": "low"}withmax_tokens >= 520forgpt-6.1-sol), achieving 100% 6/6 model availability. - Actionable Suggestion: Standardize separate
max_reasoning_tokensandmax_output_tokensparameters across multi-model gateway SDKs so reasoning overhead never starves visible response tokens.
Built With
- alexa
- amazon-alexa
- amazon-web-services
- bedrock
- openrouter
- strands
Log in or sign up for Devpost to join the conversation.