Agents in production

The gap between a working demo and a system you can leave running

An agent in production works on real data and spends money on every model call. I define which actions need approval, how to stop a run and how to check behaviour after a change.

Tool calling
I connect tools to the domain services the product already uses, with the same validation and permissions.
Write safety
I define what each tool may change and which actions need explicit approval before they run.
Evals
I run a fixed set of cases in CI on every prompt, model or tool change to catch regressions before deployment.
Cost control
Token accounting per run and per tenant, with the caps and fallbacks that keep an agent loop from turning into an unbounded bill.

Production systems and a demo

An open-source demo and three systems I have worked on.

The systems come from my time at FXStreet (2020-2025) and from my freelance work since 2023; client names are omitted. The demo is open source and you can read all of it.

  • invoice-assistant

    An open-source demo of tool calling, write controls, evals and cost tracking.

    Read the code (opens in a new tab)

    • Tools call the app's REST API with the user's token and permissions
    • Writes require human confirmation, follow rules in policies.json and have per-turn limits on tool calls
    • Evals run in CI against a real model; a one-line prompt regression turns the pipeline red
    • Tokens, euros and latency metered per model call, behind a daily spend kill switch
    Eval cases
    36 in CI
    Write gate
    Server-side
    Spend
    Daily cap
  • Platform re-architecture

    Moving a legacy monolith to cloud-native.

    • Split the monolith into domains that deploy independently
    • Moved communication between them onto Kafka, so one service failing no longer fails the request
    • Reduced regression testing time from days to minutes
  • Cost and performance optimisation

    More throughput on a smaller bill.

    • Rewrote the queries and indexes that dominated the load
    • Put Redis in front of the reads that repeated most
    • Sized the Kubernetes requests to what the pods actually used, and let autoscaling take the peaks
    Throughput
    15k+ msg/min
    Regions
    Multi-region
  • Reliability and on-call

    Service monitoring and automated incident response.

    • Defined SLOs and measured the services against them
    • Built the dashboards around those SLOs
    • Automated the routine steps of incident response
    Monitoring
    New Relic

Platform and delivery experience

Financial data services and deployment pipelines

  • FinTech platform delivery

    Built and evolved multi-tenant services processing high-frequency financial data, with delivery guarantees that hold through broker and consumer restarts.

    .NET, Azure, Kafka, Redis, TimescaleDB

  • CI/CD delivery modernisation

    Moved legacy delivery pipelines to GitOps workflows with repeatable deployments.

    Kubernetes, Helm, GitHub Actions, Terraform, ArgoCD

What I work with

What I reach for, and what I have run in production.

Applied AI
Azure OpenAI, Amazon Bedrock, Model Context Protocol, LLM evals
Infrastructure
Kubernetes (AKS and EKS), Terraform, Docker
Cloud
AWS, Azure
Observability
OpenTelemetry, New Relic
Backend and data
.NET 10, Kafka, PostgreSQL
Web
Next.js, React

What do you need to connect or improve?