Notes on AI agents that work in Pidgin.
A practical writeup on prompt design, code-switching, and the unglamorous evaluation harness behind an agent that holds a Pidgin conversation without sounding like a translator from 2014.
Nigerian Pidgin is the most widely spoken language in the country and one of the least well served by the models we all build on. That gap is not evenly distributed, which is the part worth understanding before you try to close it. The models are not bad at Pidgin in the way they are bad at a low‑resource language they have barely seen. They are bad at it in a more specific and more fixable way: they have seen a great deal of Pidgin, mostly written, mostly online, and mostly performed.
The result is a model that can produce Pidgin on request and produces the wrong register almost every time — the broad, exaggerated variety of comment sections and comedy skits, which reads to an actual speaker as either a joke or an insult. An agent that opens a customer‑service conversation in that register has lost before the second message.
The register problem is the whole problem
Nigerians code‑switch continuously and with precision. The same person moves between English, Pidgin, and a first language across a single conversation, and the movement carries meaning — formality, warmth, irritation, who is being addressed, how serious the matter has become. It is not noise on top of the message. Much of the time it is the message.
So “support Pidgin” is the wrong specification. What a working agent needs is the ability to sit at the register the user chose and stay there unless the user moves — which is a much narrower target than fluency and, usefully, a much easier one to evaluate.
The models aren't bad at Pidgin. They're bad at knowing which Pidgin, which is a different problem and a more tractable one.
What belongs at the prompt layer
Less than people expect, and none of it clever. The rules worth writing down are almost embarrassingly plain:
- Mirror the user’s register. If they opened in English, answer in English even if they drop a Pidgin phrase mid-sentence — a single phrase is not a language change.
- Never initiate Pidgin. Moving first reads as familiarity that has not been earned, and it is the single fastest way to sound like a brand doing an impression.
- Keep numbers, amounts, dates, and policy terms in English regardless of register. Every speaker does this; a model that translates ₦45,000 into something folksier is signalling that it does not know what it is doing.
- Do not perform. No exclamation stacking, no proverbs the agent was not asked for, no “my brotherly” warmth as a substitute for answering the question.
The third rule is the one we would guard hardest. Money and dates are where a support conversation becomes a commercial commitment, and register experiments there are expensive. English is the neutral setting for the parts of the conversation that could end up in a dispute.
The evaluation harness is where the actual work is
This is the unglamorous part and the part that determines whether any of the above holds up. You cannot evaluate register with a similarity score against a reference answer, because there is no single correct reply and the failures that matter are not lexical. An agent can produce a technically accurate Pidgin sentence that is catastrophically wrong in tone, and every automatic metric will pass it.
What we would score instead is narrower and behavioural. For each case in the set: did the agent hold the register the user set, did it move only when the user moved, did the commercial facts stay in English, and did it answer the question at all. Four binary judgements, graded by a Nigerian speaker rather than a model, on a fixed set of conversations that should grow every time something fails.
1# One case. Boring on purpose — boring is what makes it comparable.2id: register-hold-0143opened_in: pidgin4turns:5 - user: "Abeg my order never reach, e don tey."6 - user: "Order number is FL-20482, placed on the 3rd."7# Turn 2 switches to English. The agent must follow, not lag.8expect:9 register_after_turn: [pidgin, english]10 facts_in_english: true11 answered: true12 escalate: false13graded_by: human # model graders miss register failures
The register_after_turn array is the field that would earn its keep. This is where agents fail in a very specific way — the user switches to English to give an order number, and the agent stays in Pidgin for one more turn because the system prompt told it the conversation was a Pidgin conversation. One turn of lag is enough to feel like being talked down to.
Escalation, and knowing when to stop
Any agent of this kind needs a named human behind it and a rule for reaching them. In Pidgin conversations we would make that rule slightly more eager, for a reason that has nothing to do with the model: a user who has switched into Pidgin to express frustration is telling you something about the state of the conversation, and the correct response to it is often a person rather than a better sentence.
The agent is allowed to be wrong. It is not allowed to be wrong twice about the same thing without a human finding out.
— The line we'd put at the top of any agent spec
What we would tell anyone starting this
Build the evaluation set before the agent. It feels backwards and it is the only order that works, because the set is the thing that tells you whether a prompt change helped or simply moved the failure somewhere you were not looking. Twenty real conversations, graded by hand, will teach you more than any amount of fine‑tuning against scraped text.
And resist the temptation to make Pidgin a feature. It is not a mode to switch into. It is how a large number of your users already talk, and the goal is an agent that does not make that a problem — which is the standard we hold the agents we build to. If users stop noticing which language the agent is in, that is the whole result.
By Yusuf Tahir, PhD, founder of Fattahlabs. Based in Kaduna, Nigeria.
hello@fattahlabs.com