AI Engineer · Liverpool, UK

I build AI agents, and the small models that check their work.

Most of what I make sits where agents meet the real world: phone calls that get cut off too early, tools that get called twice, answers that drift from the data they came from. I fine-tune models for those problems, measure them on data they've never seen, and ship them behind tests.

0%

TinyJudge accuracy on 208 real agent conversations. A 27B LLM judge got 81.2%.

0

test clips in 23 languages behind haan's phone-line results.

#0

my pull request merged into Weights & Biases' rai-toolkit.

0/10

BTech GPA, First Class with Distinction. Now an MSc at Liverpool.

01 · Selected work

Three projects, each started from someone else's open issue.

02 · Notes

Write-ups, with the parts that didn't work.

Each note says what the problem was, what I built, how I measured it, and where the result stops being trustworthy.

If you run an AI agent in production, you want something watching it: did it follow the refund policy, did it call the right tool, does its reply actually match what the tool returned? The usual answer is to ask a big LLM to grade it. That works, but it's slow and expensive for what are mostly yes-or-no questions, and it gives you no confidence score you can act on. Someone raised exactly this in AWS Strands Agents #4585, and I wanted to see how small the judge could get.

What I built

TinyJudge is ModernBERT-base, about 150M parameters, fine-tuned to answer three questions about an agent's turn: was the policy followed, was the right tool chosen, and is the reply faithful to the tool results. The training data comes from rule-labelled agent trajectories plus LLM-written replies, and the dataset is versioned with a SHA-256 manifest so a run can always be traced back to the exact data it saw.

Fig. 1 Accuracy on 208 held-out conversations from a real LLM agent
TinyJudge 150M
88.0%
LLM judge 27B
81.2%
0.20 → 0.10calibration error (ECE) on the grounding task after Platt scaling
74% → 84%grounding accuracy after calibration
89.9% · 35%cascade accuracy, sending only 35% of cases to the LLM

Making the confidence mean something

A judge that says 0.9 should be right about 90% of the time. Out of the box it wasn't, so I fitted Platt calibration per task on a separate half of the real data. Calibration error on the grounding task halved, and once the scores were honest I could build a cascade: TinyJudge handles the cases it's sure about and only hands the uncertain ones to the big LLM. That got to 89.9% while sending about a third of the traffic upstream.

Shipping it

Runs are tracked in MLflow and models are versioned on the Hugging Face Hub. The FastAPI service exposes Prometheus metrics and simple drift signals. In CI, GitHub Actions builds the Docker image, smoke-tests it, benchmarks it, and refuses to publish if accuracy drops below 85%. That gate has caught me more than once.

Where it stops

It's one demo domain, and there are only 38 to 85 real test examples per task, so small differences between models are within noise. I'd want a second domain before calling it general.

Haan is Hindi for "yes", the little word you say on a call to show you're still listening. Voice agents need the opposite skill too: knowing when you've actually finished. They decide that with end-of-turn models, and the open ones are trained on clean 16 kHz audio. Phone calls are 8 kHz and squashed into a narrow band, so the model hears a pause, guesses you're done, and talks over you. People asked about it in pipecat-ai/smart-turn #42, so I measured how bad it was and tried to fix it.

Fig. 2 What goes wrong on a phone line (illustration, not real data)
studio-trained model cuts in at the pause phone-tuned model waits for the real end

What I did

I started from Smart Turn v3.2. Only the ONNX export was released, so I recovered PyTorch weights from it, exact to 6e-8, so I could fine-tune. Then I trained with telephony augmentation (8 kHz resampling, μ-law, the 300 to 3400 Hz band) against a control trained identically without it.

Over a simulated phone line, 31,527 clipsControlhaan
Callers wrongly cut off11.09%8.64%
Accuracy91.52%92.78%
Languages that improved–23 of 23

Everything is reported with paired bootstrap 95% confidence intervals and per-language tables, because a single average across 23 languages hides a lot.

The honest bit

I also put haan through LiveKit's public turn-detection benchmark in eot-bench #18. On their clean benchmark audio it ties the base model. Their maintainer reproduced my numbers and confirmed the phone-line gains hold, but on clean audio no metric moved beyond noise, so the PR wasn't merged. That's the right call: the fix only matters on degraded audio, and the benchmark doesn't have real phone calls yet. I learned more from that review than from my own results table.

Agents re-derive the same procedure in every conversation and skip steps along the way: they issue a refund before checking the order, or forget to confirm the email. Google ADK #5398 asked for a way to learn those procedures from what the agent has already done. SkillMiner is my working answer.

Fig. 3 The pipeline
Agent tracesADK plugin Intent minerLLM, ARI 0.93 Skill writerPII redacted SKILL.mdA/B validated

How it works

An ADK plugin records traces. To have something to mine without real customers, I wrote an LLM customer simulator with personas and hidden labels, so I always know the true intent behind each conversation. The intent miner groups conversations with an LLM and reached purity 1.00 and ARI 0.93, against 0.48 for a TF-IDF clustering baseline. The repeated workflows are written out as Agent Skills (SKILL.md files) that ADK loads directly.

Before a skill ships, a paired A/B validator runs the agent with and without it and compares them with an exact McNemar test. There's also PII redaction on the traces and a drift check for when tools change underneath a skill.

The bug I'm glad I found

When the model provider rate-limited a turn, the whole turn was retried, which ran the refund and email tools twice. Retries now happen per model call instead. There are 23 offline tests so it all runs in CI without API keys.

In a pilot A/B test with 8 pairs, procedure compliance went from 75% to 100% and policy violations from 1 to 0. Eight pairs is too few to be statistically significant, and I say so in the README.

03 · Open source

Small contributions to tools I actually use.

04 · Earlier work

Before agents, vision and speech.

2024

FusionNet

A multimodal video pipeline with four cooperating agents (loader, vision, audio and NLP) under a controller. Inter-agent latency under 200 ms, 91% label consistency over 50+ videos.

Python · Docker · Pytest
2024

Driver drowsiness detection

A real-time computer vision web app served through a Flask API at 24 FPS, with 95% accuracy over 200+ sessions.

OpenCV · Dlib · Flask
2024

Speech emotion recognition

Seven emotions at 88% accuracy on 10,000 samples, under 300 ms per prediction, deployed on AWS EC2 with Docker.

TensorFlow · Docker · AWS EC2
05 · Certificates & education

The paperwork, verifiable.

Google Cloud

Associate Cloud Engineer

Issued June 2024 · valid to June 2027

Google · TensorFlow

TensorFlow Developer Certificate

Issued April 2024

IBM Developer Skills Network

Python

Issued September 2024

Automation Anywhere

Essentials RPA Professional

Automation 360 · 2023

2026 – 2027

University of Liverpool

MSc Advanced Artificial Intelligence and Data Science

2021 – 2025

KL University, India

BTech Artificial Intelligence and Data Science · GPA 9.4/10, First Class with Distinction

06 · Contact

Working on agents, evals or voice? I'd like to hear about it.

sricharansripadi618@gmail.com