<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Google Cloud - Community - Medium]]></title>
        <description><![CDATA[A collection of technical articles and blogs published or curated by Google Cloud Developer Advocates. The views expressed are those of the authors and don&#39;t necessarily reflect those of Google. - Medium]]></description>
        <link>https://medium.com/google-cloud?source=rss----e52cf94d98af---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>Google Cloud - Community - Medium</title>
            <link>https://medium.com/google-cloud?source=rss----e52cf94d98af---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Thu, 05 Nov 2026 12:12:38 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/google-cloud" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Building Enterprise Agents with Gemini: Part 2 — ️ Conversational Modeling]]></title>
            <link>https://medium.com/google-cloud/building-enterprise-agents-with-gemini-part-2-%EF%B8%8F-conversational-modeling-6d860042b840?source=rss----e52cf94d98af---4</link>
            <guid isPermaLink="false">https://medium.com/p/6d860042b840</guid>
            <category><![CDATA[gemini-enterprise]]></category>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[enterprise-architecture]]></category>
            <category><![CDATA[llm]]></category>
            <category><![CDATA[google-cloud-platform]]></category>
            <dc:creator><![CDATA[Zelda Ailine Luconi]]></dc:creator>
            <pubDate>Thu, 05 Nov 2026 10:47:01 GMT</pubDate>
            <atom:updated>2026-11-05T10:47:00.129Z</atom:updated>
            <content:encoded><![CDATA[<p>In <strong>Part 1</strong>, we gave our agent a brain. We created its Knowledge Base — its “memory” — by securely ingesting our company’s messy, heterogeneous data (PDFs, docs, and custom databases), so that our agent can now <em>read</em> our company’s “stuff” and provide traceable, accurate answers.</p><p>But a brain isn’t enough. Now we need to give it a <em>personality</em> and a <em>purpose</em>. We need to teach it <em>how</em> to talk, <em>what</em> to do, and <em>when</em> to do it.</p><p>Welcome to <strong>Building Enterprise Agents</strong>, a series where we explore the key features needed to build robust, production-ready AI assistants. In this series, we’re covering the entire stack:</p><ul><li><strong>Part 1: 📚 Knowledge Base Management:</strong> How to manage, ingest, and ground your agent in your company’s documents, data warehouse, and more.</li><li><strong>Part 2: 🗣️ Conversational Modeling (This Article):</strong> How to integrate agents into Gemini Enterprise, to design and control the conversation flow and blend generative and deterministic responses.</li><li><strong>Part 3: 🎨 UX/UI &amp; Accessibility:</strong> How to customize the UI of your Gemini Enterprise with custom branding and embed it across your organization.</li><li><strong>Part 4: 📈 Architecture &amp; Monitoring:</strong> How to observe and monitor metrics for your agents on Gemini Enterprise.</li><li><strong>Part 5: 🛡️ Integration &amp; Security:</strong> How to securely connect your agents to your business data and tools, with personalized authorization.</li></ul><p>This article tackles the core of the agent’s logic: <strong>Conversational Modeling</strong>, where we design the “playbook” that controls how the agents interact with a user.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*wnrtjnArr82X5N_1.png" /></figure><h3>LLM, Agents, Agentic AI?</h3><p>Before we continue, let’s clear up some jargon. The terms in the title are not just synonyms; they describe a specific evolution in capability — from passive text generators to autonomous, collaborative systems.</p><p><strong><em>Evolution of the term “Agent”</em></strong></p><ul><li><strong>LLM + prompt:</strong> It starts with a basic LLM that generates text based on a given prompt.</li><li><strong>LLM + retrieval (RAG):</strong> To improve accuracy and access up-to-date or domain-specific information, RAG (Retrieval-Augmented Generation) was added. This allows the LLM to retrieve relevant information from external sources before generating an answer without the need for retraining.</li><li><strong>LLM + retrieval + actions (Tools):</strong> The system’s capabilities were further expanded by adding Tools, enabling the LLM to not just retrieve information but also perform actions in the real world (e.g., calling an API, sending an email), moving the system from a passive information processor to an active participant.</li><li><strong>+ Many tools and reasoning loop (Agent):</strong> This stage represents a significant shift where the system is considered an “Agent” and involves the LLM using multiple tools and a reasoning loop to determine the best sequence of actions to achieve a complex goal, demonstrating a degree of autonomy.</li><li><strong>Multi-agent systems:</strong> For even more complex tasks, multiple agents, each potentially specialized, can work together in a coordinated system. This stage may necessitate direct <strong>Agent-to-Agent (A2A)</strong> interaction if Agents are not hosted in the same environment, allowing agents to hand off tasks or collaborate on sub-problems.</li><li><strong>Remote multi-agent systems:</strong> The final stage shows these distributed systems of agents operating remotely, collaborating across different locations or networks. To manage context, coordination, and communication across these distributed environments effectively, robust frameworks — akin to a <strong>Model Context Protocol (MCP)</strong> and <strong>A2A protocol</strong> — become essential to ensure scalable and reliable inter-agent operation.</li></ul><p>This evolution highlights a shift from a static model to dynamic, autonomous systems capable of reasoning, acting, and collaborating, which is what is now commonly referred to as an <strong>“Agent”</strong>.</p><p><strong>Why This Matters for This Series?</strong> <strong>Gemini Enterprise</strong> and <strong>Google Cloud</strong> provide the entire stack for this evolution, and you can create and import your agents using: <strong>Gemini Enterprise Agent Designer</strong>, <strong>CX Agent Studio / Conversational Agents (formerly Dialogflow CX)</strong>, or <strong>Agent Development Kit (ADK)</strong>. In addition, you can also import any Agent that is exposed using an <strong>A2A protocol</strong> or from the <strong>Google Cloud Marketplace</strong>.</p><h3>🔎 Where to find your Agents in Gemini Enterprise?</h3><p>Now that we have the data, let’s see where you can find the Agents related to your App. Therefore, go to the <strong>Agents</strong> tab in the left navigation bar (you should already be inside your App).</p><p>As you can see, you already have some “Google-made” Agents (such as <strong>Deep Research</strong> and <strong>Idea Generation</strong>), and you also have the possibility to click <strong>“+ Add agent”</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Bk6L5pNHBOzxGZRVWsUr3w.png" /><figcaption><em>Types of Agent that can be added</em></figcaption></figure><p>When you click <strong>“+ Add agent”</strong>, you can choose from four primary integration paths:</p><ol><li><strong>Google agents:</strong> Best-in-class agents already integrated with Gemini Enterprise.</li><li><strong>Custom agent via Agent Engine:</strong> Agents built by your organization (e.g., using ADK, LangGraph, or CrewAI) deployed on Deployments in Agent Platform and adhering to internal policies.</li><li><strong>Custom agent via Dialogflow:</strong> Deterministic + generative conversational agents built using the Dialogflow CX / Conversational Agents framework.</li><li><strong>Custom agent via A2A:</strong> Custom agents deployed anywhere (even outside Google Cloud) that speak the open <strong>Agent-to-Agent (A2A)</strong> protocol.</li><li><strong>Agents via Marketplace:</strong> Third-party or pre-procured agents acquired from the marketplace.</li><li><strong>Agents from Agent Registry:</strong> Agents configured inside an internal Agent Gateway registry for the instance, keep in mind that for this you need configure Agent Gateway</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/994/1*C4iMuwJr81PqblQO-u3vug.png" /></figure><p>Once you have picked the type of agent you want to add, you will get a dedicated configuration page:</p><ul><li><strong>For Custom agent via A2A:</strong> You will find a configuration box where you paste your <strong>JSON Agent Card</strong> and configure authorizations.</li><li><strong>For Custom agent via Dialogflow:</strong> You will get a structured form to fill in with your agent’s name, description, Dialogflow agent resource path (projects/&lt;PROJECT&gt;/locations/&lt;LOCATION&gt;/agents/&lt;AGENT&gt;), and tool settings.</li><li><strong>For Custom agent via Agent Engine:</strong> You provide the Vertex AI Reasoning Engine resource path (projects/&lt;PROJECT&gt;/locations/&lt;LOCATION&gt;/reasoningEngines/&lt;ID&gt;).</li></ul><p>Let’s explore them, checking the UI.</p><h4>Custom agent via A2A and What Exactly is a “JSON Agent Card”?</h4><blockquote><strong>Key Takeaway:</strong> The <strong>JSON Agent Card is NOT the agent itself</strong>. It contains no Python code, no LLM weights, and no database logic. It is an <strong>Agent Manifest and Contract</strong> — a digital “business card” and OpenAPI specification for the autonomous agent era.</blockquote><p><strong>Why do we need it? </strong>In an enterprise, different engineering teams build agents using different technologies. One team might write an agent in Python using LangChain or ADK; another might write a Go service running on Kubernetes; a partner company might host an agent in another cloud or on-premise.</p><p>You do <strong>not</strong> want to re-write or re-host all those agents inside Gemini Enterprise. Instead, those remote agents expose an HTTP endpoint that speaks the open <strong>Agent-to-Agent (A2A)</strong> protocol.</p><p>To let Gemini Enterprise know that this external agent exists, you give Gemini Enterprise its <strong>JSON Agent Card</strong>.</p><p><strong>What does the Agent Card contain? </strong>Think of it like an openapi.json / Swagger specification, but tailored for generative AI reasoning:</p><pre>{<br>  &quot;name&quot;: &quot;double_click_remote_a2a_agent&quot;,<br>  &quot;description&quot;: &quot;Remote supply-chain collaborator speaking the Agent-to-Agent (A2A) protocol. Handles hardware supplier SLA checks.&quot;,<br>  &quot;version&quot;: &quot;1.0.0&quot;,<br>  &quot;protocolVersion&quot;: &quot;0.2.1&quot;,<br>  &quot;url&quot;: &quot;https://a2a-supply-chain-agent.doubleclick.example.com/a2a&quot;,<br>  &quot;capabilities&quot;: {<br>    &quot;streaming&quot;: true,<br>    &quot;pushNotifications&quot;: false<br>  },<br>  &quot;skills&quot;: [<br>    {<br>      &quot;id&quot;: &quot;check_supplier_bottleneck&quot;,<br>      &quot;name&quot;: &quot;Check Supplier SLA &amp; Bottleneck Status&quot;,<br>      &quot;description&quot;: &quot;Queries remote supply-chain systems for hardware vendor delays impacting Project Alpha or Acme Corp MSAs.&quot;,<br>      &quot;examples&quot;: [<br>        &quot;Why was Project Alpha delayed by 14 days?&quot;,<br>        &quot;Check supplier status for CloudNet Hardware Ltd.&quot;<br>      ]<br>    }<br>  ]<br>}</pre><p>How does Gemini Enterprise use it at runtime?</p><ol><li><strong>Registration:</strong> You paste this JSON card into <strong>Gemini Enterprise </strong>→→<strong> + Add agent </strong>→→<strong> Custom agent via A2A</strong>. Gemini Enterprise stores the manifest in its agent registry.</li><li><strong>Intent Matching:</strong> When an employee asks: <em>“Why was Project Alpha delayed by CloudNet Hardware?”</em>, the Gemini Enterprise Primary Assistant analyzes the query against all registered skills and &quot;examples&quot;.</li><li><strong>Network Dispatch:</strong> The router recognizes that its internal knowledge base lacks real-time supply chain telemetry, but the remote agent at &quot;url&quot; has a matching skill (check_supplier_bottleneck).</li><li><strong>Execution:</strong> Gemini Enterprise packages the user prompt into an A2A protocol JSON payload, issues an HTTPS POST request to the remote &quot;url&quot;, streams back the answer, and seamlessly renders it to the employee in the chat window.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/994/1*qYY3n9wL0vFs5PRdXsOkOQ.png" /><figcaption>For <strong>Custom agent via A2A</strong>, you will find a simple box where you paste your <strong>JSON Agent Card</strong> and configure authorizations, you can find one in <a href="https://github.com/EilinLux/gemini-enterprise-series/blob/02-conversational-modeling/agents/a2a_agent_card/double_click_a2a_agent_card.json">double_click_a2a_agent_card.json</a></figcaption></figure><p>If needed, the “Agent authorization” tab is designed to establish secure OAuth 2.0 authentication between the platform and the custom or third-party agent being connected.</p><p>If the agent is publicly available or if permission for the runtime is already in place, you do not need to configure authentication. You can simply click the <strong>Skip &amp; Finish</strong> button at the bottom to bypass these authorization settings and complete the setup.</p><p>In the top section, administrators enter the core OAuth credentials provided by their identity provider, specifically the Client ID and Client Secret. These credentials serve as the primary identity verification for the agent connection. Authentication can be skipped if the agent is already publicly accessible or if runtime permissions are already established.</p><p>The lower section covers specific endpoint configurations and security options. It includes fields for the Authorization URL, Token URL, and specific API Scopes required for the agent to function, such as read or write permissions. Additionally, options for PKCE (Proof Key for Code Exchange) verification and HTTP Basic authentication can be checked to match the security requirements of the underlying OAuth provider. Completing these fields and clicking “Finish” finalizes the setup and integrates the agent into the environment.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/994/1*p-g5hvYNw8wavV9gn_9Pzg.png" /></figure><h4>Dialogflow &amp; Custom agent via Agent Runtime</h4><p>Conversely, for <strong>Dialogflow</strong>, you will simply get a structured form to fill in with your agent’s name, description, Dialogflow agent source resource path (projects/&lt;PROJECT&gt;/locations/&lt;LOCATION&gt;/agents/&lt;AGENT&gt;)</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/994/1*fFtkDTmt-JMryBvt3uSJIw.png" /><figcaption><em>Dialogflow Agent Configuration</em></figcaption></figure><p>And similarly, if you want to configure a <strong>Custom agent via Agent Runtime</strong>, you will need to fill in a similar form, but you will need to use a Reasoning Engine Id (projects/&lt;PROJECT&gt;/locations/&lt;LOCATION&gt;/reasoningEngine/&lt;reasoningEngine&gt;), instead of an Dialogflow agent source resource path (projects/&lt;PROJECT&gt;/locations/&lt;LOCATION&gt;/agents/&lt;AGENT&gt;)</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/994/1*J3C4KEKNI-aP_ZMQgi2dtQ.png" /></figure><h4>Agents via Marketplace &amp; Agent Registry</h4><p>The last two instead presents a search bar, so that you can search for existing agents in the Marketplace or Agent Registry.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/994/1*JxWs83El7FaZdgmzKSMILw.png" /><figcaption>Agents via Marketplace</figcaption></figure><h3>Demystifying the Architecture</h3><p>When people talk about agents in this series, there is often confusion between the <strong>top-level Gemini Enterprise Assistant</strong> and the <strong>underlying specialized agents</strong>. Let’s break down where each one is created and what role it plays:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*aP8fdgVYo90vHc5MJG99Lg.png" /></figure><p><strong>A. The Top-Level Hub (Gemini Enterprise App):</strong></p><ul><li><em>Where it is created:</em> Created in <strong>Discovery Engine</strong> via terraform/discovery_engine.tf (google_discovery_engine_search_engine.gemini_enterprise_app).</li><li><em>What it does:</em> Acts as the main chat window and intranet assistant. It automatically performs basic RAG search across our Part 1 Knowledge Base (PDFs in GCS and structured rows in BigQuery).</li></ul><p><strong>B. The Conversational QA Agent (Dialogflow CX / Conversational Agents):</strong></p><ul><li><em>Where it is created:</em> Created in the <strong>Dialogflow CX / Conversational Agents Console</strong> (or automated via terraform/dialogflow_cx.tf as google_dialogflow_cx_agent.double_click_cx_agent in location global).</li><li><em>Why is it needed if we already have the App?</em> Basic RAG is passive — it just retrieves snippets. Our <strong>Conversational QA Agent</strong> introduces <strong>behavioral steering, conversational guardrails, and compliance workflows</strong>. Inside this agent, we create a <strong>Generative Task Playbook</strong> (google_dialogflow_cx_playbook.double_click_concierge_playbook). The playbook instructs the LLM: 1) <em>“Always identify whether the question is HR, Legal, or Operations.” 2) “Strictly ground answers in the company data stores.” 3) “If the employee asks about Project Phoenix, mandate Security Clearance Level 2 before answering.”</em></li><li><em>How it is connected:</em> We copy its resource string (projects/&lt;PROJECT&gt;/locations/global/agents/&lt;ID&gt;) and register it into Gemini Enterprise under <strong>+ Add agent </strong>→<strong> Custom agent via Dialogflow</strong>.</li></ul><p><strong>The Code-First Tool Agent (Vertex AI Agent Engine with ADK):</strong></p><ul><li><em>Where it is created:</em> Written in Python (agents/adk_double_click_agent/agent.py) using the Google Agent Development Kit (ADK) and deployed to <strong>Vertex AI Agent Engine</strong> (reasoningEngines) in europe-west1.</li><li><em>What it does:</em> Handles deterministic calculations that an LLM should not guess (such as calculating the exact 15% discount for Acme Corp renewals or executing live parameterized BigQuery SQL queries).</li><li><em>How it is connected:</em> We copy its ReasoningEngine resource string (projects/&lt;PROJECT&gt;/locations/&lt;REGION&gt;/reasoningEngines/&lt;ID&gt;) and register it under <strong>+ Add agent </strong>→<strong> Custom agent via Agent Engine</strong>.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BZM_tXor6mf6fAoU3q2OZA.png" /></figure><h3>How to interact with your Agents from the UI</h3><p>Up to now, we haven’t spoken about the end-user interface that your App has. By default, if you go to the <strong>Overview</strong> page of your Gemini Enterprise App, you can access the web app by clicking on or copying the generated web app link (this is just one of the deployment methods, which we will customize in Part 3):</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*f6oq7ZeASvvl8BiQyjnzMA.png" /></figure><p>When you open that URL, you are redirected to an enterprise web interface very similar to the consumer Gemini interface (https://gemini.google.com/), but grounded in your company&#39;s data and governed by your organization&#39;s security policies.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*etcDCSICJlSZrkfk_3k43g.png" /></figure><p>Now, if you click on the <strong>Agents</strong> tab in the left sidebar of the web app, you can see the <strong>Agent gallery</strong> containing all the agents you can interact with within your App. Initially, we see our 2 Google-made options (<strong>Deep Research and Gemini Notebook</strong>)<strong> </strong>but you can add more:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*WUAY8RWQaa5cax_D1oB7VQ.png" /></figure><p>If you click on any of these, you get redirected to that specific agent’s workspace (for example, <strong>Deep Research</strong>):</p><h3>🔨 Build Agents with the Google Ecosystem</h3><p>As already mentioned, Google Cloud offers a powerful suite of tools for building advanced AI agents, with <strong>ADK</strong>, <strong>CX Agent Studio / Conversational Agents (formerly Dialogflow CX)</strong>, and the broader <strong>Gemini Enterprise Agent Platform</strong> (formerly Vertex AI Agent Builder / Agentspace) being the primary solutions.</p><p>These platforms are specifically designed to address the need for a <strong>hybrid solution</strong> — one that can seamlessly blend <strong>deterministic</strong> (rule-based, predictable) responses for specific compliance or business topics with <strong>generative AI (GenAI)</strong> responses for open-ended or less-defined conversations.</p><ul><li><strong>Conversational Agents (formerly Dialogflow CX)</strong> is used for building large, complex, and sophisticated virtual agents. It is the state-of-the-art visual platform for <strong>deterministic flow management</strong>, now powerfully extended with generative AI <strong>Playbooks</strong>.</li><li><strong>Gemini Enterprise &amp; Agent Engine</strong> (formerly Vertex AI Agent Builder) is a comprehensive platform for creating, deploying, and governing enterprise-grade agents, unifying Google AI capabilities for RAG and multi-agent systems. And it supports multiple open agent frameworks including <strong>Agent Development Kit (ADK)</strong>, LangGraph, LangChain, LlamaIndex, CrewAI, and AG2.</li></ul><p>Since this article is not a full coding tutorial on how to develop every type of agent from scratch, but rather a guide on how to <strong>integrate</strong> them into Gemini Enterprise, we will walk through the creation and deployment steps briefly so you understand how to bring your own agents into the platform.</p><h4>Example 1: CX Agent Studio (formerly Dialogflow CX)</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*adeSuxurhkwYClhFptocDQ.png" /><figcaption><strong>Cx Agent Studio </strong>main page</figcaption></figure><blockquote><strong><em>💡 Understanding the Difference: Dialogflow CX vs. CX Agent Studio</em></strong><em> Google Cloud is currently transitioning between two generations of conversational AI interfaces and backends:</em></blockquote><blockquote>- <strong>Dialogflow CX Console (</strong><a href="https://dialogflow.cloud.google.com/cx/projects"><strong>dialogflow.cloud.google.com/cx</strong></a><strong>):</strong> Google’s classical, flow-based agent platform built around deterministic state machines (default_start_flow).</blockquote><blockquote><strong>- CX Agent Studio / Conversational Agents Studio (</strong><a href="https://ces.cloud.google.com/projects"><strong>ces.cloud.google.com</strong></a><strong> or </strong><a href="https://conversational-agents.cloud.google.com/"><strong>conversational-agents.cloud.google.com</strong></a><strong>):</strong> The next-generation generative AI workspace under Google’s <strong>Customer Engagement Suite (CES)</strong> where agents are LLM-native and governed by a root <strong>Playbook</strong> (start_playbook).</blockquote><p>To learn how to create a new agent from scratch (using <strong>Playbooks</strong> or <strong>Flows</strong>) or import a <strong>Pre-built Agent</strong> template — making sure to pick the same <strong>Location</strong> (global, us, or eu) as your Part 1 Data Stores—check the official Google Cloud documentation:</p><ul><li>📖 <a href="https://cloud.google.com/customer-engagement-ai/conversational-agents/ps"><strong>CX Agent Studio / Customer Engagement Suite Documentation</strong></a></li><li>📖 <a href="https://cloud.google.com/dialogflow/cx/docs"><strong>Dialogflow CX Official Documentation</strong></a></li></ul><h4>Find your Agent Resource Name &amp; Add it to Gemini Enterprise</h4><p>Once your agent is created in <a href="https://ces.cloud.google.com/projects">CX Agent Studio</a> or <a href="https://dialogflow.cloud.google.com/cx/projects">Dialogflow CX</a>, you will see it in your <strong>Conversational Agents list</strong>:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*QoyXJ7wpDjfikuarAB9CUg.png" /><figcaption><strong>Example</strong> on how to find your agent resource name</figcaption></figure><p>To link it to Gemini Enterprise:</p><ol><li>Click on the <strong>3 dots (Actions)</strong> on the right side of the row and click <strong>Copy name</strong>.</li><li>This copies the resource name string in the format: projects/&lt;PROJECT_ID&gt;/locations/&lt;LOCATION&gt;/agents/&lt;AGENT_ID&gt;</li><li>Paste this resource path into <strong>Gemini Enterprise </strong>→<strong> Agents </strong>→ <strong>+ Add agent </strong>→<strong> Custom agent via Dialogflow</strong> (shown earlier). Once added, your users will immediately see it under <strong>“From your organization”</strong> in their Gemini Enterprise Agent Gallery!</li></ol><h4>Example 2: Agent Development Kit (ADK) &amp; Deployments in Agent Platform</h4><p>You can achieve an even more flexible, code-first architecture using the <strong>Agent Development Kit (ADK)</strong>, once your ADK agent is deployed to <strong>Agent Platform</strong>, integrating it into Gemini Enterprise is just as seamless.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*mpXS38eR6xZz0luph5P2FQ.png" /><figcaption>Deployments in Agent Platform</figcaption></figure><p><strong>Deployments</strong> is the recommended, fully-managed runtime service for scaling ADK agents, abstracting away infrastructure concerns like load balancing, auto-scaling, and persistent session management.</p><h4>Prerequisites</h4><p>These instructions assume you have already defined an ADK project (an agent). If you do not have an ADK project yet, see the official <a href="https://google.github.io/adk-docs/get-started/quickstart/">ADK Python Quickstart guide</a>, which creates a multi_tool_agent project (used as the example below).</p><p>Before starting the deployment procedure, ensure you have the following:</p><ol><li><strong>Google Cloud Project:</strong> A Google Cloud project with the <strong>Vertex AI API</strong> enabled.</li><li><strong>Authenticated gcloud CLI:</strong> You need to be authenticated with Google Cloud. Run the following command in your terminal: gcloud auth application-default login</li><li><strong>Google Cloud Storage (GCS) Bucket:</strong> Agent Engine requires a GCS bucket to stage your agent’s code and dependencies for deployment.</li><li><strong>Python Environment:</strong> A Python version between 3.9 and 3.13.</li><li><strong>Install Vertex AI SDK &amp; ADK:</strong> Agent Engine is part of the Vertex AI SDK for Python. Install it via: pip install &quot;google-cloud-aiplatform[adk,agent_engines]&gt;=1.111&quot;</li></ol><h4>Deploying via the ADK CLI (Option 1)</h4><p>You can often deploy your ADK agent using a single command via the <strong>ADK Command Line Interface (CLI)</strong>:</p><pre>adk deploy agent_engine \<br>    --project=my-cloud-project-xxxxx \<br>    --region=us-central1 \<br>    --staging_bucket=gs://my-cloud-project-staging \<br>    --display_name=&quot;My Agent Name&quot; \<br>    ./multi_tool_agent</pre><h4>Deploying via the Python SDK (Option 2)</h4><p>Alternatively, you can initialize the Vertex AI SDK and deploy programmatically in a deploy.py script:</p><pre>import vertexai<br>from vertexai import agent_engines<br>from agent import root_agent  # modify this if your agent entry point differs<br><br>PROJECT_ID = &quot;your-gcp-project-id&quot;<br>LOCATION = &quot;us-central1&quot;<br>STAGING_BUCKET = &quot;gs://your-gcs-bucket-name&quot;<br># 1. Initialize the Vertex AI SDK<br>vertexai.init(<br>    project=PROJECT_ID,<br>    location=LOCATION,<br>    staging_bucket=STAGING_BUCKET,<br>)<br># 2. Wrap the agent in an AdkApp object for Agent Engine compatibility<br>app = agent_engines.AdkApp(<br>    agent=root_agent,<br>    enable_tracing=True,<br>)<br># 3. Deploy to Deployments in Agent Platform<br>remote_app = agent_engines.create(<br>    agent_engine=app,<br>    requirements=[&quot;google-cloud-aiplatform[adk,agent_engines]&quot;],<br>    display_name=&quot;My ADK Enterprise Agent&quot;,<br>)</pre><blockquote><strong><em>Note:</em></strong><em> When an </em><em>AdkApp is deployed to Agent Engine, it automatically uses </em><em>VertexAiSessionService for persistent, managed session state. This provides multi-turn conversational memory out of the box without any additional database configuration.</em></blockquote><p>After several minutes, you will find your deployed agent listed on the <strong>Agent Engine</strong> page in the Cloud Console. Click the <strong>Copy</strong> icon under the <strong>Resource name</strong> column, and link it in Gemini Enterprise under <strong>“+ Add agent” </strong>→→<strong> “Custom agent via Agent Engine”</strong>!</p><blockquote><strong>Note: </strong>To get an updated version, please consider reading <a href="https://docs.cloud.google.com/gemini-enterprise-agent-platform/build/runtime/create-an-agent"><strong>how to build agents</strong></a> and how to <a href="https://docs.cloud.google.com/gemini-enterprise-agent-platform/scale/runtime/deploy-an-agent"><strong>deploy them</strong></a><strong>.</strong></blockquote><blockquote>Additionally, if you need a step-by-step guide on ADK 2.0 with a companion branch-by-branch implementation, please consider reading <a href="https://medium.com/@ailluzdatascience/list/agent-developer-kit-adk-5d957c62e9a9"><strong>my series “ADK 2.0–101” on Medium</strong></a> and check the companion <a href="https://github.com/EilinLux/adk2.0-medium/tree/01-first-agent"><strong>repo on GitHub</strong></a><strong>.</strong></blockquote><h4>Example 3: Create an Agent from the UI with Agent Designer (No-Code)</h4><p>What if business users or admins want to create specialized agents <em>without writing code or leaving the Gemini Enterprise Web App</em>?</p><p>Once inside the <strong>Agent gallery</strong> in the Gemini Enterprise Web App, if your administrator has enabled <strong>Agent Designer</strong> (which we’ll govern in Part 3), you can create and publish an agent directly from the UI simply by clicking <strong>“+ Create agent” and then on “Build Manually”</strong>:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*5IPO5t_51NMHElYvPadfUg.png" /><figcaption><em>Agent Gallery</em></figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*sdZOMb1HdeV5hObfR7e18Q.png" /><figcaption>click on “Build manually”</figcaption></figure><p>This opens the visual <strong>Agent Designer</strong> studio (https://vertexaisearch.cloud.google.com/eu/home/cid/&lt;appID&gt;/r/agent-builder/&lt;agentbuilderID&gt;), where you can describe your agent in natural language or use the visual flow canvas to connect subagents, models, and enterprise Data Stores—and it is automatically added to your Gemini Enterprise Agent Gallery!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*D4EqjMxajOc20A5hWsEq8Q.png" /><figcaption><strong>Agent Designer</strong></figcaption></figure><blockquote>📖 To learn more about configuring instructions, subagents, and tools in the no-code studio, refer to the <a href="https://cloud.google.com/agentspace/docs"><strong>Official Gemini Enterprise Agent Designer Documentation</strong></a>.</blockquote><h3>💻 Code &amp; Infrastructure Summary: Automating Part 2 (02-conversational-modeling)</h3><p>Can we automate the creation of our <strong>Conversational Agents</strong>, <strong>Gemini Enterprise App</strong>, and <strong>ADK Agent Engine runtime</strong> using Terraform and Python? <strong>Yes!</strong></p><p>On branch <strong>02-conversational-modeling</strong> of our companion repository, we build incrementally on top of our Part 1 Knowledge Base using our modular, service-split Terraform files and the same root .env configuration:</p><ul><li><strong>Conversational Agents &amp; Playbooks (</strong><strong>terraform/dialogflow_cx.tf):</strong> Provisions the Dialogflow CX Agent (google_dialogflow_cx_agent), creates a generative task Playbook (google_dialogflow_cx_playbook) with step-by-step instructions for DoubleClick Enterprise, automatically patches startPlaybook so the agent defaults to Playbook mode, and optionally provisions a next-gen <strong>CX Agent Studio (</strong><strong>google_ces_app)</strong> container.</li><li><strong>Gemini Enterprise App Hub (</strong><strong>terraform/discovery_engine.tf):</strong> Provisions the double-click-enterprise-app (google_discovery_engine_search_engine with APP_TYPE_INTRANET, SEARCH_TIER_ENTERPRISE, and SEARCH_ADD_ON_LLM) connected to our Part 1 Data Stores, where all custom agents are registered.</li><li><strong>Code-First ADK Agent &amp; IAM (</strong><strong>terraform/vertex_ai_agent.tf &amp; </strong><strong>agents/adk_double_click_agent/):</strong> Provisions the dedicated ADK Service Account (google_service_account.adk_agent_engine_sa) with least-privilege IAM roles, plus our complete Python ADK agent (agent.py and deploy_agent_engine.py) and sample <strong>A2A JSON Agent Card</strong> (agents/a2a_agent_card/double_click_a2a_agent_card.json—note that the A2A AgentCard schema requires &quot;protocolVersion&quot;: &quot;0.2.1&quot; and uses &quot;name&quot; rather than &quot;displayName&quot;).</li></ul><h4>Quick Setup &amp; Testing Commands (Branch 02-conversational-modeling):</h4><pre># 1. Authenticate with Google Cloud (CLI + Terraform ADC)<br>gcloud auth login<br>gcloud auth application-default login<br><br># 2. Checkout the Part 2 branch<br>git checkout 02-conversational-modeling<br># 3. Run the automated verification &amp; unit test suite (tests ADK tools, A2A JSON Card &amp; Terraform)<br>./scripts/test_infra.sh<br># 4. Provision the Part 1 + Part 2 infrastructure<br>./scripts/setup_infra.sh<br># 5. (Optional) Deploy the Python ADK Agent to Deployments in Agent Platform<br>python3 agents/adk_double_click_agent/deploy_agent_engine.py</pre><blockquote>👉 <strong>For a complete line-by-line walkthrough </strong>of dialogflow_cx.tf, vertex_ai_agent.tf, the Python ADK agent code, and how to link them into Gemini Enterprise, read our companion article: <a href="https://medium.com/@ailluzdatascience/building-enterprise-agents-with-gemini-part-2-extra-%EF%B8%8F-automating-conversational-agents-631b7c910e35">Part 2 EXTRA — Automating Conversational Agents, Playbooks &amp; ADK with Terraform &amp; Python</a> or check the <a href="https://github.com/EilinLux/gemini-enterprise-series/blob/02-conversational-modeling/README.md">Repository README</a></blockquote><h3>Conclusion</h3><p>Conversational Modeling is no longer a simple choice between a rigid rule-based bot and an unconstrained creative AI. The best enterprise agents are <strong>hybrids</strong>.</p><p>With <strong>Gemini Enterprise</strong>, you can choose the exact entry point that matches your team’s skills and use case:</p><ul><li><strong>Start No-Code</strong> with the <strong>Agent Designer UI</strong> in the web app for an instant, multi-subagent assistant grounded in your Knowledge Base.</li><li><strong>Evolve to the Visual Flow &amp; Playbook Builder</strong> (<strong>CX Agent Studio / Conversational Agents</strong>, formerly Dialogflow CX) to create structured “Action Takers” that follow strict compliance workflows while still querying your Knowledge Base to handle unexpected user questions.</li><li><strong>Go Code-First</strong> with the <strong>ADK &amp; Deployments in Agent Platform</strong> (or <strong>A2A</strong> for remote agents) to build sophisticated, autonomous multi-agent systems in Python.</li></ul><p>We’ve built the brain (<strong>Part 1</strong>) and the personality (<strong>Part 2</strong>). But what does it look like to your employees, and how do you govern what features they can access?</p><p><strong>Coming up in Part 3:</strong> We’ll dive into 🎨 <strong>UX/UI &amp; Accessibility</strong>. Now that we have a smart, conversational agent, how do we customize its branding, manage end-user features, and embed it across our company apps?</p><p>« <a href="https://medium.com/@ailluzdatascience/building-enterprise-agents-with-gemini-part-1-knowledge-base-management-85c1fc887a7a"><strong>Part 1: Knowledge Base</strong></a><strong> </strong>| <a href="https://medium.com/@ailluzdatascience/list/gemini-enterprise-e50e28da7219"><strong>Gemini Enterprise Hub</strong></a><strong> | </strong><a href="https://medium.com/@ailluzdatascience/building-enterprise-agents-with-gemini-part-3-ux-ui-accessibility-cdb49c80517f"><strong>Part 3: UX/UI &amp; Accessibility</strong></a><strong> </strong>»</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6d860042b840" width="1" height="1" alt=""><hr><p><a href="https://medium.com/google-cloud/building-enterprise-agents-with-gemini-part-2-%EF%B8%8F-conversational-modeling-6d860042b840">Building Enterprise Agents with Gemini: Part 2 — 🗣️ Conversational Modeling</a> was originally published in <a href="https://medium.com/google-cloud">Google Cloud - Community</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[New to Google SecOps: Same as It Ever Was? Not When You Use |> EXTEND]]></title>
            <link>https://medium.com/google-cloud/new-to-google-secops-same-as-it-ever-was-not-when-you-use-extend-51998c82c476?source=rss----e52cf94d98af---4</link>
            <guid isPermaLink="false">https://medium.com/p/51998c82c476</guid>
            <category><![CDATA[sql-pipe-syntax]]></category>
            <category><![CDATA[google-secops]]></category>
            <category><![CDATA[gcp-security-operations]]></category>
            <dc:creator><![CDATA[John Stoner]]></dc:creator>
            <pubDate>Thu, 05 Nov 2026 04:38:40 GMT</pubDate>
            <atom:updated>2026-11-05T04:38:39.083Z</atom:updated>
            <content:encoded><![CDATA[<p>I hope you are enjoying this mini-series on SQL Pipe syntax and that you’ve tried a few SQL queries out in Google Security Operations (SecOps)! The pipe operators of <a href="https://security.googlecloudcommunity.com/community-blog-42/new-to-google-secops-where-did-our-logs-go-8252">WHERE</a>, <a href="https://security.googlecloudcommunity.com/community-blog-42/new-to-google-secops-please-please-please-let-me-select-what-i-want-8373">SELECT</a> and <a href="https://security.googlecloudcommunity.com/community-blog-42/new-to-google-secops-don-t-get-aggravated-it-s-just-aggregate-8461">AGGREGATE</a> are a great springboard to get you started and after we cover <a href="https://docs.cloud.google.com/chronicle/docs/reference/standard-sql/pipe-syntax#extend_pipe_operator">EXTEND</a> today, you will have a great foundation to build queries with!</p><p>Quite simply, the EXTEND pipe operator adds computed columns to a result set. That statement is a nice summary, but it only scrapes the surface of what EXTEND can do.</p><ul><li>Do you want to create a concatenated output of multiple values within various columns?</li><li>How about creating a sum (or any other mathematical calculation) based on values within a row of data?</li><li>Calculating the length of a command line?</li><li>Classifying results from a column?</li></ul><p>EXTEND can do all of those things…and more.</p><p>For those familiar with YARA-L, the EXTEND pipe doesn’t have an exact counterpart, but it can fill the role that placeholder variables perform in the filtering statement or in the outcome section in the form of conditional logic, for instance. Because EXTEND fills many different roles, it is a bit harder to provide a single example that summarizes how it compares to YARA-L, so here is a basic example to kick this off. Here we are generating an output of the time, IP pair, sent and received bytes and creating a new column with the total bytes for each event.</p><pre>metadata.event_type = &quot;NETWORK_CONNECTION&quot;<br>network.sent_bytes &gt; 0<br>network.received_bytes &gt; 0<br>match:<br>  metadata.id // Group by the unique event ID to guarantee row-by-row results<br>outcome: // Using a match section, fields must be aggregated<br>  $time = timestamp.get_timestamp(max(metadata.event_timestamp.seconds))<br>  $principal_ip = array_distinct(principal.ip)<br>  $target_ip = array_distinct(target.ip)<br>  $sent_bytes = max(network.sent_bytes)<br>  $received_bytes = max(network.received_bytes)<br>  $total_bytes = max(network.sent_bytes + network.received_bytes)<br>order:<br>  $time desc<br>unselect:<br>  metadata.id</pre><p>Here is the equivalent query in SQL pipe syntax:</p><pre>FROM events<br>|&gt; WHERE metadata.event_type = &quot;NETWORK_CONNECTION&quot; and<br>    network.sent_bytes &gt; 0 and<br>    network.received_bytes &gt; 0<br>|&gt; SELECT TIMESTAMP_SECONDS(metadata.event_timestamp.seconds) as time,<br>    principal.ip as principal_ip,<br>    target.ip as target_ip,<br>    network.sent_bytes,<br>    network.received_bytes<br>|&gt; EXTEND sent_bytes + received_bytes as total_bytes</pre><p>If you want to use traditional SQL rather than pipe SQL, it’s worth noting that like the AGGREGATE pipe, EXTEND is not a term you will find in traditional SQL. However, this query can be handled by performing the addition of the bytes in the SELECT statement like this.</p><pre>SELECT<br>  TIMESTAMP_SECONDS(metadata.event_timestamp.seconds) as time,<br>  principal.ip as principal_ip,<br>  target.ip as target_ip,<br>  network.sent_bytes,<br>  network.received_bytes,<br>  network.sent_bytes + network.received_bytes as total_bytes<br>FROM events<br>WHERE metadata.event_type = &quot;NETWORK_CONNECTION&quot; and<br>  network.sent_bytes &gt; 0 and<br>  network.received_bytes &gt; 0</pre><p>Either way, the results looks like this:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*81c9rjeH6uaoyY5UqTuTZA.png" /></figure><p>I’ve mentioned a number of capabilities that EXTEND can handle, so let’s dig into some additional capabilities.</p><h4>Extracting Values into New Columns</h4><p>In the previous example, we created a new column by taking the sum of two other columns. Let’s apply EXTEND to string values. SecOps stores the file name and full path in a single field, and perhaps we want to extract that file name to perform some additional analysis. We would apply the regular expression <a href="https://docs.cloud.google.com/chronicle/docs/reference/standard-sql/string_functions#regexp_extract">REGEXP_EXTRACT</a> to the <em>target.process.file.full_path</em>, extract it and name the new column <em>file_name</em> using the EXTEND pipe. The result is two columns, the source column and the newly created one that just contains the file name.</p><pre>FROM events<br>|&gt; WHERE metadata.event_type = &quot;PROCESS_LAUNCH&quot; and target.process.file.full_path &lt;&gt; &quot;&quot;<br>|&gt; SELECT target.process.file.full_path<br>|&gt; EXTEND REGEXP_EXTRACT(full_path, r&#39;\\([^\\]+)$&#39;) as file_name</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*m9HotV3uAPTtNB6SlliYIg.png" /></figure><h4>Calculating Numeric Values from Strings</h4><p>Now let’s take a string and use a SQL function to output a numeric. In this example, we are using the <a href="https://docs.cloud.google.com/chronicle/docs/reference/standard-sql/string_functions#length">LENGTH</a> function, one of nearly 200 SQL functions supported in Google SecOps, and outputting this numeric to a new column using EXTEND.</p><pre>FROM events<br>|&gt; WHERE metadata.event_type = &quot;PROCESS_LAUNCH&quot; and target.process.command_line &lt;&gt; &quot;&quot;<br>|&gt; SELECT target.process.command_line as cmd_line<br>|&gt; EXTEND length(cmd_line) as cmd_length</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*QfhneuwzySvDH4jfhJyN-A.png" /></figure><p>With all three of these examples, the total bytes, file name and command string length, we are probably not at the final step of the query, but it unlocks values that can then be further manipulated in the query. These next steps could be as simple as sorting or they could be used in additional statistical calculations or filtered to arrive at a final actionable result.</p><h4>Classifying Events</h4><p>In fact, let’s take this last example and take it a step further. Again a lot of this mini-series is around highlighting the building blocks that exist within SQL pipes that you can take to build your own queries for your use cases as well as ensuring you understand what is occurring in each of these steps. I’m not expecting everyone to be SQL experts but it is important to be able to understand the flow of these queries as we add more pipe operators to them!</p><p>With the command line length calculated in the previous query, perhaps we want to add a classification column to the results. The EXTEND pipe does this as well.</p><pre>FROM events<br>|&gt; WHERE metadata.event_type = &quot;PROCESS_LAUNCH&quot; and target.process.command_line &lt;&gt; &quot;&quot;<br>|&gt; SELECT target.process.command_line as cmd_line<br>|&gt; EXTEND length(cmd_line) as cmd_length<br>|&gt; EXTEND cmd_length &gt; 200 or cmd_length &lt; 10 as interesting_rows<br>|&gt; WHERE interesting_rows = TRUE</pre><p>The first thing I want to call out is that we have two EXTEND pipes back to back in this query. In SQL pipes, we need two separate pipes in this case because the latter one is dependent on the results of the former. So, the first EXTEND calculates the length of the command line. With that calculated, the second EXTEND can use that calculated value and based on the logic provided compares the command length to the values provided and if it meets the criteria, it outputs <em>true</em> in the newly named column and if not, it returns <em>false</em>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ZB8x2hzDerIPyd7JC4282w.png" /></figure><p>If we had wanted to perform additional classifications or create additional columns, we could append additional logic to the second EXTEND pipe and separate the new logic from what we already have with a a comma. The last step of this query is the addition of another WHERE pipe to further filter the result set to just the “interesting” columns.</p><p>In my estimation, the additional bonus that EXTEND brings is that because SQL pipes operate in a linear manner, we can create new columns during a query and then perform operations on those columns within the same query. In traditional SQL, this is often handled with a common table expression (<a href="https://docs.cloud.google.com/chronicle/docs/reference/standard-sql/query-syntax#cte_rules">CTE</a>) or using the last example, adding more calculations to the SELECT statement as well as filtering in the WHERE statement as the query gets refined. In YARA-L, these additional calculations are often handled by building a multi-stage search which I’ve covered <a href="https://security.googlecloudcommunity.com/community-blog-42/new-to-google-secops-should-i-stage-or-should-i-go-6387">previously</a>.</p><p>We’ve scratched the surface of EXTEND and will follow this blog with another one with more examples of EXTEND which go deeper into its capabilities. In the meantime, here are a few things to keep in mind as you get started:</p><ul><li>EXTEND creates additional columns in the result set</li><li>Using SQL functions, it can be used to concatenate values, extract strings, perform mathematical functions and more</li><li>These newly created columns can then be used by subsequent pipe operators</li><li>Just remember that the EXTEND pipe can’t be used to calculate a new column and then immediately use that newly created column in that same EXTEND pipe; you need to add a second EXTEND pipe</li></ul><p>Try some of these concepts out in your next search and let us know how it goes. I’ll be back with more tips, more pipes and the concepts we covered today will be leveraged as we go deeper into SQL pipes!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=51998c82c476" width="1" height="1" alt=""><hr><p><a href="https://medium.com/google-cloud/new-to-google-secops-same-as-it-ever-was-not-when-you-use-extend-51998c82c476">New to Google SecOps: Same as It Ever Was? Not When You Use |&gt; EXTEND</a> was originally published in <a href="https://medium.com/google-cloud">Google Cloud - Community</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Change the brand manual, not the prompts: a multi-agent marketing team in Gemini Enterprise]]></title>
            <link>https://medium.com/google-cloud/change-the-brand-manual-not-the-prompts-a-multi-agent-marketing-team-in-gemini-enterprise-855c71012e88?source=rss----e52cf94d98af---4</link>
            <guid isPermaLink="false">https://medium.com/p/855c71012e88</guid>
            <category><![CDATA[generative-ai-use-cases]]></category>
            <category><![CDATA[google-gemini]]></category>
            <category><![CDATA[google-cloud-platform]]></category>
            <category><![CDATA[agents]]></category>
            <category><![CDATA[marketing]]></category>
            <dc:creator><![CDATA[Riccardo Mestrone]]></dc:creator>
            <pubDate>Thu, 05 Nov 2026 04:37:43 GMT</pubDate>
            <atom:updated>2026-11-05T04:37:42.685Z</atom:updated>
            <content:encoded><![CDATA[<h4>Connect AI agents to your real brand guidelines in Cloud Storage, and update them by swapping a file instead of rewriting prompts.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_yYmTSOevbDGbHP29KB25g.jpeg" /><figcaption>Change the brand manual, not the prompts: a multi-agent marketing team in Gemini Enterprise</figcaption></figure><p>I rebranded a company. I swapped one Word file in a storage bucket, ran the same product sheet again, and warm editorial photography turned into neon cyberpunk anime.</p><p>Same agents, same prompts, zero edits.</p><p>Here’s how I built it, step by step.</p><p>If you read my previous article — <a href="https://medium.com/google-cloud/stop-playing-the-lottery-with-ai-yet-another-guide-that-finally-makes-it-click-0a71fe37889b"><em>Stop playing the lottery with AI: yet another prompting guide (that finally makes it click)</em></a> — you know the golden rule: structuring your prompts with a clear role, context, constraints, and examples turns erratic AI outputs into predictable, high-quality results.</p><p><strong>But in an enterprise setting, structured prompts hit a hard ceiling.</strong></p><p>If you’ve ever run a marketing workflow with a gen-AI chat, you know the usual routine: manually copying and pasting prompt after prompt — ask for a specific format, clearing negative space on the left, checking tone of voice, paste the list of words legal doesn’t allow, start over when it forgets the layout rules— turns you into a human copy-paste machine. (If you want to see how grueling that manual back-and-forth really is, check out my companion piece: <a href="https://medium.com/google-cloud/why-one-shot-prompts-fail-the-engineers-guide-to-prompt-chaining-5ccb8d309ddf"><em>Why One-Shot prompts fail: the engineer’s guide to prompt chaining</em></a>).</p><p>Even a perfect prompt is still <em>a prompt</em>. You paste it every time, into a tool that has never seen your company’s documents.</p><p>So here’s the plan. In <strong>Gemini Enterprise</strong>, we build a small team of AI agents that:</p><ol><li>turns a product spec sheet into a brand-compliant 21:9 key visual;</li><li>reads the company’s <em>real</em> manuals from Cloud Storage, instead of having them pasted into a chat;</li><li>follows the manuals when they change, so updating a document is enough to update the behavior of the whole team.</li></ol><p>That is the difference between <em>prompting a chatbot</em> and <em>giving an agent access to your company’s knowledge</em>.</p><blockquote>⚠️ <strong>Keep in mind!</strong> “No-code” here means no code is written or deployed. The workflow logic is still natural-language system prompts, so think of it as prompt engineering with a UI. And the 4-phase flow lives in the conversation, not in a workflow engine: an agent can occasionally skip or mix up a phase. Same rule as last time: check what you get.</blockquote><p>Ready? Let’s set the stage.</p><p>Our scenario revolves around <strong>Bit&amp;Butter Tech</strong>, a fictional company that builds inclusive technology: dual-interface tablets for seniors, portable 5G hotspots, and more. <em>(Fictional, of course: it’s just an example.)</em></p><p>Whenever the product engineers hand us a Product Spec Sheet, our marketing team has to deliver three things:</p><ul><li>a campaign <strong>concept </strong>aligned with company directives and internal policies</li><li>a <strong>key visual</strong> in the format our brand requires</li><li>a <strong>claim</strong> that passes legal and corporate review.</li></ul><p>Those rules are not in anyone’s head. They live in three official documents:</p><ul><li><strong>Art Direction &amp; Mockup Guidelines</strong> (Creativity_Mockup_Manual.docx): the photographic style, the required format, where the subject sits in the frame, and three Brand Archetypes.</li><li><strong>Copywriting &amp; Tone of Voice Manual</strong> (Copywriting_Manual.docx): a reassuring, solemn voice and the “Two-Beat Brevity” rule: a goal, a promise, and 3 to 5 words in total.</li><li><strong>Brand Safety &amp; Legal Compliance Policy</strong> (BrandSafety_Manual.docx): blacklisted claims like “free” or “the best”, no competitor names, and mandatory disclaimers.</li></ul><blockquote><strong>ℹ️</strong> <strong>Demo kit:</strong> the product spec sheets and the three manuals, in English, are in the DEMO_EN/ folder of the companion <a href="https://github.com/ricmest/ws-gcp-gemen/tree/main/agent-designer/DEMO_EN">repo</a>.</blockquote><p><strong>Why Gemini Enterprise and not a consumer chat?</strong> <br>Because the rules above are exactly what people paste into consumer tools, and that is where the risk starts. Gartner’s research points the same way: in a <a href="https://www.gartner.com/en/newsroom/press-releases/2025-11-19-gartner-identifies-critical-genai-blind-spots-that-cios-must-urgently-address0">survey of 302 cybersecurity leaders</a> (March to May 2025), 69% of organizations suspected or had evidence that employees were using prohibited public GenAI tools. Gartner also predicts that by 2030 more than 40% of enterprises will face security or compliance incidents linked to unauthorized shadow AI.</p><p><a href="https://docs.cloud.google.com/gemini/enterprise/docs">Gemini Enterprise</a> brings AI under corporate control, ensuring companies dictate who has access, how data is handled, and what guardrails are in place.</p><blockquote>⚠️ Comparing enterprise AI platforms is a whole subject in itself, which I’ll dive into in a dedicated post. Stay tuned!</blockquote><h3>Setup the environment</h3><blockquote>⚠️ Before we dive in, let’s talk a bit <strong>about costs</strong>. <br>As of October 2026, Google Enterprise offers a 30-day free trial. However, these technologies and related products literally change day by day and country by country, so be sure to check the current terms that apply to you before you get started, and make sure to delete the resources at the end (the last section shows how).</blockquote><p><strong>Time:</strong> about 10min.</p><h4>1. Activate Gemini Enterprise</h4><ol><li>In the Google Cloud Console, search for <strong>Gemini Enterprise</strong> and start the free trial.</li><li>If an error appears right after you click, refresh the page until the button changes to <strong>Create your first app</strong>. <em>(This is a quirk I hit while testing, so it may not happen to you.)</em></li><li>Create an app called BitAndButter. Keep the default settings.</li><li>Under <strong>Integration</strong>, select <strong>Use Google Identity</strong> as the identity provider.</li></ol><h4>2. Create the bucket</h4><p>Cloud Storage is where the manuals live. Bucket names are globally unique and visible to other users, so don’t use personal information. Use your project ID or a random suffix:</p><ul><li>Bucket name: bit-and-butter-7f3k2q <em>(example)</em></li><li>Location: choose a region that is eligible for the free trial.</li></ul><blockquote>⚠️ <strong>Keep in mind! </strong>Not all regions are, so check the up to date list of supported regions in the <a href="https://docs.cloud.google.com/free/docs/free-cloud-features?hl=en#storage">documentation</a> before creating the bucket.</blockquote><ul><li>Access control: <strong>uniform</strong> <em>(the default; check it when you create the bucket)</em></li></ul><p>Then create a folder called MarketingShared and upload the three manuals:</p><ul><li>Creativity_Mockup_Manual.docx</li><li>Copywriting_Manual.docx</li><li>BrandSafety_Manual.docx</li></ul><p><strong>Permissions.</strong> In a real setup, whoever can write to this bucket can change the brand and legal rules. For this demo, enable <strong>object versioning</strong>, so every change can be rolled back.</p><h4>3. Connect the bucket as a data store</h4><p>In <strong>Gemini Enterprise → Data Stores</strong>, add a <strong>Cloud Storage</strong> connector, name it MarketingSharedand point it to your_bucket/MarketingShared.</p><p>Now you have to choose how the agents receive updates. The connector doesn’t open your file each time an agent asks something. It builds a search index from the files, and the agents search that index. So after you change a file, the index has to be updated. There are several ways to do that:</p><ul><li><strong>One time:</strong> the index is built once, when you create the connector, or when you run a manual re-import. It’s simple and predictable, but changes arrive only when someone triggers a re-import.</li><li><strong>Scheduled sync:</strong> the index is refreshed at set intervals (every one, three or five days). Changes arrive without manual steps, but there’s a delay between the edit and the effect.</li><li><strong>Streaming:</strong> changes are picked up as they happen, with the shortest delay.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Ic8q4sElrymSkAzRIstWmw.png" /></figure><p><strong>What we use in this demo:</strong> <strong><em>one time</em></strong>, with a manual re-import when a manual changes. The cause and effect are easy to see: you change a file, you re-import, and the visual changes. In a production setup, a scheduled sync is usually the better choice, if you can accept a delay between the edit and the agent’s behavior.</p><h4>4. Enable the agent features</h4><p>In the Cloud Console, search for <strong>Gemini Enterprise</strong> and select your application.</p><blockquote>This is where the organization has complete control over the environment — deciding what employees can and cannot do, enabling or disabling specific tools and features, defining policies, and configuring security settings.</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*RQhO0iWLHujkEZk8tTtq_w.png" /></figure><p>Then go to <strong>Configurations &gt; Feature Management</strong> and turn on:</p><ul><li>✅ Enable chat agents</li></ul><blockquote>⚠️ <strong>Keep in mind!</strong> Test each change to a manual before you rely on it. If the index doesn’t update, the agents keep answering from the old version, with no warning.</blockquote><h3>The Agent Architecture (Why Sub-Agents?)</h3><p>Instead of building a monolithic “Frankenstein” prompt that tries to do everything at once, we are using a <strong>Coordinator + Sub-Agents</strong> architecture.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*t22RVeYtnxQ_XFov1LvXpA.png" /><figcaption>The agent architecture</figcaption></figure><p>Breaking complex workflows into specialized sub-agents prevents attention loss (“lost in the middle”), allows selecting the right model for the job (e.g., Gemini Pro for orchestration vs. Flash for speed), and enforces the <strong>Principle of Least Privilege</strong> (each agent only accesses the tools and files it needs).</p><p>Here is our team layout:</p><pre>User uploads Product Sheet (.docx)<br>       │<br>       ▼<br>[Coordinator: DraftGenerator 9] (Creative Director)<br>       │<br>       ├──► Phase 1: Calls [01SceneGen]<br>       │      • Reads user&#39;s Product Sheet <br>       │      • Queries Creativity_Mockup_Manual.docx (via GCS Connector)<br>       │      • Pitches 3 scenes based on Brand Archetypes<br>       │<br>       ├──► Phase 2: User chooses scene ──► Calls [02DraftGen]<br>       │      • Extracts layout rules (21:9, 35mm, right-aligned subjects, left Copy Space)<br>       │      • Crafts master prompt &amp; hands off to Coordinator<br>       │      • Coordinator generates base visual<br>       │<br>       ├──► Phase 3: Coordinator checks Copy &amp; Legal manuals ──► Proposes 10 compliant claims<br>       │<br>       └──► Phase 4: User picks claim ──► Coordinator renders final key visual.  </pre><h4>Step 1: Configuring the Agents (Copy-Paste Prompts)</h4><p>In the Gemini Enterprise <strong>Agent Designer (1)</strong>, skip the prompt and open the <strong>Agent Builder </strong>directly by clicking on <strong>Build manually (2)</strong>, and configure the following three agents.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*fdbb2f7AMFkXc1Grl6I-zw.png" /></figure><p>1. Root Agent: <strong>00DraftGenerator</strong>(Coordinator)</p><p>The Creative Director. Handles the 4-phase state machine, human approval gates, image generation, and claim validation.</p><ul><li><strong>Connectors Enabled:</strong> MarketingShared (Cloud Storage).</li><li><strong>Instructions</strong>:</li></ul><pre>You are the Creative Director and Coordinator Agent of &quot;Bit&amp;Butter&quot;. Your exclusive task is to welcome the user, oversee the 4-phase workflow, and generate images.<br><br>ROUTING AND WORKFLOW MANAGEMENT RULES:<br><br>Start (Phase 1): When the user uploads a product spec sheet, thank them briefly and immediately transfer both the document and control to sub-agent 01SceneGen.<br><br>Transition to Phase 2: When the user chooses one of the proposed scenes, immediately transfer control to sub-agent 02DraftGen.<br>IMPORTANT: When 02DraftGen returns control to you, stop and ask the user if they want you to proceed with generating the image.<br>- If the user confirms, generate the image (or invoke your image generation tool), display the image in the chat, and write to the user: &quot;Base image generated according to guidelines. Next step: the Copywriting team (Phase 3) will craft 10 claim proposals. Do you confirm this visual framing to proceed?&quot;<br>- If the user does not wish to generate the image right now, move directly to Phase 3.<br><br>Transition to Phase 3: When the user confirms that the generated image looks good:<br>STEP 1: Rule Retrieval (via Connector)<br>- Query &quot;MarketingShared&quot; to read the &quot;Copywriting_Manual&quot; and extract: Institutional Tone of Voice, metric architecture of the claim, punctuation rules, and maximum length constraints.<br>- Query &quot;MarketingShared&quot; to read the &quot;BrandSafety_Manual&quot; and extract: blacklisted forbidden terms, competitor policy, and legal clauses.<br>Generate 10 numbered text claims that are coherent with the scene approved in the previous phases and jointly respect all extracted metric rules and compliance filters.<br>Response to the user:<br>- Present the numbered list from 1 to 10 of the crafted claims.<br>- Next Step &amp; Closing: &quot;Next step: I will apply the selected claim inside the image&#39;s Copy Space, harmonizing contrast, font, and legibility according to our guidelines. Which of these 10 claims would you like to apply to the visual?&quot;<br>Wait for the user&#39;s choice.<br><br>Transition to Phase 4: When the user confirms the claim to use:<br>STEP 1: Visual Parameter Retrieval (via Connector)<br>- Query &quot;MarketingShared&quot; to read &quot;Creativity_Mockup_Manual&quot; and extract the criteria for inserting the claim and managing the copy space.<br>- Ask the user if they want to proceed with generating the final image.<br>STEP 2:<br>- If the user confirms, update the image generated in Phase 2 by inserting the text claim into the reserved area (Copy Space), applying the typographic criteria defined in &quot;Creativity_Mockup_Manual&quot;.<br>- If the user does not confirm, reply: &quot;Understood. Here is the prompt we created: [INSERT ENGLISH PROMPT HERE] and this is the claim you chose: [INSERT CLAIM HERE]. Whenever you are ready to generate the final image, type &#39;Generate final image&#39;.&quot;<br><br>BEHAVIORAL RULES:<br>- Maintain an authoritative yet encouraging Tone of Voice.<br>- If the user makes an out-of-context request or tries to skip a phase, gently guide them back to the workflow by indicating the current step.<br>- If a sub-agent reports an error (e.g., &quot;File not found&quot;), communicate the interruption to the user and ask them to verify the requirements before restarting.</pre><p>2. Sub-Agent 01: <strong>01SceneGen </strong>(Parsing &amp; Scene Ideation)</p><p>Extracts product facts and matches them with brand narrative archetypes.</p><ul><li><strong>Connectors Enabled:</strong> Enable MarketingShared connector for the cloud manual.</li><li><strong>Instructions</strong>:</li></ul><pre>You are Bit&amp;Butter&#39;s Sub-Agent specialized in &quot;Scene Parsing and Ideation&quot;. Your task is to analyze the product spec sheet provided by the Coordinator, retrieve the guidelines from Cloud Storage, and propose 3 visual directions.<br><br>STRICT TOOL AND FILE MANAGEMENT: You must execute data retrieval in THIS EXACT ORDER to avoid system conflicts:<br><br>STEP 1: Product Spec Sheet Reading (via Code Interpreter)<br>Use your internal file tool (file_and_coding_agent) EXCLUSIVELY to read and extract text from the document uploaded by the user (e.g., &quot;BBGoAnywhere.docx&quot; or &quot;BBPadFamily.docx&quot;). Important: DO NOT ask file_and_coding_agent to search for the creativity manual, because it does not have access to the cloud bucket.<br><br>STEP 2: Manual Reading (via Connector)<br>Once the product text is extracted, directly use the &quot;MarketingShared&quot; Cloud Storage connector (via ingestion_search) to find and read the file &quot;Creativity_Mockup_Manual.docx&quot;.<br>Extract the brand&#39;s &quot;Narrative Archetypes&quot; from this document.<br>MANDATORY STOP: If the connector cannot find the file or extraction fails, retry using a different search query. If you still cannot find the file, halt the process and reply: &quot;System Error: I was unable to read the Creativity Manual from the MarketingShared bucket.&quot;<br><br>OPERATIONAL WORKFLOW (Once all data is collected):<br>1. Analysis: Summarize from the product spec sheet: Product Name, Mission, Target Audience, and Key Specifications.<br>2. Creation of the 3 Scenes: Using the Narrative Archetypes extracted from the manual, translate the product into 3 visual scene proposals (each associated with one of the three archetypes).<br>3. Output for the User: Generate your response structured as follows:<br>   - Confirmation: &quot;Spec sheet for [Product Name] acquired. I have consulted the Creativity Manual.&quot;<br>   - Proposals: Bulleted list of the 3 scenes (Archetype, Subjects, Action, Atmosphere).<br>   - Closing: &quot;Next step: once you approve the narrative direction, the team will generate the base visual applying our compositional layout. Which of these 3 creative visions would you like to develop?&quot;<br><br>Stop and wait for the user&#39;s response.</pre><p>2. Sub-Agent 02: <strong>02DraftGen</strong> (Art Direction)</p><p>The visual architect. Translates the chosen scene and technical framing rules into the master image generation prompt.</p><ul><li><strong>Name:</strong> <strong>02DraftGen</strong></li><li><strong>Description:</strong> Sub-agent specialized in Art Direction that retrieves visual parameters from the brand book and crafts the master image generation prompt.</li><li><strong>Connectors Enabled:</strong> MarketingShared (Cloud Storage).</li><li><strong>Instructions</strong>:</li></ul><pre>You are Bit&amp;Butter&#39;s Sub-Agent specialized in &quot;Art Direction&quot;. Your task is to retrieve the visual directives from the brand book, craft the perfect image prompt, and hand it over to the Coordinator (Root Agent) so they can generate the image.<br><br>ENABLED CONNECTORS: &quot;MarketingShared&quot; (read access to the bucket).<br><br>MANDATORY OPERATIONAL WORKFLOW:<br><br>STEP 1: Visual Parameter Retrieval<br>Query &quot;MarketingShared&quot; to read the file &quot;Creativity_Mockup_Manual.docx&quot;.<br>Extract: aspect ratio, visual/photographic style and lens, framing, asymmetric layout distribution (Copy Space), and lighting/atmosphere.<br><br>STEP 2: Prompt Creation<br>Create a detailed visual prompt in English combining the scene chosen by the user with ALL the extracted technical parameters.<br><br>STEP 3: Hand-off to the Coordinator<br>Write EXACTLY this text message in the chat to pass the data back to your Coordinator:<br>&quot;I have completed the art direction. Coordinator, please proceed to generate the image using your native capabilities with this exact visual prompt: [INSERT ENGLISH PROMPT HERE]. Once you have shown the image to the user, ask them to confirm the framing to move to Phase 3 on Claims.&quot;<br><br>Do not invoke image generation tools yourself. Stop and let the Coordinator (Root Agent) take control by reading your message.</pre><blockquote><strong>⚠️ Keep in mind! </strong>Generating text directly inside AI images works for quick mockups, but it’s rarely brand-perfect. For production assets, true typography and layout precision still require a dedicated design tool or a post-processing step.</blockquote><h3>Testing the workflow</h3><p>Now open the chat in DraftGenerator and upload BBPadFamily.docx.</p><p>Observe how seamlessly the team executes:</p><ol><li>01SceneGen parses the tablet specs and suggests 3 emotional scenes rooted in our Brand Archetypes (<em>The Human Bridge</em>, <em>Everyday Autonomy</em>, <em>The Collective Dimension</em>).</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*iWCdIwBWpoob7-mq9ojZeA.png" /><figcaption>01SceneGen subagent at work</figcaption></figure><ol><li>You select <em>Scene 1</em>. 02DraftGen builds the master prompt enforcing the <strong>21:9 panoramic aspect ratio</strong>, <strong>35mm cinematic lens</strong>, <strong>subjects on the right</strong>, and <strong>negative Copy Space on the left</strong>.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*6ZVZsUL-4k9GJ8tc8sbStw.png" /><figcaption>02DraftGen subagent at work</figcaption></figure><ol><li>00DraftGenerator checks Copywriting_Manual.docx and BrandSafety_Manual.docx, serving up 10 compliant claims adhering to the <strong>Two-Beat Brevity</strong> structure (e.g., <em>&quot;Every generation. One family.&quot;</em>).</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*V-x3-zGd0IGXmBoR94dLUw.png" /><figcaption>00DraftGenerator subagent at work</figcaption></figure><ol><li>You pick a claim, and the agent renders the final key visual with the typography placed inside the Copy Space.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*fk23nj5XGx7JPceHfHvYRw.png" /><figcaption>Final key visual</figcaption></figure><p><strong>⚠️ Keep in mind!</strong> If the agent struggles to generate images and returns a generic error, skip the intermediate image generation steps by declining them along the way. Instead, run the single command “Generate final image” when the coordinator offers it at the very end of the workflow.</p><h3>The Real Power: The Agent as a Living Colleague</h3><p>Here is the real revelation: <strong>companies are constantly evolving</strong>.</p><p>When brand guidelines or legal policies change, you shouldn’t have to rewrite 50 different prompts across your organization. Like a reliable human colleague, your agent already knows where the shared folder is — and simply checks the latest version before getting to work.</p><h3>Proving it: the Cyberpunk rebrand</h3><p>Imagine Bit&amp;Butter rebrands overnight from warm editorial photography to <strong>High-End Cyberpunk Anime</strong> (neon lighting, saturated palette, cel-shading).</p><p>We don’t touch a single prompt or line of configuration in our agents. Instead:</p><ol><li>In your Cloud Storage bucket (MarketingShared), overwrite Creativity_Mockup_Manual.docx with the file from DEMO_EN/MarketingShared_Var01/.</li><li>In <strong>Gemini Enterprise &gt; Data Stores</strong>, click <strong>Re-import</strong> on the connector.</li></ol><blockquote><strong>⚠️ Keep in mind! </strong>Data Stores do not update instantaneously. Document parsing, chunking, and embedding generation can take anywhere from a few minutes to half an hour depending on document size and queue traffic. Always check that the ingestion status has returned to “Completed” in the console before running your validation prompts, otherwise your agents will continue serving responses from the cached index.</blockquote><p>Run the exact same product sheet through the agent again.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*iFk_C4ge32vtSfmEZjyPaQ.jpeg" /></figure><p>The agent automatically pulls the updated manual. It retains the 21:9 ratio, the right-side subject placement, and the compliant claims — but the resulting visual is now a dramatic, neon-soaked Cyberpunk Anime concept!</p><h3>The Series Roadmap</h3><p>Building enterprise agents is an iterative journey. To explore each layer in depth:</p><ul><li><a href="https://medium.com/google-cloud/stop-playing-the-lottery-with-ai-yet-another-guide-that-finally-makes-it-click-0a71fe37889b"><strong>Stop playing the lottery with AI: a 10-step blueprint to reliable prompts:</strong> </a><br>A hands-on walkthrough showing beginners how to get more predictable, higher-quality results from Google Gemini.</li><li><a href="https://medium.com/google-cloud/why-one-shot-prompts-fail-the-engineers-guide-to-prompt-chaining-5ccb8d309ddf"><strong>Why One-Shot prompts fail: the engineer’s guide to prompt chaining</strong></a>: Stop asking AI to build everything at once. Here is how step-by-step chaining unlocks deterministic output and lays the blueprint for multi-agent automation.</li></ul><p>Coming soon…</p><ul><li><strong>You probably don’t need an AI Agent. Here’s how to tell</strong>:<br>Not every problem needs an AI agent. Learn how to choose between a prompt, a workflow, a single agent and sub-agents, with a decision framework and a real example.</li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=855c71012e88" width="1" height="1" alt=""><hr><p><a href="https://medium.com/google-cloud/change-the-brand-manual-not-the-prompts-a-multi-agent-marketing-team-in-gemini-enterprise-855c71012e88">Change the brand manual, not the prompts: a multi-agent marketing team in Gemini Enterprise</a> was originally published in <a href="https://medium.com/google-cloud">Google Cloud - Community</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[A tour of the Cloud Run resource types]]></title>
            <link>https://medium.com/google-cloud/a-tour-of-the-cloud-run-resource-types-ac84cca74e35?source=rss----e52cf94d98af---4</link>
            <guid isPermaLink="false">https://medium.com/p/ac84cca74e35</guid>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[gcp-app-dev]]></category>
            <category><![CDATA[google-cloud-platform]]></category>
            <category><![CDATA[google-cloud-run]]></category>
            <dc:creator><![CDATA[Sara Ford (Google)]]></dc:creator>
            <pubDate>Thu, 05 Nov 2026 04:37:38 GMT</pubDate>
            <atom:updated>2026-11-05T04:37:37.576Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*7w8plxRr60U60KA91eaI2Q.png" /><figcaption>Cloud Run product logo</figcaption></figure><p>Let’s explore the 5 different ways you can run code on Cloud Run… but for something a little different… we’ll explore this from your <strong>code’s</strong> point-of-view!</p><ol><li><a href="https://docs.cloud.google.com/run/docs/quickstarts/deploy-container?utm_campaign=CDR_0x2e662603_default_b580883439&amp;utm_medium=external&amp;utm_source=blog">Services</a> — the original</li><li><a href="https://docs.cloud.google.com/run/docs/quickstarts/jobs/create-execute?utm_campaign=CDR_0x2e662603_default_b580883439&amp;utm_medium=external&amp;utm_source=blog">Jobs</a> — containers that run end-to-end</li><li><a href="https://docs.cloud.google.com/run/docs/quickstarts/workerpools/deploy-workerpool?utm_campaign=CDR_0x2e662603_default_b580883439&amp;utm_medium=external&amp;utm_source=blog">Worker pools</a> — continuously running workers without a HTTP endpoint</li><li><a href="https://docs.cloud.google.com/run/docs/quickstarts/functions/deploy-functions-console?utm_campaign=CDR_0x2e662603_default_b580883439&amp;utm_medium=external&amp;utm_source=blog">Cloud Run functions</a> — previously known as Cloud Functions (unless you’re using Cloud Functions for Firebase)</li><li>(<strong>new!</strong>) <a href="https://docs.cloud.google.com/run/docs/quickstarts/instances/create-instance?utm_campaign=CDR_0x2e662603_default_b580883439&amp;utm_medium=external&amp;utm_source=blog">Cloud Run instances</a> — stateful, long-lived singleton workloads for agents or a dev environment</li></ol><p>For this blog post, we’re going to use a Hello World sample for a web service as shown below in Services. You’ll see how the code changes to fit each resource type.</p><h3><strong>1. Services</strong></h3><p><strong>Use Case: </strong>Stateless HTTP server that scales to zero when idle.</p><p><strong>How your code looks: </strong>Note there’s an endpoint for the root `/` route handler</p><pre># main.py<br><br>from fastapi import FastAPI<br>app = FastAPI()<br><br>@app.get(&quot;/&quot;)<br>def hello():<br>    return {&quot;message&quot;: &quot;Hello World!&quot;}</pre><pre>#requirements.txt<br><br>fastapi[standard]</pre><p><strong>How to Deploy:</strong> We’ll use buildpacks to build the container image for us via the --source flag</p><pre>gcloud run deploy hello-service \<br> --source . \<br> --region=europe-west1 \<br> --allow-unauthenticated</pre><p><strong>How to Use: </strong>Retrieve the service URL and curl it.</p><pre>SERVICE_URL=$(gcloud run services describe hello-service --region=europe-west1 --format=&#39;value(status.url)&#39;)<br>curl $SERVICE_URL</pre><h3><strong>2. Jobs</strong></h3><p><strong>Use Case:</strong> Run a container to completion. There’s no idle / warm start or state persistence. No HTTP endpoint. Code is noticeably smaller to print Hello World.</p><pre># main.py<br><br>print(&quot;Hello World!&quot;)</pre><pre># Procfile<br><br>web: python3 main.py</pre><p><strong>How to deploy:</strong> By default, buildpacks expect to build a web app. You’ll need to specify a Procfile to tell Cloud Run how to run the Python script.</p><pre>gcloud run jobs deploy hello-job \<br>  --source . \<br>  --region=europe-west1</pre><p><strong>How to use: </strong>Whenever you’re ready to execute your job, run jobs execute. The wait flag forces your terminal to wait for the job to complete before moving on.</p><pre>gcloud run jobs execute hello-job --region=europe-west1 --wait</pre><p>If you want to combine both the execute command and the deploy command, just add — execute-now to the deploy command.</p><h3>3<strong>. Cloud Run Worker Pools</strong></h3><p><strong>Use Case:</strong> Continuously running workers for background processing (like pulling messages from Pub/Sub, Kafka, or Temporal queues). It has no HTTP endpoint or health-check port.</p><p><strong>How your code looks: </strong>Note the while True loop.</p><pre>import time<br><br>while True:<br>    print(&quot;Hello World! Polling background queue...&quot;, flush=True)<br>    # code goes here, e.g. pulling from PubSub to process a message<br>    time.sleep(10)</pre><pre># Procfile<br><br>web: python3 main.py</pre><p><strong>How to deploy:</strong> You’ll deploy to the worker-pools resource type. Similar to Jobs, you’ll need to use a Procfile for the source deploy.</p><pre>gcloud run worker-pools deploy hello-worker \<br>  --source . \<br>  --region=europe-west1</pre><p><strong>How to use: </strong>Unlike Services (which wait for an HTTP request) or Jobs (which wait for you to execute them), a Worker Pool starts running your container immediately upon deployment!</p><pre># Check the logs to see your worker printing every 10 seconds<br>gcloud run worker-pools logs read hello-worker --region=europe-west1 --limit=10<br><br># Or stream the logs<br>gcloud run worker-pools logs tail hello-worker --region=europe-west1</pre><p><strong>Important! </strong>Because worker pools run continuously and are billed while active, you’ll want to set instances to 0 to take the worker pool offline (set it to inactive, but without deleting it).</p><pre>gcloud run worker-pools update hello-worker \<br>  --region=europe-west1 <br>   --instances=0</pre><h3><strong>4. Cloud Run functions</strong></h3><p><strong>Use Case:</strong> Minimal event-driven or HTTP handler where you only write a single Python function instead of initializing a web framework. You use the open source functions-framework for your specified language, instead of using your own web service (e.g. the FastAPI in the Service example).</p><p><strong>How your code looks:</strong></p><pre># main.py<br>import functions_framework<br><br># note: this is the event handler that you specify with the --function on deploy<br>@functions_framework.http<br>def hello_function(request):<br>    return &quot;Hello from a Cloud Run Function!&quot;</pre><pre># requirements.txt<br><br>functions-framework</pre><p><strong>How to deploy</strong>: When you use the --function flag to indicate you’re deploying a function, the Python runtime automatically provides the functions-framework.</p><pre>gcloud run deploy hello-func \<br>  --region=europe-west1 \<br>  --source . \<br>  --function hello_function \<br>  --allow-unauthenticated</pre><p><strong>How to use: </strong>Just curl your function’s URL</p><pre>FUNCTION_URL=$(gcloud run services describe hello-func --region=europe-west1 --format=&#39;value(status.url)&#39;)<br><br>curl $FUNCTION_URL</pre><h3><strong>5. Cloud Run instances</strong></h3><p><strong>Use Case:</strong> new! Cloud Run resource type (in public preview via gcloud beta). This resource type is designed for stateful, long-lived singleton workloads like personal AI agents (e.g., OpenClaw, Claude/ADK agents) or dev environments.</p><p><strong>How it differs from Services:</strong></p><ul><li><strong>Singleton:</strong> Runs exactly <strong>1 instance</strong> with zero autoscaling.</li><li><strong>Lifecycle:</strong> Runs continuously for up to <strong>7 days</strong> with an automatic restart policy (always, on-failure, never), and you manually stop, start, or restart it.</li><li><strong>Pricing: </strong>Cloud Run instances use shared vCPU with vCPU burst budgets to run continuously for a low, predictable price</li></ul><p>Note we’re switching to europe-west4 (because instances isn’t available in europe-west1)</p><p><strong>How your code looks:</strong></p><pre># main.py<br><br>from fastapi import FastAPI<br>app = FastAPI()<br><br># to see the long live nature of the instance<br>memory_count = 0<br><br>@app.get(&quot;/&quot;)<br>def hello_agent():<br>    global memory_count<br>    memory_count += 1<br>    return {&quot;message&quot;: f&quot;Hello World! In-memory count: {memory_count}&quot;}</pre><pre># requirements.txt<br><br>fastapi[standard]</pre><p><strong>How to deploy: </strong>there is no source deploy at this time in public preview. You’ll have to build the image yourself first for now.</p><pre># 1. Build from source without a Dockerfile using Buildpacks<br>gcloud builds submit --pack image=europe-west4-docker.pkg.dev/PROJECT_ID/cloud-run-source-deploy/hello-instance<br><br># 2. Deploy the singleton Cloud Run Instance<br>gcloud beta run instances deploy hello-instance \<br>  --region=europe-west4 \<br>  --image europe-west4-docker.pkg.dev/PROJECT_ID/cloud-run-source-deploy/hello-instance \<br>  --public</pre><p><strong>How to run: </strong>Curl the instance URL.</p><pre>INSTANCE_URL=$(gcloud beta run instances describe hello-instance --region=europe-west4 --format=&#39;value(status.urls[0])&#39;)<br><br>curl $INSTANCE_URL</pre><p><strong>Important: </strong>Remember to stop your instance when you are done</p><pre>gcloud beta run instances stop hello-instance --region europe-west4</pre><h3><strong>6. Bonus!</strong></h3><p>Wow! If you’ve made it all the way here, you must really like Cloud Run and that’s super cool. Here’s an extra tip. We now have ssh in public preview. This works great with Cloud Run instances. <a href="https://docs.cloud.google.com/run/docs/troubleshooting/ssh?utm_campaign=CDR_0x2e662603_default_b580883439&amp;utm_medium=external&amp;utm_source=blog#before_you_begin">Here’s the tutorial</a> for how you can ssh into your instance.</p><pre># If needed start your instance:<br># gcloud beta run instances start hello-instance --region europe-west4<br><br>gcloud beta run instances ssh hello-instance --region=europe-west4<br><br># Stop your instance:  <br># gcloud beta run instances stop hello-instance --region europe-west4</pre><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ac84cca74e35" width="1" height="1" alt=""><hr><p><a href="https://medium.com/google-cloud/a-tour-of-the-cloud-run-resource-types-ac84cca74e35">A tour of the Cloud Run resource types</a> was originally published in <a href="https://medium.com/google-cloud">Google Cloud - Community</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Google Cloud Professional Agentic Architect Exam Guide: Passing the Exam & Challenge Labs]]></title>
            <link>https://medium.com/google-cloud/google-cloud-professional-agentic-architect-exam-guide-passing-the-exam-challenge-labs-f2694a61d2f9?source=rss----e52cf94d98af---4</link>
            <guid isPermaLink="false">https://medium.com/p/f2694a61d2f9</guid>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[certification]]></category>
            <category><![CDATA[google-cloud-platform]]></category>
            <category><![CDATA[agentic-ai]]></category>
            <category><![CDATA[learning]]></category>
            <dc:creator><![CDATA[Jamie Thompson]]></dc:creator>
            <pubDate>Thu, 05 Nov 2026 04:37:24 GMT</pubDate>
            <atom:updated>2026-11-05T04:37:23.010Z</atom:updated>
            <content:encoded><![CDATA[<h3>From Theoretical Architecture to Hands-On Lab Implementation</h3><figure><img alt="Google Cloud Professional Agentic Architect Badge" src="https://cdn-images-1.medium.com/max/1024/0*1HjkBSogIphJuXGt.png" /></figure><p>In September, I sat the beta exam for Google Cloud’s latest credential: the <strong>Professional Agentic Architect</strong>.</p><p>Google has taken a fundamentally new direction with this track. Rather than relying solely on traditional multiple-choice questions, this is Google Cloud’s first hybrid certification. Earning the badge requires clearing two distinct stages: a proctored theoretical exam (Part 1), followed by a hands-on lab assessment delivered through Google Skills (Part 2).</p><p>Between building applications with Google’s Agent Development Kit (ADK), working across the Gemini Enterprise ecosystem in my day job, and using Antigravity regularly, I was keen to see how my hands-on experience stacked up against Google’s expectations.</p><p>After completing the proctored exam and subsequently clearing the challenge labs, I am now <strong>officially certified as a Google Cloud Professional Agentic Architect</strong>, taking me to <strong>14 active Google Cloud certifications</strong> in total.</p><p>Here is the breakdown of the OnVUE testing setup, what the Part 1 question dynamic felt like, the core architectural domains you need to master, and what to expect when you transition into the live challenge labs for Part 2.</p><h3>The Remote Proctoring Setup: OnVUE vs. Kryterion Webassessor</h3><p>With no local test centres nearby, remote proctoring has been my default for years. If you’ve taken Google Cloud certifications previously, you’ll be well accustomed to Kryterion’s Webassessor portal and Sentinel software. Sitting Part 1 of this exam was my first experience with Pearson VUE’s OnVUE platform following Google’s delivery migration, and the operational differences were noticeable from the start:</p><ul><li><strong>Mobile-first check-in flow:</strong> OnVUE offloads identity and environment verification directly to your phone. Once you launch the session on your laptop, you scan a QR code to capture high-res photos of your ID, snap a verification selfie, and submit four clear angle shots of your workspace (front, back, left, right) before placing the phone out of arm’s reach.</li><li><strong>The queue and proctor sweep:</strong> I logged in 15 minutes ahead of my scheduled window to run automated system, mic, and webcam checks. Once my phone photos were submitted, I entered a queue at position 13, taking just under 15 minutes for a proctor to connect. While Webassessor leaned heavily on background biometric profiles, OnVUE proctors are much more hands-on, requiring me to lift my laptop for an active 360-degree sweep of the entire room, including the space underneath the desk and behind the laptop screen, before unlocking the test.</li><li><strong>The clean-desk reality:</strong> While the delivery platform has changed, the remote testing discipline hasn’t. You still need an entirely cleared workspace: second monitors unplugged and turned away, paper and clutter completely cleared, and your desk kept entirely bare throughout the session.</li><li><strong>Rescheduling flexibility:</strong> Client deliverables ramped up right before my initial test date, forcing me to push my slot back. OnVUE’s rescheduling was remarkably painless compared to Webassessor- there was wide availability across alternative time slots, and the system let me adjust the booking right up to the start time without friction.</li></ul><h3>Exam Structure &amp; The Beta Dynamic</h3><p>Because this was a beta, the format differed slightly from what the final General Availability (GA) exam will look like:</p><figure><img alt="Google Cloud Professional Agentic Architect Beta vs GA Comparison" src="https://cdn-images-1.medium.com/max/764/1*XKpIBHHe49B1Pnp3jWExBw.png" /></figure><p><em>*Note: Unlike standard Google Cloud certifications that grant you two years of peace, this badge is only valid for </em><strong><em>1 year</em></strong><em>. Given the rapid evolution of agentic protocols, security tooling, and the fact that we get a new Gemini model drop almost weekly lately, an annual renewal makes sense.*</em></p><h3>Part 1: Question Pool Dynamic</h3><p>With an uncalibrated beta question pool, the questions largely fell into two styles:</p><ol><li><strong>System design problems:</strong> Questions that test genuine design trade-offs across multi-agent handoffs, token management, and evaluation pipelines. The key is methodically stepping through the data path between the caller, gateway, agent runtime, and backend tools.</li><li><strong>Obvious eliminations:</strong> Questions where several distractors flagrantly violate basic Google Cloud security principles. You can cross them off immediately if an option suggests controlling hard security via system prompts, assigning excessive service account roles, or bypassing code sandboxing.</li></ol><p>Pacing felt comfortable. With 75 questions across 180 minutes, you have roughly 2.4 minutes per question. I wrapped up the exam with about 40 minutes remaining, even after reviewing flagged questions. For GA, Professional Certification exams are usually ~50 questions across 120 minutes.</p><h3>Official Exam Guide Domains &amp; Weightings</h3><p>The technical requirements for both parts map directly across five documented domains from the <a href="https://services.google.com/fh/files/misc/professional_agentic_architect_exam_guide_english.pdf">Professional Agentic Architect Exam Guide</a>:</p><figure><img alt="Google Cloud Professional Agentic Architect Exam Guide Topics" src="https://cdn-images-1.medium.com/max/728/1*FCJdSByzTlfXfsOt6DQ8fw.png" /></figure><h3>Core Technical Themes to Master</h3><p>Whether you are answering architectural questions in the exam, or implementing resources in hands-on labs, the following technical themes form the backbone of the credential:</p><h3>1. The Gemini Enterprise Ecosystem &amp; Low-Code Agents (~13%)</h3><p>To clear this domain, you should be comfortable with:</p><ul><li><strong>End-to-End Architectural Integration:</strong> Understand how user-facing interfaces (such as the Gemini Enterprise app or custom web front-ends) link down into the agent runtime. Know how conversational agents, tool extensions, and grounded search collaborate, and where the architectural boundary sits between low-code configuration and custom code implementations.</li><li><strong>Conversational Flow &amp; CX State Management:</strong> Review how state-based multi-turn dialogues are structured in Agent Designer / CX Agent Studio consoles. Be clear on how pages, transition routes, conditional event handlers, and fallback flows operate to guide user intent and handle unexpected inputs.</li><li><strong>Enterprise Grounding &amp; Data Stores:</strong> Know how to configure managed data stores across structured, unstructured, and multimodal repositories (text documents, audio, and video). Understand how chunking strategies, semantic search, and metadata filtering prevent hallucinations and keep responses strictly grounded.</li><li><strong>Tool Extensions &amp; API Contracts:</strong> Understand how low-code agents invoke external business logic. Review how OpenAPI schemas define tool contracts, how authentication is passed to downstream APIs, and how Agent Gateway enforces ingress and egress policies around tool invocation.</li></ul><h3>2. Using Coding Agents for Application Development (~17%)</h3><p>This domain shifts the focus from building user-facing conversational apps to developer tooling and engineering autonomy, specifically using Google Antigravity and Claude Code on Google Cloud to refactor code, optimise execution runtimes, and patch application-layer vulnerabilities.</p><p>To clear this section, make sure you understand:</p><ul><li><strong>Antigravity Customisation (Rules vs. Skills):</strong> Know how to govern agent behaviour across workspace, directory, and global scopes. Rules enforce non-negotiable architectural boundaries and coding constraints (e.g., via AGENTS.md or .agents/rules/), whereas Skills, plugins, extension hooks, and subagents provide reusable, procedural task workflows.</li><li><strong>Model Context Protocol (MCP) &amp; Tool Access:</strong> Understand how coding agents connect to external environments, file systems, databases, and enterprise services through standard MCP client/server integrations.</li><li><strong>Execution Sandboxing &amp; Isolation:</strong> Recognise the security risks of autonomous dynamic execution. Be clear on when and how coding agents must be confined to isolated execution environments, such as GKE Agent Sandboxes, Cloud Workstations, or Antigravity’s hosted sandboxes, to run untrusted shell scripts and dynamic tests safely.</li><li><strong>Enterprise Tooling with Agents CLI:</strong> Understand how to augment Antigravity using the Agents CLI to script, scale, govern, and optimise coding agents consistently across a team.</li></ul><h3>3. Custom Agent Architecture &amp; ADK (~33%)</h3><p>Section 3 represents a third of the entire syllabus. You need to know how to structure and code multi-agent systems using the Agent Development Kit (ADK).</p><ul><li><strong>Multi-Agent Topologies:</strong> Understand the architectural differences between a centralised orchestrator (supervisor delegating tasks to specialised sub-agents) and decentralised handoffs using Agent-to-Agent (A2A) protocols across different domain teams.</li><li><strong>State Management and Keys:</strong> Know how state flows through an agent runtime. Review how output keys and state prefixes are configured so that parallel sub-agents don’t accidentally overwrite shared context or stomp on conversational history.</li><li><strong>Session State vs. Long-Term Memory:</strong> Be clear on the operational boundary between short-term conversational turns (sessions) and durable user context. Understand how Memory Bank extracts and persists semantic facts across distinct user interactions.</li><li><strong>Agent Workload Identity:</strong> Review how cryptographic identities are assigned to autonomous runtimes. Understand where SPIFFE-based identities and Principal Access Boundaries (PAB) fit when an agent needs to prove its identity to access backend cloud infrastructure.</li></ul><h3>4. Evaluating and Deploying Agentic Workflows (~22%)</h3><p>Deterministic unit tests won’t cut it when you’re evaluating probabilistic model outputs, you need systematic evaluation frameworks.</p><ul><li><strong>Tool Trajectory Evaluation:</strong> Evaluating the final text response of an agent is insufficient. You must evaluate the trajectory, verifying that the agent invoked the correct sequence of tools, passed valid argument schemas, and reached the resolution without entering looping cycles.</li><li><strong>Handling Live Data Drift in Evals:</strong> A frequent challenge with agent evaluation suites is that testing against live APIs causes tests to fail due to changing production data rather than logic bugs. Understand how to design resilient evaluation pipelines using mock data layers, synthetic fixtures, or LLM-as-a-judge patterns to evaluate decision-making independently of live API churn.</li><li><strong>Context Caching:</strong> With long system prompts and extensive tool schemas, context caching is essential to keep latency and billable token counts under control. Focus on how immutable prompt prefixes are cached.</li><li><strong>OpenTelemetry (OTel):</strong> Know how to instrument agent runtimes with distributed tracing to track end-to-end latency across reasoning loops, vector retrieval, and external tool calls.</li></ul><h3>5. Securing and Governing Agentic Workflows (~15%)</h3><p>Security is the most critical design constraint when moving agents from internal prototypes to production systems.</p><ul><li><strong>Agent Gateway Topology:</strong> Treat Agent Gateway as your security perimeter. Be ready to configure both ingress (shielding the runtime from untrusted callers) and egress (strictly scoping the external APIs, databases, or MCP tools the agent can reach).</li><li><strong>Model Armor &amp; Content Safety:</strong> Study how Model Armor hooks into the gateway pipeline. Understand how to configure templates to catch prompt injection, detect jailbreak attempts, and block unsafe content before user inputs reach the model.</li><li><strong>Sensitive Data Protection (SDP):</strong> Know how SDP combines with Model Armor to dynamically mask, tokenise, or redact PII before it gets logged in telemetry or forwarded to downstream tools.</li><li><strong>Delegated Authorisation (User OAuth vs. Service Account):</strong> Pay close attention to credential delegation. When an agent calls an external API, it should rarely use a broad, ambient service account identity. Instead, it should execute the tool using the end user’s delegated OAuth token, ensuring the agent cannot execute actions the calling user does not have permission to perform.</li></ul><h3>Recommended Preparation &amp; Study Resources</h3><p>Because this certification is brand new, the most effective preparation will come from working directly with Google’s official materials and getting hands-on in the console and code:</p><ul><li><strong>The Official Exam Guide:</strong> Start by reviewing the <a href="https://services.google.com/fh/files/misc/professional_agentic_architect_exam_guide_english.pdf">Professional Agentic Architect Exam Guide</a>. Use the five domains as a personal gap analysis to identify which services or runtime patterns you haven’t worked with hands-on.</li><li><strong>Official Sample Questions:</strong> Work through the <a href="https://cloud.google.com/learn/certification/agentic-architect">official sample questions</a> published on Google Cloud’s certification hub. Even though it is a small set, it gives you a clear baseline of how Google frames scenario questions, distractor patterns, and technical tradeoffs.</li><li><strong>Professional Agentic Architect Learning Path:</strong> Make your way through the <a href="https://www.skills.google/paths/4525">Professional Agentic Architect path on skills.google</a>. I didn’t have the time to complete the entire path end-to-end before my beta booking, but I worked through a handful of the core modules beforehand. It is remarkably thorough, goes deep into real implementation patterns, and I highly recommend working through it if you want structured coverage of the full syllabus.</li><li><strong>Hands-On Code Frameworks:</strong> Spend dedicated time inside the open-source Agent Development Kit (ADK) repository. Build out custom multi-agent topologies, trace how state and memory keys flow between agents, and write local trajectory evaluation tests before sitting Part 1 or tackling the Part 2 labs.</li></ul><h3>The Transition: From Part 1 to Part 2 via CertMetrics</h3><p>Once you’ve cleared the architectural theory, you enter the operational handoff to the hands-on labs. While I expect automated email notifications will be in place once the certification rolls out to General Availability, that wasn’t the case during the beta run, I never actually received an email confirming I had cleared the theoretical exam.</p><p>If you’ve completed Part 1 and find yourself waiting around for an email notification, don’t wait on it. Head straight to the source:</p><ol><li>Log directly into the <a href="https://cp.certmetrics.com/google/en/home/dashboard">Google Cloud CertMetrics portal</a>.</li><li>Check your exam history to see if your result has updated to a pass.</li><li>Once your passing status is recorded, you will see the option to launch Part 2 of the certification.</li><li>Clicking that link routes you straight into your assigned hands-on assessment track on <a href="https://www.skills.google">skills.google</a>.</li></ol><h3>Part 2: The Hands-On Challenge Labs</h3><p>Once you launch Part 2 on skills.google, you enter the practical evaluation phase.</p><h3>Lab Structure &amp; Rules</h3><ul><li><strong>3 Challenge Labs Presented — Pass Any 2:</strong> You are presented with a selection of three distinct challenge labs. To achieve certification, you need to successfully pass two of them.</li><li><strong>100% Completion Bar:</strong> Just like standard Google Cloud challenge labs, there is no partial credit. Passing a lab requires achieving a 100% score, progressing through all milestone assessment checks.</li><li><strong>Lab Durations:</strong> Google’s estimated completion times ranged from 45 minutes up to 1 hour 30 minutes depending on the lab complexity. However, the actual allotted lab timer is greater than this, giving you plenty of time if you need to troubleshoot or wait for services to initialise (although this wasn’t an issue for my labs).</li><li><strong>Standard Challenge Lab Format:</strong> If you have completed challenge labs on skills.google before, the process is the same: an objective brief, architecture constraints, and an automated tracking script that evaluates your environment as you complete each phase.</li></ul><h3>Practical Tips for the Challenge Labs</h3><ul><li><strong>Exact Naming Is Non-Negotiable:</strong> Like every challenge lab on skills.google, the automated background grading scripts look for exact string matches. Whether you are provisioning services in the console or running scripts, copy and paste the resource names, IDs, and variables directly from the lab brief. A single typo will fail a milestone check even if the underlying build is functioning.</li><li><strong>Respect Propagation Time:</strong> Avoid hitting “Check My Progress” the millisecond a resource shows as created. Cloud control planes and service bindings can take a minute or two to settle across the environment. Rushing the verification check can result in a false-negative score.</li><li><strong>Read the Whole Brief First:</strong> It’s tempting to jump straight into the first objective, but later tasks often impose constraints on earlier setups. Spend the first five minutes reading through all phases of the scenario so you don’t build yourself into a corner that requires re-deploying resources on the clock.</li></ul><h3>Final Thoughts</h3><p>I really liked the format of this exam. Combining a comprehensive theory test with time-constrained, hands-on challenge labs makes total sense for this domain. Rather than testing purely conceptual designs, it focuses directly on the practical engineering required to build, secure, and productionise agentic systems on Google Cloud.</p><p>While a solid grasp of the theory is essential, the breadth of topics covered means you cannot rely on reading documentation alone. You need genuine hands-on experience across the stack. That means writing custom agents and multi-agent topologies in ADK, configuring security controls like Agent Gateway and delegated auth, and working through the operational realities of taking an agent to production.</p><p>Above all, pay close attention to evaluations. Understanding how to measure tool trajectories, detect looping behaviours, and implement reliable evaluation patterns is critical before deploying autonomous systems into enterprise environments.</p><p>If you sat the beta as well, or you’re gearing up to take the exam once it lands in General Availability, let me know your thoughts or drop any questions in the comments below!</p><p>Thanks for reading! Please feel free to share, <a href="https://www.cloudbabble.co.uk/subscribe">subscribe</a> for updates, or follow me on <a href="https://linkedin.com/in/jamiethompson85">LinkedIn</a>.</p><p><strong>Other Guides:</strong> If you are planning your Google Cloud certification journey or deciding which track to pursue next, check out my other exam breakdowns:</p><ul><li><a href="https://www.cloudbabble.co.uk/">Google Cloud Professional Cloud Developer Exam Guide (2026 Renewal)</a></li><li><a href="https://www.cloudbabble.co.uk/2026-11-03-Google-Cloud-Professional-Agentic-Architect/[https://www.cloudbabble.co.uk](https://www.cloudbabble.co.uk/2026-01-05-google-cloud-professional-database-engineer-exam-guide/)">Google Cloud Professional Database Engineer Exam Guide</a></li><li><a href="https://www.cloudbabble.co.uk/2025-05-14-GoogleCloudGenerativeAILeaderCertification/">Google Cloud Generative AI Leader Certification (GAIL)</a></li><li><a href="https://www.cloudbabble.co.uk/2025-11-18-Google-Cloud-Professional-Cloud-Architect-Exam-Guide-Renewal/">Google Cloud Professional Cloud Architect (PCA) Renewal Certification</a></li><li><a href="https://www.cloudbabble.co.uk/2025-12-05-GoogleCloudDevOpsEngineerExamGuide/">Google Cloud Professional Cloud DevOps Engineer</a></li><li><a href="https://www.cloudbabble.co.uk/2024-02-01-GoogleCloudProfessionalCloudNetworkEngineerCertification/">Google Cloud Professional Network Engineer Certification (PNE)</a></li><li><a href="https://www.cloudbabble.co.uk/2025-01-22-associate-data-practitioner/">Google Cloud Associate Data Practitioner Certification (ADP)</a></li><li><a href="https://www.cloudbabble.co.uk/2022-12-06-GoogleCloudDigitalLeaderCertification/">Google Cloud Digital Leader Certification (CDL)</a></li></ul><p><em>Originally published at </em><a href="https://www.cloudbabble.co.uk/2026-11-03-Google-Cloud-Professional-Agentic-Architect/"><em>https://www.cloudbabble.co.uk</em></a><em> on November 3, 2026.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f2694a61d2f9" width="1" height="1" alt=""><hr><p><a href="https://medium.com/google-cloud/google-cloud-professional-agentic-architect-exam-guide-passing-the-exam-challenge-labs-f2694a61d2f9">Google Cloud Professional Agentic Architect Exam Guide: Passing the Exam &amp; Challenge Labs</a> was originally published in <a href="https://medium.com/google-cloud">Google Cloud - Community</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[GCP ML Project: Explaining Loan Default Risk Predictions with Vertex AI, BigQuery and XGBoost ]]></title>
            <link>https://medium.com/google-cloud/gcp-ml-project-explaining-loan-default-risk-predictions-with-vertex-ai-bigquery-and-xgboost-1b074b683341?source=rss----e52cf94d98af---4</link>
            <guid isPermaLink="false">https://medium.com/p/1b074b683341</guid>
            <category><![CDATA[vertex-ai]]></category>
            <category><![CDATA[explainable-ai]]></category>
            <category><![CDATA[bigquery]]></category>
            <category><![CDATA[google-cloud-platform]]></category>
            <category><![CDATA[xgboost]]></category>
            <dc:creator><![CDATA[Pallav Anand]]></dc:creator>
            <pubDate>Thu, 05 Nov 2026 04:37:18 GMT</pubDate>
            <atom:updated>2026-11-05T04:37:16.856Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ft9OKNj2vvBuvrW2QENXYw.png" /></figure><p>Learn how to run model explainability in Vertex AI !</p><p>This GCP ML project focuses on explaining loan default risk predictions where you train an XGBoost classifier on FICO consumer credit data, register it on Vertex, and run one batch job that returns each borrower’s predicted probability (of RiskPerformance = 1, good credit) plus per-feature attributions in BigQuery.</p><p>🗃️ GCS is used to store the sample input data<br>🔍BigQuery holds the batch input rows and the explanation output table<br>🤖Vertex AI uploads the model and runs batch prediction with explanations enabled</p><p>These services work together to train the model, run batch explanations, and write results to BigQuery.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/900/0*Xf1BXC98S1rzKXlK" /></figure><p>Find the code and CSV file on my github account</p><p><a href="https://github.com/04pallav/gcp-ml-tutorials/tree/main/vertex-batch-explainability">gcp-ml-tutorials/vertex-batch-explainability at main · 04pallav/gcp-ml-tutorials</a></p><h3>🗃️ Step 1 — Upload data to GCS</h3><p>Upload the provided CSV file to your designated Google Cloud Storage (GCS) bucket. This sample data comes from the <a href="https://www.openml.org/d/45023">FICO consumer credit dataset on OpenML</a> — 10,000 borrowers a lender might score and explain. Feature definitions and missing-value codes (-7, -8, -9) are documented on that <a href="https://www.openml.org/d/45023">OpenML page</a>. Each row includes bureau features such as ExternalRiskEstimate, NumInqLast6M, NetFractionRevolvingBurden, MSinceMostRecentDelq, and PercentTradesNeverDelq — outside risk score, recent credit applications, revolving utilization, months since last delinquency, and share of accounts never delinquent.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*mljgDJvqe-5WxhdY.png" /></figure><h3>☁️ Step 2 — Set up cloud shell</h3><p>Set the project and install XGBoost, scikit-learn and the Vertex AI SDK.</p><p>👨‍💻 gcloud config set project your-project-id</p><p>👨‍💻 pip install google-cloud-aiplatform &#39;scikit-learn==1.6.*&#39; &#39;xgboost==2.1.*&#39; matplotlib</p><h3>📊 Step 3 — Load data to BigQuery</h3><p>The load step reads instances.csv and writes the 22 feature columns to BigQuery table heloc_batch_input (the RiskPerformance label stays in the CSV but is not loaded into BigQuery).</p><p>👨‍💻 python batch_explain.py load --instances gs://your-bucket/instances.csv</p><p>Then inspect the rows in BigQuery:</p><pre>SELECT * FROM `your-project-id.ml_explainability.heloc_batch_input` ORDER BY ExternalRiskEstimate DESC LIMIT 10;</pre><p>You should see 10,000 rows from instances.csv.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*JAEC6icddhRV3n4_.png" /></figure><h3>⚙️ Step 4 — Train model</h3><p>The train() method in batch_explain.py fits an XGBoost classifier (binary:logistic) on instances.csv. We predict probability — the chance that RiskPerformance = 1. In this CSV 1 is good credit (that group has the higher average ExternalRiskEstimate) and 0 is bad (90+ days past due), so a low probability means higher default risk.</p><p>We use XGBoost because Vertex’s prebuilt XGBoost container serves Booster.predict(), which returns that probability. The prebuilt scikit-learn container calls .predict() instead, which returns a 0/1 class label for a classifier, so the explanations would attribute a label rather than a probability.</p><p>The train step fits the model and uploads model.bst and train_metrics.png to your bucket.</p><p>👨‍💻 python batch_explain.py train --bucket-uri gs://your-bucket/vertex-batch-explain</p><p>Confirm model.bst landed in gs://your-bucket/vertex-batch-explain/models/.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*Yq3p5Ojz7AAEWsgC" /></figure><p>Check the printed train/test ROC AUC in the terminal. The script also saves train_metrics.png to the same folder — XGBoost feature importances on the left (which features the model relies on most) and the test-set ROC curve on the right.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*ct3tu2XzTAlr7xW9" /></figure><h3>⌛️Step 5 — Run batch explanation job</h3><p>The explain step registers your model on Vertex AI, then starts a batch job that scores every row and writes feature attributions to BigQuery.</p><p>Model.upload() — register the model</p><pre>model = aiplatform.Model.upload(<br>    display_name=&quot;heloc-batch-explain-xgb&quot;,  # name shown in the Vertex AI console<br>    artifact_uri=uri,  # GCS path to model.bst from Step 4<br>    serving_container_image_uri=&quot;us-docker.pkg.dev/vertex-ai/prediction/xgboost-cpu.2-1:latest&quot;,<br>    explanation_parameters=aiplatform.explain.ExplanationParameters(<br>        {&quot;sampled_shapley_attribution&quot;: {&quot;path_count&quot;: 10}},  # Sampled Shapley: 10 permutations per row<br>    ),<br>    explanation_metadata=aiplatform.explain.ExplanationMetadata(<br>        inputs={&quot;input&quot;: {&quot;index_feature_mapping&quot;: FEATURES, &quot;encoding&quot;: &quot;BAG_OF_FEATURES&quot;}},<br>        outputs={&quot;probability&quot;: {}},<br>    ),<br>)</pre><p>Model.upload() registers the model on Vertex AI — GCS artifact + XGBoost serving container + explanation settings. Batch prediction sends each row as a fixed-order list ([55, 144, 58, …]), so BAG_OF_FEATURES and index_feature_mapping tell Vertex which index maps to which feature name in the attributions.</p><p>See <a href="https://docs.cloud.google.com/gemini-enterprise-agent-platform/reference/rest/v1/ExplanationSpec#Encoding">ExplanationMetadata Encoding</a>.</p><p>explanation_parameters picks how attributions are computed. sampled_shapley_attribution with path_count: 10 estimates each feature&#39;s contribution by averaging over 10 random feature permutations (Shapley values). Higher path_count improves the approximation but costs more per row — we use 10 here to keep the tutorial job fast.</p><p>batch_predict() — score + explain every row</p><pre>job = model.batch_predict(<br>    job_display_name=&quot;heloc-batch-explain-job&quot;,  # label in Vertex AI → Batch predictions<br>    instances_format=&quot;bigquery&quot;,<br>    bigquery_source=&quot;bq://your-project-id.ml_explainability.heloc_batch_input&quot;,<br>    predictions_format=&quot;bigquery&quot;,<br>    bigquery_destination_prefix=&quot;bq://your-project-id.ml_explainability.heloc_batch_explanations&quot;,<br>    generate_explanation=True,  # per-feature attributions, not just scores<br>    machine_type=&quot;n2-standard-4&quot;,  # VM size for each prediction replica<br>    batch_size=16,  # rows per request to the model server<br>    starting_replica_count=1,<br>    max_replica_count=1,  # 1 replica — tutorial scale<br>)</pre><p>👨‍💻 python batch_explain.py explain --bucket-uri gs://your-bucket/vertex-batch-explain</p><p>❗ Make sure that all your files and services are in the same location. E.g. both buckets should be in the same location or you will get a similar error message: ‘Cannot read and write in different locations: source: US, destination: EU’</p><p>Open Vertex AI → Batch predictions in the console and wait for JOB_STATE_SUCCEEDED.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/890/0*LtsYBZce2T6_Uc-x" /></figure><h3>🔍 Step 6 — Inspect the explanations in BigQuery</h3><p>After the batch job finishes, open the output table:</p><pre>SELECT * FROM `your-project-id.ml_explainability.heloc_batch_explanations` LIMIT 10;</pre><p>Each row has a prediction and feature attributions — how much each input feature pushed the score up or down for that borrower.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*dy1hMOpTsGzycDps" /></figure><p>The explanation column holds the attributions as JSON. To see them for one borrower, the plot step reads the borrower with the highest predicted probability from heloc_batch_explanations, draws a waterfall chart, and uploads it to your bucket as attribution_example.png.</p><p>👨‍💻 python batch_explain.py plot --bucket-uri gs://your-bucket/vertex-batch-explain</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/990/0*E1Dv05Xel1THtpaw" /></figure><p>Read the chart from the bottom up. It starts at E[f(X)], the baseline prediction, and each bar moves the probability by one feature&#39;s attribution — red pushes it up, blue pushes it down — until it reaches f(x), this borrower&#39;s prediction. The baseline plus all the attributions equals the prediction. The number before each feature name is this borrower&#39;s value for it, and the smallest features are grouped into one row.</p><h3>About</h3><p>GCP ML explainability on consumer credit data — BigQuery in, probabilities + feature attributions out.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1b074b683341" width="1" height="1" alt=""><hr><p><a href="https://medium.com/google-cloud/gcp-ml-project-explaining-loan-default-risk-predictions-with-vertex-ai-bigquery-and-xgboost-1b074b683341">GCP ML Project: Explaining Loan Default Risk Predictions with Vertex AI, BigQuery and XGBoost 🔍</a> was originally published in <a href="https://medium.com/google-cloud">Google Cloud - Community</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Agentic Commerce Protocols — UCP and AP2]]></title>
            <link>https://medium.com/google-cloud/agentic-commerce-protocols-ucp-and-ap2-fc9f7c289e31?source=rss----e52cf94d98af---4</link>
            <guid isPermaLink="false">https://medium.com/p/fc9f7c289e31</guid>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[ucp]]></category>
            <category><![CDATA[generative-ai]]></category>
            <category><![CDATA[google-cloud-platform]]></category>
            <category><![CDATA[ap2]]></category>
            <dc:creator><![CDATA[Mete Atamel]]></dc:creator>
            <pubDate>Wed, 04 Nov 2026 10:13:48 GMT</pubDate>
            <atom:updated>2026-11-04T10:13:48.563Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*GAfvYgDnPhB4f1rG.png" /></figure><p>In my <a href="https://atamel.dev/posts/2026/03-17_agent_protocols_mcp_a2a_a2ui_agui/">Agent Protocols — MCP, A2A, A2UI, AG-UI</a> post back in March, I provided a high-level overview of the main agent protocols for tool use (MCP), agent-to-agent communication (A2A), and agent-to-UI interactions (AG-UI and A2UI).</p><p>Recently, I had a chance to explore two newer protocols focused on <strong>agentic commerce</strong> and <strong>payments</strong>: the <a href="https://ucp.dev/">Universal Commerce Protocol (UCP)</a> and the <a href="https://ap2-protocol.org/">Agent Payments Protocol (AP2)</a>. Traditional e-commerce and payment flows assume a human is directly browsing a website and clicking “Buy” on a trusted checkout screen. When an AI agent shops and pays on your behalf, both the commerce workflow and the cryptographic proof of user authorization need a standard language.</p><p>In this post, I’ll share an update on the agent protocol landscape by introducing <strong>UCP</strong> and <strong>AP2</strong>, explaining how they work together, and walking through the new Python and ADK samples I added to my <a href="https://github.com/meteatamel/genai-beyond-basics/tree/main/samples/protocols">genai-beyond-basics repository</a>.</p><h3>TLDR</h3><p>With UCP and AP2 added to the mix, here’s how the six agent protocols in my repository fit together:</p><ul><li><a href="https://github.com/meteatamel/genai-beyond-basics/tree/main/samples/protocols/mcp"><strong>Model Context Protocol (MCP)</strong></a>: An open protocol, from Anthropic, that standardizes how models and agents access external tools and resources</li><li><a href="https://github.com/meteatamel/genai-beyond-basics/tree/main/samples/protocols/a2a"><strong>Agent2Agent Protocol (A2A)</strong></a>: An open protocol, from Google, that standardizes how agents running on diverse frameworks and platforms communicate</li><li><a href="https://github.com/meteatamel/genai-beyond-basics/tree/main/samples/protocols/ag-ui"><strong>Agent-User Interaction Protocol (AG-UI)</strong></a>: An open protocol, from CopilotKit, that standardizes how agents communicate with user interfaces</li><li><a href="https://github.com/meteatamel/genai-beyond-basics/tree/main/samples/protocols/a2ui"><strong>Agent to UI Protocol (A2UI)</strong></a>: A generative UI protocol, from Google, that enables AI agents to generate rich, interactive user interfaces across web, mobile, and desktop</li><li><a href="https://github.com/meteatamel/genai-beyond-basics/tree/main/samples/protocols/ucp"><strong>Universal Commerce Protocol (UCP)</strong></a>: An open standard, co-developed by Google, Shopify, and industry partners, that standardizes merchant discovery, capability negotiation, and checkout sessions for agentic commerce</li><li><a href="https://github.com/meteatamel/genai-beyond-basics/tree/main/samples/protocols/ap2"><strong>Agent Payments Protocol (AP2)</strong></a>: An open protocol, from Google, that secures agent-initiated payments using cryptographically signed mandates and verifiable credentials</li></ul><p>Let’s look into <strong>UCP</strong> and <strong>AP2</strong> in more detail.</p><h3>Universal Commerce Protocol (UCP)</h3><p><strong>Universal Commerce Protocol (UCP)</strong> is an open standard, co-developed by Google, Shopify, and industry partners (including Target, Walmart, Wayfair, Etsy, and Stripe), that defines functional primitives for agentic commerce. It allows AI agents, consumer platforms, businesses (who remain the Merchant of Record), credential providers, and payment service providers to interoperate without bespoke one-off integrations.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*JnQ8775SucGEVN7H.png" /></figure><h4>Architecture, Discovery, and Capability Negotiation</h4><p>UCP is structured around four layers:</p><ul><li><strong>Services</strong>: Domain groupings such as dev.ucp.shopping, dev.ucp.common, and dev.ucp.lodging.</li><li><strong>Capabilities</strong>: Versioned features (“verbs”) within a service, such as dev.ucp.shopping.checkout, dev.ucp.shopping.cart, and dev.ucp.shopping.catalog.search.</li><li><strong>Extensions</strong>: Optional schemas that augment a parent capability via extends (e.g., dev.ucp.shopping.fulfillment, dev.ucp.shopping.discount, and dev.ucp.common.payment.ap2_mandate).</li><li><strong>Transports</strong>: Transport-agnostic bindings supporting <strong>REST</strong> (OpenAPI 3.1), <strong>MCP</strong> (OpenRPC), <strong>A2A</strong> (Agent Card), and <strong>Embedded</strong> (OpenRPC).</li></ul><p>Every UCP merchant publishes an unauthenticated JSON profile at GET /.well-known/ucp advertising its protocol version, capabilities, payment handlers (com.google.pay, dev.shopify.shop_pay), and JWK signing keys (ES256 as the mandatory baseline, plus optional Ed25519 for Web Bot Auth interop). Permissionless request authentication across HTTP transports uses <strong>HTTP Message Signatures (RFC 9421)</strong> resolved directly against the public keys in each party&#39;s profile. When an agent calls a merchant, UCP uses a <strong>server-selects</strong> negotiation model:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/923/0*bVkL0VKhlfFzRBBi.png" /></figure><p>The merchant computes the intersection between its declared capabilities and the agent’s profile, selects the latest mutually supported YYYY-MM-DD version, and prunes any orphaned extensions whose parent capability isn&#39;t active.</p><p>Once a checkout session starts, dev.ucp.shopping.checkout progresses through six explicit states so an AI agent always knows whether it can finish the purchase autonomously or must hand off to the user:</p><ul><li>incomplete: Missing required details (such as buyer email or shipping method).</li><li>requires_escalation: Requires direct buyer input via a continue_url handoff (e.g., custom configuration or 3DS challenge).</li><li>ready_for_complete: All line items, totals, and fulfillment details are finalized; ready for payment submission.</li><li>complete_in_progress: Checkout completion is currently executing (new PUT updates are rejected while in progress).</li><li>completed: Payment processed and OrderConfirmation (order.id, order.permalink_url) generated.</li><li>canceled: Checkout session was canceled (POST /checkout-sessions/{id}/cancel) or expired.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/811/0*8sIOL2qLkl1_loFt.png" /></figure><blockquote><strong><em>ℹ️ Note:</em></strong><em> All monetary amounts in UCP (and AP2) are expressed in </em><strong><em>minor currency units (cents)</em></strong><em> — for example, </em><em>2500 for </em><em>$25.00, and negative integers like </em><em>-400 for a </em><em>-$4.00 discount.</em></blockquote><h4>UCP Samples: Python SDK &amp; Google ADK</h4><p>In my <a href="https://github.com/meteatamel/genai-beyond-basics/tree/main/samples/protocols/ucp">UCP samples</a> folder, I created two samples using the official <a href="https://github.com/Universal-Commerce-Protocol/python-sdk">UCP Python SDK</a> (ucp-sdk):</p><p>1. <a href="https://github.com/meteatamel/genai-beyond-basics/tree/main/samples/protocols/ucp/hello-world"><strong>UCP Hello World (Python SDK &amp; FastAPI)</strong></a>: A self-contained FastAPI merchant server (<a href="https://github.com/meteatamel/genai-beyond-basics/blob/main/samples/protocols/ucp/hello-world/server.py">server.py</a>) and client script (<a href="https://github.com/meteatamel/genai-beyond-basics/blob/main/samples/protocols/ucp/hello-world/client.py">client.py</a>) that validates payloads against BusinessSchema and Checkout models from ucp_sdk. Because client.py mounts server.py in-process via httpx.ASGITransport by default, you can run the entire 4-step UCP lifecycle in a single command:</p><pre>uv run --with ucp-sdk --with fastapi --with httpx python client.py</pre><pre>=== 1. UCP Discovery (GET /.well-known/ucp) ===<br>Protocol Version:  2026-08-25<br>Services:          [&#39;dev.ucp.shopping&#39;]<br>Capabilities:      [&#39;dev.ucp.shopping.checkout&#39;, &#39;dev.ucp.shopping.fulfillment&#39;, &#39;dev.ucp.shopping.discount&#39;]<br>Payment Handlers:  [&#39;com.google.pay&#39;, &#39;dev.shopify.shop_pay&#39;]<br>Signing Key (kid): merchant_key_2026<br> <br>=== 2. Create Checkout Session (POST /checkout-sessions) ===<br>Checkout ID:       chk_9c35e04f<br>Checkout Status:   incomplete<br>Negotiated Caps:   [&#39;dev.ucp.shopping.checkout&#39;, &#39;dev.ucp.shopping.fulfillment&#39;, &#39;dev.ucp.shopping.discount&#39;]<br>  - 1x Red Roses Bouquet (sku_roses): $25.00<br>  - 1x Ceramic Vase (sku_vase): $15.00<br> <br>=== 3. Update Checkout: Fulfillment &amp; Discount (PUT /checkout-sessions/chk_9c35e04f) ===<br>Checkout Status:   ready_for_complete<br>Totals Breakdown:<br>  - Subtotal                : $40.00<br>  - 10% Promo (SAVE10)      : -$4.00<br>  - Shipping (Express Delivery): $5.00<br>  - Total                   : $41.00<br> <br>=== 4. Complete Checkout (POST /checkout-sessions/chk_9c35e04f/complete) ===<br>Checkout Status:   completed<br>Order Created:     Order #ORD_EF9FCC12 (id=ord_ef9fcc12)<br>Order Permalink:   https://flowershop.example.com/orders/ord_ef9fcc12</pre><p>2. <a href="https://github.com/meteatamel/genai-beyond-basics/tree/main/samples/protocols/ucp/adk"><strong>UCP Shopping Agent with Google ADK</strong></a>: An interactive <a href="https://google.github.io/adk-docs/">Agent Development Kit (ADK)</a> agent (<a href="https://github.com/meteatamel/genai-beyond-basics/blob/main/samples/protocols/ucp/adk/shopping_agent/agent.py">shopping_agent/agent.py</a>) equipped with UCP discovery and checkout tools:</p><pre>root_agent = Agent(<br>    name=&quot;ucp_shopping_agent&quot;,<br>    model=&quot;gemini-2.5-flash&quot;,<br>    description=&quot;AI Shopping Agent that discovers merchants and completes purchases using the Universal Commerce Protocol (UCP).&quot;,<br>    instruction=...,<br>    tools=[<br>        discover_merchant,<br>        create_checkout_session,<br>        update_checkout_session,<br>        complete_checkout_session,<br>    ],<br>)</pre><p>Start server.py in one terminal and adk web in another, and you can ask the agent what the merchant supports and have it negotiate extensions, apply promo codes, and complete an order conversationally.</p><h3>Agent Payments Protocol (AP2)</h3><p>While UCP standardizes the commerce session, a big question remains: <em>How does a merchant or payment processor know that an AI agent actually has the user’s permission to spend their money — and didn’t hallucinate the item or price?</em></p><p>That’s where the <strong>Agent Payments Protocol (AP2)</strong> comes in. Originated by Google, AP2 is an open security and authorization protocol that replaces “trusting the LLM’s text summary” with <strong>Verifiable Digital Credentials (VDCs)</strong> — specifically tamper-evident <strong>SD-JWTs (Selective Disclosure JWTs)</strong> and <strong>KB-SD-JWT (Key-Binding SD-JWT) delegation chains</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*EG6Ru5RlaTqvebRQ.png" /></figure><h4>Trust Boundary, Mandates (v0.2), and Delegation Chains</h4><p>A key rule in the <a href="https://github.com/google-agentic-commerce/AP2/blob/main/docs/ap2/specification.md">AP2 v0.2 specification</a> is the strict separation between <strong>Agentic</strong> (LLM-driven) and <strong>Non-Agentic</strong> (deterministic) roles:</p><ul><li>The <strong>Shopping Agent</strong> is expected to be agentic.</li><li>The <strong>Trusted Surface</strong> (where the user approves and signs mandates) <strong>MUST</strong> be non-agentic.</li><li>Even if a <strong>Merchant</strong>, <strong>Credential Provider</strong>, or <strong>Payment Processor</strong> exposes an agentic interface, <strong>all mandate validation and constraint verification MUST execute in deterministic code</strong>.</li></ul><p>In early AP2 overviews (v0.1), mandates were described conceptually as <em>Intent</em>, <em>Cart</em>, and <em>Payment</em> mandates. In <strong>AP2 v0.2</strong> (and the official ap2.sdk Python package), this is formalized into two linked mandate families — <strong>Checkout Mandates</strong> (securing <em>what</em> is purchased) and <strong>Payment Mandates</strong> (securing <em>how</em> it is paid) — each with an <strong>Open</strong> and <strong>Closed</strong> state, supporting two modes:</p><ol><li><strong>Human Present (</strong><strong>Direct Flow)</strong>: The user reviews the assembled cart on a Trusted Surface and directly signs the <strong>Closed Checkout Mandate</strong> (mandate.checkout.1) and <strong>Closed Payment Mandate</strong> (mandate.payment.1), bound to the merchant-signed UCP checkout_jwt via checkout_hash.</li><li><strong>Human Not Present (</strong><strong>Autonomous Flow)</strong>: The user pre-authorizes an <strong>Open Checkout Mandate</strong> (mandate.checkout.open.1) and <strong>Open Payment Mandate</strong> (mandate.payment.open.1) with deterministic constraints (e.g., allowed merchants, acceptable SKUs, and a maximum budget) and binds the Shopping Agent&#39;s public key in the cnf claim. Later, when the condition is met (such as a price drop), the Shopping Agent signs the <strong>Closed Mandates</strong> with its own private key and chains them onto the user&#39;s open mandates (open_sd_jwt~~closed_kb_sd_jwt~):</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*iSKpG0_HgM9-rCY3ek9A6A.png" /></figure><p>AP2 supports two trust models for issuing the root Mandate on the <strong>Trusted Surface</strong> (<strong>User Credential Model</strong> via OpenID4VP and the browser Digital Credentials API, or <strong>Trusted Agent Provider Model</strong> signed by the agent provider’s key) and enforces two normative presentation rules on the Shopping Agent: <strong>Selective Disclosure Minimization</strong> (revealing only the disclosures required to evaluate the Closed Mandate) and <strong>Sequential Presentation</strong> (preventing concurrent reuse of an Open Mandate across multiple checkouts without a prior rejection receipt).</p><h4>AP2 Sample: Mandate Delegation &amp; Guardrails in Python</h4><p>The official <a href="https://github.com/google-agentic-commerce/AP2">google-agentic-commerce/AP2</a> repository includes full multi-server A2A and MCP scenarios (using Cards or x402 stablecoins), which I documented in my <a href="https://github.com/meteatamel/genai-beyond-basics/tree/main/samples/protocols/ap2">AP2 README</a>.</p><p>However, spinning up four separate servers just to see how AP2 mandates work under the hood can be heavy. So I also built a self-contained <a href="https://github.com/meteatamel/genai-beyond-basics/tree/main/samples/protocols/ap2/hello-world">AP2 Hello World (</a><a href="https://github.com/meteatamel/genai-beyond-basics/tree/main/samples/protocols/ap2/hello-world">mandate_demo.py)</a> sample using the official ap2.sdk package that runs an entire <strong>Autonomous (Human Not Present)</strong> flow in a single script with no API keys required.</p><p>Let’s take a quick look at what’s happening under the hood in <a href="https://github.com/meteatamel/genai-beyond-basics/blob/main/samples/protocols/ap2/hello-world/mandate_demo.py">mandate_demo.py</a>. First, the user (on a Trusted Surface) signs an OpenCheckoutMandate and an OpenPaymentMandate capping the spend at $150.00 (15000 cents), linking to the open checkout mandate hash via PaymentReference, and binding the agent&#39;s public key via cnf:</p><pre>open_checkout_hash = compute_sha256_b64url(open_checkout_token)<br> <br>open_payment_token = client.create(<br>    payloads=[<br>        OpenPaymentMandate(<br>            constraints=[<br>                AmountRange(currency=&quot;USD&quot;, min=0, max=15000),<br>                AllowedPayees(allowed=[merchant]),<br>                PaymentReference(conditional_transaction_id=open_checkout_hash),<br>            ],<br>            cnf={&quot;jwk&quot;: agent_pub_dict},<br>            iat=now,<br>            exp=now + 3600,<br>        )<br>    ],<br>    issuer_key=user_jwk,<br>)</pre><p>When the merchant returns a signed UCP Checkout JWT for $120.00, the Shopping Agent autonomously signs and chains the closed mandates using MandateClient.present(), and the Merchant and Payment Processor deterministically verify the chain (CheckoutMandateChain and PaymentMandateChain):</p><pre>payment_chain_token = client.present(<br>    holder_key=agent_jwk,<br>    mandate_token=open_payment_token,<br>    payloads=[closed_payment],<br>    aud=&quot;credential-provider&quot;,<br>    nonce=&quot;nonce_pay_98765&quot;,<br>)<br> <br>payment_payloads = client.verify(<br>    token=payment_chain_token,<br>    key_or_provider=lambda _tok: user_pub_jwk,<br>    expected_aud=&quot;credential-provider&quot;,<br>    expected_nonce=&quot;nonce_pay_98765&quot;,<br>)<br>payment_chain = PaymentMandateChain.parse(payment_payloads)<br>payment_violations = payment_chain.verify(<br>    expected_transaction_id=checkout_hash,<br>    expected_open_checkout_hash=open_checkout_hash,<br>)</pre><p>You can run the sample with a single uv command:</p><pre>uv run --with &quot;ap2 @ git+https://github.com/google-agentic-commerce/AP2.git&quot; python mandate_demo.py</pre><p>Notice in step 6 how deterministic verification immediately catches and rejects an agent that tries to spend $250.00 against the user&#39;s $150.00 open mandate:</p><pre>=== 1. Generating Keys for User (Trusted Surface), Agent, and Merchant ===<br> <br>=== 2. User Signs Open Mandates on Trusted Surface (SD-JWT) ===<br>Intent: &#39;Buy white running shoes (SKU-SHOE-WHITE) from RunFast Store for at most $150.00&#39;<br>Open Checkout Mandate (SD-JWT): eyJhbGciOiAiRVMyNTYiLCAidHlwIjogImV4YW1wbGUrc2Qtand0IiwgImtpZCI6I...<br>Open Payment Mandate  (SD-JWT): eyJhbGciOiAiRVMyNTYiLCAidHlwIjogImV4YW1wbGUrc2Qtand0IiwgImtpZCI6I...<br> <br>=== 3. Merchant Creates Signed UCP Checkout ($120.00) ===<br>Merchant Checkout JWT Hash: MBOOU7B8tmrp1fickmNKbaLJ74iQRtvSnO2HQ01ILU0<br> <br>=== 4. Shopping Agent Signs Closed Mandates (KB-SD-JWT Delegation Chain) ===<br>Agent appended closed KB-SD-JWT hop to both open mandates.<br> <br>=== 5. Deterministic Verification &amp; Receipt Issuance ===<br>[Merchant] Checkout Mandate Chain verified! Constraints satisfied (0 violations).<br>[Payment Processor] Payment Mandate Chain verified! Amount $120.00 &lt;= $150.00 max.<br>[Shopping Agent] Checkout Receipt verified: {&#39;verified&#39;: True}<br>[Shopping Agent] Payment Receipt verified:  {&#39;verified&#39;: True}<br> <br>=== 6. Guardrail Demo: Agent Tries to Exceed Budget ($250.00 &gt; $150.00) ===<br>[Payment Processor] Rejected over-budget payment! Violations: [&#39;Amount 25000 exceeds maximum 15000&#39;]</pre><h3>UCP vs. AP2: How They Work Together</h3><p>Rather than competing, <strong>UCP</strong> and <strong>AP2</strong> are complementary layers in the agentic commerce stack:</p><ul><li><strong>UCP is the commerce layer</strong>: It standardizes how agents discover stores (/.well-known/ucp), negotiate capabilities, calculate shipping and discounts, and manage checkout sessions.</li><li><strong>AP2 is the cryptographic trust and payment authorization layer</strong>: When UCP’s dev.ucp.common.payment.ap2_mandate extension is negotiated, the session is <strong>Security Locked</strong> (preventing any downgrade to an unsigned checkout). The merchant signs the canonicalized (RFC 8785 JCS) Checkout payload and embeds a detached JWS at checkout.ap2.merchant_authorization, and on POST /checkout-sessions/{id}/complete, the agent submits cryptographically signed AP2 CheckoutMandate (ap2.checkout_mandate) and PaymentMandate (payment.instruments[*].credential.token) credentials bound to that checkout.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*KpBUt3n4gKvL9HFd.png" /></figure><h3>Wrapping up</h3><p>As AI agents move from answering questions to taking real-world actions like shopping and paying, <strong>UCP</strong> provides the standardized commerce primitives while <strong>AP2</strong> provides the cryptographic guardrails to prove user intent.</p><p>Here are some resources to learn more:</p><ul><li><a href="https://ucp.dev/">Docs: Universal Commerce Protocol (ucp.dev)</a></li><li><a href="https://ap2-protocol.org/">Docs: Agent Payments Protocol (ap2-protocol.org)</a></li><li><a href="https://ucp.dev/latest/documentation/ucp-and-ap2/">Docs: UCP and AP2 Integration</a></li><li><a href="https://developers.googleblog.com/under-the-hood-universal-commerce-protocol-ucp/">Blog: Under the Hood: Universal Commerce Protocol (UCP)</a></li><li><a href="https://cloud.google.com/blog/products/ai-machine-learning/announcing-agents-to-payments-ap2-protocol">Blog: Announcing Agent Payments Protocol (AP2)</a></li><li><a href="https://developers.googleblog.com/developers-guide-to-ai-agent-protocols/">Blog: Developer’s Guide to AI Agent Protocols</a></li><li><a href="https://codelabs.developers.google.com/next26/adk-agent-commerce">Codelab: Secure Agent Commerce with AP2 and UCP</a></li><li><a href="https://github.com/meteatamel/genai-beyond-basics/tree/main/samples/protocols">Sample: My UCP and AP2 Samples in genai-beyond-basics</a></li></ul><p><em>Originally published at </em><a href="https://atamel.dev/posts/2026/11-04_agentic_commerce_protocols_ucp_ap2/"><em>https://atamel.dev</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=fc9f7c289e31" width="1" height="1" alt=""><hr><p><a href="https://medium.com/google-cloud/agentic-commerce-protocols-ucp-and-ap2-fc9f7c289e31">Agentic Commerce Protocols — UCP and AP2</a> was originally published in <a href="https://medium.com/google-cloud">Google Cloud - Community</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Supercharging the Gemini App with Custom MCP Connectors, Skills, and Live GitHub Access]]></title>
            <link>https://medium.com/google-cloud/supercharging-the-gemini-app-with-custom-mcp-connectors-skills-and-live-github-access-d82c6cca5d85?source=rss----e52cf94d98af---4</link>
            <guid isPermaLink="false">https://medium.com/p/d82c6cca5d85</guid>
            <category><![CDATA[mcp-server]]></category>
            <category><![CDATA[gemini]]></category>
            <category><![CDATA[google-ai-studio]]></category>
            <category><![CDATA[github]]></category>
            <category><![CDATA[antigravity]]></category>
            <dc:creator><![CDATA[Dazbo (Darren Lester)]]></dc:creator>
            <pubDate>Wed, 04 Nov 2026 02:38:16 GMT</pubDate>
            <atom:updated>2026-11-04T02:38:15.072Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*K8U4Sbm8ROnZ_XqraJWgwQ.png" /><figcaption>Dazbo picking a Google AI surface</figcaption></figure><p>Howdy friends! If you spend as much time playing with Google’s AI ecosystem as I do, you’re probably jumping between different Google tools frequently. Each tool plays a distinct role in your workflow.</p><p>For me, almost all of my serious work — whether creating applications, building sites, or writing blogs — happens inside <strong>Google Antigravity</strong>. Empowered with context, skills, and MCP servers, Agy is the agentic harness that knows my expectations, rules, and all of my GitHub repos — including my dazbo-content writing persona. It&#39;s basically my agentic ghost writer!</p><p>But I also use the <strong>Gemini Web App</strong> (gemini.google.com) and mobile app as my everyday Swiss Army knife. Whether I&#39;m proofreading a LinkedIn post, planning flights, knocking up a video, or asking Gemini to airbrush a rogue pizza box out of a photo, the Gemini App is always ready in a browser tab.</p><p>There was just one friction point: my GitHub context was not available to the Gemini App. My writing persona, reusable skills, and project docs live inside my public and private GitHub repositories. I wanted the Gemini App to have on-demand access to <em>all</em> these repos across <em>every</em> conversation, without manually copy-pasting files like a caveman.</p><blockquote>“Hang on, Dazbo — doesn’t the Gemini app already have a built-in GitHub connector?”</blockquote><blockquote>“It does indeed.”</blockquote><blockquote>“So you just toggled it on and went to the pub?”</blockquote><blockquote>“If only it were that simple.”</blockquote><p>As I quickly discovered, the out-of-the-box GitHub connector in the Gemini web app is not quite what you think it is. Fortunately, Google has added a couple of powerhouse customisation features to the Gemini app: <strong>Custom Model Context Protocol (MCP) Connectors</strong> and persistent <strong>Skills</strong>.</p><p>In this article, I’ll disambiguate where the Gemini App fits alongside Google AI Studio and Antigravity, tour the pre-made connectors, see why the native GitHub connector falls short, and walk step-by-step through wiring up GitHub’s managed remote MCP server.</p><h3>Wait — Which Tool Should I Use?</h3><p>Google drops a lot of products with overlapping capabilities, and their branding can be <em>so much fun</em> to keep up with. Here is how I use these tools in my own workflows:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*L2t6lQhY0lsHQLW6Y9OAiQ.png" /><figcaption>Google AI Tools Ecosystem</figcaption></figure><h4>1. <a href="https://antigravity.google/?utm_campaign=DEVECO_GDEMembers&amp;utm_source=deveco">Google Antigravity</a> (Antigravity Extension for Your Favourite IDE, Antigravity IDE, &amp; Antigravity CLI)</h4><p>Antigravity is Google’s agentic development harness. It’s my daily driver for anything I do that is worthy of its own Git repo. This even includes writing blogs and whitepapers.</p><h4>2. Google AI Studio (<a href="https://aistudio.google.com?utm_campaign=DEVECO_GDEMembers&amp;utm_source=deveco">aistudio.google.com</a>)</h4><p>If you haven’t looked closely at <strong>Google AI Studio</strong> lately, you might still think of it purely as a prompt playground where you tweak temperature sliders and grab a GEMINI_API_KEY. It still does that; but here&#39;s what else you can do with it:</p><ul><li>From the <strong>Playground</strong>, explore the latest Google models — such as Gemini Argon, Gemini Omni, Nano Banana, TTS, Lyria, Live Translate, and Gemma — and toggle grounding with Google Search or Google Maps.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/805/1*ZMMu2-_vripJEeMyXnuAlw.png" /><figcaption>Model selection in the Playground</figcaption></figure><ul><li>Configure models in the UI and open ready-to-execute code snippets in one click. This screenshot shows how easy it is to obtain the code for low-latency real-time audio conversation using gemini-3.8-live, or open it directly in <a href="https://colab.research.google.com/?utm_campaign=DEVECO_GDEMembers&amp;utm_source=deveco">Google Colab</a>.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*nb9Wrfno7S3JKgFH6NhaAQ.png" /><figcaption>Code snippets from AI Studio</figcaption></figure><ul><li><a href="https://aistudio.google.com/apps?utm_campaign=DEVECO_GDEMembers&amp;utm_source=deveco"><strong>Build</strong></a> new applications from a prompt.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*nMORezIIQWm-EW94148Z5Q.png" /><figcaption>Build with AI Studio</figcaption></figure><ul><li>Explore the <a href="https://aistudio.google.com/apps?source=showcase&amp;showcaseTag=featured&amp;utm_campaign=DEVECO_GDEMembers&amp;utm_source=deveco"><strong>Gallery</strong></a> of pre-built agents and applications to use as-is, or <em>remix</em> into your own apps.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*5vuxTCNVlhPh-ZXWxUOPow.png" /><figcaption>Gallery in AI Studio</figcaption></figure><ul><li>Use the <a href="https://aistudio.google.com/usage?utm_campaign=DEVECO_GDEMembers&amp;utm_source=deveco"><strong>Dashboard</strong></a> to manage API keys, link Google Cloud projects, view model usage, or set hard monthly spend limits.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*AZGHEf2GxVd4zebEXEoQDQ.png" /><figcaption>AI Studio Dashboard</figcaption></figure><ul><li><strong>One-Click <em>Cloud Run</em> Publishing, GitHub Sync &amp; Direct Export to Antigravity:</strong> <em>(Tip: If you open a showcase app from the </em><strong><em>Gallery</em></strong><em>, it initially opens in read-only mode — click </em><strong><em>Remix</em></strong><em> in the top-right corner first to create your own editable copy!)</em> Once you own the app, click <strong>Publish</strong> in the top-right header to deploy it straight to Google serverless <strong>Cloud Run</strong>. And what if that prototype needs serious engineering — maybe an automated test suite? Switch to the <strong>&lt;&gt; Code</strong> tab and click <strong>Export</strong> in the top-right corner to <strong>Push to GitHub</strong> or click <strong>Export to Antigravity</strong> to open it directly in <strong>Google Antigravity</strong>!</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*HctClXxfAYhv5JUPv6tb_Q.png" /><figcaption>Export to</figcaption></figure><p>So clearly, AI Studio is an amazing way to rapidly build and deploy an application from scratch. But it’s also great for creating a prototype or seeding a project before working on it in Antigravity.</p><h4>3. The Gemini App (<a href="https://gemini.google.com?utm_campaign=DEVECO_GDEMembers&amp;utm_source=deveco">gemini.google.com</a>) &amp; Mobile App</h4><p>This is your web-based conversational AI assistant and research workspace. It has no access to your local file system or tools.</p><p>Alongside text chats, you can have real-time voice and live camera/screen-sharing video conversations with your assistant, plus:</p><ul><li><strong>Multimodal image, audio &amp; video creation, and in-place editing.</strong></li><li>Integration with Google <strong>Gemini Notebook</strong> (formerly NotebookLM).</li><li>Integration with the <strong>Deep Research Agent</strong>.</li><li>Integration with <strong>Canvas</strong>: A side-by-side workspace for co-writing documents and slide decks (with inline tone/length sliders and one-click export to Google Docs or Slides), transforming notes into infographics, quizzes, or Audio Overviews, and live-previewing interactive HTML/React apps and 3D visualisations (or exporting Python scripts to Google Colab).</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ANAvTtmD0KGq76gJHhhGcA.png" /><figcaption>Gemini App</figcaption></figure><ul><li><a href="https://gemini.google.com/scheduled?utm_campaign=DEVECO_GDEMembers&amp;utm_source=deveco"><strong>Scheduled Actions</strong></a>: Built-in background automation that runs one-off or recurring prompts on a schedule — such as a daily morning tech briefing or weekly project summary.</li><li>Persistent <strong>Skills</strong>: Install skills into the Gemini App and invoke them explicitly with @ or /, or implicitly by letting Gemini activate matching skills automatically. Because these use the open SKILL.md standard, you can share the exact same skill folders with <strong>Google Antigravity</strong> (or any other coding agent).</li><li><a href="https://gemini.google.com/customize/connectors?utm_campaign=DEVECO_GDEMembers&amp;utm_source=deveco"><strong>Connected Apps / Connectors</strong></a>: Links your assistant to first-party Google services (Google Workspace, Gemini Notebook, YouTube Music), over 40 partner integrations (Canva, Adobe, Dropbox, Shopify, monday.com), and custom Model Context Protocol (MCP) servers.</li></ul><p>In my own day-to-day workflow, it’s my favourite tool for anything that doesn’t warrant a full IDE workspace, doesn’t need local tools, or doesn’t require a local Git repo. For example:</p><ul><li>Chatting through ideas out loud with Gemini Live on my phone</li><li>Kicking off some Deep Research, perhaps before persisting in a Gemini Notebook</li><li>Proofreading a LinkedIn post</li><li>Building a quick 3D visualisation in Canvas</li><li>Checking on a recent Google product rebrand (yeah — I have to do this a lot)</li><li>Creating photos and videos</li><li>Comparing flight options</li></ul><h3>A Quick Tour of Pre-Made Connectors in the Gemini App</h3><p>Head to <strong>Settings </strong>→→<strong> Connectors</strong> to open the <strong>Connected apps</strong> hub, where Google groups customisations into <strong>Connectors</strong> and <strong>Skills</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Acrqobpbu8AvysbEe55v3A.png" /><figcaption>Connectors in the Gemini App</figcaption></figure><p>First, take a look at some of the integrations available out of the box:</p><ul><li><strong>Google Workspace:</strong> Read, write, and automate across your Google apps. Draft emails in Gmail, create Google Docs or Sheets, and schedule Calendar events.</li><li><strong>Canva:</strong> Connects to your Canva workspace so you can search your existing Canva folders and designs, generate new presentations or social graphics with your <strong>Brand Kit</strong>, tweak existing templates, resize assets across channels, and export directly to .pptx, .pdf, .png, or .mp4.</li><li><strong>Picsart:</strong> Connects to Picsart’s creative pipeline, unlocking deterministic utilities that raw generative models don’t natively handle — such as true background removal (to .png or .webp), vectorisation for scalable logos and icons, and access to many third-party creative models (like Flux, Ideogram, Recraft, Kling, Runway, and ElevenLabs) right inside your Gemini chat.</li><li><strong>Wispr:</strong> Connect to your Wispr Flow desktop meeting recorder. Let Gemini search your recorded meeting transcripts, scratchpad notes, and action items by participant or date — so you can ask <em>“What did I commit to in yesterday’s architecture sync?”</em> without ever inviting a creepy third-party recording bot into your calls.</li><li><strong>GitHub:</strong> <em>“Import code from public or private repositories, and ask questions about it.”</em> (More on this shortly!)</li></ul><h3>Why I Want GitHub Access in Every Gemini Conversation</h3><p>Everything I build and write in Antigravity lives in GitHub. Not just code and applications, but my article drafts, and presentations too. I keep much of my AI configuration, harness and writing persona in a private GitHub repo.</p><p>So when I’m in the Gemini App or on my phone, I want to say things like:</p><ul><li><em>“Proofread this LinkedIn post using my </em><em>dazbo-content style guide.&quot;</em></li><li><em>“Review this Medium draft against my style guide rules.”</em></li><li><em>“Which public repos have I updated this month?”</em></li><li><em>“How did I structure the ADK evaluation loop in </em><em>harness-engineering-demo?&quot;</em></li></ul><h3>Why the Out-of-the-Box GitHub Connector Is No Good</h3><p>When you see <strong>GitHub</strong> in the <strong>Installed</strong> list, you might assume enabling it gives Gemini tool access to query your GitHub repos on demand. It doesn’t!</p><p>It’s <strong>not</strong> an agentic tool integration. It is a manual <strong>static context importer</strong> attached to the <strong>+</strong> button in the chat bar (<strong>+ </strong>→→<strong> More uploads </strong>→→<strong> Import code</strong>). It has some limitations:</p><ul><li><strong>Manual Per-Chat Uploads:</strong> You must paste a repo URL into a single chat. Start a new chat tomorrow? Import it again.</li><li><strong>Zero Cross-Repo Discovery:</strong> Gemini cannot list your repos or search for files across your account.</li><li><strong>No Live Git Intelligence:</strong> It only ingests a static file snapshot — no commits, PRs, Actions runs, or issues.</li><li><strong>Single-Repo Tunnel Vision:</strong> Mid-conversation, it cannot hop to another repo to check a config file or skill.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*sSOCZ3EZa2iSUJHiR_tDBA.png" /><figcaption>GitHub Connector vs Custom</figcaption></figure><h3>Enter the GitHub Remote MCP Server</h3><p>To get on-demand agentic access across all of our repositories in <em>every</em> chat, we can use <strong>GitHub’s managed remote MCP server</strong> (https://api.githubcopilot.com/mcp/) configured as a <strong>Custom Connector</strong>. This server exposes GitHub&#39;s capabilities to any AI agent, such as the Gemini App.</p><p>Better still, GitHub lets us control which toolsets are exposed — and whether Gemini has <strong>read-write</strong> or strictly <strong>read-only</strong> access — simply via the URL path:</p><ul><li><strong>Default Toolset — Read-Only (</strong><strong>https://api.githubcopilot.com/mcp/readonly):</strong> <em>(Recommended)</em> Safe cross-repo exploration, reading private files/skills, code search, and PR/commit analysis with zero mutation risk.</li><li><strong>Default Toolset — Read/Write (</strong><strong>https://api.githubcopilot.com/mcp/):</strong> Workflows where you also want Gemini to create issues, branches, or PRs directly from chat.</li></ul><p>I use https://api.githubcopilot.com/mcp/readonly so Gemini can read <em>anything</em> across my public and private repos without any risk of a stray prompt pushing a commit or closing an issue.</p><h3>How OAuth 2.0 Works Between Gemini and GitHub</h3><p>Because both the Gemini App and the GitHub MCP server live in the cloud, we don’t want to paste our Personal Access Token (PAT) into our chat. Instead, the Gemini App authenticates with GitHub on your behalf using standard <strong>OAuth 2.0</strong>.</p><p>In a typical OAuth setup between an AI client (like Gemini) and a service provider (like GitHub), there are three pieces of configuration:</p><ul><li><strong>Client ID &amp; Client Secret:</strong> Obtained by registering an <strong>OAuth App</strong> in your GitHub Developer Settings. This gives your Gemini connector its own dedicated identity and lets you revoke access at any time with a single click.</li><li><strong>Authorization Callback (Redirect) URI:</strong> The exact URL inside the client application where GitHub is allowed to send you back (along with a temporary authorisation code) after you click <strong>Authorize</strong>. For security, GitHub strictly validates that the redirect URI requested during login matches the callback URL registered on your GitHub OAuth App.</li></ul><p>To set this up, keep <strong>Gemini</strong> and <strong>GitHub</strong> open in two browser tabs: start in the Gemini App to copy the Redirect URI, paste it into GitHub to register your OAuth App, and then copy the resulting Client ID and Secret back into Gemini.</p><h3>Step-by-Step: Adding the Custom GitHub MCP Connector</h3><p>Let’s wire it up. We’ll create a dedicated OAuth App in GitHub specifically for our Gemini connector.</p><h4>Step 1: Open the Custom MCP Modal in Gemini and Grab the Redirect URI</h4><ol><li>Go to <strong>Settings </strong>→→<strong> Connectors</strong> (<a href="https://gemini.google.com/customize/connectors?utm_campaign=DEVECO_GDEMembers&amp;utm_source=deveco">gemini.google.com/customize/connectors</a>) and click <strong>+ Custom</strong>.</li><li>Paste https://api.githubcopilot.com/mcp/readonly into <strong>MCP server URL</strong>.</li><li>Click <strong>Additional settings </strong>→→<strong> Show more</strong>, then click <strong>Copy redirect URI</strong> underneath <strong>Client ID</strong> and <strong>Client secret</strong>.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*NE1hAjAEJeAw8oDE0bZLeA.png" /><figcaption>Connect custom MCP Server in Gemini App</figcaption></figure><p>This will generate a unique callback URI bound to your Google User ID:</p><pre>https://oauth-redirect.googleusercontent.com/r/user_bound_custom-mcp-&lt;YOUR_GOOGLE_USER_ID&gt;-api_githubcopilot_com</pre><h4>Step 2: Register Your Dedicated OAuth App in GitHub</h4><ol><li>In GitHub, go to <strong>Settings </strong>→→<strong> Developer settings </strong>→→<strong> OAuth Apps</strong> (<a href="https://github.com/settings/developers">github.com/settings/developers</a>) and click <strong>New OAuth App</strong>.</li><li>Set <strong>Application name</strong> to Gemini MCP Connector and <strong>Homepage URL</strong> to <a href="https://gemini.google.com.">https://gemini.google.com.</a></li><li>Paste the exact https://oauth-redirect.googleusercontent.com/r/user_bound_custom-mcp-... URI into <strong>Authorization callback URL</strong> and click <strong>Register application</strong>.</li><li>Copy your <strong>Client ID</strong>, and click <strong>Generate a new client secret</strong> to copy your <strong>Client Secret</strong>.</li><li>Be sure to <strong>Save</strong> (or Update) the App in GitHub.</li></ol><h4>Step 3: Complete the OAuth Handshake in Gemini</h4><ol><li>Return to the <strong>Connect to an MCP server</strong> dialog in Gemini, paste your <strong>Client ID</strong> and <strong>Client Secret</strong>, and click <strong>Next</strong>.</li><li>Click <strong>Authorize</strong> in the GitHub OAuth popup.</li><li>Accept the privacy policy.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*RZWLUobPzuK7hDQjCkyM4w.png" /><figcaption>Custom GitHub MCP Server</figcaption></figure><p>Finally, click <strong>Connect</strong>.</p><p>Once redirected back, <strong>GitHub MCP Server</strong> appears under <strong>Custom apps</strong>:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*abnE6ZRuYSM19LM5MCNQzQ.png" /><figcaption>Custom GitHub MCP Server</figcaption></figure><h3>Testing It Live: Querying Repositories and Loading My Persona</h3><p>In a new Gemini chat, ask a question that needs GitHub access, or tag <strong>@GitHub MCP Server</strong> from the @ menu. For example, when I ran <em>List my public GitHub repos please</em>, Gemini queried the live MCP server and rendered a table of all 33 of my public repositories:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*zC5jNVONvTwYc6MMAO8YIA.png" /><figcaption>Asking Gemini App to list my repos</figcaption></figure><p>Then I can ask something like: <em>“Load my </em><em>seo-audit skill from my </em><em>dazbo-config repo.&quot;</em> Gemini loads the skill from my private repo and lets me know we&#39;re ready to use it.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*CWFrYd9kiB4I72zx9fkZsw.png" /><figcaption>Perform SEO audit using a skill from Gemini App</figcaption></figure><p>Easy peasy!</p><h3>Wrapping Up</h3><p>Antigravity, AI Studio and the Gemini App are all Google AI tools, but they serve different purposes in my daily workflows.</p><p>By wiring <strong>GitHub’s managed remote MCP server</strong> into the Gemini App’s <strong>Custom Connectors</strong> and pairing it with persistent <strong>Gemini Skills</strong>, gemini.google.com evolves from an isolated chat tab into a context-aware workspace. It is connected to my public and private repos, personal docs, and my own style guides and codified persona.</p><p>Give it a go, and let me know in the comments what custom MCP servers and skills you are wiring into your Gemini App!</p><h3>Before You Go</h3><ul><li><strong>Please share</strong> 📢 this with anyone that you think will be interested. It might help them, and it really helps me!</li><li>Please <strong>give me loads of claps</strong>! 👏 (Just hold down the clap button.)</li><li>Please <strong>leave a comment</strong> 💬. Interaction is good!</li><li><strong>Add a star</strong> ⭐ on my repos!</li><li><strong>Follow</strong> 👉 and <strong>subscribe</strong> 🔔, so you don’t miss my content.</li></ul><h3>References and Useful Links</h3><ul><li><a href="https://gemini.google.com/customize/connectors?utm_campaign=DEVECO_GDEMembers&amp;utm_source=deveco">Gemini Web App — Connected Apps</a></li><li><a href="https://gemini.google.com/customize/skills?utm_campaign=DEVECO_GDEMembers&amp;utm_source=deveco">Gemini Web App — Persistent Skills</a></li><li><a href="https://docs.cloud.google.com/gemini/enterprise/docs/connectors/custom-mcp-server/set-up-custom-mcp-server?utm_campaign=DEVECO_GDEMembers&amp;utm_source=deveco">Google Cloud Docs: Set Up a Custom MCP Server Connector</a></li><li><a href="https://docs.github.com/en/copilot/how-tos/provide-context/use-mcp/use-the-github-mcp-server">GitHub Docs: Using the GitHub Remote MCP Server</a></li><li><a href="https://ai.google.dev/gemini-api/docs/ai-studio-quickstart?utm_campaign=DEVECO_GDEMembers&amp;utm_source=deveco">Google AI Studio Quickstart</a></li><li><a href="https://ai.google.dev/gemini-api/docs/aistudio-build-mode?utm_campaign=DEVECO_GDEMembers&amp;utm_source=deveco">Google AI Studio Build Mode</a></li><li><a href="https://ai.google.dev/gemini-api/docs/logs-datasets?utm_campaign=DEVECO_GDEMembers&amp;utm_source=deveco">Google AI Studio — Logs and Datasets</a></li><li><a href="https://antigravity.google/docs/sdk/overview?utm_campaign=DEVECO_GDEMembers&amp;utm_source=deveco">Google Antigravity Documentation</a></li><li><a href="https://dev.to/gde/dialling-our-agents-to-11-my-favourite-mcp-servers-3hbm">Dialling Our Agents to 11: My Favourite MCP Servers</a></li><li><a href="https://dev.to/gde/dialling-our-agents-to-11-agent-skills-you-need-to-be-using-2o2k">Dialling Our Agents to 11: Agent Skills You Need to be Using!</a></li><li><a href="https://medium.com/google-cloud/skills-sprawl-when-too-much-of-a-good-thing-bloats-your-ai-agent-167f907e9dc2">Skills Sprawl: When Too Much of a Good Thing Confuses Your AI Agent</a></li><li><a href="https://medium.com/google-cloud/meet-the-antigravity-extension-gemini-code-assist-on-steroids-33367e5a037c">Meet the Antigravity Extension: Gemini Code Assist on Steroids</a></li><li><a href="https://dazbo.co.uk">Dazbo’s Portfolio</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d82c6cca5d85" width="1" height="1" alt=""><hr><p><a href="https://medium.com/google-cloud/supercharging-the-gemini-app-with-custom-mcp-connectors-skills-and-live-github-access-d82c6cca5d85">Supercharging the Gemini App with Custom MCP Connectors, Skills, and Live GitHub Access</a> was originally published in <a href="https://medium.com/google-cloud">Google Cloud - Community</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[What I Learned Managing a Full Project with Antigravity]]></title>
            <link>https://medium.com/google-cloud/what-i-learned-managing-a-full-project-with-antigravity-8d447e37ce3e?source=rss----e52cf94d98af---4</link>
            <guid isPermaLink="false">https://medium.com/p/8d447e37ce3e</guid>
            <category><![CDATA[gemini]]></category>
            <category><![CDATA[google-antigravity]]></category>
            <category><![CDATA[coding]]></category>
            <category><![CDATA[agents]]></category>
            <category><![CDATA[ai]]></category>
            <dc:creator><![CDATA[Patricio Navarro]]></dc:creator>
            <pubDate>Wed, 04 Nov 2026 02:38:13 GMT</pubDate>
            <atom:updated>2026-11-04T02:38:12.652Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*lrJ6BmNdNyqWZVGY.jpg" /></figure><blockquote><em>How my workflow evolved from solo prompting in AI Studio to managing a multi-model AI team, running parallel subagents overnight, and enforcing strict quality gates.</em></blockquote><p>As a Google Cloud GDE, I love exploring how new tools change the way we build software. If you follow my articles on Dev.to ( <a href="https://dev.to/patitonav">dev.to/patitonav</a>), you might remember when I tested <a href="https://dev.to/gde/testing-antigravity-building-a-data-intensive-poc-at-300kmh-4c57">Antigravity on a high-speed train in Italy</a> and built a Proof of Concept (POC) in a couple of hours. At the time, I described the feeling as moving <strong>“from Coder to Conductor.”</strong></p><p>But a POC is not a real product. What happens when you use AI to build, scale, and maintain a production application over several months?</p><p>Recently, I built a multi-tenant SaaS application on Google Cloud Run and Firebase. The app itself isn’t the point. What matters is that this was my first major project where I used AI across the <strong>entire software lifecycle</strong>: from prototyping and cloud setup to security audits, testing, and overnight refactoring batches.</p><p>Across 180+ commits and 100 Pull Requests, “conducting” a single AI chat stopped scaling. I had to act like an <strong>Engineering Manager of an AI team</strong>: defining team rules ( AGENTS.md), building modular Skills, routing tasks across models ( <strong>Gemini 3.1 Pro</strong>, <strong>Flash 3.8</strong>, <strong>Argon</strong>, and <strong>Claude Opus/Sonnet</strong>), and enforcing quality gates so no agent could approve its own code.</p><p>Here is how my workflow evolved across 5 stages.</p><h3>Stage 1: Solo Coder in the Playground (AI Studio to Antigravity)</h3><p>To go from zero to one, <strong>Google AI Studio</strong> is great. You describe what you want, click elements on the screen to fix UI issues, and get a working web prototype in a couple of days.</p><p>But I hit a wall as soon as I needed to turn that single-user prototype into a <strong>multi-tenant SaaS</strong> with isolated customer data, strict database security rules, automated cloud scripts, and separate Sandbox and Production environments. A browser playground is built for fast UI experiments, not for managing infrastructure, test suites, or git workflows.</p><p>So I exported the code and moved to <strong>Antigravity</strong>.</p><h3>Stage 2: Pair Programmer &amp; Tech Lead (Manual Model Switching &amp; AGENTS.md)</h3><p>At first, I worked 1-on-1 with Antigravity using <strong>Gemini 3.1 Pro</strong> and <strong>Gemini Flash</strong>. Very quickly, I noticed a trade-off between cost and quality:</p><ul><li>Using a heavy reasoning model for everything wastes your token budget on simple tasks.</li><li>Using a lightweight model for everything leads to messy code and missed security edge cases.</li></ul><p>To solve this, I switched models manually inside the same chat: using <strong>Gemini 3.1 Pro</strong> for planning, <strong>Flash</strong> for coding, and <strong>3.1 Pro</strong> for reviewing logic and tests.</p><p>I also hit another common problem: <strong>AI writes too much code.</strong> Ask for a small feature, and it adds extra helpers, unused types, and unnecessary comments. To fix this, I created an AGENTS.md file in the root of my workspace with four core rules:</p><ul><li><strong>DRY (Don’t Repeat Yourself):</strong> Single source of truth for every piece of logic.</li><li><strong>KISS (Keep It Simple, Stupid):</strong> The simplest solution that works is the right one.</li><li><strong>YAGNI (You Aren’t Gonna Need It):</strong> Don’t build features you don’t need right now.</li><li><a href="https://www.cazzmanifesto.org/"><strong>CAZZ</strong></a><strong> (Cut All Zombie Zones):</strong> Delete dead code, unused imports, and commented-out blocks.</li></ul><pre>For AI Agents You are an amplifier of the engineer&#39;s intent, not a generator of volume. Resist the urge to scaffold,<br>boilerplate, or &quot;helpfully&quot; add things that were not asked for. The best contribution is often the smallest one that<br>solves the real problem. Leave the codebase cleaner than you found it. Every piece of code you write is tech debt.</pre><h3>Stage 3: Project Manager (Cleaning Context Bloat &amp; Modular Skills)</h3><p>As the codebase grew, the agent slowed down and started forgetting our conventions. When I asked Antigravity to inspect the workspace, we found massive context bloat: <strong>over 5,400 lines</strong> of default skills for mobile and SQL tools we didn’t use, a huge old session log cached in a local folder, and outdated markdown files we were using to track tasks.</p><p><strong>Too much unused context makes the agent slower, wastes tokens, and causes hallucinations.</strong> Here is how I cleaned it up:</p><ol><li><strong>Deleted Unused Skills:</strong> Removed the irrelevant templates and kept only the skills matching our stack.</li><li><strong>Created Modular Custom Skills:</strong> In Antigravity, a skill is a markdown file with a short YAML header (name and description). Instead of loading every rule into every chat, the agent only loads a skill when it needs it.</li><li><strong>Turned </strong><strong>AGENTS.md into a 20-Line Index:</strong> Instead of a wall of text, AGENTS.md became a short router telling the agent which skill to read for each task.</li><li><strong>Used </strong><strong>/compact After Merging PRs:</strong> Long sessions fill up with terminal and test logs. Running /compact summarizes the conversation and frees up context.</li><li><strong>Moved Tasks to GitHub Issues:</strong> Deleted local task files and told the agent to use the gh CLI, making GitHub Issues and Milestones our single source of truth.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*hISSD7gfqcu0j8v5lj6UJQ.jpeg" /></figure><h3>Stage 4: Engineering Director (Multi-Model Strategy &amp; Quality Gates)</h3><p>As new models arrived in Antigravity, I stopped relying on a single agent and started acting like an <strong>Engineering Director</strong>, assigning each model to the role where it performs best.</p><h3>1. How My Gemini Stack Evolved (3.1 Pro → Flash 3.8 → Argon)</h3><ul><li><strong>Step 1 (Gemini 3.1 Pro + Flash):</strong> Manual model switching inside a single chat.</li><li><strong>Step 2 (Flash 3.8):</strong> Flash 3.8 brought a big jump in speed and tool-calling accuracy. Instead of switching dropdowns manually, I spawned background <strong>Flash 3.8 subagents</strong> to work on focused tickets and run tests at a fraction of the token cost.</li><li><strong>Step 3 (Gemini 4 Argon):</strong> Google’s flagship reasoning model in Antigravity became my permanent <strong>Coordinator and Tech Lead</strong>, holding the full architecture in memory while delegating implementation to Flash 3.8 subagents.</li></ul><h3>2. How I Integrated Claude (Opus &amp; Sonnet) with Gemini</h3><p>Using only one model family creates blind spots. I combined <strong>Claude Opus</strong> and <strong>Claude Sonnet</strong> with my Gemini agents in three ways:</p><ul><li><strong>1. Blank-Page Epic Design:</strong> Use <strong>Claude Opus (Thinking)</strong> to brainstorm new epics and edge cases, then hand the plan to <strong>Argon + Flash 3.8</strong> to build. <em>Why it works:</em> Opus is great at exploring complex user journeys before code exists.</li><li><strong>2. Cross-Model Security Audit:</strong> Run the exact same audit prompt on <strong>Claude Opus</strong> and <strong>Gemini Argon</strong>, then ask Argon to compare and merge both reports. <em>Why it works:</em> Opus catches structural code smells; Argon catches cloud and database security details.</li><li><strong>3. Sonnet + Flash “Skeptical Validators”:</strong> Run a repo review with <strong>Claude Sonnet</strong>, then have Argon spawn parallel <strong>Flash 3.8</strong> subagents to verify each claim against git log and compiler output before creating GitHub Issues. <em>Why it works:</em> Filters out over-engineered ideas (<strong>YAGNI</strong>) and duplicate tickets before they clutter the backlog.</li></ul><h3>3. Subagent Skill Inheritance &amp; Quick Side Queries (/btw)</h3><p>Once I saw that <strong>subagents automatically inherit all workspace skills</strong>, orchestration became simple. My <strong>Argon</strong> Coordinator didn’t need long prompts; it just spawned a <strong>Flash 3.8</strong> worker and told it which skills to follow. And when I had a quick architecture question while subagents ran in the background, the <strong>/btw command</strong> gave me a fast answer without interrupting the active agent.</p><h3>4. Never Let an Agent Grade Its Own Homework (pr-quality-gate)</h3><p>When an agent reviews its own code, it rarely catches its own mistakes. So I created a mandatory pr-quality-gate skill. Before any Pull Request is ready to merge, the Coordinator agent runs four steps:</p><ol><li><strong>Web Standards Check:</strong> Runs a frontend audit skill (modern-web-guidance) to check accessibility, button semantics, and mobile layout.</li><li><strong>3 Parallel Evaluator Subagents:</strong> Spawns three read-only subagents (<em>Frontend/State</em>, <em>UI/Accessibility</em>, and <em>Backend/Security</em>) to audit the diff against DRY, KISS, YAGNI, and CAZZ.</li><li><strong>Parallel Refactoring Subagents:</strong> Spawns worker subagents to fix the findings, with a strict rule that <strong>no two agents edit the same file at the same time</strong>.</li><li><strong>Independent Final Reviewer &amp; Sandbox Test:</strong> A fresh reviewer subagent inspects the final diff, runs all tests, posts an approval comment on the PR, and deploys to Sandbox.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2pf2X2EztgmlcrRE-0m-Nw.jpeg" /></figure><h3>Stage 5: Operations Manager (Shipping 16 Stacked PRs Overnight)</h3><p>After our security and architecture audit, we had <strong>16 tech-debt and security tickets</strong> in the backlog. Solving them one by one in chat would have taken days.</p><p>Instead, I built a parallel-pr-orchestrator skill so Argon could run an overnight batch using four rules:</p><ol><li><strong>Zero Merge Conflicts (Parallel Tracks + Stacked PRs):</strong> I split the 16 issues into <strong>4 parallel tracks</strong> touching completely different files, each running in an isolated git worktree (Workspace: &#39;share&#39;). Within a track, dependent tickets branched on top of each other as <strong>stacked PRs</strong> (main ← PR 1 ← PR 2 ← PR 3).</li><li><strong>Low Token Usage (</strong><strong>Model: &#39;flash&#39;):</strong> <strong>Argon</strong> coordinated the waves, while all Worker, Evaluator, Refactoring, and Reviewer subagents ran on <strong>Flash 3.8</strong>.</li><li><strong>Hardware &amp; Emulator Limits:</strong> To avoid freezing my laptop or causing port conflicts with the local database emulator, I set a limit of <strong>4 parallel workers</strong> and allowed <strong>only one subagent at a time</strong> to run emulator tests.</li><li><strong>Safety Guardrails:</strong> Subagents were not allowed to merge PRs or run deployment scripts overnight.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*9xuu_ATINcqj9dswvUnvAA.jpeg" /></figure><p>At 9:07 PM, I triggered the orchestrator using the <strong>/goal command</strong> (which keeps Antigravity working until the entire goal is finished) and left it running overnight. When I checked at 7:43 AM, all <strong>16 Pull Requests</strong> were open on GitHub with passing tests, independent APPROVED reviews, and zero merge conflicts.</p><h3>Real-World Gotchas (And How /learn Fixed Them)</h3><p>Even with good skills, agents still make mistakes. My favorite habit in Antigravity is running right after correcting the AI. Instead of fixing an issue only in the current chat, /learn writes a permanent rule into AGENTS.md or your skills so no future agent repeats it:</p><ul><li><strong>Broken Local Links in Markdown:</strong> Subagents initially pasted IDE links (file:///...) into README.md and docs/, which break on GitHub. One /learn rule enforced using relative paths across all documentation.</li><li><strong>Trying to Merge Too Early:</strong> An agent tested a new auth provider in Sandbox and wanted to merge to main before it existed in Production. We added a rule never to merge while manual cloud setup is pending, and to automate provider setup in deployment scripts first.</li><li><strong>Missing Post-Merge Cleanup:</strong> Subagents used to stop right when a PR was merged. Now they automatically post a delivery summary on the closed issue, update related tickets, close finished milestones, and delete merged branches.</li></ul><h3>The Verdict</h3><p>Managing a full project lifecycle with AI is very different from building a weekend POC.</p><ul><li>For <strong>experienced engineers</strong>, Antigravity lets you work like an Engineering Manager with a 24/7 team. You focus on architecture, security boundaries, and product decisions, while your agents handle implementation, testing, and refactoring.</li><li>For <strong>junior developers</strong>, go step by step. AI can generate thousands of lines of working code overnight, but “working” is not the same as “maintainable.” Read the diffs, question every architectural choice, and never skip tests.</li></ul><p>To scale your own AI workflow from prototype to production:</p><ol><li><strong>Start in AI Studio, then move to Antigravity</strong> when you need real architecture, security rules, and automated cloud scripts.</li><li><strong>Keep </strong><strong>AGENTS.md short</strong>, move detailed workflows into modular skills, and use /compact in long sessions.</li><li><strong>Use the right model for the job:</strong> Use <strong>Argon</strong> to coordinate, <strong>Claude Opus/Sonnet</strong> for planning and cross-model audits, and <strong>Flash 3.8</strong> for parallel workers and skeptical validators.</li><li><strong>Never let an agent approve its own PR:</strong> Run a multi-agent quality gate and test in Sandbox before merging.</li><li><strong>Use </strong><strong>/learn after every mistake</strong> so your agents improve every day.</li></ol><p>How are you managing your AI workflows when projects grow beyond a simple POC? <br> Have you tried combining different models or running parallel subagents? Let me know in the comments!</p><p><em>Originally published at </em><a href="https://dev.to/gde/what-i-learned-managing-a-full-project-with-antigravity-1ppc"><em>https://dev.to</em></a><em> on November 3, 2026.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=8d447e37ce3e" width="1" height="1" alt=""><hr><p><a href="https://medium.com/google-cloud/what-i-learned-managing-a-full-project-with-antigravity-8d447e37ce3e">What I Learned Managing a Full Project with Antigravity</a> was originally published in <a href="https://medium.com/google-cloud">Google Cloud - Community</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Architecting Resilience with AlloyDB Omni Backup Strategies]]></title>
            <link>https://medium.com/google-cloud/architecting-resilience-with-alloydb-omni-backup-strategies-2ab093b5aaea?source=rss----e52cf94d98af---4</link>
            <guid isPermaLink="false">https://medium.com/p/2ab093b5aaea</guid>
            <dc:creator><![CDATA[Ujjwal Lanjewar]]></dc:creator>
            <pubDate>Wed, 04 Nov 2026 02:37:34 GMT</pubDate>
            <atom:updated>2026-11-04T02:37:33.117Z</atom:updated>
            <content:encoded><![CDATA[<p>A common misconception in database administration is treating <strong>High Availability (HA) </strong>as a substitute for <strong>backups</strong>. While streaming replication and automated failover (via HA tools) protect you against hardware failures, they offer zero protection against human error. For example, If you drop a critical table on the primary, that <strong>DROP TABLE</strong> command replicates to your standbys in milliseconds. To achieve true resilience, you also need point-in-time recovery (PITR) and reliable backups. <strong>pgBackRest</strong> is widely considered the gold standard for PostgreSQL backups for its parallel processing capabilities, reliability as it natively integrates with multi-node clusters by supporting remote SSH/TLS repositories, object stores (S3/GCS/Azure), and standby backups.</p><p>In a AlloyDB Omni HA deployment, backups must handle active node failovers, continuous <strong>Write-Ahead Log (WAL)</strong> archiving, <strong>point-in-time recovery (PITR)</strong>, and minimal read/write performance degradation on the primary database. In this post, we will explore a <strong>Backup Reference Architecture</strong> for a <strong>AlloyDB Omni HA deployment</strong> using pgBackRest, focusing on advanced use cases like offloading backups to a standby and avoiding duplicate data copies.</p><h3>Backup Reference Architecture</h3><p>In a typical AlloyDB Omni HA deployment, you have one Primary node and two Standby nodes spread across different availability zones. To integrate pgBackRest effectively, you should use a Centralized Shared Repository (such as Google Cloud Storage, S3 bucket, or an NFS share). Instead of treating each Database node as a separate entity to back up, pgBackRest treats the entire HA cluster as a single “stanza” (a configuration unit for a specific database cluster).</p><p>Key Principles of this architecture, are:</p><ul><li>Single Source of Truth — All database nodes point to the exact same pgBackRest repository.</li><li>Cluster Aware — The pgbackrest.conf file on every node is identical and knows about all the nodes in the cluster.</li><li>Location Independence — When a failover occurs, pgBackRest seamlessly automates WAL archival on the primary node.</li></ul><h4><strong>Architecture A: Backup Repository Host (Disk / SAN / NAS)</strong></h4><p>In this architecture, you need to provision a separate, dedicated compute instance (the “<strong>Repo Server</strong>”) that hosts the pgBackRest repository. This server mounts a large, durable block storage volume or network-attached storage (NAS/NFS). The database nodes use the <strong>archive_command</strong> to push Write-Ahead Logs (WALs) via <strong>SSH</strong> to the Repo Server. When a backup is scheduled, the cron job runs on the Repo Server. The Repo Server connects back to the database nodes via SSH, initiates the backup, and pulls the data files across the network onto its attached storage.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*d-oEGV9i1iOilRbgmTOE0w.png" /></figure><p>Pros:</p><ul><li><strong>Strict Security Isolation: </strong>The database nodes only have permission to push WALs. If a database node is compromised, the attacker cannot delete historical backups residing on the Repo Server.</li><li><strong>Performance Tuning: </strong>You have full OS-level control to tune TCP buffers and disk I/O on the backup server.</li><li><strong>Centralized Management: </strong>All backup logs, retention policies, and cron jobs are managed on a single machine outside the database cluster.</li></ul><p>Cons</p><ul><li><strong>Infrastructure Overhead: </strong>You must maintain, patch, and monitor an additional OS and its attached storage.</li><li><strong>Storage Limits: </strong>Scaling attached block storage is generally harder and more expensive than cloud object storage.</li></ul><h4>Architecture B: Using Object Storage (Google Cloud Storage / S3)</h4><p>In this serverless backup architecture, there is no intermediate repo compute node (as most organizations have object storage configured for backup purposes). Here, pgBackRest runs directly on the database nodes, taking advantage of its native support for <strong>S3-compatible object storage</strong>. The primary node pushes WAL files directly to the S3 bucket using <strong>HTTPS</strong>. A cron job runs on one of the database nodes (typically standby nodes) which reads the data files and pushes them directly to the object storage API.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*T9eSpR5J23Oa6LE98QfNqg.png" /></figure><p>Pros:</p><ul><li><strong>Scalability &amp; Durability: </strong>Cloud object storage automatically scales capacity and provides 11-nines of durability.</li><li><strong>Lower Operational Overhead: </strong>No separate backup server OS to manage, patch, or monitor.</li><li><strong>Cost-Effective: </strong>S3 storage is generally cheaper than provisioned high-performance block storage.</li></ul><p>Cons:</p><ul><li><strong>Security Complexity: </strong>The database nodes must hold IAM credentials (or instance roles) capable of writing to and potentially deleting from the S3 bucket. (Though you can mitigate this with S3 Object Lock/Immutable backups).</li><li><strong>Compute Impact:</strong> The database node running the backup uses its own CPU/RAM to compress and encrypt the data before pushing it to S3.</li></ul><h4>Conclusion</h4><p>In either of the architectures, configuring pgBackRest with a single shared stanza, enabling standby backups, and utilizing its native duplicate-prevention mechanisms will ensure that your disaster recovery pipeline is just as robust and automated as your HA failover mechanisms. The choice of the reference architecture ultimately depends on your infrastructure environment — whether you prefer the tight network and security control of a dedicated backup server, or the infinite scalability and low maintenance of cloud object storage.</p><p>In modern architectures, object storage is usually an integral part of backup infrastructure in many organizations, with<strong> cloud object storage</strong> on GCS or an on-prem S3-compatible object storage. Hence, the <strong>Architecture with Object Storage is recommended</strong>, considering the simplicity, scalability, reliability, operational overhead and cost.</p><h3>Best Practices &amp; Optimizations</h3><p>Regardless of which architecture pattern, you must configure pgBackRest to handle the dynamic nature of an HA cluster gracefully. Here are a few use cases and guidelines for you to consider to optimize resources and get most out of your architecture.</p><h4>Offload Backups to a Standby (Zero-Impact Backups)</h4><p>Running a full backup on a busy primary database consumes CPU for compression and disk I/O to read the data files, which can degrade application performance. pgBackRest allows you to offload the heavy lifting to a Standby node. By using the <strong>backup-standby</strong> parameter, pgBackRest connects to the Primary only to execute the fast pg_start_backup() and pg_stop_backup() functions. The actual bulk data read (and compression) happens entirely on the Standby node.</p><p>pgBackRest Configuration Snippet Example:</p><pre>[global]<br># This defines the shared cluster topology<br>repo1-path=/pgbackrest/repo<br>pg1-host=x.x.x.x1 # Primary<br>pg1-path=/var/lib/postgresql…<br>pg2-host=x.x.x.x2 # Standby 1<br>pg2-path=/var/lib/postgresql…<br>pg3-host=x.x.x.x3 # Standby 2<br>pg3-path=/var/lib/postgresql…<br># Enable standby backups<br>backup-standby=y</pre><h4>Avoid Duplicate Copies and WAL Conflicts</h4><p>In an HA cluster, failovers happen. When Standby 1 is promoted to Primary, it immediately starts generating WALs. If both the old primary and the new primary try to push backups to the repository, it can cause duplicates or corruption. For this, pgBackRest uses a shared stanza configuration, it prevents duplication natively:</p><ul><li><strong>Deduplicated WAL Archiving: </strong>All nodes in your cluster should have archive_mode = on and their archive_command configured to push to pgBackRest. If a split-brain occurs and two nodes try to push the same WAL segment, pgBackRest computes a checksum. If the files are identical, it gracefully acknowledges the push without storing a duplicate. If they differ, it raises a safe error.</li><li><strong>Delta Restores: </strong>When rebuilding a failed node, pgBackRest compares the checksums of the files currently on the broken node’s disk with the files in the backup repo. It transfers only the missing or modified files, drastically reducing network traffic and eliminating redundant data transfers.</li><li><strong>No Siloed Backups: </strong>There is no “Node 1 Backup” and “Node 2 Backup.” By defining all nodes in one stanza, there is only a single, unbroken backup chain for the entire cluster.</li></ul><h4>Automated Failover Awareness</h4><p>When using automated HA orchestration, roles change without human intervention. Because pgBackRest’s configuration lists all potential nodes (alloydb1, alloydb2, alloydb3), it probes them via SSH or local connection at the start of any backup operation to discover the current topology.</p><p>If alloydb1 fails and alloydb2 becomes the primary, the next scheduled backup automatically detects alloydb2 as the primary. If backup-standby=y is set, it will automatically select alloydb3 to fetch the data files from. You never have to manually update your backup cron jobs after a database failover.</p><h4>Asynchronous Archiving</h4><p>On high-throughput databases, synchronous WAL archiving can cause performance bottlenecks. Enable archive-async=y in your pgBackRest configuration. This allows pgBackRest to spool WAL files locally and push them to the repository in parallel using multiple workers (process-max=4), ensuring the primary never stalls waiting for a WAL push to complete.</p><h4>Enable Checksums</h4><p>Always ensure data_checksums are enabled when initializing your AlloyDB Omni cluster. pgBackRest utilizes these checksums to guarantee the absolute integrity of your backups.</p><h4>Regular Restore Testing</h4><p>An untested backup is merely a theoretical backup. Automate a script that provisions a temporary VM, fetches the latest backup from the pgBackRest repo, and performs a test PITR recovery at least once a week.</p><h3>Get Started with AlloyDB Omni</h3><p>By choosing AlloyDB Omni, you gain the benefits of superior database performance — including up to 2x faster OLTP performance and features like vector search for generative AI applications — combined with simplified, automated operations, all within your familiar VM environment.</p><p>Ready to elevate your on-premises database operations? Dive into our AlloyDB Omni <a href="https://docs.cloud.google.com/alloydb/omni/docs?e=0"><strong>documentation</strong></a> to get started. You can also try <strong>codelabs</strong> to deploy a highly available AlloyDB Omni cluster.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2ab093b5aaea" width="1" height="1" alt=""><hr><p><a href="https://medium.com/google-cloud/architecting-resilience-with-alloydb-omni-backup-strategies-2ab093b5aaea">Architecting Resilience with AlloyDB Omni Backup Strategies</a> was originally published in <a href="https://medium.com/google-cloud">Google Cloud - Community</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>