By Sagar Shankaran, Founder of CallSphere
Learn how to build multi-modal agentic AI systems that fuse vision, voice, and text inputs into unified agent pipelines for richer interactions.
Key takeaways
Single-modality agents — those that only process text — are fundamentally limited. Real-world tasks involve images, audio, documents, and video. A customer describing a plumbing leak over the phone while texting a photo of the damage needs an agent that can reason across both inputs simultaneously. A real estate buyer asking about a property while viewing listing photos needs an agent that understands visual context alongside natural language queries.
Multi-modal agentic AI systems combine vision, voice, and text processing into unified agent pipelines. Instead of building three separate agents and hoping they cooperate, you architect a single system with multi-modal input routing, cross-modal context sharing, and unified memory. This guide covers the architecture, implementation patterns, and production considerations for building these systems.
The first challenge is routing incoming signals to the right processing pipeline. Not every input needs every modality processor. A text-only chat message should not be sent through a vision model, and an image without accompanying text needs different handling than an image with a caption.
flowchart LR
CALLER(["Caller"])
subgraph TEL["Telephony"]
SIP["Twilio SIP and PSTN"]
end
subgraph BRAIN["Business AI Agent"]
STT["Streaming STT<br/>Deepgram or Whisper"]
NLU{"Intent and<br/>Entity Extraction"}
TOOLS["Tool Calls"]
TTS["Streaming TTS<br/>ElevenLabs or Rime"]
end
subgraph DATA["Live Data Plane"]
CRM[("CRM and Notes")]
CAL[("Calendar and<br/>Schedule")]
KB[("Knowledge Base<br/>and Policies")]
end
subgraph OUT["Outcomes"]
O1(["Booking captured"])
O2(["CRM record created"])
O3(["Human handoff"])
end
CALLER --> SIP --> STT --> NLU
NLU -->|Lookup| TOOLS
TOOLS <--> CRM
TOOLS <--> CAL
TOOLS <--> KB
NLU --> TTS --> SIP --> CALLER
NLU -->|Resolved| O1
NLU -->|Schedule| O2
NLU -->|Escalate| O3
style CALLER fill:#f1f5f9,stroke:#64748b,color:#0f172a
style NLU fill:#4f46e5,stroke:#4338ca,color:#fff
style O1 fill:#059669,stroke:#047857,color:#fff
style O2 fill:#0ea5e9,stroke:#0369a1,color:#fff
style O3 fill:#f59e0b,stroke:#d97706,color:#1f2937
A lightweight router agent sits at the entry point and classifies incoming inputs by modality before dispatching them to specialized processors.
from enum import Enum
from pydantic import BaseModel
from typing import Optional
class Modality(str, Enum):
TEXT = "text"
IMAGE = "image"
AUDIO = "audio"
VIDEO = "video"
MULTI = "multi"
class ModalInput(BaseModel):
text: Optional[str] = None
image_url: Optional[str] = None
audio_url: Optional[str] = None
video_url: Optional[str] = None
def classify_modality(input: ModalInput) -> Modality:
modalities_present = []
if input.text:
modalities_present.append(Modality.TEXT)
if input.image_url:
modalities_present.append(Modality.IMAGE)
if input.audio_url:
modalities_present.append(Modality.AUDIO)
if input.video_url:
modalities_present.append(Modality.VIDEO)
if len(modalities_present) > 1:
return Modality.MULTI
return modalities_present[0] if modalities_present else Modality.TEXT
For multi-modal inputs, the router dispatches to each modality processor in parallel, then merges the results into a unified context object before passing it to the reasoning agent.
import asyncio
async def process_multi_modal(input: ModalInput) -> dict:
tasks = []
if input.text:
tasks.append(("text", process_text(input.text)))
if input.image_url:
tasks.append(("image", process_image(input.image_url)))
if input.audio_url:
tasks.append(("audio", process_audio(input.audio_url)))
results = {}
for modality, coro in tasks:
results[modality] = await coro
return merge_modal_contexts(results)
Vision-enabled agents use models like GPT-4o, Claude, or Gemini to interpret images. The key architectural decision is whether to send raw images to the LLM or pre-process them through specialized vision models first.
For general-purpose image understanding, sending images directly to a multi-modal LLM is the simplest approach. The LLM receives the image alongside text instructions and reasons about both.
Hear it before you finish reading
Talk to a live CallSphere AI voice agent in your browser — 60 seconds, no signup.
async def analyze_image_with_llm(
image_url: str,
user_query: str,
system_context: str
) -> str:
response = await client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": system_context},
{
"role": "user",
"content": [
{"type": "text", "text": user_query},
{"type": "image_url", "image_url": {"url": image_url}},
],
},
],
)
return response.choices[0].message.content
For domain-specific tasks — such as property damage assessment, medical imaging, or document extraction — a specialized pre-processing step often improves accuracy. You run the image through a task-specific model first, extract structured data, and then pass that structured data to the reasoning agent.
For example, CallSphere's real estate platform uses a vision pipeline where property listing photos are first analyzed by a specialized model that extracts room types, condition assessments, and feature inventories. This structured data is then available to the voice agent when a buyer asks questions like "does the kitchen look recently renovated?"
Voice input adds complexity because audio must be transcribed, the transcription must be interpreted for intent, and the agent must respond in a way that accounts for the conversational nature of spoken language.
A production voice pipeline typically follows this sequence:
Each step introduces latency, so the architecture must minimize delays. Streaming STT (processing audio chunks as they arrive rather than waiting for the complete utterance) and streaming TTS (beginning audio playback before the full response is generated) are essential for acceptable user experience.
Raw transcriptions are messy. Users say "um," repeat themselves, and speak in fragments. An intent extraction layer cleans this up before it reaches the reasoning agent.
INTENT_EXTRACTION_PROMPT = """
Extract the user's intent from this voice transcription.
Account for speech disfluencies (um, uh, repeated words).
Return structured intent with entities.
Transcription: {transcription}
Conversation context: {context}
"""
class VoiceIntent(BaseModel):
primary_intent: str
entities: dict[str, str]
confidence: float
cleaned_text: str
The real power of multi-modal agents emerges when information from one modality informs processing in another. A user sends a photo of a damaged appliance and says "how much would it cost to fix this?" The vision pipeline identifies the appliance type and damage severity, and the text reasoning agent uses that structured analysis to provide a cost estimate.
class MultiModalContext(BaseModel):
conversation_id: str
turn_number: int
text_context: Optional[TextAnalysis] = None
vision_context: Optional[VisionAnalysis] = None
audio_context: Optional[AudioAnalysis] = None
merged_entities: dict[str, Any] = {}
confidence_scores: dict[str, float] = {}
def get_combined_summary(self) -> str:
parts = []
if self.text_context:
parts.append(f"Text: {self.text_context.summary}")
if self.vision_context:
parts.append(f"Image: {self.vision_context.description}")
if self.audio_context:
parts.append(f"Audio: {self.audio_context.transcript}")
return " | ".join(parts)
When multiple modalities reference the same entity, you need a resolution strategy. If the user says "the red one" while an image shows three items (one red), the system must link the voice reference to the visual entity. This cross-modal coreference resolution is one of the hardest problems in multi-modal AI and typically requires the reasoning LLM to perform the linking using the combined context.
Standard agent memory stores text conversations. Multi-modal memory must also track visual context, audio events, and cross-modal references.
class ModalMemoryEntry(BaseModel):
timestamp: datetime
modality: Modality
content_summary: str
raw_reference: Optional[str] = None # URL or storage key
extracted_entities: dict[str, Any] = {}
embedding: Optional[list[float]] = None
class AgentMemory:
def __init__(self):
self.entries: list[ModalMemoryEntry] = []
self.entity_index: dict[str, list[int]] = {}
def add_entry(self, entry: ModalMemoryEntry):
idx = len(self.entries)
self.entries.append(entry)
for entity_key in entry.extracted_entities:
self.entity_index.setdefault(entity_key, []).append(idx)
def recall_by_entity(self, entity: str) -> list[ModalMemoryEntry]:
indices = self.entity_index.get(entity, [])
return [self.entries[i] for i in indices]
This allows the agent to recall, for example, all memory entries related to a specific property — whether those entries came from voice conversations, image analyses, or text chats.
Still reading? Stop comparing — try CallSphere live.
CallSphere ships complete AI voice agents per industry — 14 tools for healthcare, 10 agents for real estate, 4 specialists for salons. See how it actually handles a call before you book a demo.
Building multi-modal agents for production requires attention to several additional concerns.
Latency budgets: Each modality processor adds latency. Set strict budgets — for example, vision processing must complete within 2 seconds, STT within 500ms per chunk. Use timeouts and fallbacks when modality processors exceed their budgets.
Cost management: Vision and audio models are more expensive per request than text models. Implement caching for repeated image analyses and consider whether every image truly needs LLM-grade analysis or if a lighter classifier suffices.
Graceful degradation: If the vision service is down, the agent should still function for text and voice inputs. Design each modality as independently deployable with the system degrading gracefully when a modality is unavailable.
Content safety: Images and audio introduce content moderation challenges beyond text. Implement pre-screening for uploaded images and audio content before passing them to agent processing pipelines.
Multi-modal agentic AI refers to autonomous agent systems that can process and reason across multiple input types — text, images, audio, and video — simultaneously. Unlike single-modality agents that only handle text, multi-modal agents can accept a photo and a voice question together and reason about both to produce a unified response.
As of 2026, GPT-4o, Claude 3.5 and later, Gemini 1.5 Pro and later, and several open-source models support multi-modal inputs. These models accept images alongside text in a single API call. For audio and video, most architectures still use specialized preprocessing (STT, frame extraction) before passing structured data to the reasoning LLM.
The primary strategies are parallel processing (run vision, audio, and text analysis concurrently), streaming (begin processing and responding before all inputs are fully analyzed), caching (store results of expensive vision analyses for reuse), and latency budgets (set timeouts per modality with graceful fallback to available modalities).
Yes. The router pattern described in this guide allows you to wrap existing single-modality tools and compose them into a multi-modal pipeline. Each tool processes its modality independently, and the merging layer combines their outputs into a unified context for the reasoning agent.
CallSphere's real estate voice platform combines vision-enabled property analysis with conversational voice agents. When buyers interact with the system, the agent can reference property photos, floor plans, and neighborhood images while conducting a voice conversation, providing a richer experience than text-only or voice-only alternatives.

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.
A founder's guide to texto a voz (text-to-speech in Spanish): LATAM vs Castilian voices, free options, and how CallSphere ships Spanish agents.
A founder's guide to the Siri voice generator landscape: how AI voice cloning works, what is legal, and how CallSphere uses 57+ voices in production.
A founder's guide to the female voice generator landscape: AI female voices, Japanese voices, robot voices, and how CallSphere ships 57+ voices live.
A founder's guide to AI voice assistants for ecommerce: customer service, order lookup, and how CallSphere fits in versus virtual receptionists.
Phone answering services in 2026 are mostly AI. Here is the real comparison: cost, coverage, languages, and how to pick the right one for your business.
An AI voice bot in 2026 handles both inbound and outbound calls at human-level quality. Here is the production guide, the API options, and what to pick.
© 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