{"slug": "amazon-bedrock-agents-orchestrating-google-adk-over-a2a", "title": "Amazon Bedrock Agents Orchestrating Google ADK over A2A", "summary": "An Amazon Bedrock master agent, built with Strands Agents and hosted on AWS, delegates to a Google ADK worker on GCP Cloud Run over the A2A v1.0 protocol. The master cross-checks the worker against an MCP exchange-rate tool and measures latency, reliability, and failure behavior of cross-cloud verification. The benchmark also compares performance with a previous run using Microsoft Foundry in Azure.", "body_md": "This article explains how to build and test a cross-cloud currency agent. An **Amazon Bedrock master agent**, built with Strands Agents and hosted on **Amazon Bedrock AgentCore Runtime** in AWS `us-east-1`\n\n, delegates to a **Google ADK worker** on GCP Cloud Run in `us-central1`\n\nover **A2A v1.0**. The master cross-checks the worker against an MCP exchange-rate tool and measures the latency, reliability, and failure behavior of cross-cloud verification.\n\nMost Agent-to-Agent (A2A) protocol demos stop at \"look, the HTTP 200 OK request succeeded.\" That is a smoke test, not an interoperability benchmark.\n\nThis project goes further: the Bedrock master owns the user interaction and benchmark policy. It discovers and calls a Google ADK worker running on GCP Cloud Run, then compares the worker result with a local MCP stdio exchange-rate tool backed by live Frankfurter daily reference rates.\n\nWe also compare the performance, developer experience, and wire compatibility with a previous benchmark run using **Microsoft Foundry in Azure** (`gpt-5-mini`\n\n). Together, the runs cover components hosted across AWS, Azure, and GCP.\n\nThe benchmark addresses four questions:\n\nThis builds directly on the currency agent from the previous articles in this series:\n\nThat agent — built with Google ADK, Gemini 2.5 Flash, and a FastMCP exchange-rate server backed by the free [Frankfurter API](https://www.frankfurter.dev/) — serves as the remote worker and independent verifier in this project.\n\nThe new repository adds the AgentCore coordinator and benchmark suite:\n\n```\nCLI / Boto3 Test Runner (AWS SigV4 Auth)\n       |\nBedrock AgentCore Runtime hosted master      (AWS, us-east-1, Amazon Nova Micro)\nStrands Agents orchestration\n       |\n       +-- MCP stdio --> Frankfurter rates      (in-container stdio process)\n       |\n       +-- A2A v1.0 --> Cloud Run               (GCP, us-central1)\n                           |\n                        Google ADK worker       (gemini-2.5-flash)\n                           |\n                        MCP HTTP --> Frankfurter rates\n```\n\nThe Bedrock master answers every conversion request through three distinct evaluation modes:\n\n| Mode | What happens | Why it exists |\n|---|---|---|\n`mcp_only` |\nBedrock master calls the local MCP rate tool | Baseline single-agent performance |\n`a2a_only` |\nBedrock master delegates to the GCP ADK worker over A2A v1.0 | Measure remote-agent behavior and network latency |\n`verified` |\nMCP result independently checked against the remote ADK agent over A2A | Measure the accuracy-versus-overhead tradeoff |\n\nBoth sides read the same Frankfurter daily reference rates on purpose: when the two clouds disagree, that measures *protocol, model, and orchestration* behavior, not data-source skew.\n\nCurrency conversion is a poor job for an LLM and a good job for Python's `Decimal`\n\n. The domain layer is framework-independent and uses Pydantic models. Numeric agreement is evaluated in code using relative difference; no LLM is asked, \"Do these numbers look close to you?\"\n\n```\ndifference = abs(primary.converted_amount - verifier.converted_amount)\nrelative = difference / abs(primary.converted_amount)\nagreed = relative <= tolerance  # default 0.005 (0.5%)\n```\n\nThe failure policy is explicit rather than emergent:\n\n`unverified`\n\n.`\"verification unavailable\"`\n\nwarning.`validation`\n\n, `provider`\n\n, `authentication`\n\n, `transport`\n\n, `timeout`\n\n, `protocol`\n\n); never fabricate a rate.Because \"which layer broke\" is a core research question, every adapter exception is normalized into exactly one typed failure at the boundary.\n\nThe first attempt to connect the AgentCore coordinator to the Google ADK currency agent died immediately on invocation:\n\n```\na2a.utils.errors.MethodNotFoundError: Method not found\n```\n\n**Observed root cause:** a protocol-version mismatch between A2A v0.3.0 and v1.0, with **no automatic fallback negotiation** in the tested client.\n\n`a2a-sdk>=1.0`\n\n) calls the A2A v1.0 JSON-RPC method `SendMessage`\n\n.`a2a-sdk 0.3.x`\n\n) only expose the v0.3.0 method `message/send`\n\n.`protocolVersion: 0.3.0`\n\n— but attempted the v1.0 method anyway.The initial ecosystem package pins were also mutually exclusive:\n\n| Package |\n`a2a-sdk` Requirement |\nStatus |\n|---|---|---|\n`strands-agents 1.50.2` |\n`>=1.0.0,<2` |\nCompatible |\n`google-adk 2.1.0 – 2.4.0` |\n`>=0.3.4,<0.4` |\nIncompatible |\n`google-adk 2.5.0` |\n`>=0.3.4,<2` |\nCompatible ✅ |\n`a2ui-agent-sdk` (through 0.4.0) |\n`<0.4.0` |\nIncompatible ❌ |\n\n`google-adk 2.5.0`\n\nupdated its dependencies to support `a2a-sdk 1.x`\n\n. However, A2UI extensions currently pin the older v0.3.0 protocol. For this benchmark, A2UI was omitted so both AWS and GCP sides could operate on **A2A v1.0 ( a2a-sdk 1.1.2)**.\n\nDeploying the master to Amazon Bedrock AgentCore Runtime involved navigating several fast-moving SDK and platform details observed during our build on 2026-07-28:\n\nIn the account used for this build, Anthropic models such as Claude 3.5 Sonnet required a one-time use-case submission (`PutUseCaseForModelAccess`\n\n) and an AWS Marketplace subscription agreement. To keep the setup automated, we configured the coordinator to use **Amazon Nova Micro** (`us.amazon.nova-micro-v1:0`\n\n). Nova Micro required no approval form in our test account, supported native tool calling in the tested workflow, and produced subsecond model responses.\n\nIn our deployment, using the bare model ID (`amazon.nova-micro-v1:0`\n\n) returned an HTTP 400 `ValidationException`\n\nrequiring on-demand throughput configuration. Passing the regional **inference profile ID** (`us.amazon.nova-micro-v1:0`\n\n) resolved the error.\n\nThe older Python `pip`\n\n-based starter toolkit (`agentcore configure`\n\n/ `agentcore launch`\n\n) was deprecated in June 2026. Deployment now uses the official `@aws/agentcore`\n\nnpm CLI (Node 20+, CDK-based).\n\n`app/CurrencyCoordinator/main.py`\n\n)\n\n``` python\nfrom bedrock_agentcore.runtime import BedrockAgentCoreApp\nfrom strands import Agent, tool\nfrom coordinator.hosted_tool import run_currency_benchmark\nfrom model.load import load_model\n\napp = BedrockAgentCoreApp()\ntools = [tool(run_currency_benchmark)]\n\n# The full source defines a bounded, session-scoped agent factory here.\n\n@app.entrypoint\nasync def invoke(payload, context):\n    session_id = getattr(context, \"session_id\", \"default-session\")\n    agent = get_or_create_agent(session_id)\n    prompt = payload.get(\"prompt\", payload.get(\"messages\", \"\"))\n    result = await agent.invoke_async(prompt)\n    return {\"result\": str(result)}\n\nif __name__ == \"__main__\":\n    app.run()\n```\n\nThe hosted runtime also fails closed when its GCP worker is missing:\n\n```\n{ \"name\": \"CURRENCY_REQUIRE_GCP_ADK\", \"value\": \"1\" }\n```\n\nWith that setting, `a2a_only`\n\nand `verified`\n\nreturn\n\n`gcp_adk_not_configured`\n\nif `CURRENCY_A2A_ENDPOINT`\n\nis absent. A deployment\n\ncan no longer appear to exercise A2A while silently using a local fixture.\n\nThe Bedrock model configuration also sets `BEDROCK_MAX_TOKENS=1024`\n\nexplicitly to bound output and quota usage.\n\nThe remote verifier container colocates two processes: the FastMCP Frankfurter server on localhost and the A2A app listening on `$PORT`\n\n. Gemini API keys are retrieved securely from GCP Secret Manager:\n\n```\ngcloud secrets create gemini-api-key --data-file=\"$HOME/gemini.key\"\ngcloud run deploy currency-adk-a2a \\\n  --source adk_agent --region us-central1 \\\n  --allow-unauthenticated --min-instances=0 --max-instances=2 \\\n  --set-secrets \"GOOGLE_API_KEY=gemini-api-key:latest\" \\\n  --set-env-vars \"MCP_SERVER_URL=http://127.0.0.1:8081/mcp,GENAI_MODEL=gemini-2.5-flash\"\n```\n\nSetting `--min-instances=0`\n\nallows Cloud Run to scale to zero when idle. The coordinator's timeout is set to 60 seconds to accommodate initial container cold starts.\n\nThe repository includes a complete local test suite that runs deterministically without credentials or cloud infrastructure:\n\n```\n# 1. Clone & install dependencies\ngit clone https://github.com/xbill9/bedrock-adk-a2a-currency\ncd bedrock-adk-a2a-currency\npip3 install --user -e \".[dev]\"\n\n# 2. Run unit and integration tests (deterministic fixtures)\npytest\n\n# 3. Test local CLI modes\ncurrency-benchmark 100 USD CAD EUR --mode mcp_only\ncurrency-benchmark 100 USD CAD EUR --mode verified --transport mcp-stdio\n\n# 4. Execute full evaluation matrix\ncurrency-evaluate --output /tmp/currency-results.jsonl --summary /tmp/currency-summary.json\n```\n\nTo deploy and test the hosted Bedrock master:\n\n```\n./infra/sync_app.sh\nagentcore deploy -y\nagentcore invoke \"Convert 100 USD to EUR and CHF in verified mode.\"\n```\n\nOn 2026-07-29, I deployed the updated master to AgentCore Runtime in\n\n`us-east-1`\n\nand invoked all three modes through the hosted\n\n`InvokeAgentRuntime`\n\nAPI:\n\n| Hosted mode | Observed result |\n|---|---|\n`mcp_only` |\nHTTP 200; live `mcp-stdio:frankfurter-live` quote |\n`a2a_only` |\nHTTP 200; live `gcp-adk-a2a-worker` quote |\n`verified` |\nHTTP 200; MCP and GCP ADK agreed exactly for EUR and CHF |\n\nThe verified request converted 100 USD to EUR and CHF. The deterministic\n\ncomparison recorded `relative_difference: \"0\"`\n\nand `agreed: true`\n\nfor both\n\ncurrencies, with no failures or warnings. The benchmark tool completed in\n\napproximately 3.08 seconds.\n\nThis was an end-to-end smoke test, not a full hosted latency distribution. It\n\nexercised the complete path:\n\n```\nAWS SigV4 invocation\n  → AgentCore Runtime\n  → Nova Micro tool selection\n  → MCP stdio / Frankfurter\n  → A2A v1.0\n  → GCP Cloud Run\n  → Google ADK / Gemini\n  → deterministic Decimal comparison\n```\n\nThe smoke test also found a real orchestration bug. On the first request,\n\nNova Micro read “Convert 100 USD to EUR” but claimed the target currency was\n\nmissing and asked the user to confirm it. The master prompt now includes an\n\nexplicit natural-language parsing rule and forbids confirmation requests for\n\ninformation already present. After redeployment, the same request called the\n\nbenchmark tool directly. A regression test preserves that behavior.\n\nWe executed the 38-case evaluation matrix across all three modes: 114 records\n\nper run. The 2026-07-28 warm run exercised the framework-independent\n\ncoordinator locally against the live GCP Cloud Run ADK endpoint; it did\n\n**not** measure the AgentCore hosting layer. The 2026-07-27 run is the\n\nretained Azure-era baseline. Keeping those labels explicit avoids attributing\n\nlocal harness latency to AgentCore.\n\n| Observed run | Evaluation mode | Success rate | Median latency | p95 latency | Agreement rate |\n|---|---|---|---|---|---|\n| 2026-07-28 warm local harness → GCP | `mcp_only` |\n100% | 286 ms | 540 ms | N/A |\n| 2026-07-28 warm local harness → GCP | `a2a_only` |\n100% | 2.09 s | 6.10 s | N/A |\n| 2026-07-28 warm local harness → GCP | `verified` |\n100% | 1.87 s | 4.33 s | 96.77% |\n| 2026-07-27 Azure-era baseline → GCP | `mcp_only` |\n100% | 297 ms | 1.09 s | N/A |\n| 2026-07-27 Azure-era baseline → GCP | `a2a_only` |\n100% | 1.69 s | 4.82 s | N/A |\n| 2026-07-27 Azure-era baseline → GCP | `verified` |\n100% | 1.71 s | 4.15 s | 96.77% |\n\n`message/send`\n\n) and v1.0 (`SendMessage`\n\n) are wire-incompatible. If you see `MethodNotFoundError`\n\n, inspect the `a2a-sdk`\n\nversion on both client and server before debugging prompt logic.`us.amazon.nova-micro-v1:0`\n\n) avoided the on-demand throughput error returned for the bare model ID.`Decimal`\n\narithmetic prevents LLM calculation errors from affecting conversion and agreement checks. The checks therefore measure differences in returned results, not the model's arithmetic ability.`mcp_only`\n\npath is useful as a baseline, while cross-cloud A2A verification adds an independent result for failover and anomaly detection. Whether the overhead is justified depends on the workload.The complete benchmark codebase, deployment scripts, test suite, and raw evaluation datasets are available on GitHub:\n\nIf you are building multi-cloud agent systems with Amazon Bedrock AgentCore, Google ADK, or Microsoft Agent Framework, feedback and benchmark contributions are welcome.", "url": "https://wpnews.pro/news/amazon-bedrock-agents-orchestrating-google-adk-over-a2a", "canonical_source": "https://dev.to/gde/amazon-bedrock-agents-orchestrating-google-adk-over-a2a-5c2b", "published_at": "2026-07-29 19:14:47+00:00", "updated_at": "2026-07-29 19:34:37.942199+00:00", "lang": "en", "topics": ["artificial-intelligence", "ai-agents", "ai-infrastructure", "ai-research", "developer-tools"], "entities": ["Amazon Bedrock", "Google ADK", "GCP Cloud Run", "Strands Agents", "Frankfurter API", "Microsoft Foundry", "Azure", "A2A"], "alternates": {"html": "https://wpnews.pro/news/amazon-bedrock-agents-orchestrating-google-adk-over-a2a", "markdown": "https://wpnews.pro/news/amazon-bedrock-agents-orchestrating-google-adk-over-a2a.md", "text": "https://wpnews.pro/news/amazon-bedrock-agents-orchestrating-google-adk-over-a2a.txt", "jsonld": "https://wpnews.pro/news/amazon-bedrock-agents-orchestrating-google-adk-over-a2a.jsonld"}}