What I Learned from Building a Kaggle AI Agents Project
Building Clinical AI Kit for Google and Kaggle's AI Agents capstone: a Google ADK multi-agent system for clinicians, from product concept and Claude Design prototypes to a deployed, fully documented application.
Clinical AI Kit is my attempt to create a system where clinicians can inspect the evidence, tools, uncertainty, and approval boundaries behind every result. You can find all the relevant information about it here:
- Kaggle Writeup - Clinical AI Kit — Kaggle Writeup
- GitHub repository - Google-Capstone-Project
- Interactive application and diagram atlas
- LLM Wiki
- Project Wiki
- Swagger
- ReDoc
Tools Used
Phase | Tools |
|---|---|
Research and ideation | Kaggle AI Agents course notebooks, Google ADK documentation, reference ADK samples. |
AI collaboration | Claude Code, Claude Design, Codex, Antigravity, AI-assisted requirements critique, reusable agent skills and a standardized AI harness. |
Product design | Claude Design, Google Stitch screen exports, design tokens, component prompts |
Agent development | Python 3.11, Google ADK, Gemini, Pydantic, MCP, A2A |
Product development | FastAPI, React, TypeScript, Vite, React Router, Plotly |
Data and retrieval | SQLite, SQLAlchemy, Vertex AI embeddings, Vertex AI Ranking API, deterministic keyword fallback |
Documents and images | PyMuPDF, Pillow, Gemini multimodal processing |
Documentation | Obsidian, Draw.io, JSON Canvas, generated LLM Wiki, Swagger, ReDoc |
Verification | pytest, pytest-asyncio, ADK eval, Vitest, Testing Library, Ruff |
Packaging and deployment | uv, npm, Docker, Cloud Build, Cloud Run, Vertex AI Agent Engine configuration |
Where the Idea Began
If you have ever worked with me, you’d know I am a huge fan of healthcare-based products. I studied psychology and specialized in mental health. One of the longest projects I worked on was a system that helped clinicians treat patients with sleep apnea.
I also previously vibe-coded/engineered another project agenticlibrary.net (which is due for an update), but I never had the motivation to turn one of my ideas into a proper healthcare project.
That was until Google and Kaggle’s “AI Agents: Intensive Vibe Coding Capstone Project” was announced, and I realized I wanted to create a capstone project that would fulfill all the criteria while also having my personal touch.
Product Concept
Anyone who has created an AI project will know that the initial results will be mostly rubbish, regardless of whether you decided to do it with an AI Coding Agent like Claude Code or Codex, or with a pre-built tool like Lovable, Bolt, Base 44, or similar.
This is because, as good as coding agents are right now, they still take the easy route: creating something from known patterns in their training data, but they don't properly search for what similar products look like.
And quite honestly, everyone and their grandmother has seen a RAG-based system in 2026. It was a new solution back in 2023~ but not anymore.
I also didn’t think that a single agentic workflow made sense, because AI without a proper use case and a problem to solve is only a flashy demo without real substance.
Hence why I thought back to the time I helped create another healthcare system that clinicians would use. That got me thinking about how information-dense it was, the number of tabs and navigation options, and the need to store everything in one place.
This is how Clinician AI Kit came to be. The premise is that the system will act as the command center for a clinician who wants more information about their patients.
Back-and-forth with AI
As I worked alone on this capstone project, I didn’t really get to brainstorm with someone else. That’s when AI came into the picture. While I had the original idea, I had a back-and-forth discussion with Claude to grill my idea using the grill-me skill, which required me to reconsider many aspects of the project as I went.
Simply put, while the original idea had substance, it lacked many of the finer details that would make the application usable; it wasn't technically sound and had many missing components that made the agents unusable in the state I had imagined.
After an hour-long session brainstorming how the application would look, I decided to use Claude Design to visualize the idea as a high-fidelity prototype.
Why Is It Different?
Flashy demos and AI-generated websites rely on a lot of non-existent social proof and testimonials, and on a “premium glassmorphism” feel. This one here began by answering the question, “What would a clinical AI product look like if every important action were inspectable?”
And the answers narrowed down to “It must be the overall clinician platform with all the information a clinician would use anyway, while still having access to all the AI functionality they are supposed to.

That also resulted in building three separate Agentic AI solutions that are tightly integrated with the existing information from the platform:
- A clinician-patient session extraction capability that allows a clinician to upload their session images or PDFs, extract all structured information from them, and use it immediately, while still providing confidence and source evidence.
- A Patient-specific multi-model RAG system where a clinician can ask a patient-specific question and receive a cited answer grounded in clinician notes, documents, images, and based on patient data retained in a vector database.
- A database intelligence capability allowing clinicians to ask a question about the hospital’s patient cohort and get a generated read-only SQL query that provides users with patient data and a Pydantic-based visualization from the dataset.
If you were to visualize this whole thing, it would look something like this:

While the capabilities don’t promise HIPAA-compliant data handling, as this is just a POC, the application uses HIPAA-aware design patterns and can be extended into a functional application.
Design Phase with Claude Design
As anyone who has read enough hype articles and seen LinkedIn influencers talk about how big spec-driven development and proper planning is, I thought, “hey, why not directly go for a one-shot prompt to create the overall website?

Needless to say, the final results were pathetically bad. It churned out a generic, AI-sloppy page.

So instead, I worked on a version with Google’s Stitch and created multiple variations with a proper design language (and tokens) file to support UI creation.

This resulted in a much better initial set of artifacts (or few-shot examples) for Claude Design to follow before building any high-fidelity prototype.

In hindsight, if I were making this project from scratch again, I would first create the initial screens, then build a Design System for Claude to consume, create a proper Claude Design, and move to implementation.
Project Scaffolding and Technology Stack
While working on the initial panels and application design, I also set up the project’s scaffolding.
The first decision was to make an overall Architecture choice for what the application would look like despite the fancy Google ADK design, and I decided on this:
- React clinical interface,
- FastAPI product and policy layer,
- Google ADK agent runtime,
- Tools, retrieval, persistence, MCP, A2A, and audit.
While I would have loved to show you the exact /grill-with-docs, the conversation is long gone, and Claude Code refused to locate the session itself. To summarize, though, the project’s overall tech stack and decisions didn’t come from my own whim (purely because I was the only one working on this project with no external feedback) but came from a back-and-forth discussion alongside Opus 4.6 (since I still think it was better than 4.7 and 4.8 at the time). The final decision regarding the application resulted in this:
Layer | Stack |
|---|---|
Agent framework | Google ADK 2.3+, LlmAgent, SequentialAgent, LoopAgent |
Models | Gemini 3.1 tiers through centralized llm.build_model() |
Backend | Python 3.11, FastAPI, Uvicorn, Pydantic |
Persistence | SQLite, SQLAlchemy, tenant-scoped repositories |
Retrieval | gemini-embedding-001, Vertex AI Ranking API, keyword fallback |
Interoperability | FastMCP over JSON-RPC/stdio, A2A server |
Frontend | React, TypeScript, Vite, React Router |
Visualization | Plotly, interactive SVG/PNG diagram viewer |
Document processing | PyMuPDF, Pillow, Gemini multimodal analysis |
Security | ADK callbacks, deterministic regex scanning, scoped tool validation |
Observability | OpenTelemetry, OTLP/Cloud Trace, structured JSON logs, audit events |
Testing | pytest, pytest-asyncio, ADK eval, Vitest, Testing Library |
Documentation | Obsidian, Draw.io, JSON Canvas, generated HTML and LLM Wiki |
Deployment | Multi-stage Docker, Cloud Build, Cloud Run, Agent Engine configuration |
In addition to creating my own version of the Karpathy Wiki, Swagger, and Redoc documentation, I used an adjusted version of Agents365-ai/drawio-skill, which helped me create the application's overall architecture diagrams and understand what the project will look like upon completion. This also resulted in the structure of the application’s harness, which looked like this:
Component | What it is | Location |
|---|---|---|
Rules and skills | Reusable project rules for brevity, engineering, security, and testing, plus skills for deployment, testing, diagrams, and Obsidian | .agents/rules/, .agents/skills/ |
Security and testing conventions | Three-layer callback pipeline covering input, tools, and output; deterministic pytest conventions with model tests gated by an API key | .agents/rules/security.md, .agents/rules/testing.md |
Specialized review agents | Read-focused subagents scoped to harness integrity, ADK state and memory, security boundaries, and deterministic verification | .agents/agents/ |
Pre-commit verification | A single command that runs formatting, harness auditing, and pytest before commit | .agents/commands/pre-commit-gate.md |
Automatic wiki synchronization | A deterministic, idempotent script that regenerates the Obsidian Project Wiki after each work turn | scripts/sync_wiki.py |
Generated inventories | Machine-managed pages covering modules, tests, the changelog, and documentation drift; these should not be edited manually | Project Wiki/_generated/ |
End-to-End Documentation of the Project
Main submission links
Resource | Link | Purpose |
|---|---|---|
Kaggle writeup | Published project submission | |
GitHub repository | Canonical source repository | |
Interactive application | Main deployed application | |
Interactive diagram atlas | Embedded architecture visualizations | |
Documentation hub | Central entry point for all documentation | |
LLM Wiki | Architecture documentation optimized for LLM navigation | |
Project Wiki | Human-readable Obsidian project documentation | |
Documentation guide | Guide to every documentation surface | |
Swagger | Interactive API documentation | |
ReDoc | Readable API reference |
Application workflows
Resource | Link | Purpose |
|---|---|---|
Evidence extraction | PDF and image extraction with human review | |
Multimodal Q&A | Patient-scoped answers with evidence and citations | |
Database intelligence | Natural-language cohort analysis with inspectable SQL | |
Clinician dashboard | Main clinical command center | |
Patient search | Synthetic patient-record exploration | |
Clinical inbox | Notifications, reviews and audit activity | |
Agent configuration | Agent topology and configuration surface | |
Developer console | Documentation and API development tools |
API and operational endpoints
Resource | Link | Purpose |
|---|---|---|
Agent catalog | Root orchestrator and 21-specialist catalog | |
OpenAPI schema | Machine-readable API contract | |
Service health | Cloud Run liveness check | |
Component readiness | Database, storage, and runtime readiness | |
System health | Detailed component status | |
Extended API health | Extended database and storage diagnostics |
Source code and technical evidence
Resource | Link | Demonstrates |
|---|---|---|
Project README | Problem, solution, architecture, and setup | |
System architecture | Full system design | |
ADK agent package | Agents, tools, memory, security, and observability | |
Agent orchestration | SequentialAgent and LoopAgent pipelines | |
Root agent | Root orchestrator and agent routing | |
Clinical tools | Production agent tool layer | |
Security callbacks | Input, tool and output security boundaries | |
Security implementation | Injection, secret and PII detection | |
Memory architecture | Session and long-term memory governance | |
Context engineering | Token budgeting and deterministic compaction | |
MCP server | FastMCP interoperability | |
FastAPI application | Product API and deterministic runtime | |
React frontend | React, Vite and TypeScript application | |
Project Wiki source | Obsidian knowledge base | |
Deployment guide | Cloud Run and Agent Engine deployment | |
Cloud Build pipeline | Automated build and Cloud Run release | |
Dockerfile | Multi-stage application container | |
Evaluation suite | Model-dependent evaluation assets | |
Automated tests | Security, behavioral and integration testing | |
Agent skills | Reusable deployment, testing and documentation workflows | |
License | Open-source licensing |
Kaggle links
Resource | Link |
|---|---|
Your writeup | |
Competition | |
Competition writeups |
Closing Thoughts
This was a really fun Agentic vibe-coding competition to be a part of, even though I didn't win.
I would most likely repeat something like that in the future as I improve my skill set (and when I am not full of work-related tasks to do, as I am now).
In closing, the Clinical AI Kit began as an attempt to create a vibe-coded product based on multi-modal agent (MAS) architecture that allows clinicians to organize their fragmented clinical data. The result isn’t a medical device application, nor is it HIPAA-compliant. Still, it shows you can use Google ADK to orchestrate agents that help a human find the exact information they need and the exact references it came from.
If anyone wants to play around with the project or extend it, the repo is available here: Google-Capstone-Project.
