<?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: Yu-Wei Simon Liu (Simon Liu)</title>
    <description>The latest articles on DEV Community by Yu-Wei Simon Liu (Simon Liu) (@simonliuyuwei).</description>
    <link>https://dev.to/simonliuyuwei</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%2Fuser%2Fprofile_image%2F3704238%2Fb6279552-b221-4ead-ac09-6e6b8771e25c.png</url>
      <title>DEV Community: Yu-Wei Simon Liu (Simon Liu)</title>
      <link>https://dev.to/simonliuyuwei</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/simonliuyuwei"/>
    <language>en</language>
    <item>
      <title>open-doc: Letting Antigravity and Other Coding Agents Fully Own Document Layout and Generation</title>
      <dc:creator>Yu-Wei Simon Liu (Simon Liu)</dc:creator>
      <pubDate>Wed, 19 Aug 2026 03:28:17 +0000</pubDate>
      <link>https://dev.to/gde/open-doc-letting-antigravity-and-other-coding-agents-fully-own-document-layout-and-generation-3pak</link>
      <guid>https://dev.to/gde/open-doc-letting-antigravity-and-other-coding-agents-fully-own-document-layout-and-generation-3pak</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%2F6wzff9kiq021rags6utf.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%2F6wzff9kiq021rags6utf.png" alt=" " width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub — open-doc&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://github.com/simonliu-ai-product/open-doc" rel="noopener noreferrer"&gt;https://github.com/simonliu-ai-product/open-doc&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  1. Introduction
&lt;/h2&gt;

&lt;p&gt;Over the past year, I think most of us have handed more and more work over to coding agents — writing code, looking things up, running tests. They do all of that pretty well. But there is one thing I never got right: asking an agent to produce a report I could hand off as-is.&lt;/p&gt;

&lt;p&gt;Agents are actually good writers. Ask one for a quarterly review, a technical evaluation, or a project proposal and the content quality is fine. The problem starts right after the words — the layout. Every approach I tried got stuck in the same place:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Have the agent write Markdown, then convert to PDF.&lt;/strong&gt; The output has no concept of a "page". Tables get sliced in half across a page break, captions get separated from their figures, the table-of-contents page numbers don't line up. You end up tuning CSS instead of reading content.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Have the agent write HTML, then print it.&lt;/strong&gt; Every document reinvents the page layout from scratch. Where are the A4 margins, when should it break, how do page numbers carry across — you re-derive all of it every time, and then the next document starts over.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Have the agent produce Word.&lt;/strong&gt; No need to elaborate here. The odds of the formatting falling apart are roughly 100%.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After thinking about it long enough, you realize the problem isn't that the agent isn't smart enough — it's that the division of labor is wrong. What agents are genuinely good at is content, and layout happens to be the half that isn't allowed to be wrong. A report's page size, margins, break positions, and consecutive page numbers leave no room for creativity: they're either right or wrong. Handing those to an agent that has to guess afresh every time was never a reasonable idea.&lt;/p&gt;

&lt;p&gt;So the sensible arrangement is to let the framework lock down the parts that can't be wrong, and let the agent handle only what it's actually good at. The project that made me see this clearly was somebody else's.&lt;/p&gt;
&lt;h2&gt;
  
  
  2. A Look at open-slide
&lt;/h2&gt;

&lt;p&gt;To be clear up front: &lt;a href="https://github.com/1weiho/open-slide" rel="noopener noreferrer"&gt;open-slide&lt;/a&gt; is &lt;a href="https://github.com/1weiho" rel="noopener noreferrer"&gt;@1weiho&lt;/a&gt;'s work, not mine. I'm a user.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;GitHub - 1weiho/open-slide: A slide framework built for agents.&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://github.com/1weiho/open-slide" rel="noopener noreferrer"&gt;https://github.com/1weiho/open-slide&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It bills itself as "a slide framework built for agents". Every slide is a fixed 1920 × 1080 canvas written as a React component, and the framework takes care of scaling, navigation, hot reload, presenter mode, and speaker view. You don't have to learn a restrictive DSL, because the page &lt;em&gt;is&lt;/em&gt; a component — want a chart, drop in a chart; want an animation, write an animation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @open-slide/cli init my-slide
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I heard about the project at COSCUP and went home to try it. In practice, the feeling is: as long as you can describe the slide you want in plain language, the agent writes React and the result shows up in your browser immediately.&lt;/p&gt;

&lt;p&gt;But what actually made me stop and dig in wasn't "writing slides in React" — that isn't new. What I found interesting was how it handles the question of &lt;em&gt;how the agent is supposed to know how to use this tool&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;When you &lt;code&gt;init&lt;/code&gt; an open-slide project, the folder contains more than code: there's an &lt;code&gt;AGENTS.md&lt;/code&gt;, plus a handful of skill documents under &lt;code&gt;.agents/skills/&lt;/code&gt;. When your coding agent opens the project, it already knows what the file contract looks like, how much content safely fits on one slide, and what it shouldn't touch.&lt;/p&gt;

&lt;p&gt;In other words, &lt;strong&gt;the manual travels with the project, not with the conversation.&lt;/strong&gt; That design became the starting point for all of open-doc.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. What open-slide Taught Me — Building Tools, and Making Coding Agents Understand How to Use Them
&lt;/h2&gt;

&lt;p&gt;I put open-slide through its paces and read the source. This section is about what it taught me regarding the difference between &lt;em&gt;tools built for agents&lt;/em&gt; and &lt;em&gt;tools built for people&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  I. The manual belongs in the repo, not in the prompt
&lt;/h3&gt;

&lt;p&gt;This is the most counterintuitive point and the one with the biggest impact. We're used to writing "how to use this tool" as a prompt pasted at the top of a conversation. The problem is that prompts go stale, get truncated, and never get updated — and a different person or a different agent means pasting it all over again.&lt;/p&gt;

&lt;p&gt;open-slide's approach is to turn that knowledge into files in the repo. A skill is just a Markdown file that says "when you write this kind of file, here's what you must follow", and the scaffolder generates it into the user's project. Three benefits fall out of this: it's &lt;strong&gt;versioned&lt;/strong&gt; (the framework changes, the skill changes with it), it's &lt;strong&gt;project-scoped&lt;/strong&gt; (anyone who opens the repo can see it), and it's &lt;strong&gt;reviewable&lt;/strong&gt; (a skill is part of the source, so it goes through PRs).&lt;/p&gt;

&lt;h3&gt;
  
  
  II. Lock the parts that can't be wrong into the framework
&lt;/h3&gt;

&lt;p&gt;open-slide's canvas is always 1920 × 1080. That isn't a limitation — that &lt;em&gt;is&lt;/em&gt; the product. Because the canvas is fixed, the agent never has to guess how big the slide is, how large the text should be, or whether the content will fit. It just writes content, and "does it fit" gets answered by the framework through measurement, which is vastly more reliable than an agent guessing.&lt;/p&gt;

&lt;p&gt;I'd put it even more bluntly: &lt;strong&gt;every choice you take away from the agent is one class of error you no longer have to verify.&lt;/strong&gt; Layout is right-or-wrong with no creative latitude — it was never something to leave to guesswork.&lt;/p&gt;

&lt;h3&gt;
  
  
  III. The agent needs to know where you're currently looking
&lt;/h3&gt;

&lt;p&gt;This one I only appreciated after using it for real. You're looking at slide 7 in your browser, you turn to the agent and say "the spacing on this page is too tight" — which page is "this page"? The agent doesn't know. It can only ask you back, or guess, and a wrong guess means it edits something else entirely.&lt;/p&gt;

&lt;p&gt;open-slide's fix is direct: on every navigation, the dev server writes "where the user is right now" into a file, paired with a skill that tells the agent to read it. Deictic references like "this page" or "this element" then resolve into a concrete file path and line number. It looks like a small thing, but it's the bridge between &lt;em&gt;the screen the human is looking at&lt;/em&gt; and &lt;em&gt;the file the agent is editing&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Those three lessons came straight from open-slide. But once I actually built a system of my own, I hit two more problems it hadn't shown me — humans and agents editing the same file at the same time, and the same operation having more than one entry point. I'll cover both in the next section.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. My Open Source Project: open-doc
&lt;/h2&gt;

&lt;p&gt;Carrying those three lessons, I spent the last few days building &lt;strong&gt;open-doc&lt;/strong&gt; — and the two problems I just teased are exactly what I ran into along the way.&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%2Fi9rm2ijrri3q84hqwcc1.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%2Fi9rm2ijrri3q84hqwcc1.png" alt="open-doc" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If open-slide is Google Slides for agents, then open-doc is Google Docs. Same concept, different medium: a deck is a 1920 × 1080 canvas, while a document is a stack of A4 sheets that has to survive contact with a printer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @open-document/cli init my-docs
&lt;span class="nb"&gt;cd &lt;/span&gt;my-docs
pnpm dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;(Side note: the &lt;code&gt;@open-doc&lt;/code&gt; scope on npm was already taken, so the packages are `@open-document/&lt;/em&gt;` — but the CLI command and the project name are still open-doc.)*&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%2Fp05gwf8ukg9x29i24hkg.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%2Fp05gwf8ukg9x29i24hkg.png" alt="open-doc document viewer" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;open-doc's document viewer — page thumbnails on the left, a real A4 sheet in the middle, footer and page number filled in by the framework&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Real page dimensions
&lt;/h3&gt;

&lt;p&gt;Every page component renders as an actual sheet of paper. A4 (794 × 1123 px @96dpi), Letter, A5, and Legal are all supported, in portrait or landscape. What you see on screen is what's in the PDF, because the &lt;code&gt;@page&lt;/code&gt; size matches — nothing gets re-scaled at print time.&lt;/p&gt;

&lt;p&gt;This is something I called out explicitly when writing the skills: authors write CSS px, but paper is measured in mm. 1pt is roughly 1.333px, so 14px body text prints at about 10.5pt — while 11px, which looks okay on screen, prints at 8pt and is unreadable.&lt;/p&gt;
&lt;h3&gt;
  
  
  The file contract
&lt;/h3&gt;

&lt;p&gt;A document is a folder plus an &lt;code&gt;index.tsx&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// docs/q3-review/index.tsx&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;DocMeta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;DocPage&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@open-document/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Cover&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;DocPage&lt;/span&gt; &lt;span class="o"&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;…&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Summary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;DocPage&lt;/span&gt; &lt;span class="o"&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;…&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;DocMeta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Q3 Review&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;pageSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;A4&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Cover&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Summary&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="nx"&gt;satisfies&lt;/span&gt; &lt;span class="nx"&gt;DocPage&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No front-matter DSL, no hierarchy of config files. One component is one printed sheet.&lt;/p&gt;

&lt;h3&gt;
  
  
  Auto-pagination that knows what can't be split
&lt;/h3&gt;

&lt;p&gt;Fixed pages are right for covers, tables of contents, and section dividers — pages where the layout &lt;em&gt;is&lt;/em&gt; the content. Body text is the opposite: paginating it by hand usually yields eleven pages that are each 60% full. So body content can be wrapped in &lt;code&gt;flow()&lt;/code&gt;, and the framework measures every block in the real DOM before packing it into pages: headings don't get stranded at the bottom, captions stay with their figures, tables move as a unit. That pagination logic is a pure function, so it has unit tests. Pagination rules should be verifiable, not folklore.&lt;/p&gt;

&lt;h3&gt;
  
  
  A table of contents and page numbers that maintain themselves
&lt;/h3&gt;

&lt;p&gt;Just write real &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; / &lt;code&gt;&amp;lt;h2&amp;gt;&lt;/code&gt; and you get an outline sidebar automatically. Drop in &lt;code&gt;&amp;lt;TableOfContents /&amp;gt;&lt;/code&gt; and the TOC page fills itself in, with page numbers that are correct in both the viewer and the exported file. Footers use &lt;code&gt;useDocPageNumber()&lt;/code&gt; / &lt;code&gt;useDocPageCount()&lt;/code&gt;, so nothing has to be renumbered by hand.&lt;/p&gt;

&lt;h3&gt;
  
  
  Edit right on the page, or leave a note for the agent
&lt;/h3&gt;

&lt;p&gt;Inspect mode lets you click an element on the page and edit its text directly; the change is written back to source via AST replacement. But the feature I use more often is the other one: you can leave a note for the agent right on the page. It's stored in the source as an &lt;code&gt;@doc-comment&lt;/code&gt; marker, and later you tell the agent "apply comments" — the skill walks through them one by one, makes the edits, and clears the markers. This is far more precise than screenshotting a page and saying "fix this bit", because the annotation is anchored to a source line number.&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%2Fvxxvja38d31lbmofjyj6.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%2Fvxxvja38d31lbmofjyj6.png" alt="Inspect mode" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Inspect mode — click any element to rewrite its text, or leave a note for the agent&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Humans and agents will edit the same file
&lt;/h3&gt;

&lt;p&gt;This is one I only discovered by building it, and one traditional tools mostly don't have to face. While you're clicking around in the browser editing text, the agent is editing the same source. Whoever writes last clobbers the other — silently, with no warning at all.&lt;/p&gt;

&lt;p&gt;My fix is that every write API takes an &lt;code&gt;expected&lt;/code&gt; parameter. You send along "what I just read", and if what's on disk no longer matches, the write is rejected (409) rather than applied. Once the agent gets a 409, it re-reads and re-decides — which it's perfectly capable of doing, as long as you give it the chance.&lt;/p&gt;
&lt;h3&gt;
  
  
  Export and deploy
&lt;/h3&gt;

&lt;p&gt;PDF goes through the browser's print pipeline at real page dimensions, and waits for fonts and images to load and the TOC to be filled before serializing — so you don't get the classic "chart is blank after export" problem. HTML export is self-contained and printable (documents with assets are bundled into a zip). &lt;code&gt;open-doc build&lt;/code&gt; also produces a fully static site you can drop onto Vercel, Cloudflare Pages, or any static host.&lt;/p&gt;
&lt;h3&gt;
  
  
  An MCP server for any agent framework
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pnpm add &lt;span class="nt"&gt;-D&lt;/span&gt; @open-document/mcp
open-doc dev &lt;span class="nt"&gt;--mcp&lt;/span&gt;
&lt;span class="c"&gt;# ➜ MCP:   http://localhost:5273/mcp&lt;/span&gt;
&lt;span class="c"&gt;# ➜ Local: http://localhost:5273/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;There are 19 tools in total, covering document CRUD, precise single-paragraph text replacement, themes, assets, and folders. It's stateless Streamable HTTP — clients just call it, no session handshake required.&lt;/p&gt;

&lt;p&gt;Which brings me to the second thing I ran into while building this: &lt;strong&gt;the same operation has more than one entry point.&lt;/strong&gt; open-doc can be driven from the browser UI or from MCP, and I nearly ended up writing two sets of logic. I eventually pulled every operation that touches disk into &lt;code&gt;src/ops/&lt;/code&gt;, leaving the dev server's routes and the MCP tools as thin adapters over it.&lt;/p&gt;

&lt;p&gt;The payoff is that rules are written once — the 409 conflict check, path safety, id validation are all identical — so you never get a gap where "the UI blocks it but MCP doesn't". That matters especially in systems with agents in them, because the path an agent takes is often the one you manually test least.&lt;/p&gt;
&lt;h3&gt;
  
  
  Built-in skills
&lt;/h3&gt;

&lt;p&gt;The project you &lt;code&gt;init&lt;/code&gt; ships with these skill documents, placed in both &lt;code&gt;.agents/skills/&lt;/code&gt; and &lt;code&gt;.claude/skills/&lt;/code&gt; so either flavor of agent can see them:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Skill&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;create-doc&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Draft a document from scratch: establish the topic, the audience and the source material first, ask a few scoping questions, plan the pages, and only then start writing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;doc-authoring&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Technical reference: the file contract, the page canvas, print-safe type sizes, the vertical budget that decides where pages break, tables, charts, assets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;create-theme&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Generate a reusable family style, including a palette, a type scale, and components you can drop straight in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;apply-comments&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Walk through the notes you left in Inspect mode, complete each one, and clear the markers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;current-doc&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Resolve "this page" and "this element" by reading the cursor file the dev server writes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  5. Demo: Driving open-doc with Antigravity
&lt;/h2&gt;

&lt;p&gt;Everything above is design. Now let's actually run it. I'm using Google Antigravity as the coding agent environment here, for a simple reason: open-doc's interface to agents is a generic convention (&lt;code&gt;AGENTS.md&lt;/code&gt; plus &lt;code&gt;.agents/skills/&lt;/code&gt;, with MCP as an option), so it isn't tied to any one vendor's agent. The flow is the same with other tools.&lt;/p&gt;

&lt;p&gt;If you want background on Antigravity, here's something I wrote earlier — this article won't cover any AI-coding details, just the content and the results:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Experiencing AI Building a Personal Website Directly with the Google Antigravity IDE&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://medium.com/@simon3458" rel="noopener noreferrer"&gt;https://medium.com/@simon3458&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Step 1: Create a workspace
&lt;/h3&gt;

&lt;p&gt;Run the following to scaffold the folder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @open-document/cli init q3-report
&lt;span class="nb"&gt;cd &lt;/span&gt;q3-report
pnpm &lt;span class="nb"&gt;install
&lt;/span&gt;pnpm dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fp0diec0ssluaq3pwaldu.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%2Fp0diec0ssluaq3pwaldu.png" alt="open-doc workspace" width="800" height="469"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The open-doc workspace created by the CLI&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Open &lt;code&gt;http://localhost:5273&lt;/code&gt; and you'll see an empty workspace plus a &lt;code&gt;getting-started&lt;/code&gt; document.&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%2Fl1x2z8kaxrnp1hpd8t29.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%2Fl1x2z8kaxrnp1hpd8t29.png" alt="empty workspace" width="799" height="387"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 2: Open the folder in Antigravity
&lt;/h3&gt;

&lt;p&gt;The first thing Antigravity does after opening the project is read &lt;code&gt;AGENTS.md&lt;/code&gt;, which sits in the root of the scaffolded project. It says that only &lt;code&gt;docs/&amp;lt;id&amp;gt;/&lt;/code&gt; may be written to, that no new dependencies should be added, and lists the available skills and what each is for. In other words, you don't have to explain what open-doc is to the agent — the project explains itself.&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%2Fncawyjf9wl4jh9vq1ur4.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%2Fncawyjf9wl4jh9vq1ur4.png" alt="Antigravity reading AGENTS.md" width="800" height="470"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Antigravity reading the project's AGENTS.md and skills&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 3: Ask for a report in one sentence
&lt;/h3&gt;

&lt;p&gt;My prompt was roughly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Write me a Q3 infrastructure review report for an audience of engineering leads.
The data is in ~/workspace/data/q3-metrics.csv — don't make up any numbers.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fxf0cg9i05w70w22516vz.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%2Fxf0cg9i05w70w22516vz.png" alt="Antigravity prompt" width="799" height="469"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;create-doc&lt;/code&gt; skill first pins down where the material comes from. That behavior is deliberately written into the skill: when no data is provided it should &lt;em&gt;ask&lt;/em&gt;, not invent a set of plausible-looking numbers. Then it asks a few scoping questions (page limit, TOC or not, tone), plans out the pages, and only then starts writing files. The browser hot-reloads the moment it's done, and you're looking at that stack of A4 pages directly.&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%2Fuaw7ybzde4u9s0nzaklt.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%2Fuaw7ybzde4u9s0nzaklt.png" alt="Antigravity generating the document" width="800" height="470"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Antigravity generating the document&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvqc8f68kfjqhp0imvpb5.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%2Fvqc8f68kfjqhp0imvpb5.png" alt="generated document" width="800" height="387"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Leave a note on the page and let the agent come back to it
&lt;/h3&gt;

&lt;p&gt;This is the loop I use most. Rather than describing "the paragraph under the subheading on page three" in a chat box, just open Inspect, click that paragraph, leave a note, then go back to Antigravity and say "apply comments".&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%2Fl7cods7odt5yzyrmmgrz.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%2Fl7cods7odt5yzyrmmgrz.png" alt="inspect note" width="800" height="387"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1u6b6t9a9lsg9jb8mwrl.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%2F1u6b6t9a9lsg9jb8mwrl.png" alt="inspect note" width="800" height="249"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgfnha3htrtng81wy0nl6.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%2Fgfnha3htrtng81wy0nl6.png" alt="applied result" width="800" height="469"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Leaving a note in Inspect mode, and the result after the agent applies it&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F21m8qlem6rlakbskhjp8.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%2F21m8qlem6rlakbskhjp8.png" alt="applied result" width="800" height="387"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Export the PDF
&lt;/h3&gt;

&lt;p&gt;Pick PDF from the Download menu in the top right, and out comes a real A4 file with consecutive page numbers and correct TOC page references — no round trip through Word to fix things up.&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%2Fc22iv5qbl610758mr6hf.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%2Fc22iv5qbl610758mr6hf.png" alt="export PDF" width="798" height="192"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr6dgdg2oiagg51cxhqag.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%2Fr6dgdg2oiagg51cxhqag.png" alt="exported PDF" width="800" height="515"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The exported PDF&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Optional: hook up MCP
&lt;/h3&gt;

&lt;p&gt;If you'd rather have another agent framework (Google ADK, for instance) drive it through tool calls than edit files directly, add &lt;code&gt;--mcp&lt;/code&gt; to start the MCP service at &lt;code&gt;http://localhost:5273/mcp&lt;/code&gt;. The agent can then use tools like &lt;code&gt;list_documents&lt;/code&gt;, &lt;code&gt;read_document&lt;/code&gt;, and &lt;code&gt;write_text&lt;/code&gt;, and the page in the browser updates live, because the MCP server runs on the dev server itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Conclusion
&lt;/h2&gt;

&lt;p&gt;The biggest thing I got out of building open-doc wasn't the tool itself — it was getting clear on one idea: &lt;strong&gt;the hard part of building tools for agents isn't the features, it's making the agent know how to use them.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And "making the agent know how to use them" isn't about writing a longer prompt. It's three concrete pieces of engineering work: put the knowledge in the repo so it's versioned, project-scoped, and reviewable; lock the parts that can't be wrong into the framework so the agent only has to handle what it's actually good at; and give the agent the context it's missing, like which page you're currently looking at, or whether this file has been changed by someone else since it last read it.&lt;/p&gt;

&lt;p&gt;None of these three have much to do with how smart the LLM is. They're design problems — and I expect more and more tools will have to face the same ones.&lt;/p&gt;

&lt;p&gt;Finally, thanks again to &lt;a href="https://github.com/1weiho" rel="noopener noreferrer"&gt;@1weiho&lt;/a&gt; for open-slide. Virtual-module-based document discovery, the scaffolder, and treating skills as documentation were all learned from there. Good design gets picked up and carried forward by the next person.&lt;/p&gt;

&lt;p&gt;open-doc is at v0.2.0, MIT licensed. Try it, open issues, send PRs — and I'd love to hear what kind of documents you end up producing with it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub — open-doc&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://github.com/simonliu-ai-product/open-doc" rel="noopener noreferrer"&gt;https://github.com/simonliu-ai-product/open-doc&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  I am Simon
&lt;/h2&gt;

&lt;p&gt;Hi, I'm Simon Liu, an AI solutions specialist and a Google Cloud AI Google Developer Expert (GDE). I hope to help enterprises solve problems by adopting AI technologies. If this article was useful to you, please give it a reaction and follow me so you can catch what I write next. Feel free to leave a comment on my LinkedIn and discuss AI topics with me — I hope this was helpful!&lt;/p&gt;

&lt;p&gt;My Personal Website: &lt;a href="https://simonliuyuwei.my.canva.site/link-in-bio" rel="noopener noreferrer"&gt;https://simonliuyuwei.my.canva.site/link-in-bio&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was originally published in Traditional Chinese on &lt;a href="https://medium.com/@simon3458/open-doc-open-source-project-9d15d819068e" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>antigravity</category>
      <category>mcp</category>
    </item>
    <item>
      <title>[Open Source] ADEval — A Tool for Evaluating Tool-Use Capabilities of Google ADK AI Agents</title>
      <dc:creator>Yu-Wei Simon Liu (Simon Liu)</dc:creator>
      <pubDate>Tue, 10 Mar 2026 04:58:31 +0000</pubDate>
      <link>https://dev.to/gde/open-source-adeval-a-tool-for-evaluating-tool-use-capabilities-of-google-adk-ai-agents-3284</link>
      <guid>https://dev.to/gde/open-source-adeval-a-tool-for-evaluating-tool-use-capabilities-of-google-adk-ai-agents-3284</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.amazonaws.com%2Fuploads%2Farticles%2F8ypmonkknchaankgl1rg.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.amazonaws.com%2Fuploads%2Farticles%2F8ypmonkknchaankgl1rg.png" alt=" " width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  I. Introduction: Why Building a "Stable" AI Agent is Hard
&lt;/h3&gt;

&lt;p&gt;As developers, we all know that scaffolding an AI Agent using Google’s &lt;strong&gt;Agent Development Kit (ADK)&lt;/strong&gt; or various LLM frameworks is relatively straightforward. The real challenge, however, lies in &lt;strong&gt;ensuring the Agent's behavior is predictable and stable.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In real-world business scenarios, an Agent might call the right tool today but deviate tomorrow due to slight prompt variations, model updates, or context interference. Relying solely on manual chat testing is inefficient and fails to cover critical edge cases.&lt;/p&gt;

&lt;p&gt;This is why I built &lt;strong&gt;ADEval&lt;/strong&gt; — a systematic evaluation tool designed specifically for AI Agents. It empowers developers to gain deep control over Agent behavior through a dual-track approach: &lt;strong&gt;Automation&lt;/strong&gt; and &lt;strong&gt;Visualization&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  II. Github: ADEval
&lt;/h3&gt;

&lt;p&gt;ADEval provides an intuitive Web UI and a powerful CLI, allowing you to systematically test your Agent's &lt;strong&gt;Question-Tools-Answer (Q-Tools-A)&lt;/strong&gt; flow. It supports experiment management, batch testing, and comprehensive tracing.&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.amazonaws.com%2Fuploads%2Farticles%2Fdoeem3sm1tbgek1qqwom.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.amazonaws.com%2Fuploads%2Farticles%2Fdoeem3sm1tbgek1qqwom.png" alt=" " width="800" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Github Repository&lt;/strong&gt;
&lt;a href="https://github.com/ap-mic-inc/ADEval" rel="noopener noreferrer"&gt;GitHub - ap-mic-inc/ADEval: Google ADK Evaluation Service&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Project Documentation&lt;/strong&gt;
&lt;a href="https://github.com/ap-mic-inc/ADEval/tree/main/docs" rel="noopener noreferrer"&gt;ADEval Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  III. Core Philosophy: The Q-Tools-A Validation Framework
&lt;/h3&gt;

&lt;p&gt;When evaluating an AI Agent, comparing the final text response (Answer) is simply not enough. A high-quality Agent must call the right &lt;strong&gt;Tools&lt;/strong&gt; at the right time with the correct parameters.&lt;/p&gt;

&lt;p&gt;ADEval is designed around the &lt;strong&gt;Q-Tools-A&lt;/strong&gt; logic:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Question&lt;/strong&gt;: The input prompt, specific User ID, and necessary Session State (persistence).&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Tools&lt;/strong&gt;: Automatically validates if the Agent invoked the expected tools. We support &lt;strong&gt;Smart Argument Comparison&lt;/strong&gt; — even if the JSON parameter order differs, ADEval marks it as a match if the values and logic are consistent.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Answer&lt;/strong&gt;: Ensures the final response meets business requirements via keyword matching or semantic checks.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Below is the workflow logic diagram I designed for ADEval, ensuring a clear path from start to output:&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.amazonaws.com%2Fuploads%2Farticles%2Fnitf4ttevvyw6od0c0vz.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.amazonaws.com%2Fuploads%2Farticles%2Fnitf4ttevvyw6od0c0vz.png" alt=" " width="800" height="1773"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ADEval Workflow Logic Diagram (Mermaid Chart)&lt;/p&gt;




&lt;h3&gt;
  
  
  IV. Dual Mode: From Debugging to Production Automation
&lt;/h3&gt;

&lt;p&gt;ADEval provides both an intuitive Web UI and a powerful CLI, allowing you to switch seamlessly between manual debugging and CI/CD automation.&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Web UI: Visual Tracing &amp;amp; Real-time Debugging
&lt;/h4&gt;

&lt;p&gt;Observing an Agent's thought process is critical. The ADEval Web dashboard features a powerful &lt;strong&gt;"Playground"&lt;/strong&gt; where you can input questions and observe results in real-time.&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.amazonaws.com%2Fuploads%2Farticles%2Ffz1s5t09czmh8921x36y.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.amazonaws.com%2Fuploads%2Farticles%2Ffz1s5t09czmh8921x36y.png" alt=" " width="800" height="503"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ADEval Playground Interface showing testing panels&lt;/p&gt;

&lt;p&gt;The standout feature is &lt;strong&gt;Visual Tracing&lt;/strong&gt;. We transform complex API response event streams into a "Dark Terminal Style" viewer. You can expand raw JSON with one click to pinpoint exactly where a tool call failed or deviated.&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.amazonaws.com%2Fuploads%2Farticles%2F3riq3sjwe754fd9lewef.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.amazonaws.com%2Fuploads%2Farticles%2F3riq3sjwe754fd9lewef.png" alt=" " width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Visual Tracing Dark Terminal View showing JSON events&lt;/p&gt;

&lt;h4&gt;
  
  
  2. CLI Tool: Powerhouse for CI/CD &amp;amp; Batch Execution
&lt;/h4&gt;

&lt;p&gt;Once your experiments are defined, you no longer need a browser. ADEval offers a full-fledged command-line tool perfect for automation scripts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Global Configuration (&lt;code&gt;adeval config&lt;/code&gt;)&lt;/strong&gt;: Set default API URLs and developer credentials to save time.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Quick Test (&lt;code&gt;adeval test&lt;/code&gt;)&lt;/strong&gt;: Perform stress tests or logic validation directly against the Agent without creating an experiment.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Batch Execution &amp;amp; Reporting (&lt;code&gt;adeval run / export&lt;/code&gt;)&lt;/strong&gt;: Execute entire experiment sets and receive precise statistical reports.&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.amazonaws.com%2Fuploads%2Farticles%2F3im6qzsfhk9m5ybwc5kb.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.amazonaws.com%2Fuploads%2Farticles%2F3im6qzsfhk9m5ybwc5kb.png" alt=" " width="800" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;CLI output showing 'adeval run' statistical table&lt;/p&gt;




&lt;h3&gt;
  
  
  V. Deep Dive into Features
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Experiment Management &amp;amp; Batch Evaluation&lt;/strong&gt;: Import dozens or hundreds of test cases via &lt;strong&gt;CSV files&lt;/strong&gt;. ADEval provides real-time progress bars and pass-rate statistics during execution.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Local Data Ownership&lt;/strong&gt;: Privacy and performance are priorities. All experiment data, logs, and configs are stored locally in the &lt;code&gt;.adeval/&lt;/code&gt; folder. Your data stays on your machine.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Smart Comparison Logic&lt;/strong&gt;: In tool validation, we support &lt;strong&gt;"Order-Independent"&lt;/strong&gt; comparison. If an Agent calls &lt;code&gt;get_weather(city="Taipei", unit="c")&lt;/code&gt;, ADEval accurately judges it even if the internal parameter sequence differs.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  VI. Getting Started
&lt;/h3&gt;

&lt;p&gt;ADEval is open-source and ready to use. You can install it easily via Python:&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;# Clone the repository&lt;/span&gt;
git clone https://github.com/ap-mic-inc/ADEval.git
&lt;span class="nb"&gt;cd &lt;/span&gt;ADEval

&lt;span class="c"&gt;# Install in editable mode&lt;/span&gt;
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After installation, simply run &lt;code&gt;adeval ui&lt;/code&gt; to launch the web interface or check out &lt;code&gt;adeval --help&lt;/code&gt; for the full CLI suite.&lt;/p&gt;




&lt;h3&gt;
  
  
  VII. Conclusion
&lt;/h3&gt;

&lt;p&gt;Building an AI Agent that can chat naturally is just the beginning. Ensuring its stability and predictability in complex business scenarios is where the real engineering challenge lies. ADEval was born to solve the core pain points of testing, debugging, and maintaining Agent systems.&lt;/p&gt;

&lt;p&gt;In summary, ADEval brings three key values to developers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Precise Behavioral Control&lt;/strong&gt;: Move beyond text matching to rigorous Tool-use validation.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Flexible Workflow&lt;/strong&gt;: Covers the entire lifecycle from visual debugging to automated regression testing.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Security &amp;amp; Efficiency&lt;/strong&gt;: Localized storage for privacy and smart matching to reduce false positives.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are building high-quality enterprise AI applications with Google ADK, ADEval is your indispensable testing companion. Give us a &lt;strong&gt;Star (⭐)&lt;/strong&gt; on GitHub or submit an Issue/PR to help us build a stronger AI evaluation ecosystem!&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;I am Simon&lt;/strong&gt;&lt;br&gt;
Hi everyone, I am Simon Liu, an AI Solutions Expert and Google Developer Expert (GDE) in GenAI. I am dedicated to helping enterprises implement AI technologies to solve real-world problems. If this post was helpful, please follow me on Medium or connect with me on LinkedIn.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My Personal Website:&lt;/strong&gt; &lt;a href="https://simonliuyuwei.my.canva.site/link-in-bio" rel="noopener noreferrer"&gt;https://simonliuyuwei.my.canva.site/link-in-bio&lt;/a&gt;&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>showdev</category>
      <category>testing</category>
    </item>
    <item>
      <title>[ Open Source Project] open-translate — Offline Translation Web Service Powered by TranslateGemma</title>
      <dc:creator>Yu-Wei Simon Liu (Simon Liu)</dc:creator>
      <pubDate>Sun, 18 Jan 2026 16:26:31 +0000</pubDate>
      <link>https://dev.to/gde/open-source-open-translate-offline-translation-web-service-powered-by-translategemma-2ob2</link>
      <guid>https://dev.to/gde/open-source-open-translate-offline-translation-web-service-powered-by-translategemma-2ob2</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;I’ve provided a Google Colab test script for this project. You can apply for Hugging Face and ngrok tokens to test it. Welcome to use it!&lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2Fkl5mgrtbwyjh7p1p78gt.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.amazonaws.com%2Fuploads%2Farticles%2Fkl5mgrtbwyjh7p1p78gt.png" alt=" " width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;On January 15, 2026, Google released a new model named TranslateGemma. It can perform translation tasks for 55 languages, including Traditional Chinese and English, based on its specific training. It even supports image input for translation output.&lt;/p&gt;

&lt;p&gt;I wondered if it was possible to create an offline "Google Translate-like" web service so that corporate confidential data could be processed in a non-networked environment. Thus, this project was born. This article will introduce TranslateGemma and my personal project.&lt;/p&gt;

&lt;h2&gt;
  
  
  I. Introduction to TranslateGemma
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Background &amp;amp; Overview
&lt;/h3&gt;

&lt;p&gt;TranslateGemma is a specialized LLM for translation tasks developed by Google DeepMind, built on the Gemma 3 architecture. It aims to provide the strongest translation capabilities in the open-source community. Unlike general chatbots, TranslateGemma focuses on language conversion. Weights are publicly available on Hugging Face and Vertex AI for local or cloud deployment.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Architecture &amp;amp; Training
&lt;/h3&gt;

&lt;p&gt;Its core advantage comes from a unique "two-stage training" process:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supervised Fine-Tuning (SFT): Utilizing high-quality human translation data and synthetic data generated by Gemini.&lt;/li&gt;
&lt;li&gt;Reinforcement Learning (RL): Further guided by translation reward models like MetricX-QE and AutoMQM to align with human preferences and semantic precision.&lt;/li&gt;
&lt;li&gt;Model Sizes: Available in 4B (mobile), 12B (laptop/workstation), and 27B (cloud).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Supported Languages: 55 core languages with training on nearly 500 language pairs.
&amp;gt; PS: According to the tech report, Traditional Chinese-related pairs include EN/Cantonese -&amp;gt; Trad. Chinese and Trad. Chinese -&amp;gt; Cantonese.&lt;/li&gt;
&lt;li&gt;Multimodal Potential: Inherits Gemma 3's vision capabilities, enabling "visual translation" to understand text context in images (signs, menus, etc.).&lt;/li&gt;
&lt;li&gt;High Efficiency: The 12B version often outperforms larger unspecialized models in translation quality.
&amp;gt; Reminder: Max Context Window is 2k.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Performance &amp;amp; Applications
&lt;/h3&gt;

&lt;p&gt;Excelled in authority benchmarks like WMT24++. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The 12B version's quality (MetricX) even surpasses the general Gemma 3 27B model, proving the effectiveness of specialized training. &lt;/li&gt;
&lt;li&gt;Its flexibility makes it the best choice for balancing lightweight design and high quality in the open-source community.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Information
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Google Blog: &lt;a href="https://blog.google/innovation-and-ai/technology/developers-tools/translategemma/" rel="noopener noreferrer"&gt;https://blog.google/innovation-and-ai/technology/developers-tools/translategemma/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Huggingface: &lt;a href="https://huggingface.co/collections/google/translategemma" rel="noopener noreferrer"&gt;https://huggingface.co/collections/google/translategemma&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Tech Report: &lt;a href="https://arxiv.org/pdf/2601.09012" rel="noopener noreferrer"&gt;https://arxiv.org/pdf/2601.09012&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  II. Open Translate — Modern Interface for TranslateGemma
&lt;/h2&gt;

&lt;p&gt;Open Translate was created to bridge the gap in localization and privacy.&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.amazonaws.com%2Fuploads%2Farticles%2Fnhiexzbyv0aalh7caz7j.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.amazonaws.com%2Fuploads%2Farticles%2Fnhiexzbyv0aalh7caz7j.png" alt=" " width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8dqdnva57hqpjo4irc6k.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.amazonaws.com%2Fuploads%2Farticles%2F8dqdnva57hqpjo4irc6k.png" alt=" " width="799" height="516"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Technology Stack
&lt;/h3&gt;

&lt;p&gt;(1) Backend: FastAPI for high-performance async API. Uses Hugging Face transformers to call the translategemma-4b-it model with CUDA acceleration.&lt;br&gt;
(2) Frontend: React (Vite) + Bootstrap for a clean, modern UI with real-time previews.&lt;br&gt;
(3) Database: SQLite (SQLAlchemy) for translation history logs.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Highlights &amp;amp; Localization
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Multimodal Support: Image translation interface for screenshots, signs, or documents.&lt;/li&gt;
&lt;li&gt;Trad. Chinese Optimization: Integrated OpenCC to convert outputs into Taiwan-style phrasing and Traditional Chinese characters.&lt;/li&gt;
&lt;li&gt;Privacy &amp;amp; Security: Supports full offline deployment via Docker to ensure data remains internal.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Quick Start
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Google Colab: One-click script with Node.js/Python setup and ngrok access.
&lt;a href="https://colab.research.google.com/github/simonliu-ai-product/open-translate/blob/main/open_translate_project_workflow.ipynb" rel="noopener noreferrer"&gt;https://colab.research.google.com/github/simonliu-ai-product/open-translate/blob/main/open_translate_project_workflow.ipynb&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docker Compose: Single command to run locally on NVIDIA GPUs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Github
&lt;/h3&gt;

&lt;p&gt;Link: &lt;a href="https://github.com/simonliu-ai-product/open-translate/tree/main" rel="noopener noreferrer"&gt;https://github.com/simonliu-ai-product/open-translate/tree/main&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  III. Conclusion
&lt;/h2&gt;

&lt;p&gt;The release of TranslateGemma proves that specialized small models can punch above their weight.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Democratizing Compute: 4B models provide professional quality on home laptops, lowering the barrier to entry.&lt;/li&gt;
&lt;li&gt;Multimodal is Future: Translation moves beyond text to direct visual understanding, changing how we interact with the world.&lt;/li&gt;
&lt;li&gt;Open Source Value: Combining Google's models with modern web frameworks enables rapid problem-solving.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Open Translate is just a starting point. I will continue to optimize localization and explore integration with AI Agents. Welcome to download the source code on GitHub, give it a Star, or test it via Colab!&lt;/p&gt;




&lt;h2&gt;
  
  
  I am Simon
&lt;/h2&gt;

&lt;p&gt;Hi everyone, I am Simon Liu, an AI Solutions Expert and a Google Developer Expert (GDE) in GenAI. I look forward to helping enterprises implement AI technologies. If this article was helpful, please give it a "Clap" on Medium and follow my account. Feel free to leave comments on my LinkedIn!&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.amazonaws.com%2Fuploads%2Farticles%2F9l3ktv307rci0aif7rww.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.amazonaws.com%2Fuploads%2Farticles%2F9l3ktv307rci0aif7rww.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My Personal Website: &lt;a href="https://simonliuyuwei.my.canva.site/link-in-bio" rel="noopener noreferrer"&gt;https://simonliuyuwei.my.canva.site/link-in-bio&lt;/a&gt;&lt;/p&gt;

</description>
      <category>google</category>
      <category>gemma</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>[AI Agent] TPU-Based AI Agent Development: Integrating the Twinkle AI Open Source Model (gemma-3–4B-T1-it) with Google ADK Tools</title>
      <dc:creator>Yu-Wei Simon Liu (Simon Liu)</dc:creator>
      <pubDate>Mon, 12 Jan 2026 02:44:31 +0000</pubDate>
      <link>https://dev.to/gde/ai-agent-tpu-based-ai-agent-development-integrating-the-twinkle-ai-open-source-model-18ji</link>
      <guid>https://dev.to/gde/ai-agent-tpu-based-ai-agent-development-integrating-the-twinkle-ai-open-source-model-18ji</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Special Thanks: I would like to express my gratitude to &lt;a href="https://www.apmic.ai/" rel="noopener noreferrer"&gt;APMIC&lt;/a&gt; and the &lt;a href="https://discord.com/invite/Cx737yw4ed" rel="noopener noreferrer"&gt;Twinkle AI community&lt;/a&gt; for their assistance, which made the completion of this article possible.&lt;/p&gt;

&lt;p&gt;Original Chinese Post: &lt;a href="https://medium.com/@simon3458/twinkleai-gemma-3-t1-4b-adk-agent-d3309665f448" rel="noopener noreferrer"&gt;https://medium.com/@simon3458/twinkleai-gemma-3-t1-4b-adk-agent-d3309665f448&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As Large Language Model (LLM) technology enters a stage of maturity, the focus of developers has shifted from simple "conversation generation" to "AI Agents" capable of autonomous planning and execution. However, creating an Agent that understands Taiwan's local culture and can accurately execute complex tool calls presents two major challenges: first, general-purpose models often lack understanding of local regulations and context; second, the high cost of GPU computing power limits the widespread adoption of applications.&lt;/p&gt;

&lt;p&gt;This article will guide you through exploring: building AI Agent application services by combining the matrix computation advantages of Google TPU, Twinkle AI's gemma-3–4B-T1-it open-source model (optimized specifically for the Taiwanese context), and the Google ADK (Agent Development Kit).&lt;/p&gt;

&lt;p&gt;We will start with the underlying architecture of TPUs to explain why they are accelerators for AI inference. Next, we will introduce how Twinkle AI solves "alignment drift" and strengthens Function Calling capabilities. Finally, we will conduct a hands-on walkthrough using Google Colab, stacking and integrating these technologies to build an AI Agent from scratch that is responsive, understands Taiwanese linguistic habits, and can actually query stock information.&lt;/p&gt;




&lt;h2&gt;
  
  
  I. Introduction to Google TPU
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. What is a TPU (Tensor Processing Unit)?
&lt;/h3&gt;

&lt;p&gt;Google TPU is a "Domain-Specific Architecture" (DSA) integrated circuit tailored specifically for machine learning workloads. Unlike traditional processors that need to handle various general-purpose tasks, the core design of the TPU adopts a "Systolic Array" architecture. This design mimics the way a heart beats, allowing data to flow rhythmically between thousands of arithmetic units within the chip. This architecture enables the TPU to significantly reduce frequent memory access when performing matrix multiplication—the core operation of neural networks—thereby breaking through the "von Neumann bottleneck" of traditional computer architectures and achieving extremely high computational density and efficiency.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The Difference Between TPU and GPU
&lt;/h3&gt;

&lt;p&gt;The fundamental difference between the two lies in the philosophical opposition of "Specialization" vs. "Generalization."&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GPU (Graphics Processing Unit):&lt;/strong&gt; essentially a general-purpose parallel processor designed for graphics rendering. It retains a massive amount of control logic and cache to handle complex instruction streams, giving it high flexibility and a powerful CUDA software ecosystem suitable for highly variable research and applications.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;TPU:&lt;/strong&gt; sacrifices generality (it cannot efficiently handle non-matrix operations) and removes hardware units irrelevant to AI, dedicating all released resources to matrix operation units. This gives TPUs higher computational efficiency when processing large-scale static computation graphs in specific formats (such as bfloat16). However, the development barrier is higher than GPUs when dealing with dynamic control flows or custom operators, usually relying on the XLA compiler and JAX framework for optimization.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  II. Introduction to the Twinkle AI gemma-3–4B-T1-it Model
&lt;/h2&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.amazonaws.com%2Fuploads%2Farticles%2Fop7j1ranjfd2pjfgl70l.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.amazonaws.com%2Fuploads%2Farticles%2Fop7j1ranjfd2pjfgl70l.png" alt="Architecture overview and positioning of the Twinkle AI Gemma-3–4B-T1-it large language model optimized for the Taiwanese context" width="799" height="447"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
(Image Source: Huggingface)&lt;/p&gt;

&lt;p&gt;gemma-3-4B-T1-it is a 4B parameter model launched by Twinkle AI based on the Google Gemma 3 architecture. It aims to solve the "alignment drift" problem caused by uneven data in mainstream foundation models and to practice the concept of "Sovereign AI."&lt;/p&gt;

&lt;p&gt;The model has been deeply optimized for the Taiwanese context, correcting:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Vocabulary Misuse/Appropriation: (e.g., distinguishing between terms for "quality" and "mass").&lt;/li&gt;
&lt;li&gt;Legal and Institutional Hallucinations: (Citing current laws of the Republic of China rather than laws of the PRC).&lt;/li&gt;
&lt;li&gt;Cultural Meme Disconnects: (Understanding internet slang from communities like PTT and Dcard).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Through Gemma 3's "Local-Global Hybrid Attention Mechanism" and a 128K token context window, T1–4B-it achieves deep cultural alignment at a lightweight scale, positioning itself as a language model focused on Agent workflows and local needs.&lt;/p&gt;

&lt;p&gt;regarding dataset selection and ecosystem collaboration, T1–4B-it adopts a rigorous data strategy. Training data includes lianghsun/tw-reasoning-instruct (reasoning instructions) designed for the Taiwan context, nvidia/Nemotron (instruction following), lianghsun/tw-contract-review-chat (contract review), and Chain of Thought (CoT) data prepared by Kerg (such as tw_mm_R1). We thank APMIC for providing critical computing support for the infrastructure to make this possible.&lt;/p&gt;

&lt;p&gt;For architecture designed to strengthen Function Calling, T1–4B-it specifically introduces the Hermes Tool-call Parser format for training, equipping it with powerful Agent capabilities. The model can handle four levels of complex calling scenarios: single function, multiple functions, parallel functions, and parallel multiple functions. In the BFCL evaluation, the model achieved an overall accuracy of 84.5%, with performance on multiple Abstract Syntax Trees (AST) reaching as high as 89%. This demonstrates that at the 4B parameter magnitude, it possesses tool usage and automated execution capabilities surpassing many 7B or 13B models.&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.amazonaws.com%2Fuploads%2Farticles%2Fvg721aoi8ptfi0q50g5i.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.amazonaws.com%2Fuploads%2Farticles%2Fvg721aoi8ptfi0q50g5i.png" alt="Example of Google ADK handling parallel function calling and tool execution within an AI Agent workflow" width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Example: Using Google ADK to handle parallel function processing simultaneously.&lt;/p&gt;

&lt;p&gt;For detailed information, please visit HuggingFace:&lt;br&gt;&lt;br&gt;
&lt;a href="https://huggingface.co/twinkle-ai/gemma-3-4B-T1-it" rel="noopener noreferrer"&gt;twinkle-ai/gemma-3-4B-T1-it&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  III. Hands-on: Launching an AI Agent Service on Google Colab via VLLM and Google ADK
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;If you are not familiar with Google ADK tools, you can read this article first: &lt;a href="https://medium.com/@simon3458/google-adk-tools-intro-202504-3181fd6ab567" rel="noopener noreferrer"&gt;https://medium.com/@simon3458/google-adk-tools-intro-202504-3181fd6ab567&lt;/a&gt;&lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2Fcqmtx41m5p96cc7rlr2m.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.amazonaws.com%2Fuploads%2Farticles%2Fcqmtx41m5p96cc7rlr2m.png" alt="End-to-end architecture diagram showing deployment of a Gemma-3–4B-T1-it AI Agent on Google Colab with TPU, vLLM, LiteLLM, and Google ADK" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
(Thanks to Twinkle AI community friend Thomas for assisting with the graphics!)&lt;/p&gt;

&lt;p&gt;The main goal of this project is to deploy a Twinkle AI Gemma 3 T1 4B model in a Google Colab TPU v5e-1 environment and transform it into an AI Agent capable of executing specific tasks.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://colab.research.google.com/github/LiuYuWei/gemma-t1-4b-adk-agent/blob/main/gemma-t1-4b-adk-agent-colab-workflow-20260107-v2.ipynb" rel="noopener noreferrer"&gt;Google Colab Notebook Link&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Environment Preparation and Dependency Installation
&lt;/h3&gt;

&lt;p&gt;Hardware Setup: Confirm the current execution environment is Google TPU v5e-1, hardware designed specifically to accelerate machine learning workloads.&lt;/p&gt;

&lt;p&gt;Core Packages: Install the vLLM inference engine that supports TPU acceleration; this is key to making the model run fast. Simultaneously install OpenAI SDK and LiteLLM for subsequent API connection and forwarding.&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.amazonaws.com%2Fuploads%2Farticles%2Fye7af80psukszlc14x5e.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.amazonaws.com%2Fuploads%2Farticles%2Fye7af80psukszlc14x5e.png" alt="Screenshot of dependency installation and environment setup steps in Google Colab for TPU-based AI inference" width="795" height="325"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Launching vLLM Inference Service
&lt;/h3&gt;

&lt;p&gt;Load Model: Start the vLLM server via terminal commands and load the Twinkle AI Gemma-3–4B-T1-it model.&lt;/p&gt;

&lt;p&gt;Enable Advanced Features: Configure parameters at startup to enable the model's "Auto Tool Choice" and "Hermes Tool Parser," giving the model the ability to understand and call external tools.&lt;/p&gt;

&lt;p&gt;Verify Service Status:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check if the model API is successfully online.&lt;/li&gt;
&lt;li&gt;Perform simple conversation tests to confirm the model responds normally.&lt;/li&gt;
&lt;li&gt;Critical Test: Test if the model can correctly parse "Function Calling" (e.g., asking about database structures to confirm the model returns the correct tool execution request).&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.amazonaws.com%2Fuploads%2Farticles%2F5q6zdtru9g0gf2jbgq4x.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.amazonaws.com%2Fuploads%2Farticles%2F5q6zdtru9g0gf2jbgq4x.png" alt="Console output showing successful vLLM service startup and function calling verification results" width="800" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Setting up the LiteLLM API Bridge
&lt;/h3&gt;

&lt;p&gt;Configure Forwarding Rules: Create a configuration file to forward standard API requests to the backend vLLM service. This step is to standardize the model interface for compatibility with Google ADK.&lt;/p&gt;

&lt;p&gt;Start Proxy Service: Launch the LiteLLM proxy server in the background and monitor it until the service is fully ready (model list appears).&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Integrating Google ADK (Agent Development Kit)
&lt;/h3&gt;

&lt;p&gt;Get Agent Example: Download a pre-written Stock Query Agent example project from GitHub.&lt;/p&gt;

&lt;p&gt;Install Agent Dependencies: Install the Python packages required for the Agent project.&lt;/p&gt;

&lt;p&gt;Set Environment Variables: Configure the keys and API addresses needed for the Agent connection, pointing them to the LiteLLM service we just set up.&lt;/p&gt;

&lt;p&gt;Run and Test Agent: Launch the Google ADK command-line interface and actually converse with the Agent (e.g., asking for TSMC's stock price). At this point, the Agent will automatically determine the need, call the stock query tool, retrieve data, and finally use the Gemma model to generate a natural language response.&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.amazonaws.com%2Fuploads%2Farticles%2Fqka1lsew6n46gnr45p6k.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.amazonaws.com%2Fuploads%2Farticles%2Fqka1lsew6n46gnr45p6k.png" alt="Terminal interaction showing Google ADK Agent querying stock information and invoking tools automatically" width="800" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5. (Optional) Establishing a Remote Development Tunnel
&lt;/h3&gt;

&lt;p&gt;Setup ngrok: Use the ngrok tool to expose the API service inside Colab to the public internet.&lt;/p&gt;

&lt;p&gt;Local Connection: This allows developers to develop the ADK frontend or logic on their local machine while leaving the heavy model inference computations to run on the TPU in Colab, achieving an efficient "Local Development, Cloud Inference" model.&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.amazonaws.com%2Fuploads%2Farticles%2Ftb5emr9o8z5ipcepkxx4.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.amazonaws.com%2Fuploads%2Farticles%2Ftb5emr9o8z5ipcepkxx4.png" alt="Diagram illustrating use of ngrok to expose Colab-based AI Agent services for local development" width="799" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This process demonstrates the complete integration from underlying model deployment and mid-layer API forwarding to upper-layer Agent application logic, utilizing Google Colab's TPU computing power to build intelligent AI applications.&lt;/p&gt;




&lt;h2&gt;
  
  
  IV. Conclusion
&lt;/h2&gt;

&lt;p&gt;This hands-on exercise is not only a display of a technology stack but also verifies the huge potential of combining "Specialized Hardware" with "Localized Small Models."&lt;/p&gt;

&lt;p&gt;Through the specialized acceleration of Google TPU v5e, we proved that even a lightweight model at the 4B parameter level, when paired with high-quality localized instruction fine-tuning (such as the efforts of Twinkle AI Gemma-3-T1-it) and an appropriate inference framework (vLLM + Google ADK), can demonstrate logical reasoning and tool usage capabilities that transcend its size class.&lt;/p&gt;

&lt;p&gt;This solution offers three important insights for developers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Compute is no longer a high wall: TPUs provide an efficient alternative to GPUs. Through platforms like Colab, developers can access powerful matrix computing resources with a lower barrier to entry.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Localization is crucial: The performance of the Twinkle AI model proves that models which solve "cultural disconnects" and "regulatory hallucinations" are better suited for actual business and life scenarios—an advantage general-purpose models struggle to replace.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Standardization of Agent Development: The introduction of Google ADK and standardized APIs (LiteLLM) evolves Agent development from "hand-crafting Prompts" to modular engineering practices, significantly improving development efficiency and stability.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With the open-sourcing of the Google Gemma 3 architecture and the ubiquity of TPU cloud resources, we are on the eve of a blossoming of AI applications. I hope this tutorial helps developers in various fields quickly build intelligent assistants that understand local languages and solve real problems, truly realizing the democratization and innovation of AI technology.&lt;/p&gt;




&lt;h2&gt;
  
  
  I am Simon
&lt;/h2&gt;

&lt;p&gt;Hello everyone, I am Simon Liu (Liu Yu-wei), an AI Solutions Expert and currently a Google Developer Expert (AI Role). I look forward to helping enterprises implement Artificial Intelligence technologies to solve problems.&lt;/p&gt;

&lt;p&gt;If this article was helpful to you, please give it a clap on Medium and follow my personal account so you can read my future articles at any time. You are welcome to leave comments on my LinkedIn to provide feedback and discuss AI-related topics with me. I look forward to being of help to everyone!&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.amazonaws.com%2Fuploads%2Farticles%2F8oti6it5wd2xc194jx5t.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.amazonaws.com%2Fuploads%2Farticles%2F8oti6it5wd2xc194jx5t.png" alt="Portrait photo of Simon Liu, AI Solutions Expert and Google GenAI Developer Expert" width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My Personal Website:&lt;br&gt;&lt;br&gt;
&lt;a href="https://simonliuyuwei.my.canva.site/link-in-bio" rel="noopener noreferrer"&gt;https://simonliuyuwei.my.canva.site/link-in-bio&lt;/a&gt;&lt;/p&gt;

</description>
      <category>gemma</category>
      <category>agents</category>
      <category>tpu</category>
      <category>google</category>
    </item>
  </channel>
</rss>
