Santiago Espinosa

Building in production · Medellín

Senior AI Engineer5+ years of experience

AI Agents · RAG · Evals · AWS

I put AI agents in productionand make them behave.

Agents that route, call tools and ask before they act. Retrieval that cites its sources. Evals, cost ceilings and guards for the day the model is wrong. I design them, ship them and run them, end to end, on AWS.

  • LangGraph
  • RAG
  • MCP
  • TypeScript
  • Python
  • AWS
  • Postgres
controli-agent · one turn

user  “Which members still owe March?”

  1. supervisorforced tool call → club_data specialist
  2. policyallow · read scope · checked server-side
  3. toolrun_sql in sandbox · read-only role
  4. guardlexer blocks role escapes
  5. verifierstrip invented links and citation marks

✓ answer with the list · offers to draft reminders

◷ waits for a human before sending▍

Illustrative turn. Every step exists in the code.
products I built and run, live today
5
products I built and run, live today
commits on Controla.Club since Aug 2025
2,469
commits on Controla.Club since Aug 2025
AWS services behind one of them
16
AWS services behind one of them
shipping AI features in production since
2022
shipping AI features in production since

Selected work

Products I designed, built and run. Live in production, not in a slide deck.

01

Controla.Club

controla.club ↗

Club management SaaS with an agent that can touch real data.

controla.club
Controla.Club landing page: a club management platform with automatic WhatsApp payment reminders.

Founder-engineer · architecture, AI, infra

Members, billing, access control and training for sports clubs, academies and gyms. Clubs used to chase payments on WhatsApp and check receipts by hand; the platform does both, and Controli, its assistant, answers questions and acts on the club’s data.

commits
2,469
commits
test files
628
test files
AWS services
16
AWS services
  • Next.js 16
  • LangGraph
  • pgvector
  • Supabase
  • AWS Lambda
  • SQS
  • SST
  • OpenRouter
  • MCP
  • Baileys
  • C# .NET

What I built

  • Controli: a LangGraph supervisor that routes each turn, by forced tool call, to one of six specialists. It holds no domain tools itself.
  • Hybrid RAG: Spanish full-text search plus pgvector, fused with Reciprocal Rank Fusion, degrading to lexical search when embeddings fail.
  • Payment AI: a WhatsApp receipt goes through receiver → SQS → worker; a graph classifies it, reads the amount, matches pending charges and stops for human approval.
  • Club Radar: deterministic snapshot → churn scoring → analyze, critique, investigate with sandboxed SQL, synthesize. Validated with zod, capped by a per-club monthly AI budget.
  • An MCP server that exposes club, CRM and news tools behind scoped tokens.

The hard parts

Text-to-SQL that cannot escape

The agent runs SQL under a read-only Postgres role, behind a lexer faithful to Postgres that closes role-escape and SECURITY DEFINER gaps. Both have their own test suites.

Policy from the server, never from the model

Tool calls are authorised against server context with an allowlist. Risk grows with the real scope of the input: deleting one member is not deleting four hundred. Risky actions need a typed confirmation.

Guards born from incidents

After the model invented a URL in production, a link guard checks and strips any controla.club link that does not exist. A verifier removes internal citation markers before the answer leaves.

An AI auditor that reads a company’s chats, files and calendar, and answers with citations.

orviate.com
Orviate landing page: business sources flow into ingestion, classification and AI agents that suggest a decision.

Founder-engineer · product, AI, infra

Orviate connects Google Chat, Drive and Calendar, WhatsApp, Instagram, Messenger and any MCP server into one knowledge base per company. A streaming chat answers with footnoted sources, and the same engine drafts replies in a WhatsApp CRM inbox and runs conversational automations. In four languages.

commits
322
commits
unit tests
137
unit tests
migrations, RLS on all
114
migrations, RLS on all
  • React 19
  • Hono
  • Node 22
  • SST v4
  • Lambda URL streaming
  • SQS FIFO
  • EventBridge
  • Supabase
  • Drizzle
  • OpenRouter
  • MCP

What I built

  • An agent loop with tools (search_knowledge, list_items and more), capped at eight iterations, streaming tool steps and [^n] citations to the UI.
  • A dependency-free MCP client, so any company system becomes a source.
  • Calibrated routing: a typed decision model handles triage, insight validation and chat assignment, with thresholds such as ≥ 0.93 to auto-assign.
  • A WhatsApp gateway on an always-on ARM EC2 with no inbound ports, driven over SQS, with an outbox, recovery and history resync.
  • A golden-set replay that grades every prompt or model change before it ships.

The hard parts

Cutting AI spend with evidence

Removing a redundant finish round saved 19% of spend. Reasoning tokens were 26% of it; capping them at 1,024 was checked against the golden set first.

Prompt caching that actually hits

The system prompt is split into a fixed and a changing part with cache_control, and the provider is pinned. Before that, up to 40% of calls missed the cache.

A Lambda incident, fixed at the root

A database pool exhaustion on the streaming Lambda, traced to the event loop staying alive between invocations, fixed and written up in the engine contract.

An adaptive diagnostic that listens to how you speak English and reads how you code.

donavis.com
Donavis landing page: a diagnostic with a code, English and teamwork score and an estimated date to be interview-ready.

Founder-engineer · AI, product, infra

Donavis trains Spanish speakers to become hireable AI engineers in English. It starts with a free adaptive diagnostic across code, spoken and written English, logic and teamwork, and turns the result into a personal route through 114 courses.

courses
114
courses
interactive lessons
129
interactive lessons
skills measured: code, English, team
3
skills measured: code, English, team
  • Python 3.12
  • FastAPI
  • LangGraph
  • Whisper
  • Gemini
  • React 19
  • Pyodide
  • Supabase
  • EC2
  • CloudFront

What I built

  • A LangGraph state machine (next screen → interrupt → apply answer → score) with a Postgres checkpointer: a diagnostic survives reloads, device changes and restarts.
  • Adaptive testing with item response theory (2PL, EAP estimate), stopping once the standard error is low enough.
  • Speech analysis from word timestamps: pace, pauses, fillers, pronunciation issues pinned to the exact word, and a quick CEFR estimate that adapts the next question while the user is still answering.
  • Python running in the browser (Pyodide in a Web Worker) for the coding lessons.

The hard parts

Interrupts that do not re-run

Generation happens before the checkpoint, so resuming a LangGraph interrupt never calls the model twice.

Audio off the critical path

Speech analysis runs in the background while the test continues, and scoring waits for it with a bounded timeout.

A simulated candidate as the end-to-end test

QA runs a full diagnostic with a synthetic candidate whose spoken answers are synthesised with a Spanish accent, and reports the model cost of the run.

A WhatsApp agent that books courts, and code that decides what is free.

cancha.controla.club/demo
Controla Canchas interactive demo: an isometric map of a sports venue with courts, live bookings and payment status.

Founder-engineer · product, design, AI

Booking, payments and daily operations for sports venues. A WhatsApp agent answers customers in the venue’s voice and books, moves and cancels; transfer receipts are read by AI and matched to what each customer owes; unpaid holds release on their own. The owner runs the day from an isometric map of the venue or a classic dashboard on the same data.

commits
86
commits
reducer, two UIs
1
reducer, two UIs
countries’ holidays
14
countries’ holidays
  • Hono
  • OpenRouter
  • Tool calling
  • React 19
  • Astro
  • Drizzle
  • Supabase
  • PayPal
  • AWS Lambda

What I built

  • The booking agent: it knows the venue and the customer, but free hours, holds, moves and cancellations are computed by tools. The model never decides availability, and hands the chat to the team when unsure.
  • Receipt flow: the model reads the transfer photo (amount, bank, reference, recipient, signs of editing), code matches it to the debt, and the venue’s plan decides whether it confirms alone or waits for a person.
  • Learning from history: when a venue links its number, a bounded pass over its most active chats writes a playbook of how it attends and a profile of each regular customer.
  • A live demo of the whole business in the browser, with a simulated clock, and an editable SVG map of the venue.

The hard parts

The model talks, code commits

Prices, availability and holds come from tools over the real schedule, so a confident model can never double-book a court.

Fraud-aware receipts

Extraction returns a confidence and signs of an edited, cropped or reused image; anything doubtful goes to a person instead of confirming a booking.

One reducer, two interfaces

An interactive map and a standard dashboard read and write the same state, so neither can drift from the other.

Free, open-source prep for cloud certification exams, in Spanish.

aprobaya.academy
AprobaYa landing page: free, open-source preparation for cloud certification exams.

Creator · open source

A study platform for AWS, Azure, GCP and Docker certifications. Theory organised by exam domain, a realistic exam simulator and explanations of why each wrong answer is wrong. No sign-up, no payments: progress is saved in the browser and the app keeps working offline. Open source, so the community can add questions and translations.

practice questions
200+
practice questions
study articles
64+
study articles
simulator modes
3
simulator modes
  • Next.js 16
  • React 19
  • TypeScript
  • Tailwind 4
  • Framer Motion
  • Radix UI
  • Recharts

What I built

  • An exam simulator with three modes (study, real exam and by domain), with a timer and the official scoring.
  • A theory module of 64+ articles organised by the domains of the exam.
  • Progress tracking with statistics, study streaks and achievements, stored locally.
  • An offline-first app: once loaded, it works without a connection.

The hard parts

No account, no backend

Everything a learner needs, progress included, lives in the browser, so there is nothing to sign up for and nothing to keep running.

Built for contributions

Questions and content are open under CC BY-NC-SA 4.0, so people preparing the same exam can fix and extend them.

Approach

How I build AI that holds up

  1. 01

    Decide in code what the model may do

    Permissions, scopes and budgets live on the server. The model proposes; policy decides; a person approves what is risky.

  2. 02

    Measure before you change a prompt

    A golden set replays real cases on every change of prompt, model or setting. Savings ship only when quality holds.

  3. 03

    Know what each answer costs

    Every call records tokens, latency and cost. Caching, reasoning caps and model fallbacks are tuned from that ledger, not from guesses.

  4. 04

    Plan for the model being wrong

    Typed outputs, verifiers, rule-based fallbacks and graceful degradation, so a bad answer is caught before a customer sees it.

Career

Experience

  1. Jul 2026 — Present

    Medellín

    Product Operations Engineer · Wenia

    Product operations engineering at Grupo Bancolombia’s digital-asset platform.

    • Fintech
    • Product operations
  2. Mar 2026 — Jul 2026

    Remote

    Tech Lead & AI Engineer · Oversai

    Agentic workflows with LangGraph and LangChain: multi-step reasoning, tool use and human-in-the-loop review gates. Multi-provider LLM integration (Claude, OpenAI, Azure OpenAI) behind FastAPI services, hybrid RAG, and evaluation pipelines with RAGAS and Langfuse. Scaled data ingestion and drove the adoption of AI tooling across teams.

    • LangGraph
    • RAG
    • Evals
    • Team lead
  3. Jul 2024 — Feb 2026

    Remote

    Senior AI Engineer · NICE

    AI engineering for contact-center software: retrieval-augmented generation and neural-network features in a global enterprise product.

    • RAG
    • Neural networks
    • Enterprise
  4. Jul 2021 — Jul 2024

    Medellín

    Software Engineer → Senior Software Engineer · Playvox

    AutoScoring and AutoQA: AI sentiment analysis and automated evaluation of agent–customer interactions, where I owned the activation UI and the integration with CustomerAI. Quality-management features for enterprise customers, third-party integrations (Kustomer, Zendesk, Salesforce) and the move from a monolith to AWS microservices.

    • AI scoring
    • Sentiment analysis
    • Serverless
    • Integrations

Let’s talk about agents that hold up.

Questions about something I built, an idea worth comparing notes on, or a system that misbehaves in production: write to me. English or Spanish.

  • Happy to talk about
  • →Agents and assistants that act on real data
  • →RAG with citations, evals and cost control
  • →Taking an AI prototype to production on AWS