Inspiration

We wanted to explore how multiple AI agents could collaborate autonomously — one to plan and another to act — all without managing servers. Cloud Run’s serverless scaling and Google Cloud’s AI ecosystem made it possible to build a real-time system that thinks, plans, and executes tasks instantly. The inspiration came from real-world meeting assistants — what if one agent summarizes a meeting while another sends follow-up actions automatically?

What it does

MinutesActionNow (also called TwinAgents) is a dual-agent AI workflow built on Google Cloud Run. Planner Agent receives a natural-language task (like “Summarize the meeting and email attendees”). It creates a structured plan and publishes it to Pub/Sub.

Executor Agent subscribes to the topic, processes the plan, and performs the actions (e.g., summarization, sending notifications, or storing results).

Each plan is logged in Firestore, so every action has traceable context and history. A simple Playground UI (hosted on GitHub Pages) lets users send tasks and view responses instantly. It’s like a mini digital operations assistant that plans and executes ideas serverlessly.

🔗 Live Demo: https://sureshwizard.github.io/twinagents/playground.html 🔗 Planner URL: https://planner-service-j36k2dhiga-ez.a.run.app

How we built it

Frontend: Lightweight HTML + JavaScript interface hosted on GitHub Pages. Backend: Two FastAPI microservices deployed as Cloud Run Services — planner-service and executor-service. Messaging: Pub/Sub used for communication between agents. Storage: Firestore stores structured plans and responses. CI/CD: Built with Cloud Build, Dockerized and deployed automatically from GitHub. Testing: Used curl, REST client, and a local playground for validation before deployment.

Challenges we ran into

Setting up CORS between GitHub Pages and Cloud Run endpoints. Managing Pub/Sub authentication between Planner and Executor services. Getting Firestore to initialize properly (creating the default database was tricky). Debugging permissions for Cloud Run service accounts (datastore.user & pubsub.publisher roles). Deploying two separate agents that coordinate asynchronously in a short hackathon timeline.

Accomplishments that we're proud of

Fully functional multi-agent architecture deployed serverlessly. End-to-end flow: from a text command → Pub/Sub → Firestore → response in browser. Used only Google Cloud native tools (Cloud Run, Pub/Sub, Firestore, Cloud Build). Simple, clear frontend playground that anyone can test instantly. Fast deployment pipeline (under 3 minutes from code → live service).

What we learned

Cloud Run makes multi-agent and event-driven systems incredibly easy to scale. Firestore is perfect for lightweight plan tracking and agent communication. Managing cross-service IAM roles and CORS is critical for secure inter-agent communication. Hackathon takeaway: “Serverless + Agents = Fast, Scalable Intelligence.”

What's next for MinutesActionNow

Add Gemini or Gemini Code Assist to improve plan generation and summarization. Introduce a third ‘Reviewer Agent’ that validates Planner’s output before execution. Expand the system to handle real meeting audio transcripts and auto-generate follow-ups. Integrate Google Workspace APIs to send automated summaries and actions via email. Deploy the full multi-agent dashboard using Cloud Run + Cloud Functions for monitoring.

Project Architecture Planner → Pub/Sub → Executor → Firestore → Playground

MinutesActionNow to validate that the Planner and Executor endpoints are working correctly on Cloud Run. All examples assume your Planner URL is: https://planner-service-j36k2dhiga-ez.a.run.app and your Executor URL (if deployed) is: https://executor-service-j36k2dhiga-ez.a.run.app

🧠 SECTION 1 — Planner Service Tests 1️⃣ Check if Planner is healthy curl -s https://planner-service-j36k2dhiga-ez.a.run.app/health | jq

✅ Expected: { "status": "ok", "project": "minutesactionnow", "topic": "planner-to-executor" }

2️⃣ Submit a new plan curl -s -X POST https://planner-service-j36k2dhiga-ez.a.run.app/plan \ -H "Content-Type: application/json" \ -d '{"text": "Generate meeting summary and schedule follow-up email"}' | jq

✅ Expected: { "status": "planned", "plan_id": "xxxx-uuid", "firestore": "stored", "published_to": "planner-to-executor", "timestamp": "2025-11-11T00:00:00Z" }

3️⃣ Submit multiple sample plans (batch test) for i in "Summarize meeting notes" "Prepare project report" "List next tasks"; do curl -s -X POST https://planner-service-j36k2dhiga-ez.a.run.app/plan \ -H "Content-Type: application/json" \ -d "{\"text\":\"$i\"}" | jq done

4️⃣ Submit invalid JSON (error handling test) curl -s -X POST https://planner-service-j36k2dhiga-ez.a.run.app/plan \ -H "Content-Type: application/json" \ -d 'not-valid-json'

✅ Should return: {"detail":"Request body is not valid JSON"} or HTTP 422

5️⃣ Check Firestore write (view in console)

Open 🔗 https://console.cloud.google.com/firestore/databases/-default-/data/~2Fplans You’ll see documents matching your plan_id.

6️⃣ Check planner logs from Cloud Run gcloud logging read \ 'resource.type="cloud_run_revision" AND resource.labels.service_name="planner-service"' \ --limit 20 --format="json" | jq '.[].textPayload'

⚙️ SECTION 2 — Executor Service Tests (if deployed) 7️⃣ Health check for Executor curl -s https://executor-service-j36k2dhiga-ez.a.run.app/health | jq

✅ Expected: { "status": "ok", "subscribed_to": "planner-to-executor" }

8️⃣ Manually trigger executor with fake message curl -s -X POST https://executor-service-j36k2dhiga-ez.a.run.app/execute \ -H "Content-Type: application/json" \ -d '{"plan_id": "test-plan-123", "task": "Echo hello from manual test"}' | jq

✅ Expected: { "status": "executed", "plan_id": "test-plan-123", "result": "Echo hello from manual test" }

9️⃣ List last 10 logs from Executor gcloud logging read \ 'resource.type="cloud_run_revision" AND resource.labels.service_name="executor-service"' \ --limit 10 --format="json" | jq '.[].textPayload'

🔟 Full integration flow test (Planner → Pub/Sub → Executor → Firestore)

Step 1: Send task

PLAN=$(curl -s -X POST https://planner-service-j36k2dhiga-ez.a.run.app/plan \ -H "Content-Type: application/json" \ -d '{"text": "Prepare meeting summary for tomorrow"}')

Step 2: Extract Plan ID

PLAN_ID=$(echo $PLAN | jq -r '.plan_id')

Step 3: Confirm stored in Firestore

echo "Check Firestore for Plan ID: $PLAN_ID"

Step 4: Executor should log handling message automatically (Pub/Sub)

🧠 Playground UI 👉 https://sureshwizard.github.io/twinagents/playground.html Type a natural language command like:

“Summarize the last meeting and email attendees.” Then click Send to Planner 📨

The request goes to the Planner Agent on Cloud Run, which: 1️⃣ Creates a structured plan 2️⃣ Publishes it to Pub/Sub 3️⃣ Stores it in Firestore 4️⃣ Responds instantly in your browser 🧩 Planner Service API

Endpoint: https://planner-service-j36k2dhiga-ez.a.run.app

You can test it directly via cURL: curl -s -X POST https://planner-service-j36k2dhiga-ez.a.run.app/plan \ -H "Content-Type: application/json" \ -d '{"text": "Summarize meeting notes"}' | jq

Expected response:

{ "status": "planned", "plan_id": "xxxx-uuid", "firestore": "stored", "published_to": "planner-to-executor", "timestamp": "2025-11-11T00:00:00Z" }

🧠 Firestore Dashboard See all planned tasks here: 🔗 Google Firestore Console → Plans Collection Each entry represents a planned task created by the AI Planner.

⚙️ Health Check Verify live service uptime: curl -s https://planner-service-j36k2dhiga-ez.a.run.app/health | jq

✅ Response: { "status": "ok", "project": "minutesactionnow", "topic": "planner-to-executor" }

🧾 Full Flow

Playground → Planner → Pub/Sub → Firestore → (Executor - upcoming)

This demonstrates how autonomous agents can plan, publish, and act in a fully serverless way using Google Cloud Run and Pub/Sub. 🏗️ Architecture Components Component Description 1️⃣ Playground (Frontend) A simple web UI built with HTML/JS and hosted on GitHub Pages. Users enter meeting summaries or instructions. 2️⃣ Planner Agent (Backend) FastAPI app on Google Cloud Run. Receives meeting text, uses Gemini API to refine tasks, and creates structured JSON plans. Publishes to Pub/Sub and stores them in Firestore. 3️⃣ Pub/Sub Topic (planner-to-executor) Asynchronous message bus between Planner and Executor. Provides decoupled, scalable event flow. 4️⃣ Firestore (plans collection) Stores structured task plans with metadata (plan_id, timestamp, actions). 5️⃣ Executor Agent (Planned next stage) Another Cloud Run service that subscribes to Pub/Sub messages and executes tasks, e.g., sending emails or creating reports. 6️⃣ Cloud Build & Container Registry Handles Docker image builds and deployment automation. 7️⃣ Gemini API Enhances meeting text understanding and produces refined summaries or structured JSON.

      ┌──────────────────────┐
      │  GitHub Pages                                    │
      │  Playground UI                                    │
      │ (HTML / JS)                                        │
      └────────┬─────────────┘
                               │ 1. POST /plan
                              ▼
    ┌──────────────────────────┐
    │  Planner Agent (FastAPI)                              │
    │  Cloud Run Service                                       │
    │  - Calls Gemini API                                        │
    │  - Publishes to Pub/Sub                                │
    │  - Stores in Firestore                                      │
    └────────┬────────┬─────────
                             │4. Pub/Sub Event
                             │
    ┌────────▼────────┐                        ┌────────────────┐
    │  Pub/Sub Topic                      |──────▶     │ Executor Agent                  │
    │ planner-to-exec                    │                         │ (Cloud Run)                        │
    └─────────────────┘                          └────────────────┘
             │
             ▼
    ┌─────────────────────────┐
    │  Firestore Database                                    | 
    │  Collection: plans                                       │
    └─────────────────────────┘

Built With

  • cloud-logging-api
  • cloud-shell
  • curl+rest-client
  • docker
  • fastapi
  • gcloud-cli
  • github
  • google-auth-service
  • google-cloud-build
  • google-cloud-iam
  • google-cloud-pub-sub
  • google-cloud-run
  • google-firestore
  • html
  • javascript
  • pub-sub-publisher-subscriber-apis
  • python
  • uvicorn
Share this project:

Updates