<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Google AI</title>
    <description>The latest articles on DEV Community by Google AI (googleai).</description>
    <link>https://dev.to/googleai</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F11026%2F386b14d3-cc9a-4270-aba0-3e41cdfb9d85.jpg</url>
      <title>DEV Community: Google AI</title>
      <link>https://dev.to/googleai</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/googleai"/>
    <language>en</language>
    <item>
      <title>Designing AI Evals: Clarity Now and Visualization Next</title>
      <dc:creator>Katie McLaughlin</dc:creator>
      <pubDate>Tue, 18 Aug 2026 07:00:00 +0000</pubDate>
      <link>https://dev.to/googleai/designing-ai-evals-clarity-now-and-visualization-next-4eii</link>
      <guid>https://dev.to/googleai/designing-ai-evals-clarity-now-and-visualization-next-4eii</guid>
      <description>&lt;h2&gt;
  
  
  AI evals and analysis
&lt;/h2&gt;

&lt;p&gt;Let's say you're testing out new AI tools. Perhaps you implement and run analytics for an Ad Agency and hope to automate deploying your standard event schema, or are a podcast producer automating generating social copy from your newest ep. While modern, newly trained LLMs can likely one-shot a lot of these tasks – this specificity might necessitate wasting tokens and time repeatedly prompting them with the same resources, descriptions and scripts. With this in mind, you investigate tooling whether that be an MCP server, an agent skill or an &lt;a href="https://agent-plugins.org/specification" rel="noopener noreferrer"&gt;agent plugin&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The problem is, how do you know if a skill (whether developed by you or open sourced by someone else) is worth your time or, perhaps more importantly, your tokens and quota? How can one go about designing these (more) objective evaluations of AI tools and, from there, collecting and analyzing relevant metrics? That is exactly the context for using open source eval frameworks, like &lt;a href="https://inspect.aisi.org.uk/" rel="noopener noreferrer"&gt;Inspect AI&lt;/a&gt; and &lt;a href="https://github.com/harbor-framework/harbor" rel="noopener noreferrer"&gt;Harbor&lt;/a&gt; to &lt;a href="https://codelabs.developers.google.com/codelabs/evaluate-agent-skills-using-open-source-frameworks" rel="noopener noreferrer"&gt;evaluate agent skills using open source frameworks&lt;/a&gt;. But how do you &lt;a href="https://codelabs.developers.google.com/codelabs/evaluate-agent-skills-using-open-source-frameworks#4" rel="noopener noreferrer"&gt;"extend the evaluation"&lt;/a&gt;, use visualizations to spot trends and collaboratively explore alternative paths forward using Google Sheets and Data Studio?&lt;/p&gt;

&lt;p&gt;These questions and more are exactly what I’m hoping to demonstrate for you in this series!&lt;/p&gt;

&lt;p&gt;While you are more than welcome to simply read about how and why I conducted my own investigation, you can alternatively follow my lead and &lt;a href="https://github.com/GoogleCloudPlatform/devrel-demos/blob/main/agents/inspect-agent-skills-eval/README.md#reproduction-guide" rel="noopener noreferrer"&gt;run the benchmark scripts&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So, if you’re hoping to play along, take a moment to &lt;a href="https://codelabs.developers.google.com/codelabs/evaluate-agent-skills-using-open-source-frameworks" rel="noopener noreferrer"&gt;complete the aforementioned codelab&lt;/a&gt; and come back when you’re done. Don’t worry, we’ll still be here when you get back!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: This blog series contains AI-generated diagrams&lt;br&gt;
alongside actual screenshots and hand-drawn edits of&lt;br&gt;
both. AI also assisted in minor copy editing.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Level up your evals
&lt;/h2&gt;

&lt;p&gt;In the codelab, we learned how to run evals with Gemini CLI, Inspect and Inspect SWE in an isolated Docker Sandbox to understand how well each skill aids the agent in answering the same question.&lt;/p&gt;

&lt;p&gt;For those playing along at home, please additionally install &lt;code&gt;inspect view&lt;/code&gt; now before you need it to run the evals below; be prepared to have to wait for a couple minutes for evals to finish depending on your machine and quota usage.&lt;/p&gt;

&lt;p&gt;Regarding our new &lt;a href="https://github.com/GoogleCloudPlatform/devrel-demos/tree/main/agents/inspect-agent-skills-eval#downloading-the-demo-giget" rel="noopener noreferrer"&gt;source files&lt;/a&gt; while they are heavily commented and hopefully written in a self describing way, I’ll explain further subsequently.&lt;/p&gt;

&lt;h3&gt;
  
  
  A note on models
&lt;/h3&gt;

&lt;p&gt;For the purpose of my investigation demo, I used three different models: &lt;code&gt;google/gemini-3.5-flash-lite&lt;/code&gt; and &lt;code&gt;google/gemini-3.6-flash&lt;/code&gt; as "solvers" (the models under evaluation), and &lt;code&gt;google/gemini-3.1-flash-lite&lt;/code&gt; as a "grader" (the model rating the runs). The three of them (and models more broadly) differ in many ways but more specifically on &lt;a href="https://ai.google.dev/gemini-api/docs/models" rel="noopener noreferrer"&gt;problem solving ability, speed and cost&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;We intentionally offloaded grading for this demo to a previous-generation model because by changing rubric criteria to strict binary decisions and applying a reduction programmatically, it delivers sufficiently robust evaluations without burning through solver quota. For a &lt;em&gt;production&lt;/em&gt; evaluation system, consider investigating using newer and more capable models as graders because they will likely have narrower confidence intervals.&lt;/p&gt;

&lt;p&gt;For a full technical breakdown of this decoupled grader architecture and to find out how you could substitute in your own choice of models, see the README section on &lt;a href="https://github.com/GoogleCloudPlatform/devrel-demos/blob/main/agents/inspect-agent-skills-eval/README.md#3-decoupled-grader--multidimensional-rubrics" rel="noopener noreferrer"&gt;Decoupled Grader &amp;amp; Multidimensional Rubrics&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up the eval
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Reproducibility &amp;amp; Local Setup Note&lt;/strong&gt;: If you are following along locally, clone the domain skill definitions into &lt;code&gt;google-skills/&lt;/code&gt; before running benchmark sweeps:&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/google/skills.git google-skills
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;All evaluations in this series were benchmarked on &lt;strong&gt;Python 3.13&lt;/strong&gt; using &lt;code&gt;inspect-ai&lt;/code&gt; (&lt;code&gt;v0.3.247&lt;/code&gt;), &lt;code&gt;inspect-swe&lt;/code&gt; (&lt;code&gt;v0.2.66&lt;/code&gt;), &lt;code&gt;inspect-viz&lt;/code&gt; (&lt;code&gt;v0.4.1&lt;/code&gt;), and &lt;code&gt;pandas&lt;/code&gt; (&lt;code&gt;v3.0.3&lt;/code&gt;). If upstream PyPI releases introduce breaking changes, check the README's &lt;a href="https://github.com/GoogleCloudPlatform/devrel-demos/blob/main/agents/inspect-agent-skills-eval/README.md#environment--dependencies" rel="noopener noreferrer"&gt;Environment &amp;amp; Dependencies specification&lt;/a&gt; for exact version pins and instructions on how to reproduce the configuration.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For this investigation I used a &lt;a href="https://github.com/GoogleCloudPlatform/devrel-demos/blob/main/agents/inspect-agent-skills-eval/skills-eval.py" rel="noopener noreferrer"&gt;new eval script&lt;/a&gt;; while the specifics of the script are important for anyone who hopes to make their own evals or run the code as we go, if you're primarily interested in analysis and visualization, feel free to skip to the next section.&lt;/p&gt;

&lt;p&gt;The original script ran a small batch of tests on a local machine. While this version can be and was run on a local machine, it prioritizes three architectural dimensions needed for running automated tests as part of a larger scale development flow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;External Configs (providing the evals and solver system prompt as external files for separation of concerns).
&lt;/li&gt;
&lt;li&gt;Quota Management (for the GenAI API and package management).
&lt;/li&gt;
&lt;li&gt;Multidimensional Evaluations (expanding to arbitrary fact counts for graders).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a complete technical breakdown of these architectural pillars—including external configuration schemas (&lt;code&gt;questions.json&lt;/code&gt;, &lt;code&gt;thrifty_system_prompt.txt&lt;/code&gt;), solver rate-limiting defenses (&lt;code&gt;version="0.51.0"&lt;/code&gt; pinning), grader quota decoupling, and score curving math formulas see the README's &lt;a href="https://github.com/GoogleCloudPlatform/devrel-demos/blob/main/agents/inspect-agent-skills-eval/README.md#1-external-configurations" rel="noopener noreferrer"&gt;Evaluation Pipeline Architecture &amp;amp; Technical Reference&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Running the eval
&lt;/h2&gt;

&lt;p&gt;These commands create a matrix of evals subject to model x skill condition x sample x epoch. For a quick visual (that I’ll repeatedly reference throughout this), take a look below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fosimtffx3o7lgyyj1jc2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fosimtffx3o7lgyyj1jc2.png" alt="A 3D grid matrix visualizing eval conditions: Models on the vertical axis, Skill Conditions on the depth axis, and Samples on the horizontal axis. A callout box shows a grader model evaluating four facts, resulting in a score on a meter." width="800" height="769"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Caption&lt;/strong&gt;: Visualization of the eval matrix that will be scored and compared. In Inspect AI, rubric elements, represented here as Facts, are graded Correct (C) or Incorrect (I).&lt;/p&gt;

&lt;p&gt;With all that said, it’s finally time for the rubber to meet the road. I ran our evals with the following command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;inspect &lt;span class="nb"&gt;eval &lt;/span&gt;skills-eval.py &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--model&lt;/span&gt; google/gemini-3.5-flash-lite,google/gemini-3.6-flash &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--time-limit&lt;/span&gt; 300 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--epochs&lt;/span&gt; 2 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--max-tasks&lt;/span&gt; 4 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-T&lt;/span&gt; &lt;span class="nv"&gt;web_access&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command runs a 4-way parallel sweep across models and skill conditions while enforcing a 300-second task timeout and disabling web search to minimize token spend. See the README for a complete &lt;a href="https://github.com/GoogleCloudPlatform/devrel-demos/blob/main/agents/inspect-agent-skills-eval/README.md#cli-parameter-reference" rel="noopener noreferrer"&gt;CLI Parameter Reference&lt;/a&gt; and details on &lt;a href="https://github.com/GoogleCloudPlatform/devrel-demos/blob/main/agents/inspect-agent-skills-eval/README.md#1-external-configurations" rel="noopener noreferrer"&gt;External Configuration Template Mechanics&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Run and wait
&lt;/h3&gt;

&lt;p&gt;If you intend to and haven't done so already, &lt;strong&gt;run the command line&lt;/strong&gt;. If you're interested in how to read over and interact with the Terminal User Interface, please refer to the &lt;a href="https://codelabs.developers.google.com/codelabs/evaluate-agent-skills-using-open-source-frameworks" rel="noopener noreferrer"&gt;previous codelab&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Watch the running command line long enough to determine it hasn’t crashed or hit an obvious error and then maybe take a moment to make some food, grab some water or take a walk around the block. Enjoy the small things in life, okay? Worst case, you get a 20 minute walk out of it, not so bad eh!?&lt;/p&gt;

&lt;h2&gt;
  
  
  Viewing the evals
&lt;/h2&gt;

&lt;p&gt;With that said and done, reading the terminal output is only the most basic way of understanding the evals. Now that you have the raw eval logs, what do you need to do to begin to use these analytically and, more importantly, persuasively?&lt;/p&gt;

&lt;p&gt;To start off, I simply ran&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;inspect view
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and clicked the link to open the browser to the GUI.&lt;/p&gt;

&lt;p&gt;For step-by-step diagnostic trace analysis in the browser GUI, see the README section on &lt;a href="https://github.com/GoogleCloudPlatform/devrel-demos/blob/main/agents/inspect-agent-skills-eval/README.md#local-diagnostic-trace-analysis-inspect-view" rel="noopener noreferrer"&gt;Local Diagnostic Trace Analysis (inspect view)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Mine came out like this (after a little bit of column drag-and-drop):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8mxn1iszjshhw6f1w7ki.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8mxn1iszjshhw6f1w7ki.png" alt="A table showing the results of AI evaluation runs, with columns for status, task name, model used, score, token count, and duration." width="800" height="312"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While we covered the rudiments of looking over the inspect view GUI in &lt;a href="https://codelabs.developers.google.com/codelabs/evaluate-agent-skills-using-open-source-frameworks" rel="noopener noreferrer"&gt;Evaluate agent skills using open source frameworks&lt;/a&gt;, there is significantly more that can be done with it. Speaking of which, the &lt;strong&gt;TASK ARGS&lt;/strong&gt; column (not pictured) serves as a quick reference for what arguments were passed to a task.&lt;/p&gt;

&lt;h3&gt;
  
  
  Macro view: Comparing runs
&lt;/h3&gt;

&lt;p&gt;While LLM’s are inherently stochastic (and given floating point hardware, nondeterministic), when running evals we are trying to use sampling to characterize the average observable metrics (e.g. correctness, latency and token usage) which our particular configuration model x skill scores on relevant questions. As such, the eval tasks were set up to characterize how a change to an independent variable (model or skill) affect dependent variables (the aforementioned metrics).&lt;/p&gt;

&lt;h4&gt;
  
  
  A. Comparing models head to head
&lt;/h4&gt;

&lt;p&gt;Grouping evaluation runs by model in &lt;code&gt;inspect view&lt;/code&gt; allows for a direct "eyeball" inspection of how skill inclusion alters accuracy across baseline controls—&lt;strong&gt;given a specific model, what is the impact of adding a skill?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I have added some annotations to make metric change from baseline to skilled a little more apparent:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvssywiosux6j1i7inxhe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvssywiosux6j1i7inxhe.png" alt="A table of AI evaluation results similar to the previous one, but with red up-arrows next to 'SCORE' values to indicate improvements when using skills compared to baseline." width="800" height="307"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The above shows that&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In all cases, the addition of a skill improved or tied scores relative to the same model’s baseline.
&lt;/li&gt;
&lt;li&gt;All of these cases &lt;strong&gt;also&lt;/strong&gt; increased duration &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Another simple measurement that can be done is to look at the &lt;code&gt;TOKENS&lt;/code&gt; column where gemini-api actually led to a decrease in usage relative to its baseline in &lt;code&gt;3.6-flash&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;While the general relationship between tokens and score is difficult to parse visually, one notable result: for 3 out of 4 task x model configurations, gemini-3.6-flash used more tokens than the comparable 3.5-flash-lite run.&lt;/p&gt;

&lt;h3&gt;
  
  
  B. Comparing skill conditions (skill vs. baseline)
&lt;/h3&gt;

&lt;p&gt;Now to analyze the inverse; in more concrete terms: &lt;strong&gt;given a particular skill, what is the effect of changing the underlying model?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgo04b8da7cpec0hntywy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgo04b8da7cpec0hntywy.png" alt="A table of AI evaluation results comparing performance across models for a given skill condition, with annotations indicating score differences." width="799" height="368"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What was the effect of the change from &lt;code&gt;3.5-flash-lite&lt;/code&gt; to &lt;code&gt;3.6-flash&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;For 3 out of 4 of these, the changes between the two models amounted to an up to 45% increase in accuracy. For whatever reason, however, changing the &lt;code&gt;gcloud&lt;/code&gt; skill from using one model to another led to a slight decrease.&lt;/p&gt;

&lt;p&gt;While these are both valuable findings, they warrant further questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Are these representative samples?
&lt;/li&gt;
&lt;li&gt;If these findings are repeatable, how can we characterize the relationship between the existing metrics?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the first of those, if you want to make more representative samples, know that you should conduct further research using more questions, samples and epochs and compare those metrics with these. For the sake of this blog series though, I’ll leave that for you to do.&lt;/p&gt;

&lt;p&gt;For the second though, we can and will endeavor to do so. That said, it might help in designing follow up analysis to think a little bit about common patterns encountered during evals. This is especially true for those running evals themselves (possibly on different skills or rubrics); you are likely to encounter very different metrics than mine, and thus I’ll lay out some common patterns and follow up actions to investigate them further.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mental models for eval comparison (skill vs. baseline)
&lt;/h3&gt;

&lt;p&gt;When analyzing evaluation runs, comparing skilled execution against baseline controls typically maps to five distinct diagnostic outcomes—ranging from &lt;strong&gt;High-Efficiency Capability Lift&lt;/strong&gt; (best) to &lt;strong&gt;Context Overload &amp;amp; Skill Regression&lt;/strong&gt; (worst).&lt;/p&gt;

&lt;p&gt;For a complete breakdown of this diagnostic taxonomy and actionable audit steps for each outcome, see the README breakdown of &lt;a href="https://github.com/GoogleCloudPlatform/devrel-demos/blob/main/agents/inspect-agent-skills-eval/README.md#diagnostic-mental-models-for-eval-comparison-skill-vs-baseline" rel="noopener noreferrer"&gt;Diagnostic Mental Models for Eval Comparison&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Micro view: Sample-level diagnostics
&lt;/h3&gt;

&lt;p&gt;While high-level metric summaries alert you to outcomes like cost bloat or skill regression, opening an individual sample surfaces the &lt;strong&gt;Sample Details&lt;/strong&gt; panel for granular trace analysis:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fivqmzntm7aij2fjsvjht.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fivqmzntm7aij2fjsvjht.png" alt="A panel showing a list of evaluation samples, each with an ID, epoch number, and the full input prompt text used for the evaluation." width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Transcript tab: How to read the LLM's conversation as it happened
&lt;/h4&gt;

&lt;p&gt;This tab shows the exact multi-turn conversation between the solver agent, the sandbox shell, and external tools. Use it to diagnose model reasoning versus environment noise:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;System Prompt Verification&lt;/strong&gt;: Confirm that web search rules (&lt;code&gt;-T web_access=false&lt;/code&gt;) and automated time limits (&lt;code&gt;300 seconds&lt;/code&gt;) were correctly injected into the container environment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu67zc1uf65f256l54qz1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu67zc1uf65f256l54qz1.png" alt="A screenshot of a system instruction block labeled " width="800" height="273"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Skill Ingestion Check&lt;/strong&gt;: Verify whether the agent activated the skill. If activation didn’t occur, your eval is &lt;em&gt;mostly&lt;/em&gt; testing baseline model knowledge rather than skill utility.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here is an example of one case where the skill was activated.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fatx7xwn28rskhb5bj1t8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fatx7xwn28rskhb5bj1t8.png" alt="A screenshot of a terminal-like interface showing a model call turn and a specific action: 'activate_skill' name: 'gemini-api' being executed." width="799" height="331"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This means:&lt;/strong&gt; The agent actually ingested &lt;code&gt;gemini-api&lt;/code&gt; instead of relying on baseline pre-training memory.&lt;/p&gt;

&lt;p&gt;Of note though, some of the tasks where skills were made available did NOT activate the skill. If you’re a skill author, you may want to rewrite the “activation criteria” (aka what situation calls for using the skill) such that it's more applicable to the specifics of relevant tasks.&lt;/p&gt;

&lt;h5&gt;
  
  
  Errors and reasoning loops
&lt;/h5&gt;

&lt;p&gt;Auditing transcript details allows you to distinguish model reasoning loops (e.g., repeated redundant tool calls) from sandbox environment noise (e.g., container timeouts or missing binary dependencies). For step-by-step diagnostic trace auditing procedures, see the README reference on &lt;a href="https://github.com/GoogleCloudPlatform/devrel-demos/blob/main/agents/inspect-agent-skills-eval/README.md#sandbox-noise-vs-model-reasoning" rel="noopener noreferrer"&gt;Sandbox Noise vs. Model Reasoning&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Scoring tab: Multi-fact verification breakdown
&lt;/h4&gt;

&lt;p&gt;Clicking the &lt;strong&gt;Scoring Tab&lt;/strong&gt; displays the empirical breakdown of our custom &lt;code&gt;multi_scorer&lt;/code&gt; on a sample:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqz48wt27uoj2ncldgzll.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqz48wt27uoj2ncldgzll.png" alt="A screenshot of a scoring interface showing the input prompt, a multi-scorer score of 0.65, and a breakdown of six individual fact scores, five of which are marked 'C' (Correct) and one 'I' (Incorrect)." width="799" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;multi_scorer&lt;/code&gt; aggregates the results of checking the sample’s answer against individual binary yes/no Facts using  &lt;code&gt;model_graded_qa&lt;/code&gt;. The generated list of scores in the range [0.0, 1.0] is supplied to our &lt;code&gt;custom_reducer&lt;/code&gt; which calculates their arithmetic mean. From there, it applies quadratic score curving (

&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;mean&lt;/span&gt;&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
) to ensure that the further from correct the mean of the supplied answers are, the lower the score is pulled. This allows the most correct answers to stand out immediately. In the &lt;strong&gt;Scoring Tab&lt;/strong&gt;, this downward curve maps a raw 5/6 fact score (
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;≈&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0.8333&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
) down to a normalized 0.65 sample score. For complete formulas and math derivations, see the README section on &lt;a href="https://github.com/GoogleCloudPlatform/devrel-demos/blob/main/agents/inspect-agent-skills-eval/README.md#3-decoupled-grader--multidimensional-rubrics" rel="noopener noreferrer"&gt;Atomic Fact Verification &amp;amp; Quadratic Curving&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Visual milestone: The transition to cohort analytics
&lt;/h2&gt;

&lt;p&gt;While &lt;code&gt;inspect view&lt;/code&gt; provides outstanding deep-dive diagnostics for individual sample traces, evaluating dozens of models across multiple skill domains gets confusing fast (as you may have seen above). Weighing the correlations between skill inclusion vs exclusion and model changes against each other can be confounding and more art than science if we don’t find better ways to reason over them; it requires a structured matrix overview.&lt;/p&gt;

&lt;p&gt;Remember that mess of sectors of a 3d space I showed you earlier representing all the configs? Well, unless we find numeric ways to collapse that or quantify deeper comparison, you won’t get the granular information you need to choose between two similarly capable alternatives. Worse yet, you won’t be able to communicate this to the people with their hands at the purse strings (unless of course, that's you too).&lt;/p&gt;

&lt;p&gt;To make this easier, next time we’ll start down the road of understanding and displaying these things visually: As visualized in the cohort matrix linked above, understanding agent capability factor-by-factor requires cohort slicing across multi-dimensional metrics.&lt;/p&gt;

&lt;p&gt;In &lt;strong&gt;Part 2&lt;/strong&gt;, we scale our analysis from single log UI inspection to aggregate scoreboards with &lt;code&gt;inspect viz&lt;/code&gt;!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>python</category>
      <category>testing</category>
    </item>
    <item>
      <title>How I Planned an Italy Trip with an Agentic Workflow</title>
      <dc:creator>Karl Weinmeister</dc:creator>
      <pubDate>Mon, 17 Aug 2026 16:12:46 +0000</pubDate>
      <link>https://dev.to/googleai/how-i-planned-an-italy-trip-with-an-agentic-workflow-4hd2</link>
      <guid>https://dev.to/googleai/how-i-planned-an-italy-trip-with-an-agentic-workflow-4hd2</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fagm3kdz7ed47qk2et0z3.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fagm3kdz7ed47qk2et0z3.jpg" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;
The stunning village of Positano in the Amalfi Coast of Italy



&lt;p&gt;I’ve been known to use tech everywhere, even where it’s not really needed. But I have to say, AI agents really came in handy for my last trip. I want to share my story, and the playbook I used for an unforgettable trip.&lt;/p&gt;

&lt;p&gt;This summer, my wife and I celebrated an anniversary milestone in Italy. The trip was 10 days long, spread across 3 cities: Positano in the Amalfi Coast, Naples, and Rome. We had a wonderful time, and the planning certainly helped!&lt;/p&gt;

&lt;p&gt;Let’s break down the agentic workflow I used. I’ll cover the initial brainstorming phase, travel logistics, itinerary planning, and finally the checklist for feeling confident about it all.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/r8yd44RQi68"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Getting started with Deep Research
&lt;/h3&gt;

&lt;p&gt;Before drafting a single day on a calendar, every great trip begins with an exploratory phase. Before I even touched an agent, I had fun scrolling through plenty of Reddit threads (&lt;a href="https://www.reddit.com/r/ItalyTravel/" rel="noopener noreferrer"&gt;r/ItalyTravel&lt;/a&gt;) and reading articles.&lt;/p&gt;

&lt;p&gt;At a certain point, you’re going to run into information overload. How can you distill all of these great ideas into what you need to do? Enter &lt;a href="https://notebook.google/" rel="noopener noreferrer"&gt;Gemini Notebook&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The first thing I did was use &lt;a href="https://gemini.google/overview/deep-research/" rel="noopener noreferrer"&gt;Deep Research&lt;/a&gt; to scour across data sources. I now had a chat interface where I could ask all kinds of questions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjgi7kp33vzj6hj41d7r3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjgi7kp33vzj6hj41d7r3.png" width="799" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One of the features that made Gemini Notebook famous was the Audio Overview (or podcast) feature. You can tune into two hosts discussing your favorite topic at convenience. But there’s much more you can create, like flashcards, quizzes, and reports. It even can create infographics like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp7w4p5oem47b349ptivd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp7w4p5oem47b349ptivd.png" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Architecting the itinerary
&lt;/h3&gt;

&lt;p&gt;With a base of understanding in place, our next step was to shape our trip. What were the key places to see? How many days should we spend in each city?&lt;/p&gt;

&lt;p&gt;A great trip should be looked at as just a checklist of sights. The flow needs to take into account the timing, geography, and your energy levels. August is generally a hot season in Italy, and Italy’s major cities were on the &lt;a href="https://www.theguardian.com/environment/2026/aug/05/italy-heatwave-major-cities-highest-heat-alert" rel="noopener noreferrer"&gt;highest heat alert&lt;/a&gt; in 2026.&lt;/p&gt;

&lt;p&gt;We asked Gemini to consider these nuances:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Act as an expert travel logistics architect. Design a 10-day itinerary for 2 adults starting at Rome FCO, traveling to Positano, Naples, and Rome. Group activities by neighborhood, factor in August heat, and minimize backtracking.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The model surfaced tactical adjustments that generic guides might overlook For example, it recommended &lt;a href="https://en.wikipedia.org/wiki/Herculaneum" rel="noopener noreferrer"&gt;Herculaneum&lt;/a&gt; over &lt;a href="https://en.wikipedia.org/wiki/Pompeii" rel="noopener noreferrer"&gt;Pompeii&lt;/a&gt; for a blistering hot day: both world-class sites nearby Naples, but Herculaneum would fit better with some mobility challenges we were working through. Gemini sequenced the days around key events, filling in with a full itinerary:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz7yea85jrgqrbghftlas.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz7yea85jrgqrbghftlas.png" width="800" height="247"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From there, Antigravity integrated with &lt;a href="https://workspace.google.com/products/calendar/" rel="noopener noreferrer"&gt;Google Calendar&lt;/a&gt;, so I had everything I needed at a glance on my phone. Gemini flagged that some of the attractions sold out quickly, so I added reminders such as signing up for the &lt;a href="https://ticketing.colosseo.it/" rel="noopener noreferrer"&gt;Colosseum&lt;/a&gt; 30 days before.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwnq4lrxb3v7gsa2sitxt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwnq4lrxb3v7gsa2sitxt.png" width="800" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Transit Logistics
&lt;/h3&gt;

&lt;p&gt;One of the most stressful parts of international travel is stitching together connections. On arrival day, our route required landing at Rome FCO, taking an express airport train, catching high-speed rail, and meeting a driver.&lt;/p&gt;

&lt;p&gt;Instead of guessing connection times, I asked Gemini to calculate realistic buffers and analyze ticket flexibility rules:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Analyze transit options from Rome FCO Airport to Positano on a Tuesday morning. Calculate conservative buffers for passport control, baggage claim, and station transfers. Provide fallback options for flight delays.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;One of the great features in Antigravity is the &lt;a href="https://antigravity.google/docs/ide/browser/?utm_team=DSS+DevRel&amp;amp;utm_campaign=default&amp;amp;utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_content=b547479075" rel="noopener noreferrer"&gt;Browser agent&lt;/a&gt;, which can open up Chrome and operate it for you. Antigravity accessed the &lt;a href="https://www.trenitalia.com/it.html" rel="noopener noreferrer"&gt;Trenitalia website&lt;/a&gt; to search for connections:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvv7olt2x47mfgo6caoby.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvv7olt2x47mfgo6caoby.png" width="799" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It made a sensible set of recommendations. It even went deep into the policies of the tickets to uncover that the tickets are valid for a 4-hour window. That helped us pick an earlier ticket just in case we arrived early, without being worried about missing our connection.&lt;/p&gt;

&lt;p&gt;On our way back from Amalfi to Naples, we took a ferry. Aggregator websites like &lt;a href="https://www.ferryhopper.com/en/" rel="noopener noreferrer"&gt;Ferryhopper&lt;/a&gt; can make finding the right ferry easier. Even then, it wasn’t totally clear why some ferries might take an hour vs others that would take two hours. Gemini was very helpful in researching what extra stops were being made.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk9y4ob6ze88soevgs0o5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk9y4ob6ze88soevgs0o5.png" width="799" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Feeling confident
&lt;/h3&gt;

&lt;p&gt;The ultimate test of travel planning is stepping onto the plane feeling fully prepared and organized. Gemini helped with a checklist to ensure we had everything in order: power adapters, international phone coverage, and much more.&lt;/p&gt;

&lt;p&gt;The checklist, along with all of our travel information, was stored in a structured markdown file. I could access it at any time from a Google doc, due to its &lt;a href="https://support.google.com/docs/answer/12014036?hl=en" rel="noopener noreferrer"&gt;Google Docs Markdown support&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To enable this feature, turn on Markdown under &lt;strong&gt;Tools &amp;gt; Preferences&lt;/strong&gt; in Google Docs, then upload your .md file or right-click to paste formatted text.&lt;/p&gt;

&lt;p&gt;Also, once you created this doc in the Google Docs mobile app, tap the document options menu and select &lt;strong&gt;“Make available offline”.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This creates a clean, clickable travel hub that stays fully responsive on your phone, even in airplane mode or underground metro tunnels.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc29ycn7idcaeoo5gka5f.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc29ycn7idcaeoo5gka5f.gif" width="200" height="113"&gt;&lt;/a&gt;&lt;/p&gt;
A panoramic shot of the ancient Colosseum in Rome



&lt;h3&gt;
  
  
  Your travel planning playbook
&lt;/h3&gt;

&lt;p&gt;AI agents are most useful when they work for you, going beyond surface-level recommendations in a prompt.&lt;/p&gt;

&lt;p&gt;To recap this workflow for your next journey, follow this four-part playbook:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Perform deep research and ingest docs into &lt;a href="https://notebook.google/" rel="noopener noreferrer"&gt;Gemini Notebook&lt;/a&gt; to brainstorm on your plan.&lt;/li&gt;
&lt;li&gt;Personalize your journey with your unique preferences and any constraints.&lt;/li&gt;
&lt;li&gt;Direct &lt;a href="https://antigravity.google/docs/ide/browser/?utm_team=DSS+DevRel&amp;amp;utm_campaign=default&amp;amp;utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_content=b547479075" rel="noopener noreferrer"&gt;Antigravity&lt;/a&gt; to make travel arrangements using its &lt;a href="https://antigravity.google/docs/ide/browser/?utm_team=DSS+DevRel&amp;amp;utm_campaign=default&amp;amp;utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_content=b547479075" rel="noopener noreferrer"&gt;Browser&lt;/a&gt; agent, synced to your calendar.&lt;/li&gt;
&lt;li&gt;Export your main Markdown file into an offline Google Doc that is accessible anywhere.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Do you have any stories to tell about travel planning with AI? I’d love to hear about them on &lt;a href="https://x.com/kweinmeister" rel="noopener noreferrer"&gt;X&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/karlweinmeister/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;, or &lt;a href="https://bsky.app/profile/kweinmeister.bsky.social" rel="noopener noreferrer"&gt;Bluesky&lt;/a&gt;.&lt;/p&gt;




</description>
      <category>travel</category>
      <category>gemini</category>
      <category>italy</category>
      <category>googleworkspace</category>
    </item>
    <item>
      <title>Behind the scenes: How we build, test, and scale Google Agent Skills</title>
      <dc:creator>Remigiusz Samborski</dc:creator>
      <pubDate>Mon, 03 Aug 2026 14:33:20 +0000</pubDate>
      <link>https://dev.to/googleai/behind-the-scenes-how-we-build-test-and-scale-google-agent-skills-1am5</link>
      <guid>https://dev.to/googleai/behind-the-scenes-how-we-build-test-and-scale-google-agent-skills-1am5</guid>
      <description>&lt;p&gt;AI agents are only as good as the instructions and context you give them. When we launched &lt;a href="https://github.com/google/skills" rel="noopener noreferrer"&gt;Google Agent Skills&lt;/a&gt;, our goal was simple: encode Google Cloud domain knowledge into structured, open-source instructions that make AI coding agents significantly smarter, safer, and more accurate.&lt;/p&gt;

&lt;p&gt;Today, I want to take you behind the scenes of Google Agent Skills. As a team member working directly on these skills, I will share how we started, how we maintain quality at scale, and how we handle governance for public and internal skills.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it started: The Next'26 kickoff swarm
&lt;/h2&gt;

&lt;p&gt;The Google Agent Skills project didn't start in a vacuum. It kicked off as a fast-paced "swarm" effort leading up to Google Cloud Next 2026.&lt;/p&gt;

&lt;p&gt;A cross-functional task force led by &lt;strong&gt;Developer Advocates&lt;/strong&gt; and &lt;strong&gt;Technical Writers&lt;/strong&gt; came together with a clear goal: package Google Cloud domain knowledge into structured, agent-readable instructions.&lt;/p&gt;

&lt;p&gt;The launch was announced in the &lt;a href="https://cloud.google.com/blog/topics/developers-practitioners/level-up-your-agents-announcing-googles-official-skills-repository?utm_campaign=CDR_0x87fa8d40_default_b539420191&amp;amp;utm_medium=external&amp;amp;utm_source=blog" rel="noopener noreferrer"&gt;official Google Agent Skills launch post&lt;/a&gt;. The initial community reception exceeded our expectations with over 15,000 GitHub stars!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fopgd3rqcax644g29nqyv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fopgd3rqcax644g29nqyv.png" alt="GitHub stars history for google/skills" width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once developers and engineering teams inside and outside Google saw how effectively skills guided AI agents (reducing hallucinations and enforcing best practices), many wanted in. Soon, a wave of product teams wanted to contribute skills for their own Google services (not limited to Cloud, i.e. Ads).&lt;/p&gt;

&lt;h2&gt;
  
  
  The challenge: Scaling without losing quality
&lt;/h2&gt;

&lt;p&gt;Popularity brings a major challenge: quality control. &lt;/p&gt;

&lt;p&gt;When different teams contribute skills, keeping a consistent standard becomes tough. A poorly written skill with vague instructions, broken links, or missing edge cases degrades the entire agent experience.&lt;/p&gt;

&lt;p&gt;To enable teams to publish skills while protecting the developer experience, we had to set a &lt;strong&gt;very high bar&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This meant the process was critical. Without clear standards and automated governance, an open-source skills repository quickly becomes chaotic.&lt;/p&gt;

&lt;p&gt;So let's dive into details of how we maintain quality as we scale.&lt;/p&gt;

&lt;h2&gt;
  
  
  The anatomy of an Agent Skill
&lt;/h2&gt;

&lt;p&gt;To keep skills consistent across many Google services, every skill follows a standardized repository layout:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{skill-name}/
├── SKILL.md                 # Required: Main instructions &amp;amp; frontmatter metadata
├── OWNERS                   # Required: Skill maintainers (kept internal)
├── EVAL.yaml                # Required: Evaluation prompt suites &amp;amp; rubrics (kept internal)
├── reference/               # Optional: In-depth technical docs &amp;amp; schemas
├── scripts/                 # Optional: Executable helper scripts
├── assets/                  # Optional: Static resources &amp;amp; diagrams
└── _internal/               # Optional: Test mocks &amp;amp; internal data (kept internal)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Architectural best practice: Prefer remote MCP tools
&lt;/h3&gt;

&lt;p&gt;When designing skills, our guiding principle is: &lt;strong&gt;Reference remote Model Context Protocol (MCP) tools whenever possible, falling back to CLI or API calls only when necessary.&lt;/strong&gt; Remote MCP servers are best suited for Agentic workloads by providing tools, while also offering built-in auth and IAM governance.&lt;/p&gt;

&lt;h3&gt;
  
  
  Public export
&lt;/h3&gt;

&lt;p&gt;We build and evaluate our skills internally first to make sure they work and are properly validated. Once ready to go public, we use automated export rules to publish to GitHub. This keeps public repos clean while stripping out internal assets, ownership information, and evaluation suites.&lt;/p&gt;

&lt;h2&gt;
  
  
  Automated checks on check-in
&lt;/h2&gt;

&lt;p&gt;Before any skill enters the repository, it must pass an automated CI/CD pipeline:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Linters:&lt;/strong&gt; We validate frontmatter metadata, line counts, directory layout, and strict naming conventions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Link Checkers:&lt;/strong&gt; We test every URL using link-checking tools to eliminate 404s and hallucinated links before merge. &lt;em&gt;Hint: if you're building a similar solution I recommend trying out &lt;a href="https://lychee.cli.rs/" rel="noopener noreferrer"&gt;lychee&lt;/a&gt;.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI-Assisted Checklists:&lt;/strong&gt; We use automated validation checks to verify that instructions follow required structural patterns and guardrails.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example GitHub Action for skill linting
&lt;/h3&gt;

&lt;p&gt;While our development relies on Google's internal tooling, public open-source skill repositories can use standard GitHub Actions for CI/CD.&lt;/p&gt;

&lt;p&gt;If you are maintaining your own skill library on GitHub, linting is part of a larger check suite to keep a high quality bar. The following GitHub Action configuration demonstrates how to automatically run skill validation in your repository using &lt;a href="https://github.com/agentskills/agentskills/tree/main/skills-ref" rel="noopener noreferrer"&gt;skills-ref&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Validate&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Skills'&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;main'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;main'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

&lt;span class="na"&gt;defaults&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;shell&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;bash'&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;validate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ubuntu-latest'&lt;/span&gt;
    &lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;read'&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Checkout&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;repository'&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5'&lt;/span&gt; &lt;span class="c1"&gt;# ratchet:actions/checkout@v4&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Set&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;up&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Python'&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065'&lt;/span&gt; &lt;span class="c1"&gt;# ratchet:actions/setup-python@v5&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;python-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.12'&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Install&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;skills-ref'&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;python3 -m pip install skills-ref&lt;/span&gt;
          &lt;span class="s"&gt;echo "$HOME/.local/bin" &amp;gt;&amp;gt; $GITHUB_PATH&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Validate&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;skills'&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;shopt -s nullglob&lt;/span&gt;
          &lt;span class="s"&gt;for skill_dir in skills/*/; do&lt;/span&gt;
            &lt;span class="s"&gt;echo "Validating skill: $skill_dir"&lt;/span&gt;
            &lt;span class="s"&gt;agentskills validate "$skill_dir"&lt;/span&gt;
          &lt;span class="s"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Continuous evals (on submit &amp;amp; weekly)
&lt;/h2&gt;

&lt;p&gt;Documentation and APIs evolve, and so do LLM models and agent harnesses. A skill that works today might break tomorrow if an underlying API, model, or agent harness changes.&lt;/p&gt;

&lt;p&gt;To set an initial quality bar and prevent degradation, we run continuous evaluations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;On-submit evaluations:&lt;/strong&gt; Authors must provide explicit evaluation prompt suites and scoring rubrics. Every new skill that we launch is first evaluated internally to ensure its accuracy and efficiency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weekly quality checks:&lt;/strong&gt; We run continuous, scheduled evaluation jobs against the full skill library to catch regressions early.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Skill authors must supply multiple evaluation test cases, each containing a prompt and a set of expectations. With each evaluation suite, we compare the performance of agents with and without each skill.&lt;/p&gt;

&lt;p&gt;And look at two main dimensions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Accuracy - response quality and task completion rate&lt;/li&gt;
&lt;li&gt;Efficiency - number of consumed tokens and time for completion&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Moreover we run our evals multiple times against different agent frameworks to obtain statistically significant results.&lt;/p&gt;

&lt;p&gt;Finally the 2x2 matrix proves whether a skill delivers a measurable accuracy and efficiency uplift.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1zftd8j1g0ozhbsbm5ri.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1zftd8j1g0ozhbsbm5ri.jpg" alt="2x2 evaluation matrix comparing efficiency and performance for agents with and without skills" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Skills are products, not snippets
&lt;/h2&gt;

&lt;p&gt;A key lesson learned from our work is that a skill is a living product, not a one-off document.&lt;/p&gt;

&lt;p&gt;To ensure long-term reliability, we established strict ownership rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repo maintainers&lt;/strong&gt; oversee repository health, CI pipelines, and architectural standards.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skill owners&lt;/strong&gt; are responsible for maintaining their skills long-term. For example, if a product API changes, the skill owner updates the skill. The same applies to quality degradation found during evaluation runs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Supporting authors: Tools and agentic workflows
&lt;/h2&gt;

&lt;p&gt;Writing effective instructions and evaluation suites requires practice and we don't expect skill authors to craft everything from scratch.&lt;/p&gt;

&lt;p&gt;To support our contributors, we built several tools and agentic workflows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Internal skills&lt;/strong&gt; designed specifically to assist authors building new skills and writing robust evaluations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agentic tools&lt;/strong&gt; built with the &lt;a href="https://adk.dev/" rel="noopener noreferrer"&gt;ADK&lt;/a&gt; that run multi-agent loops for authoring and self-critique, with an easy export path to the main repository.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I will dive deeper into these authoring tools and agentic workflows in future articles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Internal efficiency with "DevRel Skills"
&lt;/h2&gt;

&lt;p&gt;While &lt;a href="https://github.com/google/skills" rel="noopener noreferrer"&gt;Google Agent Skills&lt;/a&gt; hosts public skills for external developers, we also launched a parallel internal initiative called &lt;strong&gt;DevRel Skills&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;DevRel Skills focus on building agent skills specifically for internal team workflows. By encoding internal processes — such as content transformation, SEO optimization, internal reporting, etc. - into dedicated skills, we help our team work more effectively and consistently every day.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrap-up and over to you
&lt;/h2&gt;

&lt;p&gt;Building quality agent skills at scale requires combining clear standards, rigorous evaluation, automated CI/CD, and long-term ownership.&lt;/p&gt;

&lt;p&gt;As agentic development grows, we'd love to hear from you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;How are you building and testing agent skills in your workflow?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What checks or evals do you use to verify agent responses?&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let us know in the comments or reach out on socials!&lt;/p&gt;

&lt;h2&gt;
  
  
  Links and further reading
&lt;/h2&gt;

&lt;p&gt;To get started with Google Agent Skills, check out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Google Agent Skills Repo:&lt;/strong&gt; &lt;a href="https://github.com/google/skills" rel="noopener noreferrer"&gt;github.com/google/skills&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Part 1:&lt;/strong&gt; &lt;a href="https://medium.com/google-cloud/google-cloud-skills-tutorial-the-complete-guide-to-ai-powered-cloud-operations-7838fcc9541a" rel="noopener noreferrer"&gt;Introduction: What Are Google Cloud Agent Skills?&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Part 2:&lt;/strong&gt; &lt;a href="https://medium.com/google-cloud/google-cloud-skills-tutorial-part-2-intermediate-skills-in-action-dd599a32fb6c" rel="noopener noreferrer"&gt;Practical Guide: Intermediate Agent Skills in Action&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's next?
&lt;/h2&gt;

&lt;p&gt;If you found this post helpful:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add reactions to this post by pressing the heart ❤️ button.&lt;/li&gt;
&lt;li&gt;Share this post with your friends on socials.&lt;/li&gt;
&lt;li&gt;Connect with me via &lt;a href="https://www.linkedin.com/in/remigiusz-samborski/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;, &lt;a href="https://x.com/RemikSamborski" rel="noopener noreferrer"&gt;X&lt;/a&gt; or &lt;a href="https://bsky.app/profile/rsamborski.bsky.social" rel="noopener noreferrer"&gt;Bluesky&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agentskills</category>
      <category>googlecloud</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Skills vs MCP: How AI tools have evolved</title>
      <dc:creator>Tilde A. Thurium</dc:creator>
      <pubDate>Thu, 30 Jul 2026 17:50:23 +0000</pubDate>
      <link>https://dev.to/googleai/skills-vs-mcp-how-ai-tools-have-evolved-3pmk</link>
      <guid>https://dev.to/googleai/skills-vs-mcp-how-ai-tools-have-evolved-3pmk</guid>
      <description>&lt;p&gt;Eighteen months ago, MCP was &lt;em&gt;the&lt;/em&gt; thing. Every demo and chatbot connector was running on MCP under the hood. When I started seeing everyone talk about &lt;em&gt;Skills&lt;/em&gt;, I got curious. How are MCP and Skills connected? Are they different lenses on the same problem?&lt;/p&gt;

&lt;p&gt;I brought these questions to &lt;a href="https://dev.to/greggyb"&gt;@greggyb&lt;/a&gt; again in our latest video.&lt;/p&gt;


&lt;div class="crayons-card c-embed"&gt;

  
&lt;h2&gt;
  
  
  What's in the video
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;What MCP actually does: giving a model programmatic access to APIs and the file system through natural language&lt;/li&gt;
&lt;li&gt;Downsides of MCP: context bloat from loading hundreds of lines of tool definitions for tools you're not even using&lt;/li&gt;
&lt;li&gt;What a Skill actually is (spoiler: pretty much a markdown file containing a reusable prompt)&lt;/li&gt;
&lt;li&gt;Progressive disclosure: why an agent can "know about" 20 skills without loading the full instructions for all of them&lt;/li&gt;
&lt;li&gt;Why MCP and Skills aren't competitors, and how Skills can even teach your agent &lt;em&gt;how&lt;/em&gt; to use MCP tools

&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;



&lt;p&gt;My favorite line from this one: the hottest programming language right now is English. Skills let non-developers write, iterate on, and share instructions that make an entire team's agents faster, no code required.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/T6PQIPMlj3E"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Are you using Skills yet? Curious where everyone's at.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>mcp</category>
      <category>agentskills</category>
    </item>
    <item>
      <title>7 Times Faster and Cheaper? Gemini 3.5 Flash Lite and Gemini 3.6 Flash in Google Cloud Databases</title>
      <dc:creator>Gleb Otochkin</dc:creator>
      <pubDate>Sun, 26 Jul 2026 06:11:17 +0000</pubDate>
      <link>https://dev.to/googleai/7-times-faster-and-cheaper-gemini-35-flash-lite-and-gemini-36-flash-in-google-cloud-databases-57lf</link>
      <guid>https://dev.to/googleai/7-times-faster-and-cheaper-gemini-35-flash-lite-and-gemini-36-flash-in-google-cloud-databases-57lf</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3j2kjt10xyb8rrp6luh7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3j2kjt10xyb8rrp6luh7.png" width="799" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Only a couple of months ago, I wrote a &lt;a href="https://dev.to/googleai/gemini-35-flash-in-google-cloud-databases-14kg"&gt;blog&lt;/a&gt; post describing how to enable the latest (at the time) Gemini 3.5 Flash in Google Cloud databases. Now, it is time to introduce the newest model: Gemini 3.6 Flash. This model is fresher, with a knowledge cutoff date around the end of March this year, and it costs less. Let’s look at how it performs at first glance. I am particularly curious about its response times and how it compares to the previous model.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cloud SQL
&lt;/h3&gt;

&lt;p&gt;For Cloud SQL for Postgres, don’t forget to enable full &lt;a href="https://docs.cloud.google.com/sql/docs/postgres/ai-overview" rel="noopener noreferrer"&gt;AI integration&lt;/a&gt; via the google_ml extension to &lt;a href="https://docs.cloud.google.com/sql/docs/postgres/invoke-online-predictions" rel="noopener noreferrer"&gt;call models&lt;/a&gt;directly from a SQL query. If you are reading this AI integration overview right after the model announcement, you might need to register the model first. It wasn’t available by default when I tested it.&lt;/p&gt;

&lt;p&gt;Here is the SQL statement to register the model. Don’t forget to replace the PROJECT_ID placeholder in the code with your actual Google Cloud project ID:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CALL&lt;/span&gt; &lt;span class="n"&gt;google_ml&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model_id&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'gemini-3.6-flash'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;model_request_url&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'https://aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/global/publishers/google/models/gemini-3.6-flash:generateContent'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;model_provider&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'google'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;model_type&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'generic'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;model_auth_type&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'cloudsql_service_agent_iam'&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After that, your model is ready to be used:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;google_ml&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;predict_row&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model_id&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'gemini-3.6-flash'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;request_body&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;json_build_object&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s1"&gt;'contents'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json_build_array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;json_build_object&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="s1"&gt;'role'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'user'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s1"&gt;'parts'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json_build_array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="n"&gt;json_build_object&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'text'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Explain MCP server for a relational database in 50 words or less.'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="s1"&gt;'candidates'&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'content'&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'parts'&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'text'&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;ai_response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To measure the latency, I’ve asked Google Antigravity to prepare a PL/pgSQL function to run that query a certain number of times and aggregate the results. It did a decent job, I needed only a few polishing and adjustments to make it working. Here are my benchmarking results for Gemini 3.6 Flash and Gemini 3.5 Flash:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;quickstart_db=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;SELECT &lt;span class="k"&gt;*&lt;/span&gt; FROM benchmark_model_predictions&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'gemini-3.6-flash'&lt;/span&gt;, 10&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="go"&gt; total_runs | avg_latency_ms | median_latency_ms | min_latency_ms | max_latency_ms 
------------+----------------+-------------------+----------------+----------------
         10 | 3694.53 | 3725.52 | 3313.01 | 4213.40
(1 row)

Time: 36947.554 ms (00:36.948)
&lt;/span&gt;&lt;span class="gp"&gt;quickstart_db=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;SELECT &lt;span class="k"&gt;*&lt;/span&gt; FROM benchmark_model_predictions&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'gemini-3.5-flash'&lt;/span&gt;, 10&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="go"&gt; total_runs | avg_latency_ms | median_latency_ms | min_latency_ms | max_latency_ms 
------------+----------------+-------------------+----------------+----------------
         10 | 4918.86 | 5136.67 | 3936.69 | 5722.01
(1 row)

Time: 49190.861 ms (00:49.191)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It looks like, all other conditions being equal, Gemini 3.6 Flash was slightly faster than the previous model. Of course, this is a very crude measurement, and your results may vary. Since we are using a global endpoint, the routing might theoretically hit different regional endpoints. Furthermore, public model endpoints are shared services.&lt;/p&gt;

&lt;p&gt;Next, I created a function to evaluate the quality of the responses and ran it for both models. The function uses the same query, receives the response, and sends the result to a more advanced model for evaluation. In this case, I used gemini-3.1-pro-preview as the judge:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;quickstart_db=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;SELECT &lt;span class="k"&gt;*&lt;/span&gt; FROM benchmark_model_quality&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'gemini-3.6-flash'&lt;/span&gt;, &lt;span class="s1"&gt;'gemini-3.1-pro-preview'&lt;/span&gt;, 5&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="go"&gt; total_runs | avg_quality_score | median_quality_score | min_quality_score | max_quality_score 
------------+-------------------+----------------------+-------------------+-------------------
          5 | 10.00 | 10.00 | 10 | 10
(1 row)

&lt;/span&gt;&lt;span class="gp"&gt;quickstart_db=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;SELECT &lt;span class="k"&gt;*&lt;/span&gt; FROM benchmark_model_quality&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'gemini-3.5-flash'&lt;/span&gt;, &lt;span class="s1"&gt;'gemini-3.1-pro-preview'&lt;/span&gt;, 5&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="go"&gt; total_runs | avg_quality_score | median_quality_score | min_quality_score | max_quality_score 
------------+-------------------+----------------------+-------------------+-------------------
          5 | 9.80 | 10.00 | 9 | 10
(1 row)

&lt;/span&gt;&lt;span class="gp"&gt;quickstart_db=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both models delivered excellent results, but Gemini 3.6 Flash provided slightly better responses than its predecessor — at least according to the gemini-3.1-pro-preview judge.&lt;/p&gt;

&lt;p&gt;What about AlloyDB? Let’s run the same performance benchmark on AlloyDB to see if the response times match our Cloud SQL results.&lt;/p&gt;

&lt;h3&gt;
  
  
  AlloyDB
&lt;/h3&gt;

&lt;p&gt;Registering the new model in AlloyDB follows almost the same &lt;a href="https://docs.cloud.google.com/alloydb/docs/ai/model-endpoint-overview" rel="noopener noreferrer"&gt;process&lt;/a&gt;, with the only difference being the ‘model_type’ parameter. In AlloyDB, we register it with the model type ‘llm’. Again, don’t forget to replace the PROJECT_ID placeholder with your actual project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CALL&lt;/span&gt; &lt;span class="n"&gt;google_ml&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="n"&gt;model_id&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'gemini-3.6-flash'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;model_request_url&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'https://aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/global/publishers/google/models/gemini-3.6-flash:generateContent'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;model_provider&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'google'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;model_type&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'llm'&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For these tests, I used the exact same query and function as we did for Cloud SQL. AlloyDB is fully compatible with PostgreSQL and shares the same AI integration &lt;a href="https://docs.cloud.google.com/alloydb/docs/reference/model-endpoint" rel="noopener noreferrer"&gt;extension&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;quickstart_db=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;SELECT &lt;span class="k"&gt;*&lt;/span&gt; FROM benchmark_model_predictions&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'gemini-3.5-flash'&lt;/span&gt;, 10&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="go"&gt; total_runs | avg_latency_ms | median_latency_ms | min_latency_ms | max_latency_ms
------------+----------------+-------------------+----------------+----------------
         10 | 4899.00 | 4910.05 | 3631.22 | 5798.40
(1 row)

Time: 48992.149 ms (00:48.992)
&lt;/span&gt;&lt;span class="gp"&gt;quickstart_db=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;SELECT &lt;span class="k"&gt;*&lt;/span&gt; FROM benchmark_model_predictions&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'gemini-3.6-flash'&lt;/span&gt;, 10&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="go"&gt; total_runs | avg_latency_ms | median_latency_ms | min_latency_ms | max_latency_ms
------------+----------------+-------------------+----------------+----------------
         10 | 4364.76 | 4368.65 | 3664.24 | 5008.42
(1 row)

Time: 43649.384 ms (00:43.649)
&lt;/span&gt;&lt;span class="gp"&gt;quickstart_db=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This time, the results were much closer, and the response times were almost identical. It is hard to draw definitive conclusions here, considering we are using a shared service with global routing; there is no guarantee that consecutive requests are hitting the same physical endpoint. However, it appears that performance and response times are roughly equivalent for both models. Naturally, the quality of the responses remained consistent with our previous test, as quality depends directly on the models themselves.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gemini 3.5 Flash Lite
&lt;/h3&gt;

&lt;p&gt;But do you always need a “Pro” or “Flash” model for your queries? In many cases, you can get highly acceptable results from a “Lite” model like the newly released gemini-3.5-flash-lite. I tested its performance using the same benchmarking approach:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;quickstart_db=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;SELECT &lt;span class="k"&gt;*&lt;/span&gt; FROM benchmark_model_predictions&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'gemini-3.5-flash-lite'&lt;/span&gt;, 10&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="go"&gt; total_runs | avg_latency_ms | median_latency_ms | min_latency_ms | max_latency_ms
------------+----------------+-------------------+----------------+----------------
         10 | 827.08 | 882.05 | 499.95 | 1034.92
(1 row)

Time: 8272.929 ms (00:08.273)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It was about seven times faster than Gemini 3.6 Flash. But what about response quality?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;quickstart_db=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;SELECT &lt;span class="k"&gt;*&lt;/span&gt; FROM benchmark_model_quality&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'gemini-3.5-flash-lite'&lt;/span&gt;, &lt;span class="s1"&gt;'gemini-3.1-pro-preview'&lt;/span&gt;, 5&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="go"&gt; total_runs | avg_quality_score | median_quality_score | min_quality_score | max_quality_score
------------+-------------------+----------------------+-------------------+-------------------
          5 | 10.00 | 10.00 | 10 | 10
(1 row)

Time: 42923.480 ms (00:42.923)
&lt;/span&gt;&lt;span class="gp"&gt;quickstart_db=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;SELECT &lt;span class="k"&gt;*&lt;/span&gt; FROM benchmark_model_quality&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'gemini-3.5-flash-lite'&lt;/span&gt;, &lt;span class="s1"&gt;'gemini-3.1-pro-preview'&lt;/span&gt;, 5&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="go"&gt; total_runs | avg_quality_score | median_quality_score | min_quality_score | max_quality_score
------------+-------------------+----------------------+-------------------+-------------------
          5 | 9.60 | 10.00 | 8 | 10
(1 row)

Time: 51722.997 ms (00:51.723)
&lt;/span&gt;&lt;span class="gp"&gt;quickstart_db=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;SELECT &lt;span class="k"&gt;*&lt;/span&gt; FROM benchmark_model_quality&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'gemini-3.5-flash-lite'&lt;/span&gt;, &lt;span class="s1"&gt;'gemini-3.1-pro-preview'&lt;/span&gt;, 5&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="go"&gt; total_runs | avg_quality_score | median_quality_score | min_quality_score | max_quality_score
------------+-------------------+----------------------+-------------------+-------------------
          5 | 9.80 | 10.00 | 9 | 10
(1 row)

Time: 53252.325 ms (00:53.252)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I ran the same benchmark three times, and even the worst-performing run was highly scored. The average scores ranged from 9.6 to 10 (with 10 being a perfect score). I was impressed by both the quality and the speed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Summary
&lt;/h3&gt;

&lt;p&gt;The new Gemini 3.6 Flash model is less &lt;a href="https://ai.google.dev/gemini-api/docs/pricing" rel="noopener noreferrer"&gt;expensive&lt;/a&gt; than Gemini 3.5 Flash. Considering it offers comparable or better quality and the same or faster response times, it is definitely a win.&lt;/p&gt;

&lt;p&gt;However, Gemini 3.5 Flash Lite is maybe even more impressive, delivering excellent quality while running seven times faster at a very attractive price. This means that many simpler, everyday tasks can be delegated to the Lite model to keep costs down, reserving more advanced models for complex problems that require deep reasoning and multi-step iterations.&lt;/p&gt;




</description>
      <category>googlecloudsql</category>
      <category>performance</category>
      <category>alloydb</category>
      <category>googlegeminiai</category>
    </item>
    <item>
      <title>AI builder essentials: tokens, context windows and RAG 101</title>
      <dc:creator>Tilde A. Thurium</dc:creator>
      <pubDate>Fri, 24 Jul 2026 19:16:22 +0000</pubDate>
      <link>https://dev.to/googleai/ai-builder-essentials-tokens-context-windows-and-rag-101-12bn</link>
      <guid>https://dev.to/googleai/ai-builder-essentials-tokens-context-windows-and-rag-101-12bn</guid>
      <description>&lt;p&gt;Tokens are an important foundational concept that underlie how we interact with LLMs. &lt;a class="mentioned-user" href="https://dev.to/greggyb"&gt;@greggyb&lt;/a&gt; and myself recorded a quick video to demystify what a token actually is and unpack several other related concepts.&lt;/p&gt;


&lt;div class="crayons-card c-embed"&gt;

  
&lt;h2&gt;
  
  
  What's in the video
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;What is a token? Tokens are the basic unit of input and output that LLMs operate on. &lt;/li&gt;
&lt;li&gt;What is retrieval-augmented generation (AKA RAG)? Providing a model with extra data that isn't already in the model's training dataset, and is relevant to a specific query.&lt;/li&gt;
&lt;li&gt;What are context windows? Context windows are how many tokens a model can use for input and output. Context window size varies from model to model, but it has increased a lot in recent years.&lt;/li&gt;
&lt;li&gt;What is tokenmaxxing? Does using more tokens really mean you're being more productive? (Spoiler alert: no.)

&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;



&lt;p&gt;To paint a bigger picture: more context you give a large language model, the better your responses are likely to be. The design patterns for providing that context have evolved at a rapid pace, and are likely to continue doing so.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/BnEhq2lPRz4"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;What AI terms should we demystify next? Let us know!&lt;/p&gt;

</description>
      <category>tokenomics</category>
      <category>rag</category>
      <category>tokenmaxxing</category>
      <category>ai</category>
    </item>
    <item>
      <title>Claude Opus 5 is Live on Agent Platform 🚀</title>
      <dc:creator>Jen Harvey</dc:creator>
      <pubDate>Fri, 24 Jul 2026 17:37:35 +0000</pubDate>
      <link>https://dev.to/googleai/claude-opus-5-is-live-on-agent-platform-3f52</link>
      <guid>https://dev.to/googleai/claude-opus-5-is-live-on-agent-platform-3f52</guid>
      <description>&lt;p&gt;Claude 5 Opus is officially available in the Model Garden on Agent Platform!&lt;/p&gt;

&lt;p&gt;Built for highly complex, long-running agentic workflows, Claude 5 Opus brings advanced capabilities in coding, vision, and deep reasoning - allowing businesses to deploy next-generation AI agents with minimal oversight.&lt;/p&gt;

&lt;p&gt;Using Claude 5 Opus on Agent Platform keeps your data inside your private Google Cloud network, controls access with IAM, and ensures your data is never used for model training. Built with high-security enterprise environments in mind, it is alsoZero Data Retention (ZDR) compatible.&lt;/p&gt;

&lt;p&gt;Find it in the &lt;a href="https://console.cloud.google.com/agent-platform/publishers/anthropic/model-garden/claude-opus-5" rel="noopener noreferrer"&gt;Agent Platform Model Garden&lt;/a&gt; 🌱&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>googlecloud</category>
      <category>developer</category>
    </item>
    <item>
      <title>Investing in multi-agent AI safety research</title>
      <dc:creator>Gemini Team</dc:creator>
      <pubDate>Fri, 24 Jul 2026 14:35:41 +0000</pubDate>
      <link>https://dev.to/googleai/investing-in-multi-agent-ai-safety-research-312l</link>
      <guid>https://dev.to/googleai/investing-in-multi-agent-ai-safety-research-312l</guid>
      <description>&lt;center&gt;&lt;h3&gt;Scaling AI Safety Research for a Multi-Agent World&lt;/h3&gt;&lt;/center&gt;

&lt;p&gt;For the past decade, we've focused on making individual AI models more capable, helpful and safe. Now, Google DeepMind — together with &lt;a href="https://www.schmidtsciences.org/" rel="noopener noreferrer"&gt;Schmidt Sciences&lt;/a&gt;, the &lt;a href="https://www.cooperativeai.com/foundation" rel="noopener noreferrer"&gt;Cooperative AI Foundation&lt;/a&gt;, the &lt;a href="https://aria.org.uk/opportunity-spaces/trust-everything-everywhere/scaling-trust/" rel="noopener noreferrer"&gt;Advanced Research and Invention Agency&lt;/a&gt;, and supported by &lt;a href="http://google.org/" rel="noopener noreferrer"&gt;Google.org&lt;/a&gt; — has announced a new technical research funding call of up to $10M for researchers worldwide.&lt;/p&gt;

&lt;p&gt;As AI technology scales, we're entering a new era. Soon, millions of AI agents — built by different organizations — will interact across digital environments, communicating, negotiating and transacting with one another.&lt;/p&gt;

&lt;p&gt;When these systems interact, they must do so safely and predictably. This shift creates a vital opportunity: we can strengthen the safety and stability of the entire AI ecosystem from the very beginning.&lt;/p&gt;

&lt;p&gt;The funding call focuses on the study of how large-scale multi-agent AI systems behave as a group, and how we can provide frameworks to understand and mitigate against potential risks. By empowering researchers globally, we aim to solve the "invisible" safety risks that arise when independent systems interact across different networks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the agent ecosystem matters
&lt;/h2&gt;

&lt;p&gt;When large groups of AI agents interact, new collective behaviors and capabilities can emerge suddenly. Currently, we lack the tools to predict, measure and monitor these transitions. Most safety evaluations analyze models in isolation. However, as &lt;a href="https://arxiv.org/abs/2512.16856" rel="noopener noreferrer"&gt;we&lt;/a&gt; and &lt;a href="https://www.cooperativeai.com/post/new-report-multi-agent-risks-from-advanced-ai" rel="noopener noreferrer"&gt;others&lt;/a&gt; have previously argued, interacting autonomous agents can produce complex, "emergent" behaviors that are difficult to anticipate.&lt;/p&gt;

&lt;p&gt;Because this is a new area of research, it is critical to understand how these shifts occur. For example, could they cause an unpredictable flurry of economic activity or lead to new security challenges? Understanding how to manage these system-wide behaviors is our core objective.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scaling the frontier of multi-agent safety research
&lt;/h2&gt;

&lt;p&gt;Although foundational frameworks for multi-agent safety exist, the rapid evolution of these systems requires an immediate, large-scale expansion of research.&lt;/p&gt;

&lt;p&gt;Our &lt;a href="https://arxiv.org/abs/2512.16856" rel="noopener noreferrer"&gt;2025 research&lt;/a&gt; established a framework for understanding these interactions, while our recent work on &lt;a href="https://papers.ssrn.com/sol3/papers.cfm?abstract_id=6372438" rel="noopener noreferrer"&gt;AI Agent Traps&lt;/a&gt; explores vulnerabilities agents face in adversarial environments. Now, we must move faster. We are at a critical juncture where the complexity of multi-agent interactions is outpacing existing safety models.&lt;/p&gt;

&lt;p&gt;This funding call aims to accelerate progress by supporting a global network of independent researchers. A diverse community is essential to ensure safety standards are transparent and robust for everyone.&lt;/p&gt;

&lt;p&gt;This effort also advances the mission of Schmidt Sciences' &lt;a href="https://www.schmidtsciences.org/trustworthy-ai/" rel="noopener noreferrer"&gt;Science of Trustworthy AI&lt;/a&gt; and &lt;a href="https://www.schmidtsciences.org/ai-agents/" rel="noopener noreferrer"&gt;AI Agents&lt;/a&gt; programs, which support foundational work on understanding and mitigating risks from frontier AI systems, as well as ARIA's &lt;a href="https://aria.org.uk/opportunity-spaces/trust-everything-everywhere/scaling-trust/" rel="noopener noreferrer"&gt;Scaling Trust&lt;/a&gt; programme, which seeks to unlock new forms of cyber-physical multi-agent coordination.&lt;/p&gt;

&lt;h2&gt;
  
  
  A collaborative call to action
&lt;/h2&gt;

&lt;p&gt;No single lab can solve multi-agent safety alone. We invite academic and independent researchers to submit proposals in four priority areas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sandboxes and testbeds:&lt;/strong&gt; Building realistic, reproducible environments to evaluate, compare and accelerate progress across all areas of multi-agent safety. This includes virtual marketplaces, simulated ecosystems and multi-organisation workflows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The science of agent networks:&lt;/strong&gt; Understanding the safety-relevant properties of interacting agent populations, including investigating how collective capabilities emerge and scale, how networks fail or become volatile and how to detect dangerous, unexpected population-level properties.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strengthening agent infrastructure:&lt;/strong&gt; Stress-testing the protocols for identity, reputation and commitment that are secure cross-platform agent interactions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Oversight and control:&lt;/strong&gt; Developing methods to monitor deployed agent populations and mitigate collective harms at scale.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to participate
&lt;/h2&gt;

&lt;p&gt;We invite researchers to review our call for proposals and join us in building a safe foundation for a multi-agent future.&lt;/p&gt;

&lt;p&gt;The deadline to apply is August 8, 2026, with awardees expected to be announced in Autumn 2026.&lt;/p&gt;

&lt;p&gt;For more details on technical requirements and the application process, visit our &lt;a href="https://schmidtsciences.smapply.io/prog/scaling_ai_safety_for_a_multi_agent_world" rel="noopener noreferrer"&gt;application portal&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>security</category>
      <category>google</category>
    </item>
    <item>
      <title>Google Cloud Skills Tutorial — Part 2 : Intermediate Skills in Action</title>
      <dc:creator>Romin Irani</dc:creator>
      <pubDate>Fri, 24 Jul 2026 00:57:29 +0000</pubDate>
      <link>https://dev.to/googleai/google-cloud-skills-tutorial-part-2-intermediate-skills-in-action-kdm</link>
      <guid>https://dev.to/googleai/google-cloud-skills-tutorial-part-2-intermediate-skills-in-action-kdm</guid>
      <description>&lt;p&gt;Welcome to the definitive guide on Google Cloud Agent Skills.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;The Series:&lt;br&gt;&lt;br&gt;
-&lt;/em&gt; &lt;a href="https://dev.to/googleai/google-cloud-skills-tutorial-the-complete-guide-to-ai-powered-cloud-operations-13d9"&gt;&lt;em&gt;Part 1 : What are Google Cloud Skills&lt;/em&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;-&lt;/em&gt; &lt;strong&gt;&lt;em&gt;Part 2 : Intermediate Skills in Action (BigQuery and Cloud Run) (this blog)&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
_- Part 3 : Advanced Ops (WAF Security, Architecture, Custom Skills)  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Part 4 : More Use Cases_&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcn7eknp8w5xiyg3a3daa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcn7eknp8w5xiyg3a3daa.png" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Before your agent or code can interact with any Google Cloud service, it needs permission to do so. Authentication is the very first step in the Google Cloud Agent Skills workflow because without it, every subsequent operation will fail with a 401 Unauthorized or 403 Forbidden error.&lt;/p&gt;

&lt;p&gt;Setting up authentication correctly ensures a smooth, secure experience whether you are building locally, deploying to the cloud, or using agents.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prerequisites: Manual Setup
&lt;/h3&gt;

&lt;p&gt;While our agent will do most of the heavy lifting, authentication requires an initial manual login to establish your identity on your machine.&lt;/p&gt;

&lt;p&gt;Run the following commands in your terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Set your active project&lt;/span&gt;
gcloud config &lt;span class="nb"&gt;set &lt;/span&gt;project YOUR_PROJECT_ID

&lt;span class="c"&gt;# Login to the gcloud CLI&lt;/span&gt;
gcloud auth login

&lt;span class="c"&gt;# Set up Application Default Credentials (ADC)&lt;/span&gt;
gcloud auth application-default login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once this is done, you are ready to use the agent for everything else!&lt;/p&gt;

&lt;h4&gt;
  
  
  Confirming Skill Installation
&lt;/h4&gt;

&lt;p&gt;For this step, we will use the google-cloud-recipe-auth skill. Confirm it's installed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Prompt-Driven Authentication Checks
&lt;/h4&gt;

&lt;p&gt;Instead of manually running diagnostic scripts or consulting complex decision trees, you can just ask your agent. The agent uses the google-cloud-recipe-auth skill to evaluate your environment and provide tailored guidance.&lt;/p&gt;

&lt;p&gt;The responses given below are from running them in &lt;strong&gt;Antigravity CLI&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Verifying Authentication&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You prompt:&lt;/strong&gt; Check if my Google Cloud authentication is set up correctly for project YOUR_PROJECT_ID&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent response:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Yes, your Google Cloud authentication is set up correctly for project PROJECT_ID.                                                       

  ### Verification Details:                                                                                                                           

  1. Active Account (gcloud CLI)                                                                                                                      
      • Account: YOUR_ACCOUNT                                                                                                                    
      • Status: Authenticated &amp;amp; Active                                                                                                                
  2. Project Configuration                                                                                                                            
      • Active Project: PROJECT_ID                                                                                                        
      • Quota Project: PROJECT_ID                                                                                                         
      • Compute Region: us-central1                                                                                                                   
  3. Project Access &amp;amp; Status                                                                                                                          
      • Project Name: PROJECT_ID                                                                                                                 
      • Project Number: PROJECT_NUMBER                                                                                                                  
      • Lifecycle State: ACTIVE                                                                                                                       
      • Permissions: Verified (able to retrieve project metadata via Resource Manager API).                                                           
  4. Application Default Credentials (ADC)                                                                                                            
      • Status: Active &amp;amp; Valid (client SDKs and application libraries can successfully authenticate to Google Cloud APIs).
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Architectural Auth Decisions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You prompt:&lt;/strong&gt; What authentication method should I use for a Cloud Run service that needs to access BigQuery?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent response: (Which skill did it use? Answer comes a bit later&lt;/strong&gt;)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;For a Cloud Run service accessing BigQuery, the recommended Google Cloud best practice is Service-to-Service Authentication via attached Service    
  Accounts.                                                                                                                                           
  ──────                                                                                                                                              
  &lt;span class="c"&gt;### Recommended Setup                                                                                                                               &lt;/span&gt;

  &lt;span class="c"&gt;#### 1. Authentication (Identity)                                                                                                                   &lt;/span&gt;

  Attach a Custom User-Managed Service Account to your Cloud Run service instead of using default accounts or static JSON key files.                  

  • Create a custom service account &lt;span class="o"&gt;(&lt;/span&gt;e.g., cloud-run-bq-sa@&amp;lt;project-id&amp;gt;.iam.gserviceaccount.com&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;                                                     
  • Attach it to Cloud Run during deployment:                                                                                                         
    gcloud run deploy SERVICE_NAME &lt;span class="se"&gt;\ &lt;/span&gt;                                                                                                                 
      &lt;span class="nt"&gt;--image&lt;/span&gt; IMAGE_URL &lt;span class="se"&gt;\ &lt;/span&gt;                                                                                                                            
      &lt;span class="nt"&gt;--service-account&lt;/span&gt; cloud-run-bq-sa@PROJECT_ID.iam.gserviceaccount.com                                                                            


  │ ⚠️ Avoid using static Service Account Keys &lt;span class="o"&gt;(&lt;/span&gt;JSON files&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt; Cloud Run provides a secure &lt;span class="nb"&gt;local &lt;/span&gt;metadata server that handles token issuance dynamically.
  ──────                                                                                                                                              
  &lt;span class="c"&gt;#### 2. Authorization (IAM Roles)                                                                                                                   &lt;/span&gt;

  Grant your service account the least-privilege IAM roles required &lt;span class="k"&gt;for &lt;/span&gt;BigQuery:                                                                     

  • roles/bigquery.jobUser: Required to run query &lt;span class="nb"&gt;jobs &lt;/span&gt;&lt;span class="k"&gt;in &lt;/span&gt;the project.                                                                                
  • roles/bigquery.dataViewer &lt;span class="o"&gt;(&lt;/span&gt;or roles/bigquery.dataEditor&lt;span class="o"&gt;)&lt;/span&gt;: Required to &lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;or write&lt;span class="o"&gt;)&lt;/span&gt; data &lt;span class="k"&gt;in &lt;/span&gt;the specific dataset or tables.                     

    &lt;span class="c"&gt;# Grant permission to run jobs in the project                                                                                                     &lt;/span&gt;
    gcloud projects add-iam-policy-binding PROJECT_ID &lt;span class="se"&gt;\ &lt;/span&gt;                                                                                              
      &lt;span class="nt"&gt;--member&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"serviceAccount:cloud-run-bq-sa@PROJECT_ID.iam.gserviceaccount.com"&lt;/span&gt; &lt;span class="se"&gt;\ &lt;/span&gt;                                                                 
      &lt;span class="nt"&gt;--role&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"roles/bigquery.jobUser"&lt;/span&gt;                                                                                                                 

    &lt;span class="c"&gt;# Grant permission on the dataset                                                                                                                 &lt;/span&gt;
    gcloud bigquery datasets add-iam-policy-binding DATASET_NAME &lt;span class="se"&gt;\ &lt;/span&gt;                                                                                   
      &lt;span class="nt"&gt;--member&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"serviceAccount:cloud-run-bq-sa@PROJECT_ID.iam.gserviceaccount.com"&lt;/span&gt; &lt;span class="se"&gt;\ &lt;/span&gt;                                                                 
      &lt;span class="nt"&gt;--role&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"roles/bigquery.dataViewer"&lt;/span&gt;                                                                                                              
    ──────                                                                                                                                            
  &lt;span class="c"&gt;#### 3. In-Code Access (Application Default Credentials)                                                                                            &lt;/span&gt;

  In your application code, initialize the official Google Cloud BigQuery client library without passing explicit credentials. The library            
  automatically retrieves tokens via Application Default Credentials &lt;span class="o"&gt;(&lt;/span&gt;ADC&lt;span class="o"&gt;)&lt;/span&gt; from the Cloud Run metadata server.                                        

  Python Example:                                                                                                                                     

    from google.cloud import bigquery                                                                                                                 

    &lt;span class="c"&gt;# Automatically authenticates using the attached service account                                                                                  &lt;/span&gt;
    client &lt;span class="o"&gt;=&lt;/span&gt; bigquery.Client&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;project&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"PROJECT_ID"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;                                                                                        

    query_job &lt;span class="o"&gt;=&lt;/span&gt; client.query&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"SELECT 1 AS test"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;                                                                                                      
    results &lt;span class="o"&gt;=&lt;/span&gt; query_job.result&lt;span class="o"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I asked Antigravity CLI the following question: how did you answer the above question?&lt;/p&gt;

&lt;p&gt;And here is the response. Check how it used the other skill:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I answered the question by drawing on Google Cloud's Security Best Practices (documented in the SKILL.md skill):                                    

  1. Authentication Framework (Identity)                                                                                                              
      • Google Cloud recommends using managed service identities for production workloads rather than static credentials (like JSON key files).       
      • In Cloud Run, attaching a custom service account allows the instance metadata server to issue short-lived access tokens dynamically.          
  2. IAM Authorization Model (Permissions)                                                                                                            
      • Google Cloud IAM enforces the principle of least privilege.                                                                                   
      • Accessing BigQuery requires separating job execution rights (roles/bigquery.jobUser) from data access rights (roles/bigquery.dataViewer or    
      dataEditor).                                                                                                                                    
  3. Application Default Credentials (ADC)                                                                                                            
      • Standard Google Cloud Client Libraries automatically search for credentials in a predefined hierarchy.                                        
      • On Cloud Run, ADC automatically retrieves tokens from the attached service account via the internal metadata server (http://169.254.169.254), 
      making hardcoded credentials unnecessary.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Setting up a Service Account&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try out things like this&lt;/strong&gt; Help me set up a service account for my Cloud Run application with minimal permissions to access BigQuery&lt;/p&gt;

&lt;h3&gt;
  
  
  BigQuery Skills
&lt;/h3&gt;

&lt;p&gt;In this step, we’ll explore how to use Agent Skills to interact with Google BigQuery. Instead of manually writing bash scripts, SQL queries, or Python clients, we will rely entirely on our AI agent.&lt;/p&gt;

&lt;h4&gt;
  
  
  Confirming Skill Installation
&lt;/h4&gt;

&lt;p&gt;For this step, we will use the bigquery-basics skill. Confirm it's installed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Prompt-Driven BigQuery Operations
&lt;/h4&gt;

&lt;p&gt;With the bigquery-basics skill, the agent understands how to manage datasets, create tables, insert data, and run analytical queries.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Creating a Dataset&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You prompt:&lt;/strong&gt; Create a new BigQuery dataset called skills_tutorial in my project PROJECT_ID&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent response:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;The BigQuery dataset skills_tutorial has been successfully created in project PROJECT_ID.                                               

  ### Dataset Details:                                                                                                                                

  • Dataset ID: PROJECT_ID:skills_tutorial                                                                                                
  • Location: US                                                                                                                                      
  • Type: DEFAULT                                                                                                                                     
  • Status: Active (Verified)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Creating a Table&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;You prompt:&lt;/strong&gt; Now create a table called web_analytics in that dataset with columns for: event_timestamp (TIMESTAMP), page_url (STRING), user_id (STRING), session_duration_seconds (FLOAT64), country (STRING)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent response:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;The BigQuery table web_analytics has been successfully created in dataset skills_tutorial.                                                          

  ### Table Details:                                                                                                                                  

  • Table ID: PROJECT_ID:skills_tutorial.web_analytics                                                                                    

  ### Schema:                                                                                                                                         

   Column Name │ Type │ Mode
  ─────────────────────────────────────────────────┼─────────────────────────────────────────────────┼────────────────────────────────────────────────
   event_timestamp │ TIMESTAMP │ NULLABLE
   page_url │ STRING │ NULLABLE
   user_id │ STRING │ NULLABLE
   session_duration_seconds │ FLOAT64 │ NULLABLE
   country │ STRING │ NULLABLE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Inserting Sample Data&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You prompt:&lt;/strong&gt; Insert 10 rows of realistic sample web analytics data into the web_analytics table&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent response:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10 realistic sample rows have been inserted into PROJECT_ID:skills_tutorial.web_analytics.                                              

  ### Inserted Data Preview:                                                                                                                          

   event_timestamp │ page_url │ user_id │ session_duration_seconds │ country
  ───────────────────────────┼─────────────────────────────────────┼───────────────────────────┼───────────────────────────┼──────────────────────────
   2026-07-23 10:15:30 UTC │ https://example.com/home │ usr_1001 │ 45.2 │ US
   2026-07-23 10:18:12 UTC │ https://example.com/products/laptop │ usr_1002 │ 120.8 │ CA
   2026-07-23 11:02:45 UTC │ https://example.com/blog/ai-trends │ usr_1003 │ 310.5 │ GB
   2026-07-23 11:45:00 UTC │ https://example.com/cart │ usr_1001 │ 88.0 │ US
   2026-07-23 12:30:15 UTC │ https://example.com/checkout │ usr_1004 │ 215.3 │ DE
   2026-07-23 13:10:05 UTC │ https://example.com/home │ usr_1005 │ 15.6 │ IN
   2026-07-23 14:05:22 UTC │ https://example.com/pricing │ usr_1006 │ 175.4 │ JP
   2026-07-23 14:22:10 UTC │ https://example.com/docs/api │ usr_1007 │ 450.0 │ US
   2026-07-23 15:00:50 UTC │ https://example.com/about │ usr_1008 │ 62.1 │ FR
   2026-07-23 15:40:18 UTC │ https://example.com/contact │ usr_1009 │ 95.7 │ AU
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4. Running Analytical Queries&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You prompt:&lt;/strong&gt; Query the web_analytics table to show me the top 5 countries by average session duration&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent response:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;Here&lt;/span&gt; &lt;span class="k"&gt;are&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;top&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="n"&gt;countries&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="n"&gt;average&lt;/span&gt; &lt;span class="k"&gt;session&lt;/span&gt; &lt;span class="n"&gt;duration&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;web_analytics&lt;/span&gt; &lt;span class="k"&gt;table&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;                                                              

  &lt;span class="o"&gt;###&lt;/span&gt; &lt;span class="n"&gt;Query&lt;/span&gt; &lt;span class="n"&gt;Results&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;                                                                                                                                  

                  &lt;span class="n"&gt;Rank&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="n"&gt;Country&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="n"&gt;Average&lt;/span&gt; &lt;span class="k"&gt;Session&lt;/span&gt; &lt;span class="n"&gt;Duration&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;seconds&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="n"&gt;Total&lt;/span&gt; &lt;span class="n"&gt;Sessions&lt;/span&gt;
  &lt;span class="err"&gt;─────────────────────────────────────┼────────────────────────────────────┼────────────────────────────────────┼────────────────────────────────────&lt;/span&gt;
                    &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="n"&gt;United&lt;/span&gt; &lt;span class="n"&gt;Kingdom&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GB&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;310&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
                    &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="n"&gt;Germany&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;215&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
                    &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="n"&gt;United&lt;/span&gt; &lt;span class="n"&gt;States&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;US&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;194&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
                    &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="n"&gt;Japan&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;JP&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;175&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
                    &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="n"&gt;Canada&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CA&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="err"&gt;──────&lt;/span&gt;                                                                                                                                              
  &lt;span class="o"&gt;###&lt;/span&gt; &lt;span class="n"&gt;Executed&lt;/span&gt; &lt;span class="k"&gt;SQL&lt;/span&gt; &lt;span class="n"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;                                                                                                                             

    &lt;span class="k"&gt;SELECT&lt;/span&gt;                                                                                                                                            
      &lt;span class="n"&gt;country&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                                                                                                                                        
      &lt;span class="n"&gt;ROUND&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;AVG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session_duration_seconds&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;avg_session_duration_seconds&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                                                                        
      &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;total_sessions&lt;/span&gt;                                                                                                                      
    &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="nv"&gt;`PROJECT_ID.skills_tutorial.web_analytics`&lt;/span&gt;                                                                                       
    &lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;country&lt;/span&gt;                                                                                                                                  
    &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;avg_session_duration_seconds&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;                                                                                                        
    &lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;5. Complex Aggregations&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You prompt:&lt;/strong&gt; Show me a query that calculates daily page view counts grouped by URL&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent response:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;Here&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="k"&gt;SQL&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="n"&gt;calculate&lt;/span&gt; &lt;span class="n"&gt;daily&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="k"&gt;view&lt;/span&gt; &lt;span class="n"&gt;counts&lt;/span&gt; &lt;span class="n"&gt;grouped&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="n"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;along&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="k"&gt;unique&lt;/span&gt; &lt;span class="n"&gt;visitor&lt;/span&gt; &lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;                                        

  &lt;span class="o"&gt;###&lt;/span&gt; &lt;span class="k"&gt;SQL&lt;/span&gt; &lt;span class="n"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;                                                                                                                                      

    &lt;span class="k"&gt;SELECT&lt;/span&gt;                                                                                                                                            
      &lt;span class="nb"&gt;DATE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event_timestamp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;event_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                                                                                                            
      &lt;span class="n"&gt;page_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                                                                                                                                       
      &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;page_views&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                                                                                                                         
      &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;DISTINCT&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;unique_visitors&lt;/span&gt;                                                                                                      
    &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="nv"&gt;`PROJECT_ID.skills_tutorial.web_analytics`&lt;/span&gt;                                                                                       
    &lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt;                                                                                                                                          
      &lt;span class="n"&gt;event_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                                                                                                                                     
      &lt;span class="n"&gt;page_url&lt;/span&gt;                                                                                                                                        
    &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt;                                                                                                                                          
      &lt;span class="n"&gt;event_date&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                                                                                                                                
      &lt;span class="n"&gt;page_views&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;                                                                                                                                
    &lt;span class="err"&gt;──────&lt;/span&gt;                                                                                                                                            
  &lt;span class="o"&gt;###&lt;/span&gt; &lt;span class="n"&gt;Execution&lt;/span&gt; &lt;span class="n"&gt;Results&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;                                                                                                                              

   &lt;span class="n"&gt;Event&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="n"&gt;Page&lt;/span&gt; &lt;span class="n"&gt;URL&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="n"&gt;Page&lt;/span&gt; &lt;span class="n"&gt;Views&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="k"&gt;Unique&lt;/span&gt; &lt;span class="n"&gt;Visitors&lt;/span&gt;
  &lt;span class="err"&gt;────────────────────────────────────┼─────────────────────────────────────┼────────────────────────────────────┼────────────────────────────────────&lt;/span&gt;
   &lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
   &lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;products&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;laptop&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
   &lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;blog&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ai&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;trends&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
   &lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cart&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
   &lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;checkout&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
   &lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pricing&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
   &lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
   &lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;about&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
   &lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;contact&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;6. Cleanup&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You prompt:&lt;/strong&gt; Clean up i.e. delete the skills_tutorial dataset&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent response:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;The dataset skills_tutorial (and its contained web_analytics table) has been successfully deleted from project PROJECT_ID.              

  ### Clean-Up Summary:                                                                                                                               

  • Deleted Dataset: PROJECT_ID:skills_tutorial                                                                                           
  • Verification Status: Confirmed deleted (Not found).
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice how you never had to &lt;strong&gt;write SQL&lt;/strong&gt; or &lt;strong&gt;learn&lt;/strong&gt; the bq CLI. The agent did it all.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cloud Run Deployment
&lt;/h3&gt;

&lt;p&gt;In this step, we’ll deploy a Python application to Google Cloud Run, a fully managed compute platform that automatically scales your stateless containers. Instead of writing the code, containerizing it, and deploying it manually, we’ll let the AI agent handle the entire process.&lt;/p&gt;

&lt;h4&gt;
  
  
  Confirming Skill Installation
&lt;/h4&gt;

&lt;p&gt;For this step, we will use the cloud-run-basics skill. Confirm it's installed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Prompt-Driven Application Deployment
&lt;/h4&gt;

&lt;p&gt;With the cloud-run-basics skill, the agent knows how to write application code, create optimized Dockerfiles, and deploy to Cloud Run using best practices.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Generating the Application Code&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You prompt:&lt;/strong&gt; Create a simple Flask web API with three endpoints: GET / (returns service info), GET /health (returns OK), and POST /analyze (accepts JSON with a text field and returns word count and character count)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent response:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;The&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Flask&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Web&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;API&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;has&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;been&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;created&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;app.py&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;verified&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;with&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;tests&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;test_app.py.&lt;/span&gt;&lt;span class="w"&gt;                                                                

  &lt;/span&gt;&lt;span class="err"&gt;###&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;API&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Endpoints&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Summary&lt;/span&gt;&lt;span class="w"&gt;                                                                                                                           

  &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;GET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="w"&gt;                                                                                                                                            
      &lt;/span&gt;&lt;span class="err"&gt;•&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Description:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Returns&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;information&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;endpoints&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;metadata.&lt;/span&gt;&lt;span class="w"&gt;                                                                              
      &lt;/span&gt;&lt;span class="err"&gt;•&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Response:&lt;/span&gt;&lt;span class="w"&gt;                                                                                                                                     
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;                                                                                                                                             
          &lt;/span&gt;&lt;span class="nl"&gt;"service"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Text Analysis Web API"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;                                                                                                         
          &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;                                                                                                                         
          &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"running"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;                                                                                                                        
          &lt;/span&gt;&lt;span class="nl"&gt;"endpoints"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;                                                                                                                          
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;                                                                                                                                             

  &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;GET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/health&lt;/span&gt;&lt;span class="w"&gt;                                                                                                                                      
      &lt;/span&gt;&lt;span class="err"&gt;•&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Description:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Health&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;check&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;endpoint.&lt;/span&gt;&lt;span class="w"&gt;                                                                                                           
      &lt;/span&gt;&lt;span class="err"&gt;•&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Response:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"OK"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(HTTP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt;                                                                                                         
  &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;POST&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/analyze&lt;/span&gt;&lt;span class="w"&gt;                                                                                                                                    
      &lt;/span&gt;&lt;span class="err"&gt;•&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Description:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Accepts&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;JSON&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;body&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;containing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;text&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;field&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;returns&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;word&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;count&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;character&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;count.&lt;/span&gt;&lt;span class="w"&gt;                                   
      &lt;/span&gt;&lt;span class="err"&gt;•&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Sample&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Request:&lt;/span&gt;&lt;span class="w"&gt;                                                                                                                               
        &lt;/span&gt;&lt;span class="err"&gt;curl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;-X&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;POST&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;http://localhost:&lt;/span&gt;&lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="err"&gt;/analyze&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt;                                                                                                  
          &lt;/span&gt;&lt;span class="err"&gt;-H&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt;                                                                                                       
          &lt;/span&gt;&lt;span class="err"&gt;-d&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Hello world from Flask API!"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="w"&gt;                                                                                                

      &lt;/span&gt;&lt;span class="err"&gt;•&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Sample&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Response:&lt;/span&gt;&lt;span class="w"&gt;                                                                                                                              
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;                                                                                                                                             
          &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Hello world from Flask API!"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;                                                                                                      
          &lt;/span&gt;&lt;span class="nl"&gt;"word_count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;                                                                                                                            
          &lt;/span&gt;&lt;span class="nl"&gt;"character_count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="w"&gt;                                                                                                                       
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;                                                                                                                                             


  &lt;/span&gt;&lt;span class="err"&gt;──────&lt;/span&gt;&lt;span class="w"&gt;                                                                                                                                              
  &lt;/span&gt;&lt;span class="err"&gt;###&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;How&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Run&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;locally&lt;/span&gt;&lt;span class="w"&gt;                                                                                                                              

    &lt;/span&gt;&lt;span class="err"&gt;./.venv/bin/python&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;app.py&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Containerizing the App&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You prompt:&lt;/strong&gt; Create a Dockerfile for this Flask application&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent response:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;The Dockerfile, .dockerignore, and requirements.txt have been created.                                                                              

  ### Dockerfile Contents:                                                                                                                            

    # Use official lightweight Python image                                                                                                           
    FROM python:3.11-slim                                                                                                                             

    &lt;span class="c"&gt;# Prevent Python from writing .pyc files and buffer stdout/stderr                                                                                 &lt;/span&gt;
    ENV PYTHONUNBUFFERED=1 \                                                                                                                          
        PYTHONDONTWRITEBYTECODE=1 \                                                                                                                   
        PORT=8080                                                                                                                                     

    &lt;span class="c"&gt;# Set working directory                                                                                                                           &lt;/span&gt;
    WORKDIR /app                                                                                                                                      

    &lt;span class="c"&gt;# Install dependencies                                                                                                                            &lt;/span&gt;
    COPY requirements.txt .                                                                                                                           
    RUN pip install --no-cache-dir -r requirements.txt                                                                                                

    &lt;span class="c"&gt;# Copy application source code                                                                                                                    &lt;/span&gt;
    COPY app.py .                                                                                                                                     

    # Expose port                                                                                                                                     
    EXPOSE 8080                                                                                                                                       

    &lt;span class="c"&gt;# Run the web service using Gunicorn                                                                                                              &lt;/span&gt;
    CMD exec gunicorn --bind 0.0.0.0:$PORT --workers 1 --threads 8 --timeout 0 app:app                                                                
    ──────                                                                                                                                            
  ### Key Highlights:                                                                                                                                 

  • Production WSGI: Configured with gunicorn for high performance and concurrency.                                                                   
  • Cloud Run Compatible: Listens on dynamic $PORT (defaulting to 8080).                                                                              
  • Optimized Build: .dockerignore created to exclude virtual environments, cache files, and unnecessary repository metadata.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Deploying to Cloud Run&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;You prompt:&lt;/strong&gt; Deploy this application to Cloud Run in us-central1 region as a service called skills-tutorial-analyzer&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent response:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;The deployment command for skills-tutorial-analyzer to Cloud Run in us-central1 has been launched in the background. I will wait for it to complete 
  before proceeding.....

The Flask application has been successfully built and deployed to Cloud Run!                                                                        

  ### Deployment Details:                                                                                                                             

  • Service Name: skills-tutorial-analyzer                                                                                                            
  • Region: us-central1                                                                                                                               
  • Project: PROJECT_ID                                                                                                                   
  • Service URL: [https://skills-tutorial-analyzer-&amp;lt;PROJECT-NUMBER&amp;gt;.us-central1.run.app](https://skills-tutorial-analyzer-415458962931.us-central1.run.app)                                                                    
  ──────                                                                                                                                              
  ### Verified Endpoints:                                                                                                                             

  #### 1. Service Information (GET /)                                                                                                                 

    curl https://skills-tutorial-analyzer-&amp;lt;PROJECT-NUMBER&amp;gt;.us-central1.run.app/                                                                           

  Response:                                                                                                                                           

    {                                                                                                                                                 
      "service": "Text Analysis Web API",                                                                                                             
      "version": "1.0.0",                                                                                                                             
      "status": "running",                                                                                                                            
      "endpoints": [...]                                                                                                                              
    }                                                                                                                                                 

  #### 2. Health Check (GET /health)                                                                                                                  

    curl https://skills-tutorial-analyzer-&amp;lt;PROJECT-NUMBER&amp;gt;.us-central1.run.app/health                                                                     

  Response:                                                                                                                                           

    {                                                                                                                                                 
      "status": "OK"                                                                                                                                  
    }                                                                                                                                                 

  #### 3. Text Analysis (POST /analyze)                                                                                                               

    curl -X POST https://skills-tutorial-analyzer-&amp;lt;PROJECT_NUMBER&amp;gt;.us-central1.run.app/analyze \                                                          
      -H "Content-Type: application/json" \                                                                                                           
      -d '{"text": "Hello world from deployed Cloud Run service!"}'                                                                                   

  Response:                                                                                                                                           

    {                                                                                                                                                 
      "text": "Hello world from deployed Cloud Run service!",                                                                                         
      "word_count": 7,                                                                                                                                
      "character_count": 44                                                                                                                           
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4. Testing the Health Endpoint&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You prompt:&lt;/strong&gt; What’s the URL of my deployed service? Test it by hitting the health endpoint&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent response:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;The URL of your deployed Cloud Run service is:                                                                                                      

  🔗 https://skills-tutorial-analyzer-&amp;lt;PROJECT-NUMBER&amp;gt;.us-central1.run.app                                                                                
  ──────                                                                                                                                              
  &lt;span class="c"&gt;### Health Endpoint Test (GET /health)                                                                                                              &lt;/span&gt;

    curl &lt;span class="nt"&gt;-i&lt;/span&gt; https://skills-tutorial-analyzer-&amp;lt;PROJECT-NUMBER&amp;gt;.us-central1.run.app/health                                                                  

  &lt;span class="c"&gt;#### Response:                                                                                                                                      &lt;/span&gt;

    HTTP/2 200                                                                                                                                        
    content-type: application/json                                                                                                                    
    &lt;span class="nb"&gt;date&lt;/span&gt;: Thu, 23 Jul 2026 10:43:31 GMT                                                                                                               
    server: Google Frontend                                                                                                                           

    &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"status"&lt;/span&gt;:&lt;span class="s2"&gt;"OK"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;5. Testing the Analyze Endpoint&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You prompt:&lt;/strong&gt; Send a POST request to the /analyze endpoint with the text ‘Google Cloud Skills make AI agents powerful’&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent response:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Here is the response from sending the POST request to the /analyze endpoint:                                                                        

  &lt;span class="c"&gt;### Request:                                                                                                                                        &lt;/span&gt;

    curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://skills-tutorial-analyzer-&amp;lt;PROJECT-NUMBER&amp;gt;.us-central1.run.app/analyze &lt;span class="se"&gt;\ &lt;/span&gt;                                                         
      &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\ &lt;/span&gt;                                                                                                          
      &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"text": "Google Cloud Skills make AI agents powerful"}'&lt;/span&gt;                                                                                    
    ──────                                                                                                                                            
  &lt;span class="c"&gt;### Response (HTTP 200 OK):                                                                                                                         &lt;/span&gt;

    &lt;span class="o"&gt;{&lt;/span&gt;                                                                                                                                                 
      &lt;span class="s2"&gt;"text"&lt;/span&gt;: &lt;span class="s2"&gt;"Google Cloud Skills make AI agents powerful"&lt;/span&gt;,                                                                                          
      &lt;span class="s2"&gt;"word_count"&lt;/span&gt;: 7,                                                                                                                                
      &lt;span class="s2"&gt;"character_count"&lt;/span&gt;: 43                                                                                                                           
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;6. Cleanup&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You prompt:&lt;/strong&gt; Delete the skills-tutorial-analyzer Cloud Run service to clean up&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent response:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;The deletion command for Cloud Run service skills-tutorial-analyzer has been launched in the background. I will wait for it to complete before      
  proceeding.                                                                                                                                         

....
....

  The Cloud Run service skills-tutorial-analyzer has been successfully deleted from region us-central1 in project PROJECT_ID.             

  ### Clean-Up Verification:                                                                                                                          

  • Service Name: skills-tutorial-analyzer                                                                                                            
  • Region: us-central1                                                                                                                               
  • Status: Deleted (Verified via gcloud run services describe)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent wrote the code, containerized it, deployed it, and tested it — all from natural language.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;To summarize&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;You have seen how to use Google Cloud Agent Skills now. The next part of the series will cover a few advanced skills around Architecture, Security and even writing your own Custom Skill. Stay tuned.&lt;/p&gt;




</description>
      <category>googlecloudplatform</category>
      <category>googleai</category>
      <category>googlecloudskill</category>
      <category>gcpsecurityoperation</category>
    </item>
    <item>
      <title>Google Cloud Skills Tutorial: The Complete Guide to AI-Powered Cloud Operations</title>
      <dc:creator>Romin Irani</dc:creator>
      <pubDate>Thu, 23 Jul 2026 11:11:46 +0000</pubDate>
      <link>https://dev.to/googleai/google-cloud-skills-tutorial-the-complete-guide-to-ai-powered-cloud-operations-13d9</link>
      <guid>https://dev.to/googleai/google-cloud-skills-tutorial-the-complete-guide-to-ai-powered-cloud-operations-13d9</guid>
      <description>&lt;p&gt;Welcome to the definitive guide on Google Cloud Agent Skills. As the landscape of software engineering evolves, AI coding agents are increasingly being given tasks to becoming autonomous and capable of executing complex, multi-step cloud operations.&lt;/p&gt;

&lt;p&gt;The goal of this series is to take a look at the current set of official skills being made available by Google Cloud, right from the basics and applying it to a few use cases like performing security audits, deploy serverless applications, or optimize BigQuery pipelines.&lt;/p&gt;

&lt;p&gt;At the end of this series, you should be able to assess their readiness and be able to leverage a few of these Agents Skills to get the job done accurately and securely.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa9ohfkqgsf7mqc22qoai.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa9ohfkqgsf7mqc22qoai.png" width="800" height="447"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Generated by Gemini Notebook&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;The Series:&lt;br&gt;&lt;br&gt;
-&lt;/em&gt; &lt;strong&gt;&lt;em&gt;Part 1 : What are Google Cloud Skills (this blog)&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
_- Part 2 : Intermediate Skills in Action (BigQuery and Cloud Run)  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Part 3 : Advanced Ops (WAF Security, Architecture, Custom Skills)
&lt;/li&gt;
&lt;li&gt;Part 4 : More Use Cases_&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  What Are Google Cloud Skills?
&lt;/h3&gt;

&lt;p&gt;Agent Skills act as the essential bridge between raw AI capabilities and structured cloud expertise. They are portable instruction sets that teach AI coding agents &lt;strong&gt;exactly&lt;/strong&gt; how to work with specific technologies safely and efficiently.&lt;/p&gt;

&lt;p&gt;Instead of an agent blindly guessing a gcloud command and breaking a production cluster, a skill provides:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Verified Workflows&lt;/strong&gt; : Step-by-step logic approved by experts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Safety Gates&lt;/strong&gt; : Clear distinctions between read-only audits and mutating actions that require your explicit human-in-the-loop approval.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contextual Awareness&lt;/strong&gt; : Instructions on what environmental variables, IAM permissions, and authentication states to check &lt;em&gt;before&lt;/em&gt; beginning a task.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;That is our understanding and expectations. At the end of the day, results will vary, depending on the quality of the Skills. Hence an important area like Cloud Operations , if using with Agent Skills, will have to be evaluated carefully.&lt;/strong&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  The google/skills Repository
&lt;/h4&gt;

&lt;p&gt;The official &lt;a href="https://github.com/google/skills" rel="noopener noreferrer"&gt;google/skills repository&lt;/a&gt; is an open-source collection of these instruction sets. Built on the open standard defined at &lt;a href="https://agentskills.io/" rel="noopener noreferrer"&gt;agentskills.io&lt;/a&gt;, it currently houses (at the time of writing) nearly 70+ skills spanning 8 distinct categories:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F06isut608dtvpxdu0k4f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F06isut608dtvpxdu0k4f.png" width="800" height="678"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  How Skills Work: The Progressive Disclosure Model
&lt;/h3&gt;

&lt;p&gt;If you were to load all 70 odd instructions/details that are present in these skills into an AI agent’s context window simultaneously, the agent would become confused, slow, and expensive to run. To solve this, when it comes to Skills, Agents will use a &lt;strong&gt;progressive disclosure model&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Enough has been written on this topic, so we will not iterate much on that here.&lt;/p&gt;
&lt;h3&gt;
  
  
  Getting Started
&lt;/h3&gt;

&lt;p&gt;This section summarizes the foundational setup required to start using Google Skills. We will explore how to get your agent environment set up with these powerful instruction sets.&lt;/p&gt;
&lt;h4&gt;
  
  
  Prerequisites
&lt;/h4&gt;

&lt;p&gt;Before we install anything, ensure you have the following installed on your machine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Node.js (v18+)&lt;/strong&gt;: Required for running the skills CLI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;npm&lt;/strong&gt; : Comes with Node.js.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Cloud SDK (gcloud CLI)&lt;/strong&gt;: To authenticate and interact with Google Cloud. You should setup gcloud with a specific Google Cloud Project, so that all the experiments that you do with these Agent Skills will be executed across that project.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An AI coding agent&lt;/strong&gt; : E.g., Google Antigravity / Antigravity CLI or any other agent that supports the agentskills.io standard.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Installing Skills
&lt;/h4&gt;

&lt;p&gt;Getting the skills onto your machine is straightforward. Ensure you have Node.js (v18+) and your AI coding agent installed. You could install specific skills that you need via the npx skills add google/skills command. But here are some ways to install the skills.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option A: Install Only What This Tutorial Needs (Recommended)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
For this tutorial, we use 9 specific skills across the steps and use cases. Installing only these keeps your environment focused and is a best practice, you should install what you need, not everything.&lt;/p&gt;

&lt;p&gt;You can use the interactive CLI to install skills:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Core setup skills &lt;/span&gt;
npx skills add google/skills &lt;span class="nt"&gt;--skill&lt;/span&gt; google-cloud-recipe-onboarding
npx skills add google/skills &lt;span class="nt"&gt;--skill&lt;/span&gt; google-cloud-recipe-auth

&lt;span class="c"&gt;# Intermediate skills&lt;/span&gt;
npx skills add google/skills &lt;span class="nt"&gt;--skill&lt;/span&gt; bigquery-basics
npx skills add google/skills &lt;span class="nt"&gt;--skill&lt;/span&gt; cloud-run-basics

&lt;span class="c"&gt;# Advanced skills &lt;/span&gt;
npx skills add google/skills &lt;span class="nt"&gt;--skill&lt;/span&gt; google-cloud-waf-security
npx skills add google/skills &lt;span class="nt"&gt;--skill&lt;/span&gt; google-cloud-solution-architecture

&lt;span class="c"&gt;# Use Case skills&lt;/span&gt;
npx skills add google/skills &lt;span class="nt"&gt;--skill&lt;/span&gt; google-cloud-waf-cost-optimization
npx skills add google/skills &lt;span class="nt"&gt;--skill&lt;/span&gt; google-cloud-solution-build-deploy-agents
npx skills add google/skills &lt;span class="nt"&gt;--skill&lt;/span&gt; gemini-api
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Starting with just these 9 skills is ideal for learning. You can always add more later as you explore.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For example, when I run the first command , I get the following interactive display:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npx skills add google/skills &lt;span class="nt"&gt;--skill&lt;/span&gt; google-cloud-recipe-onboarding
&lt;span class="go"&gt;
███████╗██╗ ██╗██╗██╗ ██╗ ███████╗
██╔════╝██║ ██╔╝██║██║ ██║ ██╔════╝
███████╗█████╔╝ ██║██║ ██║ ███████╗
╚════██║██╔═██╗ ██║██║ ██║ ╚════██║
███████║██║ ██╗██║███████╗███████╗███████║
╚══════╝╚═╝ ╚═╝╚═╝╚══════╝╚══════╝╚══════╝

┌ skills 
│
◇ Source: https://github.com/google/skills.git
│
◇ Repository cloned
│
◇ Found 84 skills
│
● Selected 1 skill: google-cloud-recipe-onboarding
│
◇ 75 agents
◆ Which agents do you want to install to?
│
│ ── Universal (.agents/skills) ── always included ────────────
│ • Amp
│ • Antigravity
│ • Antigravity CLI
│ • Cline
│ • Codex
│ • Cursor
│ • Deep Agents
│ • Gemini CLI
│ • GitHub Copilot
│ • Kimi Code CLI
│ • OpenCode
│ • Warp
│ • Zed
│ …and 4 more
│
│ ── Additional agents ─────────────────────────────
│ Search:  
│ ↑↓ move, space select, enter confirm
│
│ ❯ ○ AiderDesk (.aider-desk/skills)
│ ○ AstrBot (data/skills)
│ ○ Autohand Code CLI (.autohand/skills)
│ ○ Augment (.augment/skills)
│ ○ IBM Bob (.bob/skills)
│ ○ Claude Code (.claude/skills)
│ ○ OpenClaw (skills)
│ ○ CodeArts Agent (.codeartsdoer/skills)
│ ↓ 47 more
│
│ Selected: Amp, Antigravity, Antigravity CLI +10 more
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It then asks you for Global or Project scope. It is advisable to go ahead with the current folder i.e. Project scope. This will create a .agents/skills folder and the skills will be placed in that.&lt;/p&gt;

&lt;p&gt;Finally, you should see an overall report on the installation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;◇ Installation scope
│ Project

│
◇ Installation Summary ─────────────────────────────────────────────────────────────────╮
│ │
│ ~/agy2-projects/google-skills-tutorial/.agents/skills/google-cloud-recipe-onboarding │
│ copy → Amp, Antigravity, Antigravity CLI, Cline, Codex +8 more │
│ │
├────────────────────────────────────────────────────────────────────────────────────────╯
│
◇ Security Risk Assessments ────────────────────────────────────────────────────╮
│ │
│ Gen Socket Snyk │
│ google-cloud-recipe-onboarding Safe 0 alerts Low Risk │
│ │
│ Details: https://skills.sh/google/skills │
│ │
├────────────────────────────────────────────────────────────────────────────────╯
│
◇ Proceed with installation?
│ Yes
│
◇ Installation complete

│
◇ Installed 1 skill ────────────────────────────────────────────────────────────────────────╮
│ │
│ ✓ google-cloud-recipe-onboarding (copied) │
│ → ~/agy2-projects/google-skills-tutorial/.agents/skills/google-cloud-recipe-onboarding │
│ │
├────────────────────────────────────────────────────────────────────────────────────────────╯

│
&lt;/span&gt;&lt;span class="gp"&gt;└ Done! Review skills before use;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;they run with full agent permissions.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here ~/agy2-projects/google-skills-tutorial/ is my folder in which I am running this tutorial. This could be something different on your machine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option B : Install Additional Skills (Later)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
If you want the full catalogue and prefer to explore on your own, use the interactive installer: If you want the full catalogue and prefer to explore on your own, use the interactive installer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add google/skills
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you run this command, an interactive selector will appear in your terminal. Choose the specific skills that you are interested to install and try out.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbj7v3g75or67663xfron.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbj7v3g75or67663xfron.png" width="800" height="575"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option C : Installing a Single Skill Later (npx command based)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
If you discover you need an additional skill later, you can add it individually at any time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add google/skills &lt;span class="nt"&gt;--skill&lt;/span&gt; bigquery-basics
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Manual Installation&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
If you prefer full control, you can clone the repository or manually place skill folders in your environment. Skills can be installed in two locations depending on their intended scope:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Workspace-specific&lt;/strong&gt; : Place the skill folder inside .agents/skills/ at the root of your current project.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Global (User level)&lt;/strong&gt;: Place the skill folder inside ~/.gemini/config/skills/ to make it available across all your projects.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Where Skills get installed&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
When your agent starts up, it looks for skills across several locations. It resolves them using a specific hierarchy. If a skill with the same name exists in multiple places, the one closest to the workspace takes precedence.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frgtyrkjn1ctk82wpji3c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frgtyrkjn1ctk82wpji3c.png" width="506" height="1032"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verification&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
After installation, it is good practice to verify that everything is in order.&lt;/p&gt;

&lt;p&gt;You can list all currently installed and active skills using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see something similar to this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npx skills list
&lt;span class="go"&gt;Project Skills

bigquery-basics ~/agy2-projects/google-skills-tutorial/.agents/skills/bigquery-basics                          
  Agents: Antigravity, Antigravity CLI, Gemini CLI Source: google/skills
cloud-run-basics ~/agy2-projects/google-skills-tutorial/.agents/skills/cloud-run-basics                         
  Agents: Antigravity, Antigravity CLI, Gemini CLI Source: google/skills
gemini-api ~/agy2-projects/google-skills-tutorial/.agents/skills/gemini-api                               
  Agents: Antigravity, Antigravity CLI, Gemini CLI Source: google/skills
google-cloud-recipe-auth ~/agy2-projects/google-skills-tutorial/.agents/skills/google-cloud-recipe-auth                 
  Agents: Antigravity, Antigravity CLI, Gemini CLI Source: google/skills
google-cloud-recipe-onboarding ~/agy2-projects/google-skills-tutorial/.agents/skills/google-cloud-recipe-onboarding           
  Agents: Antigravity, Antigravity CLI, Gemini CLI Source: google/skills
google-cloud-solution-architecture ~/agy2-projects/google-skills-tutorial/.agents/skills/google-cloud-solution-architecture       
  Agents: Antigravity, Antigravity CLI, Gemini CLI Source: google/skills
google-cloud-solution-build-deploy-agents ~/agy2-projects/google-skills-tutorial/.agents/skills/google-cloud-solution-build-deploy-agents
  Agents: Antigravity, Antigravity CLI, Gemini CLI Source: google/skills
google-cloud-waf-cost-optimization ~/agy2-projects/google-skills-tutorial/.agents/skills/google-cloud-waf-cost-optimization       
  Agents: Antigravity, Antigravity CLI, Gemini CLI Source: google/skills
google-cloud-waf-security ~/agy2-projects/google-skills-tutorial/.agents/skills/google-cloud-waf-security                
  Agents: Antigravity, Antigravity CLI, Gemini CLI Source: google/skills
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Alternatively, you can just peek into your directory structure to ensure the SKILL.md files are present:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; .agents/skills/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you are using Antigravity CLI, you can launch Antigravity CLI ( agy ) from the terminal. Give it the /skills command and you should see the skills listed in the workspace.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Workspace skills · Workspace config
  bigquery-basics: Manages datasets, tables, and jobs in BigQuery. Use when you need to interact with BigQuery, run SQL queries, manage BigQuery resour...
  cloud-run-basics: Manages Cloud Run services, jobs, and worker pools. Use when you need to deploy applications responding to HTTP requests (services)...
  gemini-api: Use when the user asks about using Gemini in an enterprise environment or explicitly mentions Vertex AI, Google Cloud, or Agent Platform....
  google-cloud-recipe-auth: Provides expert guidance on authenticating and authorizing to Google Cloud services and APIs, covering human users, service...
  google-cloud-recipe-onboarding: Guides a developer's first steps on Google Cloud, covering account creation, billing setup, project management, and d...
  google-cloud-solution-architecture: Interactively discovers requirements for a specific cloud workload and generates design recommendations and archi...
  google-cloud-solution-build-deploy-agents: Designs, builds, and deploys AI agents or multi-agent systems on Google Cloud. Provides an interactive wor...
  google-cloud-waf-cost-optimization: Generates cost optimization guidance for Google Cloud workloads based on the Google Cloud Well-Architected Framew...
  google-cloud-waf-security: Generates security-focused guidance for Google Cloud workloads based on the design principles and recommendations in the G...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Managing Skills&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The CLI provides simple commands for managing your installed skills over time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Update skills&lt;/strong&gt; : npx skills update&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remove a skill&lt;/strong&gt; : npx skills remove google-cloud-recipe-onboarding&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Find skills&lt;/strong&gt; : npx skills find "cloud run"&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Understanding Skill Anatomy
&lt;/h4&gt;

&lt;p&gt;Once a skill is installed, what does it actually look like? In this step, we break down the structure of a skill following the agentskills.io standard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The SKILL.md File&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The heart of every skill is the SKILL.md file. This isn't just documentation, it is executable instruction code for AI coding agents. When an agent reads this file, it learns exactly how to perform tasks, what commands to run, and what safety checks to enforce.&lt;/p&gt;

&lt;p&gt;Let’s look at the full contents of our sample-skill/SKILL.md and break down what each section does.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cloud-storage-lifecycle-manager&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;category&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Storage&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Use this skill when the user asks to manage, configure, or optimize Google Cloud Storage (GCS) bucket lifecycle policies and data retention rules.&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gt"&gt;&amp;gt; **Tutorial Note:** The frontmatter above is scanned by the agent on startup. The `description` acts as the trigger.&lt;/span&gt;

&lt;span class="gh"&gt;# Cloud Storage Lifecycle Manager&lt;/span&gt;

&lt;span class="gu"&gt;## Overview&lt;/span&gt;
This skill guides the agent in analyzing existing GCS buckets and applying XML or JSON lifecycle policies to transition objects to colder storage classes (Nearline, Coldline, Archive) or delete them to optimize costs.
&lt;span class="gt"&gt;
&amp;gt; **Tutorial Note:** The overview sets the stage for the agent, clarifying its persona and objective.&lt;/span&gt;

&lt;span class="gu"&gt;## Prerequisites&lt;/span&gt;
Before executing any mutating commands, verify:
&lt;span class="p"&gt;1.&lt;/span&gt; User is authenticated (&lt;span class="sb"&gt;`gcloud auth list`&lt;/span&gt;).
&lt;span class="p"&gt;2.&lt;/span&gt; Current project is set to &lt;span class="sb"&gt;`PROJECT_ID`&lt;/span&gt; or the user-specified project.

&lt;span class="gu"&gt;## Workflow&lt;/span&gt;
&lt;span class="p"&gt;1.&lt;/span&gt; &lt;span class="gs"&gt;**Assess:**&lt;/span&gt; List the target bucket's current policies using &lt;span class="sb"&gt;`gcloud storage buckets describe gs://&amp;lt;BUCKET_NAME&amp;gt; --format="json"`&lt;/span&gt;.
&lt;span class="p"&gt;2.&lt;/span&gt; &lt;span class="gs"&gt;**Design:**&lt;/span&gt; Draft a lifecycle policy rule based on the user's requirements (e.g., transition to Coldline after 90 days).
&lt;span class="p"&gt;3.&lt;/span&gt; &lt;span class="gs"&gt;**Confirm:**&lt;/span&gt; Present the proposed policy to the user for approval.
&lt;span class="p"&gt;4.&lt;/span&gt; &lt;span class="gs"&gt;**Apply:**&lt;/span&gt; Apply the policy using &lt;span class="sb"&gt;`gcloud storage buckets update gs://&amp;lt;BUCKET_NAME&amp;gt; --lifecycle-file=&amp;lt;FILE.json&amp;gt;`&lt;/span&gt;.
&lt;span class="gt"&gt;
&amp;gt; **Tutorial Note:** The workflow provides step-by-step instructions. Agents are highly capable of following numbered lists.&lt;/span&gt;

&lt;span class="gu"&gt;## Safety &amp;amp; Confirmation Tiers&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; &lt;span class="gs"&gt;**Tier R (Read-only):**&lt;/span&gt; &lt;span class="sb"&gt;`gcloud storage ls`&lt;/span&gt;, &lt;span class="sb"&gt;`gcloud storage buckets describe`&lt;/span&gt;. You may run these without asking.
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Tier M (Mutating):**&lt;/span&gt; Applying a new lifecycle policy. &lt;span class="gs"&gt;**MUST ASK FOR EXPLICIT CONFIRMATION.**&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Tier D (Destructive):**&lt;/span&gt; Deleting objects or removing buckets. Refuse to do this unless explicitly mandated by the user.
&lt;span class="gt"&gt;
&amp;gt; **Tutorial Note:** Safety tiers ensure the agent doesn't autonomously delete infrastructure.&lt;/span&gt;

&lt;span class="gu"&gt;## Workload Assessment Questions&lt;/span&gt;
If the user's request is vague, ask ONE of these questions at a time to clarify:
&lt;span class="p"&gt;-&lt;/span&gt; "What is the name of the GCS bucket you want to apply the lifecycle rule to?"
&lt;span class="p"&gt;-&lt;/span&gt; "After how many days should the objects transition to a colder storage class?"

&lt;span class="gu"&gt;## Validation&lt;/span&gt;
After applying the rule, verify success by running:
&lt;span class="sb"&gt;`gcloud storage buckets describe gs://&amp;lt;BUCKET_NAME&amp;gt; --format="value(lifecycle)"`&lt;/span&gt;
Ensure the output matches the applied rule.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;YAML Frontmatter&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Every SKILL.md begins with a YAML frontmatter block. This metadata is crucial for the agent's startup phase.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-cloud-skill&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;category&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Serverless&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Use this skill when the user asks to deploy serverless applications.&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;name&lt;/strong&gt; : A unique identifier for the skill (usually matches the folder name).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;metadata.category&lt;/strong&gt; : Groups skills logically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;description&lt;/strong&gt; : This is the &lt;strong&gt;activation trigger&lt;/strong&gt;. The agent uses semantic matching against this description to decide when to activate the skill based on the user's prompt.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Markdown Body Sections&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The markdown body dictates the agent’s behavior. While highly flexible, Google Cloud skills typically follow a common pattern:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Overview / Quick Start&lt;/strong&gt; : A brief explanation of the skill’s purpose.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prerequisites&lt;/strong&gt; : Tools or API access required before execution.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workflow / Decision Trees&lt;/strong&gt; : Step-by-step instructions the agent must follow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Safety &amp;amp; Confirmation Tiers&lt;/strong&gt; : Guidelines on what needs user approval:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tier R (Read-only)&lt;/strong&gt;: Agent can run these without asking (e.g., gcloud compute instances list).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tier M (Mutating)&lt;/strong&gt;: Agent must ask before applying changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tier D (Destructive)&lt;/strong&gt;: Highly restrictive actions requiring extra confirmation (e.g., deleting buckets).&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Workload Assessment Questions&lt;/strong&gt; : Clarifying questions the agent should ask the user before beginning.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Validation Checklists&lt;/strong&gt; : Steps to verify the task succeeded.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Optional Supporting Files&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A skill folder isn’t limited to just SKILL.md. It can contain supporting directories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;references/: Detailed documentation, IaC patterns (Terraform), IAM policies, or MCP integration configs that the agent can read for deep context.&lt;/li&gt;
&lt;li&gt;scripts/: Executable Bash/Python scripts for setup automation or verification.&lt;/li&gt;
&lt;li&gt;assets/: Templates for outputs, configuration files, or architecture diagrams.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Skill Structure and Processing&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The diagram below is a good way to visualize how the Agent at startup scans the Skills YAML frontmatter and then handles the loading of the skill accordingly.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4m5bvpyu9fev8aoz65ug.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4m5bvpyu9fev8aoz65ug.png" width="799" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Skill Categories Table&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Google Cloud skills are broadly organized into 8 distinct categories, at the time of writing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgv0s41w3uv8zs3zir88e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgv0s41w3uv8zs3zir88e.png" width="800" height="646"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Your First Interaction
&lt;/h4&gt;

&lt;p&gt;Now that you have skills installed and understand their anatomy, it’s time to see them in action.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How Skill Activation Works&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AI coding agents use a &lt;strong&gt;progressive disclosure model&lt;/strong&gt; to manage skills efficiently:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Startup&lt;/strong&gt; : The agent rapidly scans only the YAML frontmatter of all installed skills. It builds an internal registry of description triggers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompting&lt;/strong&gt; : When you type a prompt, the agent evaluates it against the registry.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Activation&lt;/strong&gt; : If a match is found, it loads the full SKILL.md into its context window and executes the defined workflow.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This prevents the agent’s context window from being overwhelmed with instructions for tools it doesn’t need for the current task.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1o9hvlfkp5wtzqe5sl8n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1o9hvlfkp5wtzqe5sl8n.png" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Walkthrough: The Onboarding Skill&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let’s trace what happens when you trigger the google-cloud-recipe-onboarding skill.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;User&lt;/strong&gt; : “Help me get started with Google Cloud in my new project.”&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Agent Matches Prompt&lt;/strong&gt; : The agent determines this matches the onboarding skill.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent Reads SKILL.md&lt;/strong&gt; : It loads the instructions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent Asks Questions&lt;/strong&gt; : Following the “Single-question policy” often defined in skills, it asks: &lt;em&gt;“What is your target Google Cloud Project ID?”&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User Answers&lt;/strong&gt; : “Use MY_PROJECT_ID."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent Audits&lt;/strong&gt; : The agent runs Tier R (read-only) commands like gcloud config list to check current authentication and project setup.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent Presents Confirmation Table&lt;/strong&gt; : Before enabling billing or APIs, it presents a structured markdown table detailing what it plans to do.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent Waits&lt;/strong&gt; : It halts execution and waits for your explicit “Yes” before proceeding with mutating actions.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Key Concepts&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Safety Gates&lt;/strong&gt; : Points in the workflow where the agent is explicitly instructed to stop and ask for permission.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consent Tables&lt;/strong&gt; : A structured format agents use to explain &lt;em&gt;What&lt;/em&gt; they will do, &lt;em&gt;Command&lt;/em&gt; they will run, and the &lt;em&gt;Impact&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Single-Question Policy&lt;/strong&gt; : Best practice for skills dictating that agents should only ask the user one clarifying question at a time to prevent cognitive overload.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Example Prompts to Try
&lt;/h4&gt;

&lt;p&gt;Ensure that you have launched your favourite Agent (Antigravity, Antigravity CLI or any other) from the folder in which the .agents/skills folder is present.&lt;/p&gt;

&lt;p&gt;I suggest that you don’t run these prompts at the moment and just observe the kind of natural language prompts that you can use to work with Google Cloud Platform via these Google Agent Skills.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Category: Foundations&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Trigger&lt;/strong&gt;  &lt;strong&gt;google-cloud-recipe-onboarding&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Prompt: “I want to set up my first Google Cloud project from scratch.”&lt;/p&gt;

&lt;p&gt;Explanation: The agent will guide you through project creation, billing linking, and initial IAM setup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Trigger&lt;/strong&gt;  &lt;strong&gt;google-cloud-recipe-auth&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Prompt: “How do I authenticate my local environment to Google Cloud?”&lt;/p&gt;

&lt;p&gt;Explanation: The agent will walk you through gcloud auth login and Application Default Credentials (ADC).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Category: Serverless&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Trigger&lt;/strong&gt;  &lt;strong&gt;cloud-run-basics&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Prompt: “I have a Dockerfile here. Can you help me deploy a containerized app to Google Cloud?”&lt;/p&gt;

&lt;p&gt;Explanation: The agent will ask for the service name and region, build the image, and run gcloud run deploy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Trigger&lt;/strong&gt;  &lt;strong&gt;functions-basics&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Prompt: “Help me deploy a Node.js function that triggers on Pub/Sub messages.”&lt;/p&gt;

&lt;p&gt;Explanation: The agent will scaffold the function code and construct the deployment command with the correct trigger flags.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Category: Storage&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Trigger&lt;/strong&gt; &lt;strong&gt;cloud-storage-lifecycle-manager (Our custom skill!)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Prompt: “I need to automatically move objects in my GCS bucket to Archive storage after 1 year.”&lt;/p&gt;

&lt;p&gt;Explanation: The agent will generate a JSON lifecycle policy and apply it after your confirmation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Category: Databases&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Trigger&lt;/strong&gt;  &lt;strong&gt;cloud-sql-basics&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Prompt: “Spin up a PostgreSQL database on Cloud SQL and show me how to connect.”&lt;/p&gt;

&lt;p&gt;Explanation: The agent will draft a gcloud sql instances create command and explain Cloud SQL Auth Proxy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. Trigger&lt;/strong&gt;  &lt;strong&gt;firestore-basics&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Prompt: “Initialize a Firestore database in native mode for my web app.”&lt;/p&gt;

&lt;p&gt;Explanation: The agent will set up the database and perhaps show you how to write basic security rules.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Category: Big Data &amp;amp; Analytics&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8. Trigger&lt;/strong&gt;  &lt;strong&gt;bigquery-basics&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Prompt: “Load this local CSV file into a new BigQuery table.”&lt;/p&gt;

&lt;p&gt;Explanation: The agent will use the bq load command and verify the schema.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Category: Networking&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;9. Trigger&lt;/strong&gt;  &lt;strong&gt;vpc-networking&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Prompt: “Create a custom VPC network with two subnets in us-central1 and us-east1.”&lt;/p&gt;

&lt;p&gt;Explanation: The agent will map out the subnets, verify IP ranges, and execute the creation commands.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Category: Well Architected Framework&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;10. Trigger&lt;/strong&gt;  &lt;strong&gt;waf-security&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Prompt: “Can you audit my current Google Cloud architecture to see if it is secure?”&lt;/p&gt;

&lt;p&gt;Explanation: The agent will adopt an auditor persona, ask clarifying questions about your workloads, and check for public buckets, overly permissive IAM, etc.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Series goes on
&lt;/h3&gt;

&lt;p&gt;Stay tuned, as in Part 2, we will cover a couple of Skills in Action (BigQuery and Cloud Run).&lt;/p&gt;




</description>
      <category>googleai</category>
      <category>gcpsecurityoperation</category>
      <category>googleskills</category>
      <category>googlecloudplatform</category>
    </item>
    <item>
      <title>Gemini 3.6 Flash &amp; 3.5 Flash-Lite: Developer guide</title>
      <dc:creator>Patrick Loeber</dc:creator>
      <pubDate>Thu, 23 Jul 2026 09:25:08 +0000</pubDate>
      <link>https://dev.to/googleai/gemini-36-flash-35-flash-lite-developer-guide-268i</link>
      <guid>https://dev.to/googleai/gemini-36-flash-35-flash-lite-developer-guide-268i</guid>
      <description>&lt;p&gt;Gemini 3.6 Flash (&lt;code&gt;gemini-3.6-flash&lt;/code&gt;) and Gemini 3.5 Flash-Lite (&lt;code&gt;gemini-3.5-flash-lite&lt;/code&gt;) are generally available (GA) and ready for production use.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemini 3.6 Flash&lt;/strong&gt;: Stronger performance on complex agentic and multimodal tasks while reducing token usage, at a lower price point than 3.5 Flash.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini 3.5 Flash-Lite&lt;/strong&gt;: The fastest, lowest-cost model in the 3.5 family. Outperforms prior Flash-Lite generations for high-throughput execution.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This guide explains what's new in each model, what API changes affect your code, and how to migrate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt;: You can automate this migration with a coding agent that supports &lt;a href="https://ai.google.dev/gemini-api/docs/coding-agents#gemini-interactions-api" rel="noopener noreferrer"&gt;skills&lt;/a&gt; (like Antigravity). Run &lt;code&gt;/gemini-interactions-api migrate my app to Gemini 3.6 Flash&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  New models
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Model ID&lt;/th&gt;
&lt;th&gt;Default thinking level&lt;/th&gt;
&lt;th&gt;Pricing&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Gemini 3.6 Flash&lt;/td&gt;
&lt;td&gt;&lt;code&gt;gemini-3.6-flash&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;medium&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$1.50/1M input tokens and $7.50/1M output tokens&lt;/td&gt;
&lt;td&gt;Balances speed with intelligence for agentic and multimodal tasks.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini 3.5 Flash-Lite&lt;/td&gt;
&lt;td&gt;&lt;code&gt;gemini-3.5-flash-lite&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;minimal&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$0.30/1M input tokens and $2.50/1M output tokens&lt;/td&gt;
&lt;td&gt;The fastest, lowest-cost 3.5 model for high-throughput execution.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Both models support the 1M token context window, 64k max output tokens, thinking, and the full suite of built-in tools including &lt;a href="https://ai.google.dev/gemini-api/docs/computer-use" rel="noopener noreferrer"&gt;Computer Use&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For complete specs, see the model pages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://ai.google.dev/gemini-api/docs/models/gemini-3.6-flash" rel="noopener noreferrer"&gt;Gemini 3.6 Flash model page&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ai.google.dev/gemini-api/docs/models/gemini-3.5-flash-lite" rel="noopener noreferrer"&gt;Gemini 3.5 Flash-Lite model page&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For detailed pricing, see the &lt;a href="https://ai.google.dev/gemini-api/docs/pricing" rel="noopener noreferrer"&gt;pricing page&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quickstart
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;google&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;interaction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;interactions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemini-3.6-flash&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Write a three.js script that renders an interactive 3D robot.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;interaction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;output_text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What's new in Gemini 3.6 Flash
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Token and turn reduction:&lt;/strong&gt; Completes multi-step workflows with fewer reasoning steps, conversational turns, and tool calls than Gemini 3.5. It also reduces execution loop spiraling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Improved code generation:&lt;/strong&gt; Produces higher quality production-ready code with fewer unwanted edits and fewer debugging loops.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better instruction following&lt;/strong&gt;: Reduces unwanted file changes during diagnostic tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strong multimodal and spatial reasoning:&lt;/strong&gt; Improved performance on chart interpretation, visual blueprint conversion, and multi-element web layout generation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Upfront programmatic inspection:&lt;/strong&gt; Prefers running diagnostic code scripts before making changes more frequently than Gemini 3.5 Flash. This improves accuracy on complex tasks, but can add extra exploratory steps on simple frontend work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Computer Use support:&lt;/strong&gt; Supported as native tool for agentic UI automation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UI styling preference&lt;/strong&gt;: Better at creating functional code, though human evaluators preferred earlier models for visual layout and styling. You can mitigate this by providing explicit design guidelines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Default thinking effort (medium):&lt;/strong&gt; Uses the same &lt;code&gt;medium&lt;/code&gt; default thinking level as Gemini 3.5 Flash.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reduced pricing&lt;/strong&gt;: Lower output token costs ($7.50/1M vs. $9.00/1M for 3.5 Flash). Input tokens remain at $1.50/1M.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's new in Gemini 3.5 Flash-Lite
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reduced task execution latency:&lt;/strong&gt; Highest throughput in the 3.5 family for high-volume data parsing and document extraction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enhanced reasoning and multimodal performance:&lt;/strong&gt; Strong migration path from Gemini 2.5 Flash, with higher scores on reasoning tasks like HLE (18.0% vs. 11.0%) and multimodal benchmarks like CharXIV (74.5% vs. 63.7%).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subagent orchestration and tool reliability:&lt;/strong&gt; Improves tool execution reliability for code execution, search, and MCP workflows. Increase the thinking level for autonomous planning and complex subagent tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Improved document understanding:&lt;/strong&gt; Improves accuracy on document parsing and structured data extraction. Experiment with both minimal and high thinking levels depending on document complexity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interactive web coding and tabular data processing:&lt;/strong&gt; Performs strongly on frontend JavaScript and tabular data processing by planning via lightweight code execution.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chatbot and persona persistence:&lt;/strong&gt; Stronger multi-turn instruction following and persona consistency over Gemini 3.1 Flash-Lite.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Computer Use support:&lt;/strong&gt; Supported as native tool for agentic UI automation.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Choosing the right Flash or Flash-Lite model
&lt;/h2&gt;

&lt;p&gt;Use this table to select the right model and migration path for your workloads.&lt;/p&gt;

&lt;p&gt;Both models require removing deprecated sampling parameters (&lt;code&gt;temperature&lt;/code&gt;, &lt;code&gt;top_p&lt;/code&gt;, &lt;code&gt;top_k&lt;/code&gt;) and prefilled model turns. See API changes for details.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Primary use cases&lt;/th&gt;
&lt;th&gt;Recommended migration target&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Gemini 3.6 Flash&lt;/strong&gt;&lt;br&gt;&lt;code&gt;gemini-3.6-flash&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Code generation, spatial/multimodal reasoning, multi-step agentic workflows&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Gemini 3.5 Flash&lt;/strong&gt;, &lt;strong&gt;Gemini 3 Flash (Preview)&lt;/strong&gt;, or &lt;strong&gt;Gemini 3.1 Pro&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Gemini 3.5 Flash-Lite&lt;/strong&gt;&lt;br&gt;&lt;code&gt;gemini-3.5-flash-lite&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Autonomous subagent execution, high-volume data analysis and document extraction, structured JSON parsing&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Gemini 3.1 Flash-Lite&lt;/strong&gt; or &lt;strong&gt;Gemini 2.5 Flash&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Updated Antigravity agent
&lt;/h2&gt;

&lt;p&gt;Due to its improved performance, Gemini 3.6 Flash is now the new default model powering the &lt;a href="https://ai.google.dev/gemini-api/docs/antigravity-agent" rel="noopener noreferrer"&gt;Antigravity agent&lt;/a&gt; in Gemini Managed Agents. This can be changed by setting a new field on the API.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;google&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;interaction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;interactions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;antigravity-preview-05-2026&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Read Hacker News, summarize the top 10 stories, and save the results as a PDF.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;remote&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;interaction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;output_text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  API changes and parameter updates
&lt;/h2&gt;

&lt;p&gt;Starting with Gemini 3.6 Flash and Gemini 3.5 Flash-Lite, the following API changes apply to these models and all future Gemini model releases.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sampling parameter deprecation&lt;/strong&gt;: &lt;code&gt;temperature&lt;/code&gt;, &lt;code&gt;top_p&lt;/code&gt;, and &lt;code&gt;top_k&lt;/code&gt; are deprecated. The API ignores these parameters and returns an error in future model generations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prefilled model turn validation&lt;/strong&gt;: Prefilling model turns is no longer supported. If the last non-empty turn in the request is a &lt;code&gt;model&lt;/code&gt; turn, the API returns a &lt;code&gt;400&lt;/code&gt; error.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Below are detailed explanations and code samples for each API change.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Sampling parameter deprecation (&lt;code&gt;temperature&lt;/code&gt;, &lt;code&gt;top_p&lt;/code&gt;, &lt;code&gt;top_k&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;temperature&lt;/code&gt;, &lt;code&gt;top_p&lt;/code&gt;, and &lt;code&gt;top_k&lt;/code&gt; are deprecated and ignored. In future model generations, supplying these parameters returns an HTTP 400 error. &lt;strong&gt;Remove these parameters from all requests.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# ⚠️ Remove these parameters (deprecated)
&lt;/span&gt;&lt;span class="n"&gt;generation_config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;temperature&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;top_p&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;top_k&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To improve determinism, define a system instruction with explicit rules for your&lt;br&gt;
specific use case.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Prefilled model turn validation {:#prefilled-model-turn-validation}
&lt;/h3&gt;

&lt;p&gt;API requests ending with a non-empty model role turn are disallowed and return an &lt;strong&gt;HTTP 400 Error&lt;/strong&gt;.&lt;/p&gt;
&lt;h4&gt;
  
  
  ⚠️ Avoid
&lt;/h4&gt;

&lt;p&gt;In legacy &lt;code&gt;generateContent&lt;/code&gt; or raw REST payloads, ending with a model role turn&lt;br&gt;
is now disallowed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;/*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;❌&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;DO&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;NOT:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;End&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;payload&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;contents&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;with&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'model'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;role&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;turn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;*/&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"contents"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"parts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Translate 'Hello world' to Spanish."&lt;/span&gt;&lt;span class="p"&gt;}]},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"parts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Translation:"&lt;/span&gt;&lt;span class="p"&gt;}]}&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;/*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;❌&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Returns&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;error&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;*/&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  ✅ Recommended Migration (Interactions API)
&lt;/h4&gt;

&lt;p&gt;In the Interactions API, model turns are not manually prefilled. If your application previously prefilled a model turn to suppress preambles or force JSON formatting, use system_instruction or &lt;a href="https://ai.google.dev/gemini-api/docs/structured-output" rel="noopener noreferrer"&gt;Structured outputs&lt;/a&gt; instead.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# ✅ RECOMMENDED: Use system_instruction in the Interactions API to specify output format
&lt;/span&gt;&lt;span class="n"&gt;interaction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;interactions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemini-3.6-flash&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Translate &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Hello world&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; to Spanish.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;system_instruction&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Output only the translation without introductory text.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Migration checklist
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt;: You can automate this migration with a coding agent that supports &lt;a href="https://ai.google.dev/gemini-api/docs/coding-agents#gemini-interactions-api" rel="noopener noreferrer"&gt;skills&lt;/a&gt; (like Antigravity). Run &lt;code&gt;/gemini-interactions-api migrate my app to Gemini 3.6 Flash&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Migrate to gemini-3.6-flash
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Update Model ID:&lt;/strong&gt; Change your target model string to &lt;code&gt;gemini-3.6-flash&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remove deprecated sampling parameters:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Strip &lt;code&gt;temperature&lt;/code&gt;, &lt;code&gt;top_p&lt;/code&gt;, and &lt;code&gt;top_k&lt;/code&gt; from generation configs.
&lt;/li&gt;
&lt;li&gt;Replace &lt;code&gt;thinking_budget&lt;/code&gt; with the string enum &lt;code&gt;thinking_level&lt;/code&gt; set to &lt;code&gt;"medium"&lt;/code&gt; or &lt;code&gt;"high"&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Remove &lt;code&gt;candidate_count&lt;/code&gt; (unsupported in Gemini 3.x).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enforce turn validation rules:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Standardize multi-turn conversations on server-side &lt;code&gt;previous_interaction_id&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Remove prefilled model turns.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit function calling:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Place multimodal assets inside the response payload.&lt;/li&gt;
&lt;li&gt;Format inline instructions using &lt;code&gt;\n\n&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If you see &lt;code&gt;Malformed_Function_Call&lt;/code&gt; errors tied to pre-tool text, see &lt;a href="https://ai.google.dev/gemini-api/docs/function-calling#workarounds-for-pre-tool-text-requirements" rel="noopener noreferrer"&gt;Workarounds for pre-tool text requirements&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Only if using generateContent API: Ensure all &lt;code&gt;FunctionResponse&lt;/code&gt; objects include &lt;code&gt;call_id&lt;/code&gt; and &lt;code&gt;name&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Baseline Gemini 3.x requirements:&lt;/strong&gt; For SDK updates and thought signature preservation, see the &lt;a href="https://ai.google.dev/gemini-api/docs/whats-new-gemini-3.5#migration" rel="noopener noreferrer"&gt;Gemini 3.5 Migration Checklist&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Migrate to gemini-3.5-flash-lite
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Update Model ID:&lt;/strong&gt; Change your target model string to &lt;code&gt;gemini-3.5-flash-lite&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configure thinking effort level:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;For high-volume extraction, routing, or classification: leave &lt;code&gt;thinking_level&lt;/code&gt; at &lt;code&gt;"minimal"&lt;/code&gt; (default) for maximum throughput.&lt;/li&gt;
&lt;li&gt;For autonomous subagents with tool calls, code execution, or multi-step reasoning: set &lt;code&gt;thinking_level&lt;/code&gt; to &lt;code&gt;"medium"&lt;/code&gt; or &lt;code&gt;"high"&lt;/code&gt; to prevent premature tool termination.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remove deprecated parameters and validate function calling:&lt;/strong&gt; Apply the same rules as for 3.6 Flash above.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Baseline Gemini 3.x requirements:&lt;/strong&gt; Refer to the &lt;a href="https://ai.google.dev/gemini-api/docs/whats-new-gemini-3.5#migration" rel="noopener noreferrer"&gt;Gemini 3.5 Migration Checklist&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Next steps
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Review API specs on the &lt;a href="https://ai.google.dev/gemini-api/docs/models" rel="noopener noreferrer"&gt;Models Overview&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Explore multi-agent orchestration in the &lt;a href="https://ai.google.dev/gemini-api/docs/interactions" rel="noopener noreferrer"&gt;Interactions API Guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Test and refine prompts in &lt;a href="https://aistudio.google.com/" rel="noopener noreferrer"&gt;Google AI Studio&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Read the &lt;a href="https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-3-6-flash-3-5-flash-lite-3-5-flash-cyber/" rel="noopener noreferrer"&gt;blog post&lt;/a&gt;, including info on the new Gemini 3.5 Flash Cyber model&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>api</category>
      <category>gemini</category>
      <category>llm</category>
    </item>
    <item>
      <title>Why AI Apps Fail in Production (And How Google Solved It)</title>
      <dc:creator>Stephanie Wong</dc:creator>
      <pubDate>Wed, 22 Jul 2026 17:36:07 +0000</pubDate>
      <link>https://dev.to/googleai/why-ai-apps-fail-in-production-and-how-google-solved-it-5a3m</link>
      <guid>https://dev.to/googleai/why-ai-apps-fail-in-production-and-how-google-solved-it-5a3m</guid>
      <description>&lt;p&gt;We are living in the golden age of the weekend AI side project. Thanks to vibe coding and LLMs, you can take a wild idea from a blank screen to a working app over a cup of coffee.&lt;/p&gt;

&lt;p&gt;But the second you try to bring that casual prototype into a big enterprise environment, you hit a brick wall. Rigid infrastructure, strict compliance rules, and a leadership team terrified of breaking things will kill your momentum.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://mlq.ai/media/quarterly_decks/v0.1_State_of_AI_in_Business_2025_Report.pdf" rel="noopener noreferrer"&gt;numbers&lt;/a&gt; are pretty brutal: Only 5% of AI prototypes ever make it to production. The other 95% vanish into corporate purgatory.&lt;/p&gt;

&lt;p&gt;Watching people on social media ship lightning-fast AI features while you're stuck in endless corporate review loops can be maddening. To figure out how to bridge that gap, I looked into the engineering trenches at &lt;strong&gt;YouTube&lt;/strong&gt; to see how they handle this exact speed-vs-risk paradox.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Speed-vs-Risk Paradox
&lt;/h2&gt;

&lt;p&gt;When you're building solo, failure is cheap. If your AI agent acts up, you just tweak the prompt and hit restart.&lt;/p&gt;

&lt;p&gt;But inside a company, letting unconstrained AI agents run loose creates a massive blast radius. On our premiere episode of Emergent, AI engineering leader &lt;a href="https://addyosmani.com/" rel="noopener noreferrer"&gt;Addy Osmani&lt;/a&gt; talked about running ten parallel agents on a personal project. Because the changes weren't properly isolated, technical debt piled up instantly and catastrophically broke two of his apps.&lt;/p&gt;

&lt;p&gt;Now imagine that risk at YouTube’s scale, where you're handling billions of users on a 20-year-old codebase. You can't just let experimental code run wild. But traditional compliance pipelines take months, and by the time your demo actually gets approved, the AI models have already evolved, leaving your feature obsolete.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffllwtkcytcqrivts4kxu.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffllwtkcytcqrivts4kxu.jpeg" alt=" " width="799" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Enter YouTube’s AI Prototyping Stack
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/in/benji-bear-25972313a/" rel="noopener noreferrer"&gt;Benji Bear&lt;/a&gt;, Google Deepmind and former YouTube engineer, solved this problem by changing the infrastructure philosophy entirely. Instead of trying to speed up manual reviews, his team decoupled experimentation from mainline production servers.&lt;/p&gt;

&lt;p&gt;They built a Prototyping Stack that tackles the two biggest bottlenecks for developers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A Safe, Live Data Layer&lt;/strong&gt;: Instead of testing in a vacuum with fake data, developers bootstrap ideas using &lt;a href="https://aistudio.google.com/" rel="noopener noreferrer"&gt;Google AI Studio&lt;/a&gt; templates. These hook into a secure &lt;a href="https://cloud.google.com/" rel="noopener noreferrer"&gt;Google Cloud&lt;/a&gt; proxy server that grants pre-authenticated, read-only API access to live components - like playlists, videos, and channels. You get technical accuracy without any risk of polluting or crashing core databases.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fit82n26gh3c8iw6to6re.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fit82n26gh3c8iw6to6re.jpeg" alt=" " width="799" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live UI Injection&lt;/strong&gt;: To see how features actually feel to a real user, developers use client-side extension wrappers to inject experimental UI directly into their local browser. It's completely isolated from production code, meaning updates can be safely staged and tested in minutes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By shifting to this setup, YouTube went from taking quarters to vet a single feature to launching several successful prototypes (like YouTube Recap) straight to user research studies in a matter of weeks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Embrace Throw-Away Code
&lt;/h2&gt;

&lt;p&gt;Making this work requires a pretty massive psychological shift: You have to embrace throw-away code.&lt;/p&gt;

&lt;p&gt;As engineers, we are trained to write pristine, permanent infrastructure. But prototype code should be messy. Its only goal is to validate whether users actually care about the feature. Trying to clean up and force a chaotic, AI-generated script directly into an enterprise codebase is an architectural trap.&lt;/p&gt;

&lt;p&gt;Instead, you can use Google AI Studio to establish a highly accurate baseline on day one. Run your user tests, look at the data, and if the idea wins, discard the messy script. Because you already proved the baseline parameters work, rewriting a clean version for production becomes significantly faster, cheaper, and safer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6qx13vyen6y1yimai8ml.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6qx13vyen6y1yimai8ml.jpeg" alt=" " width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Moving Fast Without Breaking Things
&lt;/h2&gt;

&lt;p&gt;A 95% failure rate shouldn't be viewed as a mistake—it should be the strategy. AI has made generating code incredibly cheap, shifting our roles from syntax gatekeepers to System Architects.&lt;/p&gt;

&lt;p&gt;Our job now is to design the read-only sandboxes and isolated pipelines that let our teams fail safely at hyper-speed. The biggest risk isn't breaking a server with messy AI code; it's missing the technological wave because your validation loops are too slow.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;To see the full technical breakdown, developer interviews, and a deep dive into the AI Prototyping Stack, check out our premiere episode of &lt;a href="//goo.gle/emergent"&gt;Emergent&lt;/a&gt; on YouTube.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>vibecoding</category>
      <category>devops</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
