A caller asks for an appointment with Dr. Lee on Wednesday. While the assistant checks the calendar, they ask what to bring, then ask if Thursday would work instead. By the time Wednesday’s results come back, the conversation has already moved on.
That’s the scenario in BookingDesk, Parlora’s example app for scheduling clinic appointments by voice. The clinic and patient records are fictional. You’ll find the source code and setup instructions in Run it yourself.
Start with a clean call
The calls use a fixed caller script synthesized in my voice. The assistant generates its replies live while the backend runs and writes to the database. Choose a model, press Play, or jump directly to the date correction. The two waveforms show the caller and assistant separately, and the activity panel follows the backend work as the call plays.
The demo deliberately waits 25 seconds for the first lookup, 1.2 seconds for the Thursday lookup, and 5 seconds to book. Those waits let you hear how the assistant handles questions and corrections while the backend is still working.
A conversation while the calendar works
Recorded call · fixed caller script · model-generated replies · clean input
Press Play to hear the session.
Backend activity
Read the transcript
- 0:02AssistantHi, this is Ava at Cedar Wood Family Clinic.
- 0:05AssistantHow can I help?
- 0:06CallerHi.
- 0:07CallerI'd like an appointment with Dr. Lee on Wednesday, November fourth.
- 0:13AssistantSure.
- 0:14AssistantCould I get your full name and date of birth to get started?
- 0:17CallerSure.
- 0:18CallerIt's Jamie Rivera, March twelfth, nineteen ninety.
- 0:24AssistantThanks.
- 0:24AssistantI'll pull that up.
- 0:28AssistantI have Aetna on file.
- 0:29AssistantIs that still your insurance?
- 0:32CallerYep, that's still the same.
- 0:35AssistantOkay.
- 0:38AssistantGreat.
- 0:39AssistantThanks.
- 0:39CallerWhile you're checking, what should I bring to the appointment?
- 0:39AssistantI'll check.
- 0:43AssistantBring a photo ID and your insurance card and arrive about ten to fifteen minutes early.
- 0:49CallerActually, could we do Thursday instead?
- 0:54AssistantSure.
- 0:56AssistantOn Thursday, Dr. Lee has ten fifteen AM or two PM available.
- 1:02AssistantWhich would you prefer?
- 1:04CallerThe morning one, please.
- 1:07AssistantSure.
- 1:10AssistantThat's Thursday, November fifth at ten fifteen AM with Dr. Lee.
- 1:14AssistantShall I book that?
- 1:16CallerYeah, go ahead and book it.
- 1:20AssistantOkay.
- 1:22CallerIs it booked yet?
- 1:25AssistantIt's still processing.
- 1:26AssistantJust another moment.
- 1:28AssistantOkay, you're booked and your confirmation is B as in Bravo, D as in Delta dash three eight, A as in Alpha, E as in Echo, one, B as in Bravo, one, D as in Delta.
- 1:40AssistantWould you like a text reminder twenty-four hours before your appointment?
- 1:44CallerYeah, that'd be helpful.
- 1:48AssistantGreat.
- 1:50AssistantCan we send it to the number ending in zero one eight eight?
- 1:54CallerYep, that's the right number.
- 1:58AssistantPerfect.
- 2:00AssistantYou're all set.
- 2:01AssistantThe reminder is scheduled.
- 2:03CallerGreat.
- 2:04CallerThanks.
- 2:05CallerSee you then.
- 2:06AssistantYou're welcome.
- 2:07AssistantTake care.
Keep the work aligned with the conversation
Listen to what happens around the date correction:
- Wednesday’s lookup starts. The assistant answers the preparation question while that task remains in progress.
- The caller asks for Thursday instead. BookingDesk interprets the correction, and Parlora tracks a replacement task revision. The new lookup can return while the old one is still running.
- Wednesday’s result arrives later. It is no longer current, so it is filtered before it can be returned to the voice model.
Wednesday’s availability can still be accurate and no longer answer the caller’s question. Parlora tracks which lookup is current. The earlier lookup can finish in the background, and Parlora filters its result before it reaches the voice model.
Who decides what?
| Component | Responsibility in this example |
|---|---|
| Speech provider | Listen to caller audio and generate the assistant’s spoken replies. |
| Parlora | Coordinate audio and backend tasks, and deliver results for the current request. |
| JEV and ReqLLM | JEV helps interpret caller intent. ReqLLM extracts details such as name and date of birth. |
| BookingDesk and Jido | Validate the request and execute deterministic scheduling actions against SQLite. |
BookingDesk looks up the patient by name and date of birth. Before searching for appointments, the assistant asks whether the insurance on file is still current.
Offered 10:15 AM or 2 PM, the caller says, “The morning one, please.” BookingDesk matches that choice to the only morning slot on offer and creates a proposal. The assistant reads back the exact appointment and asks for approval. BookingDesk checks that the proposal is still current and reserves the slot in a database transaction. If a request is retried with the same ID, BookingDesk returns the original result.
Once the booking is confirmed, the caller can opt in to a text reminder. The assistant reads back the last four digits and asks permission to send the reminder to that number. The backend saves the reminder for 24 hours before the appointment. If saving the reminder fails, the booking stays in place.
JEV’s interpretation and a speech model’s tool arguments are inputs to these decisions. Permission to change records remains in application code. The example source contains the policy, structured extraction, and Jido actions.
Then add a café background
The café calls use the same caller clips, booking workflow, and four voice models as the clean calls. This time, a café recording is mixed into the audio sent to the speech provider. It stays at a fixed level throughout the call, including while the assistant is speaking.
The same workflow with café background
Recorded call · fixed caller script · model-generated replies · café background
Press Play to hear the session.
Backend activity
Read the transcript
- 0:02AssistantHi, this is Ava at Cedarwood Family Clinic.
- 0:04AssistantHow can I help with your appointment today?
- 0:07Caller inputHi.
- 0:08Caller inputI'd like an appointment with Dr. Lee on Wednesday, November fourth.
- 0:14AssistantSure.
- 0:14AssistantCan I get your full name and date of birth to pull up your file?
- 0:18Caller inputSure.
- 0:19Caller inputIt's Jamie Rivera, March twelfth, nineteen ninety.
- 0:24AssistantAll right, Jamie Rivera.
- 0:29AssistantThanks.
- 0:30AssistantI've got your file.
- 0:31AssistantI have Aetna on file.
- 0:32AssistantIs that still your insurance?
- 0:35Caller inputYep.
- 0:35Caller inputThat's still the same.
- 0:38AssistantOkay, thanks.
- 0:41AssistantGreat, thanks for confirming.
- 0:42Caller inputWhile you're checking, what should I bring to the appointment?
- 0:42AssistantI'll check that.
- 0:46AssistantPlease bring a photo ID and your insurance card, and
- 0:50Assistantplan to arrive about ten to fifteen minutes early for check-in.
- 0:54Caller inputActually, could we do Thursday instead?
- 0:58AssistantYeah.
- 1:01AssistantFor Thursday, November fifth, Dr. Lee has ten fifteen AM or two PM.
- 1:07AssistantWhich would you prefer?
- 1:09Caller inputThe morning one, please.
- 1:12AssistantAll right.
- 1:15AssistantSo Thursday, November fifth at ten fifteen AM with Dr. Lee.
- 1:20AssistantShall I book that?
- 1:22Caller inputYeah.
- 1:23Caller inputGo ahead and book it.
- 1:26AssistantSure thing.
- 1:28Caller inputIs it booked yet?
- 1:31AssistantIt's still processing.
- 1:34AssistantYou're booked for Thursday, November fifth at ten fifteen AM with Dr. Lee.
- 1:39AssistantYour confirmation number is B as in Bravo, D as in Delta, dash six
- 1:45Assistanteight C as in Charlie, seven seven B as in Bravo, B as in Bravo, C as in Charlie.
- 1:53AssistantWould you like a text reminder twenty-four hours before your appointment?
- 1:58Caller inputYeah.
- 1:58Caller inputThat'd be helpful.
- 2:01AssistantGreat.
- 2:03AssistantOkay, can we send it to the number ending in zero one eight eight?
- 2:08Caller inputYep.
- 2:09Caller inputThat's the right number.
- 2:11AssistantAll right.
- 2:14AssistantPerfect.
- 2:15AssistantYour reminder's scheduled.
- 2:16AssistantYou'll get a text twenty-four hours before.
- 2:19Caller inputGreat.
- 2:20Caller inputThanks.
- 2:21Caller inputSee you then.
- 2:23AssistantYou're welcome.
- 2:24AssistantTake care.
Recorded outcomes
Seven of the eight calls complete both the booking and the simulated reminder.
Grok café. The booking and simulated reminder both completed, despite two replies cutting off at 0:58 and 1:34 after apparent false detections of caller speech.
Gemini café. The assistant proposes the morning slot. Gemini then picks up background speech as caller input, and BookingDesk detects a possible emergency and ends the call before booking.
| Voice model | Clean input | Café input |
|---|---|---|
| GPT Live-1 | 2:10 14/14 checks Completed | 2:26 14/14 checks Completed |
| Phonic-1 | 2:44 14/14 checks Completed | 2:40 14/14 checks Completed |
| Grok Voice 3.0 | 2:04 14/14 checks Completed | 2:01 14/14 checks Completed |
| Gemini 3.8 Live | 2:19 14/14 checks Completed | 3:02 7/14 checks Workflow incomplete |
Each result comes from one scripted run. Durations include the deliberate calendar and booking waits.
The background comes from moxobna’s CC0 coffeehouse recording.
See conversation and work together
A trace is easier to understand beside the conversation it belongs to. These two views align captured caller and assistant audio levels with backend work and application events from the café GPT Live-1 call.
A new date while the old lookup runs
A progress reply while booking finishes
The waveforms show captured audio levels, including the caller’s café background. Timings come from this recorded call and include the configured 25-second lookup and 5-second booking waits.
Run it yourself
Try BookingDesk with your own microphone. It records the call using fictional patient records and appointments. Text reminders are simulated; no SMS is sent. The microphone flow below was tested on macOS.
1. Get the example
From the directory where you keep your projects, clone Parlora and select the tested revision:
git clone https://github.com/hfiguera/parlora.git
cd parlora
git checkout 54446bbf8a7df2386eb5d77916f3a4de42cf96b5
cd examples/booking_desk
2. Install and verify
Install a compatible Elixir 1.18+/Erlang OTP 27+ pair and the native prerequisites for your operating system. Then, from examples/booking_desk, run:
mix deps.get --check-locked
mix test --warnings-as-errors
The tests run without API keys or paid model calls.
3. Set your API keys
The live call uses OpenAI for speech and structured extraction, and JEV for intent judgments. You need OpenAI and TypeSafe API accounts with available credit. Replace these placeholders with your keys in the same terminal:
export OPENAI_API_KEY="your-openai-key"
export TYPESAFE_API_KEY="your-typesafe-key"
Microphone mode does not require an ElevenLabs key.
4. Start a call
Use headphones, allow microphone access if prompted, and run:
PARLORA_PROVIDER=openai BOOKING_DATABASE=:memory: \
mix run run.exs "runs/microphone-$(date +%Y%m%d-%H%M%S)" clips --microphone
Keep clips in the command as a placeholder. BookingDesk uses your microphone in this mode, so you can run it without a clips directory or prerecorded caller audio.
The demo calendar has slots on November 4 and 5, 2026. Wait for the assistant’s greeting, then ask for Dr. Lee on November 4. When asked for your details, use Jamie Rivera, March 12, 1990, or Alex Morgan, July 24, 1985, then confirm the insurance on file. Both name and DOB must match a demo record.
To try the correction flow, change to November 5 while the lookup runs. Choose an offered time and approve the appointment readback. You can also opt into a simulated text reminder.
Press Enter to save the recording and stop. A final summary of outcome: stopped is normal. A completed booking appears as booked_appointments: 1; a saved reminder appears as simulated_reminders: 1.
Each call starts a fresh in-memory database. Its appointments and reminders disappear when it exits; the audio and report remain in the timestamped runs/microphone-… directory.
The booking scenario was inspired by Cekura’s appointment workflow.
For background on the library, read the session model and the observability guide.