AI engineer portfolio
Freelance AI engineer shipping production AI-native products end-to-end, not just bolting on an OpenAI call. Voice agents on OpenAI Realtime + Twilio with sub-second latency budgets, RAG systems with proper chunking and eval loops, tool-calling architectures, and the eval discipline to know when the model is failing in production. Currently building two AI-native products of my own — a voice agent for L1 support and an AI-first scheduler with an inline copilot.
- OpenAI Realtime API with Twilio for sub-700ms voice agents
- RAG: chunking, embeddings, hybrid retrieval, reranking, eval sets
- Tool-calling architectures with zod-validated structured outputs
- Multi-model routing across Claude, GPT, and open-source via Groq
- Prompt design, prompt caching, and per-tenant token budgets
- Eval loops with golden sets, judge LLMs, and CI regression checks
- Voice agent handoff to humans with full context preservation
- Vector stores (pgvector, Pinecone) and BM25 + embedding hybrid search
Shipped work for the same brief.
- 2026Phone Assistant — AI voice agent for L1 supportAI voice agent on OpenAI Realtime + Twilio handling L1 customer support: call routing, FAQ resolution, ticket creation, and clean human handoff. 640ms median, 880ms P95 turn latency.OpenAI RealtimeTwilioNext.jsPostgres
- 2026AI-first Scheduler with inline copilotSocial scheduler with an inline copilot that drafts posts, reformats per channel, and learns voice from past content. Cost-aware model routing and per-tenant token budgets.Next.jsOpenAISupabaseVercel Cron
- 2025CVLeap AI — AI-powered resume editorFull SaaS with AI-powered resume editor: streaming responses, structured outputs for ATS-safe formatting, and per-user usage tracking. Shipped in 8 weeks.Next.jsOpenAISupabaseTypeScript
Where most AI builds fail, and how I close the gap.
Most AI builds fail in the gap between demo and production. The model works. The latency budget doesn't. The retrieval looks right in isolation; the answer drifts under load. The eval “feels fine” until a regression ships and three customers churn before anyone notices. The work below is what I run on every AI engagement to keep that gap closed.
1. Latency budget, written before the first line of code
For voice especially, latency is product quality. Sub-one-second turns require an explicit budget per subsystem: STT inbound, first-token-to-speech on the LLM, TTS outbound, network and jitter. I write that budget into the scope doc, instrument every leg in traces, and set the P95 alert before voice traffic hits the box. A median that hits 600ms is meaningless if your P95 is two seconds — the call is already broken for the user who matters.
2. Eval loop with golden sets and regression detection
Every task gets a golden set of inputs and expected outputs, scored by either deterministic checks (for structured outputs and tool-calls) or a judge LLM with a calibrated rubric (for free-form text). Evals run on every prompt change in CI. The team sees a diff before the prompt ships, not a churned customer after. Prompts get versioned in code, not pasted into a Notion doc.
3. Tool-calling reliability with structured-output validation
Tool-calls fail in three ways: invalid JSON, schema-valid but semantically wrong arguments, and the model refusing to call the tool at all. Every tool gets a zod schema, retry-with-correction on parse failure, and a fallback chain when the third attempt still fails. The product behavior degrades gracefully; it doesn't 500.
4. RAG architecture, where most teams actually get stuck
RAG done right is mostly retrieval engineering, not LLM engineering. Chunking strategy depends on your data shape — a contract chunked by token count is unusable; a contract chunked by clause is searchable. Hybrid retrieval (BM25 plus embeddings) is the default when keyword recall matters. Reranking with a cross-encoder lifts precision more than swapping embedding models ever will. And every retrieval configuration gets an eval set with answer-faithfulness scoring before it ships.
5. Cost-of-failure tiers and human-in-the-loop gating
Not every AI output should ship without a human. I sort outputs into cost-of-failure tiers — irreversible vs. correctable, public vs. internal, customer-visible vs. operator-visible — and gate the irreversible/public ones behind explicit confirmation or review queues. The model writes the draft; the operator owns the send.
If your build has an AI surface and a deadline, this is the depth you'd be paying for. The discovery call is 30 minutes and free; you'll leave with a written take on whether your architecture survives the gap above.
What founders ask before reaching out.
What does 'AI engineer' actually mean in your portfolio?
Shipping AI-native products end-to-end. That means model selection with a written tradeoff brief, prompt design, tool-calling architecture, RAG when retrieval matters, voice latency tuning when speech is the surface, evals so you know when it breaks, and cost monitoring so it doesn't blow up your budget. Not just calling chat.completions.create.
How do you keep voice agent latency under a second?
Explicit per-subsystem budget written into the scope doc, P95 traces from day one, streaming everywhere (STT, LLM, TTS), and a Node/Twilio mediator pattern that overlaps STT-final with LLM start. The voice-agents-latency-budget article on this site walks through the architecture and the 700ms target.
RAG architecture — where do most teams get it wrong?
Three places: chunking by token count instead of by semantic unit, embedding-only retrieval when their data needs keyword recall, and no eval set so they can't tell when retrieval quality regresses. Fix those three and you've solved most of what people blame on the LLM.
How do you evaluate prompt changes without manual QA?
Golden set of inputs and expected outputs per task. Deterministic checks for structured outputs, judge-LLM scoring with a calibrated rubric for free-form text. Runs in CI on every prompt change. Prompts are versioned in code with the eval results in the PR description.
Claude vs OpenAI — how do you choose per-task?
Capability, latency, cost, and failure modes for the specific task. Claude for long-context reasoning and tool-use reliability. GPT for voice (Realtime) and the broader function-calling ecosystem. Open-source via Groq when latency or per-token cost dominates. Every engagement gets a written tradeoff brief; choices are not theological.
What does 'production' mean for an AI feature?
Tracing on every model call, latency P95 alerts, golden-set evals in CI, cost dashboards per tenant, structured-output validation, retry/fallback chains for tool-calls, human-in-the-loop gating for irreversible actions, and a runbook for the moments when the model starts refusing or drifting. Until those exist, the feature is a demo.
- The full product-engineering arc
- Voice agents and latency budgets in production
- Why most AI SaaS products have terrible UX
- Need Next.js + AI together? Hire a Next.js developer who knows the App Router
- Need backend + auth + AI in one build? See the MERN portfolio
- Component-level React craft
- Services & pricing
Let's see if it's a fit.
30-minute call. No pitch, no slides. Tell me what you're building, including the AI parts, and the constraints. I'll tell you if I can help, and who else to call if I can't.