In production

AI engineer building production agent systems.

Full-stack engineering underneath — I ship agents that people depend on daily: voice, support, and context-aware platforms running in production.

2,000+
conversations per day at peak
55–60%
of contacts resolved end to end
~3%
conversion on cold leads, by voice Fully autonomous outbound — no human on the dial.

Selected work

01

Flagship project

Context-aware agent platform for wealth management

Mavericks.AI — wealth managers and investment advisors

Problem

Advisors lose hours every week writing up meetings and reassembling client context scattered across WhatsApp voice notes, transcripts, and financial feeds.

What I built

An end-to-end platform that ingests unstructured data, runs automated analytics pipelines, and serves context-aware agents for real-time advisor support. Calendar-integrated agents join scheduled meetings on their own via Recall.ai, record, and trigger webhook-driven async processing. The engineering core: the agent is wired into every backend route through a monorepo with an automatic integration generator, plus a query-structuring layer on top. Pagination, summarisation, and structured tools give the model clean inputs and outputs. It is not a dump of the system into context — it is structured, real-time digestion of the system's data.

How the platform digests context

// unstructured in, structured out

  1. Sources

    WhatsApp voice notes

    Meeting transcripts

    Financial feeds

    scattered · unread · unlabelled

  2. Ingest

    calendar-triggered

    Agents join the scheduled meeting on their own via Recall.ai and record it.

    webhook → async queue

    processing off the request path

  3. Structured layer

    monorepo

    automatic integration generator

    every backend route

    • GET tool
    • GET tool
    • GET tool
    • POST tool

    generated, not hand-wired

    query-structuring layer

    • pagination
    • summarisation
    • structured tools

    clean inputs and outputs for the model

  4. Agents in the product

    • Meeting analysis

      Agents join the scheduled call on their own, record it, and turn the transcript into client insights and CRM action items.

    • WhatsApp conversation analysis

      Voice notes and client threads are ingested and digested into structured context instead of sitting unread in a chat history.

    • In-product advisor support

      Agents answer inside the platform with real-time, structured access to every backend route — queries, pagination and tools, not a context dump.

    • Relationship briefings

      Before each meeting, a briefing on the client and the relationship: what moved, what was said, and what is still open since the last interaction.

  5. Advisor

    3–4 insights and CRM items per meeting

    ~6–7 h of write-up saved a week

    context arrives digested, not dumped

Stack

LangGraph · LangChain · Python · FastAPI · TypeScript · Next.js · PostgreSQL · MongoDB · Recall.ai · Docker · GCP · LangSmith · LangFuse

Result

3–4 client insights and CRM action items generated per meeting, saving an active advisor an estimated full workday a week (~6–7 h) of manual write-up. The notetaker built on the same pipeline is used daily by 20+ people.

02

Autonomous voice agent for cold outreach

Mavericks.AI — financial products

Problem

Manual outbound does not scale and converts poorly. Every hour a closer spends dialing unqualified numbers is an hour not spent closing.

What I built

A VoIP agent that calls cold leads on its own, qualifies them in conversation, and routes approved contacts to human closers, sustaining 100+ concurrent calls. Full pipeline tracking with conversion metrics, so the funnel is measured rather than guessed.

From cold list to a closer's calendar

// 100+ concurrent calls, unattended

Live call

line 47 of 112 · 00:42 · qualifying

voice agent
agent speaks prospect answers
prospect

// example call, not a capture

  1. Cold list

    8,000+

    leads processed

    unqualified until someone dials

    Scheduler

    Cloud scheduling paces the list and refills slots as calls end.

  2. Dialer

    100+ concurrent

    each cell is one live line 200+ dialed / day

    calls placed without a human on the line

  3. Qualify in conversation

    • right person reached
    • product fit stated
    • budget and timing
    • interest confirmed

    disqualified leads never reach a closer

  4. Human closers

    Only approved contacts are routed through, so closing time goes to people who qualified.

    handoff carries

    transcript · answers · qualification reason

  5. Measured

    ~3% conversion on cold leads

    200+ prospects called per day

    Pipeline tracking

    • dialed
    • reached
    • approved
    • closed

    // only the two ends are published; the stages between them are tracked, not disclosed

Stack

Vapi · Python · FastAPI · cloud scheduling · analytics layer

Result

~3% conversion on cold leads, at 200+ prospects called per day and 8,000+ leads processed.

03

Customer-service agent at scale

Mavericks.AI — healthcare

Problem

High volume of repetitive tickets consuming hours of the support team every day.

What I built

An autonomous support agent with context retrieval, wired into the client's backends for user-database queries and account operations. Its knowledge base improves itself: every conversation transferred to a human was analysed to close the coverage gap that caused the transfer, so resolution climbed over time.

Stack

Python · FastAPI · LangChain · LangGraph

Result

2,000+ conversations per day at peak, 55–60% resolved end to end.

In production

// operated, not just shipped

Every run writes its own record — step by step, call by call, token by token. Those records roll up into one view where spend is attributed to the step that caused it, so an optimisation can be chosen instead of guessed at.

1 · Every run records itself

one run · example figures

analysis_pipeline succeeded 9 steps · 204.0 s
  1. load_input 120 ms
  2. load_history 40 ms
  3. enrich 12.4 s
  4. summarize 13.9 s
  5. analyze 46.6 s
  6. plan 128.4 s
  7. join 40 ms
  8. commit 60 ms
  9. publish 2.4 s
step that made model calls plumbing

A regression has a location before anyone opens a log: the step that slowed down is named, timestamped and comparable to yesterday's run.

model calls in that run

5 calls

Model In / out Cost
Haiku 4.5 69k / 1.2k $0.075
GPT-5 mini 46k / 7.3k $0.013
Haiku 4.5 73k / 5.0k $0.098
Haiku 4.5 8.9k / 4.0k $0.029
GPT-5 mini 5.7k / 3.2k $0.004
total 203k / 21k $0.219

Cost is metered where it happens — per call, on a named step — so it can be added up any way later: by run, by step, by model, by pipeline.

~900 runs over 30 days roll up into

2 · One view over every run

30-day window · filterable by model and pipeline

~900
Runs in the window · ~30 a day
~3,300
Model calls · 3.5 per run
~$0.07
Average cost of a pipeline run
<$0.02
Average cost of a model call
79%
Of all tokens are input
Haiku 4.5
Dominant model · 55% of cost

daily cost

bars, not area — each day is a discrete set of runs

day 1 day 15 day 30

cumulative spend

the series never stops

day 1 → day 30

// shape only — no amount is printed on either chart, because absolute spend belongs to the client

A model swap or a prompt change shows up as a step change in the curve, which is how an experiment gets measured instead of argued about.

3 · Where the spend goes

per step and per pipeline

  1. artifact_analysis / todo_subgraph 30%
  2. meeting_ingestion / enhance_chunk 22%
  3. artifact_analysis / observation_subgraph 18%
  4. artifact_analysis / summary_subgraph 13%
  5. meeting_ingestion / summarize 11%

Five steps out of dozens carry 94% of the bill. Optimisation work goes to those five, and displaying each one as pipeline / step is itself the proof: attribution is per step, not per application.

4 · Which lever to pull

token profile per step — input : output

  1. enhance_chunk 1:1
  2. todo_subgraph 3:1
  3. observation_subgraph 13:1
  4. summary_subgraph 35:1
input output

The ratio names the lever. 35:1 is a context problem — cache it. 1:1 is a generation problem — shorten the output or move the step to a cheaper model.

calls versus cost, by model

the inversion

Calls 35%42%22%
Cost 55%25%20%
Haiku 4.5GPT-5 miniSonnet 4.5

The model with the fewest calls is not the cheapest one: it holds the context-heavy steps. Without per-step attribution that inversion is invisible and the obvious optimisation is the wrong one.

The workspace carries at least three advisors, so the true figure is lower than this: under $25 per advisor per month, against the six to seven hours a week of manual write-up the same system removes. Absolute spend belongs to the client, so this section shows shares, ratios and unit costs only.

Tested

// runs on demand

code change
suite · 20 scenarios every one asserted
  1. 01
  2. 02
  3. 03
  4. 04
  5. 05
  6. 06
  7. 07
  8. 08
  9. 09
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20

20/20 scenarios pass

All must pass, or the change stops here.

At least twenty scenarios cover the customer-facing agents. The suite runs on demand, and a change only reaches a person once every scenario has passed.

Outputs are asserted two ways: regex where the output has structure, an LLM judge where it is prose. Real production failures are promoted into the suite alongside the good paths, so a defect that happened once becomes a permanent test case.

Stack

// what I reach for, and what I have shipped with

How I work

// engineering practice, not a client project

AI makes a team produce a massive volume of code. Ten-plus engineers opening around four PRs a day is 200 PRs a week; at 15–20 minutes of careful review each, that is 50 to 65 engineer-hours a week on the preliminary pass alone. Without tooling that carries the subjectivity of your own environment, you either pay that cost or you review badly.

So I built development-process automation on Claude Code: domain-specialised review skills, code writing that follows the environment's conventions, automated quality-test gates, and generated documentation. The thesis underneath it is that company culture has to exist as documentation, and project history has to be documented and continuously referenced — otherwise the agent has nothing to be faithful to.

Stack

Claude Code · custom skills · CI/CD

Result

Adopted by every engineer on the team, absorbing the preliminary pass over a flow of 200 PRs a week, so human review time goes to design decisions instead of scanning.

Experience

  1. Jul 2024 — present

    Full-stack / AI Engineer · Mavericks.AI

    Lead AI engineer across three production AI products, architecture through deployment, for the financial and healthcare sectors.

  2. Apr — Jun 2025

    Frontend Developer (contract) · OceanGuard — Netherlands

    Live telemetry dashboard for an international maritime platform. TypeScript, Vue, Nuxt.

  3. Sep 2022 — Jul 2024

    Software Engineer · AdaTech — EdTech

    Enterprise ERP with embedded BI tooling, and distributed REST APIs on AWS built on microservices principles.

  4. Jan — Aug 2022

    Software Engineer · IntuitiveCare — healthcare finance

    High-throughput features for a financial automation platform serving large healthcare institutions.

About

I build AI systems that run in production and stay up. Most of my work is agents: voice agents that hold a real conversation, support agents that resolve rather than deflect, and platforms where an agent has structured, real-time access to a live system rather than a pile of scraped context.

Underneath the AI work is ordinary full-stack engineering, and I think that is the part that makes agents survive contact with production. Python and TypeScript, FastAPI and Next.js, Postgres and Mongo, Docker, AWS and GCP, CI/CD and monitoring — the unglamorous layer that decides whether a demo becomes a product.

I hold a Computer Science degree from the University of São Paulo, where I also built SPIRA — a microservices ML system detecting respiratory insufficiency through acoustic voice analysis, in PyTorch, Airflow and MLflow. In September 2026 I start an M.Sc. in Artificial Intelligence at the University of Bologna.

I am open to full-time remote work with flexible hours, and to part-time contract work. I work in English and Portuguese; my Italian is around A2/B1 and improving, so an Italian team works well as long as English is also a working language. I am based in Bologna and available in person there.

Let's talk

Hiring, contracting, or want to compare notes on agents in production — any of these reach me.

Email WhatsApp // ai agent: coming soon LinkedIn GitHub CV (PDF)