By Sagar Shankaran, Founder of CallSphere
Build an AI agent for auto repair shops that looks up vehicle service histories by VIN, recommends maintenance based on manufacturer schedules, books appointments, and provides transparent pricing estimates.
Key takeaways
Auto service shops depend on service advisors who greet customers, look up their vehicle history, recommend services, provide price quotes, and book appointments. This role requires deep knowledge of manufacturer maintenance schedules and the ability to juggle a busy calendar. An AI agent can handle the entire intake workflow, letting human advisors focus on complex diagnostics and customer relationships.
The agent we build will decode VINs to identify vehicles, check service histories, recommend overdue maintenance, quote prices from a service catalog, and book available appointment slots.
A Vehicle Identification Number (VIN) encodes the make, model, year, engine type, and manufacturing plant. Here is a simplified decoder:
Hear it before you finish reading
Talk to a live CallSphere AI voice agent for auto shop in your browser — 60 seconds, no signup.
flowchart LR
INPUT(["User intent"])
PARSE["Parse plus<br/>classify"]
PLAN["Plan and tool<br/>selection"]
AGENT["Agent loop<br/>LLM plus tools"]
GUARD{"Guardrails<br/>and policy"}
EXEC["Execute and<br/>verify result"]
OBS[("Trace and metrics")]
OUT(["Outcome plus<br/>next action"])
INPUT --> PARSE --> PLAN --> AGENT --> GUARD
GUARD -->|Pass| EXEC --> OUT
GUARD -->|Fail| AGENT
AGENT --> OBS
style AGENT fill:#4f46e5,stroke:#4338ca,color:#fff
style GUARD fill:#f59e0b,stroke:#d97706,color:#1f2937
style OBS fill:#ede9fe,stroke:#7c3aed,color:#1e1b4b
style OUT fill:#059669,stroke:#047857,color:#fff
from dataclasses import dataclass
from typing import Optional
@dataclass
class VehicleInfo:
vin: str
year: int
make: str
model: str
engine: str
transmission: str
VIN_DATABASE = {
"1HGCG5655WA027834": VehicleInfo(
"1HGCG5655WA027834", 2023, "Honda", "Accord", "1.5L Turbo", "CVT"
),
"5YJSA1E26MF384721": VehicleInfo(
"5YJSA1E26MF384721", 2025, "Tesla", "Model 3", "Electric", "Single Speed"
),
"2T1BURHE0KC246810": VehicleInfo(
"2T1BURHE0KC246810", 2024, "Toyota", "Camry", "2.5L I4", "8-Speed Auto"
),
}
In production, you would call the NHTSA VIN Decoder API or a commercial service like DataOne for comprehensive vehicle data.
Define your service offerings with pricing that varies by vehicle type:
from agents import function_tool
@dataclass
class ServiceItem:
service_id: str
name: str
description: str
base_price: float
duration_minutes: int
mileage_interval: int
SERVICE_CATALOG = [
ServiceItem("SVC-001", "Oil Change - Synthetic", "Full synthetic oil and filter",
79.99, 30, 7500),
ServiceItem("SVC-002", "Tire Rotation", "Rotate and balance all four tires",
49.99, 30, 7500),
ServiceItem("SVC-003", "Brake Inspection", "Full brake pad and rotor check",
39.99, 45, 25000),
ServiceItem("SVC-004", "Transmission Fluid", "Drain and fill transmission fluid",
189.99, 60, 60000),
ServiceItem("SVC-005", "Coolant Flush", "Complete cooling system flush and refill",
129.99, 45, 50000),
ServiceItem("SVC-006", "Air Filter Replacement", "Engine and cabin air filters",
59.99, 15, 30000),
]
@function_tool
def lookup_vehicle(vin: str) -> str:
"""Look up vehicle details by VIN number."""
vehicle = VIN_DATABASE.get(vin.upper())
if not vehicle:
return f"VIN {vin} not found. Please verify and try again."
return (
f"Vehicle: {vehicle.year} {vehicle.make} {vehicle.model}\n"
f"Engine: {vehicle.engine}\n"
f"Transmission: {vehicle.transmission}"
)
The recommendation engine compares current mileage against service intervals and last-performed dates:
from datetime import date
SERVICE_HISTORY = {
"1HGCG5655WA027834": [
{"service_id": "SVC-001", "date": "2025-09-15", "mileage": 30000},
{"service_id": "SVC-002", "date": "2025-09-15", "mileage": 30000},
{"service_id": "SVC-006", "date": "2025-03-10", "mileage": 22000},
],
}
@function_tool
def get_service_recommendations(vin: str, current_mileage: int) -> str:
"""Get recommended services based on VIN, mileage, and service history."""
vehicle = VIN_DATABASE.get(vin.upper())
if not vehicle:
return "Vehicle not found."
history = SERVICE_HISTORY.get(vin.upper(), [])
recommendations = []
for service in SERVICE_CATALOG:
last_record = next(
(h for h in reversed(history) if h["service_id"] == service.service_id),
None,
)
if last_record:
miles_since = current_mileage - last_record["mileage"]
if miles_since >= service.mileage_interval:
recommendations.append(
f"OVERDUE: {service.name} (last done at "
f"{last_record['mileage']} mi, {miles_since} mi ago) "
f"- ${service.base_price}"
)
else:
if current_mileage >= service.mileage_interval:
recommendations.append(
f"RECOMMENDED: {service.name} (never performed, "
f"due at {service.mileage_interval} mi) - ${service.base_price}"
)
if not recommendations:
return "All services are up to date for this vehicle."
total = sum(
s.base_price for s in SERVICE_CATALOG
if any(s.name in r for r in recommendations)
)
recommendations.append(f"\nEstimated Total: ${total:,.2f}")
return "\n".join(recommendations)
AVAILABLE_SLOTS = {
"2026-03-18": ["08:00", "08:30", "09:00", "10:30", "13:00", "14:00", "15:30"],
"2026-03-19": ["08:00", "09:30", "11:00", "13:00", "14:30"],
"2026-03-20": ["08:30", "10:00", "11:00", "13:30", "15:00"],
}
@function_tool
def book_service_appointment(
vin: str,
customer_name: str,
preferred_date: str,
preferred_time: str,
services: list[str],
) -> str:
"""Book a service appointment for a vehicle."""
if preferred_date not in AVAILABLE_SLOTS:
available_dates = ", ".join(AVAILABLE_SLOTS.keys())
return f"No availability on {preferred_date}. Available dates: {available_dates}"
if preferred_time not in AVAILABLE_SLOTS[preferred_date]:
slots = ", ".join(AVAILABLE_SLOTS[preferred_date])
return f"Time {preferred_time} not available. Open slots: {slots}"
AVAILABLE_SLOTS[preferred_date].remove(preferred_time)
total_minutes = sum(
s.duration_minutes for s in SERVICE_CATALOG if s.service_id in services
)
return (
f"Appointment confirmed:\n"
f"Customer: {customer_name}\n"
f"Vehicle: {vin}\n"
f"Date/Time: {preferred_date} at {preferred_time}\n"
f"Services: {', '.join(services)}\n"
f"Estimated Duration: {total_minutes} minutes\n"
f"Please arrive 10 minutes early."
)
from agents import Agent, Runner
service_agent = Agent(
name="Service Advisor",
instructions="""You are an auto service scheduling assistant. Help customers:
1. Look up their vehicle by VIN
2. Review service history and get recommendations
3. Get price quotes for recommended services
4. Book appointments at available times
Always explain why each service is recommended and be transparent about pricing.""",
tools=[lookup_vehicle, get_service_recommendations, book_service_appointment],
)
result = Runner.run_sync(
service_agent,
"My VIN is 1HGCG5655WA027834 and I have 38,000 miles. What do I need done?"
)
print(result.final_output)
Use the NHTSA or manufacturer OEM APIs to pull official maintenance schedules by VIN. Companies like Carfax and AutoData also sell maintenance schedule APIs. Map each manufacturer interval to your service catalog items so the agent can recommend exact services.
Still reading? Stop comparing — try CallSphere live.
See the auto shop AI agent handle a real call — complete, industry-specific, and live in your browser. No signup.
Yes. Add a warranty check tool that verifies whether the vehicle is still under factory or extended warranty. If a recommended service is warranty-covered, the agent should note that and direct the customer to an authorized dealer if your shop is independent.
Add a real-time availability tool that checks the current shop bay status. If a bay is open and a technician is available, the agent can offer a same-day walk-in slot. Otherwise, it suggests the earliest available appointment and offers to add the customer to a cancellation waitlist.
#AutoService #AppointmentScheduling #VINLookup #MaintenanceAI #Python #AgenticAI #LearnAI #AIEngineering

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.
Step-by-step build of a working agent with the OpenAI Agents SDK — Agent class, tools, handoffs, tracing — plus an eval pipeline that catches regressions before merge.
Smolagents lets agents write Python instead of JSON. Why code-as-action reduces tool errors and where the security trade-offs are for production deployments.
Modal turns a Python function into autoscaling serverless compute with optional GPU. Deploy a LiveKit Agent with one command and get pay-per-second billing.
How small healthcare practices in Long Beach and the South Bay use AI voice and chat agents to automate automated appointment scheduling and rescheduling and give...
A small-practice guide to automated appointment scheduling and rescheduling via CallSphere's 14-tool healthcare agent, grounded in the the East Bay market.
How small healthcare practices in the Central Valley use AI voice and chat agents to automate automated appointment scheduling and rescheduling and give their adm...
© 2026 CallSphere Inc. All rights reserved.
Made within San Francisco
Watch how CallSphere handles real customer calls, schedules appointments, and processes payments — live.