All articles

Keep talking while we book it

A conversation can move faster than the work it starts. Follow a real Parlora session as the caller asks a question, changes the date, and confirms an appointment while Jido works in the background.

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.

Read the transcript
  1. 0:02AssistantHi, this is Ava at Cedar Wood Family Clinic.
  2. 0:05AssistantHow can I help?
  3. 0:06CallerHi.
  4. 0:07CallerI'd like an appointment with Dr. Lee on Wednesday, November fourth.
  5. 0:13AssistantSure.
  6. 0:14AssistantCould I get your full name and date of birth to get started?
  7. 0:17CallerSure.
  8. 0:18CallerIt's Jamie Rivera, March twelfth, nineteen ninety.
  9. 0:24AssistantThanks.
  10. 0:24AssistantI'll pull that up.
  11. 0:28AssistantI have Aetna on file.
  12. 0:29AssistantIs that still your insurance?
  13. 0:32CallerYep, that's still the same.
  14. 0:35AssistantOkay.
  15. 0:38AssistantGreat.
  16. 0:39AssistantThanks.
  17. 0:39CallerWhile you're checking, what should I bring to the appointment?
  18. 0:39AssistantI'll check.
  19. 0:43AssistantBring a photo ID and your insurance card and arrive about ten to fifteen minutes early.
  20. 0:49CallerActually, could we do Thursday instead?
  21. 0:54AssistantSure.
  22. 0:56AssistantOn Thursday, Dr. Lee has ten fifteen AM or two PM available.
  23. 1:02AssistantWhich would you prefer?
  24. 1:04CallerThe morning one, please.
  25. 1:07AssistantSure.
  26. 1:10AssistantThat's Thursday, November fifth at ten fifteen AM with Dr. Lee.
  27. 1:14AssistantShall I book that?
  28. 1:16CallerYeah, go ahead and book it.
  29. 1:20AssistantOkay.
  30. 1:22CallerIs it booked yet?
  31. 1:25AssistantIt's still processing.
  32. 1:26AssistantJust another moment.
  33. 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.
  34. 1:40AssistantWould you like a text reminder twenty-four hours before your appointment?
  35. 1:44CallerYeah, that'd be helpful.
  36. 1:48AssistantGreat.
  37. 1:50AssistantCan we send it to the number ending in zero one eight eight?
  38. 1:54CallerYep, that's the right number.
  39. 1:58AssistantPerfect.
  40. 2:00AssistantYou're all set.
  41. 2:01AssistantThe reminder is scheduled.
  42. 2:03CallerGreat.
  43. 2:04CallerThanks.
  44. 2:05CallerSee you then.
  45. 2:06AssistantYou're welcome.
  46. 2:07AssistantTake care.
Separate waveforms show recorded caller input and assistant output. Audio is captured at software playout; automatic transcripts may contain recognition errors.

Keep the work aligned with the conversation

Listen to what happens around the date correction:

  1. Wednesday’s lookup starts. The assistant answers the preparation question while that task remains in progress.
  2. 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.
  3. 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?

ComponentResponsibility in this example
Speech providerListen to caller audio and generate the assistant’s spoken replies.
ParloraCoordinate audio and backend tasks, and deliver results for the current request.
JEV and ReqLLMJEV helps interpret caller intent. ReqLLM extracts details such as name and date of birth.
BookingDesk and JidoValidate 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.

Read the transcript
  1. 0:02AssistantHi, this is Ava at Cedarwood Family Clinic.
  2. 0:04AssistantHow can I help with your appointment today?
  3. 0:07Caller inputHi.
  4. 0:08Caller inputI'd like an appointment with Dr. Lee on Wednesday, November fourth.
  5. 0:14AssistantSure.
  6. 0:14AssistantCan I get your full name and date of birth to pull up your file?
  7. 0:18Caller inputSure.
  8. 0:19Caller inputIt's Jamie Rivera, March twelfth, nineteen ninety.
  9. 0:24AssistantAll right, Jamie Rivera.
  10. 0:29AssistantThanks.
  11. 0:30AssistantI've got your file.
  12. 0:31AssistantI have Aetna on file.
  13. 0:32AssistantIs that still your insurance?
  14. 0:35Caller inputYep.
  15. 0:35Caller inputThat's still the same.
  16. 0:38AssistantOkay, thanks.
  17. 0:41AssistantGreat, thanks for confirming.
  18. 0:42Caller inputWhile you're checking, what should I bring to the appointment?
  19. 0:42AssistantI'll check that.
  20. 0:46AssistantPlease bring a photo ID and your insurance card, and
  21. 0:50Assistantplan to arrive about ten to fifteen minutes early for check-in.
  22. 0:54Caller inputActually, could we do Thursday instead?
  23. 0:58AssistantYeah.
  24. 1:01AssistantFor Thursday, November fifth, Dr. Lee has ten fifteen AM or two PM.
  25. 1:07AssistantWhich would you prefer?
  26. 1:09Caller inputThe morning one, please.
  27. 1:12AssistantAll right.
  28. 1:15AssistantSo Thursday, November fifth at ten fifteen AM with Dr. Lee.
  29. 1:20AssistantShall I book that?
  30. 1:22Caller inputYeah.
  31. 1:23Caller inputGo ahead and book it.
  32. 1:26AssistantSure thing.
  33. 1:28Caller inputIs it booked yet?
  34. 1:31AssistantIt's still processing.
  35. 1:34AssistantYou're booked for Thursday, November fifth at ten fifteen AM with Dr. Lee.
  36. 1:39AssistantYour confirmation number is B as in Bravo, D as in Delta, dash six
  37. 1:45Assistanteight C as in Charlie, seven seven B as in Bravo, B as in Bravo, C as in Charlie.
  38. 1:53AssistantWould you like a text reminder twenty-four hours before your appointment?
  39. 1:58Caller inputYeah.
  40. 1:58Caller inputThat'd be helpful.
  41. 2:01AssistantGreat.
  42. 2:03AssistantOkay, can we send it to the number ending in zero one eight eight?
  43. 2:08Caller inputYep.
  44. 2:09Caller inputThat's the right number.
  45. 2:11AssistantAll right.
  46. 2:14AssistantPerfect.
  47. 2:15AssistantYour reminder's scheduled.
  48. 2:16AssistantYou'll get a text twenty-four hours before.
  49. 2:19Caller inputGreat.
  50. 2:20Caller inputThanks.
  51. 2:21Caller inputSee you then.
  52. 2:23AssistantYou're welcome.
  53. 2:24AssistantTake care.
The café background is part of the input heard by the speech model. Incoming-track captions can include background conversation.

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.

Recorded duration and scripted workflow checks
Voice modelClean inputCafé input
GPT Live-12:10
14/14 checks
Completed
2:26
14/14 checks
Completed
Phonic-12:44
14/14 checks
Completed
2:40
14/14 checks
Completed
Grok Voice 3.02:04
14/14 checks
Completed
2:01
14/14 checks
Completed
Gemini 3.8 Live2: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

Caller and assistant audio above two lookup spans. The caller asks what to bring, then changes to Thursday. Thursday’s lookup returns first; Wednesday’s work continues and its result is later filtered.
The assistant answers the preparation question while Wednesday’s lookup runs. After the caller changes the date, Thursday’s lookup finishes first. The earlier operation keeps running, shown with a dotted outline; its result is filtered when it is no longer current.

A progress reply while booking finishes

Caller and assistant audio aligned with the booking backend span. The caller asks whether it is booked, the assistant says it is still processing, then the backend confirms and the assistant says the appointment is booked.
“Is it booked yet?” arrives while the booking action is still running. The assistant gives a progress update and announces the booking after the backend confirms it.

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.