<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Developers &amp; Practitioners</title><link>https://cloud.google.com/blog/topics/developers-practitioners/</link><description>Developers &amp; Practitioners</description><atom:link href="https://cloudblog.withgoogle.com/blog/topics/developers-practitioners/rss/" rel="self"></atom:link><language>en</language><lastBuildDate>Tue, 20 Oct 2026 19:20:53 +0000</lastBuildDate><image><url>https://cloud.google.com/blog/topics/developers-practitioners/static/blog/images/google.a51985becaa6.png</url><title>Developers &amp; Practitioners</title><link>https://cloud.google.com/blog/topics/developers-practitioners/</link></image><item><title>Claude Opus 5.5 and Claude Sonnet 5.5 are now available in Google Antigravity</title><link>https://cloud.google.com/blog/products/ai-machine-learning/claude-opus-55-and-claude-sonnet-55-available-in-antigravity/</link><description>&lt;div class="block-paragraph"&gt;&lt;p data-block-key="7jvio"&gt;Whether you are iterating on a quick bug fix or planning a complex migration, different tasks call for different models.&lt;/p&gt;&lt;p data-block-key="clmp"&gt;In keeping with Google Cloud's commitment to an open ecosystem and to give developers the right model for every job, &lt;b&gt;Claude Opus 5.5 and Claude Sonnet 5.5 are now available in Google Antigravity for Google Cloud customers.&lt;/b&gt; Claude Opus 5.5 is built for complex work while Claude Sonnet 5.5 is a faster, lower-cost complement.&lt;/p&gt;&lt;p data-block-key="prmr"&gt;Once enabled by an administrator, developers can select Claude Opus 5.5 and Sonnet 5.5 directly from the model picker. Administrators can also select Google’s Gemini models, including Gemini 3.8 Flash and Gemini 4 Argon. The models apply across Antigravity 2.0, Antigravity CLI and our recently released &lt;a href="https://antigravity.google/docs/ide/extensions/" target="_blank"&gt;Antigravity IDE extensions&lt;/a&gt; for VS Code, JetBrains IntelliJ, and Visual Studio. This lets you choose the right model for the job, under a unified enterprise billing and security boundary.&lt;/p&gt;&lt;p data-block-key="dj20l"&gt;In this post, we’ll share two engineering patterns for building in Antigravity using these models. To view the entire list of models supported in Antigravity across subscriptions, see our documentation &lt;a href="https://antigravity.google/docs/models/" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;h3 data-block-key="d8trn"&gt;Multi-model engineering patterns in Antigravity&lt;/h3&gt;&lt;p data-block-key="2ach2"&gt;Having multiple model families available inside the same agent harness unlocks practical multi-model workflows that improve code quality while controlling latency and cost.&lt;/p&gt;&lt;h3 data-block-key="a8ic8"&gt;&lt;b&gt;Pattern 1: Cross-model verification ("LLM-as-a-Judge") in loop and graph workflows&lt;/b&gt;&lt;/h3&gt;&lt;p data-block-key="a53gs"&gt;When building agentic loops or multi-step graph workflows, using the same model to both write code and review its own output can reinforce model-specific blind spots. Pairing two distinct model families, one as the implementer and another as the validator (judge), provides independent verification before moving to the next stage of a workflow.&lt;/p&gt;&lt;p data-block-key="eca00"&gt;In Antigravity, you can run this pattern either interactively or via automated subagents:&lt;/p&gt;&lt;ol&gt;&lt;li data-block-key="enlkk"&gt;&lt;b&gt;Plan and implement with Model A:&lt;/b&gt; Start in planning mode using &lt;code&gt;Claude Opus 5.5&lt;/code&gt; or &lt;code&gt;Gemini 4 Argon&lt;/code&gt; to design and implement a multi-file change.&lt;/li&gt;&lt;li data-block-key="c4jg9"&gt;&lt;b&gt;Validate with Model B:&lt;/b&gt; Before committing or advancing the loop, switch models, or invoke a one-shot &lt;code&gt;/model&lt;/code&gt; check in the CLI, to have a different model family critique the implementation against your test suite and requirements.&lt;/li&gt;&lt;/ol&gt;&lt;h3 data-block-key="fp277"&gt;&lt;b&gt;Pattern 2: Pairing reasoning models with Flash subagents&lt;/b&gt;&lt;/h3&gt;&lt;p data-block-key="2ce0q"&gt;Complex engineering tasks often combine a few high-reasoning decisions with dozens of high-volume, mechanical lookups (searching files, grepping logs, checking lint output, or classifying test failures). Running every lookup on a frontier model can increase both latency and spend.&lt;/p&gt;&lt;p data-block-key="ckd6t"&gt;Antigravity's Subagent customization system (&lt;code&gt;.agents/agents/*.md&lt;/code&gt;) lets you assign specific model tiers (&lt;code&gt;inherit&lt;/code&gt;, &lt;code&gt;flash&lt;/code&gt;, or &lt;code&gt;pro&lt;/code&gt;) to specialized subagents. When your primary session is running a more powerful model.&lt;/p&gt;&lt;p data-block-key="2l8u2"&gt;Subagents configured with &lt;code&gt;model: inherit&lt;/code&gt; use your active session model for deep reasoning subtasks.&lt;/p&gt;&lt;p data-block-key="cb05p"&gt;Subagents configured with &lt;code&gt;model: flash&lt;/code&gt; offload high-speed search, classification, and triage work to Gemini Flash models.&lt;/p&gt;&lt;p data-block-key="1fr9p"&gt;For example, you can define a fast log-triage subagent in &lt;code&gt;.agents/agents/test-triager.md&lt;/code&gt;:&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;---\r\nname: test-triager\r\ndescription: Runs unit tests, classifies failures, and returns a concise summary of failing assertions.\r\nmodel: flash\r\ntools:\r\n  - read\r\n  - edit\r\n---\r\n\r\nRun the requested test targets, classify any failures by root cause (compilation error, assertion failure, or timeout), and return a structured summary to the parent agent.&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe68bc2e510&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;p data-block-key="5p921"&gt;And a cross-model code reviewer subagent in &lt;code&gt;.agents/agents/gemini-judge.md&lt;/code&gt;:&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;quot;---\r\nname:cross-model-judge\r\ndescription: Independent LLM-as-a-judge verifier that audits diffs and edge cases using Gemini Pro.\r\nmodel: pro\r\ntools:\r\n  - read\r\n---\r\n\r\nReview the current workspace diff against the user&amp;#x27;s requirements. Check for regressions, missing edge-case tests, and security issues. Output a pass/fail verdict with specific line references.&amp;quot;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe68bb2efd0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;p data-block-key="5p921"&gt;With this setup, you can delegate rapid test-and-classify loops to &lt;code&gt;test-triager&lt;/code&gt; and trigger &lt;code&gt;cross-model-judge&lt;/code&gt; to validate the final diff, combining the strengths of each model in a single workflow.&lt;/p&gt;&lt;h3 data-block-key="fj5e3"&gt;Getting started&lt;/h3&gt;&lt;p data-block-key="eudoh"&gt;Claude Opus 5.5 and Claude Sonnet 5.5 are available now for Google Cloud customers using Antigravity:&lt;/p&gt;&lt;ol&gt;&lt;li data-block-key="19dsb"&gt;&lt;b&gt;Administrators (Gemini for business):&lt;/b&gt; Third-party partner models do not draw from the pooled Gemini Enterprise Standard and Plus edition monthly token quota. Instead, usage is billed on a pay-as-you-go basis through your existing Google Cloud Billing account, so overages must be enabled. Visit “Gemini Enterprise” &amp;gt; “Settings” &amp;gt; “AI developer tools” in the Google Cloud Console to configure overage billing, spend limits and authorize partner models for your organization. See &lt;a href="https://cloud.google.com/gemini/enterprise/docs/ai-developer-tools-settings"&gt;Configure AI developer tools settings&lt;/a&gt; for step-by-step instructions.&lt;/li&gt;&lt;li data-block-key="evit9"&gt;&lt;b&gt;Administrators (Gemini platform):&lt;/b&gt; You can also enable partner models if you are using Antigravity through the API in Gemini platform. Enable Claude models in Model Garden and complete the standard Anthropic terms.&lt;/li&gt;&lt;li data-block-key="1shb0"&gt;&lt;b&gt;Developers:&lt;/b&gt; Update to the latest version of Antigravity 2.0, the Antigravity CLI, or the Antigravity IDE extensions, and open the model picker (or run &lt;code&gt;/model&lt;/code&gt;) to select the right model for your task. To learn more about enterprise governance and multi-agent configuration, visit the &lt;a href="https://antigravity.google/docs/enterprise/" target="_blank"&gt;Google Antigravity Enterprise documentation&lt;/a&gt;. You can switch the active model between turns in the same conversation thread while preserving workspace state, open artifacts, and terminal context.&lt;/li&gt;&lt;/ol&gt;&lt;p data-block-key="c19fm"&gt;Note: Lightweight first-party Gemini models continue to run in the background to handle high-frequency client-side coordination, such as context management and summaries. They consume first-party tokens and can incur charges.&lt;/p&gt;&lt;/div&gt;</description><pubDate>Tue, 20 Oct 2026 16:00:00 +0000</pubDate><guid>https://cloud.google.com/blog/products/ai-machine-learning/claude-opus-55-and-claude-sonnet-55-available-in-antigravity/</guid><category>Developers &amp; Practitioners</category><category>AI &amp; Machine Learning</category><og xmlns:og="http://ogp.me/ns#"><type>article</type><title>Claude Opus 5.5 and Claude Sonnet 5.5 are now available in Google Antigravity</title><description></description><site_name>Google</site_name><url>https://cloud.google.com/blog/products/ai-machine-learning/claude-opus-55-and-claude-sonnet-55-available-in-antigravity/</url></og><author xmlns:author="http://www.w3.org/2005/Atom"><name>Marialaura Garcia</name><title>Product Marketing Manager</title><department>Google Cloud</department><company></company></author><author xmlns:author="http://www.w3.org/2005/Atom"><name>Rich Hyndman</name><title>Developer Relations</title><department>Google Antigravity</department><company></company></author></item><item><title>Developer’s guide to implementing MCP apps in Gemini</title><link>https://cloud.google.com/blog/topics/developers-practitioners/devs-guide-to-mcp-apps-in-gemini/</link><description>&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Enterprise assistants still respond mostly in text. However, that can break down for visual, multi-step work, where every adjustment costs another slow chat turn.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/modelcontextprotocol/ext-apps" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;MCP Apps&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; (&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;SEP-1865&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;) solves this. This open Model Context Protocol (MCP) extension pairs a tool with a live UI. In &lt;/span&gt;&lt;a href="https://business.gemini.google/?utm_source=cloud.google.com/blog"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Gemini Enterprise&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, that UI renders directly in the chat flow inside a sandboxed iframe, and can expand to fullscreen or a side panel. Edits run locally while the workspace and assistant stay synchronized.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;You also avoid rebuilding core foundations: Gemini provides workforce sign-in, governed data access, and the Default Assistant, while you host your MCP server on a private &lt;/span&gt;&lt;a href="https://cloud.google.com/run"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Cloud Run&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; service.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Why we need MCP Apps&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Enterprise assistants have evolved through three generations:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Generation 1 (Text chatbots):&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Returns static markdown with no interactive controls.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Generation 2 (Standard MCP tools):&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Invokes live APIs, but outputs static text. Every change requires another model turn.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Generation 3 (Interactive MCP Apps):&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Pairs each tool with a live workspace. Adjustments happen in the widget without a model turn, while the assistant stays in sync.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Building MCP Apps in Gemini delivers six benefits:&lt;/span&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Responsive user experience:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Single-click actions execute directly in the panel without round-tripping through the chat.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Purpose-built workflows:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Deliver visual redaction views for legal review, 3D viewers for CAD, or sensitivity models for finance.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Enterprise security:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Workforce OAuth sign-in, private Cloud Run ingress, and a sandboxed iframe protect every layer.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Human-in-the-loop governance:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Experts inspect and approve high-stakes actions before execution.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Open standard:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Portable across compatible hosts, with automatic text fallback.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Broad connectivity:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Connect to BigQuery, Agent Platform, Cloud Storage, or internal ERP and CRM systems.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;High-level architecture&lt;/span&gt;&lt;/h3&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/2-high_level_architecture.max-1000x1000.png"
        
          alt="2-high level architecture"&gt;
        
        &lt;/a&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Three decoupled tiers work together:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Client browser:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Shows the chat alongside the MCP App widget in the side panel.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Gemini Enterprise:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; The default assistant calls tools, the AppBridge proxy relays widget messages, and the connector manages OAuth.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Google Cloud (your project):&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; You deploy and host the MCP server on Cloud Run, which exposes one JSON-RPC endpoint (/mcp), runs background jobs, and serves the single-file HTML widget.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Each tier talks only to its neighbor, letting Gemini Enterprise enforce security and routing.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Authentication with two independent layers&lt;/span&gt;&lt;/h3&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/3-Authentication.max-1000x1000.png"
        
          alt="3-Authentication"&gt;
        
        &lt;/a&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Each user signs in through OAuth 2.0. On every call, Gemini Enterprise sends its service agent token alongside the user's OAuth token:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Layer 1 (Cloud Run IAM):&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Enforced at Google's edge, this answers &lt;/span&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;"which service may call?"&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; Public access is disabled; unauthorized callers receive &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;HTTP 403&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Layer 2 (In-App OAuth):&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Enforced inside the application, this answers &lt;/span&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;"which user is calling?"&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; Failed verification returns &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;HTTP 401&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;, prompting the user to sign in again.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Cloud Run IAM cannot distinguish end users, so both layers are required. Outbound calls use a least-privilege service account.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Build, deploy on Google Cloud, and register in Gemini Enterprise&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;First, &lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;build your custom MCP server (exposing POST /mcp and a bundled ui:// HTML widget) using the&lt;/span&gt;&lt;a href="https://github.com/modelcontextprotocol/ext-apps" rel="noopener" target="_blank"&gt;&lt;span style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;MCP Apps SDK&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, or use &lt;/span&gt;&lt;a href="https://antigravity.google/" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Google Antigravity&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;  to scaffold and deploy your MCP App with this starter prompt:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Build an MCP App for Gemini Enterprise using the create-mcp-app skill (https://github.com/modelcontextprotocol/ext-apps/tree/main/plugins/mcp-apps/skills/create-mcp-app).&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Workflow: [describe your input data, side-panel UI controls, and approval or export actions].&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Generate a single-file HTML widget, a Streamable HTTP backend (POST /mcp) with &amp;lt;2s async tool responses and get_app_state polling, and Cloud Run deployment commands (--no-allow-unauthenticated, --no-cpu-throttling, --min-instances=1).&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Once your MCP server code is ready, deploy it to Cloud Run and connect it to Gemini Enterprise&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Step 1: Enable APIs&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; for Cloud Run, Discovery Engine, Agent Platform, and Organization Policy.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Step 2: Deploy your MCP server container to Cloud Run from source &lt;/strong&gt;&lt;code style="vertical-align: baseline;"&gt;(gcloud run deploy &amp;lt;service&amp;gt; --source .&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;)&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; with &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;--no-allow-unauthenticated, --no-cpu-throttling&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; so background work does not freeze between polls, and &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;--min-instances=1&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Step 3: Grant the invoker role&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; (&lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;roles/run.invoker&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;) to your Discovery Engine service agent (Layer 1).&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;&lt;strong style="vertical-align: baseline;"&gt;Step 4: Create an OAuth 2.0 Web Client&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; with redirect URI &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;https://vertexaisearch.cloud.google.com/oauth-redirect&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;(Layer 2).&lt;/span&gt;&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Step 5: &lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;Override the &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;discoveryengine.managed.disableCustomMcpServerConnector&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; constraint and complete the&lt;/span&gt;&lt;a href="https://cloud.google.com/gemini/enterprise/docs/connectors/custom-mcp-server/set-up-custom-mcp-server#before-you-begin"&gt;&lt;span style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Before you begin&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;prerequisites &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;(roles/discoveryengine.editor&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; for the admin,&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; allowedEgressFqdns&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; for your server and OAuth hosts, and&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;custom_mcp&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;in&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;allowedDataSources&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; if enforced). Then, in the Google Cloud Console under Gemini Enterprise &amp;gt; Data stores &amp;gt; Create data store, select Custom MCP Server and register the connector:&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div align="left"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;&lt;table style="width: 98.1723%;"&gt;&lt;colgroup&gt;&lt;col style="width: 34.0211%;"/&gt;&lt;col style="width: 65.9803%;"/&gt;&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col" style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Configuration field&lt;/strong&gt;&lt;/p&gt;
&lt;/th&gt;
&lt;th scope="col" style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Value&lt;/strong&gt;&lt;/p&gt;
&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;MCP Server URL&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;code style="vertical-align: baseline;"&gt;https://&amp;lt;your-cloud-run-service&amp;gt;.run.app/mcp&lt;/code&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Authorization URL&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;code style="vertical-align: baseline;"&gt;https://accounts.google.com/o/oauth2/v2/auth&lt;/code&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Token URL&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;code style="vertical-align: baseline;"&gt;https://oauth2.googleapis.com/token&lt;/code&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Client ID and Secret&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Your Web OAuth 2.0 Client ID and Secret&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Scopes&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;code style="vertical-align: baseline;"&gt;openid email profile&lt;/code&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Enable PKCE Support&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Checked (recommended)&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Use HTTP Basic Auth&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Unchecked&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; (avoids &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;invalid_client&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; errors)&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Step 6: &lt;/strong&gt;&lt;a href="https://cloud.google.com/gemini/enterprise/docs/connectors/custom-mcp-server/set-up-custom-mcp-server#enable-actions"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Enable actions&lt;/strong&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; on your data store. Gemini Enterprise imports your MCP server's tools as actions and disables them by default. In the Cloud Console, open Gemini Enterprise &amp;gt; Data stores &amp;gt; [Your MCP Data Store] &amp;gt; Actions, click Reload custom actions (which calls&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;tools/list&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; on your server), select your model-visible tools, and click Enable actions.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/4-Step_6_enable_actions.max-1000x1000.png"
        
          alt="4-Step 6 enable actions"&gt;
        
        &lt;/a&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong style="vertical-align: baseline;"&gt;Step 7: &lt;/strong&gt;&lt;a href="https://cloud.google.com/gemini/enterprise/docs/connectors/connect-existing-data-store"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Connect the data store to your app&lt;/strong&gt;&lt;/a&gt;&lt;strong style="vertical-align: baseline;"&gt;. &lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;Open &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Gemini Enterprise &amp;gt; Apps &amp;gt; [Your App] &amp;gt; Connected data stores &amp;gt; Add existing data stores&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;, and select your MCP data store. Connecting it as a data store gives the built-in Default Assistant access to your MCP tools and UI widget directly in main chat ( do not use "Add Agent,"  which is for external sub-agents rather than MCP data stores).&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/5-Step_7_connect_datastore.max-1000x1000.png"
        
          alt="5-Step 7 connect datastore"&gt;
        
        &lt;/a&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Build your own&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;An MCP App pairs backend tools with a live workspace in Gemini Enterprise. You do not build a chat frontend or identity pipeline; you deploy one Cloud Run container and attach it as a Data Store, making Gemini Enterprise where enterprise work gets done.&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Try Gemini &lt;/strong&gt;&lt;a href="https://auth.business.gemini.google/login?continueUrl=https://business.gemini.google/?utm_source%3Dcloud.google.com/blog%26referrer%3Dhttps://www.google.com/&amp;amp;wiffid=CAoSJGE0ZDBiMWMwLWVmYTUtNGExNy1iNTUzLWM0ODFmNGY4NmJjNQ"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;here&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Co-build with Google Antigravity &lt;/strong&gt;&lt;a href="https://antigravity.google/" rel="noopener" target="_blank"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;here&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Build on Google Cloud:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;a href="https://github.com/modelcontextprotocol/ext-apps" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;MCP Apps Specification (SEP-1865)&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;a href="https://cloud.google.com/run"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Cloud Run&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, and &lt;/span&gt;&lt;a href="https://cloud.google.com/ai"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Google Cloud AI&lt;/span&gt;&lt;/a&gt;&lt;strong style="vertical-align: baseline;"&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;</description><pubDate>Mon, 19 Oct 2026 16:00:00 +0000</pubDate><guid>https://cloud.google.com/blog/topics/developers-practitioners/devs-guide-to-mcp-apps-in-gemini/</guid><category>Developers &amp; Practitioners</category><og xmlns:og="http://ogp.me/ns#"><type>article</type><title>Developer’s guide to implementing MCP apps in Gemini</title><description></description><site_name>Google</site_name><url>https://cloud.google.com/blog/topics/developers-practitioners/devs-guide-to-mcp-apps-in-gemini/</url></og><author xmlns:author="http://www.w3.org/2005/Atom"><name>Dave Wang</name><title>Forward Deployed Engineer, Google Cloud</title><department></department><company></company></author></item><item><title>Four evaluation engineering lessons learned from building agent plugins</title><link>https://cloud.google.com/blog/topics/developers-practitioners/four-eval-engineering-lessons/</link><description>&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The real challenge of building an agentic system isn't the construction, it's the measurement.&lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt; &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Evaluation engineering is a critical foundation for building reliable AI systems. Setting up systematic, repeatable tests to measure your agent’s true behavior can be the difference between shipping a tool you can trust and one that silently breaks, fails to call APIs, or makes mistakes. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;I’ve run evaluation engineering initiatives for years at Google and d&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;eveloping the newly released&lt;/span&gt;&lt;a href="https://cloud.google.com/blog/topics/developers-practitioners/introducing-the-google-cloud-developer-plugin-for-ai-coding-agents?e=48754805"&gt;&lt;span style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;Google Cloud Developer plugin&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; served as a live testbed to stress-test these key principles across real-world developer workflows.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Here are four eval lessons we learned from building the new plugin that you can apply to your own builds.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;1. Grade the execution steps instead of the summary&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;When we first evaluated agents, we set up an LLM-as-judge to inspect the agent’s final text reply and scored it against a checklist. However, we quickly realized it’s fundamentally flawed because the grader only sees what the agent wrote, not what it actually did. &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;When we ran our initial 11-prompt evaluation suite for the Google Cloud Developer plugin, the automated grader marked it as failing three prompts. But when we opened the raw tool-call logs and read the transcripts, the plugin had actually passed all three. On a Cloud Run cleanup prompt, for instance, our rubric required checking command syntax before running anything. &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;The agent ran &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;gcloud help run services list&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; as its very first step. It did the work, but its final message was focused on warning the user about permanent data loss rather than reciting that it had checked the help docs.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/Image_1_XmJ1pt2.max-1000x1000.png"
        
          alt="Image 1"&gt;
        
        &lt;/a&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The grader penalized the agent for doing the right thing simply because it didn’t brag about it in the summary. If your rubric line says "did it run X?", a LLM judge is guessing unless you evaluate the actual tool-call trajectory.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Takeaway&lt;/strong&gt;&lt;strong style="vertical-align: baseline;"&gt;:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Don't grade an agent on its closing pitch. Score the raw execution trajectory to verify what commands were actually executed, validated, and scoped.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;2. Design evals for asynchronous operations&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;When you start reading tool-call trajectories, how you extract that telemetry matters just as much as what you're reading. Extracting agent telemetry into a flattened, sequential list of events obscures concurrent tool dispatch, which is one of the critical causes of behavioral failure. Modern agent harnesses often batch multiple tool invocations into a single assistant turn using an array of calls.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;In our evaluations, when an agent was asked to inspect an environment and look up documentation, the harness dispatched the skill-loading call and two documentation searches simultaneously within a single tool_calls payload. Because activating a skill is a multi-stage process, where the initial call returns a short launch stub and the subsequent turn injects the full instruction body, the instructions meant to govern the search arrived in the prompt context after the system had already executed the searches.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/image_2_CHyk3qC.max-1000x1000.png"
        
          alt="image 2"&gt;
        
        &lt;/a&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The system never gave the skill a dedicated turn to let its guidance influence the agent's actions. If telemetry pipelines strip out turn structures and merge calls into a flat timeline, engineers will waste days wondering why an agent disregarded unambiguous instructions that a developer embedded in a skill.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Takeaway&lt;/strong&gt;&lt;strong style="vertical-align: baseline;"&gt;: &lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;Preserve turn structure in telemetry extractors so you can identify when client-side parallel dispatch issues tool calls before injected guidance enters the context window. &lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;3. Test live runs and "dry runs" side-by-side&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;You need to inspect real API calls to catch harness quirks, like parallel dispatch. But if you only test your agent in one environment condition, you're flying half-blind. From day one, you need to run two conditions side-by-side: a live run and a plan-only run. &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;In the live condition, the agent has real, sandboxed credentials and actually executes commands. This is how you see if syntax works, parameters serialize cleanly, and the agent exercises restraint before doing something destructive. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Live runs frequently hit an unexpected permission error on step two and abort before you ever reach the behavior you’re trying to test. That's why you need the plan-only condition, where you strip credentials and tell the agent to explain what it would do without running anything. This strips out permission roadblocks and shows you the model’s pure reasoning and routing intent. Roughly half our most important findings came from the delta between the two.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/image_3_OixTmu5.max-1000x1000.png"
        
          alt="image 3"&gt;
        
        &lt;/a&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;For example, on one of our onboarding prompts, a live run was blocked immediately on a project list call. The plan-only run sailed right through and produced an 8,000-character plan that completely ignored organization policies, admin approvals, and governance. The live run masked a major cognitive flaw that the plan-only run exposed in seconds.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Takeaway&lt;/strong&gt;&lt;strong style="vertical-align: baseline;"&gt;:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Run live and plan-only evaluations side by side. Live runs test actual execution and safety restraint; plan-only runs expose the model's raw reasoning and routing without getting tripped up by permission errors.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;4. Use “golden sets” as durable baselines&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Frontier model architectures change every few months, agent harnesses improve, and plugin manifest standards will inevitably evolve. When building the Google Cloud Developer plugin, we treated evaluations as continuous integration testing for these non-deterministic environments. That means we stress-tested the composite stack, including the harness, the live model, and the tools running together on realistic tasks.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Instead of guessing from the final text output, this approach captures the whole trajectory: what the agent thought, what commands it actually ran, and whether it solved the problem without breaking anything. Then you score that run against golden sets curated by real human experts who know what the ideal path looks like.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Takeaway&lt;/strong&gt;&lt;strong style="vertical-align: baseline;"&gt;: &lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;Build golden sets based on what the entire system should actually do in the wild, including your harness, model, and plugins. Models change, but those baseline runs are your safety net.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Reminder: Use evaluation suites over “one-shot” demos&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;A common mistake I see among engineers is what I like to call the one-shot demo. This is when someone feeds a prompt into a LLM, watches it build a complete 3D game or solves a Rubik’s cube in a single pass and calls it an eval. But in reality, this is just a vanity metric. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;To do quality work with AI, I truly believe that you need evaluation suites. Without evaluations, teams are like literally running into a dark cave blind. Engineering an enterprise-grade agent means testing the system's ability to handle multi-step interactions, manage permissions, and avoid destructive outcomes like accidentally deleting a project because you asked it to "find opportunities to save costs."&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Where to go from here&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Building an agent plugin or MCP server is the beginning. Shipping something you can actually trust with real cloud infrastructure requires significantly more work in evaluations to ensure it’s doing what you expect it to do. At the end of the day, the only thing that outlasts model churn is a stress-tested eval suite. &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;Check out the Google Cloud Developer plugin &lt;/span&gt;&lt;a href="https://g.dev/cloud/dev-setup" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;documentation&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; or explore this &lt;/span&gt;&lt;a href="https://g.dev/cloud/agent-plugins-codelab-agy" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;codelab&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; to get started with the plugin in Antigravity.&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;/p&gt;&lt;/div&gt;</description><pubDate>Fri, 16 Oct 2026 16:00:00 +0000</pubDate><guid>https://cloud.google.com/blog/topics/developers-practitioners/four-eval-engineering-lessons/</guid><category>AI &amp; Machine Learning</category><category>Developers &amp; Practitioners</category><media:content height="540" url="https://storage.googleapis.com/gweb-cloudblog-publish/original_images/blog-post-banner_4eel_v2_2.png.jpg" width="540"></media:content><og xmlns:og="http://ogp.me/ns#"><type>article</type><title>Four evaluation engineering lessons learned from building agent plugins</title><description></description><image>https://storage.googleapis.com/gweb-cloudblog-publish/original_images/blog-post-banner_4eel_v2_2.png.jpg</image><site_name>Google</site_name><url>https://cloud.google.com/blog/topics/developers-practitioners/four-eval-engineering-lessons/</url></og><author xmlns:author="http://www.w3.org/2005/Atom"><name>Casey West</name><title>Developer Relations Lead, AI Infrastructure &amp; Applied Engineering, Google Cloud</title><department></department><company></company></author></item><item><title>One Agent Development Kit, five languages</title><link>https://cloud.google.com/blog/topics/developers-practitioners/one-agent-development-kit-five-languages/</link><description>&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;When we talk about agents, that doesn't necessarily mean we're talking about Python. In today's modern ecosystem, an agent might run as a high-concurrency Go microservice on &lt;/span&gt;&lt;a href="https://cloud.google.com/run"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Cloud Run&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, or &lt;/span&gt;&lt;a href="https://github.com/google/adk-js/blob/main/core/src/models/chrome_prompt_llm.ts" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;live inside a browser tab&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; calling Chrome's on-device model. Yet many agent frameworks assume a Python-only stack. That assumption forces teams to either spin up a Python service just for their agent workloads, or to build agent orchestration logic from scratch in their own language.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Google's &lt;/span&gt;&lt;a href="https://adk.dev/" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Agent Development Kit (ADK)&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; &lt;span style="vertical-align: baseline;"&gt;removes that trade-off with &lt;/span&gt;coverage for &lt;/span&gt;&lt;a href="https://github.com/google/adk-python" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Python&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;a href="https://github.com/google/adk-go" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Go&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;a href="https://github.com/google/adk-js" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;TypeScript&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;a href="https://github.com/google/adk-java" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Java&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, and &lt;/span&gt;&lt;a href="https://github.com/google/adk-kotlin" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Kotlin&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;. Each version of the ADK is built from the ground up for its own runtime and type system, while sharing a unified architecture with interoperability through open protocols.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span style="vertical-align: baseline;"&gt;A shared foundation&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Picking a language doesn't lock in your architecture: all five support the same open protocols. &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;ADK includes a &lt;/span&gt;&lt;a href="https://modelcontextprotocol.io/" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Model Context Protocol&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; client in every language, so a custom tool exposed as an MCP server can be called from any of them immediately.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;For multi-agent systems, ADK supports the &lt;/span&gt;&lt;a href="https://github.com/a2aproject/A2A" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Agent2Agent (A2A)&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; protocol, allowing an agent to communicate with a remote agent over HTTP. Through A2A, agents written in different languages or frameworks are interoperable.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span style="vertical-align: baseline;"&gt;Starting agent-first&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;To get started, run the one-time setup command to check your Google Cloud authentication, install the CLI, and then set up first-party ADK skills in coding agents like &lt;/span&gt;&lt;a href="https://antigravity.google/" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Antigravity&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;a href="https://docs.anthropic.com/en/docs/claude-code" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Claude Code&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, or &lt;/span&gt;&lt;a href="https://github.com/openai/codex" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Codex&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;uvx google-agents-cli setup&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe690641690&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Then, run the scaffold command to generate a working project with A2A endpoints and deployment config for Cloud Run, &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/gemini-enterprise-agent-platform/build/runtime"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Gemini Enterprise Agent Runtime&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, or &lt;/span&gt;&lt;a href="https://cloud.google.com/kubernetes-engine"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Google Kubernetes Engine (GKE)&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;# Scaffold an ADK project (use --agent adk for Python or --agent adk_go for Go)\r\nagents-cli scaffold create my-go-agent \\\r\n  --agent adk_go \\\r\n  --deployment-target cloud_run \\\r\n  --region us-central1&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe6906401d0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Both the &lt;/span&gt;&lt;a href="https://github.com/google/adk-python/tree/main/.agents/skills/adk-agent-builder" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;ADK for Python&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; and &lt;/span&gt;&lt;a href="https://github.com/google/adk-kotlin/tree/main/.agents/skills/adk-kotlin-agent-builder" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;ADK for Kotlin&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; repositories also ship agent builder skills in their source trees, and the &lt;/span&gt;&lt;a href="https://adk.dev/llms.txt" rel="noopener" target="_blank"&gt;&lt;code style="text-decoration: underline; vertical-align: baseline;"&gt;adk.dev/llms.txt&lt;/code&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; resource gives any coding agent on-demand API documentation across all five languages.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/one-agent-development-kit-five-languages-a.max-1000x1000.jpg"
        
          alt="one-agent-development-kit-five-languages-architecture"&gt;
        
        &lt;/a&gt;
      
        &lt;figcaption class="article-image__caption "&gt;&lt;p data-block-key="9ieq2"&gt;Coding-agent skills scaffold your project while MCP and A2A connect all five language runtimes.&lt;/p&gt;&lt;/figcaption&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h2&gt;&lt;span style="vertical-align: baseline;"&gt;Hands-on view of each ADK&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The clearest way to feel the difference between the five languages is to define the same weather tool in each one and see how its design fits the runtime.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Python&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;In &lt;/span&gt;&lt;a href="https://github.com/google/adk-python/blob/main/contributing/samples/core/quickstart/agent.py" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;ADK for Python&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, you don't need a decorator or a schema builder class. You pass a plain Python function into the &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;tools&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; parameter, and ADK inspects its signature, type hints, and docstring at startup to automatically construct the tool declaration and &lt;/span&gt;&lt;a href="https://docs.pydantic.dev/latest/" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Pydantic&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; parameter schema:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;from google.adk.agents.llm_agent import Agent\r\n\r\n\r\ndef get_weather(city: str) -&amp;gt; dict:\r\n  &amp;quot;&amp;quot;&amp;quot;Retrieves the current weather report for a specified city.\r\n\r\n  Args:\r\n      city (str): The name of the city for which to retrieve the weather report.\r\n  &amp;quot;&amp;quot;&amp;quot;\r\n  return {&amp;quot;status&amp;quot;: &amp;quot;success&amp;quot;, &amp;quot;report&amp;quot;: f&amp;quot;Sunny and 72F in {city}.&amp;quot;}\r\n\r\n\r\nroot_agent = Agent(\r\n    name=&amp;quot;weather_agent&amp;quot;,\r\n    model=&amp;quot;gemini-3.8-flash&amp;quot;,\r\n    instruction=&amp;quot;Answer questions about the weather in a city.&amp;quot;,\r\n    tools=[get_weather],\r\n)&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;lang-py&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe6906411d0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Beyond fast prototyping, Python is ADK's reference implementation, shipping the broadest set of Google Cloud integrations (&lt;/span&gt;&lt;a href="https://cloud.google.com/bigquery"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;BigQuery&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;a href="https://cloud.google.com/spanner"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Spanner&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;a href="https://cloud.google.com/bigtable"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Bigtable&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;) and model adapters (&lt;/span&gt;&lt;a href="https://ai.google.dev/gemini-api/docs" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Gemini&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, Anthropic, OpenAI, LiteLLM). Paired with the &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;adk eval&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; or &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;agents-cli eval run&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; commands&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;, its evaluation tooling scores agent trajectories against golden datasets in continuous integration (CI) to test the whole system end to end, even when your production service runs in another language.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Go&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;While Python leads in experimentation and evaluation, &lt;/span&gt;&lt;a href="https://github.com/google/adk-go/blob/main/examples/quickstart/main.go" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;ADK for Go&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; hits the sweet spot for production backend engineering.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;A Go tool function takes the &lt;/span&gt;&lt;a href="https://pkg.go.dev/google.golang.org/adk/v2/agent#Context" rel="noopener" target="_blank"&gt;&lt;code style="text-decoration: underline; vertical-align: baseline;"&gt;agent.Context&lt;/code&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; configuration and a strongly typed input struct. The &lt;/span&gt;&lt;a href="https://pkg.go.dev/google.golang.org/adk/v2/tool/functiontool#New" rel="noopener" target="_blank"&gt;&lt;code style="text-decoration: underline; vertical-align: baseline;"&gt;functiontool.New&lt;/code&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; function uses Go generics to infer both the input and output schemas from your &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;struct&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; tags:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;type GetWeatherArgs struct {\r\n\tCity string `json:&amp;quot;city&amp;quot; jsonschema:&amp;quot;The city to look up weather for.&amp;quot;`\r\n}\r\n\r\ntype GetWeatherResult struct {\r\n\tReport string `json:&amp;quot;report&amp;quot;`\r\n}\r\n\r\nfunc getWeather(_ agent.Context, args GetWeatherArgs) (GetWeatherResult, error) {\r\n\treturn GetWeatherResult{Report: &amp;quot;Sunny and 72F in &amp;quot; + args.City}, nil\r\n}\r\n\r\nweatherTool, err := functiontool.New(functiontool.Config{\r\n\tName:        &amp;quot;get_weather&amp;quot;,\r\n\tDescription: &amp;quot;Retrieves the current weather report for a city.&amp;quot;,\r\n}, getWeather)&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe690640bd0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Because the &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;functiontool.New&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; function is generic over your handler's signature, the Go compiler verifies that your function matches the expected contract before your binary ever runs.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Go was also the first language after Python to ship the &lt;/span&gt;&lt;a href="https://pkg.go.dev/google.golang.org/adk/v2/workflow" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;ADK 2.0 Graph Workflow runtime&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;. When you need deterministic control flow alongside LLM reasoning, the &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;workflow.New&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; function wires agents and plain Go functions into a directed graph with conditional routing and parallel steps:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;ag, err := workflowagent.New(&amp;quot;order_pipeline&amp;quot;, []workflow.Edge{\r\n\t{From: workflow.Start, To: triageNode},\r\n\t{From: triageNode, To: fulfillNode, Route: workflow.StringRoute(&amp;quot;fulfill&amp;quot;)},\r\n\t{From: fulfillNode, To: notifyNode},\r\n})&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe690643150&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Where Go really stands out is in production on Cloud Run and GKE. A compiled Go agent packages onto a roughly 2 MiB &lt;/span&gt;&lt;a href="https://github.com/GoogleContainerTools/distroless" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Google distroless static base image&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, with no language VM or heavy dependency tree. A static Go binary binds to its port as soon as the container starts, skipping the module imports of &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/run/docs/tips/general"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;dynamic languages&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; and the JAR unpacking and JIT warmup of &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/run/docs/tips/java"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;JVM services&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;After it's running, Go's concurrency model fits agent workloads naturally. Each goroutine starts with a &lt;/span&gt;&lt;a href="https://go.dev/doc/go1.4#runtime" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;2 KB stack&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; and &lt;/span&gt;&lt;a href="https://go.dev/doc/faq#goroutines" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;minimal scheduling overhead&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, so a single instance can multiplex thousands of concurrent streaming requests and tool calls. ADK for Go also includes &lt;/span&gt;&lt;a href="https://pkg.go.dev/google.golang.org/adk/v2/server/adka2a/v2" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;built-in A2A server handlers&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; and OpenTelemetry tracing out of the box.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;TypeScript&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;TypeScript erases type annotations when compiling to JavaScript, so runtime reflection isn't an option. Instead, &lt;/span&gt;&lt;a href="https://github.com/google/adk-js/blob/main/core/src/tools/function_tool.ts" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;ADK for TypeScript&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; pairs with &lt;/span&gt;&lt;a href="https://zod.dev/" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Zod&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;. You pass a &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;z.object(...)&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; schema to the &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;FunctionTool&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; function, and TypeScript statically infers the parameter types of your &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;execute&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; callback from that single declaration:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;import { FunctionTool, LlmAgent } from &amp;quot;@google/adk&amp;quot;;\r\nimport { z } from &amp;quot;zod&amp;quot;;\r\n\r\nconst getWeatherTool = new FunctionTool({\r\n  name: &amp;quot;get_weather&amp;quot;,\r\n  description: &amp;quot;Retrieves the current weather report for a city.&amp;quot;,\r\n  parameters: z.object({\r\n    city: z.string().describe(&amp;quot;The name of the city.&amp;quot;),\r\n  }),\r\n  execute: async ({ city }) =&amp;gt; {\r\n    return { status: &amp;quot;success&amp;quot;, report: `Sunny and 72F in ${city}.` };\r\n  },\r\n});\r\n\r\nexport const rootAgent = new LlmAgent({\r\n  name: &amp;quot;weather_agent&amp;quot;,\r\n  model: &amp;quot;gemini-3.8-flash&amp;quot;,\r\n  instruction: &amp;quot;Answer questions about the weather in a city.&amp;quot;,\r\n  tools: [getWeatherTool],\r\n});&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe690641350&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Your runtime input validation, the JSON Schema sent to the model, and your IDE autocomplete inside the &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;execute&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;callback &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;all flow from one source of truth.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;TypeScript also runs on the ADK 2.0 Graph Workflow engine and ships a &lt;/span&gt;&lt;a href="https://github.com/google/adk-js/blob/main/core/src/index_web.ts" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;standalone browser bundle&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;. Beyond Node.js services, you can run an ADK agent directly in a browser tab using &lt;/span&gt;&lt;a href="https://github.com/google/adk-js/blob/main/core/src/tools/webmcp/webmcp_toolset.ts" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;WebMCP&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; for page-level tools and Chrome's on-device &lt;/span&gt;&lt;a href="https://developer.chrome.com/docs/ai/prompt-api" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Prompt API&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Java&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/google/adk-java/blob/main/tutorials/city-time-weather/src/main/java/com/google/adk/tutorials/CityTimeWeather.java" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;ADK for Java&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; snaps right in for teams who have standardized on Maven, Gradle, and Spring Boot. You add&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;@Schema&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; annotations to method parameters and assemble agents by using a fluent &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;LlmAgent.builder()&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; API:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;public class WeatherTools {\r\n  public static Map&amp;lt;String, String&amp;gt; getWeather(\r\n      @Schema(name = &amp;quot;city&amp;quot;, description = &amp;quot;The name of the city&amp;quot;)\r\n      String city) {\r\n    return Map.of(&amp;quot;status&amp;quot;, &amp;quot;success&amp;quot;, &amp;quot;report&amp;quot;, &amp;quot;Sunny and 72F in &amp;quot; + city);\r\n  }\r\n}\r\n\r\nLlmAgent agent = LlmAgent.builder()\r\n    .name(&amp;quot;weather_agent&amp;quot;)\r\n    .model(&amp;quot;gemini-3.8-flash&amp;quot;)\r\n    .instruction(&amp;quot;Answer questions about the weather in a city.&amp;quot;)\r\n    .tools(FunctionTool.create(WeatherTools.class, &amp;quot;getWeather&amp;quot;))\r\n    .build();&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe690641f90&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;At runtime, the runner streams agent events reactively through &lt;/span&gt;&lt;a href="https://github.com/ReactiveX/RxJava" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;RxJava&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;. For local testing and existing JVM apps, ADK for Java ships a Maven Dev UI plugin alongside first-party bridges for Spring AI and LangChain4j.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Kotlin&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/google/adk-kotlin/blob/main/examples/src/main/kotlin/com/google/adk/kt/examples/tools/FunctionToolDemoAgent.kt" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;ADK for Kotlin&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; takes a strong stance on build-time safety. Its &lt;/span&gt;&lt;a href="https://kotlinlang.org/docs/ksp-overview.html" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Kotlin Symbol Processing (KSP)&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; compiler plugin reads &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;@Tool&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; and &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;@Param&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; annotations at build time and emits the tool schema directly into bytecode:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;class WeatherTools {\r\n  @Tool(\r\n    name = &amp;quot;get_weather&amp;quot;,\r\n    description = &amp;quot;Retrieves the current weather report for a city.&amp;quot;,\r\n  )\r\n  suspend fun getWeather(\r\n    @Param(&amp;quot;The name of the city.&amp;quot;) city: String\r\n  ): Map&amp;lt;String, String&amp;gt; = mapOf(&amp;quot;status&amp;quot; to &amp;quot;success&amp;quot;, &amp;quot;report&amp;quot; to &amp;quot;Sunny and 72F in $city&amp;quot;)\r\n}\r\n\r\nval agent = LlmAgent(\r\n  model = Gemini(&amp;quot;gemini-3.8-flash&amp;quot;),\r\n  name = &amp;quot;weather_agent&amp;quot;,\r\n  instruction = Instruction(&amp;quot;Answer questions about the weather in a city.&amp;quot;),\r\n  tools = WeatherTools().generatedTools(),\r\n)&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe6906417d0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;If a tool signature uses an unsupported type or declares a default value on a non-nullable parameter, your Gradle build fails immediately instead of breaking in production. Because the &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;.generatedTools()&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; function uses zero runtime reflection, it survives &lt;/span&gt;&lt;a href="https://developer.android.com/topic/performance/app-optimization/enable-app-optimization" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Android R8 shrinking&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;That zero-reflection design makes it possible to run the entire agent loop locally on Android. It offers JVM server support, including a Spring AI bridge and experimental ADK 2.0 graph workflows. On-device, ADK for Kotlin integrates with &lt;/span&gt;&lt;a href="https://ai.google.dev/edge/litert-lm" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;LiteRT-LM&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; for tool calling and &lt;/span&gt;&lt;a href="https://developers.google.com/ml-kit/genai" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;ML Kit&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; (Gemini Nano) for text generation. It also works with Room and AppSearch for local state, and Android AppFunctions for OS-level actions, all without requiring a network connection.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span style="vertical-align: baseline;"&gt;Choice without compromise&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Having five native languages in ADK means you don't have to pick a single runtime for your entire organization. Because every version of ADK speaks MCP and A2A, each component of your system can use the language that fits it best.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;What languages have you used to build agents with Google's ADK? Let me know what stack you're running on &lt;/span&gt;&lt;a href="https://x.com/kweinmeister" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;X&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;a href="https://www.linkedin.com/in/karlweinmeister/" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;LinkedIn&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, or &lt;/span&gt;&lt;a href="https://bsky.app/profile/kweinmeister.bsky.social" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Bluesky&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;</description><pubDate>Tue, 13 Oct 2026 12:22:00 +0000</pubDate><guid>https://cloud.google.com/blog/topics/developers-practitioners/one-agent-development-kit-five-languages/</guid><category>Developers &amp; Practitioners</category><media:content height="540" url="https://storage.googleapis.com/gweb-cloudblog-publish/images/one-agent-development-kit-five-languages-her.max-600x600.jpg" width="540"></media:content><og xmlns:og="http://ogp.me/ns#"><type>article</type><title>One Agent Development Kit, five languages</title><description></description><image>https://storage.googleapis.com/gweb-cloudblog-publish/images/one-agent-development-kit-five-languages-her.max-600x600.jpg</image><site_name>Google</site_name><url>https://cloud.google.com/blog/topics/developers-practitioners/one-agent-development-kit-five-languages/</url></og><author xmlns:author="http://www.w3.org/2005/Atom"><name>Karl Weinmeister</name><title>Director, Developer Relations</title><department></department><company></company></author></item><item><title>10 Years of the SRE book: Announcing the second edition of "Site Reliability Engineering”</title><link>https://cloud.google.com/blog/products/devops-sre/sre-book-second-edition/</link><description>&lt;div class="block-paragraph_advanced"&gt;&lt;div data-draftjs-conductor-fragment="{&amp;quot;blocks&amp;quot;:[{&amp;quot;key&amp;quot;:&amp;quot;3j2ba&amp;quot;,&amp;quot;text&amp;quot;:&amp;quot;A decade ago, Google released Site Reliability Engineering: How Google Runs Production Systems with O'Reilly Media. What began as a collection of our practices for managing large-scale infrastructure became a bestselling book, and inspired many organizations to adopt the reliability practices it outlined: applying software engineering to operations to build systems that are scalable, reliable, and sustainable.&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;unstyled&amp;quot;,&amp;quot;depth&amp;quot;:0,&amp;quot;inlineStyleRanges&amp;quot;:[{&amp;quot;offset&amp;quot;:30,&amp;quot;length&amp;quot;:64,&amp;quot;style&amp;quot;:&amp;quot;ITALIC&amp;quot;}],&amp;quot;entityRanges&amp;quot;:[],&amp;quot;data&amp;quot;:{}},{&amp;quot;key&amp;quot;:&amp;quot;6v23u&amp;quot;,&amp;quot;text&amp;quot;:&amp;quot;Over the past ten years, computing landscapes have undergone profound shifts. AI, microservices, multi-cloud deployments, serverless paradigms, and platform engineering have all reshaped how we build and operate software. To mark the 10th anniversary of the book's release, we are excited to announce the completely rewritten second edition of the Google SRE book, reflecting a decade of lessons learned both inside Google and across the broader industry, to offer fresh guidance tailored for today's operational challenges.&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;unstyled&amp;quot;,&amp;quot;depth&amp;quot;:0,&amp;quot;inlineStyleRanges&amp;quot;:[{&amp;quot;offset&amp;quot;:305,&amp;quot;length&amp;quot;:20,&amp;quot;style&amp;quot;:&amp;quot;ITALIC&amp;quot;}],&amp;quot;entityRanges&amp;quot;:[],&amp;quot;data&amp;quot;:{}},{&amp;quot;key&amp;quot;:&amp;quot;37phi&amp;quot;,&amp;quot;text&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;header-three&amp;quot;,&amp;quot;depth&amp;quot;:0,&amp;quot;inlineStyleRanges&amp;quot;:[],&amp;quot;entityRanges&amp;quot;:[],&amp;quot;data&amp;quot;:{}}],&amp;quot;entityMap&amp;quot;:{}}"&gt;
&lt;div class="Draftail-block--unstyled" data-block="true" data-editor="12ehc" data-offset-key="1woq2-0-0"&gt;
&lt;div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="1woq2-0-0"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;A decade ago, Google released &lt;/span&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;Site Reliability Engineering: How Google Runs Production Systems&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; with O'Reilly Media. What began as a collection of our practices for managing large-scale infrastructure became a bestselling book, and inspired many organizations to adopt the reliability practices it outlined: applying software engineering to operations to build systems that are scalable, reliable, and sustainable.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Over the past ten years, computing landscapes have undergone profound shifts. AI, microservices, multi-cloud deployments, serverless paradigms, and platform engineering have all reshaped how we build and operate software. To mark the 10th anniversary of the book's release, we are excited to announce the &lt;/span&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;completely rewritten&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; second edition of the Google SRE book, reflecting a decade of lessons learned both inside Google and across the broader industry, to offer fresh guidance tailored for today's operational challenges.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="block-paragraph_with_image"&gt;&lt;div class="article-module h-c-page"&gt;
  &lt;div class="h-c-grid uni-paragraph-wrap"&gt;
    &lt;div class="uni-paragraph
      h-c-grid__col h-c-grid__col--8 h-c-grid__col-m--6 h-c-grid__col-l--6
      h-c-grid__col--offset-2 h-c-grid__col-m--offset-3 h-c-grid__col-l--offset-3"&gt;

      






  

    &lt;figure class="article-image--wrap-small
      
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/SRE_Book_2e_Front_Cover.max-1000x1000.jpg"
        
          alt="SRE Book 2e Front Cover"&gt;
        
        &lt;/a&gt;
      
    &lt;/figure&gt;

  





      &lt;h3 data-block-key="1woq2"&gt;&lt;b&gt;Why update the book?&lt;/b&gt;&lt;/h3&gt;&lt;p data-block-key="4ebln"&gt;When we published the first edition, many organizations were focused on early cloud migrations and just starting to transition from monolithic architectures. Today, with organizations delivering software at a high velocity and at global scale, the challenge is no longer adopting cloud infrastructure, but maintaining high reliability in the face of the immense complexity.&lt;/p&gt;&lt;p data-block-key="fov6p"&gt;Modern production environments operate under constant change. System boundaries are more complex, dependencies are deep, and failure modes are more complex and damaging than ever before. The explosion of resource-intensive workloads like generative AI has changed the economics and operational requirements of infrastructure management.&lt;/p&gt;&lt;p data-block-key="au36"&gt;Writing this second edition required us to take a step back and evaluate what it takes to successfully implement SRE today.&lt;/p&gt;&lt;h3 data-block-key="2ne5h"&gt;&lt;b&gt;A decade of evolution: How SRE practices have progressed&lt;/b&gt;&lt;/h3&gt;&lt;p data-block-key="biefd"&gt;The second edition takes a deep dive into how foundational site reliability engineering practices have matured over the last ten years, shifting from manual, task-specific work toward automated, platform-wide capabilities. Consider, for example:&lt;/p&gt;&lt;p data-block-key="aset9"&gt;&lt;b&gt;SLOs and error budgets:&lt;/b&gt; In 2016, teams relied on basic availability metrics and manual error budget policies. Today, practices have matured into user-centric, multi-tiered SLOs with dynamic burn-rate alerting and automated policy enforcement.&lt;/p&gt;&lt;p data-block-key="7all2"&gt;&lt;b&gt;Monitoring and observability:&lt;/b&gt; Early setups centered on static dashboards, basic logs, and manual alert triage. Modern observability leverages OpenTelemetry, distributed tracing, and automated anomaly correlation to find root causes quickly.&lt;/p&gt;&lt;p data-block-key="fh1tc"&gt;&lt;b&gt;Automation and platforms:&lt;/b&gt; Operations have shifted from writing custom scripts for isolated tasks to using declarative infrastructure as code, internal developer platforms, and resilient, self-healing systems.&lt;/p&gt;&lt;p data-block-key="474b5"&gt;&lt;b&gt;Reliability testing:&lt;/b&gt; Rather than relying solely on scheduled game days and synthetic load tests, modern engineering embeds continuous resilience checks, automated pipeline testing, and live production canary verification.&lt;/p&gt;&lt;p data-block-key="cdtqm"&gt;&lt;b&gt;Capacity and resource management:&lt;/b&gt; Manual provisioning and static forecasting have been replaced by dynamic auto-scaling, cloud FinOps alignment, and dedicated cost and cluster optimization for GPU and TPU workloads.&lt;/p&gt;&lt;p data-block-key="6912j"&gt;&lt;b&gt;Organizational models:&lt;/b&gt; SRE has expanded beyond dedicated teams assigned to specific applications. Today's organizations use hybrid models, platform engineering integrations, and reliability champions embedded across product teams.&lt;/p&gt;&lt;h3 data-block-key="c90ef"&gt;&lt;b&gt;SRE in the age of AI&lt;/b&gt;&lt;/h3&gt;&lt;p data-block-key="4j8ge"&gt;Then there’s the dual relationship between SRE and artificial Intelligence: how SRE supports AI infrastructure, and how SRE teams use AI to enhance operational reliability.&lt;/p&gt;&lt;p data-block-key="4lti8"&gt;Running large language models (LLMs) and foundation models introduces novel reliability challenges. The book outlines methodologies for operating AI infrastructure at scale:&lt;/p&gt;&lt;ul&gt;&lt;li data-block-key="evk96"&gt;Managing massive GPU and TPU hardware cluster reliability and network topologies&lt;/li&gt;&lt;li data-block-key="c2kaq"&gt;Monitoring non-deterministic outputs and latency characteristics unique to AI&lt;/li&gt;&lt;li data-block-key="ejrm4"&gt;Ensuring pipeline reliability for continuous model training, fine-tuning, and data processing&lt;/li&gt;&lt;/ul&gt;&lt;p data-block-key="d09lr"&gt;AI is also rapidly becoming a force multiplier for reliability engineers. The second edition shares practical frameworks for enhancing human operational efficiency:&lt;/p&gt;&lt;ul&gt;&lt;li data-block-key="eb3ne"&gt;Using generative AI tools to assist in real-time incident triage and postmortem generation&lt;/li&gt;&lt;li data-block-key="71ae0"&gt;Interrogating complex system telemetry using natural language queries&lt;/li&gt;&lt;li data-block-key="672km"&gt;Using predictive machine learning models to identify resource bottlenecks before outages occur&lt;/li&gt;&lt;/ul&gt;&lt;h3 data-block-key="312c"&gt;&lt;b&gt;What hasn’t changed? The importance of culture&lt;/b&gt;&lt;/h3&gt;&lt;p data-block-key="4omqu"&gt;While technologies and architectures continuously evolve, the core principles of SRE remain intact, and are key to establishing a reliability-focused culture. Accordingly, the second edition re-emphasizes and expands upon the human elements of system engineering, and how to get there.&lt;/p&gt;&lt;p data-block-key="3rlcm"&gt;Whether you’re new to the field, a practitioner, an engineering manager, or a technology executive, the rewritten second edition of &lt;i&gt;Site Reliability Engineering&lt;/i&gt; serves as your definitive roadmap for the next era of production systems.&lt;/p&gt;&lt;p data-block-key="23tuu"&gt;You can order your copy today in physical format (see &lt;a href="https://www.google.com/books/edition/_/iXnw0QEACAAJ?kptab=getbook"&gt;Google Books&lt;/a&gt;) or digital format from &lt;a href="https://www.oreilly.com/library/view/site-reliability-engineering/9798341607675/"&gt;O'Reilly&lt;/a&gt;.&lt;/p&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;</description><pubDate>Mon, 12 Oct 2026 16:00:00 +0000</pubDate><guid>https://cloud.google.com/blog/products/devops-sre/sre-book-second-edition/</guid><category>Developers &amp; Practitioners</category><category>DevOps &amp; SRE</category><og xmlns:og="http://ogp.me/ns#"><type>article</type><title>10 Years of the SRE book: Announcing the second edition of "Site Reliability Engineering”</title><description></description><site_name>Google</site_name><url>https://cloud.google.com/blog/products/devops-sre/sre-book-second-edition/</url></og><author xmlns:author="http://www.w3.org/2005/Atom"><name>Betsy Beyer</name><title>SRE Program Manager</title><department></department><company></company></author><author xmlns:author="http://www.w3.org/2005/Atom"><name>David Huska</name><title>Software Engineer, Site Reliability Engineer</title><department></department><company></company></author></item><item><title>Announcing MCP Toolbox Java SDK v1.0: Agentic data access for the enterprise</title><link>https://cloud.google.com/blog/topics/developers-practitioners/announcing-mcp-toolbox-java-sdk-v10-agentic-data-access-for-the-enterprise/</link><description>&lt;div class="block-paragraph_advanced"&gt;&lt;p style="text-align: center; font-size: 0.8rem;"&gt;&lt;em&gt;&lt;span style="vertical-align: baseline;"&gt;Co-authors:&lt;/span&gt;&lt;/em&gt;&lt;br/&gt;&lt;em&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;strong&gt;Stenal Jolly&lt;/strong&gt;, Strategic Cloud Engineer, Google&lt;/span&gt;&lt;/em&gt;&lt;br/&gt;&lt;em&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;strong&gt;Anubhav Dhawan&lt;/strong&gt;, Software Engineer, Google&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Following the &lt;/span&gt;&lt;a href="https://medium.com/google-cloud/mcp-toolbox-v1-0-the-open-source-framework-for-secure-agentic-data-access-3c2199546ba8" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;landmark announcement&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; of MCP Toolbox v1.0, we're thrilled to announce that the &lt;a href="https://github.com/googleapis/mcp-toolbox-sdk-java" rel="noopener" target="_blank"&gt;MCP Toolbox Java SDK&lt;/a&gt; has officially reached version 1.0.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;This release brings first-class, type-safe agent orchestration to one of the world's most widely adopted enterprise ecosystems. Java's mature architecture is purpose-built for rigorous demands, providing the high concurrency, strict transactional integrity, and robust state management required to safely scale mission-critical AI agents in production.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;In this post, we'll tell you about what's new in Java SDK v1.0, show you a real-world example, and help you get started with your own implementation.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span style="vertical-align: baseline;"&gt;MCP: The universal interface&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Today, developers face a compounding integration bottleneck: if you have &lt;em&gt;N&lt;/em&gt; different AI models and &lt;em&gt;M&lt;/em&gt; enterprise data sources, you must build, secure, and maintain &lt;em&gt;N × M&lt;/em&gt; bespoke, custom connections. This lack of a unified integration layer forces engineering teams to rely on a fragmented web of ad-hoc pipelines. As a result, scaling an agentic architecture quickly becomes unsustainable, exposing sensitive enterprise databases to severe security vulnerabilities, fragmented access controls, and massive maintenance overhead.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Eliminating the fragmented web of custom integrations is the core problem solved by the Model Context Protocol (MCP). Acting as a universal interface—the "USB Type-C" for AI orchestration—MCP decouples models from data sources. Instead of writing custom or managed API integration code for every new model or database, developers write to a single, standardized protocol. This approach allows any MCP-compliant agent to securely and immediately interact with any MCP-enabled system. The MCP connection lets developers connect agents to real-world systems without building bespoke integrations for every new model.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span style="vertical-align: baseline;"&gt;What's new in Java SDK v1.0: Built for production workloads&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;When we announced the &lt;/span&gt;&lt;a href="https://medium.com/google-cloud/announcing-the-mcp-toolbox-java-sdk-2ed3171bbaa0" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;public Beta&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; for the MCP Toolbox Java SDK, our goal was to bring first-class, type-safe agent orchestration to enterprise Java environments. Since then, we've collaborated with developers and open-source contributors to harden our APIs.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The v1.0 release marks a stable, backwards-compatible foundation suitable for enterprise workloads. Here's what's new and hardened since our v0.2 release:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Transport layer abstraction &amp;amp; &lt;/strong&gt;&lt;code&gt;&lt;strong style="vertical-align: baseline;"&gt;HttpMcpTransport&lt;/strong&gt;&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;: We introduced a clean transport layer abstraction alongside &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;HttpMcpTransport&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;. This feature decouples the core protocol logic from underlying HTTP clients, making it easy to swap network implementations or customize connection pooling.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Decoupled client authentication&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: To simplify enterprise security compliance, client authentication is now decoupled using &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;CredentialsProvider&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; and &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;AuthMethods&lt;/code&gt; classes&lt;span style="vertical-align: baseline;"&gt;. Credentials are resolved asynchronously on every request, so teams can refresh tokens dynamically or plug in their own token source (Google OIDC via ADC ships in the box, anything else is a one-method interface).&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Default parameter support&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: Native support for default values in tool parameters, reducing prompt payload sizes and enhancing agent reliability.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Pruning bound parameters&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: Sensitive parameters that are bound server-side (like &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;tenant_id&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;) are now automatically stripped from exposed tool definitions so the LLM can't manipulate them.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Version selection &amp;amp; session tracking&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: Standardized MCP version selection and robust session tracking ensure consistent protocol negotiation and conversation-state lifecycles.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;HTTP credential exposure warnings&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: Added built-in detection that warns you at runtime when credentials are about to travel over a plaintext HTTP connection.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Generic client headers map&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: Easily attach custom corporate proxy headers, transaction tracing IDs, or correlation metadata to all outgoing requests.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;span style="vertical-align: baseline;"&gt;Get started with the Java SDK v1.0&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;We designed the MCP Toolbox Java SDK to be frictionless for enterprise teams. Just add the following dependency to your &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;pom.xml&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;&amp;lt;dependency&amp;gt;\r\n    &amp;lt;groupId&amp;gt;com.google.cloud.mcp&amp;lt;/groupId&amp;gt;\r\n    &amp;lt;artifactId&amp;gt;mcp-toolbox-sdk-java&amp;lt;/artifactId&amp;gt;\r\n    &amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;\r\n&amp;lt;/dependency&amp;gt;&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe690d80ad0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h2&gt;&lt;span style="vertical-align: baseline;"&gt;Real-world example: The autonomous transit concierge&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;To demonstrate the power of the Java SDK combined with AlloyDB, let's look at an enterprise use case.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Meet&lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt; Cymbal Transit&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;, a fictitious intercity bus network. Customers don't want to click through nested dropdown menus to plan a trip. They want to ask:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;"I need to get from New York to Boston tomorrow morning. Can I bring my Golden Retriever? If so, book me the fastest trip."&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;To answer this question, an AI agent must cross-reference unstructured data (pet policies) with structured data (schedules and seat availability) and execute a transaction (booking)—all while maintaining the context of the conversation.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;The foundation: AlloyDB schema with native embeddings&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;We used AlloyDB for this implementation because it handles relational data and high-dimensional vectors natively. Set up your database tables with these statements:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;quot;-- Enable necessary extensions for semantic search and embeddings\r\nCREATE EXTENSION IF NOT EXISTS vector;\r\nCREATE EXTENSION IF NOT EXISTS google_ml_integration;\r\n\r\n-- Table 1: Transit Policies (Unstructured Data for RAG)\r\nCREATE TABLE transit_policies (\r\n    policy_id SERIAL PRIMARY KEY,\r\n    category VARCHAR(50),\r\n    policy_text TEXT,\r\n    policy_embedding vector(768)\r\n);\r\n\r\n-- Table 2: Intercity Bus Schedules (Structured Data)\r\nCREATE TABLE bus_schedules (\r\n    trip_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),\r\n    origin_city VARCHAR(100),\r\n    destination_city VARCHAR(100),\r\n    departure_time TIMESTAMP,\r\n    arrival_time TIMESTAMP,\r\n    available_seats INT DEFAULT 50,\r\n    ticket_price DECIMAL(6,2)\r\n);\r\n\r\n-- Table 3: Booking Ledger (Transactional Action Data)\r\nCREATE TABLE bookings (\r\n    booking_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),\r\n    trip_id UUID REFERENCES bus_schedules(trip_id),\r\n    passenger_id VARCHAR(100),\r\n    status VARCHAR(20) DEFAULT &amp;#x27;CONFIRMED&amp;#x27;,\r\n    booking_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP\r\n);&amp;quot;), (&amp;#x27;language&amp;#x27;, &amp;#x27;lang-sql&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe690d83fd0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Mapping intents to SQL: The &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;tools.yaml&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The MCP Toolbox lets you define custom tools securely. Rather than granting the LLM direct database access, a &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;tools.yaml&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; configuration maps natural language intents directly to parameterized, safe queries:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;kind: source\r\nname: alloydb\r\ntype: alloydb-postgres\r\nproject: my-project\r\nregion: us-central1\r\ncluster: my-cluster\r\ninstance: my-instance\r\ndatabase: postgres\r\n---\r\nkind: tool\r\nname: query-schedules\r\ntype: postgres-sql\r\nsource: alloydb\r\ndescription: Find available bus schedules between cities.\r\nparameters:\r\n  - name: origin\r\n    type: string\r\n    description: The departure city name.\r\n  - name: destination\r\n    type: string\r\n    description: The arrival city name.\r\n  - name: limit\r\n    type: integer\r\n    description: Maximum number of schedules to return.\r\n    default: 5\r\nstatement: |\r\n  SELECT CAST(trip_id AS TEXT) AS trip_id, departure_time, ticket_price\r\n  FROM bus_schedules\r\n  WHERE lower(origin_city) = lower($1) AND lower(destination_city) = lower($2)\r\n  ORDER BY departure_time ASC\r\n  LIMIT $3&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe690d82a50&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;For the complete YAML file, see the &lt;/span&gt;&lt;a href="https://github.com/googleapis/mcp-toolbox-sdk-java/blob/main/demo-applications/cymbal-transit/tools.yaml" rel="noopener" target="_blank"&gt;&lt;code style="text-decoration: underline; vertical-align: baseline;"&gt;tools.yaml&lt;/code&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; file in the &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;mcp-toolbox-sdk-java&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; repository.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Stateful agent architecture in Spring Boot&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The hardest part of building conversational AI in enterprise applications is managing state: when a user asks, "What times are available?" and follows up with, "Book the 8 AM one," the agent must remember prior context across turns.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Using the Java MCP Toolbox SDK with Spring Boot and LangChain4j, we can cleanly maintain conversational memory in the HTTP Session and we can cleanly separate the agent into two declarative components:&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;A declarative agent interface that manages the prompt, tools, and conversational memory via an HTTP session.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;A tool execution service that routes agent requests directly to the MCP Toolbox server.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;interface TransitAgent {\r\n    @SystemMessage({\r\n        &amp;quot;You are the Cymbal Transit Concierge.&amp;quot;,\r\n        &amp;quot;Use the \&amp;#x27;querySchedules\&amp;#x27; tool for finding schedules.&amp;quot;,\r\n        &amp;quot;Use \&amp;#x27;bookTicket\&amp;#x27; to execute transactions.&amp;quot;,\r\n        &amp;quot;Use \&amp;#x27;searchPolicies\&amp;#x27; to look up luggage and pet rules.&amp;quot;\r\n    })\r\n    String chat(@MemoryId String sessionId, @UserMessage String userMessage);\r\n}\r\n\r\n@Service\r\nclass TransitAgentTools {\r\n    // These methods automatically invoke our MCP Toolbox server!\r\n    @Tool(&amp;quot;Query specific schedules between an origin and destination city.&amp;quot;)\r\n    public String querySchedules(String origin, String destination) { ... }\r\n\r\n    @Tool(&amp;quot;Book a ticket for a passenger.&amp;quot;)\r\n    public String bookTicket(String tripId, String passengerName) { ... }\r\n\r\n    @Tool(&amp;quot;Search transit policies for luggage and pet rules.&amp;quot;)\r\n    public String searchPolicies(String query) { ... }\r\n}&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe690d801d0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Notice how the &lt;code&gt;@MemoryId&lt;/code&gt; annotation abstracts session tracking: Spring Boot automatically correlates conversational context to the user's HTTP session. Meanwhile, LangChain4j and the MCP Toolbox handle schema translation and tool routing behind the scenes—no handwritten if/else intent parsing required.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;By pairing the MCP Toolbox Java SDK with LangChain4j, we achieve clean separation of concerns and effortless state management:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Zero-boilerplate session management&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: The &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;@MemoryId String sessionId&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; parameter binds conversation history directly to the user's HTTP session.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Declarative agent contract&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: The &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;TransitAgent&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; interface defines the model's persona and system instructions without complex prompt templating.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Type-safe tool execution&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: The &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;TransitAgentTools&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; Spring service wraps remote MCP database tools as native Java methods.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;This architecture ensures your agent remains modular: you can refine prompt guidance in the interface, manage user sessions automatically, and execute secure database queries through MCP Toolbox without tight coupling.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span style="vertical-align: baseline;"&gt;Connecting the dots: Listing, invoking, and executing tools in Java v1.0&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Now let's look under the hood of the &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;TransitAgentTools&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; interface. Inside those LangChain4j &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;@Tool&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; methods on our Spring &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;@Service&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;, the MCP Toolbox Java SDK handles the heavy lifting—bridging your Java service methods to the MCP tools defined in the &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;tools.yaml&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; file. In just a few lines of type-safe code, we can initialize our client using the new v1.0 decoupled authentication and headers abstractions:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;// 1. Initialize the Client with Decoupled Auth and Custom Headers (v1.0)\r\nString serviceUrl = &amp;quot;https://toolbox-my-project-uc.a.run.app/mcp&amp;quot;;\r\nMcpToolboxClient mcpClient = McpToolboxClient.builder()\r\n    .baseUrl(serviceUrl)\r\n    .credentialsProvider(new GoogleCredentialsProvider(serviceUrl)) // Decoupled OIDC credentials\r\n    .headers(Map.of( // Generic client headers\r\n        &amp;quot;X-Correlation-ID&amp;quot;, &amp;quot;enterprise-session-abc123&amp;quot;,\r\n        &amp;quot;X-Client-Platform&amp;quot;, &amp;quot;Spring-Boot&amp;quot;\r\n    ))\r\n    .build();\r\n\r\n// 2. Listing Discoverable Tools\r\nmcpClient.listTools().thenAccept(tools -&amp;gt; {\r\n    System.out.println(&amp;quot;Successfully discovered &amp;quot; + tools.size() + &amp;quot; tools.&amp;quot;);\r\n});\r\n\r\n// 3. Invoking a Tool (Read-Only Data with Default Parameter Support)\r\n// &amp;quot;limit&amp;quot; is omitted: the SDK fills it from the default in the tool definition\r\nString schedules = mcpClient.loadTool(&amp;quot;query-schedules&amp;quot;)\r\n    .thenCompose(tool -&amp;gt; tool.execute(Map.of(\r\n        &amp;quot;origin&amp;quot;, &amp;quot;New York&amp;quot;,\r\n        &amp;quot;destination&amp;quot;, &amp;quot;Boston&amp;quot;)))\r\n    .join().text();\r\n\r\n// 4. Executing a Transactional Tool (Using Bound Parameters)\r\nAuthTokenGetter toolAuthGetter = () -&amp;gt; CompletableFuture.completedFuture(myIdToken);\r\n\r\nString bookingConfirmation = mcpClient.loadTool(&amp;quot;book-ticket&amp;quot;, Map.of(&amp;quot;google_auth&amp;quot;, toolAuthGetter))\r\n    // Bind the authenticated user context securely. bindParam returns a new immutable\r\n    // Tool, and the bound parameter is pruned from the definition exposed to the LLM!\r\n    .thenCompose(tool -&amp;gt; tool.bindParam(&amp;quot;passenger_name&amp;quot;, &amp;quot;Jane Doe&amp;quot;)\r\n        // Execute the mutable transaction\r\n        .execute(Map.of(&amp;quot;trip_id&amp;quot;, &amp;quot;123e4567-e89b-12d3-a456-426614174000&amp;quot;)))\r\n    .join().text();&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe690d80490&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h2&gt;&lt;span style="vertical-align: baseline;"&gt;Secure by default: authentication and deployment&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Moving an AI agent to production requires rock-solid credential handling and an infrastructure that scales with demand. Let's look at how you can enforce credential safety across environments and deploy independently on Cloud Run.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Application Default Credentials (ADC) &amp;amp; safety&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;By using the &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;GoogleCredentialsProvider&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; service&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;, your Java app inherits its secure identity from its execution environment (whether local or in Google Cloud) through Application Default Credentials (ADC)—no hard-coded keys, with OIDC tokens minted and cached per audience under the hood. Furthermore, v1.0 offers HTTP Credential Exposure Warnings that automatically detect when credentials are about to travel over a plaintext HTTP connection and emit a runtime warning telling you to switch to HTTPS.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Deploying the fleet to Cloud Run&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Because MCP Toolbox and the Spring Boot Agent are fully decoupled, they scale independently on Google Cloud Run to meet high concurrency and stateful conversation requirements.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;To set up and configure Toolbox on Cloud Run, download the open-source MCP Toolbox for Databases and then follow the &lt;/span&gt;&lt;a href="https://mcp-toolbox.dev/documentation/deploy-to/cloud-run" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;deployment guide&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span style="vertical-align: baseline;"&gt;Get started today&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;With MCP Toolbox Java SDK v1.0, enterprise Java teams can wire Spring Boot and LangChain4j agents to the Toolbox server, and through it, to AlloyDB and every other supported data source. When you use the toolbox, arguments are validated against the tool definition before they leave the JVM, authentication is decoupled, and custom headers are attached to every outgoing request. The following &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;implementation steps will help you get started&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Step 1: Add the Dependency&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;To start building with the SDK, add the following dependency to your Maven project's &lt;code&gt;pom.xml&lt;/code&gt; file:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;&amp;lt;dependency&amp;gt;\r\n        &amp;lt;groupId&amp;gt;com.google.cloud.mcp&amp;lt;/groupId&amp;gt;\r\n        &amp;lt;artifactId&amp;gt;mcp-toolbox-sdk-java&amp;lt;/artifactId&amp;gt;\r\n        &amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;\r\n &amp;lt;!-- {x-version-update:mcp-toolbox-sdk-java:current} --&amp;gt;\r\n    &amp;lt;/dependency&amp;gt;&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe690d826d0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Step 2: Explore Resources &amp;amp; Demos&lt;/span&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;GitHub Repository&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: &lt;/span&gt;&lt;a href="https://github.com/googleapis/mcp-toolbox-sdk-java" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Java SDK for interacting with the MCP Toolbox for Databases&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Official Documentation&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: &lt;/span&gt;&lt;a href="https://mcp-toolbox.dev/" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;MCP Toolbox for Databases&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Demo Application&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: To experience the Java SDK V1.0 for MCP Toolbox latest, try the sample application &lt;a href="https://github.com/googleapis/mcp-toolbox-sdk-java/tree/main/demo-applications/cymbal-transit" rel="noopener" target="_blank"&gt;Cymbal transit project&lt;/a&gt;&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;h4&gt;Gradle implementation&lt;/h4&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;If your team uses Gradle instead of Maven, remember they will need to translate this dependency:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;quot;implementation &amp;#x27;com.google.cloud.mcp:mcp-toolbox-sdk-java:1.0.0&amp;#x27;&amp;quot;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe690d81a90&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h4&gt;&lt;span style="vertical-align: baseline;"&gt;Automatic version tracking&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;I&lt;span style="vertical-align: baseline;"&gt;f you copy this setup into automated internal repositories, k&lt;/span&gt;eep the XML comment &lt;code&gt;&amp;lt;!-- {x-version-update...} --&amp;gt;&lt;/code&gt; intact. It's required by the release manager's deployment scripts to automatically bump versions.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;Now that you can integrate your modern agentic tools and servers to your enterprise Java applications with a stale MCP Toolbox Java SDK, get started today!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;</description><pubDate>Tue, 06 Oct 2026 19:00:00 +0000</pubDate><guid>https://cloud.google.com/blog/topics/developers-practitioners/announcing-mcp-toolbox-java-sdk-v10-agentic-data-access-for-the-enterprise/</guid><category>Developers &amp; Practitioners</category><media:content height="540" url="https://storage.googleapis.com/gweb-cloudblog-publish/images/announcing-mcp-toolbox-java-sdk-v10-agentic-.max-600x600.png" width="540"></media:content><og xmlns:og="http://ogp.me/ns#"><type>article</type><title>Announcing MCP Toolbox Java SDK v1.0: Agentic data access for the enterprise</title><description></description><image>https://storage.googleapis.com/gweb-cloudblog-publish/images/announcing-mcp-toolbox-java-sdk-v10-agentic-.max-600x600.png</image><site_name>Google</site_name><url>https://cloud.google.com/blog/topics/developers-practitioners/announcing-mcp-toolbox-java-sdk-v10-agentic-data-access-for-the-enterprise/</url></og><author xmlns:author="http://www.w3.org/2005/Atom"><name>Abirami Sukumaran</name><title>Staff Developer Advocate, Google</title><department></department><company></company></author></item><item><title>Networking for AI inference model serving - GKE only and for all other backends</title><link>https://cloud.google.com/blog/topics/developers-practitioners/networking-for-ai-inference-model-serving-gke-only-and-for-all-other-backends/</link><description>&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Enterprises and individual developers frequently run multiple AI inference models. The right architecture can simplify how the models are called while also providing centralized governance. &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;In this post, we'll look at two reference architectures focused on networking AI inference model serving: one for &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/kubernetes-engine/docs/concepts/kubernetes-engine-overview"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Google Kubernetes Engine (GKE)&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; and one all other backend types. First, we'll explore the commonalities between the reference architectures that you'll see later. Then we'll explore unique components of the architecture for GKE backends and finally, we'll go over the elements of the architecture for all backend types.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;strong style="vertical-align: baseline;"&gt;The entry point&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;You can expose your model deployment behind a stable, secure, and reliable entry point that acts as the front end for inference calls. This entry point also acts as a control zone where policy, security, and logic can be enforced. &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;Both the Cloud Load balancer and the Inference Gateway provide entry point capability. These types of endpoints can terminate secure connections with TLS, integrate with API management components, extend functionally with service extensions, and capitalize on capabilities of Model Armor for added security.  &lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span style="vertical-align: baseline;"&gt;Common services in the designs &lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Both reference designs use these services:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://docs.cloud.google.com/vpc/docs/private-service-connect#endpoints"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Private Service Connect inference endpoint&lt;/strong&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;: Anchors the entry point inside your consumer Virtual Private Cloud (VPC) network. Traffic hits a private internal &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/vpc/docs/subnets#valid-ranges"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;IP address&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, keeping inference calls in your private network.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://docs.cloud.google.com/apigee/docs/api-platform/get-started/what-apigee"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Apigee API Management&lt;/strong&gt;&lt;/a&gt;&lt;strong style="vertical-align: baseline;"&gt; (Optional)&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: Integrates via an Apigee Extension Processor callout to handle client identity verification, rate limits, and quota enforcement before requests ever reach compute resources.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://docs.cloud.google.com/model-armor/overview"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Model Armor&lt;/strong&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;: Serves as an inline AI safety checkpoint, screening prompts and output completions against prompt injection and sensitive data leakage.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;strong style="vertical-align: baseline;"&gt;Design pattern serving on GKE only&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;This section focuses on a GKE-only backend design.&lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt; &lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;To understand the full end-to-end concept, please read the entire architecture document &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/architecture/networking-for-ai-inference-gke"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Networking for AI inference model serving on GKE&lt;/strong&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;. &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;The design pattern is based on this diagram:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/networking-ai-inference-model-serving-gke-.max-1000x1000.png"
        
          alt="networking-ai-inference-model-serving-gke-architecture"&gt;
        
        &lt;/a&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;In addition to the common services identified in the previous section, the design for GKE uses these components:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://docs.cloud.google.com/kubernetes-engine/docs/concepts/about-gke-inference-gateway"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;GKE Inference Gateway&lt;/strong&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;: Deployed as an internal Application Load Balancer (&lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;gke-l7-rilb&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;). It acts as a specialized ingress engine that parses incoming request payloads, evaluates HTTPRoute rules, and steers queries to appropriate model-serving targets.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Inference pools&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: A logical group containing replicas of the same model. When the Gateway receives a prompt, it evaluates HTTPRoute rules to select the appropriate inference pool based on the model identifier. Pools have an initial size and can be configured to autoscale dynamically.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Model replica sets&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: Individual model replicas (inference server instances) deployed across single-node or multi-node GPU or TPU node pools. A replica set represents a uniform group of these model replicas.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;The traffic flow GKE example&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;A client application that uses this GKE-based architecture to call a backend model would go through a flow like this:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Ingress&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: A client application in the consumer VPC issues an OpenAI-compatible API call to the local Private Service Connect endpoint, routing directly to the GKE Inference gateway using a regional internal Application Load Balancer.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Payload inspection&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: The Gateway reads the target model parameter specified in the request body and adds it to the HTTP headers.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Control plane validation&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: If Apigee is used, it checks client credentials and quotas. Model Armor screens the prompt for policy violations or data leakage.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Backend selection&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: The Gateway evaluates HTTPRoute mappings to identify the target pool, matches shared prefix cache context, and routes to the lowest-load GPU or TPU replica based on real-time Prometheus data.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Egress&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: The replica runs the inference workload. Output tokens pass through Model Armor for final response verification before streaming back over the private connection.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;strong style="vertical-align: baseline;"&gt;Design pattern serving on all backends&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;This section focuses on multiple backend types which can be used for inference, and it provides an overview of the architecture in the following diagram.&lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt; &lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;To understand the full end-to-end concept, please read the entire architecture document &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/architecture/networking-for-ai-inference"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Networking for AI inference model serving on all backends&lt;/strong&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/networking-ai-inference-model-serving-all-.max-1000x1000.png"
        
          alt="networking-ai-inference-model-serving-all-backends"&gt;
        
        &lt;/a&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;For architectures spanning mixed environments such as GKE, Cloud Run, Agent Platform, on-premises data centers, or external clouds, these additional components are used:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://docs.cloud.google.com/load-balancing/docs/l7-internal#load-balancer-mode"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Regional internal Application Load Balancer&lt;/strong&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;: Serves as the central Layer 7 routing proxy that manages routing logic, SSL termination, and Service Extensions callouts.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://github.com/llm-d/llm-d-inference-payload-processor" rel="noopener" target="_blank"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Inference Payload Processor&lt;/strong&gt;&lt;/a&gt;&lt;strong style="vertical-align: baseline;"&gt; (Service Extensions)&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: This is similar to body-based routing as used in the GKE Inference Gateway, but to enable the functionality on an Application Load Balancer a service extension is needed.&lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt; &lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;A lightweight Cloud Run callout inspects the JSON body of incoming OpenAI API requests, extracts the target model identifier, and writes an X-Gateway-Model-Name header to drive URL map routing.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://docs.cloud.google.com/load-balancing/docs/negs"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Network Endpoint Group (NEG)&lt;/strong&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;: Delivers flexible routing to heterogeneous backends based on the injected model header.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;All-backends traffic flow example&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;A client application that uses this architecture to call a backend model would go through a flow like this:&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Private ingress&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: The client application targets the Private Service Connect endpoint over private IP address space. The regional internal Application Load Balancer receives the request.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Model name extraction&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: The load balancer sends the payload to the Cloud Run body-based router callout, which inspects the JSON payload and injects the X-Gateway-Model-Name header.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Policy and safety enforcement&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: The request passes to Apigee for identity and quota validation, then to Model Armor to scrub sensitive data and block malicious prompts.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;NEG routing&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: The load balancer URL map inspects the model header and forwards the request to the matching backend NEG (Agent Platform, GKE, Cloud Run, Hybrid, or Internet).&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Private delivery&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: The target backend executes the model prompt, Model Armor screens the completion, and the result returns privately along the ingress path.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/networking-ai-inference-model-serving-flow.max-1000x1000.png"
        
          alt="networking-ai-inference-model-serving-flow"&gt;
        
        &lt;/a&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h2&gt;&lt;strong style="vertical-align: baseline;"&gt;What's next&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Take a deeper dive into building AI workloads on Google Cloud:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Document set: &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/architecture/agentic-ai-overview"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Agentic AI architecture guides&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Architecture Center: &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/architecture/multi-agent-private-networking-patterns"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Multi-agent private networking patterns in Google Cloud&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Document: &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/gemini-enterprise-agent-platform/machine-learning/general/netsec-overview"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Gemini Enterprise Agent Platform networking access overview&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Want to ask a question, find out more, or share a thought? Please connect with me on &lt;/span&gt;&lt;a href="https://www.linkedin.com/in/ammett/" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Linkedin&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;. &lt;/span&gt;&lt;/p&gt;&lt;/div&gt;</description><pubDate>Tue, 06 Oct 2026 12:00:00 +0000</pubDate><guid>https://cloud.google.com/blog/topics/developers-practitioners/networking-for-ai-inference-model-serving-gke-only-and-for-all-other-backends/</guid><category>Networking</category><category>Developers &amp; Practitioners</category><media:content height="540" url="https://storage.googleapis.com/gweb-cloudblog-publish/images/networking-ai-inference-model-serving-hero.max-600x600.png" width="540"></media:content><og xmlns:og="http://ogp.me/ns#"><type>article</type><title>Networking for AI inference model serving - GKE only and for all other backends</title><description></description><image>https://storage.googleapis.com/gweb-cloudblog-publish/images/networking-ai-inference-model-serving-hero.max-600x600.png</image><site_name>Google</site_name><url>https://cloud.google.com/blog/topics/developers-practitioners/networking-for-ai-inference-model-serving-gke-only-and-for-all-other-backends/</url></og><author xmlns:author="http://www.w3.org/2005/Atom"><name>Ammett Williams</name><title>Developer Relations Engineer</title><department></department><company></company></author></item><item><title>GKE CPU startup boost: Accelerate app starts without over-provisioning</title><link>https://cloud.google.com/blog/products/containers-kubernetes/gke-cpu-startup-boost-faster-pod-starts-lower-costs/</link><description>&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Whether you’re launching microservices in response to sudden traffic spikes, deploying new software releases, or scaling up application replicas, &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;pod startup time&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; is critical to maintaining a fast, responsive user experience for applications running on Google Kubernetes Engine (GKE).&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-paragraph_with_image"&gt;&lt;div class="article-module h-c-page"&gt;
  &lt;div class="h-c-grid uni-paragraph-wrap"&gt;
    &lt;div class="uni-paragraph
      h-c-grid__col h-c-grid__col--8 h-c-grid__col-m--6 h-c-grid__col-l--6
      h-c-grid__col--offset-2 h-c-grid__col-m--offset-3 h-c-grid__col-l--offset-3"&gt;

      






  

    &lt;figure class="article-image--wrap-small
      
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/1_mhC0eeP.max-1000x1000.png"
        
          alt="1"&gt;
        
        &lt;/a&gt;
      
    &lt;/figure&gt;

  





      &lt;p data-block-key="0udcy"&gt;Yet, platform engineers and developers face a persistent dilemma: Applications often demand significantly more CPU power during startup than they do during steady-state operations. Sizing CPU requests for normal, steady-state usage leads to CPU throttling during launch, which can result in sluggish cold starts and readiness probe timeouts. On the flip side, over-provisioning baseline CPU requests to satisfy short-lived startup bursts wastes valuable compute resources, inflating infrastructure bills.&lt;/p&gt;&lt;p data-block-key="ciu5o"&gt;Today, we are excited to announce &lt;a href="https://docs.cloud.google.com/kubernetes-engine/docs/how-to/boost-application-startup"&gt;&lt;b&gt;CPU startup boost&lt;/b&gt;&lt;/a&gt; for GKE in preview. Integrated directly into GKE's Vertical Pod Autoscaler (VPA), CPU startup boost dynamically elevates a container's CPU allocation during initialization and seamlessly scales it back to baseline steady-state levels once the application is ready - &lt;b&gt;all without restarting your containers.&lt;/b&gt;&lt;/p&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;Why modern applications need extra CPU at boot time&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;When a new container launches, it may perform intensive initialization tasks before it begins serving user requests. Depending on your tech stack, the following startup workloads require substantial CPU cycles:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Java JVM applications&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: Frameworks like Spring Boot require high CPU burst capacity for class loading, classpath scanning, instantiating dependency injection containers, and running Just-in-Time (JIT) compilation.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Node.js servers&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: Apps parse JavaScript files, build complex module dependency trees (&lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;require&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;/&lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;import&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;), and execute V8 engine optimization and JIT compilation passes during initial execution.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Python and AI/ML microservices&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: These services spend initial cycles importing heavy libraries (such as PyTorch, NumPy, or LangChain), compiling &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;.pyc&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; bytecode, establishing ORM database schemas, and pre-loading cache structures.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;If you size CPU requests strictly for steady-state performance, these initialization workloads experience CPU throttling on launch, delaying readiness probes. To prevent slow cold starts, teams frequently overprovision CPU requests. However, once the application stabilizes, those extra CPU resources sit idle, increasing your cloud spend without adding value.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-paragraph_with_image"&gt;&lt;div class="article-module h-c-page"&gt;
  &lt;div class="h-c-grid uni-paragraph-wrap"&gt;
    &lt;div class="uni-paragraph
      h-c-grid__col h-c-grid__col--8 h-c-grid__col-m--6 h-c-grid__col-l--6
      h-c-grid__col--offset-2 h-c-grid__col-m--offset-3 h-c-grid__col-l--offset-3"&gt;

      






  

    &lt;figure class="article-image--wrap-small
      
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/2_zZExLw4.max-1000x1000.jpg"
        
          alt="2"&gt;
        
        &lt;/a&gt;
      
    &lt;/figure&gt;

  





      &lt;h3 data-block-key="0udcy"&gt;&lt;b&gt;How CPU startup boost can help&lt;/b&gt;&lt;/h3&gt;&lt;p data-block-key="8k1a3"&gt;CPU Startup Boost solves this by giving your workloads temporary vCPU "boosts" during launch, and automatically returning them to baseline once initialization completes.&lt;/p&gt;&lt;p data-block-key="c9jmj"&gt;Key benefits:&lt;/p&gt;&lt;ul&gt;&lt;li data-block-key="96uhr"&gt;&lt;b&gt;Faster cold starts&lt;/b&gt;: Reduce application initialization times by up to &lt;b&gt;2x&lt;/b&gt;, accelerating auto-scaling responsiveness during unexpected traffic surges.&lt;/li&gt;&lt;li data-block-key="f852p"&gt;&lt;b&gt;Optimized cloud spend&lt;/b&gt;: Right-size steady-state CPU requests to fit actual runtime needs rather than paying for idle startup headroom.&lt;/li&gt;&lt;li data-block-key="5opq6"&gt;&lt;b&gt;Zero pod restarts&lt;/b&gt;: Dynamic resource resizing happens live inside the running container.&lt;/li&gt;&lt;li data-block-key="3r67d"&gt;&lt;b&gt;Flexible policy controls&lt;/b&gt;: Apply simple pod-level multiplier factors (e.g., 2x CPU during startup) or define granular, container-specific rules for complex multi-container pods.&lt;/li&gt;&lt;/ul&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;Under the hood: Kubernetes In-place Pod Resize&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Historically, changing a pod's resource requests or limits required deleting and recreating the pod. This disruptive process triggered container restarts, cache invalidation, and node rescheduling overhead.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;To fix that, CPU startup boost builds on Kubernetes &lt;/span&gt;&lt;a href="https://kubernetes.io/docs/tasks/configure-pod-container/resize-container-resources/" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;In-place Pod Resize (IPPR)&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Tracked under &lt;/span&gt;&lt;a href="https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/1287-in-place-pod-resize" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;KEP-1287&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, IPPR introduced dynamic, in-place resource mutation. Introduced as Alpha in Kubernetes 1.27, promoted to Beta in v1.33, and graduating to General Availability (GA) in v1.35, IPPR allows the Kubernetes control plane and &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;kubelet&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; to update container CPU and memory requests on running pods &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;without restarting the container process&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;GKE leverages IPPR within the VPA  to apply startup CPU boosts at pod admission and smoothly step them down post-readiness.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;How CPU startup boost works (pod lifecycle overview)&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;CPU startup boost operates across three distinct phases:&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Admission phase&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: When you deploy a pod, the VPA admission webhook intercepts the creation request. It calculates the elevated CPU request based on your policy (e.g., 2x multiplier or +2 vCPUs) and injects the boosted CPU request along with tracking annotations into the pod spec.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Startup phase&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: The pod is scheduled and initialized with the boosted CPU allocation. Your application completes class loading, JIT compilation, or module parsing at top speed without experiencing CPU throttling.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Unboosting phase&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: As soon as the pod's &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;readinessProbe&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; passes (plus any configured &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;durationSeconds&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; cooldown delay), the VPA updater issues an in-place resize request. The CPU request steps back down to your baseline level while the container continues running uninterrupted.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;Prerequisites and availability&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;CPU startup boost is available today in preview on GKE:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;GKE version&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: Version &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;1.36.0-gke.4447000&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; or later on Standard and Autopilot clusters.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Cluster Modes&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: Enabled natively on GKE Autopilot (VPA is active by default). On GKE Standard, simply ensure Vertical Pod Autoscaling (VPA) is enabled.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Workload Support&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: Works with standard Kubernetes controllers, including Deployments and StatefulSets.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;Getting started: Configuring CPU startup boost&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Configuring CPU startup boost is as simple as adding a &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;startupBoost&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; section to your &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;VerticalPodAutoscaler&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; manifest.&lt;/span&gt;&lt;/p&gt;
&lt;h4&gt;&lt;span style="vertical-align: baseline;"&gt;Example 1: Pod-level boost with fixed steady-state (&lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;updateMode: "Off"&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;)&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;If you want to use VPA purely for startup boost while keeping steady-state CPU requests locked to your manifest definitions, set &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;updateMode&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; to &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;"Off"&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;apiVersion: &amp;quot;autoscaling.k8s.io/v1&amp;quot;\r\nkind: VerticalPodAutoscaler\r\nmetadata:\r\n  name: java-app-startup-boost\r\n  namespace: default\r\nspec:\r\n  targetRef:\r\n    apiVersion: &amp;quot;apps/v1&amp;quot;\r\n    kind: Deployment\r\n    name: java-app\r\n  updatePolicy:\r\n    updateMode: &amp;quot;Off&amp;quot;\r\n  startupBoost:\r\n    cpu:\r\n      type: &amp;quot;Factor&amp;quot;\r\n      factor: 2\r\n      durationSeconds: 10&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe6911db910&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;In this example, GKE doubles the container's CPU request during launch and holds the boosted allocation for 10 seconds after readiness probes pass before scaling back to baseline.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;Example 2: Combining startup boost with continuous VPA auto-scaling&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;If you want GKE to boost CPU during launch &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;and&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; continuously optimize steady-state resources post-startup, set &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;updateMode&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; to &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;"InPlaceOrRecreate"&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;apiVersion: &amp;quot;autoscaling.k8s.io/v1&amp;quot;\r\nkind: VerticalPodAutoscaler\r\nmetadata:\r\n  name: nodejs-app-vpa\r\n  namespace: default\r\nspec:\r\n  targetRef:\r\n    apiVersion: &amp;quot;apps/v1&amp;quot;\r\n    kind: Deployment\r\n    name: nodejs-service\r\n  updatePolicy:\r\n    updateMode: &amp;quot;InPlaceOrRecreate&amp;quot;\r\n  startupBoost:\r\n    cpu:\r\n      type: &amp;quot;Factor&amp;quot;\r\n      factor: 3\r\n      durationSeconds: 15&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe6911d8ed0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h4&gt;&lt;span style="vertical-align: baseline;"&gt;Example 3: Granular container-level boost&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;For pods running sidecars (such as logging agents or service mesh proxies) that do not require extra CPU on boot, target specific app containers:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;apiVersion: &amp;quot;autoscaling.k8s.io/v1&amp;quot;\r\nkind: VerticalPodAutoscaler\r\nmetadata:\r\n  name: app-container-boost\r\nspec:\r\n  targetRef:\r\n    apiVersion: &amp;quot;apps/v1&amp;quot;\r\n    kind: Deployment\r\n    name: API-gateway\r\n  updatePolicy:\r\n    updateMode: &amp;quot;Off&amp;quot;\r\n  resourcePolicy:\r\n    containerPolicies:\r\n    - containerName: &amp;quot;web-app&amp;quot;\r\n      mode: &amp;quot;Off&amp;quot;\r\n      startupBoost:\r\n        cpu:\r\n          type: &amp;quot;Quantity&amp;quot;\r\n          quantity: &amp;quot;2&amp;quot;\r\n          durationSeconds: 5&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe690d80250&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h2&gt;&lt;strong style="vertical-align: baseline;"&gt;Verifying startup boost in your cluster&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;You can verify that GKE applied and downscaled the startup boost using &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;kubectl&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;:&lt;/span&gt;&lt;/p&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;1. &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Inspect pod annotations&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: Check for the &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;vpaCpuStartupBoost&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; tracking annotation:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;kubectl get pod &amp;lt;POD_NAME&amp;gt; -o yaml&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe6914e6810&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;Look for annotations indicating the original baseline and boosted CPU requests.&lt;/span&gt;&lt;/p&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;2. &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Monitor in-place resize events&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: Confirm that GKE downscaled the CPU request back to baseline after readiness:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;kubectl get events --field-selector reason=InPlaceResizedByVPA&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe6914e7290&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;An event with &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;reason=InPlaceResizedByVPA&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; confirms successful in-place downscaling post-startup.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Best practices for production workloads&lt;/span&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Pairing with Horizontal Pod Autoscaler (HPA)&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: When using HPA alongside CPU startup boost, ensure a robust &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;readinessProbe&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; is defined and keep &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;durationSeconds&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; short (e.g., &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;0s&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;–&lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;10s&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;). This prevents HPA from falsely interpreting initialization CPU spikes as high steady-state load.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Handle traffic spikes with &lt;/strong&gt;&lt;a href="https://docs.cloud.google.com/kubernetes-engine/docs/how-to/configure-capacity-buffer"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;GKE capacity buffers API&lt;/strong&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;: By reducing the startup tax at scale, you can achieve higher workload density on fewer nodes to improve overall utilization. Consider adopting the GKE capacity buffers API to absorb sudden traffic surges with minimal operational overhead while maintaining strict SLOs. &lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;GKE Autopilot resource ratios&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: On GKE Autopilot, remember that pods must maintain valid CPU-to-memory ratios. Ensure baseline memory allocations accommodate the boosted CPU ratio during startup.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Get started today&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;CPU startup boost gives GKE users the best of both worlds: lightning-fast cold starts for CPU-intensive workloads like Java, Node.js, and Python, paired with maximum resource efficiency and lower cloud costs.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Ready to accelerate your GKE workloads?&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Explore the &lt;/span&gt;&lt;a href="https://cloud.google.com/kubernetes-engine/docs/how-to/cpu-startup-boost"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;GKE CPU startup boost documentation&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Learn more about &lt;/span&gt;&lt;a href="https://cloud.google.com/kubernetes-engine/docs/how-to/vertical-pod-autoscaling"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Vertical Pod Autoscaling on GKE&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Try CPU startup boost on your GKE Standard or Autopilot clusters running GKE &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;1.36.0-gke.4447000&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; or later!&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;</description><pubDate>Fri, 02 Oct 2026 16:00:00 +0000</pubDate><guid>https://cloud.google.com/blog/products/containers-kubernetes/gke-cpu-startup-boost-faster-pod-starts-lower-costs/</guid><category>Compute</category><category>GKE</category><category>Developers &amp; Practitioners</category><category>Containers &amp; Kubernetes</category><og xmlns:og="http://ogp.me/ns#"><type>article</type><title>GKE CPU startup boost: Accelerate app starts without over-provisioning</title><description></description><site_name>Google</site_name><url>https://cloud.google.com/blog/products/containers-kubernetes/gke-cpu-startup-boost-faster-pod-starts-lower-costs/</url></og><author xmlns:author="http://www.w3.org/2005/Atom"><name>Abdel Sghiouar</name><title>Cloud Developer Advocate</title><department></department><company></company></author><author xmlns:author="http://www.w3.org/2005/Atom"><name>Jakub Pawełczak</name><title>Cloud Product Manager</title><department></department><company></company></author></item><item><title>Introducing the Server Side Cloud Swift SDK</title><link>https://cloud.google.com/blog/topics/developers-practitioners/introducing-the-server-side-cloud-swift-sdk/</link><description>&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;For years, &lt;a href="https://swift.org/" rel="noopener nofollow noreferrer" target="_blank"&gt;Swift&lt;/a&gt; was perceived mainly as a UI language tied to Apple client devices. With Swift 6 and strict concurrency checking, it has matured into a viable systems and cloud language, pairing Rust-like data-race safety with predictable, reference-counted performance.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;To support this ecosystem, Google engineering has launched the official &lt;/span&gt;&lt;a href="https://github.com/googleapis/google-cloud-swift" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Google Cloud API Client Libraries for Swift&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;. Built from the ground up for Swift 6.2+, this new SDK uses the latest non-blocking &lt;/span&gt;&lt;a href="https://github.com/apple/swift-nio" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Swift NIO&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; event loops, HTTP/2 multiplexing, &lt;/span&gt;&lt;a href="https://grpc.io" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;gRPC&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; transport, and zero-cost compile-time data race safety.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;In this article, we'll walk you through all you need to know to get started, and to understand how the Server Side Cloud Swift SDK, or &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;google-cloud-swift&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;, works.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span style="vertical-align: baseline;"&gt;The rise of server-side Swift and cloud-native concurrency&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;"&gt;Traditional backend development often forces a trade-off between developer ergonomics and resource utilization. While managed runtimes offer rapid development, lower-level systems languages provide finer control over memory and CPU footprint, often at the expense of feature velocity.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Server-side Swift aims to strike a practical balance. Swift pairs a lightweight runtime and Automatic Reference Counting (ARC) with expressive syntax. More importantly, Swift 6 introduces compile-time concurrency checking. &lt;span style="vertical-align: baseline;"&gt;When you share state between async tasks across a cloud microservice, the compiler enforces that types conform to &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;Sendable&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;. Data races are caught in your editor before a binary ever compiles or reaches production.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;At the network layer, every request to &lt;/span&gt;&lt;a href="https://cloud.google.com"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Google Cloud&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; APIs runs over event-driven, non-blocking sockets that scale across multicore &lt;/span&gt;&lt;a href="https://www.kernel.org" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Linux&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; server environments without spawning system threads per connection.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/sdk-architecture.max-1000x1000.png"
        
          alt="sdk-architecture"&gt;
        
        &lt;/a&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h2&gt;&lt;span style="vertical-align: baseline;"&gt;Where to use the Swift SDK&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The Server Side Cloud Swift SDK is engineered for server, container, and automated DevOps environments.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;When you build high-throughput microservices with Swift web frameworks like &lt;/span&gt;&lt;a href="https://hummingbird.codes" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Hummingbird&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; or &lt;/span&gt;&lt;a href="https://vapor.codes" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Vapor&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;google-cloud-swift&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; provides native access to Cloud Storage, AI, Identity and Access Management (IAM), and over one hundred other Google Cloud services. You can containerize your executable on Linux and deploy directly to &lt;/span&gt;&lt;a href="https://cloud.google.com/run"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Cloud Run&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;a href="https://cloud.google.com/kubernetes-engine"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Google Kubernetes Engine (GKE)&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, or &lt;/span&gt;&lt;a href="https://cloud.google.com/compute"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Compute Engine&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; VMs.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Because the SDK compiles on macOS, and Linux, you can develop the backend in your preferred development environment, and then seamlessly deploy to production. And using Swift on both the frontend and backend allows you to share application-specific types across both.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The SDK also excels at platform engineering and DevOps automation. You can author cross-platform CLI utilities and data rotation scripts that run on your developer laptop or inside CI/CD pipelines. These tools authenticate automatically against Google Cloud using &lt;/span&gt;&lt;a href="https://cloud.google.com/docs/authentication/application-default-credentials"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Application Default Credentials (ADC)&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; or &lt;/span&gt;&lt;a href="https://cloud.google.com/iam/docs/workload-identity-federation"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Workload Identity Federation&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;If you're building an &lt;/span&gt;&lt;a href="https://developer.apple.com/ios/" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;iOS&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;a href="https://www.apple.com/ipados/" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;iPadOS&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, or &lt;/span&gt;&lt;a href="https://www.apple.com/apple-vision-pro/" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;visionOS&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; app for the &lt;/span&gt;&lt;a href="https://www.apple.com/app-store/" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Apple App Store&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, you should not embed &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;google-cloud-swift&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; directly into your client bundle. Shipping Google Cloud service account keys or administrative credentials inside a client binary creates security risks. For direct client-side features, use the &lt;/span&gt;&lt;a href="https://github.com/firebase/firebase-ios-sdk" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Firebase SDK for Apple Platforms&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; to handle user authentication, real-time &lt;/span&gt;&lt;a href="https://cloud.google.com/firestore"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Firestore&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; sync, and client-side security rules, or route requests through your own Cloud Run backend API.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span style="vertical-align: baseline;"&gt;Getting started with your IDE and packages&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Because &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;google-cloud-swift&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; treats Linux and macOS as first-class citizens, you can develop on Apple hardware with &lt;/span&gt;&lt;a href="https://developer.apple.com/xcode/" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Xcode&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; or on Linux workstations with &lt;/span&gt;&lt;a href="https://code.visualstudio.com/" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Visual Studio Code&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; and &lt;/span&gt;&lt;a href="https://swift.org/install/" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;swiftly&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;To install the official Swift compiler on Linux workstations using the &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;swiftly&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; CLI installer, run:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;curl -O https://download.swift.org/swiftly/linux/swiftly-$(uname -m).tar.gz &amp;amp;&amp;amp;\r\ntar zxf swiftly-$(uname -m).tar.gz &amp;amp;&amp;amp;\r\n./swiftly init --quiet-shell-followup &amp;amp;&amp;amp;\r\n. &amp;quot;${SWIFTLY_HOME_DIR:-$HOME/.local/share/swiftly}/env.sh&amp;quot; &amp;amp;&amp;amp;\r\nhash -r&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe690aafcd0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Alternatively, you can download prebuilt toolchain tarballs directly from official &lt;/span&gt;&lt;a href="https://www.swift.org/download/" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Swift Downloads&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; for Ubuntu, Debian, Fedora, or Amazon Linux. Note that &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;google-cloud-swift&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; requires &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Swift 6.2 or later&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;, so verify your compiler version with &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;swift --version&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; after installation.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;To resolve &lt;/span&gt;&lt;a href="https://swift.org/package-manager/" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Swift Package Manager&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; bare repository trust warnings when cloning across Linux filesystems, configure &lt;/span&gt;&lt;a href="https://git-scm.com" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Git&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; before building with &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;git config --global safe.bareRepository all&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Add the required packages to your &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;Package.swift&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; manifest:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;swift package add-dependency https://github.com/googleapis/swift-google-cloud-language-v2.git --from 0.4.0\r\nswift package add-target-dependency GoogleCloudLanguageV2 CloudBackendService --package swift-google-cloud-language-v2&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe690aad050&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;On macOS you need to change the &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;platforms&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; directive:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;// swift-tools-version: 6.2\r\nimport PackageDescription\r\n\r\nlet package = Package(\r\n  name: &amp;quot;CloudBackendService&amp;quot;,\r\n  // Applied when compiling on Darwin/macOS; ignored by SPM on Linux targets\r\n  platforms: [.macOS(.v15)],\r\n ... ...&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe690aac690&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;p data-block-key="bngnr"&gt;In most environments a default-initialized client can make requests:&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;import Foundation\r\nimport GoogleCloudLanguageV2\r\n\r\nfunc analyzeTextSentiment(text: String) async throws {\r\n  // Initialize explicit API key credentials\r\n  let client = try LanguageServiceClient()\r\n\r\n  // Configure request using structured builder closure\r\n  let document = Document().with {\r\n    $0.type = .plainText\r\n    $0.source = .content(text)\r\n  }\r\n\r\n  let response = try await client.analyzeSentiment(\r\n    request: AnalyzeSentimentRequest().with { $0.document = document }\r\n  )\r\n\r\n  if let sentiment = response.documentSentiment {\r\n    print(&amp;quot;Document sentiment score: \\(sentiment.score)&amp;quot;)\r\n  }\r\n}&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe690aac510&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Notice how &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;Document().with { ... }&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; avoids verbose temporary variables or mutating setters by providing a clean, thread-safe configuration closure.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span style="vertical-align: baseline;"&gt;Networking, transport, and authentication&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The repository splits infrastructure primitives into modular packages under &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;packages/&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;code style="vertical-align: baseline;"&gt;swift-google-cloud-auth&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;: Implements &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/docs/authentication/application-default-credentials"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Application Default Credentials&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; discovery, service account JWT signing, external account exchange for Workload Identity Federation, and API keys.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;code style="vertical-align: baseline;"&gt;swift-google-cloud-wkt&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;: Provides idiomatic Swift types for Google Protocol Buffer well-known types, including nanosecond-precision &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;Timestamp&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; representations that bridge cleanly to Swift's &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;Date&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;code style="vertical-align: baseline;"&gt;swift-google-cloud-gax&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;: Handles Google API Extensions such as automated retry loops, exponential backoff, and pagination state machines.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;When you initialize any client library without arguments, &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;Credentials.default()&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; automatically scans your environment (&lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;GOOGLE_APPLICATION_CREDENTIALS&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;, quota project variables, or the local Google Cloud CLI configuration) and authenticates connections over gRPC or HTTP/2.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;If you need to programmatically override credentials with an API key or attach custom access headers, you can pass explicit configuration options. For example, you could modify the previous example to use the following:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;import Foundation\r\nimport GoogleCloudAuth\r\nimport GoogleCloudGax\r\nimport GoogleCloudLanguageV2\r\n\r\nfunc analyzeTextSentiment(apiKey: String, text: String) async throws {\r\n  // Initialize explicit API key credentials\r\n  let credentials = try Credentials(configuration: .apiKey(apiKey))\r\n  let client = try LanguageServiceClient(\r\n    ClientOptions().with { $0.credentials = credentials }\r\n  )\r\n\r\n  // Configure request using structured builder closure\r\n  let document = Document().with {\r\n    $0.type = .plainText\r\n    $0.source = .content(text)\r\n  }\r\n\r\n  let response = try await client.analyzeSentiment(\r\n    request: AnalyzeSentimentRequest().with { $0.document = document }\r\n  )\r\n\r\n  if let sentiment = response.documentSentiment {\r\n    print(&amp;quot;Document sentiment score: \\(sentiment.score)&amp;quot;)\r\n  }\r\n}&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe690aaf0d0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h2&gt;&lt;span style="vertical-align: baseline;"&gt;The autogenerated client ecosystem&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Google Cloud operates a vast ecosystem of APIs whose schemas update regularly. The teams supporting &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;google-cloud-swift&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; use code generators to automatically update the client libraries with the latest features and with new APIs. Using code generators produces stable APIs, without disruptive breaking changes. While the releases are on a fixed cadence, please contact Cloud Customer Care if you need a particular feature or API urgently.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Whether you need to rotate keys in &lt;/span&gt;&lt;a href="https://cloud.google.com/secret-manager"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Secret Manager&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; or invoke multimodal inference models via the &lt;/span&gt;&lt;a href="https://cloud.google.com/vertex-ai/generative-ai/docs/gemini-v1"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Gemini API&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; on &lt;/span&gt;&lt;a href="https://cloud.google.com/vertex-ai"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Gemini Enterprise Agent Platform&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, the generated SDKs follow consistent naming and async/await signatures.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;These generated clients offer more than plain unary RPC wrappers. They also offer wrappers that simplify application development. For example, iterating over long results involves fetching pages of results with one RPC, iterating over the page of results, and then preparing a new request to retrieve the following page. Using the generated clients this becomes an asynchronous iterator. This example shows how to query project secrets using &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;GoogleCloudSecretManagerV1&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;import Foundation\r\nimport GoogleCloudSecretManagerV1\r\n\r\n@main\r\nstruct SecretManagerQuickstart {\r\n  static func main() async throws {\r\n    guard let projectId = CommandLine.arguments.dropFirst().first else {\r\n      print(&amp;quot;Usage: SecretManagerQuickstart &amp;lt;projectId&amp;gt;&amp;quot;)\r\n      exit(1)\r\n    }\r\n\r\n    // Connects using Application Default Credentials automatically\r\n    let client = try SecretManagerServiceClient()\r\n\r\n    let request = ListSecretsRequest().with {\r\n      $0.parent = &amp;quot;projects/\\(projectId)&amp;quot;\r\n    }\r\n\r\n    // Async sequence streams pages of secrets automatically\r\n    print(&amp;quot;Secrets in project \\(projectId):&amp;quot;)\r\n    for try await item in try client.listSecretsByItem(request: request) {\r\n      print(&amp;quot; - \\(item.name)&amp;quot;)\r\n    }\r\n  }\r\n}&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe690aafdd0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The pagination response returns an asynchronous sequence (&lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;AsyncSequence&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;). You can iterate over items with &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;for try await&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; while the client library fetches subsequent pages in the background over non-blocking NIO channels.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span style="vertical-align: baseline;"&gt;Where to go next&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;With &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;google-cloud-swift&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;, server-side Swift developers can write end-to-end cloud infrastructure with compile-time race safety, native async/await ergonomic APIs, and zero OS thread congestion.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;To inspect the source code, open issues, or contribute new veneers, visit the official repository at &lt;/span&gt;&lt;a href="https://github.com/googleapis/google-cloud-swift" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;googleapis/google-cloud-swift&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Want to discuss server-side Swift architectures or Cloud Run containerization? Join the &lt;/span&gt;&lt;a href="https://developers.google.com/program" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Google Developer Program&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; to continue the conversation.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;</description><pubDate>Thu, 01 Oct 2026 04:00:00 +0000</pubDate><guid>https://cloud.google.com/blog/topics/developers-practitioners/introducing-the-server-side-cloud-swift-sdk/</guid><category>Developers &amp; Practitioners</category><media:content height="540" url="https://storage.googleapis.com/gweb-cloudblog-publish/images/introducing-the-server-side-cloud-swift-sdk-.max-600x600.png" width="540"></media:content><og xmlns:og="http://ogp.me/ns#"><type>article</type><title>Introducing the Server Side Cloud Swift SDK</title><description></description><image>https://storage.googleapis.com/gweb-cloudblog-publish/images/introducing-the-server-side-cloud-swift-sdk-.max-600x600.png</image><site_name>Google</site_name><url>https://cloud.google.com/blog/topics/developers-practitioners/introducing-the-server-side-cloud-swift-sdk/</url></og><author xmlns:author="http://www.w3.org/2005/Atom"><name>Karl Weinmeister</name><title>Director, Developer Relations</title><department></department><company></company></author><author xmlns:author="http://www.w3.org/2005/Atom"><name>Carlos O'Ryan</name><title>Software Engineer</title><department></department><company></company></author></item><item><title>Democratizing Managed Lustre with lower cost and frictionless development</title><link>https://cloud.google.com/blog/topics/developers-practitioners/democratizing-managed-lustre-with-lower-cost-and-frictionless-development/</link><description>&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;This is the first of a two-part series exploring how Google Cloud is bringing the foundational values of a high-performance parallel filesystem–TB/s throughput, sub-ms latency at high client scale, and POSIX support–to a broader set of use cases and users.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Historically, due to the cost and special purpose nature of parallel filesystems, colder data had to be stored outside of the filesystem and AI developers have had to maintain separate, slower environments for writing code, compiling libraries, and managing repositories. This fragmentation increases the toil of manual data staging, dataset copying, and managing disjointed namespaces.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Google Cloud Managed Lustre is solving these problems through our &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;6 cents/GB*month Dynamic Tier&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;and by optimizing Managed Lustre performance for a range of development tasks and workloads – making Managed Lustre a “One-Stop Shop” for high-performance AI and HPC workloads.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;&lt;strong style="vertical-align: baseline;"&gt;Lower Cost: More Lustre for Less with the Dynamic Tier&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The Managed Lustre Dynamic Tier provides &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;sub-ms latency for hot data, which allows you to store all of your data in a single namespace, and costs only 6 cents/GB*month&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Throughput, capacity scale and client scale:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Throughput scales linearly with capacity up to 80 PB, while sub-ms latency for hot data remains stable as you scale to tens of thousands of clients.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Single-flat fee:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Predictable pricing. No independent charges for disk media types, data movement within the namespace, or metadata IOPS.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Read Latencies:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Sub-ms latencies for High-Performance Cache (SSD).  The Capacity Pool (“HDD”) is built on Google Cloud Hyperdisk throughput, which has an &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/compute/docs/disks/hd-types/hyperdisk-throughput"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;average read latency of 10 to 30 ms&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;&lt;strong style="vertical-align: baseline;"&gt;Recommended workloads for Dynamic Tier&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Multi-Epoch Training and/or Training with Optimized Fetch Sizes: &lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;Hot data is promoted to the High Performance Cache (SSD) after the first run. Larger data prefetch will allow you to take advantage of the Dynamic Tier cost structure and gain from low-latency SSD.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Write-Heavy Checkpointing:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Bursty checkpoint writes land directly in the High Performance Cache. Older checkpoints are transparently demoted to the Capacity Pool (HDD).&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Rapid Checkpoint Restore:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;  New checkpoints are written to the High Performance Cache, enabling low-latency checkpoint restores.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Interactive Snappiness for Developers:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Low-latency tasks like git cloning, compiling libraries, or running notebooks benefit from a local-disk feel (~300µs average read latencies) on the same shared workspace hosting large training sets.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;strong style="vertical-align: baseline;"&gt;Frictionless development: Lustre as a one-stop shop for developer’s workloads&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;In addition to Managed Lustre’s scalability for large AI and HPC workloads (checkpoint/restart/data-loading), it also meets the demands for interactive work, meaning developers can start on Managed Lustre and stay on Managed Lustre throughout the entire workload lifecycle:&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;Unified Foundation &amp;amp; Interactive Performance&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Consolidates the AI and HPC lifecycle into a single namespace, providing a "local disk" feel for interactive work (Read more about the &lt;/span&gt;&lt;a href="https://cloud.google.com/products/managed-lustre"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;latency benefits of Managed Lustre experienced by Salesforce and others&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;).&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Latency:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; ~300µs average read latency—delivering up to 4x better responsiveness than alternative distributed file systems.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Accelerated Setup:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Untar the Linux kernel in ~2 minutes (4.7x faster than alternative file solutions), run a 20-worker parallel git clone of Python in ~40 seconds, compile Python in ~200s.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/democratizing-lustre-with-lower-cost-and-f.max-1000x1000.jpg"
        
          alt="democratizing-lustre-with-lower-cost-and-frictionless-development-02-managed-lustre-performance-values"&gt;
        
        &lt;/a&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/democratizing-lustre-with-lower-cost-and-f.max-1000x1000_xLOfL6w.jpg"
        
          alt="democratizing-lustre-with-lower-cost-and-frictionless-development-01-performance-comparision"&gt;
        
        &lt;/a&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;High-Concurrency Broadcast &amp;amp; Cluster Startup&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Managed Lustre maximizes GPU ROI by preventing storage bottlenecks during cluster initialization. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;When thousands of worker nodes attempt to read the exact same file simultaneously (such as a shared model checkpoint, base weights, or container layer), traditional distributed file systems can choke on localized hotspotting, leaving high-cost GPU clusters idle for minutes.&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Improves Aggregate Throughput for a large number of clients reading the same file:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Demonstrates a 67% improvement over alternative file solutions.&lt;sup&gt;1&lt;/sup&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Parallel Loading:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Imports libraries like PyTorch across 4,000+ processes in under 60 seconds.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;sup&gt;&lt;span style="vertical-align: baseline;"&gt;1 &lt;/span&gt;&lt;/sup&gt;&lt;span style="font-style: italic;"&gt;Storage system specs: 500 MBps per TiB tier of Managed Lustre, 108,000 GiB capacity. Zonal Filestore at 102,400 GiB capacity. Average throughput of 36.7 GB/s to 2,048 client VMs reading the same 40 GiB file.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/democratizing-lustre-with-lower-cost-and-f.max-1000x1000_9kShfM1.jpg"
        
          alt="democratizing-lustre-with-lower-cost-and-frictionless-development-03-performance-advantage"&gt;
        
        &lt;/a&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h2&gt;&lt;strong style="vertical-align: baseline;"&gt;Run One-Stop Shop Workflows for Yourself&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Here is the code for the tests we’ve run, so that you can perform your own testing.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;Low latency for interactive access&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;We used &lt;/span&gt;&lt;a href="https://github.com/axboe/fio" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;fio&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; to emulate small, low-concurrency reads and writes:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;# Read workload\r\nfio --ioengine=libaio --filesize=100M --ramp_time=2s \\\r\n    --runtime=2m --time_based --numjobs=1 --direct=1 --verify=0 --randrepeat=0 \\\r\n    --group_reporting --directory=~/LUSTRE_MOUNT \\\r\n    --name=randread --blocksize=4k --iodepth=1 --readwrite=randread \\\r\n    --buffer_compress_percentage=50\r\n\r\n# Write workload\r\nfio --ioengine=libaio --filesize=100M --ramp_time=2s \\\r\n    --runtime=2m --time_based --numjobs=1 --direct=1 --verify=0 --randrepeat=0 \\\r\n    --group_reporting --directory=~/LUSTRE_MOUNT \\\r\n    --name=randwrite --blocksize=4k --iodepth=1 --readwrite=randwrite \\\r\n    --buffer_compress_percentage=50&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe690312b10&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;Accelerated setup&lt;/strong&gt;&lt;/h3&gt;
&lt;h4&gt;&lt;strong style="vertical-align: baseline;"&gt;How to run Linux untar&lt;/strong&gt;&lt;/h4&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;# Download a kernel tarball\r\nwget -P /tmp https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.18.9.tar.xz\r\n\r\n# Extract the archive to the Lustre mount\r\nmkdir ~/LUSTRE_MOUNT/kernel\r\ntar -C ~/LUSTRE_MOUNT/kernel -xf /tmp/linux-5.18.9.tar.xz&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe6914e7050&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;In the above use case, you will want to take care to avoid the metadata performance tax that can come from running as root (Namely, &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;tar&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; issues&lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt; chown&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; and&lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt; chmod&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; calls to make extracted files’ owner+permissions match the ones recorded in the archive.).  If you still wish to run as root (and have verified that this approach is compatible with your setup), you may &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;specify&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;`--no-same-owner --no-same-permissions`&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;in order to ensure that extracted files maintain&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; root&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; as owner and have root's default file permissions. In other words, it makes extraction as root behave like extraction as non-root (by ignoring the owner+permissions in the archive).&lt;/span&gt;&lt;/p&gt;
&lt;h4&gt;&lt;strong style="vertical-align: baseline;"&gt;How to run Python gitclone&lt;/strong&gt;&lt;/h4&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;git config --global checkout.workers 20\r\nmkdir ~/LUSTRE_MOUNT/python\r\ngit clone https://github.com/python/cpython.git ~/LUSTRE_MOUNT/python&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe6914e5350&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;How to run Python compile&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;pushd ~/LUSTRE_MOUNT/python\r\n./configure &amp;gt; /dev/null\r\nmake &amp;gt; /dev/null\r\npopd&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe6914e6dd0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;High scale distribution&lt;/strong&gt;&lt;/h3&gt;
&lt;h4&gt;&lt;strong style="vertical-align: baseline;"&gt;Aggregate throughput for distributing one large file to many nodes&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Run the below on each client VM:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;# Start fio in server mode\r\nfio --server&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe68bc2d310&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;p data-block-key="iadne"&gt;Run the below on a selected client VM:&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;quot;# Create a 40 GiB file\r\nfio --name=job1 \\\r\n    --ioengine=libaio \\\r\n    --direct=1 \\\r\n    --buffer_compress_percentage=50 \\\r\n    --blocksize=4m \\\r\n    --iodepth=32 \\\r\n    --filesize=40g \\\r\n    --readwrite=write \\\r\n    --filename ~/LUSTRE_MOUNT/40gb_test\r\n\r\n# Create an fio job file for the read workload\r\ncat &amp;lt;&amp;lt;&amp;#x27;EOF&amp;#x27; &amp;gt; /tmp/read.fio\r\n[job1]\r\nfilename=${HOME}/LUSTRE_MOUNT/40gb_test\r\nrw=read\r\nbs=4m\r\nexitall_on_error=1\r\nEOF\r\n\r\n# Run the read workload using all client VMs in ~/hostfile\r\nfio --client ~/hostfile /tmp/read.fio&amp;quot;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe69246d0d0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h4&gt;&lt;strong style="vertical-align: baseline;"&gt;Parallel loading of libraries across many processes&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Run the below on a selected client VM:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;# Install PyTorch in a virtual env\r\npython3 -m venv ~/LUSTRE_MOUNT/env\r\nsource ~/LUSTRE_MOUNT/env/bin/activate\r\npip3 install --upgrade pip\r\npip3 install torch torchvision torchaudio \r\ndeactivate\r\n\r\n# Import PyTorch on all client VMs in ~/hostfile, 4 processes per host\r\nmpirun --allow-run-as-root --oversubscribe --hostfile ~/hostfile -N 4 \\\r\n  bash -c \&amp;#x27;source ~/LUSTRE_MOUNT/env/bin/activate &amp;amp;&amp;amp; python3 -c &amp;quot;import torch&amp;quot;\&amp;#x27;&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe69246c1d0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h1&gt;&lt;strong style="vertical-align: baseline;"&gt;Looking ahead and next steps&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;By eliminating the manual data staging tax and lowering entry costs with the Dynamic Tier, Google Cloud Managed Lustre is evolving from an elite, single-purpose engine into a highly versatile, unified storage fabric for the entire AI lifecycle.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;In the second part of this series, we will focus on &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;upcoming object integration features&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;. Stay tuned!&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;strong style="vertical-align: baseline;"&gt;Next steps&lt;/strong&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Run the benchmarks yourself (if you haven’t already): Deploy a Google Cloud Managed Lustre instance using the &lt;/span&gt;&lt;a href="https://console.cloud.google.com/"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Google Cloud console&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; and run tests provided above to benchmark your own workloads.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Explore the Dynamic Tier: Read the &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/managed-lustre/docs/performance-tiers"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Google Cloud Managed Lustre Documentation&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; to learn more about the Dynamic Tier.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Stay tuned for Part 2: In the next installment of this series, we will dive deep into upcoming object integration features and how they further simplify AI and HPC storage.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Get started with centralizing your development-to-training lifecycle on Google Cloud Managed Lustre!&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;</description><pubDate>Thu, 01 Oct 2026 04:00:00 +0000</pubDate><guid>https://cloud.google.com/blog/topics/developers-practitioners/democratizing-managed-lustre-with-lower-cost-and-frictionless-development/</guid><category>Developers &amp; Practitioners</category><media:content height="540" url="https://storage.googleapis.com/gweb-cloudblog-publish/images/democratizing-lustre-with-lower-cost-and-fri.max-600x600_YyI34FQ.jpg" width="540"></media:content><og xmlns:og="http://ogp.me/ns#"><type>article</type><title>Democratizing Managed Lustre with lower cost and frictionless development</title><description></description><image>https://storage.googleapis.com/gweb-cloudblog-publish/images/democratizing-lustre-with-lower-cost-and-fri.max-600x600_YyI34FQ.jpg</image><site_name>Google</site_name><url>https://cloud.google.com/blog/topics/developers-practitioners/democratizing-managed-lustre-with-lower-cost-and-frictionless-development/</url></og><author xmlns:author="http://www.w3.org/2005/Atom"><name>Barak Epstein </name><title>Senior Product Manager, Google Cloud Managed Lustre</title><department></department><company></company></author><author xmlns:author="http://www.w3.org/2005/Atom"><name>Barak Epstein </name><title>Senior Product Manager, Google Cloud Managed Lustre</title><department></department><company></company></author><author xmlns:author="http://www.w3.org/2005/Atom"><name>Yuval Ehrental</name><title>Software Engineer, Google Cloud Managed Lustre</title><department></department><company></company></author><author xmlns:author="http://www.w3.org/2005/Atom"><name>Yuval Ehrental</name><title>Software Engineer, Google Cloud Managed Lustre</title><department></department><company></company></author></item><item><title>Empower your agents with the Google Cloud CLI remote MCP server</title><link>https://cloud.google.com/blog/products/ai-machine-learning/google-cloud-cli-remote-mcp-server-in-preview/</link><description>&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Today, we’re expanding our ecosystem of managed remote MCP servers by introducing the &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/sdk/use-gcloud-mcp"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Google Cloud CLI remote MCP server&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; in preview.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Powered by the popular &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/sdk/gcloud"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;gcloud&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; and &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs/reference/bq-cli-reference"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;bq (BigQuery)&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; command-line tools, this new server gives AI agents immediate, broad access to command-line operations for managing Google Cloud infrastructure and working with advanced BigQuery workflows securely and seamlessly. &lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Why CLI matters for AI agents&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Agents are increasingly performing complex cloud operations, but standardizing how they interact with backend systems remains a challenge. The Google Cloud CLI remote MCP server bridges this gap by packaging the versatility of hundreds of gcloud and bq commands into one single MCP server. This results in two strong benefits for the agent:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Higher-level abstractions:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; CLI commands package complex multi-step workflows, validation checks, and high-level operations into unified commands rather than requiring multi-step API orchestration.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Leverages model training:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; LLMs are heavily pre-trained on public command-line documentation, syntaxes, and usage examples, making CLI invocation intuitive and highly accurate for models.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;The benefits of putting CLI behind remote MCP&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Managing cloud infrastructure with AI agents traditionally requires installing and maintaining Google Cloud CLI binaries inside agent execution environments. The Cloud CLI remote MCP server bridges CLI capabilities with MCP benefits by providing an isolated execution sandbox on Google Cloud infrastructure. This solves key infrastructure challenges:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Simplified dependency and runtime management:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; For teams building custom agents, maintaining local CLI versions and dependencies across dev, test, and production environments creates operational overhead. Remote MCP eliminates local installations and runtime maintenance.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Access for web-based agent endpoints:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Web-hosted agent platforms and web interfaces (such as Gemini Enterprise and other hosted enterprise agent platforms) run in environments where users cannot control or install local packages. Remote MCP enables secure, managed access to Google Cloud CLI operations directly from these surfaces.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Enterprise-grade security and governance&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Connecting an AI agent to your infrastructure requires strict, enterprise-ready safeguards. This remote server leverages Google Cloud's standard identity and governance frameworks to keep your environments secure:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Zero ambient credentials:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; The server isolates execution in a network-restricted proxy boundary with no ambient credentials. Authentication and authorization are handled through &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/iam/docs/agent-identity-overview"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Agent Identity&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;a href="https://developers.google.com/identity/protocols/oauth2" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;OAuth 2.0&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, and &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/iam/docs"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Identity and Access Management (IAM)&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Strict policy enforcement:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Every command executed through the remote MCP server is run with the permissions of the authenticated caller identity. Both standard IAM permissions and organization policy service constraints are strictly enforced against downstream target resources.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Advanced protection with Model Armor:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; To minimize the risks associated with AI tool calling, the Cloud CLI remote MCP server integrates with &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/model-armor/model-armor-mcp-google-cloud-integration"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Model Armor&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;. You can proactively screen LLM prompts and responses to protect against risks like prompt injection and malicious inputs.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Cloud audit logging:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; The Cloud CLI remote MCP server can be configured to log every tool invocation to Audit Logs (Data Access logs under cloudcli.googleapis.com/mcp). Security teams can gain full visibility into caller identities, OAuth clients, and IAM authorization decisions (mcp.googleapis.com/tools.call) without exposing sensitive command payloads or personally identifiable information (PII).&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Connecting to the Google Cloud CLI Remote MCP Server&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Integrating cloud management into your agents no longer requires packaging Google Cloud CLI binaries, managing local execution runtimes, or maintaining dependencies inside agent container images. Because the Google Cloud CLI remote MCP server implements the standard Model Context Protocol, any MCP-compatible agent platform or orchestration runtime can connect immediately via standard configuration:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;{\r\n  &amp;quot;mcpServers&amp;quot;: {\r\n    &amp;quot;google-cloud-cli&amp;quot;: {\r\n      &amp;quot;uri&amp;quot;: &amp;quot;https://cloudcli.googleapis.com/mcp&amp;quot;,\r\n      ...\r\n    }\r\n  }\r\n}&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe6904bf610&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Your agent immediately gains access to execute gcloud and bq commands in a secure, network-isolated cloud sandbox.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Authentication is handled via keyless Agent Identity for hosted Google Cloud platforms, or standard OAuth 2.0 for external runtimes. For authentication options, see the &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/mcp/set-up-authentication-mcp-servers"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;MCP Authentication Guide&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Bringing infrastructure management to agents&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://docs.cloud.google.com/sdk/use-gcloud-mcp"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;The Cloud CLI remote MCP server&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; exposes two powerful tools, &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;run_gcloud_command&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; and &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;run_bq_command&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;, giving your AI agents broad, immediate access to Google Cloud operations through natural language.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Managing cloud infrastructure with &lt;/strong&gt;&lt;code&gt;&lt;strong style="vertical-align: baseline;"&gt;run_gcloud_command&lt;/strong&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;With &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;run_gcloud_command&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;, agents can execute the full breadth of gcloud operations to manage, diagnose, and secure your Google Cloud environment. An example follows:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Observability and incident diagnostics&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: An agent streamlines incident diagnostics by automating command execution and reducing context-switching across tools.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/original_images/1_IPA9ALa.gif"
        
          alt="1"&gt;
        
        &lt;/a&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Extending BigQuery operations with the run_bq_command tool&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;While the &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs/use-bigquery-mcp"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;BigQuery MCP server&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; already helps organizations analyze and explore data using AI agents, with the introduction of &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;run_bq_command&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;, agents can now tackle advanced BigQuery tasks such as resource allocation, job monitoring, and task scheduling by unlocking the full scope of &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/sdk/reference/mcp#mcp-tools"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;bq CLI&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; functionality. Key capabilities include:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Automating scheduled queries&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: An agent utilizes BigQuery Data Transfer Service configurations to schedule queries automatically. &lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Job and resource management&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: Gain deep insight into query execution details, including processed data volume, slot usage, and execution plans, as well as managing reservations.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Access and permissions control:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Data administrators and owners can inspect and update table permissions directly through the agent.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/original_images/2_JA5HWbH.gif"
        
          alt="2"&gt;
        
        &lt;/a&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Pricing and availability&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The Google Cloud CLI MCP server is available today in public preview. There is no additional charge to use the MCP server itself. You pay only for the GCP resources you create and any applicable data transfer costs.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://docs.cloud.google.com/sdk/use-gcloud-mcp"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;To get started&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, enable the Cloud CLI Execution API (`&lt;/span&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;cloudcli.googleapis.com&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;`) in your Google Cloud project, grant the required &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;MCP Tool User&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; (`&lt;/span&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;roles/mcp.toolUser&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;`) IAM role to your agent or user identity, and configure your MCP client to connect to `cloudcli.googleapis.com/mcp`.&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://docs.cloud.google.com/sdk/use-gcloud-mcp"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Use the Google Cloud CLI Remote MCP Server Guide&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://docs.cloud.google.com/sdk/reference/mcp#mcp-tools"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Google Cloud CLI MCP Reference&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://docs.cloud.google.com/mcp/overview"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Google Cloud Remote MCP Servers Overview&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://docs.cloud.google.com/mcp/supported-products"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Full List of Google OneMCP Servers&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://docs.cloud.google.com/mcp/set-up-authentication-mcp-servers"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Set up authentication to Google and Google Cloud MCP servers&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://docs.cloud.google.com/gemini-enterprise-agent-platform/govern/agent-identity-overview"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Gemini Enterprise Agent Platform &amp;amp; Agent Identity Overview&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://www.youtube.com/watch?v=-fb0ycu4kiU" rel="noopener" target="_blank"&gt;&lt;span data-rich-links='{"fple-t":"Automate Google Cloud with Cloud CLI Remote MCP Server","fple-u":"https://www.youtube.com/watch?v=-fb0ycu4kiU","fple-mt":null,"type":"first-party-link"}' style="text-decoration: underline; vertical-align: baseline;"&gt;Automate Google Cloud with Cloud CLI Remote MCP Server&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;</description><pubDate>Wed, 30 Sep 2026 16:00:00 +0000</pubDate><guid>https://cloud.google.com/blog/products/ai-machine-learning/google-cloud-cli-remote-mcp-server-in-preview/</guid><category>Data Analytics</category><category>Developers &amp; Practitioners</category><category>AI &amp; Machine Learning</category><og xmlns:og="http://ogp.me/ns#"><type>article</type><title>Empower your agents with the Google Cloud CLI remote MCP server</title><description></description><site_name>Google</site_name><url>https://cloud.google.com/blog/products/ai-machine-learning/google-cloud-cli-remote-mcp-server-in-preview/</url></og><author xmlns:author="http://www.w3.org/2005/Atom"><name>Prosper Nwankpa</name><title>Senior Engineering Manager, Google Cloud</title><department></department><company></company></author><author xmlns:author="http://www.w3.org/2005/Atom"><name>Adam Hwang</name><title>Software Engineering Manager, Google Cloud</title><department></department><company></company></author></item><item><title>Data Agent Kit is now GA: Bring Google Data Cloud to any coding agent</title><link>https://cloud.google.com/blog/topics/developers-practitioners/data-agent-kit-is-now-ga-bring-google-data-cloud-to-any-coding-agent/</link><description>&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Today, &lt;/span&gt;&lt;a href="https://cloud.google.com/products/data-agent-kit?utm_campaign=CDR_0xaea1deef_default_b566338695&amp;amp;utm_medium=external&amp;amp;utm_source=blog"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Google Cloud Data Agent Kit&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; is generally available. Data Agent Kit is a free set of Model Context Protocol (MCP) tools and agent skills that lets the coding agent you already use work directly with your Google Cloud data products, whether you're using Antigravity, Claude Code, Codex, or other popular tools.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;With GA, we are adding support for &lt;/span&gt;&lt;a href="https://cloud.google.com/bigquery/docs/graph-overview?utm_campaign=CDR_0xaea1deef_default_b566338695&amp;amp;utm_medium=external&amp;amp;utm_source=blog"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;BigQuery Graph&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;a href="https://cloud.google.com/bigtable?utm_campaign=CDR_0xaea1deef_default_b566338695&amp;amp;utm_medium=external&amp;amp;utm_source=blog"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Bigtable&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, and &lt;/span&gt;&lt;a href="https://cloud.google.com/dataproc-serverless/docs/overview?utm_campaign=CDR_0xaea1deef_default_b566338695&amp;amp;utm_medium=external&amp;amp;utm_source=blog"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Managed Service for Apache Spark&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; access to your open Lakehouse, along with dozens of quality-of-life improvements that make everyday work faster and smoother.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/original_images/00-data-agent-kit-is-now-ga-bring-google-data-cloud-to-any-coding-agent-da.gif"
        
          alt="00-data-agent-kit-is-now-ga-bring-google-data-cloud-to-any-coding-agent-dak-promo"&gt;
        
        &lt;/a&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h2&gt;&lt;span style="vertical-align: baseline;"&gt;What is Data Agent Kit?&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Coding agents have become remarkably good at writing SQL, PySpark, and pipeline code. What they don't have by default is context about your environment: which tables exist, how they're partitioned, which ones your team trusts, or why last night's job failed. Without that, even a strong agent has to work from assumptions, and you end up pasting schemas and error logs into the chat to fill in the gaps.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Data Agent Kit fills that gap with two things:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;MCP tools:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Connections to more than 15 Google Data Cloud services, so your agent can inspect schemas, run queries, read job logs, and manage resources in your live environment.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Google-authored skills:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;a href="https://github.com/GoogleCloudPlatform/data-agent-kit-plugin" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Open-source instructions&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; from Google Cloud engineers that teach your agent data best practices, like optimizing BigQuery SQL, designing Bigtable row keys, and building dbt (&lt;/span&gt;&lt;a href="https://www.getdbt.com/" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;data build tool&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;) pipelines.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;You can use Data Agent Kit wherever you already work: as an IDE extension for VS Code, Antigravity IDE, Cursor, and other VS Code-compatible editors; as a plugin for Antigravity 2.0, Antigravity CLI, Claude Code, and Codex; or in &lt;/span&gt;&lt;a href="https://cloud.google.com/shell?utm_campaign=CDR_0xaea1deef_default_b566338695&amp;amp;utm_medium=external&amp;amp;utm_source=blog"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Cloud Shell&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; and &lt;/span&gt;&lt;a href="https://cloud.google.com/workstations?utm_campaign=CDR_0xaea1deef_default_b566338695&amp;amp;utm_medium=external&amp;amp;utm_source=blog"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Cloud Workstations&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, where it comes pre-installed. The IDE extension also brings a lightweight version of the Google Cloud console into your editor, so you can browse data, run queries, and review your agent's work without switching windows.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span style="vertical-align: baseline;"&gt;How it works&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Say you ask your agent, "Forecast next month's demand for our top-selling products and check whether we have enough inventory to meet it." Data Agent Kit loads the relevant skills, so the agent follows Google's best practices for the task. It searches &lt;/span&gt;&lt;a href="https://cloud.google.com/dataplex/docs/introduction?utm_campaign=CDR_0xaea1deef_default_b566338695&amp;amp;utm_medium=external&amp;amp;utm_source=blog"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Knowledge Catalog&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; to find the sales and inventory tables your team trusts. It then uses MCP tools to run a forecast in &lt;/span&gt;&lt;a href="https://cloud.google.com/bigquery?utm_campaign=CDR_0xaea1deef_default_b566338695&amp;amp;utm_medium=external&amp;amp;utm_source=blog"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;BigQuery&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, check current stock levels in AlloyDB for PostgreSQL, and bring the combined answer back to your editor or terminal. Every step runs with your own IAM permissions.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/01-data-agent-kit-is-now-ga-bring-google-d.max-1000x1000.png"
        
          alt="01-data-agent-kit-is-now-ga-bring-google-data-cloud-to-any-coding-agent_how_it_works"&gt;
        
        &lt;/a&gt;
      
        &lt;figcaption class="article-image__caption "&gt;&lt;p data-block-key="qngqb"&gt;How Data Agent Kit connects to data.&lt;/p&gt;&lt;/figcaption&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h2&gt;&lt;span style="vertical-align: baseline;"&gt;What you can build&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Data Agent Kit covers analytics, operational databases, the Lakehouse, and pipelines. Here's what that looks like in practice, starting with what's new at GA.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Analytics and graph: BigQuery and BigQuery Graph (New in GA)&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Graphs are a natural way to explore relationships, like which products people buy together or how suppliers connect to your inventory. Building one usually means hand-writing &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;CREATE PROPERTY GRAPH&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; DDL, learning GQL, and working out which keys actually form edges.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Instead, you describe the graph you want and your agent builds it. The &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;bigquery-graph-author&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; skill maps your tables to nodes and edges, checks each proposed relationship against the actual data, and shows you a plan to approve before creating anything. It can even start from an ER diagram or data model you already have. The &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;bigquery-graph-query&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; skill then writes the GQL, and the graph visualizer in the IDE lets you click through the results.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/original_images/02-data-agent-kit-is-now-ga-bring-google-data-cloud-to-any-coding-agent_bq.gif"
        
          alt="02-data-agent-kit-is-now-ga-bring-google-data-cloud-to-any-coding-agent_bqgraph"&gt;
        
        &lt;/a&gt;
      
        &lt;figcaption class="article-image__caption "&gt;&lt;p data-block-key="qngqb"&gt;Building and visualizing a BigQuery property graph.&lt;/p&gt;&lt;/figcaption&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Operational and real-time databases: Spanner, AlloyDB, Cloud SQL, and Bigtable (New in GA)&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Some features have to load instantly, like a personalized feed, a live counter, or a "recently viewed" rail on your storefront. Bigtable is built for exactly that, and it rewards a well-designed row key.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;With GA, Bigtable joins &lt;/span&gt;&lt;a href="https://cloud.google.com/spanner?utm_campaign=CDR_0xaea1deef_default_b566338695&amp;amp;utm_medium=external&amp;amp;utm_source=blog"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Spanner&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;a href="https://cloud.google.com/alloydb?utm_campaign=CDR_0xaea1deef_default_b566338695&amp;amp;utm_medium=external&amp;amp;utm_source=blog"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;AlloyDB&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, and &lt;/span&gt;&lt;a href="https://cloud.google.com/sql?utm_campaign=CDR_0xaea1deef_default_b566338695&amp;amp;utm_medium=external&amp;amp;utm_source=blog"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Cloud SQL&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; as a fully supported database in Data Agent Kit. The new &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;bigtable-basics&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; skill designs your schema around how the data will be read and flags hotspots and full table scans before you create anything. Your agent can then create the table and query it with GoogleSQL, with column families flattened into readable columns. In the IDE, you can browse Bigtable instances and tables in the catalog explorer and run queries from the SQL editor.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/original_images/03-data-agent-kit-is-now-ga-bring-google-data-cloud-to-any-coding-agent_bi.gif"
        
          alt="03-data-agent-kit-is-now-ga-bring-google-data-cloud-to-any-coding-agent_bigtable"&gt;
        
        &lt;/a&gt;
      
        &lt;figcaption class="article-image__caption "&gt;&lt;p data-block-key="qngqb"&gt;Agent-guided Bigtable schema design and querying.&lt;/p&gt;&lt;/figcaption&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Lakehouse and Spark: Managed Service for Apache Spark and Lakehouse for Apache Iceberg (New in GA)&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Your agent could already query the Apache Iceberg tables in your Lakehouse through BigQuery. Now it can also work with those same tables using serverless Spark on &lt;/span&gt;&lt;a href="https://cloud.google.com/dataproc-serverless/docs/overview?utm_campaign=CDR_0xaea1deef_default_b566338695&amp;amp;utm_medium=external&amp;amp;utm_source=blog"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Managed Service for Apache Spark&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, with no cluster to manage. Each session keeps its state, so temporary views carry across statements, and you get Iceberg's full feature set, including branching, time travel, and schema evolution.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Your tables don't all have to live on Google Cloud, either. The &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;federate-lakehouse-catalog&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; skill connects your Lakehouse to AWS Glue and Databricks Unity Catalog, so your agent can query that data in place without building an ingestion pipeline first.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/04-data-agent-kit-is-now-ga-bring-google-d.max-1000x1000.png"
        
          alt="04-data-agent-kit-is-now-ga-bring-google-data-cloud-to-any-coding-agent_lakehouse"&gt;
        
        &lt;/a&gt;
      
        &lt;figcaption class="article-image__caption "&gt;&lt;p data-block-key="qngqb"&gt;Branching and querying Iceberg tables with Managed Service for Apache Spark.&lt;/p&gt;&lt;/figcaption&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Pipelines and orchestration: dbt, Dataform, and Managed Service for Apache Airflow&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Once your logic works, your agent can turn it into a pipeline that runs on its own. It writes dbt or &lt;/span&gt;&lt;a href="https://cloud.google.com/dataform?utm_campaign=CDR_0xaea1deef_default_b566338695&amp;amp;utm_medium=external&amp;amp;utm_source=blog"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Dataform&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; models, then the &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;gcp-pipeline-orchestration&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; skill schedules them together with your notebooks as an Orchestration Pipeline on &lt;/span&gt;&lt;a href="https://cloud.google.com/composer?utm_campaign=CDR_0xaea1deef_default_b566338695&amp;amp;utm_medium=external&amp;amp;utm_source=blog"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Managed Service for Apache Airflow&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;. Pipelines can also include Gemini Enterprise Agent Platform steps, like uploading a model or running batch inference.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;In the IDE, you can follow each run on a visual pipeline canvas. If a task needs attention, click &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Diagnose&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; to hand its logs to your agent. Troubleshooting skills for Airflow and Spark trace the root cause and propose a fix for you to approve.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/original_images/05-data-agent-kit-is-now-ga-bring-google-data-cloud-to-any-coding-agent_pi.gif"
        
          alt="05-data-agent-kit-is-now-ga-bring-google-data-cloud-to-any-coding-agent_pipelines"&gt;
        
        &lt;/a&gt;
      
        &lt;figcaption class="article-image__caption "&gt;&lt;p data-block-key="qngqb"&gt;Troubleshooting a failed Airflow DAG with an agent.&lt;/p&gt;&lt;/figcaption&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h2&gt;&lt;span style="vertical-align: baseline;"&gt;Improving the developer experience&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;GA also streamlines setup and day-to-day workflows. When you get started, you simply sign in once and select the Google Cloud services you use. Data Agent Kit automatically enables the required APIs, installs the matching skills, and configures your MCP servers with no manual setup files. Inside the IDE, the SQL editor and notebooks now support inline code generation, &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;@&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; references to tables, and diff views for suggested changes. The extension also shares your active project, open file, and the error from the query you just ran with your agent, so asking it to "fix this query" just works.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;We also made the core tools faster and more responsive. New Spark notebooks automatically create and select a Spark Connect runtime, and Spark SQL queries in the editor run in isolated sessions with built-in execution metrics. &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;The catalog explorer now loads faster and includes BigQuery public datasets in the sidebar. Tuned notebook skills help your agent finish notebook tasks more quickly while using fewer tokens. &lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span style="vertical-align: baseline;"&gt;Ready for the enterprise&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Data Agent Kit is included at no additional cost; you pay standard pricing only for the Google Cloud services your agent uses. Skills also steer the agent toward cost-aware query patterns, like checking partition keys and running a dry run before executing a BigQuery query to avoid accidental full-table scans. And because the skills are open source on GitHub, your team can audit them, fork them, or write custom skills for your own internal standards.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;For access control, the agent connects as you or as a service account you impersonate, so row- and column-level security policies apply automatically. Admins can also govern MCP access with Identity and Access Management (IAM), screen MCP traffic with &lt;/span&gt;&lt;a href="https://cloud.google.com/security-command-center/docs/model-armor-overview?utm_campaign=CDR_0xaea1deef_default_b566338695&amp;amp;utm_medium=external&amp;amp;utm_source=blog"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Model Armor&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, and scope agents with &lt;/span&gt;&lt;a href="https://cloud.google.com/vpc-service-controls?utm_campaign=CDR_0xaea1deef_default_b566338695&amp;amp;utm_medium=external&amp;amp;utm_source=blog"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;VPC Service Controls&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; and Principal Access Boundary policies.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span style="vertical-align: baseline;"&gt;Install and get started&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;You can set up Data Agent Kit in under a minute in either your IDE or your terminal.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Option 1: Install the IDE Extension&lt;/span&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;IDE extension:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Search for "Google Cloud Data Agent Kit" in the Extensions panel of VS Code, Antigravity IDE, Cursor, or any VS Code-compatible editor. You can also install it from the &lt;/span&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=googlecloudtools.datacloud" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;VS Code Marketplace&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; or &lt;/span&gt;&lt;a href="https://open-vsx.org/extension/googlecloudtools/datacloud" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Open VSX&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Antigravity 2.0:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Go to &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Settings &amp;gt; Customizations &amp;gt; Build with Google Plugins&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;, then download Data Agent Kit.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Cloud Shell and Cloud Workstations:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Already installed by default; just open the editor and sign in.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Option 2: Install the CLI Plugin&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Run the command for your preferred coding agent using the official &lt;/span&gt;&lt;a href="https://github.com/GoogleCloudPlatform/data-agent-kit-plugin" rel="noopener" target="_blank"&gt;&lt;code style="text-decoration: underline; vertical-align: baseline;"&gt;GoogleCloudPlatform/data-agent-kit-plugin&lt;/code&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; repository:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;# Antigravity CLI\r\nagy plugin install https://github.com/GoogleCloudPlatform/data-agent-kit-plugin\r\n\r\n# Claude Code\r\nclaude plugin install data-agent-kit-starter-pack@claude-plugins-official\r\n\r\n# Codex CLI\r\ncodex plugin marketplace add GoogleCloudPlatform/data-agent-kit-plugin\r\ncodex plugin add dak@dak-marketplace&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe6912852d0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Then try a first prompt:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;quot;What are this week&amp;#x27;s fastest rising search terms in the US that weren&amp;#x27;t in the last week&amp;#x27;s top 10? Use the BigQuery public Google Trends dataset.&amp;quot;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe690765150&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/original_images/06-data-agent-kit-is-now-ga-bring-google-data-cloud-to-any-coding-agent_cl.gif"
        
          alt="06-data-agent-kit-is-now-ga-bring-google-data-cloud-to-any-coding-agent_cli"&gt;
        
        &lt;/a&gt;
      
        &lt;figcaption class="article-image__caption "&gt;&lt;p data-block-key="qngqb"&gt;Data Agent Kit plugin running in Claude Code.&lt;/p&gt;&lt;/figcaption&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Next steps &amp;amp; hands-on resources&lt;/span&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Read the docs:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Explore the &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/data-agent-kit?utm_campaign=CDR_0xaea1deef_default_b566338695&amp;amp;utm_medium=external&amp;amp;utm_source=blog"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Data Agent Kit documentation&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; and &lt;/span&gt;&lt;a href="https://cloud.google.com/products/data-agent-kit?utm_campaign=CDR_0xaea1deef_default_b566338695&amp;amp;utm_medium=external&amp;amp;utm_source=blog"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;product overview page&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Explore the skills:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Browse, star, and contribute on &lt;/span&gt;&lt;a href="https://github.com/GoogleCloudPlatform/data-agent-kit-plugin" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;GitHub&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Build an analytics workflow:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Try the &lt;/span&gt;&lt;a href="https://codelabs.developers.google.com/dak-analytics-eng-antigravity-ide?utm_campaign=CDR_0xaea1deef_default_b566338695&amp;amp;utm_medium=external&amp;amp;utm_source=blog" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Analytics with Data Agent Kit and Antigravity IDE&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; codelab, and read the companion blog, &lt;/span&gt;&lt;a href="https://cloud.google.com/blog/products/data-analytics/agentic-analytics-with-the-data-agent-kit?utm_campaign=CDR_0xaea1deef_default_b566338695&amp;amp;utm_medium=external&amp;amp;utm_source=blog"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Agentic analytics with the Data Agent Kit&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Build a data science pipeline:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Try the &lt;/span&gt;&lt;a href="https://codelabs.developers.google.com/dak-data-science-antigravity-ide?utm_campaign=CDR_0xaea1deef_default_b566338695&amp;amp;utm_medium=external&amp;amp;utm_source=blog" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Fraud detection pipeline with Data Agent Kit and Antigravity IDE&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; codelab.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;</description><pubDate>Wed, 30 Sep 2026 13:00:00 +0000</pubDate><guid>https://cloud.google.com/blog/topics/developers-practitioners/data-agent-kit-is-now-ga-bring-google-data-cloud-to-any-coding-agent/</guid><category>Developers &amp; Practitioners</category><media:content height="540" url="https://storage.googleapis.com/gweb-cloudblog-publish/images/dak_blog_banner.max-600x600.png" width="540"></media:content><og xmlns:og="http://ogp.me/ns#"><type>article</type><title>Data Agent Kit is now GA: Bring Google Data Cloud to any coding agent</title><description></description><image>https://storage.googleapis.com/gweb-cloudblog-publish/images/dak_blog_banner.max-600x600.png</image><site_name>Google</site_name><url>https://cloud.google.com/blog/topics/developers-practitioners/data-agent-kit-is-now-ga-bring-google-data-cloud-to-any-coding-agent/</url></og><author xmlns:author="http://www.w3.org/2005/Atom"><name>Arun Nair</name><title>Product Manager, Google</title><department></department><company></company></author><author xmlns:author="http://www.w3.org/2005/Atom"><name>Jeff Nelson</name><title>Developer Relations Engineer, Google</title><department></department><company></company></author></item><item><title>Graph Workflows in ADK: Everything You Need to Know</title><link>https://cloud.google.com/blog/topics/developers-practitioners/graph-workflows-in-adk-everything-you-need-to-know/</link><description>&lt;div class="block-paragraph"&gt;&lt;p data-block-key="z0o0k"&gt;Graph engineering is the design work: breaking a task into nodes, connecting them with edges, and deciding where code, models, or people control the next step. The &lt;a href="https://adk.dev/" target="_blank"&gt;Agent Development Kit (ADK)&lt;/a&gt;'s Workflow turns that design into an executable process, with functions and agents doing the work. Through a refund example, this post shows how to run steps in parallel, route decisions, pause for human review, and process a list of cases. It also explains when to declare the paths in a static graph and when to let Python schedule further work as results arrive.&lt;/p&gt;&lt;p data-block-key="2irer"&gt;&lt;b&gt;TL;DR:&lt;/b&gt; Using a refund workflow in ADK, we'll cover fan-out and fan-in, deterministic and agent routers, human-in-the-loop pauses, parallel workers, and dynamic orchestration— along with when to use a static graph or let Python decide what runs next.&lt;/p&gt;&lt;h2 data-block-key="611o0"&gt;&lt;b&gt;Start with a single agent&lt;/b&gt;&lt;/h2&gt;&lt;p data-block-key="d27bu"&gt;We can give one agent the tools and instructions to handle the refund request from start to finish:&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;refund_agent = Agent(\r\n    name=&amp;quot;refund_agent&amp;quot;, model=MODEL,\r\n    tools=[fetch_order, fetch_payment, fetch_history],\r\n    instruction=&amp;quot;&amp;quot;&amp;quot;You handle refund requests.\r\n    1. Look up the order.\r\n    2. Check the payment record.\r\n    3. Check the customer\&amp;#x27;s refund history.\r\n    4. Deny if there\&amp;#x27;s an open chargeback or it\&amp;#x27;s past 30 days.\r\n       Approve if it\&amp;#x27;s under $50 and they\&amp;#x27;ve had fewer than three\r\n       refunds this year.\r\n    5. Write the customer an email explaining the decision.&amp;quot;&amp;quot;&amp;quot;,\r\n)&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;lang-py&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe6905e18d0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;p data-block-key="z0o0k"&gt;This puts the model in charge of choosing the tools, applying the policy, and writing the reply. But the prompt already describes distinct pieces of work: three lookups, a decision, and a response. Making those pieces separate nodes lets us decide how each should run.&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/graph-workflows-in-adk-everything-you-need.max-1000x1000_wEZYObA.png"
        
          alt="graph-workflows-in-adk-everything-you-need-to-know-01-five-nodes"&gt;
        
        &lt;/a&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;p data-block-key="z0o0k"&gt;Assume the customer has selected an order and clicked “Request refund.” The app knows the order ID, so the workflow can begin with the lookups.&lt;/p&gt;&lt;h2 data-block-key="2v81e"&gt;&lt;b&gt;Let independent steps run together&lt;/b&gt;&lt;/h2&gt;&lt;p data-block-key="1ca48"&gt;The order, payment, and refund-history lookups all need the order ID, but none needs another lookup's result. Although the prompt lists them one after another, there is no reason for them to wait for each other. We can run all three in parallel.&lt;/p&gt;&lt;p data-block-key="6rgi5"&gt;The policy decision is different: it needs all three records. So the workflow splits into three paths, then brings their results together before continuing. These two moves are called &lt;b&gt;fan-out&lt;/b&gt; and &lt;b&gt;fan-in&lt;/b&gt;.&lt;/p&gt;&lt;p data-block-key="4am57"&gt;In ADK, the lookup functions can become nodes directly. A nested tuple starts them together, and a &lt;code&gt;JoinNode&lt;/code&gt; waits for their results. First, the imports and a lookup signature:&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;import asyncio\r\nfrom pydantic import BaseModel, Field\r\n\r\nfrom google.adk import Agent, Context, Event, Workflow\r\nfrom google.adk.events import RequestInput\r\nfrom google.adk.workflow import JoinNode, START, node\r\n\r\nasync def fetch_order(node_input: str) -&amp;gt; dict:\r\n    ...&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;lang-py&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe69010add0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;p data-block-key="z0o0k"&gt;Each lookup receives the order ID through &lt;code&gt;node_input&lt;/code&gt; and returns a dictionary. We can connect them like this:&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;join_case = JoinNode(name=&amp;quot;join_case&amp;quot;)\r\n\r\nedges=[\r\n    (START, (fetch_order, fetch_payment, fetch_history), join_case),\r\n]&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;lang-py&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe690108ed0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;p data-block-key="z0o0k"&gt;Read this from left to right: start all three lookups, then continue through &lt;code&gt;join_case&lt;/code&gt; once they finish.&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/graph-workflows-in-adk-everything-you-need.max-1000x1000_59cATcj.png"
        
          alt="graph-workflows-in-adk-everything-you-need-to-know-02-fanout-join"&gt;
        
        &lt;/a&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;p data-block-key="z0o0k"&gt;The join returns a dictionary keyed by node name. The next node can read &lt;code&gt;node_input["fetch_order"]&lt;/code&gt;, &lt;code&gt;node_input["fetch_payment"]&lt;/code&gt;, and &lt;code&gt;node_input["fetch_history"]&lt;/code&gt; without a model call to collect the results. The &lt;a href="https://github.com/google/adk-python/blob/main/docs/guides/workflow/join_node/index.md" target="_blank"&gt;JoinNode guide&lt;/a&gt; explains the details.&lt;/p&gt;&lt;p data-block-key="a65ee"&gt;If the payment lookup needed a transaction ID from the order lookup, those two would run in sequence. &lt;b&gt;Dependencies determine the edges&lt;/b&gt;, even when the prompt lists every step in order.&lt;/p&gt;&lt;p data-block-key="5cu7f"&gt;You can learn more about fan out and fan in in this video:&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-video"&gt;



&lt;div class="article-module article-video "&gt;
  &lt;figure&gt;
    &lt;a class="h-c-video h-c-video--marquee"
      href="https://youtube.com/watch?v=Mzr7byMFy_4"
      data-glue-modal-trigger="uni-modal-Mzr7byMFy_4-"
      data-glue-modal-disabled-on-mobile="true"&gt;

      
        &lt;img src="//img.youtube.com/vi/Mzr7byMFy_4/maxresdefault.jpg"
             alt="Video about how to build a production-ready, multi-agent AI system from scratch using Graph Engineering and Google&amp;#x27;s Agent Development Kit (ADK)."/&gt;
      
      &lt;svg role="img" class="h-c-video__play h-c-icon h-c-icon--color-white"&gt;
        &lt;use xlink:href="#mi-youtube-icon"&gt;&lt;/use&gt;
      &lt;/svg&gt;
    &lt;/a&gt;

    
      &lt;figcaption class="article-video__caption h-c-page"&gt;
        
          &lt;h4 class="h-c-headline h-c-headline--four h-u-font-weight-medium h-u-mt-std"&gt;Graph Engineering with ADK&lt;/h4&gt;
        
        
      &lt;/figcaption&gt;
    
  &lt;/figure&gt;
&lt;/div&gt;

&lt;div class="h-c-modal--video"
     data-glue-modal="uni-modal-Mzr7byMFy_4-"
     data-glue-modal-close-label="Close Dialog"&gt;
   &lt;a class="glue-yt-video"
      data-glue-yt-video-autoplay="true"
      data-glue-yt-video-height="99%"
      data-glue-yt-video-vid="Mzr7byMFy_4"
      data-glue-yt-video-width="100%"
      href="https://youtube.com/watch?v=Mzr7byMFy_4"
      ng-cloak&gt;
   &lt;/a&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;p data-block-key="z0o0k"&gt;One detail matters when turning tools into nodes: the parameter named &lt;code&gt;node_input&lt;/code&gt; receives the previous node's output. Other names bind to &lt;code&gt;ctx.state&lt;/code&gt; by default, so &lt;code&gt;order_id&lt;/code&gt; would look for &lt;code&gt;ctx.state["order_id"]&lt;/code&gt; and raise a &lt;code&gt;ValueError&lt;/code&gt; if it is missing. Here, the str annotation also converts &lt;code&gt;START&lt;/code&gt;'s &lt;code&gt;types.Content&lt;/code&gt; input to a string.&lt;/p&gt;&lt;h2 data-block-key="1og89"&gt;&lt;b&gt;Route each request to the right workflow&lt;/b&gt;&lt;/h2&gt;&lt;p data-block-key="1mldp"&gt;So far, the customer has explicitly requested a refund. In a broader support conversation, we first need to identify what they want and send the request to the right process. “The shoes are the wrong size. Could you send me a different pair?” should go to an exchange workflow, while a request for money back should enter our refund workflow.&lt;/p&gt;&lt;p data-block-key="82plm"&gt;That introduces a &lt;b&gt;router&lt;/b&gt;, a node that chooses which branch runs next.&lt;/p&gt;&lt;ul&gt;&lt;li data-block-key="duqvc"&gt;A &lt;b&gt;deterministic router&lt;/b&gt; follows explicit rules, the same inputs produce the same route.&lt;/li&gt;&lt;li data-block-key="27pqb"&gt;A &lt;b&gt;nondeterministic router&lt;/b&gt; can choose different branches for the same input.&lt;/li&gt;&lt;li data-block-key="fe33q"&gt;An &lt;b&gt;agent router&lt;/b&gt; uses a model to interpret the request, so its choice can vary.&lt;/li&gt;&lt;/ul&gt;&lt;p data-block-key="cn1a2"&gt;Routers choose among the paths defined by the workflow. In our support example, we can use an agent to identify the customer's intent, then fixed rules to apply the refund policy.&lt;/p&gt;&lt;h3 data-block-key="3tth6"&gt;&lt;b&gt;Identify the intent with an agent router&lt;/b&gt;&lt;/h3&gt;&lt;p data-block-key="40a6e"&gt;An agent can interpret the customer's message and classify the request. In one ADK pattern, it returns a structured category, then a small function emits the corresponding &lt;code&gt;Event(route=...)&lt;/code&gt; to send the request to the chosen workflow:&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;Customer message → classification agent → route function\r\n                                           ├─ REFUND → refund workflow\r\n                                           ├─ EXCHANGE → exchange workflow\r\n                                           └─ CLARIFY → ask a follow-up question&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe690108290&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;p data-block-key="z0o0k"&gt;The model identifies the intent; the graph defines the available destinations. If the request is unclear, the workflow can ask a follow-up question. ADK's &lt;a href="https://github.com/google/adk-python/blob/main/contributing/samples/workflows/route/agent.py" target="_blank"&gt;routing sample&lt;/a&gt; shows this pattern.&lt;/p&gt;&lt;p data-block-key="d6j2d"&gt;This intent router would sit before our refund workflow. For the selected-order example, the “Request refund” button has already established the intent, so we can enter that workflow directly.&lt;/p&gt;&lt;h3 data-block-key="4h73u"&gt;&lt;b&gt;Apply the refund policy with a deterministic router&lt;/b&gt;&lt;/h3&gt;&lt;p data-block-key="49cfk"&gt;Inside the refund workflow, the three lookups give us the facts for another decision: approve, deny, or ask a person to review. This time, the policy gives us explicit thresholds, so a function can choose the path:&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;def refund_policy(amount, days_ago, chargeback_open, priors):\r\n    if chargeback_open or days_ago &amp;gt; 30:\r\n        return &amp;quot;DENY&amp;quot;\r\n    if amount &amp;lt; 50 and priors &amp;lt; 3:\r\n        return &amp;quot;AUTO_APPROVE&amp;quot;\r\n    return &amp;quot;MANUAL_REVIEW&amp;quot;\r\n\r\ndef route_refund(node_input):\r\n    case = {**node_input[&amp;quot;fetch_order&amp;quot;], **node_input[&amp;quot;fetch_payment&amp;quot;],\r\n            **node_input[&amp;quot;fetch_history&amp;quot;]}\r\n    route = refund_policy(case[&amp;quot;amount_usd&amp;quot;], case[&amp;quot;placed_days_ago&amp;quot;],\r\n                          case[&amp;quot;chargeback_open&amp;quot;], case[&amp;quot;prior_refunds_12mo&amp;quot;])\r\n    return Event(output=case, route=route)        # the function names the path&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;lang-py&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe6901096d0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;code&gt;route_refund&lt;/code&gt; combines the records and returns the case with one of three route names: &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;AUTO_APPROVE&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;DENY&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;, or &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;MANUAL_REVIEW&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;. Manual review handles cases that meet neither automatic rule.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;This is a &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;deterministic router&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: the same case data produces the same decision, and we can test the policy without calling a model.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;&lt;table border="1" style="border-collapse: collapse; width: 100%;"&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;td style="width: 31.4907%;"&gt; &lt;/td&gt;
&lt;td style="width: 31.4907%;"&gt;&lt;strong&gt;Deterministic router&lt;/strong&gt;&lt;/td&gt;
&lt;td style="width: 31.4907%;"&gt;&lt;strong&gt;&lt;span style="vertical-align: baseline;"&gt;Agent router&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="width: 31.4907%;"&gt;&lt;strong&gt;Decisions come best from&lt;/strong&gt;&lt;/td&gt;
&lt;td style="width: 31.4907%;"&gt;Rules in code&lt;/td&gt;
&lt;td style="width: 31.4907%;"&gt;A model interpreting the input&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="width: 31.4907%;"&gt;&lt;strong&gt;Best fit&lt;/strong&gt;&lt;/td&gt;
&lt;td style="width: 31.4907%;"&gt;Known facts and explicit policy&lt;/td&gt;
&lt;td style="width: 31.4907%;"&gt;Meaning that is hard to capture in rules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="width: 31.4907%;"&gt;&lt;strong&gt;Example&lt;/strong&gt;&lt;/td&gt;
&lt;td style="width: 31.4907%;"&gt;Deny an order older than 30 days&lt;/td&gt;
&lt;td style="width: 31.4907%;"&gt;Recognize an exchange request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="width: 31.4907%;"&gt;&lt;strong&gt;Model call for routing&lt;/strong&gt;&lt;/td&gt;
&lt;td style="width: 31.4907%;"&gt;None&lt;/td&gt;
&lt;td style="width: 31.4907%;"&gt;Required&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div align="left"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Both routers choose among defined paths. &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;An agent router can sit inside a static graph&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: the model's choice varies, while the possible connections stay the same.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;For an automatic approval or denial, the next step is to explain the decision to the customer. We give each route a notice agent that writes the reply from the case data. ADK passes the dictionary in &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;Event(output=case, ...)&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; to that agent as a JSON user message:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;approve_notice = Agent(\r\n    name=&amp;quot;approve_notice&amp;quot;, model=MODEL,\r\n    instruction=&amp;quot;Tell the customer their refund is approved and when to expect the &amp;quot;\r\n                &amp;quot;money, using the case JSON you receive. Short email, warm, no fluff.&amp;quot;,\r\n)\r\ndenial_notice = Agent(\r\n    name=&amp;quot;denial_notice&amp;quot;, model=MODEL,\r\n    instruction=&amp;quot;Tell the customer their refund was declined and exactly why, based &amp;quot;\r\n                &amp;quot;on the case JSON you receive. If it carries a reviewer_note, that is &amp;quot;\r\n                &amp;quot;the reason. Short email, direct and kind. Do not invent policy.&amp;quot;,\r\n)&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;lang-py&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe690109150&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;p data-block-key="z0o0k"&gt;The refund workflow now has a path from the initial lookups to a decision and a reply, with a third branch for cases that need a person:&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;workflow = Workflow(\r\n    name=&amp;quot;refund_decision&amp;quot;,\r\n    edges=[\r\n        (START, (fetch_order, fetch_payment, fetch_history),\r\n         join_case, route_refund),\r\n        (route_refund, {&amp;quot;AUTO_APPROVE&amp;quot;:  approve_notice,\r\n                        &amp;quot;MANUAL_REVIEW&amp;quot;: escalate_to_human,\r\n                        &amp;quot;DENY&amp;quot;:          denial_notice}),\r\n    ],\r\n)&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;lang-py&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe69010be50&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The first chain fetches the records, joins them, and applies the policy. The second maps the router's decision to a destination. Automatic decisions go straight to a notice agent; &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;MANUAL_REVIEW&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; goes to the human-review node we'll define next.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/graph-workflows-in-adk-everything-you-need.max-1000x1000_9lNpFLs.png"
        
          alt="graph-workflows-in-adk-everything-you-need-to-know-03-refund-graph"&gt;
        
        &lt;/a&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;That third branch needs more than another function call. A reviewer may take minutes or days to answer, so the workflow must pause with the case pending and continue once the person decides.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The review node yields RequestInput, which records the pending request and pauses the run. On resume, &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;rerun_on_resume=True&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; runs the node again, with the answer available in &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;ctx.resume_inputs&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;REVIEW = &amp;quot;refund:review&amp;quot;\r\n\r\nclass ReviewDecision(BaseModel):\r\n    approve: bool = Field(description=&amp;quot;True to refund, False to decline.&amp;quot;)\r\n    note: str = Field(&amp;quot;&amp;quot;, description=&amp;quot;Why, in the reviewer\&amp;#x27;s words.&amp;quot;)\r\n\r\n@node(rerun_on_resume=True)\r\nasync def escalate_to_human(ctx: Context, node_input: dict):\r\n    answer = ctx.resume_inputs.get(REVIEW)\r\n    if answer is None:                       # first pass: ask, then stop\r\n        yield RequestInput(\r\n            interrupt_id=REVIEW,\r\n            message=f&amp;quot;Refund ${node_input[\&amp;#x27;amount_usd\&amp;#x27;]} on order &amp;quot;\r\n                    f&amp;quot;{node_input[\&amp;#x27;order_id\&amp;#x27;]}?&amp;quot;,\r\n            payload=node_input,              # what the reviewer is shown\r\n            response_schema=ReviewDecision,\r\n        )\r\n        return\r\n    # second pass: the answer is here, so route on it\r\n    yield Event(output={**node_input, &amp;quot;reviewer_note&amp;quot;: answer.get(&amp;quot;note&amp;quot;, &amp;quot;&amp;quot;)},\r\n                route=&amp;quot;AUTO_APPROVE&amp;quot; if answer[&amp;quot;approve&amp;quot;] else &amp;quot;DENY&amp;quot;)&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;lang-py&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe69010bb50&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The response schema gives the node an &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;approve&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; value to route on and a note to carry forward. If the reviewer declines, the notice agent receives their reason with the case. One more edge connects the review decision to the reply:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;edges=[\r\n    ...,\r\n    (escalate_to_human, {&amp;quot;AUTO_APPROVE&amp;quot;: approve_notice,\r\n                         &amp;quot;DENY&amp;quot;:         denial_notice}),\r\n]&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;lang-py&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe69010bdd0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;ADK ships two variants of this. The one above is the single-node pattern: the node reruns and reads &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;ctx.resume_inputs&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;, as in the &lt;/span&gt;&lt;a href="https://github.com/google/adk-python/blob/main/contributing/samples/workflows/request_input_rerun/agent.py" rel="noopener" target="_blank"&gt;&lt;code style="text-decoration: underline; vertical-align: baseline;"&gt;request_input_rerun&lt;/code&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt; sample&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;. The &lt;/span&gt;&lt;a href="https://github.com/google/adk-python/blob/main/contributing/samples/workflows/request_input/agent.py" rel="noopener" target="_blank"&gt;&lt;code style="text-decoration: underline; vertical-align: baseline;"&gt;request_input&lt;/code&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt; sample&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; shows the two-node variant, where one node yields &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;RequestInput&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; and the reviewer's answer arrives as the next node's &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;node_input&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; — so there is no &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;ctx.resume_inputs&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; to find in that file. The companion scripts linked below include the code that sends the reviewer's answer back to the run.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;A &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;Workflow&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; is also a node. This whole refund process can become one step in a larger customer-service workflow.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;strong style="vertical-align: baseline;"&gt;Apply the same step to a batch of cases&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;We now have a process for one refund. Suppose a batch of cases arrives with the records already collected. Each needs the same policy check, and the number of cases changes from batch to batch. We can apply one node to every item using a &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;parallel worker&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;In ADK, &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;parallel_worker=True&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; runs a node once per item in an input list and collects the results in the original order. We can reuse our policy function:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;@node(parallel_worker=True)\r\ndef review_case(node_input):\r\n    # Each worker receives one case from the input list.\r\n    case = node_input\r\n    decision = refund_policy(\r\n        case[&amp;quot;amount_usd&amp;quot;], case[&amp;quot;placed_days_ago&amp;quot;],\r\n        case[&amp;quot;chargeback_open&amp;quot;], case[&amp;quot;prior_refunds_12mo&amp;quot;],\r\n    )\r\n    return {&amp;quot;order_id&amp;quot;: case[&amp;quot;order_id&amp;quot;], &amp;quot;decision&amp;quot;: decision}\r\n\r\ndef collect_decisions(node_input):\r\n    # This node receives the list of worker results.\r\n    return {&amp;quot;decisions&amp;quot;: node_input}\r\n\r\nbatch_review = Workflow(\r\n    name=&amp;quot;batch_review&amp;quot;,\r\n    edges=[(START, review_case, collect_decisions)],\r\n)&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;lang-py&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe6901094d0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Each worker receives one case, and &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;collect_decisions&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; receives the results as a list. No separate &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;JoinNode&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; is needed. The flag also works on agents—for example, to write an explanation for each case. The &lt;/span&gt;&lt;a href="https://github.com/google/adk-python/blob/main/contributing/samples/workflows/parallel_worker/agent.py" rel="noopener" target="_blank"&gt;&lt;code style="text-decoration: underline; vertical-align: baseline;"&gt;parallel_worker&lt;/code&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt; sample&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; shows both forms.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The policy calculation here is small. Concurrency is more useful when each item waits on an API or model call, but the way inputs and results move stays the same.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;&lt;table border="1" style="border-collapse: collapse; width: 100%;"&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;td style="width: 31.4907%;"&gt;&lt;strong&gt;Pattern&lt;/strong&gt;&lt;/td&gt;
&lt;td style="width: 31.4907%;"&gt;&lt;strong&gt;Work distributed&lt;/strong&gt;&lt;/td&gt;
&lt;td style="width: 31.4907%;"&gt;&lt;strong&gt;Collected output&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="width: 31.4907%;"&gt;&lt;strong&gt;Fan-out with &lt;code&gt;JoinNode&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td style="width: 31.4907%;"&gt;Different notes doing independent jobs&lt;/td&gt;
&lt;td style="width: 31.4907%;"&gt;Dictionary keyed by node name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="width: 31.4907%;"&gt;&lt;strong&gt;Parallel worker&lt;/strong&gt;&lt;/td&gt;
&lt;td style="width: 31.4907%;"&gt;The same node for every item&lt;/td&gt;
&lt;td style="width: 31.4907%;"&gt;List in input order&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div align="left"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The batch size can change without changing the graph. A variable amount of work still fits inside a fixed process. See the &lt;a href="https://github.com/google/adk-python/blob/main/docs/guides/workflow/parallel_worker/index.md" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;parallel worker guide&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; for execution details.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;strong style="vertical-align: baseline;"&gt;Let results shape the next step&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Our refund process has known paths, even when a batch contains more cases or a reviewer takes longer to answer. But some work only becomes clear as we investigate.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Suppose a disputed refund reveals a second transaction. Checking it raises a delivery question that needs further investigation. Now each result can create follow-up work. A &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;dynamic node&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; can examine those results and schedule the next checks in Python.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;ADK provides &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;ctx.run_node&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; to run another node and await its result. To see how that changes orchestration, let's first express our existing refund flow this way:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;HANDLERS = {\r\n    &amp;quot;AUTO_APPROVE&amp;quot;: approve_notice,\r\n    &amp;quot;MANUAL_REVIEW&amp;quot;: escalate_to_human,\r\n    &amp;quot;DENY&amp;quot;: denial_notice,\r\n}\r\n\r\n@node(rerun_on_resume=True)\r\nasync def refund_flow(ctx, node_input):\r\n    # Step 1: fetch all three records at once.\r\n    order, payment, history = await asyncio.gather(\r\n        ctx.run_node(fetch_order,   node_input, use_sub_branch=True),\r\n        ctx.run_node(fetch_payment, node_input, use_sub_branch=True),\r\n        ctx.run_node(fetch_history, node_input, use_sub_branch=True),\r\n    )\r\n    case = order | payment | history\r\n\r\n    # Step 2: apply the refund policy — the same pure function, 0 LLM calls.\r\n    decision = refund_policy(\r\n        amount=case[&amp;quot;amount_usd&amp;quot;],\r\n        days_ago=case[&amp;quot;placed_days_ago&amp;quot;],\r\n        chargeback_open=case[&amp;quot;chargeback_open&amp;quot;],\r\n        priors=case[&amp;quot;prior_refunds_12mo&amp;quot;],\r\n    )\r\n\r\n    # Step 3: run the chosen handler, and use its output as this node\&amp;#x27;s output.\r\n    await ctx.run_node(HANDLERS[decision], case, use_as_output=True)&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;lang-py&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe69010a3d0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;code style="vertical-align: baseline;"&gt;asyncio.gather&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; runs the lookups together. Python combines their results, applies the policy, and runs the selected &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;handler. use_as_output=True&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; makes the handler's result the parent node's output without emitting it twice.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The dynamic version also adjusts the human-review node: after the answer arrives, it calls the chosen notice agent through &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;ctx.run_node&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;. The complete dynamic script (&lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;refund_dynamic.py&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;) includes that variation.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/graph-workflows-in-adk-everything-you-need.max-1000x1000_XydYu0o.png"
        
          alt="graph-workflows-in-adk-everything-you-need-to-know-04-dynamic"&gt;
        
        &lt;/a&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;p data-block-key="z0o0k"&gt;The outer graph only needs an entry point:&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;workflow = Workflow(\r\n    name=&amp;quot;refund_dynamic&amp;quot;,\r\n    edges=[(START, refund_flow)],\r\n)&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;lang-py&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe69010ab50&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;In the static version, the edge list shows the branches and destinations. In this version, we read &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;refund_flow&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; to see them. The &lt;/span&gt;&lt;a href="https://github.com/google/adk-python/blob/main/docs/guides/workflow/dynamic_nodes/index.md" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;dynamic node guide&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; covers this approach.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The human-review pause still works here. When the answer arrives, &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;refund_flow&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; runs again from the top, but completed &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;ctx.run_node&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; calls return their recorded outputs from session history. The lookups do not repeat, as direct function calls would. Keeping side effects inside child nodes lets completed calls replay their results when the parent resumes. Each child also gets its own trace span, and &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;use_sub_branch=True&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; keeps concurrent children's events on separate branches.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;For this fixed refund process, the edge list remains easy to inspect. The Python version gives us a place to add the investigation logic described above: inspect a result, choose a follow-up node, and run independent checks together. A model might suggest what to investigate, while code limits the work—for example, three follow-ups per finding and two levels of investigation before human review.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Loops can still fit in a static graph. A fixed draft → check → revise process can use a conditional back-edge and a router that limits revisions. “Static” describes the possible connections; the actual path and iteration count can vary. The &lt;/span&gt;&lt;a href="https://github.com/google/adk-python/blob/main/docs/guides/workflow/graph/index.md" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;graph guide&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; covers conditional cycles.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;You can also place a dynamic node inside a static workflow, using Python for a stage that needs it while keeping the surrounding process visible.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;strong style="vertical-align: baseline;"&gt;Choose who decides what runs next&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Start with a question: &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;can you draw the possible workflow before the input arrives?&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Include branches, loops, and repeated stages. You do not need to predict the path each request will take.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;&lt;table border="1" style="border-collapse: collapse; width: 100%;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="width: 48.1356%;"&gt;
&lt;p&gt;&lt;strong&gt;What you need&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="width: 48.1356%;"&gt;&lt;strong&gt;Pattern&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="width: 48.1356%;"&gt;Independent jobs, then all their results&lt;/td&gt;
&lt;td style="width: 48.1356%;"&gt;Fan-out and fan-in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="width: 48.1356%;"&gt;A branch chosen by fixed rules&lt;/td&gt;
&lt;td style="width: 48.1356%;"&gt;Deterministic router&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="width: 48.1356%;"&gt;A branch chosen by interpreting meaning&lt;/td&gt;
&lt;td style="width: 48.1356%;"&gt;Agent router&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="width: 48.1356%;"&gt;A person's decision before continuing&lt;/td&gt;
&lt;td style="width: 48.1356%;"&gt;&lt;code&gt;RequestInput&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="width: 48.1356%;"&gt;The same step across a list&lt;/td&gt;
&lt;td style="width: 48.1356%;"&gt;Parallel worker&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="width: 48.1356%;"&gt;Code that schedules work as results arrive&lt;/td&gt;
&lt;td style="width: 48.1356%;"&gt;Dynamic node&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div align="left"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Use an edge list when it makes those connections clear. Use dynamic orchestration when results create further work or Python expresses the control more naturally. A small, open-ended task may need only one agent and its tools.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;In our refund workflow, the graph coordinates the lookups, code applies the policy, a person handles exceptions, and a model writes the reply. Graph engineering gives each a clear responsibility—and makes it easier to see how the process works.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;strong style="vertical-align: baseline;"&gt;Get started&lt;/strong&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Read:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; the &lt;/span&gt;&lt;a href="https://github.com/google/adk-python/blob/main/docs/guides/workflow/workflow/index.md" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;workflow guide&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Explore:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; the &lt;/span&gt;&lt;a href="https://github.com/google/adk-python/tree/main/contributing/samples/workflows" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;workflow samples&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Build:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; the &lt;/span&gt;&lt;a href="https://codelabs.developers.google.com/adk2/instructions#0" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;hands-on codelab&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, which applies these patterns to a marathon race-day coach.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;</description><pubDate>Tue, 29 Sep 2026 16:00:00 +0000</pubDate><guid>https://cloud.google.com/blog/topics/developers-practitioners/graph-workflows-in-adk-everything-you-need-to-know/</guid><category>Developers &amp; Practitioners</category><media:content height="540" url="https://storage.googleapis.com/gweb-cloudblog-publish/images/graph-workflows-in-adk-everything-you-need-t.max-600x600_G3dwz11.png" width="540"></media:content><og xmlns:og="http://ogp.me/ns#"><type>article</type><title>Graph Workflows in ADK: Everything You Need to Know</title><description></description><image>https://storage.googleapis.com/gweb-cloudblog-publish/images/graph-workflows-in-adk-everything-you-need-t.max-600x600_G3dwz11.png</image><site_name>Google</site_name><url>https://cloud.google.com/blog/topics/developers-practitioners/graph-workflows-in-adk-everything-you-need-to-know/</url></og><author xmlns:author="http://www.w3.org/2005/Atom"><name>Annie Wang</name><title>Google AI Cloud Developer Advocate</title><department></department><company></company></author><author xmlns:author="http://www.w3.org/2005/Atom"><name>Shangjie Chen</name><title>Software Engineer, Google Cloud AI</title><department></department><company></company></author></item><item><title>Best practices guide for customizing Gemini models via Reinforcement Learning (RL)</title><link>https://cloud.google.com/blog/topics/developers-practitioners/best-practices-guide-for-customizing-gemini-models/</link><description>&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Reinforcement learning (RL) has been a keystone of modern LLM post-training, but it demands large training clusters and access to model internals that external customers can't have with proprietary models like Gemini. So here at Google Cloud, we packaged it into &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;a managed RL fine-tuning service (RLFT service) &lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;— you bring prompts and a reward function; we handle the infrastructure and the proprietary model internals. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Now, you can adapt Gemini with the service — teaching the model from a reward signal you define, rather than from a fixed set of labeled answers. This unlocks a class of problems that supervised fine-tuning (SFT) struggles with: tasks that are hard to demonstrate but easy to score.  &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;In this guide, we will walk through practical best practices for using RL fine-tuning service. We'll start with a short tour of the RL training loop, how to decide if and when to use RL, and introduce how to get the most value from this approach.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;What is RLFT? &lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;RLFT adapts Gemini from a &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;reward signal you define&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; rather than labeled answers. Instead of authoring a large set of gold examples, you write one program that &lt;/span&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;scores&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; a response and the service improves the model against it — unlocking tasks that are hard to &lt;/span&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;demonstrate&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; but easy to &lt;/span&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;verify&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;: you can't hand-write the ideal SQL for every schema, but you can run the query and check the result.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/1_-_Single-Step_RL_Training_Loop.max-1000x1000.png"
        
          alt="1 - Single-Step RL Training Loop"&gt;
        
        &lt;/a&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;At each training step the service generates multiple candidate responses to your prompts, scores them with your reward, and improves the model so that higher-scoring responses become more likely while it stays close to the original Gemini. The reinforcement learning that makes this work is fully managed — you never configure it. The one thing you own, and the thing that most determines your results, is the reward.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Three properties define what RLFT can and can't do:&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;It &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;learns from the model's own outputs:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; It refines what the model already produces rather than copying an external target, so it tends to disturb unrelated capabilities less than SFT. &lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;It &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;rewards outcomes, not paths:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;   Any response that reaches a good result earns reward, which fits open-ended tasks with many valid solutions. &lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;It &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;amplifies existing competence: &lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;  It makes &lt;/span&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;occasional&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; success &lt;/span&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;reliable&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;, but it can't teach a skill the model never demonstrates.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;When to use RLFT&lt;/span&gt;&lt;/h3&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/2_-_RLFT_Approaches_-_Direct_RL_or_SFT_War.max-1000x1000.png"
        
          alt="2 - RLFT Approaches - Direct RL or SFT Warmup to Continuous RLFT"&gt;
        
        &lt;/a&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Prompting and SFT handle most adaptation; exhaust them first. RLFT earns its keep when you can &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;grade a response but can't cheaply author it&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;, when &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;SFT has plateaued&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; on the metric that matters (faithfulness, schema validity, tone), or when the task has &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;many equally valid answers&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; a single reference target would wrongly penalize. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;SFT and RLFT are complementary, not competing:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Direct RLFT&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; when the base model already succeeds part of the time — enough for the reward to tell better answers from worse ones.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Two-stage SFT → RLFT&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; when you have SFT data or the base success rate is too low for RL to gain traction. Use SFT as a short, cheap warm start — kept light, since over-fitting the demonstrations leaves less room for RL to improve — then continue into RL via &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Continuous Tuning&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;, which initializes RL from the SFT checkpoint.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Across early adopters, these patterns show where RLFT delivers the most value — each scoring an outcome the business cares about but could never cheaply demonstrate.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Use cases for RLFT&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;AI-powered NPCs in games&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;What:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; In-character, on-brand dialogue held across long, multilingual, multi-turn conversations.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Problem:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Off-the-shelf models break immersion — wrong language, hallucinated items, ignored players, repetitive loops.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Objective and reward:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; A &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Gemini autorater (LLM-as-a-judge)&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; scores each turn on persona, flow, and game-state syntax, penalizing format and language errors.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Results:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Loops and language drift disappeared and state syntax held, making shippable in-game characters viable at scale.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Structured entity extraction&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;What:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Pulling a set of items from unstructured documents, such as supplier invoices and shipping manifests, into structured records automatically&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Problem:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; The long tail where SFT plateaus — missing required fields (recall) or inventing ones that aren't there (precision).&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Objective and reward:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; A &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;rule-based precision/recall reward&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; forces every field to be grounded in the source text, not imitated from one gold answer.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Results:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Field-level accuracy rose on noisy real-world documents where tuning had stalled, turning a manual review step into an automated one.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Content moderation&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;What:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Applying intricate policies and decision trees at scale.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Problem:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Models hallucinate false positives or reward-hack with invalid formats to dodge evaluation.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Objective and reward:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; A &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Cloud Run reward&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; pairs format validation with a deterministic grader to enforce multi-step policy adherence.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Results:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; The model handled complex exemption carve-outs, sharply cut false positives, and stopped reward hacking — reducing the human-escalation volume that makes moderation expensive.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Code measured by execution&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;What:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; SQL or API calls graded on whether they actually run against customer data.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Problem:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; SFT mimics one reference query and breaks on unseen proprietary schemas.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Objective &amp;amp; Reward:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; A &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;code-execution reward&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; runs the code in a secure sandbox and pays out only if it compiles, executes, and returns the correct result.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Results:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; The model produced first-attempt executable queries at closed-frontier quality and lower inference cost, letting non-technical users query proprietary data in natural language.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Presentation slide generation via HTML&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;What:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Multi-slide decks authored as HTML/CSS.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Problem:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Training on text alone is blind to visual quality — overflows, clipped elements, and inconsistent styling slip through unnoticed.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Objective &amp;amp; Reward:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; A &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;code-execution reward&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; renders the slides and scores visual design, layout integrity, structural completeness, and rubric adherence.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Results:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; The model emitted modular, well-styled decks with cohesive themes and no layout overflow.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Where to start?&lt;/span&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;A dataset.&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; A diverse set of prompts with a held-out validation split is enough for a first run — confirm the loop converges and reward moves the right way, then scale. Keep train and eval strictly separated; a contaminated eval hides overfitting.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;A reward function.&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Your task specification as code or configs, and the dominant driver of quality. A good reward correlates with human preference, is robust to malformed output (catch the failed parse and return a clearly negative score rather than crashing), and resists reward hacking — ensemble judges, penalize length, floor degenerate outputs, and prefer a verifiable check over a model's opinion. Validate it offline before launch.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The service handles the rest; start from the defaults, watch reward and eval curves in the console, and take the checkpoint where validation reward saturates rather than the last step.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/original_images/3_-_rlft_tutorial.gif"
        
          alt="3 - rlft_tutorial"&gt;
        
        &lt;/a&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Get started today&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;What will you build? The tools are ready and waiting. &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/tuning/reinforcement-tuning"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Documentation: Reinforcement Learning Fine-Tuning&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;</description><pubDate>Fri, 25 Sep 2026 16:00:00 +0000</pubDate><guid>https://cloud.google.com/blog/topics/developers-practitioners/best-practices-guide-for-customizing-gemini-models/</guid><category>AI &amp; Machine Learning</category><category>Developers &amp; Practitioners</category><og xmlns:og="http://ogp.me/ns#"><type>article</type><title>Best practices guide for customizing Gemini models via Reinforcement Learning (RL)</title><description></description><site_name>Google</site_name><url>https://cloud.google.com/blog/topics/developers-practitioners/best-practices-guide-for-customizing-gemini-models/</url></og><author xmlns:author="http://www.w3.org/2005/Atom"><name>Jiaqi Pan</name><title>Senior Software Engineer, Google</title><department></department><company></company></author><author xmlns:author="http://www.w3.org/2005/Atom"><name>Kunal Jha</name><title>Senior Product Manager, Google</title><department></department><company></company></author></item><item><title>Agent Factory recap: Agent harnesses, shifting left, and autonomous coding</title><link>https://cloud.google.com/blog/topics/developers-practitioners/agent-factory-recap-agent-harnesses-shifting-left-and-autonomous-coding/</link><description>&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;In this episode of &lt;/span&gt;&lt;a href="https://www.youtube.com/playlist?list=PLIivdWyY5sqLXR1eSkiM5bE6pFlXC-OSs" rel="noopener" target="_blank"&gt;&lt;span style="font-style: italic; text-decoration: underline; vertical-align: baseline;"&gt;The Agent Factory&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, we explore the reality of building with autonomous agents alongside Ryan Lopopolo, a software engineer at Google Cloud and the person who coined the term &lt;/span&gt;&lt;a href="https://cloud.google.com/discover/agent-harness?e=48754805"&gt;&lt;strong style="font-style: italic; text-decoration: underline; vertical-align: baseline;"&gt;agent harness&lt;/strong&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;. From throwing out manual code editors to treating team collaboration like leveling up RPG stats, Ryan breaks down how grounding models in rich context and shifting interventions left unlocks high levels of agent autonomy.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-video"&gt;



&lt;div class="article-module article-video "&gt;
  &lt;figure&gt;
    &lt;a class="h-c-video h-c-video--marquee"
      href="https://youtube.com/watch?v=F8EZJAm9iO8"
      data-glue-modal-trigger="uni-modal-F8EZJAm9iO8-"
      data-glue-modal-disabled-on-mobile="true"&gt;

      
        &lt;img src="//img.youtube.com/vi/F8EZJAm9iO8/maxresdefault.jpg"
             alt="Harness Engineering Explained: Inside the Stack Behind Antigravity, Claude Code &amp;amp; Cursor"/&gt;
      
      &lt;svg role="img" class="h-c-video__play h-c-icon h-c-icon--color-white"&gt;
        &lt;use xlink:href="#mi-youtube-icon"&gt;&lt;/use&gt;
      &lt;/svg&gt;
    &lt;/a&gt;

    
  &lt;/figure&gt;
&lt;/div&gt;

&lt;div class="h-c-modal--video"
     data-glue-modal="uni-modal-F8EZJAm9iO8-"
     data-glue-modal-close-label="Close Dialog"&gt;
   &lt;a class="glue-yt-video"
      data-glue-yt-video-autoplay="true"
      data-glue-yt-video-height="99%"
      data-glue-yt-video-vid="F8EZJAm9iO8"
      data-glue-yt-video-width="100%"
      href="https://youtube.com/watch?v=F8EZJAm9iO8"
      ng-cloak&gt;
   &lt;/a&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;This post guides you through the key ideas from our conversation. Use it to quickly recap topics or dive deeper into specific segments with links and timestamps.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span style="vertical-align: baseline;"&gt;The Agent Harness - What is it?&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;&lt;span style="vertical-align: baseline;"&gt;Timestamp: [&lt;/span&gt;&lt;a href="https://www.youtube.com/watch?v=F8EZJAm9iO8&amp;amp;t=30s" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;00:30&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;]&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;An &lt;em&gt;AI agent&lt;/em&gt; as we're defining it here is a large language model (LLM) plus an &lt;/span&gt;&lt;a href="https://cloud.google.com/discover/agent-harness?e=48754805"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;agent harness&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Think of the harness as everything wrapped around the LLM that isn't the model itself. For example, if you're working in &lt;/span&gt;&lt;a href="https://antigravity.google/" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Google Antigravity&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; using &lt;/span&gt;&lt;a href="https://antigravity.google/blog/gemini-3-8-flash-in-google-antigravity" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Gemini 3.8 Flash&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, Gemini Flash is the LLM and Google Antigravity is the harness.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;While an unassisted model can answer simple questions out of the box, it can't check live conditions or interact with your workspace on its own. When a user asks a question like &lt;/span&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;"Why is the sky blue?"&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;, an unassisted LLM can respond without issue. However, when asked a question like &lt;/span&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;"Should I wear a raincoat today?"&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;, the model can't answer on its own because it lacks the necessary data. The harness catches the intent, queries live weather tools, bundles that context back into the prompt, and hands it to the model to produce an informed answer.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span style="vertical-align: baseline;"&gt;Ryan Lopopolo on agent harnesses and autonomous coding&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Tilde Thurium sat down with Ryan Lopopolo to discuss what it takes to run fully autonomous coding workflows in production. See the summary below!&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Coining the harness and writing zero production code&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;&lt;span style="vertical-align: baseline;"&gt;Timestamp: [&lt;/span&gt;&lt;a href="https://www.youtube.com/watch?v=F8EZJAm9iO8&amp;amp;t=142s" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;02:22&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;]&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The term &lt;em&gt;agent harness&lt;/em&gt; grew out of Ryan's extensive work on autonomous coding agents, culminating in a &lt;/span&gt;&lt;a href="https://openai.com/index/harness-engineering/" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;February 2026 essay&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; on leveraging coding models in an agent-first world. Ryan shared that he hasn't opened a traditional code editor since May of last year, maintaining that streak through his transition into &lt;/span&gt;&lt;a href="https://cloud.google.com/"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Google Cloud&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;. In this paradigm, engineers no longer author or review individual lines of syntax; instead, they operate at the level of natural language specifications and inspect the final artifacts, such as pull requests, documents, and spreadsheets. Then they determine whether the end result meets organizational standards.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-pull_quote"&gt;&lt;div class="uni-pull-quote h-c-page"&gt;
  &lt;section class="h-c-grid"&gt;
    &lt;div class="uni-pull-quote__wrapper h-c-grid__col h-c-grid__col--8 h-c-grid__col-m--6 h-c-grid__col-l--6
      h-c-grid__col--offset-2 h-c-grid__col-m--offset-3 h-c-grid__col-l--offset-3"&gt;
      &lt;div class="uni-pull-quote__inner-wrapper h-c-copy h-c-copy"&gt;
        &lt;q class="uni-pull-quote__text"&gt;Harness engineering is the study and the practice of putting a model into an environment where it can succeed. If you don&amp;#x27;t do that work, you end up doing what I call &amp;#x27;prompt and pray&amp;#x27;.&lt;/q&gt;

        
          &lt;cite class="uni-pull-quote__author"&gt;
            
            
              &lt;span class="uni-pull-quote__author-meta"&gt;
                
                  &lt;strong class="h-u-font-weight-medium"&gt;Ryan Lopopolo&lt;/strong&gt;&lt;br /&gt;
                
                
              &lt;/span&gt;
            
          &lt;/cite&gt;
        
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/section&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Context curation and lazy prompting&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;&lt;span style="vertical-align: baseline;"&gt;Timestamp: [&lt;/span&gt;&lt;a href="https://youtu.be/F8EZJAm9iO8?si=dZGjT_rG5fiLeVfm&amp;amp;t=215" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;03:35&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;]&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Upfront harness investment pays off by allowing engineers to become lazy prompters. When the repository contains structured documentation, clear interfaces, and discoverable tools, you do not need to paste walls of text into a prompt box every morning &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;"I aspire to be an incredibly lazy prompter. If I have done the job to give the model the tools and context it needs to ground itself, I don't need to write a long prompt. It figures it out."&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The model uses its harness to pull relevant context, allowing it to navigate large codebases and execute complex tasks without oversight.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Shifting left: engineering best practices as autonomous guardrails&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;&lt;span style="vertical-align: baseline;"&gt;Timestamp: [&lt;/span&gt;&lt;a href="https://www.youtube.com/watch?v=F8EZJAm9iO8&amp;amp;t=300s" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;05:00&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;]&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;When an agent fails, developers face a whole spectrum of interventions. The most common reflex is to fiddle with the prompt or retry, but that never scales across a team.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;"The simplest, smooth-brain, stupidest intervention I can think of is literally just: try my prompt again without changing anything else. But shifting left means moving interventions earlier into the development lifecycle where they are cheapest and automated: from prompts, to repo docs, to linters, to tests, and all the way to upstream evals."&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Instead of hoping the model guesses right on the next turn, shifting left embeds standards directly into the environment. Linters, tests, and &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;AGENTS.md&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; files act as durable memory and enforcement of what you think good looks like, making sure the agent stays on the rails without needing constant hand-holding.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Leveraging established tools and determinism&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;&lt;span style="vertical-align: baseline;"&gt;Timestamp: [&lt;/span&gt;&lt;a href="https://youtu.be/F8EZJAm9iO8?si=0K18aWfjWSkEv0Ws&amp;amp;t=410" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;06:50&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;]&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Agents shine when they're handed tools that already mirror patterns heavily represented in pre-training data. Pairing models with standard command-line interfaces moves reasoning into determinism, shifting the burden of context aggregation away from the model and onto reliable tools.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Ryan also shared an environmental design trick for context efficiency: structuring markdown files so link anchors sit directly beneath their corresponding prose blocks rather than inline. This prevents context clutter and mitigates "lost in the middle" retrieval issues. Because Ryan operates exclusively by reviewing end-state artifacts, keeping documentation readable allows him to easily inspect execution runs:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;"I want to be able to look at the pull request and review it. If it made a bad decision, I need to know where it went off the rails so I can whack the agent on the head and make sure it does not make that same mistake again."&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Long horizons and expanding the agentic loop&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;&lt;span style="vertical-align: baseline;"&gt;Timestamp: [&lt;/span&gt;&lt;a href="https://youtu.be/F8EZJAm9iO8?si=o3r4mie7FkoYLTTS&amp;amp;t=586" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;09:45&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;]&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The central challenge of harness engineering is ensuring that agents cohere over long time horizons. Because human organizations produce software through iterative refinement rather than single-shot prompts, agent workflows must mirror that cadence. Harness engineering uses tightly scoped, reviewable pull requests to narrow the agent's state space. Stacking these high-confidence changes end-to-end allows supervisors to gradually expand the loop size, building trust until agents can autonomously execute large-scale initiatives, including entire language migrations &lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Curating agent teams like RPG stats&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;&lt;span style="vertical-align: baseline;"&gt;Timestamp: [&lt;/span&gt;&lt;a href="https://youtu.be/F8EZJAm9iO8?si=1l25hbXKZjjKoLsh&amp;amp;t=718" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;11:58&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;]&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Rather than divvying up sprint tasks based on individual specialties, having a diverse team contribute to an agent turns it into a central producer of work that carries everyone's strengths. Ryan compared leveling up an agent's capabilities to building out a character sheet:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;"[It's like] building out the stats of your RPG character. I get a new person on the team who is a React architect and boom! The attention that they pay is able to bump out the stats in front-end architecture and performance."&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;With that collective expertise baked into the environment, the agent can autonomously classify incoming work and activate the exact skills it needs on demand, operating as both a backend architect and a front-end specialist.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Accruing leverage in tools, not custom harnesses&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;&lt;span style="vertical-align: baseline;"&gt;Timestamp: [&lt;/span&gt;&lt;a href="https://youtu.be/F8EZJAm9iO8?si=giil4EL8zs3RDif-&amp;amp;t=878" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;14:38&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;]&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;For developers wondering whether to build their own custom agent harness, Ryan offered clear advice: don't build one from scratch. Standard harnesses already provide the foundational primitives: file reading, grep search, and command execution. Over-scaffolding an agent with rigid, bespoke frameworks creates technical debt and leads to sunk-cost traps when frontier models advance.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;"If you focus all of your efforts on improving quality on tools and context, you can freely adopt the newest models as they come out and you'll be constantly accruing leverage into a bit of the system that will never become obsolete."&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Operating Google Cloud and eliminating capability overhang&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;&lt;span style="vertical-align: baseline;"&gt;Timestamp: [&lt;/span&gt;&lt;a href="https://youtu.be/F8EZJAm9iO8?si=MlXgcYa5QcQqOogM&amp;amp;t=1007" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;16:47&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;]&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Discussing his work at &lt;/span&gt;&lt;a href="https://cloud.google.com/"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Google Cloud&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, Ryan outlined his motivation to eliminate &lt;em&gt;capability overhang&lt;/em&gt;: the delta between what frontier AI models are theoretically capable of and how much useful work is currently extracted in production. Because the cloud functions as a massive, programmable surface, equipping agents with direct interfaces to Google Cloud lets them manage and deploy infrastructure effectively, turning raw model capability into tangible enterprise utility.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Continually updating your priors on AI&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;Timestamp: [&lt;/span&gt;&lt;a href="https://youtu.be/F8EZJAm9iO8?si=NSFTXZjs6QvgCFiM&amp;amp;t=1093" rel="noopener" target="_blank"&gt;&lt;span style="font-style: italic; text-decoration: underline; vertical-align: baseline;"&gt;18:13&lt;/span&gt;&lt;/a&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;]&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The speed of AI development requires engineers and teams to actively unlearn old limitations and constantly reassess what these models can achieve. "&lt;/span&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;It's very important to continually be updating what you think is possible with these lovely tools that we have&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;," Ryan urged. What broke six months ago often runs effortlessly on today's frontier models. Rather than getting locked into rigid workflows, developers should build around the two highly extensible interfaces that will remain relevant across every model upgrade: tools and context.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;"Agents will always need context in order to do that last mile adaptation into what you think good is. And as you can continue to... shift it to the left, in terms of increasingly capable tools which act as a form of memory and enforcement of what you think good looks like, you'll continually be amazed as the models are able to do more and more interesting things for you over time."&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span style="vertical-align: baseline;"&gt;How To Build A Custom Harness&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Next, &lt;/span&gt;&lt;a href="https://www.linkedin.com/in/billyjacobson/" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Billy Jacobson&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; started us off by showing how developers can customize their own agent harnesses for specific tasks.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Under the hood: Why build a custom harness?&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;&lt;span style="vertical-align: baseline;"&gt;Timestamp: [&lt;/span&gt;&lt;a href="https://www.youtube.com/watch?v=F8EZJAm9iO8&amp;amp;t=1184s&amp;amp;pp=0gcJCWMAwfN6Pr3D" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;19:44&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;]&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Before jumping into code, Billy unpacked why developers should understand the mechanics of a harness rather than treating it like a black box. Recalling advice from an engineering mentor that &lt;/span&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;"You can just use the framework, but a great engineer will really understand the framework"&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;, Billy explained that building a &lt;/span&gt;&lt;a href="https://cloud.google.com/discover/agent-harness?e=48754805"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;harness&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; yourself is the best way to debug what happens when an agent breaks. You can evaluate three core design decisions for every workflow:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Looping&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: How many iterations should the agent run, and what conditions trigger an exit state?&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Tools&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: What specific tools should the agent access, and when and how should it invoke them?&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Memory&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: How important is conversational and operational memory, and when should it be retrieved or compacted?&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Linear Agent Harness: Deterministic Single-Pass Execution&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;&lt;span style="vertical-align: baseline;"&gt;Timestamp: [&lt;/span&gt;&lt;a href="https://youtu.be/F8EZJAm9iO8?si=teRfnEVBrXQa0DBl&amp;amp;t=1234" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;21:34&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;]&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Billy demonstrated a minimalist &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/architecture/choose-design-pattern-agentic-ai-system#sequential-pattern"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;linear harness&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; designed for deterministic workflows where looping is unnecessary. This pattern is ideal for targeted inspections, file transformations, or single-turn data analyses where you want a high level of determinism and need the agent to perform the exact same execution flow every single time.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Closed-Loop Agent Harness: Iterative Test-Driven Repair&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;&lt;span style="vertical-align: baseline;"&gt;Timestamp: [&lt;/span&gt;&lt;a href="https://youtu.be/F8EZJAm9iO8?si=SZK9VsaI6x4FpKXT&amp;amp;t=1365" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;22:45&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;]&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;When tasks demand active bug fixing and refactoring, a &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/architecture/choose-design-pattern-agentic-ai-system#loop-pattern"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;closed-loop harness&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; provides the iterative reasoning required to reach a verified resolution. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;In this demo, Billy showcased an agent that applies an automated code edit to address a failing requirement, and the harness executes the unit test suite against the updated codebase. If the tests fail, the runtime captures standard failure logs and detailed stack traces, feeding those error diagnostics directly back into the agent's working memory. The process repeats continuously until all unit tests pass, backed by a five-iteration ceiling to prevent infinite loops and runaway execution costs.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Guardrail Harness with Google's Agent Development Kit (ADK)&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;&lt;span style="vertical-align: baseline;"&gt;Timestamp: [&lt;/span&gt;&lt;a href="https://youtu.be/F8EZJAm9iO8?si=iyoPxuMlAkYkrrls&amp;amp;t=1405" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;23:25&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;]&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;For developers who require custom behavior without rewriting core orchestration plumbing from scratch, Google's &lt;/span&gt;&lt;a href="https://adk.dev/" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Agent Development Kit &lt;span style="vertical-align: baseline;"&gt;(ADK)&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; provides scaffolding with automated memory management and execution safeguards. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Billy walked through an example that leverages ADK's native context compaction to summarize older conversational turns, preventing context window bloat during extended debugging runs. Custom interception hooks inspect and filter shell actions before execution, automatically stopping high-risk operations such as recursive file deletions, database drops, or unauthorized remote git pushes. This architecture gives teams fine-grained control over tool execution boundaries while avoiding the maintenance burden of bespoke harness frameworks.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span style="vertical-align: baseline;"&gt;The 3-Layer Agent Dev Stack: Gemini 3.8 Flash, Google Antigravity, and Google Skills&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;&lt;span style="vertical-align: baseline;"&gt;Timestamp: [&lt;/span&gt;&lt;a href="https://youtu.be/F8EZJAm9iO8?si=L0T5reEiQBXxZ86H&amp;amp;t=1527" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;25:27&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;]&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Next up, &lt;/span&gt;&lt;a href="https://www.linkedin.com/in/smithakolan/" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Smitha Kolan&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; broke down why coding agents do not always require heavier reasoning models, emphasizing that high performance stems from balancing the three layers of the agent stack: &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Model&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Harness&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;, and &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Knowledge&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;"Your coding agent doesn't need a smarter model. It needs a better stack: model, harness, and knowledge. When all three click into place, everything changes."&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;She then walked through the three tools she's been loving recently, one for each layer of the stack.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Layer 1 | Model | &lt;/strong&gt;&lt;a href="https://antigravity.google/blog/gemini-3-8-flash-in-google-antigravity" rel="noopener" target="_blank"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Gemini 3.8 Flash&lt;/strong&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;:&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; High-frequency agentic loops run between 20 and 60 sequential hops per task (inspecting files, updating functions, and executing unit tests). Because latency and API costs compound across iterations, a lightweight, responsive model like Gemini 3.8 Flash makes real-time agent loops practical without running up a massive bill.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Layer 2 | Harness | &lt;/strong&gt;&lt;a href="https://antigravity.google/" rel="noopener" target="_blank"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Google Antigravity&lt;/strong&gt;&lt;/a&gt;&lt;strong style="vertical-align: baseline;"&gt; with &lt;/strong&gt;&lt;a href="https://antigravity.google/docs/boost/" rel="noopener" target="_blank"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;/boost&lt;/strong&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;:&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; Default Antigravity handles standard navigation and component creation. On top of that, the &lt;/span&gt;&lt;code&gt;&lt;span style="vertical-align: baseline;"&gt;/boost&lt;/span&gt;&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; command spins up an orchestrator that coordinates specialized sub-agents in parallel and concludes with an independent audit pass before modifying files.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Layer 3 | Knowledge | &lt;/strong&gt;&lt;a href="https://github.com/google/skills/tree/main" rel="noopener" target="_blank"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Google Skills Repository&lt;/strong&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;:&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; With over 19,000 GitHub stars and 100+ curated domain packages across Google Cloud, Firebase, Flutter, and Maps, this harness-agnostic repository injects precise domain context on demand, preventing agents from guessing cloud configurations &lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span style="vertical-align: baseline;"&gt;Your turn to build&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Building effective coding agents requires moving past the reflex of simply swapping in larger models. As Ryan Lopopolo's philosophy of harness engineering illustrates, true developer leverage is achieved by shifting best practices to the left and investing in rich tools, deterministic verifiers, and well-curated context that survive model upgrades. When combined with fast inference models, structured orchestration harnesses, and modular domain knowledge, agents evolve from conversational novelties into dependable, autonomous engineering partners.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Ready to put it into practice? Explore the tools and resources covered in this episode:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://antigravity.google/blog/gemini-3-8-flash-in-google-antigravity" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Gemini 3.8 Flash&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;: Fast, low-cost model for multi-hop agent loops.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://antigravity.google/" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Google Antigravity&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; (&lt;/span&gt;&lt;a href="https://antigravity.google/docs/boost/" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;/boost&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;): Orchestrator harness for parallel coding agents and verification.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://github.com/google/skills/tree/main" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Google Skills&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;: Modular domain knowledge for Google Cloud, Firebase, and Flutter.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://adk.dev/" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Agent Development Kit (ADK)&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;: Custom harness middleware for safety guardrails and memory compaction.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://youtu.be/F8EZJAm9iO8?si=Uptrs898iW1XIRC6" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Full episode video&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;: The full interview and live Factory Floor code demos.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;span style="vertical-align: baseline;"&gt;Connect with us&lt;/span&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Smitha Kolan&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; →&lt;/span&gt; &lt;a href="https://www.linkedin.com/in/smithakolan/" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;LinkedIn&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; |&lt;/span&gt; &lt;a href="https://www.youtube.com/@smithakolan" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;YouTube&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; |&lt;/span&gt; &lt;a href="https://x.com/smithakolan" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;X&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Luke Schlangen&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; → &lt;/span&gt;&lt;a href="https://www.linkedin.com/in/lukeschlangen/" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;LinkedIn&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; |&lt;/span&gt; &lt;a href="https://www.luke.mn/" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;website&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Ryan Lopopolo&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; → &lt;/span&gt;&lt;a href="https://www.linkedin.com/in/ryanlopopolo/" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;LinkedIn&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; | &lt;/span&gt;&lt;a href="https://hyperbo.la/" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Hyperbola&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; | &lt;/span&gt;&lt;a href="https://x.com/_lopopolo" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;X&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Tilde&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Thurium &lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;→&lt;/span&gt; &lt;a href="https://www.linkedin.com/in/annthurium/" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;LinkedIn&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Billy Jacobson&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; →&lt;/span&gt; &lt;a href="https://www.linkedin.com/in/billyjacobson/" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;LinkedIn&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; | &lt;/span&gt;&lt;a href="https://x.com/billyjacobson" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;X&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Mollie Pettit&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; → &lt;/span&gt;&lt;a href="https://www.linkedin.com/in/molliepettit/" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;LinkedIn&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; | &lt;/span&gt;&lt;a href="https://dev.to/molliepettit" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;dev.to&lt;/span&gt;&lt;/a&gt; | &lt;a href="https://x.com/MollzMP" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;X&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; |&lt;/span&gt; &lt;a href="https://bsky.app/profile/mollzmp.bsky.social" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Bluesky&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;</description><pubDate>Thu, 24 Sep 2026 23:00:00 +0000</pubDate><guid>https://cloud.google.com/blog/topics/developers-practitioners/agent-factory-recap-agent-harnesses-shifting-left-and-autonomous-coding/</guid><category>Developers &amp; Practitioners</category><media:content height="540" url="https://storage.googleapis.com/gweb-cloudblog-publish/images/agent-factory-recap-agent-harness.max-600x600.png" width="540"></media:content><og xmlns:og="http://ogp.me/ns#"><type>article</type><title>Agent Factory recap: Agent harnesses, shifting left, and autonomous coding</title><description></description><image>https://storage.googleapis.com/gweb-cloudblog-publish/images/agent-factory-recap-agent-harness.max-600x600.png</image><site_name>Google</site_name><url>https://cloud.google.com/blog/topics/developers-practitioners/agent-factory-recap-agent-harnesses-shifting-left-and-autonomous-coding/</url></og><author xmlns:author="http://www.w3.org/2005/Atom"><name>Mollie Pettit</name><title>Developer Relations Engineer</title><department></department><company></company></author><author xmlns:author="http://www.w3.org/2005/Atom"><name>Smitha Kolan</name><title>Senior Developer Relations</title><department></department><company></company></author></item><item><title>How Google Cloud Networking Supports Your Fluid Compute Choices for AI Workloads</title><link>https://cloud.google.com/blog/topics/developers-practitioners/how-google-cloud-networking-supports-your-fluid-compute-choices-for-ai-workloads/</link><description>&lt;div class="block-paragraph"&gt;&lt;p data-block-key="1cnbu"&gt;The availability of resources for AI workloads can be challenging across the industry, especially accelerators. This can slow your AI workload deployment if it’s built around a specific type of accelerator. The concept of &lt;b&gt;fluid compute&lt;/b&gt; allows you to design your AI deployment with several options based on available resources that can fit your use case.&lt;/p&gt;&lt;p data-block-key="e2jpo"&gt;In this blog, we will explore how Google Cloud networking supports your AI workloads and considerations that are relevant to your choice of accelerator (GPU or TPU), as the backend networking component configuration is not exactly the same.&lt;/p&gt;&lt;h2 data-block-key="4araf"&gt;The resource options&lt;/h2&gt;&lt;p data-block-key="7qk9r"&gt;After deciding the type of work you want to achieve with your AI deployment, another important component is the actual hardware to get this done. In this case, we want to run inference for a private LLM, and the target is the NVIDIA B200 GPU family which is available in the &lt;a href="https://cloud.google.com/compute/docs/gpus"&gt;A4 VMs&lt;/a&gt; (a4-highgpu-8g).&lt;/p&gt;&lt;p data-block-key="6uc8e"&gt;Now we have identified what we want to get done and a possible compute option, but the challenge is: is this available?&lt;/p&gt;&lt;p data-block-key="57nfi"&gt;To get access to resources, there are several options which include:&lt;/p&gt;&lt;ul&gt;&lt;li data-block-key="ch7k0"&gt;&lt;a href="https://docs.cloud.google.com/compute/docs/instances/about-flex-start-vms"&gt;Dynamic Workload Scheduler (Flex-start VM)&lt;/a&gt;: Queues workloads until all required accelerator nodes are available at the same time, provisioning them together and running non-preemptibly for up to seven days.&lt;/li&gt;&lt;li data-block-key="qniq"&gt;&lt;a href="https://docs.cloud.google.com/compute/docs/instances/future-reservations-calendar-mode-overview"&gt;Dynamic Workload Scheduler (calendar mode)&lt;/a&gt;: Enables reserving accelerator capacity 1 to 90 days in advance with guaranteed start and end times, ideal for scheduled pre-training runs and benchmarking.&lt;/li&gt;&lt;li data-block-key="datn1"&gt;&lt;a href="https://docs.cloud.google.com/compute/docs/instances/future-reservations-overview"&gt;Future reservations&lt;/a&gt;: Guarantees access to committed hardware in a specified zone beginning at a specific future date.&lt;/li&gt;&lt;li data-block-key="dn02u"&gt;&lt;a href="https://cloud.google.com/compute/docs/instances/reservations-overview"&gt;Flex reservations&lt;/a&gt;: Offers short-term commitment windows to secure scarce accelerator nodes without multi-year lock-in.&lt;/li&gt;&lt;li data-block-key="60m4b"&gt;&lt;a href="https://docs.cloud.google.com/kubernetes-engine/docs/how-to/node-auto-provisioning#enable-workload-level"&gt;Dynamic node auto-provisioning and ComputeClasses&lt;/a&gt;: In Google Kubernetes Engine (GKE), defining multi-family fallback lists within ComputeClasses allows the cluster to automatically attempt provisioning alternative accelerator types if primary pools face regional constraints.&lt;/li&gt;&lt;li data-block-key="3p8rj"&gt;&lt;a href="https://cloud.google.com/compute/docs/instances/spot"&gt;Spot VMs&lt;/a&gt;: Delivers surplus compute at substantial discounts for fault-tolerant, checkpointed batch jobs.&lt;/li&gt;&lt;/ul&gt;&lt;p data-block-key="6fdjm"&gt;Read more on this in the blog &lt;a href="https://medium.com/google-cloud/never-run-out-of-compute-a-practical-guide-to-gke-resource-obtainability-eab4dea059ca" target="_blank"&gt;&lt;i&gt;Never Run Out of Compute: A Practical Guide to GKE Resource Obtainability&lt;/i&gt;&lt;/a&gt;.&lt;/p&gt;&lt;h2 data-block-key="4nu88"&gt;Networking your choices&lt;/h2&gt;&lt;p data-block-key="9vs9m"&gt;The networking component of the accelerator varies based on your choice, so let's explore four configurations: standard networking, accelerated GPU networking (&lt;a href="https://docs.cloud.google.com/compute/docs/gpus/gpudirect"&gt;TCPX/TCPXO&lt;/a&gt; and &lt;a href="https://cloud.google.com/blog/products/networking/rdma-rocev2-for-ai-workloads-on-google-cloud?e=48754805"&gt;RoCEv2&lt;/a&gt;), TPU networking, and Cloud Run.&lt;/p&gt;&lt;h3 data-block-key="9rjjn"&gt;&lt;b&gt;Standard networking&lt;/b&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li data-block-key="fgtoe"&gt;&lt;b&gt;Supported accelerators:&lt;/b&gt; NVIDIA T4 (&lt;a href="https://docs.cloud.google.com/compute/docs/gpus#n1-gpus"&gt;N1 series&lt;/a&gt;), NVIDIA L4 (&lt;a href="https://docs.cloud.google.com/compute/docs/gpus#l4-gpus"&gt;G2 series&lt;/a&gt;), NVIDIA A100 (&lt;a href="https://docs.cloud.google.com/compute/docs/accelerator-optimized-machines#a2-vms"&gt;A2 machine series&lt;/a&gt; single-node and multi-node), Cloud TPU v3, and &lt;a href="https://cloud.google.com/tpu/docs/v5e"&gt;Cloud TPU v5e&lt;/a&gt; (single-host/standalone slices).&lt;/li&gt;&lt;li data-block-key="7ub8d"&gt;&lt;b&gt;Architecture:&lt;/b&gt; Nodes communicate over the primary &lt;a href="https://cloud.google.com/vpc/docs/vpc"&gt;Virtual Private Cloud (VPC)&lt;/a&gt; network using the &lt;a href="https://cloud.google.com/compute/docs/networking/using-gvnic"&gt;Google Virtual NIC (gVNIC)&lt;/a&gt; over standard TCP/IP.&lt;/li&gt;&lt;li data-block-key="qrc9"&gt;&lt;b&gt;Workload fit:&lt;/b&gt; Provides straightforward portability across Google Cloud compute environments, supporting distributed data preprocessing, decoupled pipeline stages, independent inference replicas, and computer vision workloads using standard VPC routing and network policies.&lt;/li&gt;&lt;/ul&gt;&lt;h3 data-block-key="1h2el"&gt;&lt;b&gt;Accelerated GPU Networking (TCPX/TCPXO and RoCEv2)&lt;/b&gt;&lt;/h3&gt;&lt;p data-block-key="cg8on"&gt;Distributed training and multi-node inference require specialized multi-rail network fabrics to handle massive parameter exchanges and collective communications.&lt;/p&gt;&lt;p data-block-key="62qt2"&gt;&lt;b&gt;GPUDirect-TCPX and TCPXO Fabrics&lt;/b&gt;&lt;/p&gt;&lt;ul&gt;&lt;li data-block-key="8c575"&gt;&lt;b&gt;Supported accelerators&lt;/b&gt;: NVIDIA H100 (&lt;a href="https://docs.cloud.google.com/compute/docs/accelerator-optimized-machines#a3-high-vms"&gt;A3 High VMs&lt;/a&gt; with 4 rails) and NVIDIA H100 Mega (&lt;a href="https://docs.cloud.google.com/compute/docs/accelerator-optimized-machines#a3-mega-vms"&gt;A3 Mega VMs&lt;/a&gt; with 8 rails).&lt;/li&gt;&lt;li data-block-key="1ipe4"&gt;&lt;b&gt;Architecture:&lt;/b&gt; Uses custom &lt;a href="https://docs.cloud.google.com/compute/docs/gpus/gpudirect#a3-high-and-a3-edge"&gt;GPUDirect-TCPX&lt;/a&gt; (4 dedicated VPCs) and &lt;a href="https://docs.cloud.google.com/compute/docs/gpus/gpudirect#a3-mega"&gt;GPUDirect-TCPXO&lt;/a&gt; (8 dedicated VPCs) offload engines to achieve high-throughput multi-rail GPU communication over standard Ethernet infrastructure without requiring native RDMA hardware.&lt;/li&gt;&lt;li data-block-key="22e9k"&gt;&lt;b&gt;Deployment blueprints:&lt;/b&gt; These multi-VPC topologies can be deployed in many ways including using pre-built blueprints from the &lt;a href="https://docs.cloud.google.com/cluster-toolkit/docs/setup/cluster-blueprint"&gt;Cluster Toolkit&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;p data-block-key="3fe9a"&gt;&lt;b&gt;RoCEv2 Fabrics (VM and Bare Metal)&lt;/b&gt;&lt;/p&gt;&lt;ul&gt;&lt;li data-block-key="57rtk"&gt;&lt;b&gt;Supported accelerators&lt;/b&gt;: NVIDIA H200 (&lt;a href="https://docs.cloud.google.com/compute/docs/gpus#h200-gpus"&gt;A3 Ultra VMs&lt;/a&gt;), NVIDIA B200 (&lt;a href="https://docs.cloud.google.com/compute/docs/gpus#b200-gpus"&gt;A4 VMs&lt;/a&gt;), NVIDIA GB200 NVL72 (&lt;a href="https://docs.cloud.google.com/compute/docs/gpus#gb200-gpus"&gt;A4X VMs&lt;/a&gt;), and NVIDIA GB300 (&lt;a href="https://docs.cloud.google.com/compute/docs/gpus#gb300-gpus"&gt;A4X Max Bare Metal&lt;/a&gt;).&lt;/li&gt;&lt;li data-block-key="3bcf8"&gt;&lt;b&gt;Zonal network profiles:&lt;/b&gt; RoCEv2 operates over a dedicated RDMA VPC attached to a specialized zonal network profile: VM instances (A3 Ultra, A4, A4X) use the &lt;a href="https://docs.cloud.google.com/vpc/docs/rdma-network-profiles#roce-supported-features"&gt;ZONE-vpc-roce&lt;/a&gt; profile, while Bare Metal instances (such as A4X Max) utilize the dedicated &lt;a href="https://docs.cloud.google.com/vpc/docs/rdma-network-profiles#roce-metal-supported-features"&gt;ZONE-vpc-roce-metal&lt;/a&gt; bare-metal profile.&lt;/li&gt;&lt;li data-block-key="5sks7"&gt;&lt;b&gt;Rail-aligned fabrics:&lt;/b&gt; This dedicated VPC is isolated strictly for GPU communication and contains subnets mapped directly to the accelerator NICs. The backend is rail-aligned, with support for Jumbo Frames (&lt;a href="https://cloud.google.com/vpc/docs/mtu"&gt;MTU 8896&lt;/a&gt;), delivering non-blocking multi-terabit bandwidth with minimal cross-rail interference.&lt;/li&gt;&lt;li data-block-key="7ifut"&gt;&lt;b&gt;Automated plumbing with GKE&lt;/b&gt; &lt;a href="https://docs.cloud.google.com/kubernetes-engine/docs/how-to/allocate-network-resources-dra"&gt;&lt;b&gt;Dynamic Resource Allocation Network (DRANET)&lt;/b&gt;&lt;/a&gt;: When deploying these GPUs on GKE, the GKE managed DRANET can be used to automatically provision additional networks and assign drivers that map the RDMA network interfaces to the GPU. These can then be assigned and consumed directly in your workload pods using standard Kubernetes resource claims.&lt;/li&gt;&lt;li data-block-key="2eg66"&gt;&lt;b&gt;Turnkey deployment&lt;/b&gt;: You can deploy this entire end-to-end stack—including RDMA VPCs, MTU tuning, and DRA drivers—using automated blueprints from the &lt;a href="https://cloud.google.com/cluster-toolkit/docs/overview"&gt;Cluster Toolkit&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;h3 data-block-key="4h9mf"&gt;&lt;b&gt;TPU Networking&lt;/b&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li data-block-key="2ep8f"&gt;&lt;b&gt;Supported accelerators&lt;/b&gt;: &lt;a href="https://cloud.google.com/tpu/docs/v4"&gt;Cloud TPU v4&lt;/a&gt;, &lt;a href="https://cloud.google.com/tpu/docs/v5p"&gt;Cloud TPU v5p&lt;/a&gt;, &lt;a href="https://cloud.google.com/tpu/docs/v5e"&gt;Cloud TPU v5e&lt;/a&gt; (multi-host Pod slices), &lt;a href="https://cloud.google.com/tpu/docs/v6e"&gt;Cloud TPU v6e&lt;/a&gt; (Trillium), and &lt;a href="https://docs.cloud.google.com/tpu/docs/tpu7x"&gt;TPU7x&lt;/a&gt; (Ironwood).&lt;/li&gt;&lt;li data-block-key="6hk6v"&gt;&lt;b&gt;Inter-chip interconnect (ICI)&lt;/b&gt;: Inside a TPU Pod or slice, chips communicate directly over dedicated, ultra-low-latency optical links organized in 2D or 3D torus meshes, bypassing traditional network stacks entirely.&lt;/li&gt;&lt;li data-block-key="dabji"&gt;&lt;b&gt;Optical circuit switches&lt;/b&gt; (OCS): In TPU v4 and TPU v5p SuperPods, software-reconfigurable OCS units dynamically change physical network topologies, route around faulty trays, and provision custom-sized accelerator slices without manual recabling.&lt;/li&gt;&lt;li data-block-key="2cpgc"&gt;&lt;b&gt;Multi-NIC architecture&lt;/b&gt; (TPU v6e and Higher): While earlier TPU generations relied on ICI within a slice and single-NIC for host traffic, Cloud TPU v6e (Trillium) and TPU7x introduce a native multi-NIC architecture where worker nodes isolate standard Kubernetes management traffic onto a primary VPC while using secondary dedicated VPCs configured for high-throughput TPU data and cross-slice communication.&lt;/li&gt;&lt;li data-block-key="93dce"&gt;&lt;a href="https://docs.cloud.google.com/kubernetes-engine/docs/how-to/allocate-network-resources-dra#use-non-rdma-interfaces-tpu"&gt;&lt;b&gt;DRANET for TPU&lt;/b&gt;&lt;/a&gt;&lt;b&gt; deployments&lt;/b&gt;: When deploying these TPUs on GKE, the GKE managed DRANET can be used to automatically provision additional networks and assign drivers for TPU communication. These can then be assigned and consumed directly in your workload pods using standard Kubernetes resource claims.&lt;/li&gt;&lt;li data-block-key="6v7ae"&gt;&lt;b&gt;Data-center network (DCN) Multislice&lt;/b&gt;: For models scaling beyond an individual TPU slice, &lt;a href="https://docs.cloud.google.com/tpu/docs/multislice-introduction"&gt;Cloud TPU Multislice&lt;/a&gt; connects multiple independent ICI meshes over Google's high-speed Jupiter Data Center Network utilizing these dedicated multi-NIC paths.&lt;/li&gt;&lt;/ul&gt;&lt;h3 data-block-key="bsskn"&gt;&lt;b&gt;Cloud Run&lt;/b&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li data-block-key="7kmlq"&gt;&lt;b&gt;Supported accelerators:&lt;/b&gt; NVIDIA L4 (G2 series) and NVIDIA RTX PRO 6000 (Blackwell) on &lt;a href="https://cloud.google.com/run/docs/configuring/services/gpu"&gt;Cloud Run GPU services&lt;/a&gt;.&lt;/li&gt;&lt;li data-block-key="2npad"&gt;&lt;b&gt;Direct VPC egress&lt;/b&gt;: Binds serverless containers directly to your private VPC network using sub-minute IP allocation via &lt;a href="https://cloud.google.com/run/docs/configuring/vpc-direct-vpc"&gt;Direct VPC Egress&lt;/a&gt;, enabling secure, low-latency access to internal data lakes, databases, and private APIs without traversing the public internet or requiring legacy connector VMs.&lt;br/&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/how-google-cloud-networking-supports-your-.max-1000x1000.jpg"
        
          alt="how-google-cloud-networking-supports-your-fluid-compute-choices-networks"&gt;
        
        &lt;/a&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;h2 data-block-key="1cnbu"&gt;&lt;b&gt;Summary&lt;/b&gt;&lt;/h2&gt;&lt;p data-block-key="3oqnr"&gt;Google Cloud networking options support various accelerator types. When using fluid compute you can adjust your network setup to support the best design to optimise your workloads performance.&lt;/p&gt;&lt;h2 data-block-key="8sopm"&gt;&lt;b&gt;Next Steps&lt;/b&gt;&lt;/h2&gt;&lt;p data-block-key="f0grd"&gt;Take a deeper dive into Google Cloud AI infrastructure and networking architectures with these resources:&lt;/p&gt;&lt;ul&gt;&lt;li data-block-key="d4450"&gt;Blog: &lt;a href="https://cloud.google.com/blog/topics/ai-infrastructure/best-practices-for-dynamic-capacity-management?e=48754805"&gt;Dynamic capacity management for AI infrastructure&lt;/a&gt;&lt;/li&gt;&lt;li data-block-key="a7eab"&gt;Tutorial: &lt;a href="https://discuss.google.dev/t/how-to-build-an-elastic-scalable-llm-inference-platform-on-gke-using-fluid-compute/388108" target="_blank"&gt;How to build an elastic, scalable LLM Inference Platform on GKE using Fluid Compute&lt;/a&gt;&lt;/li&gt;&lt;li data-block-key="9rt2j"&gt;Blog: &lt;a href="https://cloud.google.com/blog/products/networking/how-google-cloud-networking-supports-your-ai-workloads"&gt;How Google Cloud Networking Supports Your AI Workloads&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p data-block-key="8ir6m"&gt;Want to ask a question, find out more, or share a thought? Please connect with me on &lt;a href="https://www.linkedin.com/in/ammett/" target="_blank"&gt;LinkedIn&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;</description><pubDate>Thu, 24 Sep 2026 13:00:00 +0000</pubDate><guid>https://cloud.google.com/blog/topics/developers-practitioners/how-google-cloud-networking-supports-your-fluid-compute-choices-for-ai-workloads/</guid><category>Networking</category><category>Developers &amp; Practitioners</category><media:content height="540" url="https://storage.googleapis.com/gweb-cloudblog-publish/images/how-google-cloud-networking-supports-your-fl.max-600x600_VSTWN6E.png" width="540"></media:content><og xmlns:og="http://ogp.me/ns#"><type>article</type><title>How Google Cloud Networking Supports Your Fluid Compute Choices for AI Workloads</title><description></description><image>https://storage.googleapis.com/gweb-cloudblog-publish/images/how-google-cloud-networking-supports-your-fl.max-600x600_VSTWN6E.png</image><site_name>Google</site_name><url>https://cloud.google.com/blog/topics/developers-practitioners/how-google-cloud-networking-supports-your-fluid-compute-choices-for-ai-workloads/</url></og><author xmlns:author="http://www.w3.org/2005/Atom"><name>Ammett Williams</name><title>Developer Relations Engineer</title><department></department><company></company></author></item><item><title>A guide to speeding up your video processing with AlphaEvolve</title><link>https://cloud.google.com/blog/topics/developers-practitioners/how-to-speed-up-your-video-processing-with-alphaevolve/</link><description>&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;In real-time streaming, every millisecond counts. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;For example, at 30 frames per second (fps), developers have a strict frame budget of just 33.3 ms (and only 16.6 ms at 60 fps) to ingest camera frames, run neural segmentation, apply shaders, and composite output. Exceeding that budget by even a fraction of a millisecond leads to dropped frames and stuttering. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Manual optimization is notoriously tedious — requiring weeks of analyzing flame graphs and hand-tuning low-level code in Swift, C++, or Metal. While standard AI coding assistants can generate boilerplate, they can’t optimize  against target hardware, benchmark real-world latency, or ensure optimizations preserve visual fidelity.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Autonomous, closed-loop evolutionary optimization changes this paradigm. Tools like&lt;/span&gt; &lt;a href="https://cloud.google.com/blog/products/ai-machine-learning/alphaevolve-is-available-for-everyone?e=0&amp;amp;utm_source=gemini"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;AlphaEvolve&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; pair cloud-scale model reasoning with local hardware execution, and we’re already seeing real-world impact. In partnership with Google,&lt;/span&gt; &lt;a href="https://www.doit.com/about?utm_source=gemini" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;DoIt&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; used AlphaEvolve to autonomously optimize production Swift code in a live macOS streaming app, uncovering performance headroom that manual profiling missed (read the full&lt;/span&gt;&lt;a href="https://medium.com/google-cloud/running-alphaevolve-on-your-own-code-f8aeebceb4d0?utm_source=gemini" rel="noopener" target="_blank"&gt;&lt;span style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;technical writeup&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;).&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;While this post focuses on video pipelines, the split-loop pattern applies anywhere performance matters — from microservice throughput and database queries to ML tensor pipelines and embedded systems. In every case, the formula is the same: pair Gemini code generation in the cloud with your domain-specific benchmark harness and automated quality gates.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Today, we’ll show you how to use AlphaEvolve to speed up video processing—and apply these principles to your own performance bottlenecks:&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Understanding the split-loop architecture: &lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;How AlphaEvolve decouples managed cloud generation (Gemini model ensemble on Google Cloud) from local evaluation (e.g. compiling and timing native Swift/Metal code).&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Evaluator craft and quality gates:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; How to construct scoring functions using metrics like Structural Similarity Index (SSIM) to prevent evolutionary loops from gaming the benchmark (e.g., skipping rendering entirely to go fast).&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Autonomous algorithmic discovery:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; How Gemini-driven evolutionary search can autonomously discover unprompted framework APIs and make intelligent engineering trade-offs (e.g., frame-caching limits).&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Setting realistic performance boundaries: &lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;How to measure code optimization against physical hardware floors.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;1. Understanding AlphaEvolve’s split-loop architecture &lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;AlphaEvolve runs a closed-loop evolutionary process: given a seed program and a custom scoring function, a mixture of Gemini models proposes code variations, executes the scoring function against each candidate, keeps the highest-performing code, and iteratively climbs toward an optimal solution over multiple generations.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/1_OsAwmXL.max-1000x1000.jpg"
        
          alt="1"&gt;
        
        &lt;/a&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;A core architectural advantage of AlphaEvolve is its clean separation into two halves:&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;The generation half (Google Cloud managed service):&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Contains the prompt sampler, Gemini model ensemble, and program database. Google Cloud handles the scale, prompt orchestration, and generation mechanics.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;The evaluation half (customer managed compute):&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Scoring code quality is strictly domain-specific. You own the evaluator module entirely, running it on your own hardware or target architecture (in this case, macOS running native Swift code).&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;While AlphaEvolve is Python-first on the cloud generation side, evaluation can be written in any language. The custom evaluator compiles each Swift candidate using swift and executes it against a standard reference webcam clip.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;2. Evaluator craft and quality gates&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;An automated optimization loop like AlphaEvolve never actually "sees" your video stream. It only sees the numeric fitness score your evaluator returns. If your evaluation metric has a blind spot, evolutionary code generation will aggressively exploit it.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;In our early runs, a naive fitness score weighted toward raw latency produced an astonishing speedup: the model simply bypassed blur rendering entirely and returned unmodified frames in 0 ms.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Structural Similarity Index Measure (SSIM)&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;To prevent the model from gaming your benchmark, try building a two-tiered scoring function that pairs throughput with structural fidelity metrics like &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Structural Similarity Index (SSIM)&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;speedup = baseline_ms_per_frame / candidate_ms_per_frame\r\nssim    = mean_ssim_vs_golden\r\n\r\n#Disqualify any candidate falling below visual threshold\r\n\r\n\r\nif ssim &amp;lt; 0.98 or worst_frame_ssim &amp;lt; 0.95:\r\n    return {&amp;quot;speedup&amp;quot;: -1e12}   # Disqualified\r\n\r\nreturn {&amp;quot;speedup&amp;quot;: speedup, &amp;quot;ssim&amp;quot;: ssim}&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe690fa4dd0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;What does this give you?&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;The ability to test against worst-case clips:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Never benchmark on static frames or blank cameras. Candidate code can easily pass an average SSIM gate on static backgrounds while failing completely during quick head turns.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;You can track the minimum, not just the mean:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Enforce both an average threshold and a per-frame floor to catch dropped frames or delayed mask updates.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;Autonomous algorithmic discovery:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Most developers use generative AI for local micro-optimizations (e.g., inlining helper functions, unrolling loops, or tweaking memory pools). But when given architectural room, the evolutionary loop can discover systemic optimizations on its own.&lt;/span&gt;&lt;/p&gt;
&lt;h4&gt;&lt;strong style="vertical-align: baseline;"&gt;Engineering lessons:&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Provide framework context, not isolated loops:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Include public SDK headers, interface definitions, or API reference symbols in the prompt or retrieval harness. An LLM cannot adopt a sequence-aware subsystem if its context window only contains an isolated frame-processing callback.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Expose multi-frame lifecycle hooks:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Let your candidate code maintain a bounded state across executions (e.g., historical masks or cache timestamps) rather than enforcing pure, stateless functions.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Let quality gates police the trade-offs:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; When AlphaEvolve introduced temporal mask caching, it initially cached masks too aggressively, causing noticeable trailing artifacts. Because our SSIM gate penalized drift during motion, the search converged on a production-ready cache window without manual parameter tuning.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;Setting realistic performance boundaries&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;A common pitfall in performance engineering is optimizing in the dark. If you achieve a 2x speedup, is that an incredible achievement, or did you leave another 3x on the table?&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;In real-time media, total frame time splits into two distinct categories:&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Mutable software overhead:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Memory allocations, buffer format conversions, thread context switches, and API dispatch friction.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Immutable hardware floors:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Raw Neural Engine inference latency, GPU shader compute time, and hardware display synchronization.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;To make the most of AlphaEvolve, developers should measure against theoretical maximum headroom&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Before running optimization loops, here’s a few principles to keep in mind: &lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Build a "no-op" pipeline:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Strip out Swift/C++ orchestration, data marshalling, and frame conversions. Dispatch only the pre-warmed ML model and bare GPU pass on a dummy buffer. The resulting time is your physical hardware lower bound.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Calculate your addressable ceiling:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Your total possible optimization potential is:&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/original_images/2_u73NadS.jpg"
        
          alt="2"&gt;
        
        &lt;/a&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;3. &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Score against the hardware gap:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Instead of arbitrary speedup multiples, measure optimization efficiency:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/3_Y7cUASN.max-1000x1000.jpg"
        
          alt="3"&gt;
        
        &lt;/a&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Get started &lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;All benchmark code, test clips, evaluation scripts, and raw candidate logs are open source:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;GitHub repository:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;a href="https://github.com/SaschaHeyer/gen-ai-livestream/tree/main/alphaevolve/examples/camera-background-blur" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;AlphaEvolve Camera Background Blur Example&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Detailed technical write-up of our case study with DoIt:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;a href="https://medium.com/google-cloud/running-alphaevolve-on-your-own-code-f8aeebceb4d0" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Running AlphaEvolve on Your Own Code&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;</description><pubDate>Wed, 23 Sep 2026 16:00:00 +0000</pubDate><guid>https://cloud.google.com/blog/topics/developers-practitioners/how-to-speed-up-your-video-processing-with-alphaevolve/</guid><category>Developers &amp; Practitioners</category><og xmlns:og="http://ogp.me/ns#"><type>article</type><title>A guide to speeding up your video processing with AlphaEvolve</title><description></description><site_name>Google</site_name><url>https://cloud.google.com/blog/topics/developers-practitioners/how-to-speed-up-your-video-processing-with-alphaevolve/</url></og><author xmlns:author="http://www.w3.org/2005/Atom"><name>Anant Nawalgaria</name><title>Group AI Product Manager &amp; Engineer, Google</title><department></department><company></company></author><author xmlns:author="http://www.w3.org/2005/Atom"><name>Sascha Heyer</name><title>Principal AI Lead, DoIt</title><department></department><company></company></author></item><item><title>The DevFest Community Workshop Experience: Building Real Agents Together</title><link>https://cloud.google.com/blog/topics/developers-practitioners/the-devfest-community-workshop-experience-building-real-agents-together/</link><description>&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;This week we kicked off the DevFest season in North America at Google Hudson Square in New York City with 80 engineers packed into the room. Typical technical workshops hand you a finished repo, tell you to blindly paste blocks of code into your terminal, and hope nothing crashes. You walk away with green checkmarks, but your brain stays on autopilot.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;We've introduced a completely different experience called &lt;/span&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;Workbench&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Workbench focuses on understanding core ideas and architectural models rather than obsessing over syntax and code snippets. Instead of getting bogged down in boilerplate, engineers spent the day grappling with the actual mental models behind graph engineering, self-evolving architectures, and automated self-patching harnesses.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;A glimpse into the Workshop Experience&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;At the DevFest Community Workshop, we spent one intense day building long-running, self-evolving multi-agent systems powered by Google's agentic stack. Ricky Robinett, Senior Director of Developer Marketing, kicked off the day by diagnosing why so many engineering teams hit a wall with agents. Ricky broke down why prompt engineering fails as a safety mechanism: English is just a probabilistic suggestion, not an execution boundary. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Right after Ricky, Rachel Francois, Google Developer Groups (GDG) North America Program Lead, took the stage alongside GDG Brooklyn organizers to welcome the community and spotlight the power of local developer chapters. They set the tone for the entire day, reminding everyone that building durable software works best as a team sport where engineers share real-world patterns and build local networks that outlast any single framework.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Getting hands on with labs&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Annie Wang &amp;amp; Christina Lin, Americas DevRel Team members, led the morning lab that put those runtime ideas to work. Attendees explored Google's Agent Development Kit (ADK), Veo 3.1, Memory Bank on Gemini Enterprise Agent Platform, and RAG Engine on Gemini Enterprise Agent Platform. Through Workbench, developers grasped the principle of separating state from active compute for long running tasks. Workflows paused cleanly mid-execution, waited out asynchronous human approvals, and resumed without running up idle compute costs.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;After lunch, Logan Hennessy, Americas Developer Relations Engineer (DRE), and Kartik Derasari, Google Developer Expert (GDE), led a lab using auction history as insight for better bidding strategy. Attendees worked through the architecture by integrating BigQuery data into autonomous data engineering pipelines, reasoning about deterministic bidding logic and adding eval-gated, self-patching harnesses that catch spend anomalies and update runtime execution safely.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Between lab blocks, we ran fast-paced speed quizzes where developers raced to lock in their answers as quickly as possible. Screens flashed, fingers flew across keyboards, and seconds made the difference between topping the leaderboard or dropping five spots. Nothing beats watching a room full of serious engineers completely lose their cool over a live quiz leaderboard.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span style="vertical-align: baseline;"&gt;Join a DevFest Community Workshop this fall&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;New York was only round one. We are taking this exact experience on tour to five more cities this fall. Find your city and grab your seat before spots fill up:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://rsvp.withgoogle.com/events/devfest-extended-sunnyvale" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Sunnyvale on September 30&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://rsvp.withgoogle.com/events/devfest-extended-dc" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Washington DC on October 6&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://goo.gle/devfest-extended-atlanta" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Atlanta on October 30&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; (as a part of DevFest Atlanta)&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://rsvp.withgoogle.com/events/devfest-extended-seattle" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Seattle on November 4&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://rsvp.withgoogle.com/events/devfest-extended-boston" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Boston on November 10&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;</description><pubDate>Fri, 18 Sep 2026 16:00:00 +0000</pubDate><guid>https://cloud.google.com/blog/topics/developers-practitioners/the-devfest-community-workshop-experience-building-real-agents-together/</guid><category>Developers &amp; Practitioners</category><media:content height="540" url="https://storage.googleapis.com/gweb-cloudblog-publish/images/devfest-community-workshop-experience-hero.max-600x600.png" width="540"></media:content><og xmlns:og="http://ogp.me/ns#"><type>article</type><title>The DevFest Community Workshop Experience: Building Real Agents Together</title><description></description><image>https://storage.googleapis.com/gweb-cloudblog-publish/images/devfest-community-workshop-experience-hero.max-600x600.png</image><site_name>Google</site_name><url>https://cloud.google.com/blog/topics/developers-practitioners/the-devfest-community-workshop-experience-building-real-agents-together/</url></og><author xmlns:author="http://www.w3.org/2005/Atom"><name>Christina Lin</name><title>Developer Relations Engineering Manager</title><department></department><company></company></author></item><item><title>Best practices for handling cloud reliability incidents</title><link>https://cloud.google.com/blog/topics/developers-practitioners/cloud-reliability-incident-handling-best-practices/</link><description>&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Cloud outages can range from global service disruptions to issues isolated to a specific region, zone, or even just your project, workload or application. If you suspect a Google Cloud Platform outage is impacting your services, we recommend you follow a structured “Verify→ Investigate→Report→Resolve→Review" workflow to resolve it. And before that outage occurs, you should also have &lt;/span&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;prepared&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; your environment for an eventual disruption by designing for failure, and actively practicing the steps you need to take to restore service. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;In this blog, we summarize the key reliability incident handling best practices to help you design and practice your reliability incident response capabilities and minimize impact. Rather than an exhaustive guide, this is meant as a primer on only the most important practices for advisory purposes. Please note that we do not cover additional practices specific to security incidents here. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Beyond the base steps covered here, you may want to also &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;explore how AI agents and tools are starting to transform incident handling. Check out &lt;/span&gt;&lt;a href="https://sre.google/prodcast/transcripts/sre-prodcast-04-09/" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;this episode of the Prodcast&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, where Googlers explore the latest trends of &lt;/span&gt;&lt;a href="https://sre.google/prodcast/transcripts/sre-prodcast-04-09/" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;leveraging agentic AI in Site Reliability Engineering&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; (SRE) to detect issues early and prevent disruptions. Try&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/cloud-assist/investigations"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Cloud Assist investigations&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, or explore &lt;/span&gt;&lt;a href="https://github.com/google/skills" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Agent Skills&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; and &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/mcp/supported-products"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;remote managed MCP servers&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; to give you another set of tools for quickly pinpointing an issue. Before getting into these advanced techniques, we focus below on the foundational steps to good incident handling.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;1. Prepare&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Long before things start to go sideways, you should have spent significant time preparing for an outage along at least four dimensions: design, data, playbooks and training.&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Design&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: Think ahead and mitigate future incidents by designing automated response actions, like a load balancer shifting traffic away from slow or unresponsive instances, or by automating as much of your incident response playbook as possible. Review &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/architecture/framework"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;designs&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; of all critical applications to automate as many actions as possible to accelerate response and recovery.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Data&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: When a disruption occurs, having meaningful data at your fingertips vastly improves response capabilities. Use &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/logging/docs/overview"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Cloud Logging&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/trace/docs"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Cloud Trace&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; and &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/monitoring/docs/monitoring-overview"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Cloud Monitoring&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, or other third-party observability tools, and replicate that data to a redundant stack in a separate location from the systems being observed. Make sure, in advance of any incident, that time stamps are synced across your observability streams for easy correlation, or know how to do that on-demand during an outage, when time is of the essence.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Playbook&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: A well-thought-out playbook documenting your incident response processes, including crystal clear role and responsibility definitions for all personas, is paramount to efficient incident response. Who is responsible to do what? Who needs to be notified or mobilized for each type of disruption? How can they be reached? What tools and data are available? How are results communicated? How do teams hand over to the next shift during long running incidents? etc. Conduct a simulated incident response and critically review every step to find where your playbook needs clarification. Without clear responsibilities, mitigation inevitably takes longer.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Training&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: Hopefully, service disruptions are rare events. To ensure your staff knows and remembers how to react, they need to retrain on the process several times per year&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; by running simulated cross-team incident response drills. A retrospective&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; on the simulated exercise will help identify warranted improvements.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;2. Verify&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Despite your best efforts, sooner or later, a service disruption will occur, which you can detect via any number of mechanisms:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Observability tools (&lt;/span&gt;&lt;a href="https://docs.cloud.google.com/docs/observability"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Google tools&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; or third-party tools)&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://docs.cloud.google.com/unified-maintenance/docs/overview?_gl=1*1028q22*_ga*ODU2MjY4NzUyLjE3NzM0MTg2Mjk.*_ga_WH2QY8WWF5*czE3NzM2ODQ4MTckbzQkZzEkdDE3NzM2ODUwMjUkajEyJGwwJGgw"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Unified Maintenance Management&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; notifications for planned maintenance&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://www.google.com/search?q=https://console.cloud.google.com/service-health"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Personalized Service Health&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; notifications managed with alert policies&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Proactive customer monitoring by Google&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Now, you need to determine what broke and who should ultimately fix the problem:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Google, e.g., a bug, code roll-out, hardware failure, etc.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;You, e.g., a configuration change, elevated load, quota ceiling, etc.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Third party, e.g., a directory hosted by a different cloud provider&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;If Google has declared an incident and started working to fix the problem, estimate whether you can possibly reestablish service sooner, for example by failing over to a secondary stack (see the ‘Typical Causes’ table below). You can determine whether Google has declared an incident and will provide a fix by consulting:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://cloud.google.com/service-health"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Personalized Service Health&lt;/strong&gt;&lt;/a&gt;&lt;strong style="vertical-align: baseline;"&gt;:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Check this first.&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Personalized Service Health shows incidents specifically relevant to your projects and regions, distinguishing between incident types:. &lt;/span&gt;&lt;/p&gt;
&lt;ul style="list-style-type: circle;"&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Emerging Incidents: Google has received an alert, on-callers are investigating, impact is yet unknown&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Confirmed Incidents: Google has investigated and found customers are impacted&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Located within the Google Cloud console, Personalized Service Health often displays limited-scope incidents that don't appear on the public dashboard. Personalized Service Health also offers a mobile client for Android and iOS smartphones, assuming you can use your work ID and credentials on the phone.&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://g.co/kgs/j2BVWVE" rel="noopener" target="_blank"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Gemini Cloud Assist&lt;/strong&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, which is &lt;/span&gt;&lt;a href="https://cloud.google.com/blog/products/devops-sre/gemini-cloud-assist-integrated-with-personalized-service-health?e=4875480"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;integrated with Personalized Service Health&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, so you can use it to query that information in natural language.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://status.cloud.google.com/"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Cloud Service Health dashboard&lt;/strong&gt;&lt;/a&gt;&lt;strong style="vertical-align: baseline;"&gt;:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; This is the public-facing non-authenticated web page for broad, severe incidents affecting many customers. Limited blast radius disruptions are &lt;/span&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;not&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; externalized to the public. All its content is available in Personalized Service Health as well. If ever Personalized Service Health goes down, Cloud Service Health serves as an alternative channel built on a separate infrastructure.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Known Issues:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; In the console, navigate to &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Support &amp;gt; Cases&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;, view a case, and u&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;se the resource selector on the console toolbar to find the specific cloud resource you’re interested in. Then click &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Known issues&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; If your issue matches one listed here, you can link a support case to it, so you will receive automatic updates in your case record. If you don’t find a match, open a new support case. Google will automatically match the case to a related incident, as soon as one is declared.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Google declared incidents are updated as new information becomes available, so check back regularly, or set up a Personalized Service Health alert policy to be notified each time new information becomes available.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;If you host cloud resources in multiple clouds, a good practice is to check early on whether the problem occurs for multiple cloud providers. If so, the problem is likely external to the providers and caused either by you or by a third-party service that your application interacts with.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;3. Investigate&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;To determine the blast radius within your cloud footprint of Google-declared reliability incidents, first check Personalized Service Health updates for a description of the technical problem. Knowing what to look for will allow you to map your blast radius and decide on suitable contingency actions quicker.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;If Google hasn’t declared an incident, try to rule out configuration errors or issues within your environment by checking:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Cloud Monitoring:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Look for spikes in error rates (e.g. 5xx errors), increased latency, or drops in traffic in your dashboards.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Cloud Logs:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Use &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Log Explorer&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; to look for specific error messages like &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;DEADLINE_EXCEEDED&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;SERVICE_UNAVAILABLE&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;, or specific API errors.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Quotas:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Ensure you haven't hit a project quota (e.g., CPU, API rate limits), which can often mimic the behavior of an outage.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Change history:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Check your log of recently applied changes. Not all problems manifest immediately, but proximity on a timeline can be a powerful indicator of causality, even if it’s not proof. Also check whether Google rolled out any updates just before the symptoms started. See the &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/unified-maintenance/docs/overview?_gl=1*1028q22*_ga*ODU2MjY4NzUyLjE3NzM0MTg2Mjk.*_ga_WH2QY8WWF5*czE3NzM2ODQ4MTckbzQkZzEkdDE3NzM2ODUwMjUkajEyJGwwJGgw"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Unified Maintenance Management&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; interface in Cloud Hub.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Absent a clear culprit, such as a traffic spike or a DDOS attack, and if symptoms manifested immediately after rolling out a change, a good strategy is to back out that change and attempt to return to a last known good configuration. &lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;4. Report&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;If the Cloud Service Health and Personalized Service Health dashboards are green but your metrics show a failure, you must report it to Google. &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Determine priority:&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;ul&gt;
&lt;li aria-level="2" style="list-style-type: circle; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;P1 (Critical):&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Your production service is unusable or severely impacted with no workaround.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="2" style="list-style-type: circle; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;P2 (High):&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Significant impact or degradation, but a workaround may exist.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="2" style="list-style-type: circle; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;See &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/support/docs/best-practices#setting_the_priority_and_escalating"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;guidance on setting priority&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; and &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/support/docs/best-practices#describing_your_issue"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;guidance on describing your issue&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;File a case:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Go to &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Support &amp;gt; Cases &amp;gt; Create Case&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; in the console.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;ul&gt;
&lt;li aria-level="2" style="list-style-type: circle; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Explain&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; quantifiable business impact to rationalize the submitted priority and prevent it from being reset when Cloud Support prioritizes cases. A clear and accurate rationale helps!&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Essential information to include:&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;ul&gt;
&lt;li aria-level="2" style="list-style-type: circle; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Project ID&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; and affected &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;region/zone&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="2" style="list-style-type: circle; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Timestamps&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; (when it started and if it's ongoing) with a clearly labeled timezone&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="2" style="list-style-type: circle; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Specific error messages&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; or log snippets&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="2" style="list-style-type: circle; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Scope:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Is it affecting all users/systems, or a specific subset/location?&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;h4&gt;&lt;span style="vertical-align: baseline;"&gt;Escalation for Premium/Enhanced support&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;If you have a &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Premium&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; or &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Enhanced&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; support plan and a P1 case is not receiving the attention it requires, use the &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/support/docs/best-practices#escalating"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Escalate&lt;/strong&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; button within the support case in the console. This alerts a support manager to investigate and rectify the situation.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;5. Resolve&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;By taking these steps, you are well on your way to resolving the outage. In the meantime, here are some ways to mitigate the impact of the outage and communicate with impacted stakeholders.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;While waiting for a resolution:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Communicate:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Notify your stakeholders and customers. Transparency helps manage expectations and reduces duplicate internal reports.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Fail over:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; If you have a multi-regional architecture, consider shifting traffic to a healthy region. As a best practice, first &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;ensure that the disruption is at the infrastructure level and not at your workload level.&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Check for workarounds:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; While working on a permanent fix, Google often posts temporary workarounds in the Service Health Dashboard updates, or in Personalized Service Health updates.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Consider your regulatory reporting requirements&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: Know whether your organization is subject to regulatory reporting requirements, and what the required deadlines are for both initial and follow-up reporting. Google Cloud prepares Incident Reports for incidents that meet certain criteria — see details &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/service-health/docs/get-incident-reports"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;here&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; for how to get those reports. Premium Support customers can also request an Incident Summary, which is an Incident Report customized to your account’s specific hosting location, time stamps, etc.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;&lt;span style="vertical-align: baseline;"&gt;De-escalation and closure&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Once systems are stable, Google downgrades the severity levels and deactivates the active on-call escalation chain. Google only closes an incident in Personalized Service Health when it has taken all the mitigation steps covering all impacted customers. Your specific services might be restored sooner than the incident closure time, if other customers are restored later than you. The incident is officially closed on the Google Cloud Status Dashboard when systems have run stably for a designated auto-close duration. Verify that your services are operating normally at this point. And if your incident responders aren’t compensated for extra time spent on the incident, find a way to thank them.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;6. Review&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;After the problem has been fixed and operations have returned to a normal, steady state, it’s time to conduct a &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/architecture/framework/reliability/conduct-postmortems"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;post-mortem analysis&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; to identify how your team can respond better in future service disruptions. A “blameless” approach is essential to surfacing meaningful and impactful improvements that can be made to your incident response process. Ask questions like:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;What went well?&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;What could we have done better?&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Where did we get lucky?&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Where did we get unlucky?&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Then decide what changes can be made to improve your playbook, tools and training.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;At Google, we often publish a &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;post-mortem&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; or &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Incident Report&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; for major outages, available via Personalized Service Health. Review this to understand the root cause and adjust your own disaster recovery plans to prevent or reduce future impact. Customers with a Premium Support plan can request an &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Incident Summary&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; for a Google-caused incident they were impacted by and for which they opened a P1 case. An Incident Summary is an Incident Report customized for &lt;/span&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;your&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; environment (e.g., start and end times of impact).&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;Typical causes, comms and prevention strategies&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;To help you prepare and plan ahead, here’s an overview of some typical incidents based&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; on the symptoms reported in Cloud Service Health and Personalized Service Health along with guidance on what Google communications to expect, and some generic mitigation or prevention strategies you can build into your playbooks.&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div align="left"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;&lt;table&gt;&lt;colgroup&gt;&lt;col/&gt;&lt;col/&gt;&lt;col/&gt;&lt;col/&gt;&lt;/colgroup&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Blast radius&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Typical cause&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Comms&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Strategy&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Single zone or region.&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;Subset of products.&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Typical of a software problem triggered by a rollout. Learning points:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;- Understand the location scope (zones and regions) of your workload&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;- Products can depend on other products&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Major incidents are communicated via Cloud Service Health.&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;Major and Minor (by number of customers, not severity) incidents are communicated via Personalized Service Health.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Highly localized incidents are not communicated via Cloud Service Health or Personalized Service Health.&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Fail over, if so configured, but verify the health of the secondary stack first.&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Single zone.&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;Most or all products.&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Typical of a power or cooling issue.&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Check Cloud Service Health and Personalized Service Health.&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Fail over to a different zone, if so configured.&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Single region.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Most or all products.&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Typical of a backbone networking infrastructure issue &lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Check Cloud Service Health and Personalized Service Health.&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Fail over to a different region, if so configured.&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Control plane issue for a product&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Typical of a late detected issue&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Communicated via Personalized Service Health if significant customer impact is verified.&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Look for workarounds. Wait for Google to fix. Fail over, if so configured.&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Multi-regional issue with a global product&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Rare but possible, typically detected quickly. Learnings: Mitigation options can be limited. Try regional variants, alternative products with similar functionality&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Check Cloud Service Health and Personalized Service Health.&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Wait for Google to fix. In the meantime, verify via Google Comms and your own investigation that this is truly Google’s problem to fix.&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Capacity / Stockout issue&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;System-level demand exceeding capacity in the product/location/model. (Cloud is designed to scale, but limits always exist, so proper planning is advised)&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Error message. No incident will be declared.&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Place reservations for predicted capacity needs (if cost is acceptable). Flexibility in zone placement can also help.&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Quota exhaustion&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Difficult / inaccurate prediction of traffic&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Error message. No incident will be declared.&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Review consumption trends against ceiling regularly.&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;Go deeper&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;This document offers only a condensed summary of key points. If you have an active Premium Support contract with Google Cloud, reach out to your account team for a deeper review of your response plans. For a comprehensive treatise on how to build reliable services and how to respond to incidents, we strongly recommend Google’s &lt;/span&gt;&lt;a href="https://sre.google/sre-book/table-of-contents/" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;SRE Book&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, which is available as a free download. A new version of the SRE book is releasing ~Oct 2026 and will be available for purchase on O’Reilly Media. We’re also working on a future primer that explores AI-supported incident handling in-depth — stay tuned!&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;</description><pubDate>Tue, 15 Sep 2026 16:00:00 +0000</pubDate><guid>https://cloud.google.com/blog/topics/developers-practitioners/cloud-reliability-incident-handling-best-practices/</guid><category>DevOps &amp; SRE</category><category>Management Tools</category><category>Google Cloud Consulting</category><category>Developers &amp; Practitioners</category><media:content height="540" url="https://storage.googleapis.com/gweb-cloudblog-publish/images/sre.max-600x600.jpg" width="540"></media:content><og xmlns:og="http://ogp.me/ns#"><type>article</type><title>Best practices for handling cloud reliability incidents</title><description></description><image>https://storage.googleapis.com/gweb-cloudblog-publish/images/sre.max-600x600.jpg</image><site_name>Google</site_name><url>https://cloud.google.com/blog/topics/developers-practitioners/cloud-reliability-incident-handling-best-practices/</url></og><author xmlns:author="http://www.w3.org/2005/Atom"><name>Flemming Christensen</name><title>Product Manager &amp; Technical Solutions Engineer, Google Cloud</title><department></department><company></company></author></item><item><title>Introducing the Google Cloud Developer Plugin for AI Coding Agents</title><link>https://cloud.google.com/blog/topics/developers-practitioners/introducing-the-google-cloud-developer-plugin-for-ai-coding-agents/</link><description>&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Agent skills fit well alongside documentation and remote MCP servers as ways of enabling the success of your AI workflows. They reduce context window usage for certain use cases, and they're straightforward to install. However, you might have noticed that managing individual skills can be unwieldy, or that some skills are most useful when they act alongside other skills or MCP servers toward the same goal. That's where plugins come in to help.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Today, we're thrilled to announce a new Google Cloud plugin for AI coding agents! Designed as installable bundles, agent plugins equip the AI agent of your choice with skills and tools to be more effective on Google Cloud.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span style="vertical-align: baseline;"&gt;Solving the tool coupling problem&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;As you expand your usage of coding agents, you might find that they become significantly more capable when they use related skills in tandem or with complementary context and tooling. For example, an agent analyzing infrastructure is more effective when combining domain knowledge, workflow recommendations, and the ability to interact with a live environment together.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Plugins solve this coupling challenge by packaging related capabilities into cohesive, installable bundles. This allows you to take advantage of both broad foundational capabilities and deep, product-specific tools without managing complex dependencies. In the &lt;/span&gt;&lt;a href="https://g.dev/cloud/agent-plugins" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Google Agent Skills repository&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, you'll start to see the following for Google Cloud popping up over time:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Foundational plugins:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Essential platform-wide guidance for things like documentation discovery, project configuration, and architectural design.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Domain-focused plugins:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Specialized knowledge and best practices for technical areas in the context of Google Cloud.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;For this release, we've started with a foundational plugin that supports agent functionality for all Google Cloud users, focusing on making it easier for agents to retrieve Google Cloud-related skills, make use of official documentation, and handle programmatic interactions with Google Cloud.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span style="vertical-align: baseline;"&gt;Built on an open standard&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;We've also built our plugin in compliance with the &lt;/span&gt;&lt;a href="https://g.dev/cloud/agent-plugins-specification" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Agent Plugins specification&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, an open, vendor-neutral standard for packaging Agent Skills and Model Context Protocol (MCP) servers into portable, interoperable units. Rather than requiring developers to maintain different configurations and wrappers for every AI assistant, the Agent Plugins standard provides a unified manifest and directory structure.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Our Google Cloud plugin adopts this standard to ensure that developers across a variety of AI coding environments get consistent, high-quality access to tools that help them succeed with Google Cloud. That includes not only the plugins we talk about today, but all other plugins published to the Google Agent Skills repository as well.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Let's take a look at the flagship plugin that we've just published in the Google Agent Skills repository: &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;google-cloud-developer&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;. This plugin exists to help agents successfully navigate the fundamentals of interacting with Google Cloud: things like authentication, authorization, managing projects, and guardrails for gcloud CLI operations. This plugin also bundles configuration for the &lt;/span&gt;&lt;a href="https://g.dev/cloud/dk-mcp-connect" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Developer Knowledge MCP server&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, which gives agents up-to-date grounding in Google's official developer documentation.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Plugin in action: Project onboarding and identity authentication&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;To see how this plugin works, consider a situation where you're bootstrapping a new project as part of working on a script. With the &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;google-cloud-developer&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; plugin installed, you can prompt your agent:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;I'm brand new to this platform, and I need to get an account and a first project with billing set up. Then, I need my local machine authenticated so a script that I'm writing can call the APIs as a service identity instead of as me.&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Environment awareness:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; The agent silently runs background checks against your live environment for prerequisites like CLI availability and potential existing projects or organizations.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Review:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; The agent considers IAM best practices to avoid risks that might be assumed as part of the prompt, like accidental key leaks or git commits.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Interaction with guardrails:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; The agent outlines a workflow roadmap and offers to act on those steps before modifying any resources.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/screenshot_plugin_blog_post.max-1000x1000.png"
        
          alt="screenshot_plugin_blog_post"&gt;
        
        &lt;/a&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h2&gt;&lt;span style="vertical-align: baseline;"&gt;Installing Google Cloud plugins&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Because Google Cloud plugins are available from the open &lt;/span&gt;&lt;a href="https://g.dev/cloud/agent-plugins" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Google Agent Skills&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; repository and adhere to the standard Agent Plugins layout, adding them to your environment is straightforward. For example, here's how you'd install the &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;google-cloud-developer&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; plugin:&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Antigravity&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Install the &lt;span style="vertical-align: baseline;"&gt;Google Cloud Developer &lt;/span&gt;plugin directly from the &lt;a href="https://antigravity.google/docs/marketplace/" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Marketplace&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; in Antigravity.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;Alternatively, you can install the plugin directly using the Antigravity CLI:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;agy plugin install google-cloud-developer&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe690322890&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;Claude Code&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Add the Google plugins marketplace, then install the plugin:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;claude plugin marketplace add google/skills\r\nclaude plugin install google-cloud-developer@google-plugins&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe6903205d0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;p data-block-key="9v8as"&gt;Enable the Developer Knowledge API in your Google Cloud project by using the &lt;a href="https://docs.cloud.google.com/sdk/docs/install-sdk"&gt;gcloud CLI&lt;/a&gt;:&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;gcloud services enable developerknowledge.googleapis.com --project=&amp;lt;YOUR_PROJECT_ID&amp;gt;&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe690322a10&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;p data-block-key="9v8as"&gt;Create an API key for the Developer Knowledge API by following the instructions &lt;a href="https://developers.google.com/knowledge/quickstart#create-secure-key" target="_blank"&gt;Create and secure the API key&lt;/a&gt;. Save the key you create in a secure location.&lt;/p&gt;&lt;p data-block-key="10jks"&gt;Export the API key to your environment before starting Claude Code:&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;export DEVELOPERKNOWLEDGE_API_KEY=&amp;lt;YOUR_API_KEY&amp;gt;&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe690320310&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;strong style="vertical-align: baseline;"&gt;Note:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; The &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;DEVELOPERKNOWLEDGE_API_KEY&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; environment variable needs to be set in the environment before you start Claude Code. Consider adding this export to your shell's startup script (e.g. &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;.bashrc&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;.zshrc&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;) for convenience.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Codex CLI&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Add the Google plugins marketplace, then install the plugin:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;codex plugin marketplace add google/skills\r\ncodex plugin add google-cloud-developer@google-plugins&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe690323f10&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;p data-block-key="9v8as"&gt;Enable the Developer Knowledge API in your Google Cloud project by using the &lt;a href="https://docs.cloud.google.com/sdk/docs/install-sdk"&gt;gcloud CLI&lt;/a&gt;:&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;gcloud services enable developerknowledge.googleapis.com --project=&amp;lt;YOUR_PROJECT_ID&amp;gt;&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe690323490&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;p data-block-key="9v8as"&gt;Create an API key for the Developer Knowledge API by following the instructions &lt;a href="https://developers.google.com/knowledge/quickstart#create-secure-key" target="_blank"&gt;Create and secure the API key&lt;/a&gt;. Save the key you create in a secure location.&lt;/p&gt;&lt;p data-block-key="8ch63"&gt;Enable authenticated access to the Developer Knowledge MCP server by updating ~/.codex/config.toml (or your project's .codex/config.toml) to include the following lines:&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;[mcp_servers.developer-knowledge]\r\n  url = &amp;quot;https://developerknowledge.googleapis.com/mcp&amp;quot;\r\n  env_http_headers = { &amp;quot;X-Goog-Api-Key&amp;quot; = &amp;quot;DEVELOPERKNOWLEDGE_API_KEY&amp;quot; }&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe6903219d0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;p data-block-key="9v8as"&gt;Export the API key to your environment before starting Codex:&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;export DEVELOPERKNOWLEDGE_API_KEY=&amp;lt;YOUR_API_KEY&amp;gt;&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fe690323bd0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;strong&gt;Note&lt;/strong&gt;: The &lt;code&gt;DEVELOPERKNOWLEDGE_API_KEY&lt;/code&gt; environment variable needs to be set in the environment before you start Codex. Consider adding this export to your shell's startup script (e.g. &lt;code&gt;.bashrc&lt;/code&gt;, &lt;code&gt;.zshrc&lt;/code&gt;) for convenience.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Note:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; After performing this configuration update, a status of &lt;/span&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;not logged in&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; for the Developer Knowledge MCP server is expected and doesn't block access to the server.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span style="vertical-align: baseline;"&gt;Next Steps&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;If you're already a Google Cloud user, try the above installation steps to set up your agent for success. We think you'll like what you see! For those who want a more guided approach, our new &lt;/span&gt;&lt;a href="https://g.dev/cloud/agent-plugins-codelab-agy" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;codelab&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; will walk you through the installation and initial exploration of the plugin in Antigravity.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;If you're new to Google Cloud, you can also get started with instructions &lt;/span&gt;&lt;a href="https://g.dev/cloud/dev-setup" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;in our documentation&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; to set yourself up for local development.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The most curious readers can also take a deeper look at the plugins and agent skills available to use today in the &lt;/span&gt;&lt;a href="https://g.dev/cloud/agent-plugins" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Google Agent Skills&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; repository.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;</description><pubDate>Thu, 10 Sep 2026 10:53:00 +0000</pubDate><guid>https://cloud.google.com/blog/topics/developers-practitioners/introducing-the-google-cloud-developer-plugin-for-ai-coding-agents/</guid><category>Developers &amp; Practitioners</category><media:content height="540" url="https://storage.googleapis.com/gweb-cloudblog-publish/images/agent-plugins-blog-cover.max-600x600.png" width="540"></media:content><og xmlns:og="http://ogp.me/ns#"><type>article</type><title>Introducing the Google Cloud Developer Plugin for AI Coding Agents</title><description></description><image>https://storage.googleapis.com/gweb-cloudblog-publish/images/agent-plugins-blog-cover.max-600x600.png</image><site_name>Google</site_name><url>https://cloud.google.com/blog/topics/developers-practitioners/introducing-the-google-cloud-developer-plugin-for-ai-coding-agents/</url></og><author xmlns:author="http://www.w3.org/2005/Atom"><name>Jonathan Lee</name><title>Content Strategist</title><department></department><company></company></author></item></channel></rss>