AI Engineer @ Drivee · Muscat, Oman

Behrad AzimiI build LLM & voice agents that work the night shift.

I design, ship and evaluate production AI agents that talk to real customers over chat, SMS, email and phone. Right now that's Sofia, Drivee's 24/7 AI sales agent for car dealerships.

background: a random neural net (CPPN) 8→16→16→16→3 seed 0xc0ffee move your cursor to probe the neurons
~500dealerships run on the agent I work on
43/43real reasoning leaks caught by my guard in 236k production replies
300+commits to production AI agents since Oct 2025
1 dayfrom idea to Chrome Web Store submission

01 — now

AI Engineer at Drivee. I build the agents dealerships trust with their customers, and the tests that prove they're right.

Drivee is an AI operating system for car dealerships across the US. Its sales agent, Sofia, answers every lead within seconds at any hour over SMS, email, web chat, Messenger and Instagram: hundreds of thousands of AI replies a month. I work on the AI itself: what it's allowed to say, how it fails safely, and how we measure that it got it right.

Drivee ↗

AI Engineer · Muscat, Oman · Aug 2025 – present

build · Sofia, the AI sales agent

  • Owned the V1 conversation engine (Apr–Sep 2026): appointment logic for closed days and opening hours, structure-aware SMS splitting, MMS, and an inventory glossary that ties model and trim words to the dealer's real stock.
  • Rebuilt the AI follow-up engine. Each nudge rotates its angle, reads both sides of the recent conversation, catches repeats and only offers what the dealer can actually do. Shipped with a 410-line test suite.
  • Guardrails on V2, where classifiers route each message to expert modules, a writer model drafts the reply and validation guards check it. No made-up prices (34/48 → 48/48 test scenarios), no invented staff names (29/36 → 36/36), and follow-ups that know which cars have sold (617 → 916 of 929).
  • Reliability: automatic failover to a second model provider when the primary is down (0/33 → 33/33), and quiet hours for appointment timers that hold across time zones and daylight-saving changes (79 scenarios plus a time-travel simulator).

build · HeyGent, the AI voice receptionist

  • Prompt architecture for a phone agent that answers calls for dental clinics in the US and Canada: a modular Jinja2 system composes each clinic's prompt from feature flags (booking, cancellation, voicemail, call forwarding) and only exposes the tools that clinic has.
  • Call flows end to end: booking, rescheduling, cancellation within clinic limits, confirmations, new vs. existing patients, insurance, Spanish, and safe fallbacks to voicemail or the front desk.
  • A deterministic date tool. LLMs are bad at "next Friday at 3", so the agent calls a timezone-aware parser instead. I also inject the clinic's live local time into calls in progress, written so the speech engine reads it naturally.

evaluate · prove it before it ships

  • A before/after test round for every fix: realistic scenarios plus replays of real production cases, scored automatically. 17 rounds since September.
  • Reasoning-leak guard: stops the model's private draft notes from ever reaching a customer. Run against 236,615 production replies, it caught all 43 real leaks with one false alarm.
  • Blind model benchmark: 80 conversations judged by two different model families to choose our fallback model. The winner replies in 4.7 s at the median, against 14.6 s.

share · make the work legible

  • A 26-chapter onboarding course for the V2 codebase, an LLM fine-tuning R&D report (75 sources), and a plain-language summary archived for every report and test round.
agent trace · SMS · 11:42 PM replay

customerHi! Is the 2023 RAV4 XLE still available? Could I see it Saturday morning?

planner.classify() → availability + appointment

inventory.search(model: "RAV4", trim: "XLE", year: 2023) → 1 in stock · 18k mi

dealer.hours(dept: "sales", day: "Sat") → 09:00–17:00

agentYes, the 2023 RAV4 XLE (18k miles) is still here. We open at 9 on Saturday. Would 10:30 or 11:30 work?

customer10:30 works. Do you take trade-ins?

appointments.book(slot: "Sat 10:30") → confirmed

knowledge.lookup("trade-in policy") → no dealer answer

handoff.create(reason: "trade-in") → task for sales team

guards(price, names, leak) → all clear

agentYou're booked for Saturday at 10:30. I've asked our team about your trade-in, and they'll reach out before your visit.

eval · conversation review facts match inventory pass slot inside department hours pass booking record matches chat pass unknown answer handed off pass no invented price or promise pass
Illustrative replay with simplified tool names. Not real customer data.
PythonLLM tool callingGuardrails & evalsVapiOpenAIMulti-model failoverElasticsearchCloud FunctionsCloud TasksFirebase RTDBGitHub ActionsTwilioSendGridDeepgramJinja2NexHealth APIClaude Code

02 — how I work

AI-native engineering. I automate my own job first.

Most of my QA and triage runs through Claude Code skills I wrote and keep refining with the team's feedback. Hours of manual review become a report anyone can rerun, check and argue with.

conversation-review
$ /dealer-conversation-review
fetch   10 days · read-only
grade   30 chats per reviewer
score   7 areas · 0–5 · severity
report  findings + KPIs

Grade every conversation

Reviewers grade a dealer's conversations against a written rubric: accuracy, appointments, hand-offs, dealer rules, flow, follow-ups and system problems. The interactive report has evidence quotes, recurring problems, proposed fixes and agree/disagree buttons, plus the dealer's KPIs.

bug-triage
$ /v2-bug-triage
pull    Slack lists + Trello
join    chat behind each ticket
score   severity 0–100
split   AI fix vs backend fix

Triage with the evidence attached

Merges every open ticket from Slack and Trello, de-duplicates twins, embeds the customer conversation and groups everything by root cause, so fixes ship in batches instead of one ticket at a time. Rebuilt daily.

test-round
# price guard: no made-up prices
before  34/48 pass
after   48/48 · 2nd model 60/60
data    prod knowledge → dev
ship    dev → prod · archived

Measure the fix, not the vibe

Every change gets a before/after round on realistic scenarios and replayed production cases, run on dev with production's real dealer knowledge, which I sync over read-only and key by key. A fix ships when the numbers move.

my daily loop

  1. Refresh the triage report
  2. Batch tickets by root cause
  3. Plan the fix as an interactive page
  4. Build it in an isolated worktree
  5. Deploy to dev
  6. Run the before/after test round
  7. Ship, then close the tickets
  8. Archive a plain-language summary

03 — experience

From telecom data pipelines to agents in production.

Aug 2025 – nowMuscat, Oman

AI Engineer · Drivee

Two production agents from the same team: HeyGent's voice receptionist for dental clinics (2025–26), then Sofia, Drivee's AI sales agent for car dealerships (2026 – now).

  • 310 commits across the agent, voice-server and backend repositories.
  • Voice: modular prompt system, call flows and server-side tools on Vapi, Twilio and Deepgram.
  • Sofia: owned the V1 engine, rebuilt the follow-up engine, and added V2 guardrails and model failover.
  • Built the team's Claude Code tooling for conversation QA, bug triage and prod → dev knowledge sync.
  • Shipped through GitHub Actions to dev, staging and production on Google Cloud.

Nov 2021 – Dec 2023Tehran, Iran

Software Developer, data engineering · Thousandways Co.

Telecom data engineering for network operations and VoIP.

  • Built automated ETL pipelines (Airflow + SQL) and Python parsers for telecom network operations and VoIP analysis, including SIP signaling troubleshooting tools.
  • Developed analytics and KPI tools with Pandas, NumPy and Matplotlib, plus Grafana and Apache Doris dashboards for real-time monitoring.
  • Built machine-learning classifiers that predicted network faults and triggered real-time service-degradation alerts.
PythonAirflowSQLPandasGrafanaApache DorisDjangoSIP / VoIP

FreelanceRemote

Data Engineer · Agrimonia, University of Milan

A statistical study of how agricultural ammonia affects air quality. I cleaned the regional datasets with Pandas and NumPy and built LASSO regression models to isolate the pollution factors.

04 — side projects

Things I ship on evenings and weekends.

I like taking ideas all the way to production: billing, tests, deploy scripts, store listings, and the postmortem when it goes wrong.

Chrome extension · LLM productOct 2026 · in Chrome Web Store review

BidVerdict: bid or no-bid on a federal contract, in about a minute

Small US contractors lose hours reading solicitations just to decide whether to bid. BidVerdict sits in Chrome's side panel on SAM.gov, reads the notice and its PDF and Word attachments, and returns a Bid / Consider / No-bid verdict with a fit score and reasons.

  • Rules override the model: deterministic eligibility checks (set-aside, certifications, NAICS, deadline, location) run first, and any hard failure forces No-bid whatever the LLM says.
  • Multimodal and structured: Gemini on Vertex AI reads the PDFs directly and answers against a JSON response schema.
  • Production basics: Manifest V3, Express on Cloud Run, Firestore quotas, origin locking, Paddle billing with signed webhooks, Secret Manager, 23 tests on real SAM.gov files and a one-command deploy.
Gemini · Vertex AIChrome MV3Node / ExpressCloud RunFirestorePaddle
BidVerdict side panel showing a Bid verdict with a fit score of 82 for a janitorial services contract, with set-aside, NAICS, deadline and location checks passed.
Quant · risk engineering2026 · paper trading

A copy-trading engine and a backtester that tells the truth

  • Backtested three MACD strategies on 28,766 five-minute BTC prediction markets with real order-book entry prices and no look-ahead. All three lost money, and I wrote up why.
  • The copy engine reconciles to a target portfolio every cycle, so a crash heals itself. Daily-loss and drawdown kill switches survive restarts, and it's read-only by design: there is no signing code at all.
  • After a −10% paper drawdown I wrote a postmortem and shipped the fixes: separate long and short caps, hysteresis and a reversal cooldown. The self-test grew from 27 to 40+ checks.
  • An LLM writes the monthly digest, but it makes no decisions.
PythonpandasGCECloud Run JobsTelegram botClaude
Android gameSep 2026 · private beta

Orbital Pawn: a pixel-art pawn shop on a space station

Scan, refurbish and haggle with alien customers, and keep stolen goods away from the Galactic Patrol. Built in two weeks with Claude Code as my pair programmer.

Orbital Pawn gameplay: the shop floor with a scanner, a refurbishing station and a customer arriving. Orbital Pawn inventory screen listing items with condition, market value and sell prices.
  • Godot 4.3: about 5,300 lines of GDScript in 41 scripts and 23 scenes, with all content data-driven in JSON (107 items, 6 customer personalities).
  • A Python/Pillow pipeline that generates sprites and icons, a scripted end-to-end test and a signed release build.
Godot 4GDScriptPython / PillowAndroid

Art: Cosmic Lilac pack by PetricakeGames.

Freelance · confidential client2026 · in daily use

An AI back office for a currency-exchange business

  • WhatsApp sales agent: a FastAPI webhook with OpenAI function calling that quotes tiered rates, captures leads and saves customer details. It detects Persian, Arabic or English and stays in that language, with off-topic guardrails and a cap on tool rounds. It replaced a rule-based bot.
  • Bank alerts → live ledger: reads alert emails over IMAP, parses them with one parser per bank, de-duplicates by message ID and content fingerprint, rebuilds running balances and exports to Google Sheets. 97 tests.
OpenAI tool callingFastAPIWhatsAppFirebaseCloud Runpytest
LLM app · in progress2026

My AI digital twin

A chat agent that answers recruiters' questions as me, grounded in my own profile and writing style, with conversation memory. Next.js front end and a FastAPI back end packaged for AWS Lambda, with sessions in S3. It's coming to this site next.

Next.jsFastAPIAWS LambdaS3OpenAI

Startup CI/CD

GitHub Actions pipelines with Docker builds, registry pushes and Kubernetes deploys for a team's Django + Nuxt app.

kaktosol ↗

A tiny Telegram bot that reminds me to water my cacti.

CyberSec knowledge base ↗

Notes behind my thesis on AI-driven honeypots for threat detection.

8-puzzle ↗

The 8-puzzle solved with different search algorithms, compared side by side.

ai-learning-dump ↗

Notebooks from learning new AI techniques in public.

This website

Hand-written HTML, CSS and JS. The background is a random neural network rendered in a WebGL shader.

05 — stack

Tools I reach for.

llm & agents

  • OpenAI
  • Gemini / Vertex AI
  • Claude & Claude Code
  • Tool / function calling
  • Structured outputs
  • Prompt architecture
  • Guardrails
  • LLM evals & benchmarks
  • RAG

voice

  • Vapi
  • Twilio
  • Deepgram STT
  • TTS tuning
  • Live call control
  • Post-call analytics

backend

  • Python
  • FastAPI
  • Flask
  • Django
  • Node.js / Express
  • TypeScript
  • Webhooks & REST
  • pytest

cloud & devops

  • Google Cloud: Cloud Run, Functions, Tasks, GCE
  • Firebase: RTDB, Firestore, Auth
  • AWS: Lambda, S3
  • Docker
  • GitHub Actions
  • Linux (LPIC-1/2)
  • nginx · systemd

data & ml

  • Pandas · NumPy
  • Airflow
  • SQL · Postgres · Redis
  • Elasticsearch
  • SQLAlchemy
  • PyTorch · TensorFlow
  • OpenCV
  • Grafana

front end & more

  • Next.js · React
  • Tailwind CSS
  • Chrome extensions (MV3)
  • WebGL / GLSL
  • Godot

06 — about

Hi, I'm Behrad. Most people call me Ben.

Portrait of Behrad Azimi.
Muscat, OmanGMT+4

I'm an AI engineer who started in data engineering, and it shows: I care less about the demo and more about what happens at 3 a.m. when a real customer asks something the model doesn't know.

I spent my first years building telecom data pipelines, VoIP parsers and fault-prediction models. When I moved into LLMs, I found that the hard part of AI products isn't the model. It's everything around it: tools, guardrails, evaluation, hand-offs and the unglamorous infrastructure that keeps an agent honest.

Today I build agents that talk to customers for a living, and I hold them to one rule: if the AI doesn't know, it hands off. Outside work I ship side projects end to end, usually pair-programming with AI. Off screen I keep aquariums, garden (yes, the cactus bot is real) and climb mountains.

education

B.Sc. Computer Science, University of Tabriz (2019–2024)

thesis

AI-driven honeypots for intelligent threat detection (Prof. Jaber Karimpour)

languages

Persian (native) · English (C1)

certifications

LPIC-1 & LPIC-2 (Linux) · Python & SQL data engineering · Pandas & Dask

currently learning

Fine-tuning, MCP and Terraform for production agent infrastructure

works with

US-based teams and customers, from Muscat

07 — contact

Building an agent that has to get it right? Let's talk.

BehradAzimi1@gmail.com