<?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: Mohammed Ayaan Adil Ahmed</title>
    <description>The latest articles on DEV Community by Mohammed Ayaan Adil Ahmed (@mohammed_ayaanadilahmed).</description>
    <link>https://dev.to/mohammed_ayaanadilahmed</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%2F3356864%2F267bb4b2-d0a7-4b9e-9bf5-c0d50903bfbe.jpg</url>
      <title>DEV Community: Mohammed Ayaan Adil Ahmed</title>
      <link>https://dev.to/mohammed_ayaanadilahmed</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mohammed_ayaanadilahmed"/>
    <language>en</language>
    <item>
      <title>Building Meridian: An Autonomous Multi-Agent AI Scheduler with Gemini 3.1</title>
      <dc:creator>Mohammed Ayaan Adil Ahmed</dc:creator>
      <pubDate>Tue, 14 Apr 2026 15:10:43 +0000</pubDate>
      <link>https://dev.to/mohammed_ayaanadilahmed/building-meridian-an-autonomous-multi-agent-ai-scheduler-with-gemini-31-4155</link>
      <guid>https://dev.to/mohammed_ayaanadilahmed/building-meridian-an-autonomous-multi-agent-ai-scheduler-with-gemini-31-4155</guid>
      <description>&lt;h1&gt;
  
  
  🚀 The Vision: Beyond Static Scheduling
&lt;/h1&gt;

&lt;p&gt;Scheduling meetings is a universal friction point. We've all experienced the "email tag" fatigue and the loss of context once a meeting ends. For the &lt;strong&gt;Google Cloud Gen AI Academy APAC Edition&lt;/strong&gt;, my teammate &lt;strong&gt;Bibi Sufiya Shariff&lt;/strong&gt; and I built &lt;strong&gt;Meridian&lt;/strong&gt;. An autonomous multi-agent system designed to handle the entire meeting lifecycle.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 The Architecture: Orchestrator &amp;amp; Sub-Agents
&lt;/h2&gt;

&lt;p&gt;Meridian isn't a single script; it’s a fleet of specialized agents coordinated by a central "brain."&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Orchestrator (Gemini 3.1):&lt;/strong&gt; Using Vertex AI, the orchestrator parses natural language intent and dynamically delegates tasks to sub-agents based on the context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Calendar Agent:&lt;/strong&gt; Interfaces with the Google Calendar API to surface real-time availability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Email Agent:&lt;/strong&gt; Handles automated dispatch of invites and notifications.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transcription &amp;amp; Summary Agents:&lt;/strong&gt; Processes audio/text post-meeting to extract action items and summaries.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  💎 The USP: "Glass Box" Transparency
&lt;/h2&gt;

&lt;p&gt;A major challenge with AI agents is trust. Users often feel like they are interacting with a "black box." &lt;/p&gt;

&lt;p&gt;We solved this by implementing a &lt;strong&gt;Real-time Agent Trace&lt;/strong&gt;. Using &lt;strong&gt;Server-Sent Events (SSE)&lt;/strong&gt;, Meridian streams the agent’s internal reasoning, tool calls, and state changes directly to the UI. You can watch the AI "think" and "act" in real-time.&lt;/p&gt;

&lt;h2&gt;
  
  
  🛠️ The Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; Next.js (App Router) for a premium, high-aesthetic dashboard.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; FastAPI (Python) serving as the Agent Hub.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Layer:&lt;/strong&gt; Google Vertex AI (Gemini 3.1).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persistence:&lt;/strong&gt; Google Cloud SQL (PostgreSQL).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hosting:&lt;/strong&gt; Google Cloud Run for scalable, containerized deployment.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📈 Roadmap &amp;amp; Future Scope
&lt;/h2&gt;

&lt;p&gt;This is just the beginning. We're looking forward to expanding Meridian with:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Collaborative Workspaces:&lt;/strong&gt; Multi-user calendar comparison for team-wide scheduling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deep Memory:&lt;/strong&gt; Using persistent agent state to remember context across months of meetings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bio-rhythm Optimization:&lt;/strong&gt; Suggesting slots based on user productivity patterns.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Building Meridian has been an incredible journey in exploring the limits of agentic workflows. A huge thank you to the Google Cloud team for the support!&lt;/p&gt;




&lt;h3&gt;
  
  
  🔗 Stay Connected
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LinkedIn:&lt;/strong&gt; &lt;a href="https://www.linkedin.com/in/mohammed-ayaan-adil-ahmed-540868311/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/mohammed-ayaan-adil-ahmed-540868311/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check out the project and let us know what you think in the comments! 👇&lt;/p&gt;

&lt;h1&gt;
  
  
  machinelearning #productivity #webdev #googlecloud
&lt;/h1&gt;

</description>
      <category>googlecloud</category>
      <category>ai</category>
      <category>architecture</category>
      <category>nextjs</category>
    </item>
    <item>
      <title>Moving LLMs to the Edge: Building a Private AI Study Companion with Llama 3</title>
      <dc:creator>Mohammed Ayaan Adil Ahmed</dc:creator>
      <pubDate>Wed, 18 Mar 2026 16:02:49 +0000</pubDate>
      <link>https://dev.to/mohammed_ayaanadilahmed/moving-llms-to-the-edge-building-a-private-ai-study-companion-with-llama-3-5ga1</link>
      <guid>https://dev.to/mohammed_ayaanadilahmed/moving-llms-to-the-edge-building-a-private-ai-study-companion-with-llama-3-5ga1</guid>
      <description>&lt;h1&gt;
  
  
  Moving LLMs to the Edge: Building a Private AI Study Companion with Llama 3
&lt;/h1&gt;

&lt;p&gt;Most AI tutors are just wrappers around an API. When my teammate Ahmed Mohammed Ayaan Adil and I sat down to build &lt;strong&gt;Brain Dump&lt;/strong&gt;, we wanted to solve two specific problems: the &lt;strong&gt;stateless&lt;/strong&gt; nature of current AI tools and the high cost/privacy concerns of cloud-based learning.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 The Core Concept: The "Living Knowledge File"
&lt;/h2&gt;

&lt;p&gt;Instead of just chatting, Brain Dump acts as a &lt;strong&gt;distillation engine&lt;/strong&gt;. It converts messy, long-form learning conversations into a structured, personal &lt;strong&gt;Knowledge File&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Think of it as your brain’s notes, but automatically organized and refined by AI as you learn. It doesn't just "forget" the context after a session; it builds a persistent map of what you actually know.&lt;/p&gt;

&lt;h2&gt;
  
  
  🛠️ The Tech Stack
&lt;/h2&gt;

&lt;p&gt;We focused on local execution to keep the data where it belongs—with the user.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Orchestrator:&lt;/strong&gt; FastAPI and LangChain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Hardware Edge:&lt;/strong&gt; Optimized for NPU (Neural Processing Unit) integration to offload LLM tasks from the CPU.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local LLM:&lt;/strong&gt; We utilized the &lt;strong&gt;ROCm stack&lt;/strong&gt; to run &lt;strong&gt;Llama 3 8B&lt;/strong&gt; locally, ensuring low latency without a subscription fee.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why the Edge?
&lt;/h3&gt;

&lt;p&gt;Running locally reduces the marginal cost per user to near-zero. More importantly, it ensures that a student's learning process—including their specific "hiccups" and knowledge gaps—stays private on their own machine rather than being fed back into a corporate training set.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚡ Key Feature: Hiccup Detection &amp;amp; Pathway Engine
&lt;/h2&gt;

&lt;p&gt;We didn't want a passive chatbot that just nods along. We built a custom &lt;strong&gt;Hiccup Detection Chain&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;When the system detects a gap in prerequisite knowledge (a "hiccup"), it doesn't just re-explain the current topic. Instead, it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Pauses&lt;/strong&gt; the current lesson flow.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Generates&lt;/strong&gt; a targeted 10-minute micro-learning pathway to fix the specific misunderstanding.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Resumes&lt;/strong&gt; the main topic only once the foundational gap is bridged.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  💡 Reflections
&lt;/h2&gt;

&lt;p&gt;Optimizing a local LLM to handle real-time distillation was a massive technical win. It proved that we are moving toward a world where powerful, personalized AI doesn't require a constant "umbilical cord" to a cloud provider.&lt;/p&gt;

&lt;h3&gt;
  
  
  Check out the code here:
&lt;/h3&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/git791" rel="noopener noreferrer"&gt;
        git791
      &lt;/a&gt; / &lt;a href="https://github.com/git791/Brain-Dump" rel="noopener noreferrer"&gt;
        Brain-Dump
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      AI study companion that learns alongside you — automatically extracts concepts from your chat into a personal knowledge file, detects when you're stuck and serves a targeted learning pathway, and exports notes to Anki/Notion. Built with Python, Streamlit &amp;amp; Gemini API, with an AMD ROCm branch for fully offline on-device inference.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;📚 Study Companion — Beginner's Guide&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A smart study chatbot that helps you learn topics, tracks what you know, and gives you a step-by-step plan when you're stuck.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🧠 What Does This App Do?&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;You type questions or topics you're studying. The app:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Answers your questions like a tutor&lt;/li&gt;
&lt;li&gt;Automatically saves concepts and definitions you've learned&lt;/li&gt;
&lt;li&gt;Gives you a 10-minute action plan when you say "I'm stuck"&lt;/li&gt;
&lt;li&gt;Lets you export your notes to Markdown, Anki flashcards, or Notion&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;📁 What Each File Does&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;What it is&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;app.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The entire app — all the code lives here&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.env&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Your secret API key — never share this&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.gitignore&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tells git which files to NOT upload to GitHub&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;requirements.txt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;List of libraries the app needs to run&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;knowledge_notes.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Auto-created when you run the app — stores your saved notes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;⚙️ How to Set It Up (First Time)&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Step 1 — Install Python&lt;/h3&gt;…&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/git791/Brain-Dump" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;







&lt;p&gt;&lt;strong&gt;How are you integrating local LLMs into your workflow? Let's discuss in the comments!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>machinelearning</category>
      <category>ai</category>
      <category>python</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Designing a "Living" UI: Prototyping Emotional Residue in Figma</title>
      <dc:creator>Mohammed Ayaan Adil Ahmed</dc:creator>
      <pubDate>Tue, 17 Mar 2026 15:58:28 +0000</pubDate>
      <link>https://dev.to/mohammed_ayaanadilahmed/designing-a-living-ui-prototyping-emotional-residue-in-figma-4c0j</link>
      <guid>https://dev.to/mohammed_ayaanadilahmed/designing-a-living-ui-prototyping-emotional-residue-in-figma-4c0j</guid>
      <description>&lt;h1&gt;
  
  
  The Systems Thinking Behind the Aura
&lt;/h1&gt;

&lt;p&gt;We have instruments for the physical body, but nothing for the invisible labor of emotional presence. For our project &lt;strong&gt;Tide&lt;/strong&gt;, we wanted to create a bio-responsive interface that visualizes "social proprioception"—the implicit awareness of emotional proximity and relational pressure.&lt;/p&gt;

&lt;h2&gt;
  
  
  🛠 The Build: Logic Over Pixels
&lt;/h2&gt;

&lt;p&gt;Rather than just drawing screens, we built Tide as a functional simulation within Figma. We leveraged:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Figma Variables &amp;amp; Expressions:&lt;/strong&gt; To track the "Emotional Reserve" and dynamically update UI states based on user interaction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Advanced Prototyping:&lt;/strong&gt; Utilizing "Smart Animate" and "After Delay" triggers to create the organic, bioluminescent pulse of the aura system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Component Properties:&lt;/strong&gt; To handle the complex transitions between data-heavy states and ambient visualizations.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧮 The Math of Empathy
&lt;/h2&gt;

&lt;p&gt;To make Tide more than just a visualizer, we modeled a caregiver's emotional reserve &lt;strong&gt;R(t)&lt;/strong&gt; over a session using this integral:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;R(t) = R₀ - ∫₀ᵗ α I(τ) dτ&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;R₀&lt;/strong&gt; is the starting reserve.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;I(τ)&lt;/strong&gt; is the emotional intensity.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;α&lt;/strong&gt; is the individual’s absorption coefficient.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tide makes this "empathy calculus" visible in real-time, helping users identify depletion before it leads to burnout.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎨 Visualizing "Bioluminescence"
&lt;/h2&gt;

&lt;p&gt;The hardest challenge was making data feel &lt;em&gt;felt&lt;/em&gt;, not just seen. We moved away from rigid charts and used layered gradients and noise textures in Figma to create a glowing, organic UI.&lt;/p&gt;

&lt;h3&gt;
  
  
  Compassion Mode: The Interaction Logic
&lt;/h3&gt;

&lt;p&gt;Highly empathetic users are often already overwhelmed by the signals they absorb. A tool that surfaces &lt;em&gt;more&lt;/em&gt; raw data could make things worse.&lt;/p&gt;

&lt;p&gt;We implemented &lt;strong&gt;"Compassion Mode"&lt;/strong&gt;—a single toggle that shifts the UI from high-fidelity data points to ambient "weather" patterns. It resolves the tension between personal insight and cognitive fatigue by turning "raindrops" of data into a soft, atmospheric glow.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔗 Explore the Project
&lt;/h2&gt;

&lt;p&gt;To see the "Living Aura" system and our full design logic, you can explore our Figma files below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://lnkd.in/gyz6Qzc7" rel="noopener noreferrer"&gt;Interactive Prototype&lt;/a&gt;&lt;/strong&gt; — Experience the "Flow Ribbon" and Compassion Mode in action.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://lnkd.in/gx2gUf_j" rel="noopener noreferrer"&gt;The Tide Strategy Deck&lt;/a&gt;&lt;/strong&gt; — A deep dive into the research, sensory systems, and future roadmap.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;What's next?&lt;/strong&gt; The immediate next step is a wearable patch prototype: a non-invasive biosensor that correlates skin conductance and HRV to feed the environmental emotional model Tide currently simulates.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Designed by Bibi Sufiya Shariff and Mohammed Ayaan Adil Ahmed.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>figma</category>
      <category>ux</category>
      <category>productdesign</category>
      <category>prototyping</category>
    </item>
    <item>
      <title>I Built a Live AI First Aid Agent with Gemini 2.5 Flash in 3 Days</title>
      <dc:creator>Mohammed Ayaan Adil Ahmed</dc:creator>
      <pubDate>Sun, 15 Mar 2026 14:12:07 +0000</pubDate>
      <link>https://dev.to/mohammed_ayaanadilahmed/i-built-a-live-ai-first-aid-agent-with-gemini-25-flash-in-3-days-2m8</link>
      <guid>https://dev.to/mohammed_ayaanadilahmed/i-built-a-live-ai-first-aid-agent-with-gemini-25-flash-in-3-days-2m8</guid>
      <description>&lt;h1&gt;
  
  
  How I Built CalmAid — A Live AI First Aid Agent with Gemini 2.5 Flash and Google Cloud Run
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;I created this piece of content for the purposes of entering the Gemini Live Agent Challenge hackathon. #GeminiLiveAgentChallenge&lt;/em&gt;&lt;/p&gt;




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

&lt;p&gt;In an emergency, people panic. They fumble with Google, get walls of text, and waste critical seconds. I wanted to build something that could just &lt;em&gt;talk to you&lt;/em&gt; — calmly, instantly, while also seeing what you're dealing with.&lt;/p&gt;

&lt;p&gt;That became &lt;strong&gt;CalmAid&lt;/strong&gt;: speak the emergency, show the injury, hear step-by-step instructions streaming back in real time.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemini 2.5 Flash&lt;/strong&gt; — multimodal vision + text generation with streaming&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google GenAI SDK&lt;/strong&gt; (&lt;code&gt;google-genai&lt;/code&gt;) — the new SDK, not the deprecated one&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FastAPI&lt;/strong&gt; — async Python backend&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server-Sent Events (SSE)&lt;/strong&gt; — real-time streaming to the browser&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Cloud Run&lt;/strong&gt; — serverless hosting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Secret Manager&lt;/strong&gt; — secure API key storage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web Speech API + Speech Synthesis&lt;/strong&gt; — browser-native voice in and out&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GSAP 3&lt;/strong&gt; — animations&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How Streaming Works
&lt;/h2&gt;

&lt;p&gt;The key insight that makes CalmAid feel &lt;em&gt;live&lt;/em&gt; is that text renders and TTS speaks &lt;strong&gt;simultaneously while Gemini is still generating&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The backend streams via SSE:&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="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;stream_gemini&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate_content_stream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemini-2.5-flash&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;contents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;types&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;GenerateContentConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;system_instruction&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;SYSTEM_PROMPT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;max_output_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;chunk&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;done&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The frontend reads the stream and feeds sentences to a TTS queue the moment a sentence boundary (&lt;code&gt;.&lt;/code&gt;, &lt;code&gt;!&lt;/code&gt;, &lt;code&gt;?&lt;/code&gt;) is detected:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;enqueueSentences&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newText&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;ttsBuffer&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;newText&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;sentences&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ttsBuffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;(?&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;=&lt;/span&gt;&lt;span class="se"&gt;[&lt;/span&gt;&lt;span class="sr"&gt;.!?&lt;/span&gt;&lt;span class="se"&gt;])\s&lt;/span&gt;&lt;span class="sr"&gt;+/&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;ttsBuffer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;sentences&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;sentences&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="nx"&gt;ttsQueue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;ttsActive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;drainTTSQueue&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result: the agent starts speaking before the full response arrives. That's what makes it feel genuinely live.&lt;/p&gt;




&lt;h2&gt;
  
  
  Vision Integration
&lt;/h2&gt;

&lt;p&gt;When a user snaps a photo, it's sent as base64 and converted to a Pillow image on the backend:&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="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;image_b64&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;img_bytes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;b64decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;image_b64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;BytesIO&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;img_bytes&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;convert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;RGB&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;buf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;BytesIO&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;JPEG&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;img_part&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;types&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getvalue&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;mime_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image/jpeg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;img_part&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gemini then describes what it sees and tailors the first aid advice accordingly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Deploying to Cloud Run
&lt;/h2&gt;

&lt;p&gt;The whole deploy is one command thanks to &lt;code&gt;--source .&lt;/code&gt; which triggers Cloud Build automatically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gcloud run deploy calmaid-agent &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--source&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--region&lt;/span&gt; us-central1 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--allow-unauthenticated&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--set-secrets&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"GEMINI_API_KEY=gemini-api-key:latest"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--memory&lt;/span&gt; 512Mi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The API key lives in Secret Manager and gets injected at runtime — never hardcoded, never in the repo.&lt;/p&gt;




&lt;h2&gt;
  
  
  Challenges
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;SSE buffer management&lt;/strong&gt; was trickier than expected. Chunks from the stream reader arrive mid-line, so you have to hold incomplete lines across read cycles:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;buffer&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;decoder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&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;lines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;buffer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// hold incomplete line&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Python 3.13 compatibility&lt;/strong&gt; broke several pinned packages. Pillow 10.x and pydantic 2.7.x don't have prebuilt wheels for 3.13 — bumping to Pillow 11.1.0 and pydantic 2.10.0 fixed it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SDK migration&lt;/strong&gt; — the &lt;code&gt;google-generativeai&lt;/code&gt; package is fully deprecated and streaming was unreliable. Switching to &lt;code&gt;google-genai&lt;/code&gt; resolved it completely.&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;Streaming + TTS together is what makes AI feel &lt;em&gt;live&lt;/em&gt; vs turn-based&lt;/li&gt;
&lt;li&gt;Browser-native Web Speech API and Speech Synthesis are underrated — zero dependencies, instant&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;python:3.11-alpine&lt;/code&gt; cuts Docker image vulnerabilities dramatically vs &lt;code&gt;slim&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Cloud Run + Secret Manager is the cleanest production pattern for API keys&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live app:&lt;/strong&gt; submitted via the Gemini Live Agent Challenge portal&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/git791/Calm-Aid" rel="noopener noreferrer"&gt;https://github.com/git791/Calm-Aid&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Built for the Gemini Live Agent Challenge. #GeminiLiveAgentChallenge&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devchallenge</category>
      <category>gemini</category>
      <category>showdev</category>
    </item>
    <item>
      <title>GreenAI-Agent: Optimizing the Environmental Impact of AI with Gemini</title>
      <dc:creator>Mohammed Ayaan Adil Ahmed</dc:creator>
      <pubDate>Wed, 04 Mar 2026 10:50:41 +0000</pubDate>
      <link>https://dev.to/mohammed_ayaanadilahmed/greenai-agent-optimizing-the-environmental-impact-of-ai-with-gemini-51g0</link>
      <guid>https://dev.to/mohammed_ayaanadilahmed/greenai-agent-optimizing-the-environmental-impact-of-ai-with-gemini-51g0</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/mlh-built-with-google-gemini-02-25-26"&gt;Built with Google Gemini: Writing Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built with Google Gemini
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;GreenAI-Agent&lt;/strong&gt; is an intelligent assistant designed to help developers and organizations monitor and optimize the carbon footprint of their AI workloads. As AI models become more complex, their energy consumption grows; this project solves the "visibility gap" by providing real-time insights into the environmental impact of code execution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Google Gemini&lt;/strong&gt; served as the "brain" of the agent. I used it to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Analyze complex energy usage logs and translate raw data into actionable "green" recommendations.&lt;/li&gt;
&lt;li&gt;Power the natural language interface, allowing users to ask questions like "Which of my functions is consuming the most power?"&lt;/li&gt;
&lt;li&gt;Generate optimized code snippets that prioritize efficiency without sacrificing performance.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;You can find the full source code and documentation here:&lt;br&gt;
GitHub: &lt;a href="https://github.com/git791/GreenAI-Agent" rel="noopener noreferrer"&gt;https://github.com/git791/GreenAI-Agent&lt;/a&gt;&lt;br&gt;
StreamLit: &lt;a href="https://greenai-agent-pgttexvww7m2bpeschkc6n.streamlit.app/" rel="noopener noreferrer"&gt;https://greenai-agent-pgttexvww7m2bpeschkc6n.streamlit.app/&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Building this project taught me a lot about &lt;strong&gt;sustainable computing&lt;/strong&gt; and the nuance of LLM token efficiency.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Technical&lt;/strong&gt;: I sharpened my skills in prompt engineering—specifically how to ground Gemini's responses in specific hardware telemetry data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unexpected Lesson&lt;/strong&gt;: I realized that even the "Green Agent" has a footprint! It led me to implement a "low-power" mode for the agent itself, where it uses more concise prompts to save tokens and energy.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Google Gemini Feedback
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Good&lt;/strong&gt;: The context window is a lifesaver. Being able to feed in large logs of execution data without the model "forgetting" the beginning of the run made the analysis incredibly accurate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Friction&lt;/strong&gt;: I ran into some challenges with rate limiting when trying to do high-frequency real-time monitoring. I had to implement a batching system to send data to Gemini every 30 seconds rather than instantly to stay within the free tier limits during development.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>geminireflections</category>
      <category>gemini</category>
    </item>
  </channel>
</rss>
