<?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: Facundo Olcese</title>
    <description>The latest articles on DEV Community by Facundo Olcese (@olcesefacundo97).</description>
    <link>https://dev.to/olcesefacundo97</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3927677%2F145b0e1e-055d-4af5-aaf6-c1c69560ec42.jpg</url>
      <title>DEV Community: Facundo Olcese</title>
      <link>https://dev.to/olcesefacundo97</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/olcesefacundo97"/>
    <language>en</language>
    <item>
      <title>I Built a Gemma 4 Copilot for the Most Underrated Bottleneck in Software Delivery</title>
      <dc:creator>Facundo Olcese</dc:creator>
      <pubDate>Wed, 13 May 2026 03:30:42 +0000</pubDate>
      <link>https://dev.to/olcesefacundo97/i-built-a-gemma-4-copilot-for-the-most-underrated-bottleneck-in-software-delivery-393l</link>
      <guid>https://dev.to/olcesefacundo97/i-built-a-gemma-4-copilot-for-the-most-underrated-bottleneck-in-software-delivery-393l</guid>
      <description>&lt;p&gt;Functional analysts live in the messy middle of software delivery.&lt;/p&gt;

&lt;p&gt;Before engineers can estimate, before QA can test, and before stakeholders can approve scope, someone has to translate raw product ambiguity into something the team can actually use.&lt;/p&gt;

&lt;p&gt;That work usually means writing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;user stories&lt;/li&gt;
&lt;li&gt;acceptance criteria&lt;/li&gt;
&lt;li&gt;QA test cases&lt;/li&gt;
&lt;li&gt;risk matrices&lt;/li&gt;
&lt;li&gt;stakeholder summaries&lt;/li&gt;
&lt;li&gt;technical notes&lt;/li&gt;
&lt;li&gt;Jira-ready tickets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is valuable work, but it is also repetitive, time-consuming, and easy to underestimate.&lt;/p&gt;

&lt;p&gt;So for the &lt;a href="https://dev.to/challenges/google-gemma-2026-05-06"&gt;Build With Gemma 4 DEV Challenge&lt;/a&gt;, I built &lt;strong&gt;Gemma Functional Analyst Copilot&lt;/strong&gt;: a production-deployed AI workspace that uses Gemma 4 to accelerate software delivery documentation.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repository: &lt;a href="https://github.com/olcesefacundo97/gemma-functional-analyst-copilot" rel="noopener noreferrer"&gt;github.com/olcesefacundo97/gemma-functional-analyst-copilot&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Live frontend: &lt;a href="https://gemma-functional-analyst-copilot-cl.vercel.app" rel="noopener noreferrer"&gt;gemma-functional-analyst-copilot-cl.vercel.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Live backend: &lt;a href="https://gemma-functional-analyst-copilot.onrender.com" rel="noopener noreferrer"&gt;gemma-functional-analyst-copilot.onrender.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Production model: &lt;code&gt;models/gemma-4-26b-a4b-it&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Idea
&lt;/h2&gt;

&lt;p&gt;Most teams do not start with clean requirements.&lt;/p&gt;

&lt;p&gt;They start with meeting notes, partial tickets, stakeholder comments, support escalations, Slack threads, screenshots, and "we will define this later" assumptions.&lt;/p&gt;

&lt;p&gt;A functional analyst then has to turn that into structured artifacts like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"As a user..." stories&lt;/li&gt;
&lt;li&gt;testable acceptance criteria&lt;/li&gt;
&lt;li&gt;QA scenarios&lt;/li&gt;
&lt;li&gt;product and delivery risks&lt;/li&gt;
&lt;li&gt;technical summaries&lt;/li&gt;
&lt;li&gt;stakeholder-friendly summaries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal of this project was not to build another generic chatbot. It was to put Gemma 4 inside a specific workflow that analysts, PMs, and QA engineers already recognize.&lt;/p&gt;

&lt;p&gt;The app lets a user paste rough requirements, add project context, choose the type of deliverable, and generate an editable Markdown artifact that can be copied into Jira, Confluence, a test plan, or a stakeholder document.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Gemma 4
&lt;/h2&gt;

&lt;p&gt;The production backend is configured to use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;models/gemma-4-26b-a4b-it
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I chose this Gemma 4 model because the task is not just summarization.&lt;/p&gt;

&lt;p&gt;Functional analysis requires the model to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reason over incomplete requirements&lt;/li&gt;
&lt;li&gt;identify assumptions and open questions&lt;/li&gt;
&lt;li&gt;structure output consistently&lt;/li&gt;
&lt;li&gt;adapt tone for technical and non-technical audiences&lt;/li&gt;
&lt;li&gt;generate QA scenarios that are specific enough to test&lt;/li&gt;
&lt;li&gt;avoid pretending that missing information is known&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Gemma 4's MoE architecture is a good fit for this kind of structured reasoning workload: strong enough to produce useful delivery artifacts, but still practical to consume through hosted inference.&lt;/p&gt;

&lt;p&gt;For this submission, I used hosted inference through the Google AI Studio API via the Google GenAI SDK. That made the project easier to deploy as a public demo while still using real Gemma 4 inference in production.&lt;/p&gt;

&lt;h2&gt;
  
  
  What It Generates
&lt;/h2&gt;

&lt;p&gt;The app currently supports several analyst-oriented output types:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Agile user stories&lt;/li&gt;
&lt;li&gt;acceptance criteria&lt;/li&gt;
&lt;li&gt;QA test cases&lt;/li&gt;
&lt;li&gt;technical summaries&lt;/li&gt;
&lt;li&gt;stakeholder summaries&lt;/li&gt;
&lt;li&gt;risk matrices&lt;/li&gt;
&lt;li&gt;Jira-ready tickets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each output type has a dedicated prompt structure. For example, QA test cases are generated as a test matrix with scenarios, preconditions, steps, expected results, priority, and test type. Risk matrices include severity, probability, business impact, early warning signals, mitigations, and likely owners.&lt;/p&gt;

&lt;p&gt;The intent is practical: give the analyst a strong first draft, then keep the human in control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;The project is a small but real production stack:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;React + Vite + TypeScript frontend
        |
        | POST /analyze
        v
FastAPI backend
        |
        | Google GenAI SDK
        v
Google AI Studio hosted Gemma 4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Frontend
&lt;/h3&gt;

&lt;p&gt;The frontend is built with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;li&gt;Vite&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;Tailwind CSS&lt;/li&gt;
&lt;li&gt;local storage for prompt history&lt;/li&gt;
&lt;li&gt;Markdown/TXT/JSON export helpers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is deployed on Vercel:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://gemma-functional-analyst-copilot-cl.vercel.app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The UI is intentionally closer to a delivery workspace than a landing page. The main path is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;paste requirements&lt;/li&gt;
&lt;li&gt;choose a deliverable&lt;/li&gt;
&lt;li&gt;generate output&lt;/li&gt;
&lt;li&gt;review insights and warnings&lt;/li&gt;
&lt;li&gt;export or copy the result&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Backend
&lt;/h3&gt;

&lt;p&gt;The backend is built with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;FastAPI&lt;/li&gt;
&lt;li&gt;Pydantic schemas&lt;/li&gt;
&lt;li&gt;CORS configuration for the Vercel origin&lt;/li&gt;
&lt;li&gt;provider abstraction&lt;/li&gt;
&lt;li&gt;Google GenAI SDK integration&lt;/li&gt;
&lt;li&gt;demo provider fallback for local development&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is deployed on Render:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://gemma-functional-analyst-copilot.onrender.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The backend uses environment variables to choose the provider and model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AI_PROVIDER=google
GOOGLE_API_KEY=&amp;lt;configured in Render&amp;gt;
GEMMA_MODEL=models/gemma-4-26b-a4b-it
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The provider abstraction matters because it let me build and test the product UI before production inference was fully stable, while still making the production path use real Gemma 4.&lt;/p&gt;

&lt;h2&gt;
  
  
  Screenshots
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Landing Page
&lt;/h3&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%2F0nmgwykaeyt3iiviwn35.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%2F0nmgwykaeyt3iiviwn35.png" alt="Landing page" width="800" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  User Story Generation
&lt;/h3&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%2F2bblo3s9k8e689rnoc94.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%2F2bblo3s9k8e689rnoc94.png" alt="User story generation" width="800" height="884"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Risk Matrix Generation
&lt;/h3&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%2Fos21ystqjictpz8v0uff.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%2Fos21ystqjictpz8v0uff.png" alt="Risk matrix generation" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  QA Test Case Generation
&lt;/h3&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%2Fdknxrvrm8ph8dq4ojt87.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%2Fdknxrvrm8ph8dq4ojt87.png" alt="QA test case generation" width="800" height="884"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Debugging Story
&lt;/h2&gt;

&lt;p&gt;This was the most valuable part of the build.&lt;/p&gt;

&lt;p&gt;The first version of the app worked in demo mode. That was useful for UI development, but it was not enough for the challenge. I wanted production to prove that the backend was calling Gemma 4 for real.&lt;/p&gt;

&lt;p&gt;The journey looked like this:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Start With Demo Mode
&lt;/h3&gt;

&lt;p&gt;The backend originally had a static demo provider so the frontend could be designed without depending on API keys, quotas, or provider availability.&lt;/p&gt;

&lt;p&gt;That helped move quickly, but it also created a risk: a nice demo that did not actually validate Gemma 4 inference.&lt;/p&gt;

&lt;p&gt;So I made production validation explicit. Successful responses needed to return the configured model and generate scenario-specific content that was clearly not the static demo template.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Hit Invalid Model IDs
&lt;/h3&gt;

&lt;p&gt;The first Google provider attempts failed because I used short model names.&lt;/p&gt;

&lt;p&gt;The important discovery was that the hosted API expected the full model resource ID:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;models/gemma-4-26b-a4b-it
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Short names like this were not enough in this deployment path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gemma-4-26b-a4b-it
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To make the backend more robust, I added model resolution logic that maps legacy or short Gemma IDs back to the correct production ID.&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="n"&gt;DEFAULT_GEMMA_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;models/gemma-4-26b-a4b-it&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;LEGACY_GEMMA_MODELS&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;gemma-3-27b-it&lt;/span&gt;&lt;span class="sh"&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;models/gemma-3-27b-it&lt;/span&gt;&lt;span class="sh"&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;gemma-4-26b-a4b-it&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;h3&gt;
  
  
  3. Validate Accessible Models Dynamically
&lt;/h3&gt;

&lt;p&gt;I also added a diagnostic path for listing Gemma models exposed to the configured Google API key.&lt;/p&gt;

&lt;p&gt;That made it possible to confirm what the account could actually access instead of guessing from docs or model names.&lt;/p&gt;

&lt;p&gt;The backend filters model listings for Gemma-related entries and checks whether each model supports &lt;code&gt;generateContent&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That small diagnostic step saved a lot of time.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Fix Render Deployment Issues
&lt;/h3&gt;

&lt;p&gt;The Render deploy had its own lesson.&lt;/p&gt;

&lt;p&gt;At one point, the service startup was wrong because of a gunicorn command mismatch. The app is FastAPI, so the deployment needed a production command that actually launches the ASGI app correctly.&lt;/p&gt;

&lt;p&gt;The final backend deploy uses the Render service configuration from the repository and starts the API with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;uvicorn app.main:app --host 0.0.0.0 --port $PORT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once the startup command, environment variables, CORS, and model ID were aligned, the production backend began returning real Gemma 4 responses.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Prove Production Success
&lt;/h3&gt;

&lt;p&gt;The final validation checked both direct backend calls and browser-based frontend flows.&lt;/p&gt;

&lt;p&gt;A successful production response includes the real model:&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"models/gemma-4-26b-a4b-it"&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;p&gt;The generated content also changed based on the input domain, including banking, healthcare, logistics, and public-sector scenarios.&lt;/p&gt;

&lt;p&gt;That was the key signal: the app was no longer serving static demo output. It was using hosted Gemma 4 inference in the deployed product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Production Validation
&lt;/h2&gt;

&lt;p&gt;I ran production validation against the public Vercel frontend and Render backend.&lt;/p&gt;

&lt;p&gt;The final result was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;READY WITH MINOR WARNINGS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What passed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;backend health check&lt;/li&gt;
&lt;li&gt;CORS preflight from the Vercel origin&lt;/li&gt;
&lt;li&gt;frontend loading on Vercel&lt;/li&gt;
&lt;li&gt;browser console check&lt;/li&gt;
&lt;li&gt;frontend-to-backend generation&lt;/li&gt;
&lt;li&gt;real Gemma 4 model verification&lt;/li&gt;
&lt;li&gt;Markdown, TXT, and JSON export&lt;/li&gt;
&lt;li&gt;copy-to-clipboard flow&lt;/li&gt;
&lt;li&gt;responsive checks on desktop, tablet, and mobile&lt;/li&gt;
&lt;li&gt;public GitHub, frontend, backend, and screenshot URLs&lt;/li&gt;
&lt;li&gt;secret scan for obvious committed API keys&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The important honest warning:&lt;/p&gt;

&lt;p&gt;Under repeated production load, some large-model requests returned provider-side &lt;code&gt;503&lt;/code&gt; or &lt;code&gt;504&lt;/code&gt; responses. This was most visible with the Risk Matrix path and occasional retries on other artifact types.&lt;/p&gt;

&lt;p&gt;That is not ideal, but it is a real production behavior worth documenting. The app handled these as provider errors instead of pretending everything was fine.&lt;/p&gt;

&lt;p&gt;The practical lesson: hosted large-model inference can be excellent, but you still need UX and backend behavior that account for latency, retries, and temporary provider failures.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example Backend Call
&lt;/h2&gt;

&lt;p&gt;A direct production request looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://gemma-functional-analyst-copilot.onrender.com/analyze"&lt;/span&gt; &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;'{
    "raw_text": "The city operations team needs a map-first dashboard to monitor active traffic incidents, road closures, and weather impact. Operators need filters by incident type and a details panel for selected events.",
    "output_type": "qa_test_cases",
    "project_context": "Public sector traffic operations MVP",
    "language": "English"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The backend builds a deliverable-specific prompt, sends it to Gemma 4 through the Google GenAI SDK, and returns structured metadata plus the generated Markdown.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;This project taught me more from the integration work than from the happy-path implementation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Model Names Matter
&lt;/h3&gt;

&lt;p&gt;The difference between a short model name and the full hosted model resource ID can be the difference between a working production app and repeated provider errors.&lt;/p&gt;

&lt;p&gt;For this deployment, the correct model was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;models/gemma-4-26b-a4b-it
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Demo Mode Is Useful, But Dangerous
&lt;/h3&gt;

&lt;p&gt;Demo mode helped me build the frontend quickly and made local development easier.&lt;/p&gt;

&lt;p&gt;But for an AI challenge submission, it is not enough for the UI to look good. The app needs proof that production inference is real.&lt;/p&gt;

&lt;p&gt;That is why I validated:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;response model metadata&lt;/li&gt;
&lt;li&gt;dynamic output content&lt;/li&gt;
&lt;li&gt;frontend calls to the deployed backend&lt;/li&gt;
&lt;li&gt;CORS behavior&lt;/li&gt;
&lt;li&gt;exports and UI rendering&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Hosted Open Models Still Need Product Thinking
&lt;/h3&gt;

&lt;p&gt;Even with hosted inference, you need to design around:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;latency&lt;/li&gt;
&lt;li&gt;quota&lt;/li&gt;
&lt;li&gt;provider-side failures&lt;/li&gt;
&lt;li&gt;model availability&lt;/li&gt;
&lt;li&gt;environment variable mistakes&lt;/li&gt;
&lt;li&gt;clear user feedback&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The frontend needs loading states. The backend needs clean errors. The docs need to explain what production is actually doing.&lt;/p&gt;

&lt;h3&gt;
  
  
  AI Output Needs Workflow Context
&lt;/h3&gt;

&lt;p&gt;The most useful output came from prompts that were specific to functional analysis and QA.&lt;/p&gt;

&lt;p&gt;Generic "summarize this" prompting was not enough. The model performed better when each deliverable had a clear structure, role, audience, and expectation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Would Improve Next
&lt;/h2&gt;

&lt;p&gt;Given more time, I would add:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PDF and DOCX ingestion&lt;/li&gt;
&lt;li&gt;Jira API export&lt;/li&gt;
&lt;li&gt;Confluence publishing&lt;/li&gt;
&lt;li&gt;team workspaces&lt;/li&gt;
&lt;li&gt;project-specific prompt libraries&lt;/li&gt;
&lt;li&gt;evaluation tests for artifact quality&lt;/li&gt;
&lt;li&gt;retry/backoff controls for provider instability&lt;/li&gt;
&lt;li&gt;async job handling for long-running generations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The async generation path is especially interesting. Some production calls took long enough that a job-based UX would be better than keeping the user inside a single request-response wait.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Gemma Functional Analyst Copilot is a practical example of using Gemma 4 inside a real software delivery workflow.&lt;/p&gt;

&lt;p&gt;It does not try to replace analysts. It tries to remove the blank-page problem from repetitive documentation work so analysts can spend more time reviewing, correcting, challenging assumptions, and aligning teams.&lt;/p&gt;

&lt;p&gt;The build also reinforced a very normal engineering truth: the demo is only half the work. The rest is deployment, configuration, validation, debugging, and telling the truth about what happened.&lt;/p&gt;

&lt;p&gt;Try it here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gemma-functional-analyst-copilot-cl.vercel.app" rel="noopener noreferrer"&gt;Live frontend&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gemma-functional-analyst-copilot.onrender.com/health" rel="noopener noreferrer"&gt;Backend health endpoint&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/olcesefacundo97/gemma-functional-analyst-copilot" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Challenge tags:&lt;/p&gt;

&lt;h1&gt;
  
  
  devchallenge #gemmachallenge #gemma #ai #react #fastapi
&lt;/h1&gt;

</description>
      <category>devchallenge</category>
      <category>gemmachallenge</category>
      <category>gemma</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
