ResourcePilot: the AI team that finds you a room, a hall, and help in your first weeks of college
This isn't a chatbot. It's a team. Give one ASI:One conversation your school email, and eight Fetch.ai agents find your school's room system, read which study rooms are open right now, read every residence hall your school lists, check every link again, and hand you your school's own page to book or apply. It works at any US school, not just one campus.
8 uAgents on Agentverse · any US school from just an email domain · 9 of 9 UC Riverside halls priced from the school's own rate PDFs · 1 paid step, in test mode only
Fetch.ai uAgents · Agentverse · ASI:One · Chat + Payment Protocol · interactive picture cards · LibCal live rooms · IPEDS · Localist events · ElevenLabs voice · Twilio / SIP · Stripe test mode · Fetch testnet · Postgres · Docker Compose
🔗 Try it live
| ASI:One | Chat with ResourcePilot |
| Demo video | [https://youtu.be/jxQfiFYm_78] |
| Code | https://github.com/kevinjylin/resourcepilotla |
Say "hi", give your school email once, and you get the services menu:
📚 Study rooms · 🧘 Health & wellness · 🏠 Campus housing · 📞 Emergency (demo) · 🗂 My bookings
🤖 8 agents on Agentverse
| Agent | Job | Address |
|---|---|---|
| Orchestrator | Runs the ASI:One chat, the services menu, every card, and the workflow. Chat Protocol + Payment Protocol | @rp-orchestrator |
| Intake | Turns a form into a validated brief and keeps only your school's domain | @rp-intake |
| Campus Researcher | Finds your school's room system, every residence hall and its price, and the events feed | @rp-campus-researcher |
| Campus Rooms | Reads open study and wellness rooms live, and re-checks one before you get its link | @rp-campus-rooms |
| Verification | Checks every room offer, and re-opens every hall page, housing link, and events feed | @rp-verification |
| Planner | Ranks open rooms and matches halls to what you need | @rp-planner |
| Memory & Audit | Keeps the append-only audit timeline and your recent bookings | @rp-memory-audit |
| Emergency Dispatch | Places one demo-drill call to our team's demo contact, never 911, and reports the transcript | @rp-emergency |
Each one is a real uAgent with its own seed, address, port, process, profile README, Chat Protocol manifest, and status card. Message any specialist on Agentverse and it answers with a card that names its job and points you back to the Orchestrator.
💡 Inspiration
The first weeks at a new school are a pile of small questions nobody answers in one place. We saw Fetch.ai at Welcome Week tabling, and used Coursepilot (built by Fetch) to register for our classes. We wanted to build an agent network that adds onto the structure and could be potentially integrated into the Welcome Week UI.
Where can I study with my group tonight? Every library has a room-booking system, but every school hides it somewhere different. UCLA's is on LibCal. Purdue's lives at calendar.lib.purdue.edu. Some schools use EMS or 25Live, and some don't link it from the library home page at all.
Which hall should I live in? Housing sites list a dozen buildings across a dozen pages, with prices tucked into rates tables and PDFs, and "does it have A/C?" takes twenty minutes of clicking.
Where do I go when I'm overwhelmed? Wellness rooms and events exist, but they're buried in calendars most students never open.
Campus "welcome week" agents usually solve this for one school, with a hand-built list. We wanted one that works for any US school, from nothing but an email address, and that never makes anything up.
⚡ What it does
You give your school email once. The Orchestrator keeps only the domain (purdue.edu), remembers it, and reuses it for every service; Change school on the menu switches it. After that, everything is a button and a short form. Free text gets the menu back, so the agents never guess what you meant. Every card has a Main menu button, and every link on a card is clickable.
📚 Study rooms
Pick a day, a time, how long, and your group size.
- Intake checks the form. Your name never leaves it; only the school's domain is kept.
- Campus Researcher matches the domain to your school in IPEDS, then finds the library's booking system: a hand-checked list, then a
<school>.libcal.comprobe, then a short crawl of the library site that catches custom domains like Purdue's. - Campus Rooms reads which rooms are open right now, live from LibCal.
- Verification drops any offer that isn't available, isn't on your school's domain, falls outside your time window, or doesn't fit your group.
- Planner ranks what's left, earliest first.
You get a carousel of real rooms, each with a Live · LibCal badge. Pick one and press Re-check this room: Campus Rooms reads that slot again, uncached. Still open? You get your school's booking link. Taken in the meantime? The Planner runs again without that room, and you get the rest.
Rooms are always free, and ResourcePilot never reserves anything. You book with your own sign-in. If the Researcher can't find a booking system, it doesn't guess: it asks you for the link and checks it with the same rules.
🧘 Health & wellness
The same chain finds open meditation, reflection, and sensory rooms at your school, plus the week's health and wellness events from the school's public calendar, each with its own photo and RSVP link. The 988 and 911 crisis lines sit at the top of every wellness card. They're static text, so they show up even when a school has nothing to find. ResourcePilot never asks about your health.
🏠 Campus housing
Tell it who you are (first-year, transfer, continuing, graduate, family), the style you want, your must-haves (A/C, kitchen, private bath, gender-inclusive, accessible), and an optional budget.
- Campus Researcher reads every hall your school lists on its own housing site: the school's photo of it, its style, who it's for, room types, features, and price.
- Prices come from the hall's own page, the school's rates table, or the hall's rate PDF. When a school publishes none, the card shows the school's IPEDS typical cost, labeled as a school-wide figure.
- Verification re-opens every hall page and official link itself.
- Planner marks each criterion as a match, not listed, or ruled out. Only a hall's own page can rule it out.
You get a carousel of halls with matches first, and the apply link to your school's portal.
💳 The paid hall match (test mode)
The hall-by-hall match is the one paid step, and it runs on Fetch's Agent Payment Protocol. The housing facts, typical costs, and apply link stay free.
- After Verification keeps at least one hall, an offer card explains what the match does, its one-time price, and what stays free. A school with no readable halls is never charged.
- Unlock my hall match sends one
RequestPaymentfrom the Orchestrator, the only agent that speaks the Payment Protocol. ASI:One shows its payment panel: a Stripe test card, or FET on the Fetch testnet. - The Orchestrator never takes the buyer's word for it. It reads the Stripe Checkout Session or the testnet transaction back itself, and checks that it is tied to this workflow, paid in full, and in test mode.
- Only then does it send
CompletePaymentand hand the Planner its task. Anything else getsCancelPaymentand the match stays locked.
Each transaction ID is used once, ever, so a replayed payment can't unlock anything twice. No real money moves, and the fee pays ResourcePilot, never your school.
📞 Emergency (demo)
A demo drill of what an agent-placed emergency call could look like. Pick what's happening, where on campus, and how many people. The review card shows the call before it happens.
Press Call now, and Emergency Dispatch places one ElevenLabs voice call to our team's demo contact. The voice plays the student. It opens with "Hello, this is a ResourcePilot demo drill, not a real emergency. I'm a student at {school}, and I'm calling for help," answers only from what you entered, and hangs up on its own when help is on the way or the line goes quiet. Check the call shows the summary and transcript.
It never calls campus police, or any emergency service. The number comes only from our server config, nothing in chat can change it, and 911, 988, N11 codes, and crisis hotlines are refused outright.
🗂 My bookings
Your recent re-checked rooms and their booking links, read from the shared workflow store. This will keep students coming back to use ASI1.
💰 Business model
Study rooms, wellness, and housing facts are free. Students pay a small one-time fee only for the hall-by-hall match, which saves an evening of clicking through hall pages, rate tables, and PDFs. Longer term, schools' housing and student-affairs offices would pay to publish their own rooms, halls, and events to ResourcePilot directly instead of being crawled. Today only the hall-match fee is built, in Stripe test mode and on the Fetch testnet.
🏗 Architecture
YOU ORCHESTRATOR SPECIALISTS (in order) LIVE SOURCES
─── ──────────── ────────────────────── ────────────
ASI:One ─────────▶ Orchestrator (uAgent) ┌──▶ ① Intake ─────────────────────▶ (school domain only)
(Chat Protocol) · services menu + cards ├──▶ ② Campus Researcher ──────────▶ IPEDS · library sites ·
· remembers your school │ housing pages + rate PDFs · Localist
· re-check + reroute ├──▶ ③ Campus Rooms ───────────────▶ LibCal (live)
· hall-match payment ─────┼─────────────────────────────────▶ Stripe (test) · Fetch testnet
│ ├──▶ ④ Verification ───────────────▶ re-opens links, halls, feeds
▼ ├──▶ ⑤ Planner
Memory & Audit └──▶ Emergency Dispatch ──────────▶ ElevenLabs ⇄ Twilio / SIP
│
▼
Postgres: workflows · saved school · audit timeline · one-time claims · cache
How a message moves:
- Your tap or form arrives at the Orchestrator over the Agent Chat Protocol. It adds your saved school, so no form asks for it again.
- The Orchestrator hands each step to the next specialist with
ctx.sendand aTaskRequeston our ownResourcePilotTasksprotocol. Every task carries workflow, request, requester, and session IDs, a deadline, and duplicate protection. - It accepts only the matching
TaskResultfrom the agent it asked. A specialist that goes silent is retried once with a fresh request ID, then the workflow fails with a clear card. - For the paid hall match, the Orchestrator switches to the Payment Protocol, verifies the payment itself, and only then hands the Planner its task.
- Every step lands on one append-only audit timeline, so a single workflow ID traces Intake, the Researcher, Campus Rooms, Verification, the Planner, any payment, and the final link.
🏁 How ResourcePilot meets the Fetch.ai judging criteria
| Criterion | What ResourcePilot does |
|---|---|
| Multi-agent collaboration | 8 uAgents, each its own process and address, each owning one step. Only Campus Rooms reads room availability; only Emergency Dispatch talks to ElevenLabs. Not one chatbot wearing eight hats. |
| ASI:One + Chat Protocol | The whole product runs inside one ASI:One conversation. Every agent speaks the Agent Chat Protocol and publishes its manifest. |
| Payment Protocol | The Orchestrator is the seller for one optional step, the hall match. It checks every payment with Stripe or the testnet itself, uses each transaction ID once, and cancels anything that doesn't check out. Test mode only. |
| Interactive cards | Every reply is a picture card: a menu banner with compact service tiles, forms, progress cards with each agent's own art, room and hall carousels, booking links, and receipts. Main menu on every card; selections carry stable workflow and option IDs. |
| Real-time data | Live LibCal availability, re-checked right before the link. Halls and prices from the school's own pages and rate PDFs. Events from the school's own calendar. IPEDS for school facts. |
| Error recovery | A taken room reroutes to the others. No booking system found asks for a link. A LibCal outage falls back to the school's booking link, never invented rooms. Silent agents are retried once. A replayed payment unlocks nothing twice. |
| Safety | Email local parts are stripped before anything is stored. Fetches are https-only, public-address-only, redirect-vetted, and byte- and time-capped. Page text is evidence, never instructions. The demo call can never reach 911. |
🎨 Cards that look like campus
Every card has a picture, set beside its opening lines so cards stay short and the buttons stay close. The menu is a banner and a compact grid of tiles, one per service. Progress cards show the specialist at work in its own art. Housing halls use the school's own photo of the building, and wellness events use the event's own photo, with our art as a fallback. The art is drawn in code (scripts/make_card_art.py), served from the repo, and loaded by the student's browser, so ResourcePilot never fetches an image itself.
🛠 How we built it
- Fetch.ai uAgents: eight agents, each run by
agents/run.pywith its ownAGENT_ROLE, seed, and port, all connected to Agentverse with Mailbox. - Agent Chat Protocol from
uagents_core.contrib.protocols, with prompt ACKs and cards built asTextContentplusMetadataContent. - Agent Payment Protocol, with Stripe Checkout in test mode and FET on the Fetch stable testnet, both verified by the Orchestrator.
ResourcePilotTasksprotocol: our ownTaskRequest,TaskResult, andAuditEventmessages for agent-to-agent delegation.- Postgres: the shared durable store for workflows, saved schools, the audit timeline, one-time claims, and the cache of public lookups.
- IPEDS (via the Urban Institute Education Data API): matches any school domain to a school and supplies housing facts and typical costs.
- LibCal: live room availability, read only by Campus Rooms.
- Localist: public campus events calendars for the wellness card.
- pypdf in a worker thread with a time limit: reads the yearly row of a hall's rate PDF.
- ElevenLabs voice agents over Twilio or a SIP trunk for the emergency demo drill.
- Docker Compose: Postgres plus eight independent agent containers, with CI running format, lint, type-check, and the tests.
The test suite drives the real agent handlers in process, each role loaded as its own module with its own address. Every live source is served by offline fakes, and ElevenLabs, Stripe, and the testnet are mocked, so no test touches the network, places a call, or makes a payment.
🧗 Challenges we ran into
- Every school hides its booking system somewhere different. A
<school>.libcal.comguess works for some schools and misses Purdue entirely. We built a three-step search (hand-checked list, LibCal probe, a two-hop crawl of the library site) and, when that finds nothing, an honest "paste the link" card instead of a guess. - Housing pages are wildly inconsistent. Some schools list halls on one page, some nest them under categories, some put prices in a rates table with summer rows mixed in, and some only in a PDF. We read each hall's
<main>content, skip summer and fee tables, read only the yearly row of a rate PDF, and never annualize a price that doesn't state its period. - Crawling the open web safely. An agent that fetches pages from any school could be pointed at anything. Every fetch checks that the resolved address is public, vets every redirect, caps bytes, and runs on a fetch and time budget. Page text is untrusted evidence: we keep links and capped fields, never instructions.
- Fitting the Agentverse Mailbox limit. Our first build had 15 agents, including demo seller shops and an escrow checkout. The Basic plan allows 8 Mailbox agents, and a fake shop isn't a real service, so we cut the shops and the escrow and rebuilt around eight agents that each do real work. Payments came back as one honest step: the hall match, paid to ResourcePilot, never to a shop or a school.
- Not trusting a payment message. A
CommitPaymentis just a claim from the buyer. We check each one with Stripe or the testnet ourselves, bind the checkout to its workflow, and use each transaction ID once. - Cards with pictures. The predefined card kinds can't show images, so our forms and the emergency review are custom cards, kept under the 64KB payload and eight-level depth limits.
- Making a phone call safe to demo. One button press, one call, never retried, to one number only our config can set. The voice stays in its role, ends the call itself, and every emergency card says "In a real emergency, call 911."
🏆 Accomplishments we're proud of
- It works at any US school, from nothing but an email address, not a hand-built list for one campus.
- Real rooms, re-checked live, with a reroute when someone books your slot first.
- Every hall a school lists, with its price from the hall's page, the rates table, or the rate PDF, matched to your criteria.
- Eight agents with real jobs, real message schemas, and one audit trail across all of them.
- A payment you can't fool: every hall-match payment is checked by the Orchestrator itself, and a replayed one unlocks nothing twice.
📚 What we learned
- The hard part of "AI for students" isn't the language model. It's finding the right page on a website nobody designed for agents, and proving it's still true.
- Splitting work across agents pays off when each one owns a real responsibility. Putting all room reads in Campus Rooms meant the re-check, the outage fallback, and the reroute each had exactly one place to live.
- Forms beat free text for actions that matter. Buttons with stable IDs let us promise a re-check happens once, a payment unlocks once, and a call is placed once.
- Saying "we couldn't find it, can you paste the link?" builds more trust than a confident guess.
🚀 What's next for ResourcePilot
- More booking systems: read live availability from EMS, 25Live, and Skedda where schools make it public, not just LibCal.
- More campus services: dining hours, office hours, tutoring centers, and transit.
- Always-on hosting: run all eight agents on a managed host with managed Postgres, so the profiles answer around the clock.
- School partnerships: schools publish their own rooms, halls, and events to ResourcePilot directly, with no crawling at all.
🔗 Additional links
| *ASI:One Chat Session* | Chat with the ResourcePilot Orchestrator |
- Agentverse profiles:
- ResourcePilot Orchestrator:
@rp-orchestrator - ResourcePilot Intake:
@rp-intake - ResourcePilot Campus Researcher:
@rp-campus-researcher - ResourcePilot Campus Rooms:
@rp-campus-rooms - ResourcePilot Verification:
@rp-verification - ResourcePilot Planner:
@rp-planner - ResourcePilot Memory and Audit:
@rp-memory-audit - ResourcePilot Emergency Dispatch:
@rp-emergency
- ResourcePilot Orchestrator:
- GitHub: https://github.com/kevinjylin/resourcepilotla
Built with
agentverse · asi:one · asyncpg · docker · elevenlabs · fetch.ai · httpx · ipeds · libcal · localist · postgresql · pypdf · python · sip · stripe · twilio · uagents
Built With
- agent-chat-protocol
- agent-payment-protocol
- agentverse
- asi:one
- asyncpg
- docker
- docker-compose
- elevenlabs
- fetch-testnet
- fetch.ai
- github-actions
- httpx
- ipeds
- libcal
- localist
- postgresql
- pypdf
- pytest
- python
- ruff
- sip
- stripe
- twilio
- uagents
- urban-institute-education-data-api
Log in or sign up for Devpost to join the conversation.