Inspiration

We’ve been to the doctor. It can be uncomfortable. There are things you’d rather not say out loud to a person.

We wanted to build something that actually helps people, and this felt like a good fit. AI is good at asking and answering questions you might not want to share directly with someone. Wren sits in the waiting room, talks to you on a tablet, writes today’s notes, and the GP gets a short brief on a separate screen. It doesn’t diagnose.

What it does

On the tablet or your phone you type, talk, or take a photo of a med bottle. Wren asks follow-ups, you can mark answers as doctor-only, and it writes them onto today’s visit. If you say something like crushing chest pain, we stop and alert staff before any model call. You never see a diagnosis list.

The GP screen is separate. They get the words you typed, today’s chart, a scored list marked for clinician review, and old notes we ingested. We also pull PubMed so the brief has papers behind it, including things that are easy to skip. If they disagree with a row, the next ranking changes. Percents are just how much of the recorded stuff matched, not “you probably have this.” If we can’t map what you said, we keep your words and don’t score them.

How we built it

Gemini 3.7 Flash, Google ADK, Cloud Run, and Firestore.

We used an ADK Runner with a SequentialAgent of four parts. They call the same tools as our HTTP API, so the agent and the API write the same chart. One loop keeps asking until intake is writable. Another files messy notes. Another builds the GP brief and looks up PubMed for guidance. The last one takes GP feedback so the ranking can change.

Prompts are in one file. Symptom ids are in JSON. If there’s a key, the agents run. If there isn’t, the demo still works. Keys go in Secret Manager. /health tells us if calls actually worked.

Challenges we ran into

We didn’t want the model making up “87% likely,” so percents had to be something we could check, or we don’t show them.

Matching exact phrases missed how people talk. Then when we let the model pick an id, it guessed the closest one and got it wrong. Now if we can’t map it, we store what they said and don’t score it.

The ADK agent was also sitting there unused for a while and HTTP was doing keyword matching instead. We added a test so that can’t happen quietly. /health looked fine during a 429 outage because we only checked that a key existed.

Accomplishments that we're proud of

It works. Two screens, the chart actually gets written, you can photograph a bottle, messy notes get filed, PubMed shows up on the GP side, and if a GP dismisses something the next brief changes.

We’re glad a percent can’t show up with nothing behind it, and that the patient side physically can’t show a differential. Those are tests, not just instructions to the model.

What we learned

If it only chats and doesn’t write the chart, we haven’t helped much.

It’s easy to think the agent is doing the work when it isn’t. A health check that always says ok isn’t a health check. And it’s better to show nothing than a confident number we can’t back up.

What's next for Wren

We’d like better memory over old notes, a simple follow-up list for the GP, and an after-visit note with no percents. Not wiring it into a hospital system this week.

Built With

  • css
  • fastapi
  • google-agent-development-kit
  • google-cloud-firestore
  • google-cloud-run
  • google-gemini
  • html
  • javascript
  • multimodal-ai
  • pubmed-api
  • python
  • vertex-ai
Share this project:

Updates

posted an update —

*Wren is built. *

After a long sprint, Wren is ready.

We built an AI-assisted clinical intake experience with two separate screens: one for patients to share what they’re experiencing comfortably, and another that gives the GP a concise, evidence-backed brief.

Wren can handle text, voice, medication photos, messy notes, clinician feedback, and PubMed research while keeping diagnosis out of the patient experience.

The biggest thing we’re proud of? The safety isn’t just in the prompts. We built tests and safeguards around what Wren can and can’t show, including refusing to score symptoms it can’t confidently map and catching critical symptoms before any model call.

Built with Gemini, Google ADK, Cloud Run, Firestore, FastAPI, and PubMed.

A lot was learned. A lot was broken. A lot was rebuilt.

And now, Wren works.

Log in or sign up for Devpost to join the conversation.

Submission history