Skip to content
vp.Ven Petrov
WorkWritingAboutAt a glance
← Projects & notes
Restaurant-service voice agentExperiment · 3 min read

Designing a restaurant-service call around the real offer

I worked through a Spanish outbound agent prompt, corrected a free visit to the actual paid service and compared how two drafts handled transfers and bookings.

Ven PetrovPrompt prototype

I was working on an outbound voice agent for a technical service visiting restaurants in Spain. The call needed familiar local language, a way to find the right person and a useful next step if the restaurant needed the service.

One draft offered a free technical visit. That was the wrong offer: the visit was a paid service. I corrected it and asked for the conversation to establish a real need instead of booking a free visit the business didn't provide.

That correction made the review concrete. A smooth opening wasn't enough. The agent also needed to say the right thing about the service and know who it was speaking to.

A transfer changes the person, even if the restaurant stays the same

A restaurant call can begin with one person and continue with another. The final prompt asks the agent to establish the speaker's role at the beginning and confirm it again after a transfer.

For example, this is a sanitized illustration of the instruction, not a recorded call:

First speaker: Un momento, te paso con la encargada.
New speaker: ¿Sí?
Agent: Hola. ¿Con quién hablo? ¿Se encarga usted de este tema
       en el restaurante?

The restaurant context can still be useful. What doesn't carry over automatically is knowing who the new person is or whether they can arrange the visit. Continuing the old booking branch would skip that check.

A transfer starts another role check

  1. 01Role confirmedThe current speaker has been identified
  2. 02Call transferredSomeone else joins the call
  3. 03Role unconfirmedDo not inherit the previous answer
  4. 04Check againConfirm who can arrange the paid visit
These are instructions in the final prompt. Recorded live-call behavior has not been verified.

The prompt also covers a transfer to the wrong person and a person who isn't interested. These are different branches, rather than instructions to repeat the pitch until somebody agrees.

Compare the parts of the prompt

I supplied ElevenLabs examples and its prompting guide, then brought in another model's draft. I asked for an honest section-by-section comparison before choosing the final version.

I could then compare the offer, role discovery, handover, objections and closing separately. A useful opening in one draft didn't settle whether its booking instructions were useful too.

The technical boundary mattered as well. The agent can collect a description of the need and arrange a visit. The technician makes the diagnosis. A fluent answer about the problem should not become an invented technical conclusion.

Asking for a booking isn't the same as making one

The final flow uses get_availability to find options and create_visit to request the booking. It includes a short spoken acknowledgement before using a tool, so the caller isn't simply left with unexplained silence.

The result of the tool determines what can be said next:

What happened What the conversation can establish
Available times returned Offer those times
Booking succeeds Confirm the visit
Booking tool fails Explain the problem without saying the visit is booked

This table summarizes the intended behavior. It isn't evidence that the final agent has passed these cases in a live call.

I finished with a Markdown prompt and a comparison document containing those rules and examples together. The next meaningful result has to come from hearing the agent handle actual transfers, refusals and tool failures. So far, the completed work is the prompt design; I don't have a measured booking success rate to attach to it.

Project sources & checks
My requirements and revisions

The source includes supplied ElevenLabs examples and prompting guidance, the paid-visit correction, another model draft and a request for honest section-by-section comparison.

Final prompt

The saved prompt includes role verification, confirmation after transfers, technical limits, availability/booking tools, spoken tool acknowledgements, failure handling and closing examples.

Example scope

The short exchange below is a sanitized illustration of the prompt rule, not a call transcript or a verified model response.

Current result

A final Markdown prompt and comparison analysis. No verified live booking rate, latency result or recorded call suite.

On this page
A transfer changes the person, even if the restaurant stays the sameCompare the parts of the promptAsking for a booking isn't the same as making oneSources & checks
Voice agentsElevenLabsContextPrompt design

Connected to this

All writing
Vapi and Telnyx voice integration · Technical note

The Vapi agent could speak, but it could not hear me clearly

ctxforge · Project story

ctxforge: discovering what to build before coding

Ven PetrovSoftware engineer · Barcelona
GitHub ↗LinkedIn ↗Email ↗

Find a project or a note

17 results

Transfutur ERP · ExperienceERP for transport and logisticsAs the sole engineer, I built an ERP from zero for transport and logistics. It supported roughly €5–6 million in annual invoicing across two offices, and I kept it running for about a year.Financial review lab · Project storyExploring a financial report with Python and FastAPII started with one income change, then opened up the same 54-page report: products, regions, cash flow, core adjustments and a dataset whose figures lead back to the source.Crude-oil narrative tracker · Project storyCrude-oil research from global news and market dataI wanted help following global events that could matter for crude oil. The prototype combines news research with calculated market and position values, while keeping recent assessments separate from the longer numeric history.MNQ time-series research · ExperimentTime-series prediction experimentsAn exploration of high-resolution market data: choosing what to acquire, checking its limits, comparing time intervals and testing whether a prediction survived later data and the cost of acting on it.NQ/MNQ backtest engine · Technical noteA missing closing bar left the simulator’s short position openThe strategy reset for a new day while a shared counter still counted yesterday’s short. A small replay shows why closing the position has to happen before clearing its state.Small-cap edge research · Project storyTurning small-cap trading ideas into repeatable researchI asked Claude Code for a fresh research system that could test named price patterns, compare later periods and carry its methodology into new sessions. One candidate shows how features, entry timing and costs fit together.Gadgeon Europe applications · ExperienceConnected-device dashboards and mobile apps at Gadgeon EuropeI worked on Ionic and Angular applications that brought several APIs into dashboards for energy monitoring and connected-device control, with releases and maintenance across multiple client versions.ctxforge · Project storyctxforge: discovering what to build before codingA context discovery framework that asks an LLM to act like a senior engineering interviewer: understand the idea, uncover requirements and agree the scope before an agent starts building.Sociedades Inactivas enquiries · Technical noteSaving an enquiry before trying to send its emailOn the Sociedades Inactivas catalogue, a visitor can ask about a company or send a general enquiry. The form separates saving that request from delivering its notification, including when the visitor retries.Astro local-services website · Project storyA local-services site assembled from city, service and FAQ recordsThe Astro site describes flooring and other local services across different cities. Shared templates check availability, read the matching content and select one FAQ set for both visitors and structured data.3D Spaces website migration · Project storyMoving 3D Spaces to Next.js while its email stayed on the old serverI rebuilt the virtual-tour website with AI coding collaborators, preserving its content and URLs. The cutover also had to protect the mailbox, enquiry flow and existing analytics history.Capture CRM · Project storyConnecting classified listings to contacts in a small CRMA Chrome extension and Next.js dashboard bring classified listings, platform profiles and contact history together. Saving a listing again can add the person who was missing from an earlier import.Product-description comparison bench · ExperimentComparing one model call with separate vision and writing stepsA small product-description tool lets me inspect the visual analysis before the copy is written, change the model used for each step and compare request measurements.Between Us · Project storyBetween Us: why I kept the first take and widened the shotI compared dialogue takes, asked for wider shots and more physical acting, then changed the workflow when its studio limited the scenes I wanted to make.Restaurant-service voice agent · ExperimentDesigning a restaurant-service call around the real offerI worked through a Spanish outbound agent prompt, corrected a free visit to the actual paid service and compared how two drafts handled transfers and bookings.Vapi and Telnyx voice integration · Technical noteThe Vapi agent could speak, but it could not hear me clearlyMy Telnyx number connected to the assistant, but the caller audio was distorted. Three codec tests recovered the connection without fixing that original problem.Warloop: Echoes of Solmara · Project storyWarloop: turning generated character art into a playable prototypeGood-looking character images became tiny figures, a backwards walk and misplaced bosses in the game. I worked through the gap between generated art and playable behavior.
esc to close · Tab to move through results