<?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>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>
    <item>
      <title>Google Cloud Labs: Accelerate AI with Cloud Run</title>
      <dc:creator>Shir Meir Lador</dc:creator>
      <pubDate>Tue, 21 Jul 2026 13:00:00 +0000</pubDate>
      <link>https://dev.to/googleai/google-cloud-labs-accelerate-ai-with-cloud-run-md3</link>
      <guid>https://dev.to/googleai/google-cloud-labs-accelerate-ai-with-cloud-run-md3</guid>
      <description>&lt;h2&gt;
  
  
  Moving Beyond the Prototype
&lt;/h2&gt;

&lt;p&gt;The AI landscape has shifted. While "vibe coding" with tools like Antigravity and AI Studio lets you build and deploy complex agents in minutes, the real work begins on "Day 2". Moving from a magical prototype to a hardened, production-grade application requires professional AI engineering. We're excited to bring back the &lt;strong&gt;Accelerate AI with Cloud Run roadshow&lt;/strong&gt; for 2026. This year, we've updated our curriculum to focus on the full AI agent lifecycle, giving you the keys to productionizing and scaling agentic workloads on Google Cloud's serverless platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Coffee Shop Journey: A Hands-On Experience
&lt;/h2&gt;

&lt;p&gt;Experience the ease of building advanced AI agents on Cloud Run through 'The Coffee Shop Journey'. This interactive session is designed to guide you through the full lifecycle of an AI agent, moving beyond prototyping to focus on real business use cases. You will solve real-world business problems as you evolve from launching a simple cafe to building complex, intelligent assistants.&lt;/p&gt;

&lt;p&gt;Our curriculum covers the core pillars of modern AI development:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Basics:&lt;/strong&gt; Gain familiarity with Cloud Run by deploying a simple web app (a Coffee Shop launch scenario) to understand the platform fundamentals.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build a Coffee Recommendation Agent:&lt;/strong&gt; Create a personalized AI assistant using Google's Agent Development Kit (ADK) and Retrieval-Augmented Generation (RAG).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optimize Coffee Stand Locations:&lt;/strong&gt; Use Gemma 4 and the BigQuery MCP server to identify the most profitable locations for new coffee stands by analyzing popular bike routes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Personal Productivity Assistant for Store Managers:&lt;/strong&gt; Create a personal productivity assistant using Cloud Run to help a coffee shop manager with daily operational tasks and scheduling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Master Advanced Features with Antigravity 2.0:&lt;/strong&gt; Learn how to use skills, context, rules, and hooks with Antigravity 2.0 to build new features for your Cloud Run applications.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Production-Grade AI on Cloud Run
&lt;/h2&gt;

&lt;p&gt;Get first-hand experience with the platform innovations that make Cloud Run the ideal home for production-grade agentic workloads. Through hands-on exercises, you will learn to build, scale, and orchestrate &lt;strong&gt;long-running agents&lt;/strong&gt; using Google's ADK and Antigravity 2.0. Additionally, you will utilize BigQuery MCP for automated, &lt;strong&gt;data-driven expansion strategies,&lt;/strong&gt; and experience low-latency inference for frontier models using &lt;strong&gt;Cloud Run's GPU offerings&lt;/strong&gt; without the traditional overhead of cluster management.&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%2Fi626y1vwpd7mkpgzicu9.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%2Fi626y1vwpd7mkpgzicu9.png" width="800" height="876"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Ready to Build for Scale? Join us in North America
&lt;/h2&gt;

&lt;p&gt;Don't just witness the AI revolution - build it. Find the workshop in your city and secure your spot today! Let's transform your AI journey from a simple prototype into a powerful, production reality.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;City&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Date&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Registration Link&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Atlanta, GA (as a part of Atlanta Tech week)&lt;/td&gt;
&lt;td&gt;August 12-13&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://www.renderatl.com/tickets" rel="noopener noreferrer"&gt;https://www.renderatl.com/tickets&lt;/a&gt;&lt;br&gt;Event tickets grant access to the workshops on a first-come, first-served basis.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sunnyvale, CA&lt;/td&gt;
&lt;td&gt;August 13&lt;/td&gt;
&lt;td&gt;&lt;a href="https://rsvp.withgoogle.com/events/google-cloud-labs-accelerate-ai-on-cloud-run-sunnyvale" rel="noopener noreferrer"&gt;Register now!&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Toronto, Canada&lt;/td&gt;
&lt;td&gt;August 27&lt;/td&gt;
&lt;td&gt;&lt;a href="https://rsvp.withgoogle.com/events/google-cloud-labs-accelerate-ai-on-cloud-run-toronto" rel="noopener noreferrer"&gt;Register now!&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Seattle, WA&lt;/td&gt;
&lt;td&gt;September&lt;/td&gt;
&lt;td&gt;Registration opens late July!&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New York City, NY&lt;/td&gt;
&lt;td&gt;October&lt;/td&gt;
&lt;td&gt;Registration opens late July!&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Los Angeles, CA&lt;/td&gt;
&lt;td&gt;November&lt;/td&gt;
&lt;td&gt;Registration opens late July!&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Boston, MA&lt;/td&gt;
&lt;td&gt;October&lt;/td&gt;
&lt;td&gt;Registration opens late July!&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Washington D.C.&lt;/td&gt;
&lt;td&gt;October&lt;/td&gt;
&lt;td&gt;Registration opens late July!&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Registration Update:&lt;/strong&gt; Links for our &lt;strong&gt;September&lt;/strong&gt;, &lt;strong&gt;October&lt;/strong&gt;, and &lt;strong&gt;November&lt;/strong&gt; workshops will be added to this page in &lt;strong&gt;late July.&lt;/strong&gt; Stay tuned!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>googlecloud</category>
      <category>agents</category>
      <category>antigravity</category>
    </item>
    <item>
      <title>What is an "agentic harness," actually?</title>
      <dc:creator>Tilde A. Thurium</dc:creator>
      <pubDate>Thu, 16 Jul 2026 21:19:20 +0000</pubDate>
      <link>https://dev.to/googleai/what-is-an-agentic-harness-actually-4oie</link>
      <guid>https://dev.to/googleai/what-is-an-agentic-harness-actually-4oie</guid>
      <description>&lt;p&gt;I've been hearing the word "harness" thrown around a lot lately. I assumed it just meant &lt;em&gt;"the IDE"&lt;/em&gt; or &lt;em&gt;"whatever app is running your agent."&lt;/em&gt; Turns out, it goes a little deeper than that.&lt;/p&gt;

&lt;p&gt;So I sat down with &lt;a class="mentioned-user" href="https://dev.to/greggyb"&gt;@greggyb&lt;/a&gt; and asked him to explain it from the ground up: what an LLM actually does, what turns it into an agent, and where the harness fits into all of it.&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;Simon Willison's definition of an agent: an LLM with tools, running in a loop to accomplish a goal&lt;/li&gt;
&lt;li&gt;What "tools" really means under the hood, and how function calling lets an LLM pull in context it wasn't trained on&lt;/li&gt;
&lt;li&gt;The loop part: how an agent programmatically checks its own output to decide if it's actually done&lt;/li&gt;
&lt;li&gt;Why the harness is everything &lt;em&gt;after&lt;/em&gt; the LLM, and why that's a different thing than the interface&lt;/li&gt;
&lt;li&gt;Why you can swap interfaces without touching the underlying harness, and why some agents don't need a UI at all

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



&lt;p&gt;The point that stuck with me is the harness isn't the app you're looking at. It's the invisible plumbing deciding whether the agent keeps going or calls it done.&lt;/p&gt;

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

&lt;p&gt;Did your mental model of "harness" match up? Or were you picturing something else too?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>discuss</category>
      <category>llm</category>
    </item>
  </channel>
</rss>
