尚未收集儲存庫資訊。
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗A show-off demo of an AI Receptionist that answers the phone for a made-up South Florida AC repair shop.
Live site: https://ai-voice-receptionist-tekguyz.vercel.app
| Phase | Live |
| Shipped | #2 Step 1: setup and the Call Story · #3 Step 2: the look · #4 Step 3: live Test Call · #5 Step 4: Call Notes saved · #6 Step 5: Dashboard · #7 Step 6: landing page and design pass · #8 Step 7: the real Sample Call · #15 Tune Luna · #29 Zip code on every address · #9 Step 8: showcase and go live · #10 Step 9: old app retired |
| Known issues | #23 Luna in Spanish: ends in English, mishears short replies |
| Next | Nothing planned. The rebuild (#1) is done. |
| Updated | 2026-10-24 |
Built so far:
/ says what it does, shows a filled-in sample work order and has one "Try the demo" button. Only / is in search; demo screens are noindex. A link to it shows a preview card drawn by the app (app/opengraph-image.tsx). The demo banner has "Leave the demo" and "Built by TEKGUYZ". The Call Notes and the Dashboard end with "Want this answering for your shop? Talk to TEKGUYZ".lib/call-story.ts./demo: lines and detail tags appear in time, then the Call Notes show a summary, the details, the booked time and a preview of the confirmation text. The Visitor can pause, resume or stop it. It plays with sound: one real call to Luna made by an AI actor, and the words and tags follow the sound's own clock. One line says so: "A real call to Luna. The caller is an AI actor."app/api/vapi/webhook) refuses any request without Vapi's secret.gpt-4.1-mini. She confirms the booking, then ends the call by saying "Thanks for calling Mangrove Air, have a great day!" (no end-call tool). Average reply time on the 2026-10-13 calls: 1.6 to 1.9 s. The Test Call screen loads the Vapi SDK when it opens.Next.js (App Router), TypeScript, Tailwind CSS, Vitest, on Vercel. Voice is the Vapi web SDK. Upstash Redis holds call limits and Call Notes (ADR 0003).
Prerequisites: Node 24, a Vapi account and an Upstash Redis database.
npm install
cp .env.example .env.local
Fill in .env.local. Vapi can reach only a public address, so Call Notes are saved only on a deployed Preview or Production, not on localhost. Set VAPI_WEBHOOK_SECRET in .env.local and in Vercel. Then:
npm run vapi:sync
npm run dev
Open http://localhost:3000 and press "Try the demo".
Luna's settings live in vapi/luna.ts. Never edit Luna in the Vapi dashboard; the next sync overwrites it.
To test what would be sent without sending: npm run vapi:sync -- --dry-run.
The Sample Business and Receptionist names live in one file, lib/sample-business.ts.
The Sample Call is one real call to Luna, made by an AI actor that plays the caller ("Caller actor · Mangrove Air", vapi/actor.ts), recorded on purpose (ADR 0004). Every detail is made up. Recording is off for every Visitor. It turns on only on the laptop's npm run dev, never on Vercel.
npm run vapi:sync sends Luna and the actor to Vapi. Put the VAPI_ACTOR_ID it prints in .env.local.
Add the deployed site to .env.local. Vapi cannot reach the laptop, so Luna's tool calls go to its webhook:
SAMPLE_CALL_WEBHOOK_ORIGIN=https://ai-voice-receptionist-tekguyz.vercel.app
Run npm run dev and open /dev/actor-call (dev only; 404 everywhere else). Press "Start the call". The actor and Luna talk in that tab: each call's speaker feeds the other's microphone. ?lang=es makes the actor speak Spanish; ?seconds=50 stops both calls early.
Score the call (the page prints Luna's call ID):
npm run luna:report -- <callId>
When Luna passes, add SAMPLE_CALL_RECORDING=on to .env.local and make one more call. The terminal says "This call is recorded for the Sample Call." Then delete that line. Recording is off again.
Pull the call. It writes public/sample-call.mp3 and lib/sample-call.json, and places lines that Vapi logged with no length at their real speech start:
npm run sample-call:pull -- <callId>
Check it: npx vitest run lib/__tests__/sample-call.test.ts, then play it on /demo. If the words come early or late, pull again with --offset-ms <ms> (the 2026-10-13 and 2026-10-14 calls used -230).
Commit both files. Then delete the call and its recording from Vapi:
npm run sample-call:pull -- --delete <callId>
npm run test:unit
Never npm test: it prints an error and stops on purpose. There is no database, so there is no integration suite.
CI (.github/workflows/ci.yml) runs typecheck, test:unit and build on every pull request and on every push to main.
CONTEXT.mdPRODUCT.mddocs/adr/refs/DESIGN.md