Lucy · Bloom House Concierge 🌸

Florist concierge that recommends, escalates, or politely declines

Service Agent Governed Toolset Live SQLite (sql.js) GitHub Pages

Project Overview & Problem

An online florist sells into emotional moments: birthdays, anniversaries, get-well wishes and condolences. Buyers know the occasion but not what to send, so many leave without ordering; the few who buy ask the same delivery and care questions, and a one or two person team answers them by hand. The routine load and the genuinely sensitive cases (a late condolence stand, wilted flowers before an event) wait in the same slow queue.

Lucy is the shop's concierge. She talks to the customer directly and reaches exactly one of three outcomes on every message: resolve it with an approved tool, escalate it to a human, or politely decline it.

Application Features

Florist consultant

Recommends two real bouquets by occasion, budget and colour, each with a flower-meaning reason. Never invents a product or price.

Three-way decision gate

Every message is resolved, escalated to a human, or declined, decided in that order before anything runs.

Grounded support answers

Delivery cut-offs, coverage, care, hours and store location, answered from the shop's knowledge base.

Read-only order status

Looks up an order number with a fixed query. It can read an order; it can never change one.

Warm human handoff

On escalation, writes a Situation / Order / Mood / Reason summary for the human, shown owner-side only.

Full storefront

Flowers, Occasions, Gifts, Delivery and a live Track-Order page, plus three real product pages.

AI Integration & the Governed Toolset

Lucy's universe is eight fixed, approved tools. She chooses which tool and supplies parameter values only; she cannot author SQL, browse the schema, or invoke anything that writes. The safety comes from what is missing: there is no refund, cancel, or change tool, so those actions cannot happen autonomously.

Resolve (information)

recommend_bouquets, get_delivery_cutoff, get_coverage_areas, get_care_tips, get_hours, get_store_location, flower_meaning, get_order_status.

Escalate (decision)

Refunds, cancellations, order changes, custom or bulk orders, complaints and upset customers go to the manager, Ms. Young, with a summary.

Decline (out of bounds)

Staff details, suppliers, margins, ownership, internal metrics and non-business questions are refused, never transferred.

In a paying build the rule-based router becomes one Gemini classification call at the same function boundaries; the gate, the tools and the handoff stay unchanged.

Technical Architecture

Stack

HTML / CSS / JS SQLite via sql.js (WASM) Rule-based router + 3-way gate GitHub Pages No backend

How it works

Run It Locally

# clone, then open the app entry point cd projects/bloom-house-concierge # rebuild the embedded database (optional) python build_db.py # open in a browser (needs internet for the sql.js WASM CDN) start index.html

No build step, no API key, no server. The database is embedded, so the page is fully self-contained.

Deployment

# static hosting on GitHub Pages # entry: projects/bloom-house-concierge/index.html # everything (DB, product pages, images) ships as static files

Hosted free on GitHub Pages as part of the AI project portfolio.

Key Metrics

3
outcomes: resolve / escalate / decline
8
fixed, approved tools
0
write actions the agent can take
100%
answers grounded in the real catalogue