Modern customer support is no longer limited to text. Users arrive with screenshots of broken UI, voice messages describing intermittent bugs, and long chat histories that span multiple sessions. Building an agent that can handle this requires more than a single large language model. You need a pipeline that combines natural language understanding for intent detection, a vision model for image analysis, and an LLM core that can reason across turns, call tools, and maintain state over thousands of tokens. Oxlo.ai provides the inference backend for this stack, with request-based pricing, OpenAI SDK compatibility, and a broad model catalog that covers every layer.
Architecture Overview
A robust support agent typically follows a modular pipeline. Incoming messages first pass through an NLU layer that embeds the query and retrieves the closest intent or documentation snippet. A router then decides whether the ticket requires a simple FAQ answer, a backend tool call, or visual analysis of an attachment. The reasoning layer, usually an LLM with function calling and JSON mode, executes the plan and generates the response. When the user attaches an image or sends audio, dedicated vision and audio models feed structured outputs into the same reasoning layer. Because conversation threads can grow long, context window size and inference cost become critical design constraints.
NLU, Intent Classification, and Retrieval
For intent classification and retrieval, embedding quality determines accuracy. Oxlo.ai hosts BGE-Large and E5-Large through a standard OpenAI-compatible embeddings endpoint, so you can generate dense vectors without managing a separate vector inference stack. The workflow is straightforward: embed the incoming message, compute cosine similarity against a pre-indexed knowledge base, and return the top-k matches to the reasoning layer.
If you need exact intent labels for routing, you can embed a curated set of intent descriptions and classify by nearest neighbor. This is often more robust than fine-tuning for small support teams because you can add new intents by simply appending a text snippet.
import os
from openai import OpenAI
client = OpenAI(base_url="https://api.oxlo.ai/v1", api_key=os.getenv("OXLO_API_KEY"))
def embed_text(text: str):
resp = client.embeddings.create(model="BGE-Large", input=text)
return resp.data[0].embedding
# Compute similarity against indexed intents or documentation.
Core Reasoning and Dialogue Management
The LLM core handles state tracking, slot filling, and response generation. For support agents, you want models that support tool use, JSON mode, and large context windows. Oxlo.ai offers several options here. Qwen 3 32B excels at multilingual reasoning and agent workflows, making it ideal for global support queues. Kimi K2.6 brings advanced reasoning, agentic coding capabilities, and a 131K context window, which is useful when a ticket includes lengthy logs or prior conversation history. For simpler queries, Llama 3.3 70B serves as a reliable general-purpose flagship.
Function calling lets the model trigger actions such as updating a CRM ticket, checking an order database, or escalating to a human. JSON mode forces the model to return structured data, which is useful for extracting issue categories or severity scores before the response is shown to the user.
Computer Vision for Multimodal Tickets
Screenshots and photos are common in support tickets. A user might attach an image of a damaged shipment or a browser console error. Instead of asking the user to transcribe what they see, you can pass the image directly to a vision model. Oxlo.ai offers Gemma 3 27B and Kimi VL A3B for this task. Both accept image inputs through the standard chat/completions endpoint, so you can use the same OpenAI SDK pattern you already use for text.
The vision model returns a structured description or error classification, which you then inject into the reasoning LLM as a system or user message. This keeps your architecture uniform: every modality textifies into the same conversation thread.
def describe_image(base64_image: str) -> str:
response = client.chat.completions.create(
model="Gemma 3 27B",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "Describe the issue in this support screenshot."},
{"type": "image_url", "image_url": {"url": f"data:image/png;base64,{base64_image}"}}
]
}]
)
return response.choices[0].message.content
Audio Workflows
Voice messages are increasingly common in mobile-first support channels. Oxlo.ai hosts Whisper Large v3, Turbo, and Medium for audio transcription, accessible via the audio/transcriptions endpoint. After transcription, the text flows into the same NLU and reasoning pipeline. If your agent needs to respond with voice, you can use the audio/speech endpoint with Kokoro 82M to generate lightweight text-to-speech output.
Wiring It Together: A Minimal Agent
The following example shows a single turn that combines tool definitions, multimodal input, and structured output using the Oxlo.ai API. Because the platform is fully OpenAI SDK compatible, the only change is the base URL.
from openai import OpenAI
import os
client = OpenAI(base_url="https://api.oxlo.ai/v1", api_key=os.getenv("OXLO_API_KEY"))
tools = [
{
"type": "function",
"function": {
"name": "get_order_status",
"description": "Retrieve the current status of a customer order.",
"parameters": {
"type": "object",
"properties": {
"order_id": {"type": "string"}
},
"required": ["order_id"]
}
}
}
]
messages = [
{"role": "system", "content": "You are a support agent. Use tools when needed. Respond in JSON."},
{"role": "user", "content": "Where is my order OD-9921? Also, the item looks damaged."}
]
# Agent turn with tool support and JSON mode
response = client.chat.completions.create(
model="Qwen 3 32B",
messages=messages,
tools=tools,
response_format={"type": "json_object"}
)
msg = response.choices[0].message
print(msg.content)
# If the model requests a tool call, execute it and append the result
# before sending the next request to continue the conversation.
In practice, you would wrap this in a loop that handles tool execution, injects image descriptions from the vision model when attachments are present, and prepends retrieved documentation from the embedding step.
Cost Efficiency and Scaling
Support conversations are inherently long-context. A single ticket can contain system prompts, knowledge base context, prior messages, and lengthy error logs. Under token-based pricing, every additional line increases cost. Oxlo.ai uses request-based pricing: one flat cost per API call regardless of how many tokens are in the prompt. For agentic support workflows that carry large conversation buffers, this can be 10-100x cheaper than token-based alternatives for long-context workloads. You also avoid cold starts on popular models, which matters when users expect sub-second replies.
You can prototype this stack on the Oxlo.ai free tier, which includes 60 requests per day across 16+ models and a 7-day full-access trial. For production volumes, see the details at https://oxlo.ai/pricing.
Conclusion
Building a multimodal support agent requires stitching together embeddings for NLU, vision models for image understanding, audio transcription for voice, and an LLM core that can reason over long contexts and call tools. Oxlo.ai provides all of these through a single OpenAI-compatible API, with request-based pricing that stays predictable as your context grows. If you are evaluating inference providers for your next support agent, Oxlo.ai is a strong, relevant option that reduces cost complexity without sacrificing model choice.
Top comments (0)