<?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[Stories by Vishal Bulbule on Medium]]></title>
        <description><![CDATA[Stories by Vishal Bulbule on Medium]]></description>
        <link>https://medium.com/@vishalbulbule?source=rss-ac9c985be096------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*Fws6nX_3NbTuOxrS82q0cQ.jpeg</url>
            <title>Stories by Vishal Bulbule on Medium</title>
            <link>https://medium.com/@vishalbulbule?source=rss-ac9c985be096------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 15 Nov 2026 10:57:03 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@vishalbulbule/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Gemini Decisions API: A New Approach to Fast and Scalable AI Decisions]]></title>
            <link>https://medium.com/google-cloud/gemini-decisions-api-a-new-approach-to-fast-and-scalable-ai-decisions-3f2b6adb41c9?source=rss-ac9c985be096------2</link>
            <guid isPermaLink="false">https://medium.com/p/3f2b6adb41c9</guid>
            <category><![CDATA[gemini-decision-1]]></category>
            <category><![CDATA[system1-model]]></category>
            <category><![CDATA[jevs]]></category>
            <dc:creator><![CDATA[Vishal Bulbule]]></dc:creator>
            <pubDate>Sat, 14 Nov 2026 12:11:15 GMT</pubDate>
            <atom:updated>2026-11-14T18:39:53.583Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*gzjyviDiH0vkeKM8.png" /></figure><h3>Google shipped a model that cannot write a sentence. On our runs it answered a yes/no question in 456 ms from pune (India) where an LLM took seconds. But the finding that actually changes your bill is this: asking twenty questions in one request cost 18.6× fewer tokens than asking them one at a time.</h3><p>On 11 November 2026 Google released the Gemini Decisions API and the model behind it, gemini-decision-1. It does not write. You hand it some content and a set of questions, and it returns a decision: yes/no with a probability, one of up to 255 choices, or a score against a rubric. Output tokens are always zero.</p><p>If you want the longer story of <em>why</em> this class of model exists — the psychology, the decade AI spent building only the slow kind — that is a separate post: <a href="https://techtrapture.com/blog/system-1-system-2-decision-models">From System 1 and System 2 to Decision Models</a>. Here I am assuming you already accept the idea and want to know whether Google’s version holds up.</p><h3>1. The idea in plain words</h3><p>An LLM answers an essay question. You ask it something, and it writes you a paragraph. If you only wanted a yes or a no, you still paid for the paragraph — in money, and in the seconds it took to generate.</p><p>A decision model fills in an answer sheet. The boxes are fixed before the model runs: this question is yes/no, that one is a choice between four teams, the third is a score from 0 to 2. The model’s job is to put a probability on each box. There is no paragraph, because there is nowhere to write one.</p><p>That constraint is the whole product. It is why the latency is in milliseconds and why the output price is zero — not a discount, but an absence.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FoX4VKtH6NsM%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DoX4VKtH6NsM&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FoX4VKtH6NsM%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/b95c0c434e4fdcef0e32055714655fe6/href">https://medium.com/media/b95c0c434e4fdcef0e32055714655fe6/href</a></iframe><h3>2. The problem it is actually for</h3><p>The place this bites in production is not chat. It is the quiet classification layer nobody demos: is this ticket about billing, is this document signed, is this review a complaint, does this message need a human.</p><p>Those are not conversations. They are judgements that happen a few million times a month, where you need a number you can threshold on, and where an LLM is the wrong shape of tool — you are paying generation cost for a decision, and taking generation latency on a request path.</p><h3>3. What Google shipped</h3><p>From the launch post and the model documentation:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*HmhiC1G-x00-QxHb-hIdFQ.png" /></figure><h3>4. Getting it running</h3><p>To get started you need is <strong>Python 3.11+</strong> and a <strong>Gemini API Key</strong> from <a href="https://aistudio.google.com/api-keys">Google AI Studio</a>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*QDZVFg_dQqqcGX_ZbTGtrQ.png" /></figure><pre>pip install &quot;google-genai&gt;=3.2.0&quot;<br>export GEMINI_API_KEY=&quot;YOUR_GEMINI_API_KEY&quot;</pre><p>The SDK path is short enough to reproduce in full. One client, one call, one answer.</p><pre>from google import genai<br>client = genai.Client(http_options={&quot;api_version&quot;: &quot;v1beta&quot;})<br>result = client.decisions.create(<br> model=&quot;gemini-decision-1&quot;,<br> input=&quot;The blue mug I ordered on Monday arrived cracked on Wednesday.&quot;,<br> questions={<br> &quot;is_damaged&quot;: {<br> &quot;type&quot;: &quot;noul&quot;,<br> &quot;instructions&quot;: &quot;Did the item arrive damaged?&quot;,<br> },<br> },<br>)<br>answer = result.answers[&quot;is_damaged&quot;]<br>print(f&quot;P(yes)={answer.noul:.2f} confidence={answer.confidence:.2f}&quot;)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*2uXsqKbA4v68SVZ_.png" /></figure><p><em>The first call. One question, one probability, no prose.</em></p><p>Two things that are easy to get wrong, and that cost me time:</p><p><strong>confidence is exactly the top probability.</strong> Not a calibrated score, not a transformation - the same float. I confirmed it on live responses:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*swR59qJ2UGeAH1Wb.png" /></figure><p><strong>Option order genuinely does not matter.</strong> The API sorts your option keys alphabetically before scoring. I shuffled three options six ways on the same ticket: the top answer was billing 6 times out of 6, at probability 0.997191 every single time - a spread of exactly zero. That is a real design win, and not universal in this class of model.</p><p>One consequence nobody mentions: if you name your catch-all option none_of_the_above, it sorts into the middle of your real options. Google&#39;s docs say to call it other. Do that.</p><h3>5. Latency: the sub-second story is a text story</h3><p>Twenty back-to-back calls, one choice question, text input, measured from Pune over the public internet on the free tier:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BHboeS6mh9tvsoe2u5AWHg.png" /><figcaption>20 calls to gemini-decision-1 mode from Pune</figcaption></figure><p>Google claims 150–250 ms end to end. I measured roughly <strong>2× that</strong>. I am not calling the claim wrong — I am 7,000 km from the nearest likely serving region on a home connection, and Google does not say where they measured. State where you measured from, always.</p><p>Against an LLM on the same question, the gap is the point. The same race — route one support ticket, gemini-decision-1 against an LLM - run four times back to back:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_M-FkRRjbvGn1fzarSnpiQ.png" /><figcaption>same 20 calls to gemini-3.5 flash from Pune</figcaption></figure><p>Then i tested from US region ( VM in us-central1) and could see same result as google claimed latency 150–250 ms end to end.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*H7QQYAKpUW5IUcE7KfiV8A.png" /><figcaption>Latency from us-central1</figcaption></figure><p>Then compared from same VM in us-central1 using gemini-3.5-flash</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*lTMX1VliFTN6NcQyzIHFWA.png" /><figcaption>Latency from us-central1 using gemini-3.5 flash</figcaption></figure><p>sample script to compare LLM vs decision model</p><pre>import time<br><br>from google import genai<br><br>client = genai.Client(http_options={&quot;api_version&quot;: &quot;v1beta&quot;})<br><br>ticket = &quot;I was charged twice for my October invoice. Please refund one of them.&quot;<br>teams = {&quot;billing&quot;: &quot;Invoices, refunds, charges&quot;,<br>         &quot;technical&quot;: &quot;Bugs, outages, errors&quot;,<br>         &quot;general&quot;: &quot;Questions and feature requests&quot;}<br><br># 1. Ask an LLM to write the answer.<br>start = time.time()<br>interaction = client.interactions.create(<br>    model=&quot;gemini-3.5-flash-lite&quot;,<br>    input=f&quot;Which team should handle this ticket? Answer with one word: &quot;<br>          f&quot;billing, technical or general.\n\n{ticket}&quot;,<br>)<br>llm_latency = time.time() - start<br><br># 2. Ask the decision model to pick the answer.<br>start = time.time()<br>response = client.decisions.create(<br>    model=&quot;gemini-decision-1&quot;,<br>    input=ticket,<br>    questions={&quot;team&quot;: {&quot;type&quot;: &quot;choice&quot;,<br>                        &quot;instructions&quot;: &quot;Which team should handle this ticket?&quot;,<br>                        &quot;criteria&quot;: teams}},<br>)<br>decision_latency = time.time() - start<br><br>team = response.answers[&quot;team&quot;]<br>print(f&quot;LLM      : {interaction.output_text.strip():&lt;10}  {llm_latency:.2f} seconds&quot;)<br>print(f&quot;Decision : {team.choice:&lt;10}  {decision_latency:.2f} seconds  (confidence {team.confidence:.2f})&quot;)<br>print(f&quot;\nThe decision model was {llm_latency / decision_latency:.1f}x faster.&quot;)<br>print(f&quot;Output tokens: LLM wrote one word, decision model wrote {response.usage.total_output_tokens}.&quot;)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/870/0*56ISbBS3g9U3NF56.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*8V3t2YGs8VvpAbgC.png" /><figcaption>latency measured from remote location ( pune)</figcaption></figure><p><em>Three consecutive runs of the same race from the recording: 8.9x, 12.7x, 9.3x. A fourth run later in the session came out at 6.7x. Same question every time.</em></p><p>Quote the spread, not the best number. On a home connection the LLM wandered between 3.93 s and 5.16 s and the decision model between 0.32 s and 0.59 s, which is how you get a ratio that moves from 6.7× to 12.7× on an unchanged question. The useful claim is “roughly 7× to 13× on my runs”, not “12.7× faster”.</p><p>One line in that output does not vary at all, and it is the one that matters for the bill: the LLM wrote a single word — “billing” — and was charged for generating it. The decision model wrote zero output tokens, four times out of four.</p><p>The more useful finding is what happens when the input stops being text:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*oEMUvHsoonkHbAag.png" /></figure><p><em>Round trip from Pune on a home connection, free tier, 2026–11–13. Sub-second is a text property: audio and video cost 3–7x.</em></p><p>Audio and video cost <strong>3–7× the latency</strong> of text. Every “real-time video decisions” idea you are about to have needs a timeout and a fallback before it goes anywhere near a request path.</p><p>On accuracy across those modalities, the model did well against known ground truth — 7 of 7 correct. My favourite result is the one that is hardest to fake: asked how prepared a speaker sounded, it put 0.875 on “hesitant, searching for notes” for a file Google had named rehearsing.wav. No transcription step, and no transcription line on the bill.</p><p>One billing detail that is <strong>not</strong> in the docs’ modality table: a video’s soundtrack is billed separately as audio tokens. Our video call shows image tokens <em>and</em> audio tokens for a single file.</p><h3>6. The cost finding: your bill is set by batching, not by the price per token</h3><p>The pricing page says <strong>$0.10 per 1,000,000 input tokens</strong>, and output tokens are always zero. That is the whole price list. It still tells you almost nothing about your bill, and this section is why.</p><h3>First, what one decision costs</h3><p>Start with the simplest case: one 343-token incident report, one yes/no question about it.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*ElL5vkoIRfm-eLRT.png" /></figure><p>A single decision costs about four thousandths of a cent. That is why every chart in this section is priced <strong>per million</strong> — per decision, the bars would all read $0.00.</p><h3>Now the part that matters</h3><p>Ask twenty questions about the <strong>same</strong> report, in <strong>one</strong> request:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*AB3NsbqtkoiL-PPl.png" /></figure><p>Same report, same twenty questions, same answers. <strong>$40.90 against $6.59 per million</strong> — 6.2x cheaper, decided entirely by the shape of the request.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*i6Sqx3Rd1t9LQ0TK.png" /></figure><p><em>A 343-token incident report, 3 runs per bar, measured 2026–11–14. The shared input is billed once per request, so each extra question adds only ~47.8 tokens of its own.</em></p><p>The one line doing the work is <strong>billed ONCE</strong>. The document is the expensive part, and you pay for it once per request however many questions you attach. Each extra question adds only its own text — I measured that at <strong>47.8 input tokens</strong>, on both documents I tested.</p><p>So the rule of thumb, which is worth keeping in your head:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*xzLdsmSlWRiPHsRl.png" /></figure><h3>It gets more extreme the bigger the document</h3><p>The saving scales with how much input you are re-sending. The same twenty questions against a 12,272-token contract:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*Cc8Oh088IP9Wz_h6.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*1P-PdRTRlnVFse7p.png" /></figure><p><em>Twenty decisions on a 12,272-token contract (66,304 characters). Same model, same questions, same answers: 245,440 input tokens one at a time against 13,181 batched, 18.6x apart.</em></p><p><strong>6.2x on a small input, 18.6x on a large one.</strong> The ratio is roughly shared input ÷ 48, so it keeps climbing the more context your questions share.</p><h3>Take the ratio, not the dollar amount</h3><p>The absolute cost here is a property of <strong>my</strong> documents, not of the API. A 343-token incident report and a 12,272-token contract give 6.2x and 18.6x; yours will land somewhere else. What transfers is the shape:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*yuAka_MUNYc-imJk.png" /></figure><p>Measure your own input once, and that formula tells you the rest. Both documents here agreed on the marginal cost of a question to within two tokens, so 48 is a safe number to plan with.</p><h3>Two limits that will spoil the plan</h3><p>There is <strong>no Batch API</strong> for this model and <strong>no context caching</strong>. If you were going to score a million rows overnight at batch prices, you cannot, and repeated input is charged in full every single time. The batching above is the only lever you get.</p><h3>7. Where it breaks</h3><p><strong>The forced-choice trap.</strong> The probability is only ever spread across the options you offered. Give it three support teams and it will confidently file things that are not support tickets at all:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*16bx2M_pFKjJyC4T.png" /></figure><p>A team lunch classified as a general support ticket at 0.92 confidence. One extra option fixes all four. This is not a model defect — it is what “probabilities sum to 1” means — but it will reach production if nobody tests off-distribution inputs.</p><p><strong>A threshold you did not tune is not a safety mechanism.</strong> Google’s own documentation example uses a 0.7 confidence gate. Running it, “It’s not working.” — a message that says nothing at all — cleared that gate at 0.79 and auto-routed. Google’s docs are honest about this and tell you to set thresholds from labelled examples of your own traffic. That advice is correct, it is work, and most people will skip it.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*_N88sEOesoLMF9u6.png" /></figure><p><em>Google’s own documented 0.7 gate, passing a message that says nothing.</em></p><p><strong>The free tier’s binding limit is tokens, not requests.</strong> It advertises 200 requests per minute, which sounds generous, but the real ceiling is 50,000 input tokens per minute. At 8k tokens a call that is about six calls a minute. Three 16k-token document calls will rate-limit you:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*n44usjItByGva6ua.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/948/0*aic5ZSA3X0A8fJBr.png" /></figure><p><em>The free tier’s real ceiling is tokens per minute, not requests per minute.</em></p><p>Worth noting for error handling: rate limits return <strong>429</strong>, while the documentation’s Limits section describes 400 for limit violations. Both are true — 400 is for request-shape limits, 429 for rate limits.</p><h3>8. Is it the cheapest? No. That is not why you would pick it</h3><p>On price per token for plain text, Google is not the cheapest decision model. At $0.10 per million input tokens it is roughly 2.5× the specialists — Jev sits near $0.042, Sarvam Prism is in the same neighbourhood.</p><p>What you get for the difference is modality. If your decision needs to look at an image, listen to audio, watch a video or read a PDF <em>in the same request</em>, Google is today the clear answer, and there is no separate OCR or transcription line on the bill. If you only ever classify plain text and you are price-sensitive at volume, the specialists are cheaper. If you need Indian languages or open weights, Prism. If the data cannot leave your network, something you can run locally.</p><p>The honest summary: <strong>the differentiator is not the price, it is the modality.</strong></p><h3>9. Two places I actually put it, and what happened</h3><p>Everything above is the model on a bench. The rest of this series puts it on a request path and measures what changed. Both results are here in short; the posts have the method, the failures and the code.</p><h3>Part 2 — replacing the router in a Google ADK multi-agent system</h3><p>A root agent whose only job on a normal turn is to pick one of three sub-agents. That is a classification, but the default ADK pattern pays a generative model to do it on every turn, before any real work starts.</p><p><strong>81% less routing latency, 35.7x cheaper, same routing decisions</strong> — about 1.5 seconds of pure overhead removed from every turn. The clearest evidence is not a number: the ADK trace for the decision-routed agent is <strong>empty</strong>, because the router model is never called at all.</p><p><em>Part 2: the same message to both agents. Top, the default ADK pattern spends a model call on routing. Bottom, with the decision model there is no model span at all.</em></p><p>Measured as a whole turn through the ADK framework, the same message takes <strong>1,492 ms</strong> with the router model and <strong>497 ms</strong> with the decision model — 67% less, on five runs each:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1016/0*WTXD2fi3FGSxRo-Z.png" /></figure><p><em>Part 2: one full ADK turn on each agent, five runs each. The ranges do not overlap.</em></p><p>Be careful with that as a headline, though. Routing is a fixed tax, so what it is worth depends on the turn: 69% of a short one, around 2% of a turn where the sub-agent then runs a 60-second investigation. <a href="https://techtrapture.com/blog/adk-decision-router-latency">Part 2</a> has the callback, the four traps that cost me an afternoon, and why “my agent is 5x faster” is the wrong claim.</p><h3>Part 3 — as an eval judge, against an LLM judge</h3><p>Same 10 HaluEval rows, same prompt, five runs each, asking whether a response is grounded.</p><p>The generative judge scored <strong>70% on one run and 90% on another over identical rows</strong>. The decision model returned a bit-identical probability every time — not the same side of the threshold, the same float. <strong>4.5x faster, 45x cheaper, and it tells you which rows it is unsure about in the first call</strong> instead of after you have paid to run the suite five times.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*nwvLwPcOf0q-Si6K.png" /></figure><p><em>Part 3: five runs of the same judge over the same ten rows. The generative judge moves by 20 points on rows that never changed.</em></p><p><a href="https://techtrapture.com/blog/decision-model-eval-judge">Part 3</a> has the stability test, the threshold sweep an LLM judge structurally cannot give you, and the thing you give up: the rationale.</p><h3>10. Key findings</h3><ol><li><strong>Batching sets your bill, not the price per token.</strong> The same twenty decisions on a 12,272-token document cost $1,227.20 per million one at a time and $65.91 batched — 18.6× fewer tokens. On a 343-token input the same move is 6.2×.</li><li><strong>The marginal cost of one more question is ~48 input tokens</strong>, on both documents tested. Tokens per decision = (shared input ÷ questions) + 48.</li><li><strong>Sub-second is a text property.</strong> Audio and video round-trips were 3.4 s, 3–7× text.</li><li><strong>We measured ~2× Google’s latency claim</strong> from Pune on a home connection — 456 ms median against a 150–250 ms claim. Say where you measured.</li><li><strong>confidence is exactly the top probability.</strong> Never port a threshold from another decision model.</li><li><strong>Option order does not affect the answer</strong> — zero spread across six shuffles. Name your catch-all other.</li><li><strong>Always offer an escape option.</strong> Without one, a team-lunch message was filed as a support ticket at 0.92.</li><li><strong>The free tier’s real limit is 50,000 tokens per minute</strong>, not 200 requests per minute.</li><li><strong>No Batch API, no context caching.</strong> Plan your overnight scoring job around that, or around a different model.</li><li><strong>On a real request path it held up.</strong> Routing in an ADK multi-agent system: 1,851 ms → <strong>349 ms</strong>, 35.7× cheaper, same decisions (<a href="https://techtrapture.com/blog/adk-decision-router-latency">part 2</a>). As an eval judge: bit-identical on every repeat where the LLM judge swung 70–90% on the same rows, 45× cheaper (<a href="https://techtrapture.com/blog/decision-model-eval-judge">part 3</a>).</li></ol><h3>References</h3><ul><li>Gemini Decisions API launch post, 11 November 2026 — <a href="https://blog.google/innovation-and-ai/technology/developers-tools/gemini-decisions-api/">https://blog.google/innovation-and-ai/technology/developers-tools/gemini-decisions-api/</a></li><li>Decisions API documentation — <a href="https://aistudio.google.com/docs/decisions-api">https://aistudio.google.com/docs/decisions-api</a></li><li>gemini-decision-1 model card - <a href="https://aistudio.google.com/docs/models/gemini-decision-1">https://aistudio.google.com/docs/models/gemini-decision-1</a></li><li>Pricing, checked 14 November 2026 — <a href="https://aistudio.google.com/docs/pricing">https://aistudio.google.com/docs/pricing</a></li><li>Interactions API overview — <a href="https://aistudio.google.com/docs/interactions-overview">https://aistudio.google.com/docs/interactions-overview</a></li></ul><p>Measurements: gemini-decision-1 via google-genai 3.3.0, from Pune, India, over the public internet on the free tier, 2026-11-13 and 2026-11-14. Cost figures use 3 runs per row and the input-token counts the API itself reports; a warm-up call is discarded before any timing. These are our numbers on our network, not a benchmark.</p><p><strong>Looking for a similar implementation, or for assistance with your Cloud and AI journey?</strong> <a href="https://techtrapture.com/contact">Talk to TechTrapture</a> or email <a href="/service/mailto:vishal.bulbule@techtrapture.com">vishal.bulbule@techtrapture.com</a>.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3f2b6adb41c9" width="1" height="1" alt=""><hr><p><a href="https://medium.com/google-cloud/gemini-decisions-api-a-new-approach-to-fast-and-scalable-ai-decisions-3f2b6adb41c9">Gemini Decisions API: A New Approach to Fast and Scalable AI Decisions</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[Ollama vs vLLM on Cloud Run with an NVIDIA L4: A Real Benchmark from 1 to 48 Concurrent Users]]></title>
            <link>https://medium.com/google-cloud/ollama-vs-vllm-on-cloud-run-with-an-nvidia-l4-a-real-benchmark-from-1-to-48-concurrent-users-47d4a35bf980?source=rss-ac9c985be096------2</link>
            <guid isPermaLink="false">https://medium.com/p/47d4a35bf980</guid>
            <category><![CDATA[ollama-vs-vllm]]></category>
            <category><![CDATA[cloud-run-llm]]></category>
            <category><![CDATA[vllm]]></category>
            <dc:creator><![CDATA[Vishal Bulbule]]></dc:creator>
            <pubDate>Fri, 06 Nov 2026 13:35:33 GMT</pubDate>
            <atom:updated>2026-11-11T11:23:06.706Z</atom:updated>
            <content:encoded><![CDATA[<h4>Same GPU, same model. Ollama was 2.4× faster for one user. At 32 users vLLM was 7.7× faster than Ollama’s defaults, and still 3.4× faster after we gave Ollama 32 parallel slots. Then Cloud Run’s autoscaling billed us for GPUs that served nobody, and with Ollama it sent users to a GPU that wasn’t ready yet.</h4><p><em>Vishal Bulbule · Google Developer Expert (Google Cloud) · TechTrapture</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*rWLsemes9AUyHHAk.png" /></figure><p><em>Total tokens/s as users grow, same L4 GPU and same Gemma 4 E2B model. From the run recorded for the video (1 user: Ollama 109.9 vs vLLM 47.1 tok/s); the tables below use our dry run from the same day, and throughput differed by under 3%.</em></p><h3>Abstract</h3><p>We compared two popular open-source inference engines, <strong>Ollama</strong> and <strong>vLLM</strong>, serving the same model ( <strong>Gemma 4 E2B</strong>) on identical <strong>Cloud Run</strong> services with one <strong>NVIDIA L4</strong> GPU each. A closed-loop load generator ran 1, 4, 8, 16 and 32 concurrent users for 60 seconds per level, and we measured total throughput, time to first token (TTFT), cost per million output tokens, GPU utilization, and autoscaling behaviour beyond one instance.</p><p>For a <strong>single user</strong>, Ollama (4-bit) generated <strong>113 tokens/s versus vLLM’s 47 tokens/s</strong> (BF16). From <strong>4 users</strong> upward vLLM overtook it. At <strong>32 users</strong> vLLM reached <strong>1,235 tokens/s</strong> with a <strong>median TTFT of 0.47 s</strong>, while Ollama stayed flat at about <strong>160 tokens/s</strong> and its median TTFT grew to <strong>48 s</strong>. At the same $1.42/hour, the cost per million output tokens was <strong>$0.32 (vLLM) versus $2.47 (Ollama)</strong>. Cloud Run’s GPU utilization metric read <strong>79–83% for Ollama</strong>, despite 7.7× lower throughput. Under load beyond one instance, Cloud Run started a second GPU instance <strong>before the first was full</strong>; the new instance took <strong>6 min 21 s</strong> to become ready and was billed throughout. We discuss engine selection, metric pitfalls, and three cost strategies for the scale-out gap.</p><p>Phase 1 compared Ollama’s default (one request at a time) against vLLM tuned to 32 sequences. After readers pointed out that Ollama’s TTFT looked like queueing, we ran a <strong>phase 2</strong> with OLLAMA_NUM_PARALLEL=32 and everything else unchanged. Ollama&#39;s median TTFT at 32 users fell from <strong>48 s to 1.5 s</strong> and its throughput more than doubled, to <strong>359 tokens/s</strong>, but vLLM still delivered <strong>3.4× more tokens per GPU</strong> ($0.32 versus $1.10 per million). Phase 2 also showed that Ollama 0.40.13 runs <strong>speculative decoding by default</strong> for Gemma 4, which vLLM did not, and that Cloud Run routed users to a new Ollama instance <strong>about 4 minutes before its model was loaded</strong>, giving a p95 TTFT of 274 s.</p><h3>1. Introduction</h3><p>Most guides to running vLLM on Cloud Run show how to <strong>deploy</strong> it: Google’s own documentation, its codelab, community posts and templates. Very few measure what happens under concurrent load, and none that we found compare vLLM against Ollama on the same hardware or examine what Cloud Run does when one GPU is no longer enough.</p><p>That gap matters for cost. On a GPU, the engine decides how many useful tokens you get per GPU-hour. On Cloud Run, autoscaling decides how many GPU-hours you pay for.</p><p>This study answers four questions:</p><ol><li><strong>RQ1:</strong> How do Ollama and vLLM compare in throughput and latency as concurrent users grow from 1 to 32 on one L4?</li><li><strong>RQ2:</strong> What does that mean for cost per million tokens?</li><li><strong>RQ3:</strong> Does Cloud Run’s GPU utilization metric reflect how efficiently the GPU is used?</li><li><strong>RQ4:</strong> What happens, and what does it cost, when load exceeds one instance?</li></ol><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F0GZD1_ql1Sc%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D0GZD1_ql1Sc&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2F0GZD1_ql1Sc%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/66b49eccb0b43c450217b00502b8a41c/href">https://medium.com/media/66b49eccb0b43c450217b00502b8a41c/href</a></iframe><h3>2. Background</h3><p><strong>vLLM</strong> is an open-source engine that serves LLMs to many users at once, with an OpenAI-compatible API, under Apache 2.0. It came out of UC Berkeley’s Sky Computing Lab, and its core technique, <strong>PagedAttention</strong>, was published at SOSP 2023. Two ideas matter for this study:</p><ul><li><strong>Continuous batching:</strong> requests join and leave the running batch at every generation step, so many users share each pass over the model’s weights.</li><li><strong>PagedAttention:</strong> the KV cache, the per-conversation working memory, is allocated in small pages as it grows, instead of one large block reserved per request. Far more conversations fit in the same GPU memory.</li></ul><p><strong>Ollama</strong> is built for running models locally and simply, on top of llama.cpp with 4-bit GGUF models. By default it processes <strong>one request at a time per model</strong> ( OLLAMA_NUM_PARALLEL=1) and queues the rest.</p><p><strong>Why one user is different from many.</strong> Generating one token at a time is limited mainly by how fast the GPU can <strong>read the model’s weights from memory</strong>, not by arithmetic. A smaller (4-bit) model is faster for a single user. Batching many users into the same step reuses each weight read for all of them, which is where a serving engine pulls ahead.</p><p><strong>Gemma 4 E2B.</strong> “E2B” means <em>effective</em> 2 billion parameters: <strong>2.3B effective, 5.1B including embeddings</strong> (model card). In BF16 the weights occupy about 9 GB of GPU memory. The model is Apache 2.0 and not gated on Hugging Face.</p><h3>3. Experimental setup</h3><h3>3.1 Platform</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*cMirvsnq-hjpUO5U.png" /></figure><p>Price breakdown, europe-west1 list prices, 2 Nov 2026: L4 without zonal redundancy at $0.0001867/s, plus 8 vCPU × $0.000018/s, plus 32 GiB × $0.000002/s = $0.0003947/s ≈ <strong>$1.42/hour</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*oJlaDXH31pSAc9mG.png" /></figure><p><em>The phase 1 benchmark output. Red: Ollama at 32 users, 157 tok/s and a 48.8 s median wait. Green: vLLM at 32 users, 1,235 tok/s and 0.47 s.</em></p><h3>3.2 vLLM deployment</h3><pre>gcloud run deploy vllm-gpu \<br> --image vllm/vllm-openai:v0.33.0 \<br> --region europe-west1 \<br> --cpu 8 --memory 32Gi \<br> --gpu 1 --gpu-type nvidia-l4 --no-gpu-zonal-redundancy \<br> --no-cpu-throttling \<br> --concurrency 32 --min-instances 0 --max-instances 1 \<br> --timeout 600 --port 8080 \<br> --startup-probe httpGet.path=/health,httpGet.port=8080,initialDelaySeconds=240,periodSeconds=10,failureThreshold=120,timeoutSeconds=5 \<br> --command vllm \<br> --args=&quot;serve,google/gemma-4-E2B-it,--dtype=bfloat16,--max-model-len=4096,--max-num-seqs=32,--gpu-memory-utilization=0.90,--limit-mm-per-prompt.image=0,--limit-mm-per-prompt.audio=0,--limit-mm-per-prompt.video=0,--enable-prefix-caching,--enable-chunked-prefill,--host=0.0.0.0,--port=8080&quot;</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*WgXkhhpzfxTENVNs.png" /></figure><p><em>The real deployment: the vLLM arguments in our script, and gcloud confirming the service is deployed and serving traffic.</em></p><p>Key choices:</p><ul><li>--concurrency 32 matches --max-num-seqs=32, following Google&#39;s guidance.</li><li>Image, audio and video inputs are disabled because this is a text-only API. With only image and audio disabled, vLLM still profiled a video input at startup.</li><li>The startup probe checks /health, which passes only once the model is loaded. It allows far more time than the 240 s used in Google&#39;s example, because cold start here was about 7 minutes.</li><li>vLLM downloads the weights from Hugging Face at every cold start. No token is needed because the model is not gated.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*6kErSefVFJ0yCzOr.png" /></figure><p><em>vLLM’s own startup log: room in the KV cache for ~90 concurrent 4,096-token conversations.</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*5LMctyUDmpvrXAdI.png" /></figure><p><em>The first question to the deployed vLLM service: “What is 17*23? Answer briefly.” The answer, 391, is in the content field.</em></p><h3>3.3 Load generator and method</h3><p>We used a closed-loop benchmark written in standard-library Python:</p><ul><li><strong>Levels:</strong> 1, 4, 8, 16, 32 concurrent users. Each user sends a request, waits for the full streamed answer, and immediately sends the next. Each level runs for 60 seconds, and requests in flight at the deadline are allowed to finish.</li><li><strong>Requests:</strong> the same OpenAI-compatible endpoint for both engines (/v1/chat/completions, streaming). Eight different long-answer prompts rotate, so no single cached prompt favours either engine. temperature = 0 and max_tokens = 256; every request generated exactly 256 tokens.</li><li><strong>Metrics:</strong></li><li><em>Total tokens/s:</em> all completion tokens divided by wall time, i.e. throughput for everyone.</li><li><em>TTFT:</em> client-side, time from sending the request to the first content token. Median and 95th percentile reported.</li><li><em>Per-user decode speed:</em> how fast an individual answer streams once it starts.</li><li><em>Cost per 1M output tokens:</em> $1.42/h ÷ (total tokens/s × 3600) × 1⁰⁶, assuming the GPU is kept busy.</li><li><strong>Warm-up:</strong> one request per engine before measuring, excluded from results.</li><li><strong>Client:</strong> a laptop in Pune, India, calling europe-west1. Network round-trip time is included in TTFT for both engines.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*yEjoZl5m2AQyZqCc.png" /></figure><p><em>The eight questions the benchmark rotated through, from bench_concurrency.py. All of them ask for long answers, so every request does the same amount of work.</em></p><h3>3.4 Fairness controls</h3><ul><li><strong>Thinking mode off on both engines.</strong> Gemma 4 can reason before answering, which adds hidden output tokens. vLLM: &quot;chat_template_kwargs&quot;: {&quot;enable_thinking&quot;: false}. Ollama on its OpenAI-compatible endpoint thinks by default and <strong>ignored</strong> &quot;think&quot;: false (about 250 reasoning tokens still produced). Only &quot;reasoning_effort&quot;: &quot;none&quot; disabled it. Without this control, Ollama&#39;s numbers would have included its thinking.</li><li><strong>Same context length</strong> (4,096) on both engines, same instance shape, same price.</li><li><strong>Precision is not equal, by design.</strong> Each engine runs its common default: Ollama 4-bit, vLLM BF16. This favours Ollama per token at low load. See Limitations.</li><li><strong>Speculative decoding is not equal either.</strong> We found this only from the phase 2 logs. Ollama 0.40.13 loads Gemma 4’s multi-token-prediction “assistant” head as a draft model and decodes speculatively by default (draft acceptance ≈ 0.41, mean len ≈ 2.2). It did so in both phases. vLLM ran without speculative decoding. This also favours Ollama at one user.</li><li><strong>Phase 1 is defaults versus tuned.</strong> In phase 1, vLLM was set to 32 sequences to match Cloud Run’s concurrency, but Ollama kept its default of one request at a time. Phase 2 (Section 4.6) gives Ollama 32 slots too.</li></ul><p><strong>Watch the walkthrough:</strong> <a href="https://youtu.be/0GZD1_ql1Sc">vLLM on Cloud Run</a></p><h3>4. Results</h3><h3>4.1 Throughput and latency (RQ1)</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*zqkXMv9Z6zULjFSv.png" /></figure><p>Per-user decode speed: Ollama about 165 tok/s at every level, but only one user at a time; vLLM 52 tok/s at 1 user and 43 tok/s at 32.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*9a5jXmn9LiClmYtX.png" /></figure><p><em>Total throughput. vLLM overtakes Ollama between 1 and 4 users and reaches 1,235 tok/s at 32.</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*1CzSucruaOXD8m5b.png" /></figure><p><em>Median time to first token, log scale. Ollama’s requests queue; vLLM’s batch.</em><strong>Observations:</strong></p><ol><li><strong>Single user: Ollama wins by 2.4×.</strong> With one request in flight, the GPU’s work is dominated by reading weights. Ollama’s 4-bit model is roughly a quarter the size of vLLM’s BF16 model, so each token is cheaper to produce.</li><li><strong>Crossover at 4 users.</strong> vLLM’s continuous batching overtakes Ollama between 1 and 4 users.</li><li><strong>Ollama saturates immediately.</strong> Throughput stays at about 160 tok/s from 4 to 32 users because requests are served one at a time. Added users queue: median TTFT grows linearly with load, reaching <strong>48 seconds</strong> at 32 users.</li><li><strong>vLLM scales almost linearly</strong> to 1,235 tok/s, a <strong>7.7× advantage</strong>, while TTFT stays under 0.5 s at the median. Per-user speed falls only from 52 to 43 tok/s.</li><li><strong>Headroom remains.</strong> vLLM reported room for about 90 concurrent 4,096-token conversations in its KV cache. At 32 users, compute rather than memory was the limit, and per-user speed was still high. The 32-request cap was a configuration choice, not the hardware ceiling.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*-1W8VsKm4UPEUVxO.png" /></figure><p><em>The benchmark running live: Ollama finished, with its 32-user line highlighted (157.1 tok/s, 48.8 s median wait), and vLLM warming up. The tables use our dry run from the same day, so their values differ slightly.</em></p><h3>4.2 Cost per million output tokens (RQ2)</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/906/0*0derbz38F3LqXaAe.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*vSvm1YsyDCskQP88.png" /></figure><p><em>Cost per 1M output tokens at $1.42/h with the GPU kept busy.</em></p><p>At one user, Ollama is cheaper per token. From four users, vLLM is cheaper, and at 32 users it is <strong>7.7× cheaper on identical hardware at an identical hourly price</strong>. The choice of inference engine is a cost decision as much as a technical one.</p><h3>4.3 GPU utilization is not GPU efficiency (RQ3)</h3><p>We pulled Cloud Run’s GPU metrics ( container/gpu/utilizations, container/gpu/memory_usages) for the benchmark windows.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*a0caohRSUEL3R2Bv.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*uSaXdlzmT0WD9CIA.png" /></figure><p><em>Cloud Monitoring, container/gpu/utilizations, during the race. A GPU can look 81% busy while delivering 7.7× fewer tokens.</em></p><p>Ollama’s GPU <strong>looked 82% busy while producing 7.7× fewer tokens</strong> than vLLM. GPU utilization measures the fraction of time the GPU is running <em>anything</em>, not how much of its capacity is used. A GPU serving one request at a time can look nearly full.</p><p>Memory tells a similar story in reverse. vLLM reserves 70–90% of GPU memory at startup, even with zero users, because of --gpu-memory-utilization=0.90 and its KV-cache pool. Ollama used 3.5 GB, leaving about 20 GB idle.</p><p><strong>Implication:</strong> neither GPU utilization nor GPU memory percentage is a reliable signal of efficiency or load for LLM serving. Measure <strong>tokens per second per dollar</strong>. This also explains Google’s documented design choice: <em>“Cloud Run does not automatically scale the number of instances based on GPU utilization”</em>. It scales on request concurrency instead. In our data, GPU utilization would have been a misleading scaling signal.</p><h3>4.4 Cold start</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*U0cAy0Ue3Xk228Hb.png" /></figure><p>Ollama’s cold start, with its 4-bit model read from a mounted Cloud Storage bucket, was about <strong>4.5 minutes</strong> to the first answer, followed by a one-off stall of about 25 s on the next request. Both services scaled to zero about <strong>10 minutes</strong> after their last request. Hugging Face once answered <strong>HTTP 429</strong> to the anonymous download; vLLM retried successfully.</p><h3>4.5 Beyond one instance: the scale-out gap (RQ4)</h3><p>We raised vLLM’s --max-instances to 2 and ran 32 users, then 48 users, for 5 minutes each.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*g0Orgp4CHSKTxNtv.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*I87UJJuY42C6frGo.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*SrMJmlL3RBKBVD6U.png" /></figure><p><em>Cloud Monitoring, container/instance_count (active), vLLM with — max-instances 2.</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*4Z7r0idKs2IwhsOx.png" /></figure><p><em>Cloud Monitoring, GPU utilization per instance: the second instance sits near 0% for minutes while billed.</em></p><p>GPU metrics confirm the gap. While the second instance booted, the 99th-percentile GPU utilization across instances was 100% (the busy instance) and the median was about 1% (the booting one). <strong>For 6 minutes, one GPU was saturated while a second, billed GPU produced nothing.</strong> Instance-based billing charges from instance start. Users on the saturated instance saw p95 TTFT rise from 0.8 s to 5.8 s. No requests were rejected.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*wUtEFZ3S43bu3SEv.png" /></figure><p><em>Cloud Run logs filtered on “starting new instance”: each entry gives the reason, so you can separate instances started by autoscaling from those started by a deployment.</em></p><h3>4.6 Phase 2: Ollama with 32 parallel slots</h3><p>Readers pointed out that Ollama’s TTFT in Section 4.1 looked like queueing, not generation. That was correct: with one slot, Cloud Run let 32 requests into the instance and 31 of them waited inside Ollama. We redeployed Ollama with OLLAMA_NUM_PARALLEL=32. Everything else was unchanged: image, model, bucket, instance shape, concurrency, context and prompts. The startup log confirmed the setup: offloaded 36/36 layers to GPU, n_seq_max = 32, n_ctx_seq = 4096, KV cache 1.7 GiB.</p><p>We ran the sweep three times: twice with 60-second windows and once with 120-second windows at 4, 8 and 16 users. The table shows medians.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*fo_83oBnhv4mJaad.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*QnqQ_J4KQhSzNT9w.png" /></figure><p><em>Phase 2: Ollama with OLLAMA_NUM_PARALLEL=32 (median of three runs) against phase 1 and vLLM.</em><strong>Observations:</strong></p><ol><li><strong>The queueing disappears.</strong> Median TTFT at 32 users fell from 48 s to 1.5 s.</li><li><strong>Throughput improves but flattens.</strong> Ollama reached 359 tok/s at 32 users, 2.3× its default, but per-user speed fell from 164 tok/s (1 user) to 42 (4 users) and 14 (32 users). vLLM still delivered 43 tok/s per user at 32. Batching in vLLM shares each weight read across users far more effectively.</li><li><strong>Run-to-run variance is real at mid-load.</strong> At 8 users the three runs gave 269, 155 and 159 tok/s. At 32 users the runs agreed (356, 361).</li><li><strong>Memory is not the limit.</strong> Ollama used <strong>5.5 GB of 22 GB</strong> under full load, and GPU utilization read 66–81%.</li></ol><p>We do not know how much speculative decoding contributes under load. Drafting helps a single stream, but at large batch sizes the extra verification work can cost more than it saves. A run with drafting disabled would settle this.</p><p><strong>Scale-out with Ollama: routed before ready.</strong> We repeated the Section 4.5 test on the phase 2 service with --max-instances 2:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*bCH55F0mhgkkkpcW.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*SrEVFrUOC59D9u2Q.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*xww558zybInuAR1S.png" /></figure><p><em>Cloud Logging, the second Ollama instance: the port opens 6 s after start, so the default TCP probe passes, but the model is on the GPU 2 minutes later and answering only at 15:29:58.</em></p><p>Users routed to the new instance waited up to <strong>4.6 minutes</strong> for their first token. Cloud Run did nothing wrong: by the default TCP probe, the container <em>was</em> ready. vLLM avoided this because its /health probe only passes once the engine can serve. <strong>With Ollama on Cloud Run, define an HTTP startup probe that only passes once the model is loaded</strong>, for example a small wrapper that preloads the model before opening the port. Otherwise every scale-out sends users to a GPU that can&#39;t answer yet.</p><h3>5. Discussion</h3><h3>5.1 Choosing an engine</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*Dgezu9XDYiVSw2Dw.png" /></figure><p>vLLM buys its throughput with complexity: more flags, a 10.9 GB image, BF16 weights, and about 7-minute cold starts. That cost is not worth paying for a single user.</p><h3>5.2 Paying for the scale-out gap</h3><p>Because Cloud Run scales on request concurrency and a new GPU instance needs a full cold start, every scale-out event has a cost. There is no free option:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*IptlmMkNblr1k0CL.png" /></figure><p>The fourth lever is to <strong>shorten the cold start</strong>. In a side experiment, storing the weights in a Cloud Storage bucket and reading them over <strong>Direct VPC</strong> with Private Google Access cut weight loading from 176 s to 79 s, and instance start to ready from ~7 min to <strong>under 5 min</strong>. Loading strategies deserve a study of their own.</p><h3>5.3 Operational lessons</h3><ol><li><strong>Pin the image version.</strong> Google publishes its own vLLM build for Model Garden, but its friendly tags (gemma4, latest) move, and its newest version tag lagged upstream (v0.20 vs v0.33). Pinning upstream gives an exact, portable version. Cloud Run pulls Docker Hub images through Google&#39;s mirror; on v0.33.0&#39;s release day the mirror did not yet have the tag (Image ... not found). It resolved within hours.</li><li><strong>Size the startup probe from a measured cold start</strong>, not from an example value.</li><li><strong>Disable every unused modality</strong> on multimodal models.</li><li><strong>Turn off thinking explicitly</strong> when benchmarking reasoning-capable models, and verify it per engine and per endpoint.</li><li><strong>Do not use GPU utilization as an efficiency KPI</strong> for LLM serving.</li></ol><h3>6. Limitations</h3><ul><li><strong>Unequal precision.</strong> Ollama ran 4-bit and vLLM BF16, each engine’s typical default. This favours Ollama at one user. A 4-bit vLLM run (e.g. gemma-4-E2B-it-qat-w4a16-ct) would likely narrow the single-user gap.</li><li><strong>Ollama untuned in phase 1.</strong> Phase 1 used Ollama’s default of one parallel request. Phase 2 (Section 4.6) corrects this. Other Ollama settings (flash attention, KV cache type, speculative decoding off) were not explored.</li><li><strong>Unequal speculative decoding.</strong> Ollama decoded speculatively in both phases, and vLLM did not. vLLM supports speculative decoding, which we did not enable.</li><li><strong>vLLM capped at 32 sequences.</strong> vLLM had headroom for about 90; higher settings were not tested.</li><li><strong>Few runs, short windows.</strong> Phase 1 had two runs per level (the tables use the dry run; the recorded run’s throughput was within 3%) and phase 2 had two to three, with 60–120 s windows and 5 minutes for scale-out tests. At 8 users, phase 2 runs varied by up to 1.7×. Headline ratios at 32 users were stable; we did not compute confidence intervals.</li><li><strong>Synthetic workload.</strong> Fixed 256-token outputs, eight prompts, closed-loop users with no think time. Real traffic has variable lengths and arrivals.</li><li><strong>Client-side TTFT</strong> includes the India-to-Belgium network round trip for both engines.</li><li><strong>One model, one GPU type, one region, list prices on one day.</strong></li><li><strong>Scale-out timing</strong> comes from a single run. Cloud Run’s exact scale-out trigger is not documented beyond request concurrency; the early start we observed may vary.</li></ul><h3>7. Conclusion</h3><p>On the same NVIDIA L4 and the same Gemma 4 E2B model on Cloud Run, <strong>Ollama is the better single-user engine and vLLM is the better serving engine</strong>. vLLM overtook Ollama at four users. At 32 users it delivered <strong>7.7× the throughput</strong> of Ollama’s defaults, where users waited up to 48 seconds. Against Ollama with 32 parallel slots it still delivered <strong>3.4× the throughput at 3.4× lower cost per token</strong>. Tuning Ollama removed the queue but not the gap. Cloud Run’s GPU utilization metric did not reflect this difference. Its autoscaling, which works on concurrency, started a second GPU early and billed it for more than six minutes before it served anyone. For production LLM serving on Cloud Run, choose the engine by concurrency, judge efficiency by tokens per dollar, and decide explicitly how you will pay for the scale-out gap.</p><h3>Appendix: reproduce it</h3><p>Quick single-request comparison:</p><pre># Ollama<br>curl -s $OLLAMA_URL/v1/chat/completions -H &quot;Content-Type: application/json&quot; -d &#39;{<br> &quot;model&quot;: &quot;gemma4:e2b&quot;,<br> &quot;messages&quot;: [{&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;Explain how a load balancer works in 5 sentences.&quot;}],<br> &quot;max_tokens&quot;: 256, &quot;reasoning_effort&quot;: &quot;none&quot;}&#39;</pre><pre># vLLM<br>curl -s $VLLM_URL/v1/chat/completions -H &quot;Content-Type: application/json&quot; -d &#39;{<br> &quot;model&quot;: &quot;google/gemma-4-E2B-it&quot;,<br> &quot;messages&quot;: [{&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;Explain how a load balancer works in 5 sentences.&quot;}],<br> &quot;max_tokens&quot;: 256, &quot;chat_template_kwargs&quot;: {&quot;enable_thinking&quot;: false}}&#39;</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*FVg56-I6lCioqLdt.png" /></figure><p><em>One question, one request each: “Explain how a load balancer works in 5 sentences.” Ollama took 1.65 s and vLLM 2.35 s, for 98 tokens each. The right edge is cut off where the webcam covered it.</em></p><h3>References</h3><ol><li>Kwon et al., <em>Efficient Memory Management for Large Language Model Serving with PagedAttention</em>, SOSP 2023: <a href="https://arxiv.org/abs/2309.06180">https://arxiv.org/abs/2309.06180</a></li><li>vLLM documentation, installation and hardware support: <a href="https://docs.vllm.ai/en/latest/getting_started/installation/">https://docs.vllm.ai/en/latest/getting_started/installation/</a></li><li>vLLM Gemma 4 recipe: <a href="https://docs.vllm.ai/projects/recipes/en/latest/Google/Gemma4.html">https://docs.vllm.ai/projects/recipes/en/latest/Google/Gemma4.html</a></li><li>Google Cloud — Run Gemma 4 on Cloud Run with vLLM: <a href="https://docs.cloud.google.com/run/docs/run-gemma-on-cloud-run">https://docs.cloud.google.com/run/docs/run-gemma-on-cloud-run</a></li><li>Google Cloud — Best practices for AI inference on Cloud Run with GPUs: <a href="https://docs.cloud.google.com/run/docs/configuring/services/gpu-best-practices">https://docs.cloud.google.com/run/docs/configuring/services/gpu-best-practices</a></li><li>Google Cloud — Configure GPUs for Cloud Run services: <a href="https://docs.cloud.google.com/run/docs/configuring/services/gpu">https://docs.cloud.google.com/run/docs/configuring/services/gpu</a></li><li>Gemma 4 E2B model card: <a href="https://huggingface.co/google/gemma-4-E2B-it">https://huggingface.co/google/gemma-4-E2B-it</a></li><li>Ollama — gemma4 model: <a href="https://ollama.com/library/gemma4">https://ollama.com/library/gemma4</a> · FAQ: <a href="https://docs.ollama.com/faq">https://docs.ollama.com/faq</a></li><li>vLLM container images: <a href="https://hub.docker.com/r/vllm/vllm-openai/tags">https://hub.docker.com/r/vllm/vllm-openai/tags</a></li></ol><p><em>Companion study: </em><a href="https://techtrapture.com/blog/cpu-vs-gpu-llm-inference-cloud-run"><em>CPU vs GPU for LLM inference on Cloud Run</em></a></p><p>Looking for a similar implementation, or for assistance with your Cloud and AI journey? Talk to TechTrapture: <a href="https://techtrapture.com/contact">https://techtrapture.com/contact</a> or email vishal.bulbule@techtrapture.com</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=47d4a35bf980" width="1" height="1" alt=""><hr><p><a href="https://medium.com/google-cloud/ollama-vs-vllm-on-cloud-run-with-an-nvidia-l4-a-real-benchmark-from-1-to-48-concurrent-users-47d4a35bf980">Ollama vs vLLM on Cloud Run with an NVIDIA L4: A Real Benchmark from 1 to 48 Concurrent Users</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[Self-Hosting Open LLMs on Google Cloud: When It Pays Off, and Which of the Four Options to Choose]]></title>
            <link>https://medium.com/google-cloud/self-hosting-open-llms-on-google-cloud-when-it-pays-off-and-which-of-the-four-options-to-choose-b7ce9ba17667?source=rss-ac9c985be096------2</link>
            <guid isPermaLink="false">https://medium.com/p/b7ce9ba17667</guid>
            <category><![CDATA[gemma]]></category>
            <category><![CDATA[open-source-llm]]></category>
            <category><![CDATA[qwen]]></category>
            <category><![CDATA[open-weight-model]]></category>
            <dc:creator><![CDATA[Vishal Bulbule]]></dc:creator>
            <pubDate>Fri, 06 Nov 2026 13:34:26 GMT</pubDate>
            <atom:updated>2026-11-09T06:41:41.250Z</atom:updated>
            <content:encoded><![CDATA[<h3>A decision framework built on list prices and our own benchmarks: API vs self-hosting, Model Garden vs Cloud Run vs GPU VM vs GKE, and the quota wall you will hit first</h3><p><em>Vishal Bulbule · Google Developer Expert ( Cloud &amp; AI) · Founder, TechTrapture</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*XDXge9uUyx0jSp-k.png" /></figure><p><em>The four ways to self-host an open model on Google Cloud: Model Garden, Cloud Run + GPU, a GPU VM, and GKE.</em></p><h3>Abstract</h3><p>Open-weight models such as Gemma, Qwen, Llama and DeepSeek can be downloaded and run anywhere. That raises two questions for every team building on them: <strong>should we self-host at all, or call a managed API?</strong> And if we self-host on Google Cloud, <strong>which of the four main options should we use?</strong> The options are Vertex AI / Agent Platform Model Garden, Cloud Run with GPUs, Compute Engine GPU VMs, and GKE.</p><p>We compare the options on management effort, available hardware, billing model, and cost, using Google Cloud list prices (Billing Catalog, 2 Nov 2026) and our own measurements on an NVIDIA L4. The deciding factor is <strong>utilization</strong>. A busy self-hosted GPU served Gemma 4 E2B at <strong>$0.32 per million output tokens</strong> (vLLM, 32 concurrent users), but a single request to an otherwise idle Cloud Run GPU cost about <strong>$0.24</strong>, because the instance is billed until it scales to zero. Per hour, Cloud Run is the most expensive option ($1.42/h vs $0.71/h for a GPU VM); it wins only because it can scale to zero. Above roughly <strong>12 hours of use per day</strong>, a GPU VM is cheaper. We also document the first operational barrier, <strong>GPU quota</strong>, including the free-trial restriction that blocks GPUs on VMs entirely. We close with a decision framework.</p><h3>1. Introduction</h3><p>Running an open model on a laptop is easy. Tools like Ollama make it a one-line command. Serving the same model to an application or a team is a different problem. A laptop is not always on, has no HTTPS endpoint or authentication, and answers one request at a time.</p><p>Teams moving from laptop to production face a sequence of decisions:</p><ol><li><strong>Whether to self-host</strong>, or call a managed API (Gemini, or an open model offered as a service).</li><li><strong>Where to self-host</strong>: on Google Cloud, four main options with very different billing models.</li><li><strong>Which inference engine</strong> runs inside: Ollama or vLLM.</li><li><strong>How to get GPUs</strong>: quota, which is the first error most teams see.</li></ol><p>This post works through them in order, with prices and measurements rather than opinions.</p><h3>Research questions</h3><ul><li><strong>RQ1:</strong> Under what conditions is self-hosting preferable to a managed API?</li><li><strong>RQ2:</strong> How do the four Google Cloud hosting options differ in effort, hardware and billing?</li><li><strong>RQ3:</strong> How do costs compare, and where are the break-even points?</li><li><strong>RQ4:</strong> What blocks teams on day one?</li></ul><h3>2. Method</h3><ul><li><strong>Sources:</strong> Google Cloud documentation for each service (references at the end), current as of 2 Nov 2026.</li><li><strong>Prices:</strong> list prices from the Google Cloud Billing Catalog API, read 2 Nov 2026, before discounts (no Spot, no committed-use discounts), for one NVIDIA L4 GPU.</li><li><strong>Measurements:</strong> our own benchmarks on Cloud Run with an NVIDIA L4 (europe-west1), published as companion studies:</li><li><em>CPU vs GPU for LLM inference on Cloud Run</em> (Gemma 2 2B, Ollama)</li><li><em>Ollama vs vLLM on Cloud Run with an NVIDIA L4</em> (Gemma 4 E2B, 1–48 concurrent users)</li><li><strong>Cost formula</strong> for a busy instance:cost per 1M output tokens = price per hour ÷ (tokens/s × 3600) × 1,000,000</li></ul><h3>3. Should you self-host at all? (RQ1)</h3><p>An analogy that holds up: <strong>a managed API is a taxi; self-hosting is owning a car.</strong> With the taxi you pay per ride and someone else does the maintenance, but you go where taxis go. With your own car you pay every month even while it is parked, and you fix it yourself, but you go anywhere, any time.</p><h3>3.1 When a managed API is the better choice</h3><ul><li><strong>Low or spiky traffic.</strong> You pay per token, so zero requests means zero bill.</li><li><strong>No operations.</strong> No GPUs, drivers, scaling, patching or 2 a.m. pages.</li><li><strong>Highest quality.</strong> Frontier models are far larger than anything that fits on one GPU.</li><li><strong>Instant scale.</strong> Ten users or ten thousand is the provider’s problem.</li></ul><h3>3.2 When self-hosting is the better choice</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*phmGCwXw8ODTAtr6.png" /></figure><h3>3.3 Lifecycle risk is real</h3><p>On <strong>21 October 2026</strong>, Google retired a batch of open-model APIs on its platform, including Qwen, older DeepSeek versions, Llama 3.3 70B, GLM and Kimi K2. Applications built on those endpoints had to migrate. A self-hosted copy of the weights would have kept running.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*65omrEz5H_8bmC8L.png" /></figure><p><em>Google’s open-model deprecations page: a batch of open-model APIs retired on 21 October 2026.</em></p><h3>3.4 What self-hosting costs you</h3><ul><li><strong>You pay for idle.</strong> The GPU is billed while it exists, answering or not.</li><li><strong>You operate it.</strong> Scaling, patching, monitoring and security become your job. Some engines ship with no authentication at all; Ollama is one, so never expose it without an auth layer in front.</li><li><strong>Smaller models.</strong> One 24 GB L4 comfortably serves models in the ~2–9B range, not frontier-scale models.</li><li><strong>GPU scarcity.</strong> You may not get the GPU you want in the region you want (Section 6).</li></ul><p><strong>Finding (RQ1):</strong> start with an API. Self-host when privacy, network control, lifecycle control or custom weights require it, or when traffic is steady enough to keep a GPU busy.</p><h3>4. The four options on Google Cloud (RQ2)</h3><p>Every option has the same three layers, <strong>client → inference engine (Ollama / vLLM) → model weights</strong>, on a GPU. What differs is who runs which layer, and how you are billed.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*Xd7EvJCYugEDARzb.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*02nItlTxMANgsAQ0.png" /></figure><p><em>Model Garden, the hotel room: pick a model card, deploy, get an endpoint. Billed per machine-hour from deploy until undeploy.</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/870/0*rybaUtTG9MsomNaR.png" /></figure><p><em>Cloud Run with one NVIDIA L4 attached (from the CPU vs GPU recording). Attaching a GPU switches the service to instance-based billing.</em></p><p>Naming note: Model Garden lives in what was called Vertex AI; Google’s documentation now places it under Gemini Enterprise Agent Platform.</p><p><strong>Watch the walkthrough:</strong> <a href="https://youtu.be/PtJ_f445oNc">Self-hosting open LLMs on Google Cloud</a></p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FPtJ_f445oNc%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DPtJ_f445oNc&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FPtJ_f445oNc%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/496c7449b097b76541ecc51418bf1b8b/href">https://medium.com/media/496c7449b097b76541ecc51418bf1b8b/href</a></iframe><h3>5. Cost analysis (RQ3)</h3><h3>5.1 Price per hour, one NVIDIA L4 (list prices, 2 Nov 2026)</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*oGRvlEEg_ghAzjKv.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*mQ2hoCCIYa2_Mu1D.png" /></figure><p><em>One L4, list prices 2 Nov 2026. Cloud Run wins below ~12 hours of use a day; a VM left on wins above it.</em></p><p><strong>Per hour, Cloud Run is the most expensive option.</strong> It wins only because it scales to zero.</p><ul><li><strong>Break-even, Cloud Run vs an always-on VM:</strong> $1.42 × h × 30 = $515 → <strong>h ≈ 12 hours/day.</strong> Above about 12 hours of use per day, a VM left running is cheaper. Below it, Cloud Run is. Cloud Run’s idle tail per scale-out (Section 5.3) moves the break-even lower in practice.</li><li><strong>Model Garden</strong> costs roughly <strong>30% more than an equivalent VM</strong>. That is the price of Google running the serving stack for you.</li></ul><h3>5.2 Busy GPU: cost per token depends on the engine</h3><p>Measured on Cloud Run, one L4 at $1.42/h, Gemma 4 E2B:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*UcyB7KwHhKaqCatn.png" /></figure><p>Same GPU, same price per hour: <strong>a 7.7× difference in cost per token</strong>, decided by the inference engine and how busy it is.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*aoxt8cmyls9O5RrA.png" /></figure><p><em>The raw benchmark output behind these costs, from the recorded run. The table above uses our dry run from the same day, so its values differ slightly.</em></p><h3>5.3 Idle GPU: the cost of one lonely request</h3><p>Instance-based billing charges for the whole instance lifetime. In our runs a Cloud Run GPU instance scaled to zero about <strong>10 minutes after its last request</strong>. One isolated request therefore costs roughly:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/870/0*HaH0mcwG58fiP4LY.png" /></figure><p>The same 256-token answer on a busy vLLM instance costs 256 × $0.32 / 1⁰⁶ ≈ <strong>$0.00008</strong>. That is a gap of about <strong>3,000×</strong> for the same model on the same GPU. Utilization, not the platform, dominates the cost of self-hosting.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*aX_R-cFgkuLMuJp6.png" /></figure><p><em>One isolated request pays for the idle tail; a busy vLLM instance spreads the GPU across many users.</em></p><p><strong>Finding (RQ3):</strong> self-hosting is cheap when the GPU is busy and expensive when it is idle. Pick the option whose billing matches your traffic: scale-to-zero (Cloud Run) for low or spiky traffic, always-on (VM, Model Garden, GKE) for steady traffic, with the engine (vLLM) doing the batching.</p><h3>6. The first barrier: GPU quota (RQ4)</h3><p>GPUs are rationed per project, per region, per GPU type, and per product. A team’s first error is usually a quota error, and that is normal.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*jZrcugwn1Fbfdl0O.png" /></figure><p><em>The error from our own recording: Cloud Run refused the GPU service because the project had no quota for L4s without zonal redundancy in that region.</em></p><p><strong>Free-trial restriction.</strong> New accounts get <strong>$300 credit for 90 days</strong>. While on the free trial (not upgraded to a paid billing account), you <strong>cannot add GPUs to VM instances</strong> and <strong>cannot request quota increases</strong>. Upgrading keeps the remaining credit within the original 90 days, and existing resources keep running.</p><p><strong>Cloud Run.</strong> Projects receive <strong>3 × L4 (without zonal redundancy)</strong> in a region automatically on their first GPU deployment there. Google notes that requests for zonal-redundancy-off quota are more likely to be granted.</p><p><strong>Quota is per product.</strong> L4 quota for Cloud Run does not give you L4s for Compute Engine or for Model Garden endpoints. Each has its own quota.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*8EfE39aZHgMciKBY.png" /></figure><p><em>GPU quota is per product: Cloud Run’s L4 quota does not give you L4s for Compute Engine or Model Garden.</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*a7hHEwrTYIB5gCGc.png" /></figure><p><em>Quota is not the only wall. Two real failures from our 3 Nov runs: a g2-standard-8 VM with an L4 unavailable in europe-west1-b, and a Model Garden deployment that could not get a g2-standard-12 with an L4.</em></p><p><strong>Finding (RQ4):</strong> check quota for the exact product, region and GPU before designing around it, and move off the free trial before planning any GPU VM.</p><h3>7. The engine inside the box</h3><p>Whichever option you pick, an inference engine loads the model and answers requests.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*A21bCItA-hfc4-Hg.png" /></figure><p>On Cloud Run, a VM or GKE you choose the engine. Model Garden deploys vLLM-family serving containers for you.</p><h3>8. Decision framework</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*p1AAir5RdQgFMQsqQesy-g.png" /></figure><h3>9. Limitations</h3><ul><li><strong>List prices only</strong>, for one GPU type (L4) and specific regions, on one date. Spot VMs, committed-use discounts and negotiated pricing change the break-even points, usually in favour of always-on options.</li><li><strong>Measurements cover one model family</strong> (Gemma) on one GPU type. Larger models change the hardware options and the economics.</li><li><strong>Idle-tail duration</strong> (about 10 minutes) is what we observed, not a documented guarantee.</li><li><strong>Feature status changes.</strong> Model Garden scale-to-zero was in Preview at the time of writing, and GPU availability per product and region changes frequently.</li><li><strong>Managed-API pricing</strong> was not benchmarked here. Compare your expected tokens per month against the current price of the model you would otherwise call.</li></ul><h3>10. Conclusion</h3><p>Self-hosting an open model on Google Cloud is neither inherently cheaper nor more expensive than calling an API. <strong>It is cheaper when you keep the GPU busy.</strong> A busy L4 running vLLM served tokens at $0.32 per million; the same GPU answering one isolated request cost about $0.24 for that single answer.</p><p>Choose a managed API by default. Self-host when privacy, control, lifecycle or custom weights demand it, or when traffic is steady. Then match the hosting option’s billing to your traffic pattern: Cloud Run for spiky, VM or Model Garden for steady, GKE for scale. Pick the engine by concurrency. And check your GPU quota before you design anything.</p><h3>References</h3><ol><li>Google Cloud — Choose an open model serving option: <a href="https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/open-models/choose-serving-option">https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/open-models/choose-serving-option</a></li><li>Google Cloud — Open model deprecations: <a href="https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/deprecations/open-models">https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/deprecations/open-models</a></li><li>Google Cloud — Configure GPUs for Cloud Run services: <a href="https://docs.cloud.google.com/run/docs/configuring/services/gpu">https://docs.cloud.google.com/run/docs/configuring/services/gpu</a></li><li>Google Cloud — Compare compute options: <a href="https://docs.cloud.google.com/docs/compute-area/choose-compute-options">https://docs.cloud.google.com/docs/compute-area/choose-compute-options</a></li><li>Google Cloud — GKE pricing: <a href="https://cloud.google.com/kubernetes-engine/pricing">https://cloud.google.com/kubernetes-engine/pricing</a></li><li>Google Cloud — Free Trial and Free Tier features and limits: <a href="https://docs.cloud.google.com/free/docs/free-cloud-features">https://docs.cloud.google.com/free/docs/free-cloud-features</a></li><li>Google Cloud — Cloud Run pricing: <a href="https://cloud.google.com/run/pricing">https://cloud.google.com/run/pricing</a></li><li>Ollama — FAQ (parallel requests): <a href="https://docs.ollama.com/faq">https://docs.ollama.com/faq</a></li><li>Kwon et al., <em>Efficient Memory Management for Large Language Model Serving with PagedAttention</em>, SOSP 2023: <a href="https://arxiv.org/abs/2309.06180">https://arxiv.org/abs/2309.06180</a></li></ol><p><em>Companion studies: </em><a href="https://techtrapture.com/blog/cpu-vs-gpu-llm-inference-cloud-run"><em>CPU vs GPU for LLM inference on Cloud Run</em></a><em> · </em><a href="https://techtrapture.com/blog/ollama-vs-vllm-cloud-run-l4"><em>Ollama vs vLLM on Cloud Run with an NVIDIA L4</em></a></p><p>Looking for a similar implementation, or for assistance with your Cloud and AI journey? Talk to TechTrapture: <a href="https://techtrapture.com/contact">https://techtrapture.com/contact</a> or email vishal.bulbule@techtrapture.com</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b7ce9ba17667" width="1" height="1" alt=""><hr><p><a href="https://medium.com/google-cloud/self-hosting-open-llms-on-google-cloud-when-it-pays-off-and-which-of-the-four-options-to-choose-b7ce9ba17667">Self-Hosting Open LLMs on Google Cloud: When It Pays Off, and Which of the Four Options to Choose</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[CPU vs GPU for LLM Inference on Cloud Run: A Measured Comparison with Gemma and an NVIDIA L4]]></title>
            <link>https://medium.com/google-cloud/cpu-vs-gpu-for-llm-inference-on-cloud-run-a-measured-comparison-with-gemma-and-an-nvidia-l4-be0aa5683bf3?source=rss-ac9c985be096------2</link>
            <guid isPermaLink="false">https://medium.com/p/be0aa5683bf3</guid>
            <category><![CDATA[google-cloud-platform]]></category>
            <category><![CDATA[nvidia-gpu]]></category>
            <category><![CDATA[cloud-run-gpu]]></category>
            <dc:creator><![CDATA[Vishal Bulbule]]></dc:creator>
            <pubDate>Fri, 06 Nov 2026 12:41:59 GMT</pubDate>
            <atom:updated>2026-11-10T04:04:33.393Z</atom:updated>
            <content:encoded><![CDATA[<h3>Same model, same container, same platform: the GPU was 13.5× faster per token and 6× cheaper per answer, though it costs twice as much per hour</h3><p><em>Vishal Bulbule · Google Developer Expert (Google Cloud) · TechTrapture</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*64V-BYqp56HcvfLo.png" /></figure><p><em>Same model, same Cloud Run service, one difference: 8.35 tokens/s on 4 vCPUs vs 113 tokens/s with an NVIDIA L4.</em></p><h3>Abstract</h3><p>Teams self-hosting open models on serverless platforms face an early choice: run the model on CPU, which needs no GPU quota and bills only per request, or attach a GPU, which costs more per hour and bills per instance. We deployed the same container (Ollama) and the same model (Gemma 2 2B, 4-bit) as two Cloud Run services that differed only in an NVIDIA L4 GPU, and measured generation speed, time to first token, cold start, and cost per million output tokens. On the L4, generation reached <strong>113 tokens/s versus 8.35 tokens/s on 4 vCPUs (13.5×)</strong>, and a 256-token answer took <strong>2.7 s versus 31.6 s</strong>. Although the GPU service costs <strong>$1.05/hour versus $0.49/hour</strong> for the CPU service, its cost per million output tokens was <strong>≈$2.57 versus ≈$16.30</strong>, about <strong>6× cheaper per answer</strong>. The GPU’s cold start, scaling from zero, was <strong>20.2 s</strong>. We discuss when the CPU option is still the right call: very low request volumes, where per-request billing and the GPU’s idle tail dominate.</p><h3>1. Introduction</h3><p>Cloud Run added NVIDIA GPU support, which makes it one of the simplest ways to self-host an open model on Google Cloud: one container, scale to zero, no cluster. That raises a practical question every team asks first: <em>do I actually need the GPU?</em></p><p>The CPU path is attractive. It needs no GPU quota, it is billed only while a request runs, and small models such as Gemma 2 2B do run on CPU. The GPU path costs more per hour and needs quota. Price per hour, however, is the wrong unit for comparing the two. What a product pays for is <strong>answers</strong>.</p><p>This post reports a controlled comparison: same image, same model, same region, same memory and vCPU count. The only difference is whether one NVIDIA L4 is attached. We report speed, latency, cold start, and <strong>cost per million output tokens</strong>, and we state the conditions under which each option wins.</p><h3>2. Background</h3><p><strong>Ollama</strong> is a popular open-source runtime for local LLMs. It packages models in the GGUF format, mostly 4-bit quantized, and runs them on llama.cpp on CPU or GPU. It exposes a native API (/api/generate, /api/chat) and an OpenAI-compatible API (/v1/chat/completions).</p><p><strong>Cloud Run GPUs.</strong> A Cloud Run service can attach one GPU per instance. We used an NVIDIA L4 (24 GB). GPU services require <strong>instance-based billing</strong> (--no-cpu-throttling): the whole instance is billed while it is up, including an idle period before it scales to zero. CPU services can use <strong>request-based billing</strong>, where CPU and memory are billed only while requests are being processed.</p><p><strong>Token speed terms.</strong></p><ul><li><em>Prompt processing (prefill):</em> reading the input.</li><li><em>Generation (decode):</em> producing output tokens, one at a time.</li><li><em>Time to first token (TTFT):</em> how long until text starts appearing.</li></ul><h3>3. Experimental setup</h3><h3>3.1 Platform and configuration</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*s1Quz0nKfnqMgJb9.png" /></figure><p>The two services were identical except for the GPU flags. Both mounted the same Cloud Storage bucket, so the model was downloaded once and read by both.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/870/0*mVsr56YAfbDpIktH.png" /></figure><p><em>The GPU service in the Cloud Run console: same 4 vCPU / 16 GiB, plus one NVIDIA L4. Attaching the GPU forces the switch from request-based to instance-based billing.</em></p><h3>3.2 Deployment</h3><p>CPU service:</p><pre>gcloud run deploy ollama-cpu \<br> --image ollama/ollama \<br> --region europe-west1 \<br> --cpu 4 --memory 16Gi \<br> --port 11434 \<br> --min-instances 0 --max-instances 1 \<br> --timeout 600 \<br> --set-env-vars OLLAMA_KEEP_ALIVE=-1 \<br> --add-volume name=models,type=cloud-storage,bucket=$BUCKET \<br> --add-volume-mount volume=models,mount-path=/root/.ollama</pre><p>GPU service, which is the same command plus four flags:</p><pre>--gpu 1 --gpu-type nvidia-l4 \<br> --no-gpu-zonal-redundancy \<br> --no-cpu-throttling</pre><p>--no-cpu-throttling is required for GPU services and switches the service to instance-based billing. --no-gpu-zonal-redundancy is cheaper and matched our available quota.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*uV1uEOm1bypMFr8U.png" /></figure><p><em>IAM &amp; Admin → Quotas and system limits, filtered on “Total Nvidia L4 GPU allocation without zonal redundancy”. It is set per region and is 0 in most regions until you request it.</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*6VsUmVegQVgqtd0C.png" /></figure><p><em>Our first attempt to create the GPU service failed on quota, which is why the quota page above matters.</em></p><h3>3.3 Workload and method</h3><ul><li><strong>Prompt:</strong> one fixed prompt (“Why are GPUs better than CPUs for AI workloads?”).</li><li><strong>Decoding:</strong> temperature 0, fixed seed (42), num_predict = 256 output tokens, so every run does the same amount of work.</li><li><strong>Runs:</strong> 5 sequential requests per service, through Ollama’s native /api/generate.</li><li><strong>Metrics:</strong> taken from Ollama’s own timing fields: prompt-eval and eval token counts and durations, and load duration. Wall time was measured client-side.</li><li><strong>Cold start:</strong> measured as the first request after the GPU service had scaled to zero.</li><li><strong>Pricing:</strong> Google Cloud Billing Catalog list prices for europe-west1 on the day of the run (2 Nov 2026), before free tier.</li></ul><h3>3.4 Cost model</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*_gGIFvzaE6seEolJ.png" /></figure><p>This assumes the instance is <strong>kept busy</strong>. We return to idle cost in Section 5.</p><p><strong>Watch the walkthrough:</strong> <a href="https://youtu.be/pIkdVmbJ99s">Ollama on Cloud Run: CPU vs GPU</a></p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FpIkdVmbJ99s%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DpIkdVmbJ99s&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FpIkdVmbJ99s%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/7c82c21423fb2637f21536c85bcab139/href">https://medium.com/media/7c82c21423fb2637f21536c85bcab139/href</a></iframe><h3>4. Results</h3><h3>4.1 Speed</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*LL2VAII-gL0SrGrf.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*cCwzls9uEbVJvxdK.png" /></figure><p><em>Generation speed, warm runs: 8.35 tokens/s on CPU vs 113 tokens/s on the L4.</em></p><p>The GPU improves both phases of inference. Prefill is about 16× faster, and generation about 13.5× faster. Network and routing overhead was the same for both services, about 0.4 s from the client, so for short prompts the end-to-end difference is driven by generation.</p><p>At 8.35 tokens/s, a reader sees a 256-token answer appear over roughly half a minute. At 113 tokens/s it appears in under three seconds, faster than anyone reads.</p><h3>4.2 Cold start</h3><p>The first GPU request after scaling to zero took <strong>20.2 s</strong> wall time. <strong>14.6 s</strong> of that was waiting for the first token, which is mostly loading the 1.6 GB model from the mounted bucket into GPU memory. Warm requests started in about 23 ms server-side.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*Y8_A-47grGVUOKzo.png" /></figure><p><em>The benchmark output. GPU run 1 is the cold start (20.2 s wall, 14.6 s to first token while the model loads); runs 2–5 are warm at ~113 tokens/s, which is why the 5-run GPU average shows 100.58.</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*3M10swqJU4cG91RF.png" /></figure><p><em>A test question to the GPU service: “Why is the sky blue?”. Ollama’s own timing fields at the end show 14.4 s before generation began, then 263 tokens in 2.31 s (about 114 tok/s).</em></p><h3>4.3 Cost per answer</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*2l5xp4CAUEjy0bek.png" /></figure><p>Breakdown, list prices for europe-west1:</p><ul><li><strong>CPU:</strong> 4 vCPU × $0.000024/s + 16 GiB × $0.0000025/s, request-based billing.</li><li><strong>GPU:</strong> L4 at $0.0001867/s + 4 vCPU × $0.000018/s + 16 GiB × $0.000002/s, instance-based billing.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*GieS4I2dxJsLXnXz.png" /></figure><p><em>List prices, europe-west1, 2 Nov 2026. The GPU service costs ~2× more per hour but ~6× less per million output tokens when kept busy.</em><strong>The GPU costs about 2× more per hour and about 6× less per answer.</strong></p><h3>5. Discussion</h3><h3>5.1 Cheaper per hour is not cheaper per answer</h3><p>The CPU service looks cheaper on the pricing page. Per unit of useful output, it is the expensive option, because it produces roughly 13× fewer tokens in the same hour. Whenever the instance is kept reasonably busy, the GPU wins on cost as well as speed.</p><h3>5.2 When the CPU still wins</h3><p>The cost model above assumes a busy instance. Two billing details change the answer at very low volume:</p><ol><li><strong>Request-based vs instance-based billing.</strong> The CPU service is billed only while requests run. The GPU service is billed for the whole instance lifetime.</li><li><strong>The idle tail.</strong> After the last request, a GPU instance stays up, and billed, for a while before scaling to zero. In our runs, scale-to-zero happened about 10 minutes after the last request.</li></ol><p>For a handful of requests a day, such as an internal tool, a nightly batch or a prototype, a CPU service can therefore be cheaper overall, provided users accept a 30-second answer. As soon as there is steady traffic or a human waiting on the answer, the GPU is the better choice on both speed and cost.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*hovXlW-suEqFlhO3.png" /></figure><p><em>What went wrong first: when the GPU service got a fresh instance, the model we had pulled earlier was gone, so the benchmark failed with HTTP 404 “model not found”. This is why the first note below is about storing the model outside the container.</em></p><h3>5.3 Practical notes</h3><ul><li><strong>Store the model outside the container.</strong> Cloud Run instances start empty. Mounting a Cloud Storage bucket means the model is downloaded once. Mount it where Ollama writes models (/root/.ollama); otherwise downloads land on the instance&#39;s in-memory disk and vanish with it.</li><li><strong>Keep the model loaded.</strong> OLLAMA_KEEP_ALIVE=-1 stops Ollama from unloading the model after 5 idle minutes while the instance is alive.</li><li><strong>Lock it down.</strong> Ollama has no authentication of its own. Use --no-allow-unauthenticated and let Cloud Run IAM guard the endpoint.</li></ul><h3>6. Limitations</h3><ul><li><strong>Single model, single size.</strong> Gemma 2 2B in 4-bit is small. Larger models widen the gap, and beyond a certain size they become impractical on CPU.</li><li><strong>Single-user, sequential workload.</strong> We measured one request at a time. Concurrency changes the picture, especially for engines built for batching. That is the subject of the companion study on Ollama vs vLLM.</li><li><strong>Small sample.</strong> Five runs per service with a fixed prompt. The differences are an order of magnitude, far larger than run-to-run noise, but exact values will vary.</li><li><strong>Prices are list prices</strong> for one region on one day, before free tier and discounts.</li><li><strong>Client location.</strong> Requests came from India to europe-west1. This affects end-to-end latency, not the server-side speeds reported.</li></ul><h3>7. Conclusion</h3><p>For LLM inference on Cloud Run, an NVIDIA L4 made Gemma 2 2B about <strong>13.5× faster</strong> at generating text and about <strong>6× cheaper per answer</strong> than 4 vCPUs, even though it costs about <strong>2× more per hour</strong>. CPU deployments still make sense for very low, latency-tolerant volumes, where per-request billing avoids paying for idle GPU time. For anything with real users, the GPU pays for itself.</p><p><strong>Decision rule:</strong> compare <strong>cost per answer at your expected load</strong>, not price per hour.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*By6P-JNKKTDr4UzO.png" /></figure><p><em>The decision in one card.</em></p><h3>References</h3><ol><li>Google Cloud — Configure GPUs for Cloud Run services: <a href="https://docs.cloud.google.com/run/docs/configuring/services/gpu">https://docs.cloud.google.com/run/docs/configuring/services/gpu</a></li><li>Google Cloud — Cloud Run pricing: <a href="https://cloud.google.com/run/pricing">https://cloud.google.com/run/pricing</a></li><li>Google Cloud — Run LLM inference on Cloud Run GPUs with Ollama: <a href="https://docs.cloud.google.com/run/docs/tutorials/gpu-gemma-with-ollama">https://docs.cloud.google.com/run/docs/tutorials/gpu-gemma-with-ollama</a></li><li>Google Cloud — Best practices for AI inference on Cloud Run with GPUs: <a href="https://docs.cloud.google.com/run/docs/configuring/services/gpu-best-practices">https://docs.cloud.google.com/run/docs/configuring/services/gpu-best-practices</a></li><li>Ollama — FAQ (keep-alive, parallel requests): <a href="https://docs.ollama.com/faq">https://docs.ollama.com/faq</a></li><li>Gemma 2 2B model card: <a href="https://huggingface.co/google/gemma-2-2b-it">https://huggingface.co/google/gemma-2-2b-it</a></li></ol><p><em>Companion study: </em><a href="https://techtrapture.com/blog/ollama-vs-vllm-cloud-run-l4"><em>Ollama vs vLLM on Cloud Run with an NVIDIA L4</em></a></p><p>Looking for a similar implementation, or for assistance with your Cloud and AI journey? Talk to TechTrapture: <a href="https://techtrapture.com/contact">https://techtrapture.com/contact</a> or email vishal.bulbule@techtrapture.com</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=be0aa5683bf3" width="1" height="1" alt=""><hr><p><a href="https://medium.com/google-cloud/cpu-vs-gpu-for-llm-inference-on-cloud-run-a-measured-comparison-with-gemma-and-an-nvidia-l4-be0aa5683bf3">CPU vs GPU for LLM Inference on Cloud Run: A Measured Comparison with Gemma and an NVIDIA L4</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[How to Generate Architecture Diagrams in Google Antigravity using MCP server]]></title>
            <link>https://vishalbulbule.medium.com/how-to-generate-architecture-diagrams-in-google-antigravity-using-mcp-server-7be72689de62?source=rss-ac9c985be096------2</link>
            <guid isPermaLink="false">https://medium.com/p/7be72689de62</guid>
            <category><![CDATA[text-to-diagram]]></category>
            <category><![CDATA[ai-diagram]]></category>
            <category><![CDATA[prompt-to-diagram]]></category>
            <category><![CDATA[animated-diagram]]></category>
            <dc:creator><![CDATA[Vishal Bulbule]]></dc:creator>
            <pubDate>Mon, 27 Jul 2026 10:35:21 GMT</pubDate>
            <atom:updated>2026-07-27T10:35:21.176Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*aQ2p6MSRBTFdRcpvtsr_sA.png" /></figure><p>Google Antigravity is an agentic IDE — the agent plans, edits, and runs code for you. What it doesn’t do out of the box is <em>draw</em>. When you need an architecture diagram for a design doc or a sequence diagram for a PR, you still tab out to a separate tool, wrestle with syntax, and paste an image back.</p><p>You can close that loop. By connecting the <strong>Capci MCP server</strong>, you can generate a <strong>diagram in Antigravity</strong> from a plain-text prompt — the agent calls the tool, and a publish-ready image comes back in the same conversation.</p><p><a href="https://capci.app/">Capci: Prompt-to-Diagram Tool for Your Agent</a></p><h3>What is Capci, and what problem does it solve</h3><p>Capci turns a plain-text description of a system into a finished visual — architecture diagrams with real cloud-provider icons, plus flowcharts, sequence, class, ER, mindmap and Gantt diagrams, data charts, and animated GIF exports.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*K2L-X1ZYka5D7kc43gQ4KQ.gif" /></figure><p>The problem it solves is the diagramming detour. Every time you need a picture of a system, you leave the tool you’re working in, drag boxes around a canvas, hunt down the right provider icons, align arrows, and re-style the output to match your brand — twenty minutes of manual work for an artifact you’ll redo the next time the architecture changes. The alternative, hand-writing a diagram DSL, starts faster and ages worse: it’s another syntax to maintain, and it still won’t give you real vendor icons, on-brand colors, or animation.</p><p>Capci collapses that into one step. You describe the system, you get the image, and you change it by describing the change. It runs in the browser at <a href="https://capci.app/">capci.app</a>, through a REST API, or — as in this guide — through MCP, so an agentic IDE can generate diagrams for you mid-task.</p><h3>What you’ll be able to do</h3><ul><li>Ask for an architecture diagram in words and get a clean image with real cloud-provider icons.</li><li>Generate flowcharts, sequence, class, ER, mindmap, and Gantt diagrams.</li><li>Refine in place: <em>“make it dark theme,”</em> <em>“add a caching layer.”</em></li><li>Export animated diagrams as GIFs for docs and posts.</li></ul><p>No diagram DSL to learn, no canvas to fiddle with.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*eS7b5CCv_8kYLFXfIpioPA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*eOQVzbcNY-P-KHLI0rB_IA.png" /></figure><h3>Step 1 — Create your Capci API key</h3><p>The MCP server authenticates with an API key, so grab one first:</p><ol><li>Go to <a href="https://capci.app/">capci.app</a> and sign in — <strong>Continue with Google</strong>, or email and password.</li><li>You’ll land on the dashboard at capci.app/app. Open the <strong>Account</strong> tab in the left sidebar.</li><li>Scroll to the <strong>API &amp; MCP</strong> card and click <strong>Generate API Key</strong>.</li><li>The key is shown in full, starting with capci_live_. Click <strong>Copy</strong>.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bgphGTxF_bvbgdVogIweag.png" /></figure><p>If you navigate away before copying it, you’re fine — the same card has a <strong>Show</strong> button that re-reveals the key later. Two buttons to be careful with: <strong>Regenerate</strong> issues a new key and kills the old one immediately (every config still using it breaks until you paste the new one in), and <strong>Revoke</strong> disables API access altogether.</p><p>Treat the key like a password — it’s tied to your account, so don’t commit it to a repo or paste it into a shared workspace file.</p><p>On the free plan the key works as a one-time trial against your free generation allowance, which is plenty to test the setup below. Paid plans get a recurring monthly API quota — see <a href="https://capci.app/pricing">capci.app/pricing</a>.</p><h3>Step 2 — Add the Capci MCP server to Antigravity</h3><p>Open ~/.gemini/config/mcp_config.json (or use Antigravity&#39;s MCP settings panel) and add a remote HTTP server. Antigravity uses serverUrl — not url — for remote Streamable-HTTP servers, with custom headers for auth:</p><pre>{<br>  &quot;mcpServers&quot;: {<br>    &quot;capci&quot;: {<br>      &quot;serverUrl&quot;: &quot;https://mcp.capci.app/mcp&quot;,<br>      &quot;headers&quot;: { &quot;x-api-key&quot;: &quot;YOUR_API_KEY&quot; }<br>    }<br>  }<br>}</pre><p>Reload the MCP servers. Antigravity discovers the Capci tools (create_diagram, refine_diagram, animate_diagram, and more).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*wu0o6L6j6jOxCydhvG7fSw.png" /></figure><h3>Step 3 — Prompt for a diagram</h3><p>In the agent chat:</p><pre>Create an architecture diagram: users → CDN → a Cloud Run API → Firestore,<br>with a Pub/Sub side-channel to a background worker.</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*3gvEuHdcgipPrK14F068VA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*U8vG98-0ERROzb3Zo0wcpw.png" /></figure><p>The agent calls Capci and returns the diagram inline. Not quite right? Just say:</p><pre>Add a Redis cache between the API and Firestore, and switch to a dark theme.</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*AoNvWMklGtWzxY5CdlCTdQ.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*9d2S9FDKGTC20--bKIzOFA.png" /></figure><h3>Why do it this way</h3><p>The whole point of an agentic IDE is staying in one place while the work gets done. Bolting a text to diagram tool onto Antigravity via MCP keeps diagramming in that same flow: describe it, get it, refine it, ship it — without leaving the editor or learning another tool’s syntax.</p><p>It also changes what you bother to diagram at all. When prompt to diagram takes ten seconds instead of twenty minutes, you start drawing the things you used to describe in a paragraph and hope people followed — the retry path, the failure mode, the bit of the flow every reviewer asks about.</p><h3>Try it</h3><ol><li>Grab a free key at <a href="https://capci.app/">capci.app</a>.</li><li>Add the MCP config above to Antigravity.</li><li>Ask for your first diagram.</li></ol><p>See the full setup and per-host configs in the Capci <a href="https://github.com/vishal-bulbule/capci-mcp">MCP</a> repo, including Claude and VS Code.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=7be72689de62" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Building AI-Powered search App with Elastic ,Google Gemini & ADK]]></title>
            <link>https://medium.com/google-cloud/building-ai-powered-search-app-with-elastic-google-gemini-adk-38e8c932672f?source=rss-ac9c985be096------2</link>
            <guid isPermaLink="false">https://medium.com/p/38e8c932672f</guid>
            <category><![CDATA[google]]></category>
            <category><![CDATA[elasticsearch]]></category>
            <category><![CDATA[google-gemini]]></category>
            <dc:creator><![CDATA[Vishal Bulbule]]></dc:creator>
            <pubDate>Wed, 08 Jul 2026 18:07:44 GMT</pubDate>
            <atom:updated>2026-07-21T07:28:30.295Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*8xX3Fs-L79M6iSQYy1tZhg.png" /></figure><p>Open ChatGPT or Gemini and ask it something only your company would know — say, how many weeks of parental leave your primary caregivers get. You’ll get a refusal, a confident-sounding guess, or some generic HR boilerplate. None of it is your actual policy, because the model has never seen your documents.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*cIKAKrdx2C7yAT8zLMqVUg.png" /></figure><p>That’s the gap <strong>RAG</strong> fills. <strong>Retrieval-Augmented Generation </strong>is a fancy name for a simple idea: before the model answers, go fetch the relevant documents and hand them over, so the answer is grounded in your data instead of the model’s imagination.</p><p>In this post I’ll build a real one with you — an internal <strong>HR-policy assistant</strong> running entirely on <strong>Google Cloud</strong>. <strong>Elasticsearch</strong> <strong>Serverless</strong> does the retrieval, Agent Platform (Former Vertex AI) provides the models, and Elastic Agent Builder ties it together. There’s very little code to write, and by the end you’ll actually understand why each piece is in the picture, not just that it’s there.</p><h3>Why Elasticsearch with Google Cloud</h3><p>If you live on Google Cloud, you’ve probably already spotted the obvious objection: Google Cloud has its own retrieval stack Agent Search (Vertex AI Search), RAG Engine, Vector Search. So why drag Elastic into it?</p><p>Fair question, and the answer is that this isn’t an either/or. The models stay Google’s Gemini handles the embeddings, the reranking, and the final answer. You never leave Google Cloud, because Elasticsearch Serverless runs natively on Google Cloud, in the same region as Vertex AI. All you’re really swapping is one layer: the search engine underneath the models.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*3UEqZ9eD1tBOjLbqkXMb9A.png" /></figure><p>And that layer is worth swapping deliberately, because search is harder than it looks and Elastic has been doing nothing else for fifteen years. They took <strong>BM25 </strong>the keyword-ranking algorithm researchers have leaned on since the ’90s and made it the default the rest of the industry followed similar BM25 as default search.</p><p>Elastic turned <strong>Reciprocal Rank Fusion</strong> into a first-class way to blend keyword and vector results. And they give you something most turnkey RAG boxes won’t: you can ask <em>why</em> a document ranked where it did, and get a real answer.</p><p>The way I think about it:</p><blockquote><strong>Google Cloud provides state-of-the-art Gemini models, while Elasticsearch provides a mature and highly optimized search engine. Together they form a powerful enterprise RAG stack</strong></blockquote><p>You can find about latest Embedding models &amp; Reranker here</p><ul><li><a href="https://ai.google.dev/gemini-api/docs/embeddings">Embeddings | Gemini API | Google AI for Developers</a></li><li><a href="https://docs.cloud.google.com/generative-ai-app-builder/docs/ranking">Improve search and RAG quality with ranking API | Agent Search | Google Cloud Documentation</a></li></ul><h3>The concepts, quickly</h3><p>If the terms below are already second nature, skip ahead. If not, here’s the whole vocabulary you need.</p><p>An <strong>embedding model</strong> turns a piece of text into a list of numbers a vectorthat captures what the text <em>means</em>, not which words it uses. Two sentences that say the same thing in different words end up close together. That’s the trick that lets a search for “time off for new parents” find a doc titled “Parental Leave Policy” with zero words in common. We’ll use Google’s gemini-embedding-001.</p><p><strong>Keyword search (BM25)</strong> ranks by word overlap. It’s fast and exact, and completely blind to meaning. <strong>Vector search</strong> ranks by how close two embeddings are, so it’s good at meaning but occasionally loose on specifics. <strong>BM25 (Best Matching 25)</strong> is a <strong>keyword-based ranking algorithm</strong> used by search engines to determine <strong>how relevant a document is to a user’s search query</strong>.</p><p>Unlike vector search, BM25 <strong>does not understand the meaning</strong> of words. It simply ranks documents based on how well the query terms match the document.</p><p>You don’t have to pick a side: run both and fuse the results with <strong>RRF</strong> that’s <strong>hybrid search</strong>.</p><blockquote><em>Hybrid Search = </em><strong><em>BM25 + Vector Search + RRF</em></strong></blockquote><p>A <strong>reranker</strong> is the part people skip and shouldn’t. After the first search hands back a pile of candidates, the reranker re-reads the top few <em>against the actual question</em> and reshuffles them so the genuinely best document lands at the top. It’s a small, specialized model, not a chatbot Google Cloud’s semantic-ranker-fast-004 in our case.</p><p>Finally the <strong>LLM</strong> (gemini-2.5-pro). Search gives you documents; people want a sentence. The LLM reads the top documents and writes the grounded answer with a citation.</p><p><strong>Agent Builder</strong> abstracts the orchestration layer, allowing developers to focus on tools and business logic instead of manually wiring retrieval, reranking, and LLM orchestration.</p><p><strong>Agent Builder</strong> is Elastic’s layer for putting an agent over all of this. You define tools (like “search the policy docs”), attach them to an agent, and call it from an API or expose it over <strong>MCP</strong> so other agents can use your tools too. More on that later.</p><p><a href="https://www.elastic.co/docs/explore-analyze/ai-features/agent-builder/mcp-server">https://www.elastic.co/docs/explore-analyze/ai-features/agent-builder/mcp-server</a></p><p>That’s it. Now let’s build. Refer video for live demo and steps given in this blog.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FoGyBwdviKb8%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DoGyBwdviKb8&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FoGyBwdviKb8%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/951da5c20ec09f34d363e6d788ce1139/href">https://medium.com/media/951da5c20ec09f34d363e6d788ce1139/href</a></iframe><h3>What we’re building</h3><p>In this blog we demonstrates how to build an enterprise-grade AI-powered RAG (Retrieval-Augmented Generation) application using Elasticsearch Serverless and Google Cloud Agent Platform (Formerly known as Vertex AI).</p><p>Elasticsearch Serverless integrates with three external Vertex AI inference endpoints Gemini Embedding for semantic indexing, Vertex AI Semantic Reranker for improving search relevance, and Gemini 2.5 pro for generating grounded responses. Elastic Agent Builder orchestrates these services to retrieve relevant documents, rerank search results, and generate accurate, citation-backed answers from enterprise knowledge bases such as HR policies, documentation, and internal knowledge repositories.</p><p>The same search capabilities can also be exposed through MCP, enabling seamless integration with AI agents built using frameworks like Google ADK.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*sCY2o0bq26oASVUml_IWVA.png" /></figure><p>For data I’m using a set of “TechTrapture HR policy” PDFs parental leave, sick leave, expenses, BYOD, the usual. They’re made up, so you can clone the repo and reproduce every step.</p><h3>Step 1 — Stand up Elasticsearch Serverless</h3><p>In Elastic Cloud, create a <strong>Serverless</strong> project of type <em>Elasticsearch</em> on <strong>Google Cloud</strong>. Serverless means exactly what it sounds like: no nodes, no shards, no scaling knobs. You get an endpoint and a Kibana, and Elastic runs the rest.</p><p><a href="https://console.cloud.google.com/marketplace/product/elastic-prod/elastic-cloud?utm_source=linkedin&amp;utm_medium=paid-social&amp;utm_campaign=vishal-agentic-ai">Creating a Serverless Elasticsearch project on Google Cloud in the Elastic Cloud console.</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*TCJ0LeogRD2uy4D5KMLmAA.jpeg" /></figure><p>Once it’s up, open <strong>Kibana → Dev Tools → Console</strong> and check it’s alive:</p><p>GET /</p><h3>Step 2 — Connect three Vertex AI models</h3><p>This is the part that makes the whole thing click. Elastic lets you plug Google’s models straight into the search pipeline through <strong>Inference Endpoints</strong> (under External Inference in your Serverless project).</p><p><strong>Elasticsearch Serverless integrates with three external inference endpoints backed by Google Cloud Agent Platform (displayed as Vertex AI in the current Elastic UI):</strong></p><ul><li>Gemini Embedding (gemini-embedding-001)</li><li>Semantic Reranker (semantic-ranker-fast-004)</li><li>Gemini 2.5 Pro (Chat Completion)</li></ul><p>One heads-up if you’re following an older tutorial: this used to be called “AI Connectors.” The feature moved to <strong>Inference Endpoints</strong> — same idea, different menu.</p><p>You need three of them, one per job:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*kR4KZzvCHLcpoM57ZLmCCQ.jpeg" /></figure><p>The Inference Endpoints screen showing the three Google Vertex AI endpoints.</p><p>Each one authenticates to Vertex AI with a Google Cloud service-account key. You can click through the UI, or create them in Dev Tools to get clean IDs. Here’s the reranker and note that a Vertex <em>rerank</em> endpoint is unusually simple, it only wants your project and the key:</p><pre>PUT _inference/rerank/google_vertex_rerank<br>{<br>  &quot;service&quot;: &quot;googlevertexai&quot;,<br>  &quot;service_settings&quot;: {<br>    &quot;service_account_json&quot;: &quot;PASTE_SERVICE_ACCOUNT_JSON_AS_A_STRING&quot;,<br>    &quot;project_id&quot;: &quot;YOUR_GCP_PROJECT_ID&quot;<br>  },<br>  &quot;task_settings&quot;: { &quot;top_n&quot;: 5 }<br>}</pre><p>The embeddings and chat endpoints look much the same, just with a model_id and location added. The full set of commands, including the gcloud bit that creates the service account, is in the repo.</p><h3>Step 3 — Load the documents</h3><p>The quickest way to get PDFs in with no code is Kibana’s <strong>Search → Upload a file</strong>. Drop a policy PDF, name the index hr_policies, and import. Elastic pulls the text into a field called attachment.content and the title into attachment.title.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bYld0Q3My1Bu5rf-jgvi2g.jpeg" /></figure><p>If you want semantic search too, add a semantic_text field pointed at your embeddings endpoint. From then on Elastic embeds every document automatically as it lands there’s no embedding pipeline for you to build and babysit. (semantic_text is one of Elastic’s own conveniences, and a genuinely nice one.)</p><p>Quick check that everything made it in:</p><pre>GET hr_policies/_count</pre><p>Step 4 — Watch keyword search miss</p><p>Here’s the case for a reranker, made by letting plain search fail first. Ask a normal human question:</p><pre>POST hr_policies/_search<br>{<br>  &quot;retriever&quot;: {<br>    &quot;standard&quot;: { &quot;query&quot;: { &quot;match&quot;: { &quot;attachment.content&quot;: &quot;how much time off do new parents get&quot; } } }<br>  },<br>  &quot;_source&quot;: [&quot;attachment.title&quot;],<br>  &quot;size&quot;: 5<br>}</pre><p>Look at what comes back. The <strong>Sick Leave &amp; PTO</strong> policy is on top, because the words “time off” show up there constantly. But the question is about <em>new parents</em>, and the parental-leave doc — the one that actually answers it — is ranked too low. Keyword search counted words; it didn’t understand the question.</p><h3>Step 5 — Add the Vertex reranker</h3><p>Same query, now wrapped so the top results get a second pass from your Vertex reranker:</p><pre>POST hr_policies/_search<br>{<br>  &quot;retriever&quot;: {<br>    &quot;text_similarity_reranker&quot;: {<br>      &quot;retriever&quot;: {<br>        &quot;standard&quot;: { &quot;query&quot;: { &quot;match&quot;: { &quot;attachment.content&quot;: &quot;how much time off do new parents get&quot; } } }<br>      },<br>      &quot;field&quot;: &quot;attachment.content&quot;,<br>      &quot;inference_id&quot;: &quot;google_vertex_rerank&quot;,<br>      &quot;inference_text&quot;: &quot;how much time off do new parents get&quot;,<br>      &quot;rank_window_size&quot;: 10<br>    }<br>  },<br>  &quot;_source&quot;: [&quot;attachment.title&quot;],<br>  &quot;size&quot;: 5<br>}</pre><p>Same question, same retrieval, one extra wrapper and the <strong>Parental Leave</strong> policy is suddenly #1. The reranker understood that “new parents” points at parental leave, not at the policy that happens to repeat the phrase “time off.” That’s the whole job of a reranker, and it’s why I never ship serious RAG without one.</p><h3>Step 6 — Make the reranked search a tool</h3><p>To hand this to an agent, we wrap it as a <strong>tool</strong>. Reranking lives in Elastic’s ES|QL, so we create an <strong>ES|QL tool</strong> that bakes in the RERANK command:</p><pre>POST kbn:/api/agent_builder/tools<br>{<br>  &quot;id&quot;: &quot;hr_policies.search_reranked&quot;,<br>  &quot;type&quot;: &quot;esql&quot;,<br>  &quot;description&quot;: &quot;Search the HR policy documents and rerank results with the Vertex AI reranker.&quot;,<br>  &quot;configuration&quot;: {<br>    &quot;query&quot;: &quot;FROM hr_policies | WHERE attachment.content : ?query | LIMIT 100 | RERANK ?query ON attachment.content WITH { \&quot;inference_id\&quot;: \&quot;google_vertex_rerank\&quot; } | SORT _score DESC | KEEP attachment.title, attachment.content, _score | LIMIT 5&quot;,<br>    &quot;params&quot;: { &quot;query&quot;: { &quot;type&quot;: &quot;string&quot;, &quot;description&quot;: &quot;The user&#39;s question&quot; } }<br>  }<br>}</pre><p>Two things that tripped me up the first time, so they don’t trip you up: the inference endpoint goes inside a WITH { “inference_id”: “…” } object, and you have to add | SORT _score DESC after RERANK or you get the reranked scores back in the original order.</p><h3>Step 7 — Create the agent and ask it something</h3><p>Attach the tool to an agent:</p><pre>POST kbn:/api/agent_builder/agents<br>{<br>  &quot;id&quot;: &quot;hr-policy-agent&quot;,<br>  &quot;name&quot;: &quot;HR Policy Assistant&quot;,<br>  &quot;configuration&quot;: {<br>    &quot;instructions&quot;: &quot;Answer strictly from the hr_policies.search_reranked tool results. Cite the document title. If the policies do not cover it, say so plainly.&quot;,<br>    &quot;tools&quot;: [ { &quot;tool_ids&quot;: [&quot;hr_policies.search_reranked&quot;] } ]<br>  }<br>}</pre><p>One thing to know: the agent’s chat model is a global setting in Agent Builder (<strong>Model management / Feature settings</strong>), not something you set per agent. Point it at your gemini-2.5-pro endpoint and now generation runs on Vertex too — the whole stack stays on Google Cloud.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*E39Nxu3B0ZYm-v-Yb_EW3Q.jpeg" /></figure><p>Then talk to it through the converse API the exact call your own app would make:</p><pre>curl -sS -X POST &quot;${KIBANA_URL}/api/agent_builder/converse&quot; \<br>  -H &quot;Authorization: ApiKey ${API_KEY}&quot; \<br>  -H &quot;kbn-xsrf: true&quot; \<br>  -H &quot;Content-Type: application/json&quot; \<br>  -d &#39;{<br>    &quot;input&quot;: &quot;How many weeks of parental leave do primary caregivers get?&quot;,<br>    &quot;agent_id&quot;: &quot;hr-policy-agent&quot;<br>  }&#39;</pre><p>The response carries the answer, the documents it leaned on, and a model_usage block with token counts which leads neatly into the next bit.</p><h3>Does the reranker actually save money?</h3><p>Reranking isn’t only about getting the right answer. Because it narrows things down to the handful of documents that matter, the LLM has far less to read. In my test, the reranked agent answered the same question correctly while feeding the chat model roughly half the input tokens of the un-reranked version, and it came back faster too.</p><p>Now, the obvious pushback and it’s a good one — is that the reranker is <em>also</em> a model, so isn’t it just moving the cost around? Partly, yes, and it’s worth being straight about it. What you’re really doing is spending a little on a cheap model to spend a lot less on an expensive one. A reranker is a small cross-encoder, billed per request, and it generates no output tokens. The generative LLM is a big model billed per token. Trim what reaches the big model and the bill drops.</p><p>How much it drops depends on which chat model you run and how many queries you serve. On a small, cheap model the savings are modest. On a larger model, or at real volume, they’re substantial. Either way, the dependable wins are relevance and latency; the lower cost is a bonus that grows as you scale. I’d rather tell you that than wave a single token number around as if it were universal.</p><h3>Bonus: drive it from a Google Cloud ADK agent over MCP</h3><p>Here’s where it gets fun. Agent Builder publishes every tool over <strong>MCP</strong>, the Model Context Protocol. So a <strong>Google Cloud ADK</strong> agent Gemini-powered — can call your Vertex-reranked search as if it were a native tool, with no integration code in between.</p><p>The entire bridge is one McpToolset pointed at the MCP endpoint:</p><pre>McpToolset(<br>    connection_params=StreamableHTTPConnectionParams(<br>        url=f&quot;{KIBANA_URL}/api/agent_builder/mcp&quot;,<br>        headers={&quot;Authorization&quot;: f&quot;ApiKey {API_KEY}&quot;, &quot;kbn-xsrf&quot;: &quot;true&quot;},<br>    ),<br>    tool_filter=[&quot;hr_policies_search_reranked&quot;, &quot;platform_core_search&quot;],<br>)</pre><p>One subtlety that’s easy to trip on: MCP hands out <em>tools</em>, not agents. Over MCP, the ADK/Gemini model is the agent, and it calls Elastic’s tools directly. (If you wanted to call a whole Elastic agent as a single unit, you’d reach for the A2A endpoint instead.)</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*4zg_M1fPH9AJs_nefrrRSg.png" /></figure><p>That’s what makes this worth doing rather than a party trick — the same reranked search tool can be used by your own app, by Claude Desktop or Cursor, or by an ADK agent, all from one definition.</p><p>You can find complete code in GitHub repo.</p><p><a href="https://github.com/vishal-bulbule/elastic-with-google-cloud">GitHub - vishal-bulbule/elastic-with-google-cloud</a></p><h3>Where this leaves you</h3><p>By combining Elasticsearch Serverless with Vertex AI models and Elastic Agent Builder, you’ve built a production-ready enterprise search assistant that delivers accurate, citation-backed answers from private knowledge bases. The same architecture can power internal copilots, customer support assistants, HR bots, documentation search, and AI agents through MCP with minimal custom code.One cloud, one stack, barely any glue code, and I hope a clear sense of what each part is doing and when you’d actually want it.</p><h3>Try it yourself</h3><ul><li>🎥 <strong>Full video walkthrough:</strong> <a href="https://youtu.be/oGyBwdviKb8">https://youtu.be/oGyBwdviKb</a>8</li><li>💻 <strong>Code, commands &amp; sample data:</strong> <a href="https://github.com/vishal-bulbule/elastic-with-google-cloud">https://github.com/vishal-bulbule/elastic-with-google-cloud</a></li><li>🆓 <a href="https://www.elastic.co/elasticsearch?utm_source=youtube&amp;utm_medium=paid-video&amp;utm_campaign=vishal-agentic-ai-rm"><strong>Start an Elastic free trial</strong> </a>and follow along</li><li>📚 <a href="https://www.elastic.co/docs/explore-analyze/ai-features/agent-builder/mcp-server">Elastic Agent Builder — MCP server docs</a></li><li>📚 <a href="https://adk.dev/tools-custom/mcp-tools/">Google ADK — MCP tools docs</a></li></ul><p><em>Adapting this to your own documents, or sorting out the production details? That’s the kind of thing I help teams with feel free to reach out on vishal.bulbule@techtrapture.com</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=38e8c932672f" width="1" height="1" alt=""><hr><p><a href="https://medium.com/google-cloud/building-ai-powered-search-app-with-elastic-google-gemini-adk-38e8c932672f">Building AI-Powered search App with Elastic ,Google Gemini &amp; ADK</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[Agent Development Kit (ADK) Deployment Guide]]></title>
            <link>https://medium.com/google-cloud/agent-development-kit-adk-deployment-guide-0a927ccc6e69?source=rss-ac9c985be096------2</link>
            <guid isPermaLink="false">https://medium.com/p/0a927ccc6e69</guid>
            <category><![CDATA[agent-on-gke]]></category>
            <category><![CDATA[google-adk]]></category>
            <category><![CDATA[adk-deployment]]></category>
            <dc:creator><![CDATA[Vishal Bulbule]]></dc:creator>
            <pubDate>Wed, 01 Jul 2026 12:57:19 GMT</pubDate>
            <atom:updated>2026-07-02T00:01:42.359Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*R4zRMeDpc3kTSKmc.png" /></figure><h4>This guide provides a central overview of deployment options, setup procedures, and a decision matrix for hosting your Agent Development Kit (ADK) agents on Google Cloud Platform (GCP).</h4><h3>1. What is Agent Development Kit (ADK)?</h3><p>The <strong>Agent Development Kit (ADK)</strong> is a powerful framework designed by Google to simplify building, testing, and deploying autonomous AI agents and multi-agent systems. It provides first-class abstractions for:</p><ul><li><strong>Agents</strong>: Configurable LLM-driven objects with specific system instructions and tools.</li><li><strong>Conversations &amp; Sessions</strong>: Standardized state management.</li><li><strong>Tools &amp; MCP Integration</strong>: Easy connection to standard local or remote tools (e.g., Google Search, BigQuery, databases) using Model Context Protocol (MCP).</li><li><strong>Observability</strong>: Built-in OpenTelemetry logging and tracing.</li></ul><h3>2. Deployment Options Overview</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*PMJYlKMda3l6NHTi.png" /></figure><p>When moving your ADK agent from local development to production on GCP, you have three primary deployment options:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*4WTnSeuyxWUZ2SM4y1O7bg.png" /></figure><ol><li><strong>Vertex AI Agent Engine ( Now, Agent Platform Agent Runtime) </strong>: Serverless runtime specifically optimized for running reasoning engines and Python agent workflows.</li><li><strong>Google Cloud Run</strong>: Serverless container runtime suitable for web applications, custom APIs, and UIs.</li><li><strong>Google Kubernetes Engine (GKE)/Custom</strong>: Fully managed Kubernetes service for enterprise container orchestration.</li></ol><h3>3. Decision Matrix: When to Use What?</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bnbFWQenXTgWQTL1YTsChA.png" /></figure><h3>4. Step-by-Step Deployment Guides</h3><p>I have used project tt-labs-001 &amp; us-central1 for example. Please replace with your project id.</p><h3>A. Google Cloud Run Deployment</h3><p>You can deploy to Cloud Run either by using the ADK CLI directly or by writing a custom build and deployment script.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2Fvj97RE5sjYQ%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3Dvj97RE5sjYQ&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2Fvj97RE5sjYQ%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/247a9b6ba41ef42785a81c4df359bfe1/href">https://medium.com/media/247a9b6ba41ef42785a81c4df359bfe1/href</a></iframe><h4>Option 1: Using the ADK CLI (Recommended)</h4><p>The ADK CLI builds the image and deploys the agent with a single command.</p><p>Create a script deploy_run.sh in your agent folder:</p><pre>#!/bin/bash<br>PROJECT_ID=tt-labs-001<br>LOCATION_ID=us-central1<br>adk deploy cloud_run \<br>        --project=$PROJECT_ID \<br>        --region=$LOCATION_ID \<br>        --service_name=&quot;my-first-agent&quot; \<br>        --app_name=&quot;my_first_agent&quot; \<br>        --trace_to_cloud \<br>        --otel_to_cloud \<br>        --with_ui \<br>        --port 8080 \<br>        my_first_agent</pre><h4>Option 2: Custom Dockerfile &amp; Gcloud CLI</h4><p>If you need custom control over your build, write a deploy.sh script:</p><pre>#!/usr/bin/env bash<br>set -euo pipefail<br>PROJECT_ID=&quot;tt-labs-001&quot;<br>REGION=&quot;us-central1&quot;<br>REPO=&quot;adk-repo&quot;<br>IMAGE=&quot;my-first-agent&quot;<br>SERVICE=&quot;my-first-agent&quot;<br>TAG=&quot;${REGION}-docker.pkg.dev/${PROJECT_ID}/${REPO}/${IMAGE}:latest&quot;<br># 1. Project config<br>gcloud config set project &quot;${PROJECT_ID}&quot;<br># 2. Build image<br>gcloud builds submit --tag &quot;${TAG}&quot; .<br># 3. Deploy<br>gcloud run deploy &quot;${SERVICE}&quot; \<br>  --image=&quot;${TAG}&quot; \<br>  --region=&quot;${REGION}&quot; \<br>  --platform=managed \<br>  --allow-unauthenticated \<br>  --port=8080 \<br>  --cpu=1 \<br>  --memory=1Gi \<br>  --set-env-vars=&quot;GOOGLE_GENAI_USE_VERTEXAI=1,GOOGLE_CLOUD_PROJECT=${PROJECT_ID},GOOGLE_CLOUD_LOCATION=${REGION}&quot;</pre><h3>B. Vertex AI Agent Engine Deployment</h3><p>Agent Engine provides a managed Python serverless host for reasoning engines.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2Fkndv61pGjS8%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3Dkndv61pGjS8&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2Fkndv61pGjS8%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/59696cba9eacc6cf9d7a83b682a8d5bf/href">https://medium.com/media/59696cba9eacc6cf9d7a83b682a8d5bf/href</a></iframe><p>Create a script deploy_agent_engine.sh in your agent folder:</p><pre>#!/bin/bash<br>PROJECT_ID=tt-labs-001<br>LOCATION_ID=us-central1<br>adk deploy agent_engine \<br>        --project=$PROJECT_ID \<br>        --region=$LOCATION_ID \<br>        --trace_to_cloud \<br>        --otel_to_cloud \<br>        --with_ui \<br>        --display_name=&quot;my-first-agent&quot; \<br>        my_first_agent</pre><p>Once Deployed you will see Agent Engine Instance in UI</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*IQ_QfQHfZT5qM-qYjg_GXQ.png" /></figure><p>You can test end to end Agent using Playground</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*AO-40XSPLZMEaNlRX_pjlA.png" /></figure><p>You can see Traces ,sessions in Agent Engine Observability</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*PvvzmzqdicwZeZ7eO_FbEw.png" /></figure><h3>C. Google Kubernetes Engine (GKE) Deployment</h3><p>For robust enterprise applications, GKE provides full orchestration, container management, and advanced security.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2Fj68Q5wvwaao%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3Dj68Q5wvwaao&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2Fj68Q5wvwaao%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/6cc59e4c0847163fbc3032cb6956ae72/href">https://medium.com/media/6cc59e4c0847163fbc3032cb6956ae72/href</a></iframe><h4>1. Local Prerequisites &amp; Tools</h4><p>Ensure the following utilities are installed locally:</p><ul><li><strong>Google Cloud SDK (</strong><strong>gcloud)</strong></li><li><strong>Kubernetes CLI (</strong><strong>kubectl)</strong>: Can be installed via gcloud components install kubectl</li></ul><h4>2. Project Alignment</h4><p>Set your active gcloud project context:</p><pre>gcloud config set project tt-labs-001</pre><h4>3. Artifact Registry Configuration</h4><p>Create a standard Docker repository named gcr.io in the multi-region location us (or your target location):</p><pre>gcloud artifacts repositories create gcr.io \<br>    --repository-format=docker \<br>    --location=us \<br>    --project=tt-labs-001</pre><h4>4. IAM Permissions for Cloud Build</h4><p>Ensure Cloud Build service accounts have the <strong>Artifact Registry Writer</strong> (roles/artifactregistry.writer) role to push built container images:</p><pre>PROJECT_NUMBER=$(gcloud projects describe tt-labs-001 --format=&quot;value(projectNumber)&quot;)<br># Grant to legacy default Cloud Build service account<br>gcloud projects add-iam-policy-binding tt-labs-001 \<br>  --member=&quot;serviceAccount:${@cloudbuild.gserviceaccount.com&quot;&gt;PROJECT_NUMBER}@cloudbuild.gserviceaccount.com&quot; \<br>  --role=&quot;roles/artifactregistry.writer&quot;<br># Grant to Cloud Build service agent<br>gcloud projects add-iam-policy-binding tt-labs-001 \<br>  --member=&quot;serviceAccount:@gcp-sa-cloudbuild.iam.gserviceaccount.com&quot;&gt;service-${PROJECT_NUMBER}@gcp-sa-cloudbuild.iam.gserviceaccount.com&quot; \<br>  --role=&quot;roles/artifactregistry.writer&quot;</pre><h4>5. Runtime Permissions (Workload Identity)</h4><p>Map the Kubernetes Service Account (KSA) to a Google Service Account (GSA) with the necessary roles to call Vertex AI:</p><pre># 1. Create a Google Service Account<br>gcloud iam service-accounts create adk-gke-sa \<br>    --description=&quot;Service account for ADK GKE agent&quot; \<br>    --display-name=&quot;adk-gke-sa&quot; \<br>    --project=tt-labs-001<br><br># 2. Grant the Vertex AI User role<br>gcloud projects add-iam-policy-binding tt-labs-001 \<br>    --member=&quot;serviceAccount:adk-gke-sa@tt-labs-001.iam.gserviceaccount.com&quot; \<br>    --role=&quot;roles/aiplatform.user&quot;<br># 3. Allow KSA to impersonate GSA<br>gcloud iam service-accounts add-iam-policy-binding adk-gke-sa@tt-labs-001.iam.gserviceaccount.com \<br>    --role=&quot;roles/iam.workloadIdentityUser&quot; \<br>    --member=&quot;serviceAccount:tt-labs-001.svc.id.goog[default/default]&quot; \<br>    --project=tt-labs-001<br># 4. Annotate the default KSA with GSA email<br>kubectl annotate serviceaccount default \<br>    iam.gke.io/gcp-service-account=adk-gke-sa@tt-labs-001.iam.gserviceaccount.com \<br>    --overwrite<br># 5. Restart your deployment to apply credentials<br>kubectl rollout restart deployment/my-first-agent</pre><h4>6. GKE Deployment Script</h4><p>Create a script deploy_gke.sh in your agent folder:</p><pre>#!/bin/bash<br>PROJECT_ID=tt-labs-001<br>LOCATION_ID=us-central1<br>CLUSTER_NAME=adk-demo<br><br>adk deploy gke \<br>  --project=$PROJECT_ID \<br>  --region=$LOCATION_ID \<br>  --cluster_name=$CLUSTER_NAME \<br>  --service_name=my-first-agent \<br>  --app_name=my_first_agent \<br>  --trace_to_cloud \<br>  --otel_to_cloud \<br>  --with_ui \<br>  my_first_agent</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*vgIDWgYkLtHimu5x0RYXmg.png" /></figure><h3>5. Summary &amp; Conclusion</h3><p>Deploying Agent Development Kit (ADK) agents on Google Cloud Platform offers a versatile path depending on your target application scale:</p><ul><li>Use <strong>Vertex AI Agent Engine</strong> for a purely serverless, low-ops, Python-first workflow that integrates natively into Vertex AI tools without Docker management.</li><li>Choose <strong>Google Cloud Run</strong> when you need custom containers, rapid scale-to-zero autoscaling, or want to host the companion ADK Web UI for rapid prototyping.</li><li>Leverage <strong>Google Kubernetes Engine (GKE)</strong> for enterprise-grade production workloads, enabling integration with active service meshes, advanced network policies, and persistent container management.</li></ul><p>No matter the hosting choice, the ADK CLI simplifies packaging and configuration, allowing developer focus to remain entirely on building smarter agents.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=0a927ccc6e69" width="1" height="1" alt=""><hr><p><a href="https://medium.com/google-cloud/agent-development-kit-adk-deployment-guide-0a927ccc6e69">Agent Development Kit (ADK) Deployment Guide</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 Gemini Enterprise Agent Platform Tutorial: Registering ADK Agents]]></title>
            <link>https://medium.com/google-cloud/google-gemini-enterprise-agent-platform-tutorial-registering-adk-agents-d1bfb5f75daa?source=rss-ac9c985be096------2</link>
            <guid isPermaLink="false">https://medium.com/p/d1bfb5f75daa</guid>
            <category><![CDATA[google-adk]]></category>
            <category><![CDATA[gemini-enterprise]]></category>
            <category><![CDATA[google-gemini]]></category>
            <category><![CDATA[gemini-enterprise-agent]]></category>
            <dc:creator><![CDATA[Vishal Bulbule]]></dc:creator>
            <pubDate>Wed, 24 Jun 2026 12:34:56 GMT</pubDate>
            <atom:updated>2026-06-25T10:10:11.725Z</atom:updated>
            <content:encoded><![CDATA[<p>If you’ve been following Google Cloud lately, you’ve probably seen the name <strong>Gemini Enterprise</strong> everywhere — and maybe a little confusion along with it. Is it a chatbot? A developer platform? The new name for Vertex AI? Wasn’t it called Agentspace last year?</p><p>The short answer: <strong>all of the above, sort of.</strong> This guide untangles it in plain language — no deep tech required. By the end you’ll know what Gemini Enterprise actually is, how its pieces fit together, how a company puts its own AI agents inside it, and where its limits are.</p><h3>First, the name confusion (let’s clear it now)</h3><p>Google renamed and merged a few products, which is the #1 source of confusion. Here&#39;s the simple history:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*h33wRNPnGp2J4qkWxjbQrQ.png" /></figure><h3>So what is Gemini Enterprise?</h3><p>Think of Gemini Enterprise as <strong>Google&#39;s all-in-one AI workplace for companies.</strong></p><p>Here&#39;s an analogy. Imagine your company hired a brilliant new assistant who:</p><ul><li>has <strong>read every document</strong> in your company (Drive, SharePoint, Jira, Confluence, ServiceNow…),</li><li>only shows each employee <strong>what they&#39;re allowed to see</strong> (no leaking the CEO&#39;s salary to an intern),</li><li>can <strong>do tasks</strong>, not just answer questions — research a topic, pull a report, kick off a workflow,</li><li>and lets your team <strong>build more specialized assistants</strong> (&quot;agents&quot;) for specific jobs.</li></ul><p>That bundle — the smart assistant, the company-wide knowledge, and the toolkit to build your own agents — <em>is</em> Gemini Enterprise.</p><p>The big shift in 2026: Google moved from selling &quot;a chatbot&quot; to selling <strong>&quot;a platform for AI agents.&quot;</strong> An <em>agent</em> is just an AI that can take actions and complete multi-step work, not only chat. Gemini Enterprise is Google&#39;s home for building, running, and managing those agents at company scale.</p><h3>The structure: 2 main pillars (+ a few bundled goodies)</h3><p>People often say &quot;three pillars,&quot; and Google does market three. But for a beginner the cleanest mental model is <strong>two pillars you&#39;ll actually touch</strong>, plus extras that ride along. Let&#39;s go through them.</p><h3>Pillar 1 — Gemini Enterprise App (for everyone in the company)</h3><p>This is the <strong>front door</strong> — the part normal employees use. No coding.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*uDrL27OA7_bQdRplUG0AHA.jpeg" /></figure><p>It&#39;s a single chat-and-search box where an employee can:</p><ul><li><strong>Ask questions</strong> and get answers grounded in <em>real company data</em>, not generic internet guesses.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BEBuAtkKer0-jqN_BY9o8g.png" /></figure><ul><li><strong>Search across everything</strong> at once — Drive, SharePoint, Jira, Confluence, ServiceNow, and more — with permissions respected.</li><li><strong>Use ready-made agents</strong> (Google calls this the &quot;taskforce&quot;), like:</li><li><strong>Deep Research</strong> — explores a topic and writes a full report.</li><li><strong>NotebookLM Enterprise</strong> — a study/research assistant over your docs.</li><li><strong>Data Insights</strong> — answers questions straight from your BigQuery data.</li><li><strong>Build their own simple agents</strong> using a <strong>no-code workbench</strong> (more on this below).</li></ul><blockquote><strong><em>Who it&#39;s for:</em></strong><em> every knowledge worker — marketing, HR, sales, ops. If you can use Google Search or ChatGPT, you can use this.</em></blockquote><h3>Pillar 2 — Gemini Enterprise Agent Platform (for developers)</h3><p>This is the <strong>engine room</strong> — what used to be Vertex AI. It&#39;s where technical teams <strong>build, deploy, scale, and govern</strong> serious custom agents.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*A1Dpg5XdbJoJ6OWuUA5Xyg.jpeg" /></figure><p>It gives developers:</p><ul><li>Access to <strong>200+ AI models</strong> (Google&#39;s Gemini models <em>and</em> third-party ones) via Model Garden.</li><li>Tools to <strong>build agents with code</strong> (using Google&#39;s Agent Development Kit, &quot;ADK&quot;).</li><li>The plumbing to <strong>run agents reliably</strong> — hosting, security, monitoring, version control.</li><li>Open standards so agents can <strong>talk to each other (A2A)</strong> and <strong>connect to tools and data (MCP)</strong>.</li></ul><blockquote><strong><em>Who it&#39;s for:</em></strong><em> engineering teams building production-grade, custom AI agents.</em></blockquote><h3>The bundled extras (the &quot;third pillar&quot; and friends)</h3><ul><li><strong>Gemini Code Assist</strong> — an AI pair-programmer for your developers. It&#39;s <strong>included in Standard/Plus editions</strong>, which is why some people count it as a pillar. Think of it as a perk, not a separate product.</li><li><strong>Gemini Enterprise for Customer Experience</strong> — a specialized version for customer-facing shopping and support agents (this is the <em>official</em> third pillar). Most companies start without it.</li></ul><p><strong>Easiest way to remember it:</strong></p><blockquote><strong><em>App</em></strong><em> = where employees </em>use<em> AI. </em><strong><em>Agent Platform</em></strong><em> = where developers </em>build<em> AI. </em><strong><em>Code Assist / CX</em></strong><em> = bonus tools that come along for the ride.</em></blockquote><h3>What can enterprises actually do with it? (Capabilities)</h3><p>Here&#39;s the practical capability checklist a business cares about:</p><p>CapabilityWhat it means in plain English<strong>Company-wide search</strong>One search box across all your apps and documents.<strong>Permission-aware answers</strong>Each person only gets answers from data they&#39;re allowed to see.<strong>Pre-built agents</strong>Deep Research, NotebookLM, Data Insights — ready on day one.<strong>No-code agent builder</strong>Non-technical staff can create their own assistants.<strong>Custom code agents</strong>Developers build advanced, multi-step agents.<strong>Connectors</strong>Plug into Drive, SharePoint, Jira, Confluence, ServiceNow, OneDrive, Docusign, etc.<strong>Enterprise security</strong>Single sign-on, access controls, compliance. Google does <strong>not</strong> train its models on your data.<strong>Private networking</strong>Traffic can stay off the public internet for sensitive setups.</p><h3>How do you register an agent? (The part everyone asks)</h3><p>This is where Gemini Enterprise really shines: it&#39;s not just Google&#39;s agents — <strong>you can bring your own</strong> and make them appear right inside the app for employees. Everything lives in one place called the <strong>Agent Gallery</strong>.</p><iframe src="https://cdn.embedly.com/widgets/media.html?url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D9Drx6KCNxHs&amp;type=text%2Fhtml&amp;schema=google&amp;display_name=YouTube&amp;src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F9Drx6KCNxHs" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/9b98d298cd16a4bb035669d138350ada/href">https://medium.com/media/9b98d298cd16a4bb035669d138350ada/href</a></iframe><h3>The Agent Gallery — your company&#39;s &quot;app store&quot; for agents</h3><p>When employees open Gemini Enterprise, they see the Agent Gallery, organized into four shelves:</p><ol><li><strong>Made by Google</strong> — ready-to-use agents (Deep Research, etc.).</li><li><strong>From your organization</strong> — agents your company built or approved.</li><li><strong>Your agents</strong> — ones you personally created.</li><li><strong>Marketplace</strong> — agents from third-party vendors (request access → admin approves).</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*M9UU370tQpGmLFSbWL28XA.jpeg" /></figure><h3>Three ways to get an agent into the Gallery</h3><p><strong>Option A — Build it with no code (easiest)</strong> For non-technical users. Inside the app, click <strong>+ Create agent</strong>, then use the <strong>Agent Designer / Agent Studio</strong>:</p><ul><li>Give it a name and instructions (in plain English),</li><li>pick a model,</li><li>connect a data source or tool,</li><li>save and share.</li></ul><p>Done — no developer needed. Great for &quot;an HR policy assistant&quot; or &quot;a sales FAQ helper.&quot;</p><p><strong>Option B — Register a custom-built agent (for developers)</strong> Your developers build an agent with code (ADK) and deploy it (e.g., on Cloud Run). Then an admin registers it:</p><ol><li>Go to the <strong>Gemini Enterprise</strong> page in the Google Cloud console.</li><li>Open your app → click <strong>Agents</strong> → <strong>Add agent</strong>.</li><li>Choose how it was built:</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*rnNwEdX69vz_GJ4aYoJ5JA.png" /></figure><ul><li><strong>Custom agent via Agent Platform</strong> (for ADK agents)</li><li><strong>Custom agent via A2A</strong> (paste the agent&#39;s &quot;agent card&quot; JSON)</li><li><strong>Custom agent via Dialogflow</strong> (for Dialogflow-based agents)</li></ul><p>Provide any required authentication details. ( refer Video Demo )</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/976/1*SitaEYMMpiXksk6aPhwxrw.png" /></figure><p>The agent now appears in the Gallery for the right people.</p><p><strong>Option C — Add a Marketplace agent (buy, don&#39;t build)</strong> An admin picks a vendor agent from the Marketplace, enters the auth details, and publishes it. Employees can also request access themselves.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*UiQy_6qClifWw0eL_nL-lQ.png" /></figure><h3>Sharing with your team</h3><p>Once an agent exists, sharing is simple: in the Gallery, find it under <strong>Your Agents → ⋮ (three dots) → Share</strong>, then add email addresses, Google groups, or a shareable link.</p><blockquote><em>⚠️ </em><strong><em>Important beginner gotcha:</em></strong><em> sharing an agent also shares access to the data sources it uses. Double-check what&#39;s connected before you hit share.</em></blockquote><h3>Pricing in one glance (so there are no surprises)</h3><p>Gemini Enterprise is sold <strong>per user, per month</strong>:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*DtwtohwL6axKcuaShCFZuw.jpeg" /></figure><p>EditionPrice (per user/month)Best for<strong>Business</strong>from ~$21Small teams<strong>Standard</strong>~$30 (annual) / ~$35 (no commitment)Most knowledge workers<strong>Plus</strong>~$50 (annual) / ~$60 (no commitment)Power users &amp; builders</p><p><strong>Two things beginners get wrong about cost:</strong></p><ol><li><strong>Everyday app use is included.</strong> Each plan comes with a pooled <strong>daily query quota</strong></li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/893/1*roiCz3hJBsphI-qHbkKNVQ.png" /></figure><ol><li><strong>Custom agents on the Agent Platform are a separate, pay-as-you-go cost.</strong> The moment developers build and run their own agents on the Agent Platform, you pay for the actual AI usage (per token) and compute — <em>on top of</em> the seats. This is where bills can grow, so watch it.</li></ol><blockquote><strong><em>Rule of thumb:</em></strong><em> Seats cover your employees </em>using<em> the app. Building custom agents is where extra, usage-based costs begin.</em></blockquote><h3>Advantages (why companies are adopting it)</h3><ul><li>✅ <strong>One place for everything</strong> — search, chat, and agents, instead of five disconnected tools.</li><li>✅ <strong>Grounded in <em>your</em> data</strong> — answers come from your documents, with permissions respected.</li><li>✅ <strong>Anyone can build agents</strong> — the no-code builder removes the &quot;wait for engineering&quot; bottleneck.</li><li>✅ <strong>Open standards (A2A, MCP)</strong> — you&#39;re not locked into a closed system; agents can interoperate.</li><li>✅ <strong>Enterprise-grade trust</strong> — SSO, access control, compliance, and your data isn&#39;t used to train Google&#39;s models.</li><li>✅ <strong>Predictable everyday cost</strong> — in-app usage won&#39;t surprise you with per-question charges.</li></ul><h3>Limitations (the honest part)</h3><ul><li>⚠️ <strong>Pooled query limits are small</strong> — a shared ~160 queries/day across a whole org runs out fast for big teams, nudging you toward the (paid-by-usage) Agent Platform.</li><li>⚠️ <strong>Real power needs the Agent Platform</strong> — the no-code builder is great for simple agents, but serious use means developers, code, and consumption billing.</li><li>⚠️ <strong>Cost can sneak up</strong> — custom agents bill per usage; without monitoring (FinOps), a heavy deployment gets expensive.</li><li>⚠️ <strong>Setup isn&#39;t trivial for advanced cases</strong> — connectors, permissions, private networking, and agent registration take real planning.</li><li>⚠️ <strong>Best with the Google ecosystem</strong> — it connects to many third-party tools, but you get the most value if you&#39;re already on Google Cloud / Workspace.</li></ul><h3>Summary</h3><ul><li><strong>Gemini Enterprise = Google&#39;s all-in-one AI platform for companies.</strong> It used to be split across Agentspace + Vertex AI; now it&#39;s one roof.</li><li><strong>Two pillars to remember:</strong> the <strong>App</strong> (employees <em>use</em> AI) and the <strong>Agent Platform</strong> (developers <em>build</em> AI). Code Assist and the Customer Experience edition are bonus pieces.</li><li><strong>You can bring your own agents</strong> — build with no code, register a custom-built one, or grab one from the Marketplace — all surfaced in the <strong>Agent Gallery</strong>.</li><li><strong>Pricing is per-seat</strong>, everyday app use is included (you get throttled, not billed, past the daily quota), but <strong>custom agents on the platform cost extra by usage.</strong></li><li><strong>Great for</strong> unifying company knowledge and democratizing AI; <strong>watch out for</strong> naming confusion, small pooled limits, and usage-based costs on advanced builds.</li></ul><p><em>Want to go deeper? The natural next steps are: (1) building your first no-code agent in the App, and (2) building a custom agent with Google&#39;s ADK and registering it via A2A. Those each deserve their own hands-on tutorial.</em></p><h3>References &amp; further reading</h3><p><strong>Official Google Cloud documentation</strong></p><ul><li><a href="https://docs.cloud.google.com/gemini/enterprise/docs">What is Gemini Enterprise?</a></li><li><a href="https://cloud.google.com/gemini-enterprise">Gemini Enterprise app (product page)</a></li><li><a href="https://cloud.google.com/gemini-enterprise/faq">Gemini Enterprise app FAQs</a></li><li><a href="https://docs.cloud.google.com/gemini/enterprise/docs/editions">Compare editions of Gemini Enterprise</a></li><li><a href="https://docs.cloud.google.com/gemini/enterprise/docs/overages">Quotas and overages</a></li><li><a href="https://docs.cloud.google.com/gemini/enterprise/docs/quotas">Quotas and system limits</a></li><li><a href="https://cloud.google.com/products/gemini-enterprise-agent-platform/pricing">Gemini Enterprise Agent Platform pricing</a></li><li><a href="https://docs.cloud.google.com/gemini-enterprise-agent-platform/vertex-ai-name-changes">Vertex AI → Gemini Enterprise Agent Platform name changes</a></li><li><a href="https://docs.cloud.google.com/billing/docs/how-to/reports/gemini-enterprise-costs">View Gemini Enterprise costs (billing reports)</a></li></ul><p><strong>Registering &amp; managing agents</strong></p><ul><li><a href="https://docs.cloud.google.com/gemini/enterprise/docs/agent-gallery">Agent Gallery overview</a></li><li><a href="https://docs.cloud.google.com/gemini/enterprise/docs/register-and-manage-an-adk-agent">Register and manage an ADK agent</a></li><li><a href="https://docs.cloud.google.com/gemini/enterprise/docs/register-and-manage-an-a2a-agent">Register and manage an A2A agent</a></li><li><a href="https://docs.cloud.google.com/gemini/enterprise/docs/register-and-manage-a-dialogflow-agent">Register and manage a Dialogflow agent</a></li><li><a href="https://docs.cloud.google.com/gemini/enterprise/docs/agent-designer/create-agent">Create an agent with Agent Designer (no-code)</a></li></ul><p><strong>Background &amp; announcements</strong></p><ul><li><a href="https://cloud.google.com/blog/products/ai-machine-learning/the-new-gemini-enterprise-one-platform-for-agent-development">The new Gemini Enterprise: one platform for agent development — Google Cloud Blog</a></li><li><a href="https://www.theregister.com/2025/10/09/google_rearranges_agentspace_into_gemini/">Google folds Agentspace into Gemini Enterprise — The Register</a></li></ul><p><em>Note: prices and quotas are list values as of June 2026 and may change — always confirm current figures on the official Google Cloud pricing pages before making decisions.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d1bfb5f75daa" width="1" height="1" alt=""><hr><p><a href="https://medium.com/google-cloud/google-gemini-enterprise-agent-platform-tutorial-registering-adk-agents-d1bfb5f75daa">Google Gemini Enterprise Agent Platform Tutorial: Registering ADK Agents</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[Building AI Agents with Google Cloud Managed MCP Servers and ADK]]></title>
            <link>https://medium.com/google-cloud/building-ai-agents-with-google-cloud-managed-mcp-servers-and-adk-e488e97cbd8a?source=rss-ac9c985be096------2</link>
            <guid isPermaLink="false">https://medium.com/p/e488e97cbd8a</guid>
            <category><![CDATA[mcp-protocol]]></category>
            <category><![CDATA[google-cloud-platform]]></category>
            <category><![CDATA[agent-development-kit]]></category>
            <dc:creator><![CDATA[Vishal Bulbule]]></dc:creator>
            <pubDate>Mon, 22 Jun 2026 17:47:26 GMT</pubDate>
            <atom:updated>2026-06-23T05:38:19.095Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*gLREZ9f8b5V9K0hAVupoFg.png" /><figcaption>source — Google Blog</figcaption></figure><h3>What is MCP?</h3><p><strong>MCP (Model Context Protocol)</strong> is an open protocol — created by Anthropic — that standardizes <em>how an AI application connects to external tools and data</em>.</p><p>Think of it like a <strong>USB-C port for AI agents</strong>. Before USB-C, every device had its own connector. Before MCP, every integration between an LLM and a system (a database, an API, a file store) was custom glue code that you wrote and maintained yourself.</p><p>With MCP, the contract is fixed:</p><ul><li>An <strong>MCP Server</strong> exposes capabilities — tools (actions the agent can call), resources (contextual data like schemas), and prompts (predefined inputs).</li><li>An <strong>MCP Host</strong> is your AI application (an ADK agent, Gemini CLI, Claude, VS Code).</li><li>An <strong>MCP Client</strong> lives inside the host and speaks the protocol to the server.</li></ul><p>Your agent doesn’t need to know <em>how</em> BigQuery works. It just needs to speak MCP to a BigQuery MCP server, and it instantly gets a set of well-described tools it can call.</p><p>You can directly jump into the demo using below video</p><iframe src="https://cdn.embedly.com/widgets/media.html?url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DlNbxtv0btRw&amp;type=text%2Fhtml&amp;schema=google&amp;display_name=YouTube&amp;src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FlNbxtv0btRw" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/77853fd57e398adb9c20114691d6fe95/href">https://medium.com/media/77853fd57e398adb9c20114691d6fe95/href</a></iframe><h3>Local MCP vs Remote MCP</h3><p>There are two ways an MCP server can run, and the difference matters a lot for production:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*FbS7FDBYh-osapiJuRpxJQ.png" /></figure><p><strong>Local MCP</strong> is the classic developer experience: you pip install or npm install a server, it runs as a subprocess on your laptop, and the agent talks to it over stdio. Great for prototyping. Painful at scale — <em>you</em> are now responsible for installing, patching, securing, and running that server for every service you want to reach.</p><p><strong>Remote MCP</strong> flips this. The server runs as a managed HTTP endpoint. You just point your agent at a URL and authenticate. No process to babysit.</p><h3>What Google announced — and why it changes the picture</h3><p>Google announced <strong>official MCP support across Google and Google Cloud services</strong>: a fleet of <strong>fully-managed, remote MCP servers</strong> with enterprise-ready HTTP endpoints (supporting MCP spec version 2025-11-25).</p><p><a href="https://cloud.google.com/blog/products/ai-machine-learning/announcing-official-mcp-support-for-google-services">Announcing official MCP support for Google services | Google Cloud Blog</a></p><p>During Cloud Next 2026 MCP service list is Extended</p><p><a href="https://cloud.google.com/blog/products/ai-machine-learning/google-managed-mcp-servers-are-available-for-everyone">Google-managed MCP servers are available for everyone | Google Cloud Blog</a></p><p>This is the important shift. Previously, to give an agent access to GCP, you’d hunt down community/open-source MCP servers, deploy them, and keep them alive. Now Google runs them for you, behind stable *.googleapis.com/mcp endpoints, with the enterprise plumbing already wired in:</p><ul><li><strong>Google Cloud IAM</strong> for access control — the agent only gets what its identity is allowed.</li><li><strong>Audit Logging</strong> for observability and compliance.</li><li><strong>Model Armor</strong> for defense against agentic threats like indirect prompt injection.</li><li><strong>Cloud API Registry / Apigee API Hub</strong> to discover trusted tools.</li></ul><p>A large catalog of services is already live (GA) as remote MCP servers, including:</p><p><a href="https://docs.cloud.google.com/mcp/supported-products">Supported products | Google Cloud MCP servers | Google Cloud Documentation</a></p><p><strong>Why this matters for agent builders:</strong> the integration layer is no longer your problem. You write the <em>agent logic</em> — the model, the instructions, the routing — and the GCP services show up as governed tools over a URL. That’s the whole picture changing: from “build and run integrations” to “point and authenticate.”</p><h3>How you build an agent with this</h3><p>The mental model is three steps:</p><ol><li><strong>Enable</strong> the API for the service you want (one gcloud command).</li><li><strong>Connect</strong> your agent to that service’s remote MCP endpoint, passing an auth token.</li><li><strong>Let the model route</strong> — the LLM picks which MCP tools to call based on your instructions.</li></ol><p>Let’s do exactly that.</p><h3>Part 2 — A working example: an ADK agent with BigQuery + Cloud Run access</h3><p>We’ll build a Google Cloud expert agent using <strong>Google’s Agent Development Kit (ADK)</strong> that connects to two official remote MCP servers — <strong>BigQuery</strong> and <strong>Cloud Run</strong> — over HTTP.</p><h3>Step 0 — Enable the APIs</h3><p>Each MCP server is fronted by its product’s API. Enable the ones you need:</p><pre>gcloud services enable bigquery.googleapis.com<br>gcloud services enable run.googleapis.com</pre><blockquote><em>You need the </em><strong><em>Service Usage Admin</em></strong><em> role (</em><em>roles/serviceusage.serviceUsageAdmin) to enable APIs.</em></blockquote><p>Then make sure you’re authenticated locally so your agent can mint tokens via Application Default Credentials:</p><pre>gcloud auth application-default login</pre><h3>Step 1 — Get credentials for the remote MCP servers</h3><p>Remote MCP servers are just authenticated HTTP endpoints. We use <strong>Application Default Credentials (ADC)</strong> to get a short-lived OAuth token and the active project, then pass them as headers.</p><pre># tools.py<br>import google.auth<br>import google.auth.transport.requests<br>from google.adk.tools.mcp_tool import McpToolset<br>from google.adk.tools.mcp_tool.mcp_session_manager import StreamableHTTPConnectionParams<br><br># Official, fully-managed remote MCP endpoints<br>BIGQUERY_MCP_URL = &quot;https://bigquery.googleapis.com/mcp&quot;<br>CLOUD_RUN_MCP_URL = &quot;https://run.googleapis.com/mcp&quot;<br><br>def _get_gcp_credentials():<br>    # ADC: uses `gcloud auth application-default login` locally,<br>    # or the runtime service account in production.<br>    credentials, project_id = google.auth.default(<br>        scopes=[&quot;https://www.googleapis.com/auth/cloud-platform&quot;]<br>    )<br>    auth_request = google.auth.transport.requests.Request()<br>    credentials.refresh(auth_request)<br>    return credentials, project_id</pre><p>The two headers that matter on every call:</p><ul><li>Authorization: Bearer &lt;token&gt; — proves who the agent is.</li><li>x-goog-user-project: &lt;project_id&gt; — which project to bill/operate against.</li></ul><p>This is where <strong>IAM does the gatekeeping</strong>: the agent can only do what this identity is permitted to do. No extra access layer to build.</p><h3>Step 2 — Wrap each MCP server as an ADK toolset</h3><p>ADK’s McpToolset connects to a remote MCP server over streamable HTTP and automatically turns its tools into agent tools.</p><pre># tools.py (continued)<br><br>def get_bigquery_toolset():<br>    credentials, project_id = _get_gcp_credentials()<br>    return McpToolset(<br>        connection_params=StreamableHTTPConnectionParams(<br>            url=BIGQUERY_MCP_URL,<br>            headers={<br>                &quot;Authorization&quot;: f&quot;Bearer {credentials.token}&quot;,<br>                &quot;x-goog-user-project&quot;: project_id,<br>            },<br>        )<br>    )<br><br>def get_cloud_run_toolset():<br>    credentials, project_id = _get_gcp_credentials()<br>    return McpToolset(<br>        connection_params=StreamableHTTPConnectionParams(<br>            url=CLOUD_RUN_MCP_URL,<br>            headers={<br>                &quot;Authorization&quot;: f&quot;Bearer {credentials.token}&quot;,<br>                &quot;x-goog-user-project&quot;: project_id,<br>            },<br>        )<br>    )</pre><p>Notice how little code this is. The <em>entire</em> BigQuery and Cloud Run tool surface — listing datasets, running SQL, exploring schemas, listing services, inspecting revisions, checking traffic splits — comes from pointing at a URL with a token. That’s the payoff of managed remote MCP.</p><h3>Step 3 — Build the agent and let the model route</h3><p>Now we assemble an LlmAgent, hand it both toolsets, and write instructions that tell the model <em>when</em> to use <em>which</em> tool. The LLM does the routing at runtime.</p><pre># agent.py<br>import logging<br>from dotenv import load_dotenv<br>from google.adk.agents import LlmAgent<br>from .tools import get_bigquery_toolset, get_cloud_run_toolset<br>logging.basicConfig(level=logging.INFO)<br>load_dotenv()<br>bigquery_toolset = get_bigquery_toolset()<br>cloud_run_toolset = get_cloud_run_toolset()<br>root_agent = LlmAgent(<br>    model=&quot;gemini-2.5-pro&quot;,<br>    name=&quot;adk_gcp_mcp_agent&quot;,<br>    instruction=&quot;&quot;&quot;<br>    You are a Google Cloud expert assistant with access to GCP services via MCP.<br>    Tools available:<br>    - BigQuery MCP: query datasets, list tables, run SQL, explore schemas<br>    - Cloud Run MCP: list services, inspect revisions, check traffic splits<br>    Route questions to the right tool:<br>    - Data/SQL questions     -&gt; BigQuery<br>    - Serverless workloads   -&gt; Cloud Run<br>    Always be precise and show which tool you used to get the answer.<br>    &quot;&quot;&quot;,<br>    tools=[bigquery_toolset, cloud_run_toolset],<br>)</pre><h3>Step 4 — Run it</h3><p>With ADK installed, launch the dev UI from the project root:</p><pre>adk web</pre><p>Now ask it natural-language questions and watch it pick the right MCP server:</p><ul><li><em>“List the datasets in my project and show the schema of the events table.”</em> → routes to <strong>BigQuery MCP</strong>.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*WM9g8o0WW6XFpYrsKxmOrA.png" /></figure><ul><li><em>“Which Cloud Run services are deployed in project &lt;project id&gt; in region &lt;region&gt;”</em> → routes to <strong>Cloud Run MCP</strong>.</li></ul><p>The agent calls the managed remote MCP server, the server executes against your real GCP resources (governed by IAM), and the model explains the result.</p><h3>Scaling out</h3><p>Adding more GCP services is now trivial — it’s the same three-line pattern with a different URL. Want logs and metrics too? Add toolsets pointed at logging.googleapis.com/mcp and monitoring.googleapis.com/mcp, list them in tools=[...], and extend the instruction. No new infrastructure, no servers to run.</p><h3>Wrapping up</h3><p>We can build cool Support Agent with Google Remote MCPs check demo here</p><p><a href="https://vishalbulbule.medium.com/manage-your-entire-google-cloud-with-ai-agents-agenticops-demo-60adfaf0e96b">Manage Your Entire Google Cloud with AI Agents | AgenticOps Demo</a></p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FN6uvIPZbM_U%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DN6uvIPZbM_U&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FN6uvIPZbM_U%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/a70a1d6ce4341555c6a75f2c8fe541d6/href">https://medium.com/media/a70a1d6ce4341555c6a75f2c8fe541d6/href</a></iframe><p>The headline isn’t “Google supports MCP.” It’s <strong>where the work moved</strong>:</p><ul><li><strong>Before:</strong> you found, deployed, secured, and ran integration servers for every GCP service.</li><li><strong>Now:</strong> Google runs managed <strong>remote MCP servers</strong> behind stable endpoints, with IAM, audit logging, and Model Armor already in place. You write agent logic and point at a URL.</li></ul><p>For production agents, that’s the difference between maintaining plumbing and shipping capability. Pick the services you need from the <a href="https://docs.cloud.google.com/mcp/supported-products">supported products list</a>, enable the APIs, wrap each endpoint as a toolset, and let the model do the routing.</p><h3>References</h3><ul><li><a href="https://cloud.google.com/blog/products/ai-machine-learning/announcing-official-mcp-support-for-google-services">Announcing official MCP support for Google services</a></li><li><a href="https://docs.cloud.google.com/mcp/overview">Google Cloud MCP overview</a></li><li><a href="https://docs.cloud.google.com/mcp/supported-products">Supported products</a></li><li><a href="https://docs.cloud.google.com/mcp/enable-disable-mcp-servers">Enable / disable MCP servers</a></li><li><a href="https://github.com/google/mcp">Google MCP examples on GitHub</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e488e97cbd8a" width="1" height="1" alt=""><hr><p><a href="https://medium.com/google-cloud/building-ai-agents-with-google-cloud-managed-mcp-servers-and-adk-e488e97cbd8a">Building AI Agents with Google Cloud Managed MCP Servers and ADK</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[Manage Your Entire Google Cloud with AI Agents | AgenticOps Demo]]></title>
            <link>https://vishalbulbule.medium.com/manage-your-entire-google-cloud-with-ai-agents-agenticops-demo-60adfaf0e96b?source=rss-ac9c985be096------2</link>
            <guid isPermaLink="false">https://medium.com/p/60adfaf0e96b</guid>
            <category><![CDATA[google-adk]]></category>
            <category><![CDATA[google-cloud-platform]]></category>
            <category><![CDATA[mcp-server]]></category>
            <category><![CDATA[agentic-ai]]></category>
            <category><![CDATA[ai-agent]]></category>
            <dc:creator><![CDATA[Vishal Bulbule]]></dc:creator>
            <pubDate>Mon, 22 Jun 2026 05:27:57 GMT</pubDate>
            <atom:updated>2026-06-22T05:27:57.815Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_YXbxWLuD8ahlXc4JEVSLw.jpeg" /></figure><h3><strong>How We Built AgenticOps Using Google ADK, MCP Servers &amp; Gemini</strong>.</h3><p><em>By Vishal Bulbule — Google Developer Expert, founder of TechTrapture</em></p><p>We made <em>writing</em> software agentic. Your editor finishes your code, refactors across files, writes tests, opens PRs. But the moment something goes <em>wrong</em> in production — the moment it actually matters — all of that intelligence vanishes. You’re back to seventeen tabs, dashboards, gcloud … | grep, and the one engineer who happens to know the system.</p><p><strong>AgenticOps</strong> closes that gap. It’s a single AI agent that sits across your whole Google Cloud — health, logs, errors, security, and cost — and you operate it by <em>talking to it</em>. In plain English. From any device, anywhere, 24×7.</p><p>This post is a tour of what it <strong>does</strong>, not how it’s wired. If you’d rather watch it run live, jump to the demo:</p><blockquote><strong><em>▶️ Watch the full demo:</em></strong></blockquote><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FN6uvIPZbM_U%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DN6uvIPZbM_U&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FN6uvIPZbM_U%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/a70a1d6ce4341555c6a75f2c8fe541d6/href">https://medium.com/media/a70a1d6ce4341555c6a75f2c8fe541d6/href</a></iframe><h3>Capability 1 — Troubleshoot an incident in one sentence</h3><p>The first fifteen minutes of every incident aren’t skilled work. They’re <em>hunting</em> — stitching a story together across logs, metrics, traces, and deploy history. AgenticOps collapses that into a question:</p><blockquote>“Any errors in the last hour — and what changed?”</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*acZqSwidwPJ_bbbvVcFYQg.png" /></figure><p>It pulls the logs, finds the error signature, correlates it with recent deploys and config changes, and hands you a verdict: <strong>what broke, when it started, and the most likely cause.</strong></p><h3>Capability 2 — Ask your cloud what it costs, and why</h3><p>The other 3 a.m. of operations is the monthly bill. Spend jumps 38%, and nobody can explain it without three days of digging through billing exports.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F7G_dCn5je0g%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D7G_dCn5je0g&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2F7G_dCn5je0g%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="640" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/54ec46fe6c16504d0b12cdacb19670a2/href">https://medium.com/media/54ec46fe6c16504d0b12cdacb19670a2/href</a></iframe><blockquote>“Why did my bill jump vs last month?”</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*8JSa_icH570cSSZXEjNqjw.png" /></figure><p>I can request report on email as well</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ioF9LEABhkDUF0ezAtgtBA.png" /></figure><p>Email Report</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*WtTsijPJLl4FR_UGVsz-Ag.png" /></figure><p>It reads your billing data, ranks the top services by spend, and points straight at the <strong>driver</strong> — “this batch job started scaling to 40 instances,” “Vertex AI usage doubled.” A three-day investigation, answered in a sentence.</p><p>Because the <em>same</em> agent sees both cost and operations, “why did spend jump?” and “what’s running?” finally stop being two separate investigations.</p><p>There’s also a FinOps dashboard for the at-a-glance view — spend trend, top services, idle resources you can cut — with the agent one click away to explain anything on it.</p><blockquote><strong><em>FinOps dashboard: spend trend + top services + idle-resource findings]</em></strong></blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*R6I6T5EZqZakXR12IGRWgA.png" /></figure><h3>Capability 3 — “Who changed what?” answered instantly</h3><p>During an incident, the most valuable question is usually <em>what changed</em> — and <em>who</em> changed it. Normally that’s a hand-written trawl through admin activity logs.</p><blockquote>“Who changed what in the last 24 hours?”</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*WhwAXPIzB1TWpmuOVi5OEg.png" /></figure><h3>Capability 4 — A security posture read on demand</h3><blockquote>“Is anything publicly exposed in this project? Any risky IAM?”</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*kBx6qbe1SPSAmonjFyP-qw.png" /></figure><p>A quick read on your exposure — public buckets, over-broad IAM, open surfaces — in plain language, when you want it, not buried in a once-a-quarter report.</p><h3>Capability 5 — The RCA, written and emailed for you</h3><p>After the fire is out, there’s still the postmortem — important, and always deprioritized.</p><blockquote>“Email me the postmortem for this incident.”</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/657/1*FdEkL9OflfIUB2e4JmlW5A.png" /></figure><p>The agent drafts a clean, readable RCA from what it just investigated — timeline, root cause, impact, remediation — and <strong>emails it to you</strong>, ready to forward to your team or leadership.</p><h3>Capability 6 — Careful, gated actions (when you want them)</h3><p>Reading is the default. But when you’re ready to <em>act</em>, AgenticOps can do that too — restart an instance, rerun a failed job, retrigger a pipeline.</p><blockquote>“Rerun my failed Jobs.”</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/369/1*VsomDx_J9DI3JjTiiXK07A.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/368/1*op9ukiDrf4VupHKJ65jjpg.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/368/1*22coi6OnWByXbuj1NHo1HQ.jpeg" /></figure><p>Every change is <strong>confirm-first</strong>: the agent shows you the plan and blast radius, and only acts after you approve. It proposes; you nod.</p><h3>The everyday questions, too</h3><p>It’s not only for emergencies. The same agent answers what you ask all day:</p><ul><li><em>“Is everything up and healthy?”</em> — a one-line status across your services.</li><li><em>“How many jobs ran today, and did any fail?”</em> — without remembering a single command.</li><li><em>“Give me a morning status of my cloud.”</em> — health, errors, and spend in one briefing.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*KCvW3V667YOQ9C5A572lXg.png" /></figure><h3>“Would you really trust an AI in your production cloud?”</h3><p>Right question. The trust model is built in, not bolted on:</p><ul><li><strong>Runs on your own Google IAM.</strong> Nothing new to grant, no service-account keys to hand out. Each person sees and does only what <em>their own</em> Google account already can. The agent isn’t a new privileged identity — it’s <em>you</em>, faster.</li><li><strong>Read-only by default.</strong> Out of the box it can look, not touch.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BuK1hkof94vHJg5ia1DlIA.png" /></figure><p>Now we can enable Action Mode for any Write Operation</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ztT41NVnoypB4e2L0elPXQ.png" /></figure><p>Now see Actions !!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*XHxpGdPlDDIKxxEnZY4lXQ.png" /></figure><ul><li><strong>Every action is confirm-first and audited.</strong> If your account can’t do it, the agent can’t either — and there’s a record of who asked for what.</li></ul><p>It’s not a robot loose in your console. It’s a careful operator that shows its work and waits for the nod.</p><h3>The tech stack (the short version)</h3><p>For the engineers asking “what’s under the hood” — without the implementation weeds:</p><ul><li><strong>Google ADK (Agent Development Kit)</strong> for the multi-agent core: a coordinator that routes each question to a specialist — health, logs &amp; errors, security, cost, reporting, and a gated remediation agent.</li><li><strong>Google Cloud’s official remote MCP servers</strong> as the agent’s eyes — Cloud Logging, Error Reporting, Monitoring, Cloud Run, Compute, Asset Inventory, Resource Manager, and BigQuery (over your billing export, for cost). Google hosts them; the agent connects securely and read-only.</li><li><strong>Gemini</strong> as the reasoning model, running in <em>your</em> Vertex AI — so your data, and even the model calls, stay in your project.</li><li>A clean <strong>React + Firebase</strong> web client (mobile-first), with <strong>Cloud Run</strong> hosting the agent service.</li></ul><p>One agent codebase, your IAM, your Vertex, your data boundary. That’s the whole point.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*LapkIb0XwbRL1iruCXKcpA.png" /></figure><p>I walk through the architecture and a full live run in the video — that’s the place to see how it actually behaves.</p><h3>This is where operations is going</h3><p>Five years from now, no one will grep through logs at 3 a.m. to answer “what changed?” — the same way no one today writes boilerplate by hand when an agent will do it in seconds. The teams that get there first will run leaner, sleep better, and spend less.</p><p><strong>Dev went agentic. Ops is next.</strong></p><h3>See it on your own cloud</h3><p>I’m opening AgenticOps to a small group of teams who feel this pain the most — SRE, platform, and FinOps folks done with operating their cloud the hard way.</p><p>→ <strong>Book a walkthrough:</strong> <a href="https://techtrapture.com/contact">techtrapture.com/contact</a> or Contact us through <a href="/service/mailto:sales@techtrapture.com">sales@techtrapture.com</a></p><p><em>AgenticOps, by </em><strong><em>TechTrapture</em></strong><em> — agentic AI for cloud operations and FinOps on Google Cloud.</em> <em>Dev went agentic. Ops is next.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=60adfaf0e96b" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>