I build production-grade multi-agent LLM and voice AI applications backed by 15 years of transportation and data modeling experience. I ship end-to-end AI systems—from Gemini-orchestrated multi-agent platforms with tool calling and RAG to ElevenLabs voice agents—using Python, TypeScript, FastAPI, and modern AI frameworks.
Currently: Project Manager & Senior Transportation Data Modeler at TransLink (Metro Vancouver transit authority) and building AI agent applications.
Hands-on applied AI: multi-agent systems with tool calling, RAG pipelines, ElevenLabs voice agents and MCP servers, built daily with Claude Code, Codex and Cursor.
About & Experience • Projects • Resume (PDF) • LinkedIn • GitHub • Email
Selected Work
Document Intelligence (CICA)
Structured extraction from bid forms, specs and proposals using OpenAI/Gemini with Pydantic/JSON-schema outputs, LlamaIndex RAG, Azure Document Intelligence and Reducto parsing. Flags financial, schedule, scope and legal discrepancies, with an LLM-judged eval harness.
Multi-Agent CRM Automation (ouroAI)
A Gemini orchestrator routes work to four tool-calling sub-agents across SMS, email, WhatsApp and voice, with escalation to humans. A DSPy pipeline optimized on 89 labelled conversations reached 88.9% on a held-out validation set, backed by an LLM eval suite.
Voice AI Agents
Inbound and outbound voice agents on ElevenLabs Conversational AI over Twilio, with signature-verified FastAPI webhooks for scheduling and CRM booking.
Transportation Data and Modeling
Co-developed TransLink's regional trip- and activity-based travel demand model in Python. Built data pipelines in Python and Databricks for a large household travel survey program. Also built an MCP server that lets LLM clients query travel model outputs.
How I Build AI Systems
- Evals over guesswork: In ouroAI, I replaced a hand-written 3-call prompt chain with a DSPy ChainOfThought pipeline optimized with BootstrapFewShot on 89 labelled conversations, reaching 88.9% on a held-out validation set, backed by an LLM eval suite and side-by-side comparison runner.
- LLM-judged eval harness: For CICA document extraction, I built an eval harness using Pydantic/JSON-schema structured outputs that measures extraction accuracy and discrepancy detection.
- Tool integrations: I built travel-mcp-server, an MCP server with 8 tools that lets LLM clients query travel-model outputs with DuckDB SQL. For ElevenLabs voice agents, I use server tools that call signature-verified FastAPI webhooks.
- Humans in the loop: ouroAI agents escalate to humans when needed.
- Reproducible experiments: The LLM-driven four-step travel demand model uses a hash-keyed SQLite request cache, a cost guard with dry-run, and placebo-controlled prompt-framing tests.
- Testing: ouroAI has 50+ pytest files plus Vitest and Playwright end-to-end tests.
Recent Posts
Series: Looking back — A retrospective on applied AI projects from 2024-2026
-
Oct 26, '26
Looking back: structured extraction with Pydantic and JSON schemas, the core of CICA
This is a look back, written in 2026, at work from spring 2025—specifically March to June of that year. By… -
Mar 1, '25
From Forecasting Models to AI Agents
People often ask how I went from transportation modeling to building AI agents. On the surface, these seem like completely… -
Nov 1, '24
Building with LLMs: Lessons from the Trenches
After a year of building products on top of large language models, here are the lessons that cost me the…