By Sagar Shankaran, Founder of CallSphere
How CallSphere Real Estate uses GPT-4o vision on buyer-uploaded property photos during voice calls. Vapi is voice-only — what that means in practice.
Key takeaways
Vapi is voice-only — no native vision, no image-aware tool, no ability to ground a voice answer in a photo a caller just uploaded. CallSphere ships a vision-capable Property Search specialist in the Real Estate vertical that accepts buyer-uploaded photos via SMS/MMS or web link, runs GPT-4o vision analysis, and feeds structured visual features into the conversation.
This unlocks "find me a kitchen that looks like this one" as a real product, not a vaporware demo.
Most voice AI platforms are text-token-stream-to-audio pipelines. Vision is missing because the original product surface (phone calls) didn't have it. But customer expectations have moved:
In all three, the vision artifact is the central context. A voice-only agent has to fall back to "describe the photo to me," which is a worse experience than the human alternative.
Vapi as of 2026-04 has:
The workaround works for "describe an image and tell the agent" but loses two things:
Hear it before you finish reading
Talk to a live CallSphere AI voice agent for real estate in your browser — 60 seconds, no signup.
CallSphere's Real Estate Property Search specialist accepts photos via:
The flow:
photo_received event tagged with the active call IDphoto_available signal in its context and calls vision_analyzevision_analyze invokes GPT-4o with the image plus a structured prompt: "Extract: cabinet color, countertop material, layout type, ceiling height estimate, lighting style, square footage estimate"{cabinet_color: "white", countertop: "marble", layout: "galley", ...}search_listings with the structured features as filtersexport const visionAnalyzeTool = {
type: 'function' as const,
name: 'vision_analyze',
description:
'Analyze a photo the buyer uploaded during this call. Returns structured ' +
'features that can be passed to search_listings. Only call after photo_available.',
parameters: {
type: 'object',
properties: {
photo_id: {
type: 'string',
description: 'ID from the photo_available event in conversation context',
},
analysis_focus: {
type: 'string',
enum: ['kitchen', 'bathroom', 'exterior', 'living_space', 'general'],
description: 'Hint to the vision model on what features matter most',
},
},
required: ['photo_id', 'analysis_focus'],
},
};
The prompt the agent ships to GPT-4o is intentionally narrow:
You are a property feature extractor. Given the image and the focus area
({analysis_focus}), return strict JSON with these keys ONLY:
cabinet_color: string | null
countertop_material: string | null
flooring_material: string | null
layout_type: string | null // e.g., "galley", "open", "u-shape"
lighting_style: string | null // e.g., "pendant", "recessed", "natural"
estimated_sqft: number | null // null if not estimable
notable_features: string[] // max 5
Do not return prose. Do not add keys. Use null for unknown.
The strict-JSON contract is enforced via OpenAI's structured output. A failure here returns null fields, which the agent handles gracefully ("I could see the kitchen but couldn't make out the countertop material — can you tell me?").
The structured features become filters:
features = await vision_analyze(photo_id, focus="kitchen")
matches = await search_listings(
city=ctx.user_filters.city,
beds=ctx.user_filters.beds,
feature_filters={
"kitchen.cabinet_color": features.cabinet_color,
"kitchen.countertop": features.countertop_material,
},
sort_by="visual_similarity",
)
The visual_similarity sort ranks listings by embedding distance to the buyer's photo using a CLIP-style listing image embedding stored on each property record.
| Dimension | Vapi | CallSphere |
|---|---|---|
| Native vision | No | Yes (GPT-4o) |
| Image input channel | Out-of-band, DIY | MMS, web link, history |
| Latency to first vision answer | 1-2s extra (external) | 600-900ms inline |
| Grounding | Text description proxy | Direct image reasoning |
| Structured output | DIY parsing | OpenAI structured output |
| Multi-image conversation | Awkward | Native; agent tracks photo set |
| Privacy | Image touches 2 vendors | Image touches OpenAI only |
| Use case fit | Voice-only | Voice + visual context |
sequenceDiagram
participant Buyer
participant Twilio
participant Agent as Property Search Agent
participant Vision as GPT-4o Vision
participant DB as Listings DB
Buyer->>Agent: "I want a kitchen like this"
Agent->>Buyer: "Text the photo to (415) 555-0123"
Buyer->>Twilio: MMS with photo
Twilio->>Agent: photo_received event
Agent->>Agent: photo_available signal in context
Agent->>Vision: vision_analyze(photo_id, focus=kitchen)
Vision-->>Agent: { cabinet_color: "white", countertop: "marble", ... }
Agent->>DB: search_listings(city, beds, feature_filters)
DB-->>Agent: 4 matches sorted by visual_similarity
Agent->>Buyer: "Found 4 with white cabinets, marble counters in your area"
Buyer->>Agent: "Tell me about the second one"
Agent->>DB: get_listing_details(id)
Agent->>Buyer: "1247 Maple Ave, 3 bed 2 bath..."
The vision primitive in CallSphere generalizes:
Still reading? Stop comparing — try CallSphere live.
See the real estate AI agent handle a real call — complete, industry-specific, and live in your browser. No signup.
Each is a thin variant of the Real Estate pattern.
No — the agent emits filler audio ("let me look at that photo") while the vision call runs. Total perceived gap is ~1s.
The structured prompt returns mostly nulls, and the agent gracefully says "that doesn't look like a property photo — can you check?"
Yes — for QA, we run a vision pass on screenshots of search results to verify they match the agent's verbal description.
Yes. The agent tracks a photo set for the call and can compare ("this kitchen vs the one you sent first").
WhatsApp Business is on the roadmap; SMS/MMS via Twilio is shipping.
The /industries/real-estate page has a working video of the kitchen-photo flow, and /demo lets you trigger it live.

Written by
Sagar Shankaran· Founder, CallSphere
LinkedInSagar Shankaran is the founder of CallSphere, where he builds production AI voice and chat agents deployed across healthcare, hospitality, real estate, and home services. He writes about agentic AI, LLM engineering, and shipping voice agents that handle real calls in production.
See how AI voice agents work for your industry. Live demo available -- no signup required.
Tbilisi professional-services firms serving relocating founders and IT companies use CallSphere AI voice and chat agents to answer enquiries 24/7 in English, Georgian and Russian and book consultations.
A how-to for Colombian education and tutoring SMBs to answer parents and students instantly, book trial classes 24/7 in Spanish and English, and grow enrollment with a CallSphere AI agent.
Ethiopian coffee exporters and cooperatives lose buyer enquiries across time zones. See how a CallSphere AI voice and chat agent answers international coffee buyers 24/7 in Amharic and English.
A practical how-to for Palau eco-resorts and dive operators on capturing every high-value, multilingual enquiry with a CallSphere AI voice and chat agent, while honouring Palau’s marine-conservation commitments.
How salons, spas and wellness SMBs across the UAE, Saudi Arabia and Qatar use CallSphere AI voice and chat agents to capture every booking 24/7 in Arabic, English and expat languages, and cut no-shows.
How estate agents and property managers in Luxembourg City and across the Grand Duchy use CallSphere to capture multilingual viewing and enquiry calls 24/7, GDPR compliant.
© 2026 CallSphere Inc. All rights reserved.
Made within San Francisco
Watch how CallSphere handles real customer calls, schedules appointments, and processes payments — live.
Try Live DemoBook a DemoCalculate Your ROI