
AWS has published a technical blueprint for building multi-agent workflows that combine cost-optimized models from Amazon SageMaker AI with managed foundation models from Amazon Bedrock in a single runtime.
The approach lets specialized agents route tasks to whichever model best suits the job—for example, using Claude Haiku for orchestration, Claude Sonnet for budget analysis, and an open-weights model like Qwen 3.5 9B for financial analysis.
A key implementation challenge is that Bedrock AgentCore's built-in observability doesn't automatically track tokens from SageMaker endpoints; teams must manually emit OpenTelemetry spans and configure streaming parameters to make token usage visible for cost and latency monitoring.
What happened
AWS published a technical guide demonstrating how to build multi-agent systems that combine models hosted on Amazon SageMaker AI (like Qwen 3.5 9B) with managed models on Amazon Bedrock (Claude Haiku 4.5 and Claude Sonnet 4.6) in a single architecture using Amazon Bedrock AgentCore runtime.
Why it matters
Teams building AI agents often need cost optimization, data residency control, or domain-specific models that don't exist in managed services. This approach lets you use the cheapest or best model for each task without rewriting your agent framework, while keeping everything in a production-ready architecture.
What to watch
The post emphasizes a critical implementation detail: custom OpenTelemetry spans are required to capture token usage from SageMaker endpoints, since Bedrock AgentCore's default instrumentation doesn't track SageMaker inference metrics. Without the `stream_options: {"include_usage": true}` parameter on vLLM, token counts report as zero, making cost monitoring impossible.
AWS published a technical walkthrough showing how to build multi-agent workflows that blend models from Amazon SageMaker AI and Amazon Bedrock under a single Amazon Bedrock AgentCore runtime. The example system uses three agents: an orchestrator (Claude Haiku 4.5 on Bedrock) that classifies user intent and routes tasks, a budget agent (Claude Sonnet 4.6 on Bedrock) that handles 50/30/20 budget breakdowns using structured Pydantic output, and a financial analysis agent (Qwen 3.5 9B on SageMaker AI) that performs stock analysis and portfolio construction. User requests enter the orchestrator, which uses the agents-as-tools pattern from Strands Agents to route to either the budget or financial analysis agent; both call their respective models and return results back through the orchestrator.
The architecture combines three model-hosting paths: the orchestrator and budget agent invoke models through Amazon Bedrock, while the financial analysis agent invokes Qwen 3.5 9B through a SageMaker AI real-time endpoint using an OpenAI-compatible API. The post walks through deployment of Qwen 3.5 9B using the vLLM Deep Learning Container image vllm:0.22.1-gpu-py312-cu130 on ml.g6e.2xlarge (1× L40S GPU with 48GB VRAM), then shows how to integrate it into Strands Agents and ship the entire workflow to Amazon Bedrock AgentCore runtime using the bedrock-agentcore-starter-toolkit.
A critical implementation detail is observability. Amazon Bedrock AgentCore runtime automatically instruments agents using OpenTelemetry, but the default instrumentation has a blind spot: it recognizes Amazon Bedrock model calls (made through boto3) as generative AI operations and captures token counts automatically, but it does not recognize Amazon SageMaker OpenAI-compatible endpoints as generative AI calls. This means tokens consumed by the Qwen model are completely invisible in traces, making cost monitoring, regression detection, and latency debugging impossible. The root cause is that Strands' OpenTelemetry integration emits spans for tool calls and agent lifecycle events, but it doesn't emit gen_ai.chat spans with token attributes for the OpenAIModel provider. The solution is to manually emit a custom gen_ai.chat span that wraps the SageMaker agent invocation and extracts token usage from Strands' internal AgentResult.metrics.accumulated_usage dictionary. The keys are inputTokens, outputTokens, and totalTokens. A critical prerequisite is adding stream_options: {"include_usage": true} to the OpenAIModel parameters, because by default vLLM doesn't include a usage chunk in streaming responses—Strands receives text chunks but never a final usage object, so accumulated_usage stays at zero. With this parameter, vLLM sends an extra final chunk with token counts. The post includes example trace output showing a gen_ai.chat span with 1391 input tokens, 1432 output tokens, and 2823 total tokens, with a duration of 37237386894 nanoseconds, demonstrating token-level visibility for the SageMaker-hosted Qwen model alongside automatically instrumented Bedrock AgentCore spans.
The post addresses a real operational friction point: most AI teams have models scattered across different platforms. Bedrock hosts managed models, but specialized or cost-optimized models may live on SageMaker, or teams need to keep data in a specific region. Rather than force everything into one service or maintain separate agent frameworks, AWS shows how to unify them under a single orchestrator using the agents-as-tools pattern from Strands Agents. The architecture is pragmatic: an orchestrator agent (Claude Haiku 4.5) classifies user intent and routes to specialized agents, each of which can call its ideal model backend—Bedrock for managed APIs, SageMaker for custom or open-weights models accessed via OpenAI-compatible endpoints.
The deeper lesson in the post is about observability gaps. Bedrock AgentCore automatically instruments agents with OpenTelemetry, which sounds convenient until you realize it only recognizes Bedrock model calls. SageMaker endpoints remain invisible in traces, making cost monitoring and latency debugging impossible. The post's solution—manually emitting `gen_ai.chat` spans with token counts extracted from Strands' accumulated usage metrics—is practical but also a sign that cross-platform agent orchestration requires careful instrumentation planning. The emphasis on `stream_options: {"include_usage": true}` highlights another subtle pitfall: vLLM's default streaming behavior strips token counts, so without this flag, custom observability spans report zero usage even when implemented correctly.
AI-summarized, only the topics you pick — one digest a day via Email, Slack, or Discord.
Free · takes 30 seconds · unsubscribe anytime
Ask AI anything about this article. Q&As are published on this page for other readers too.
OpenAI is previewing Ultrafast mode, powered by Cerebras infrastructure from a ten-billion-dollar partnership…

Snowflake's Observe announced general availability of a redesigned MCP server and new CLI tool that give AI ag…

Tim O'Reilly, the publisher and tech pioneer, is promoting open-source AI—not just open-weight models, but the…

Kog, a French startup founded by Gaël Delalleau, is using deep GPU-level software optimization to accelerate A…

Meta released Glimmer, an open-weight AI model anyone can download and run on their own hardware, this week

IBM announced a partnership with OpenAI and a multi-year US$240 million agreement with Together AI to deploy N…

The AI news that matters, in one minute each morning.
Sign up free