01
The challenge
Overview
AI assistants are moving beyond answering questions. Instead of telling you how to buy airtime, an assistant can buy the airtime for you. Instead of explaining how to send money, it can send the money.
To do this, an assistant needs to use tools. A tool is a function that lets an AI system take an action or look up information, such as send_money(recipient, amount, currency, provider). The model has to work out which tool to use and what information to give it.
In this hackathon, you will train a small language model that takes an everyday request from across Africa, looks at the tools available to it, and produces the correct tool call.
Request
“Abeg send 5k naira to Tunde on MTN MoMo.”
Available tools
send_moneycheck_balancebuy_airtimeconvert_currency
Correct tool call
{
"tool": "send_money",
"parameters": {
"recipient": "Tunde",
"amount": 5000,
"currency": "NGN",
"provider": "MTN MoMo"
}
}That's the entire challenge
Given a request and a set of tools, make the correct tool call.
Why small language models?
Large language models can be very capable at tool use, but they are expensive and difficult to run in resource-constrained environments. This hackathon asks a different question: how capable can a small language model become when we train it specifically for tool calling?
You will work with open models of up to 4 billion parameters and experiment with fine-tuning, synthetic data generation, prompting and inference strategies. The goal is not to build the biggest model. The goal is to build the most accurate small one.
Individuals and teams
You may take part on your own or as a team. Each participant or team submits through one Codabench account.
02
What you take away
Skills you will gain
This hackathon is designed to help you gain practical skills for building and studying language models. You keep these whether or not you top the leaderboard.
Tool calling
Turn natural language into structured function calls, with the right tool and every parameter.
Fine-tuning small models
Adapt open models of up to 4B parameters with LoRA, on a free GPU.
Data-centric AI
Generate synthetic data, mine hard examples, and grow the training set where your model fails.
Evaluation and error analysis
Find which tools, parameters and kinds of request break your model, and fix them.
No prior competition experience is assumed. The starter notebook walks you through prompting and fine-tuning Gemma 3 270M, and writes a submission you can upload.
03
The data
Dataset
The dataset maps English-language requests in African contexts to the right tool and its parameters. Each example has a request, 4 to 6 available tools (the relevant ones and some distractors), and the answer.
| Tool | What it does | Parameters |
|---|---|---|
send_money | Send money to another person. | recipient, amount, currency, provider |
buy_airtime | Buy mobile airtime. | phone, amount, network |
buy_data | Buy a mobile data bundle. | phone, amount, network |
check_balance | Check a mobile money account balance. | provider |
buy_electricity_token | Purchase an electricity token. | meter_number, amount, currency |
report_outage | Report an electricity outage. | location |
get_crop_price | Get the current market price of a crop. | crop, location |
get_weather | Get the weather forecast for a location. | location, date |
convert_currency | Convert an amount from one currency to another. | amount, from_currency, to_currency |
set_reminder | Set a reminder for the user. | task, date, time |
How the splits work
- Train 15,000 examples
- Request, tools and answer. Use it to train and validate your model.
- Dev 2,000 examples
- Request and tools, with the answers hidden. Submit predictions to see your score on the development leaderboard.
- Test 4,000 examples
- Request and tools, with the answers hidden. Released when the final phase opens, and used for the final ranking.
The dev and test sets use different names, neighbourhoods, towns, markets and wording from the training data. The aim is to test whether your model has learned tool calling rather than memorised examples.
Three kinds of request
| Category | Share | Example |
|---|---|---|
| One tool call | 60% | “What's the maize price around Nakuru today?” |
| Missing information | 20% | “Send 2,000 naira to Tunde.” The provider is not given, so it is null. |
| Several tool calls | 20% | “Check my M-Pesa balance, then send 500 bob from it to Otieno.” The calls come as a list, in order. |
Where the requests come from
The language is English, but the world in the data is African: local expressions and chat shorthand, names and titles, mobile money providers and networks, currencies, markets, dates and times.
All names, numbers and codes are made up. The full labelling rules and value formats (amounts as numbers, ISO currency codes, phone numbers as digits, dates such as 15 March, times such as 19:00) are in the dataset README.
04
Starting points
Baselines
Out of the box, small models are poor at this task. Without training, Gemma 3 270M gets almost no requests right, and even Gemma 3 4B gets about a third (34% on a 300-request sample of dev). Fine-tuning changes that.
| Baseline | Dev score |
|---|---|
| Hand-written rules, no model | 49.05% |
| Gemma 3 270M, fine-tuned on 3,000 examples | 64.55% |
| FunctionGemma 270M, fine-tuned on 3,000 examples | 77.00% |
| Gemma 3 270M, fine-tuned on all 15,000 examples | 88.35% |
Even the smallest Gemma model goes from almost nothing to 88% with fine-tuning. How close to 100% can you get?
What might you explore?
Try these, combine them, or develop your own idea. Try, evaluate, improve, repeat.
05
How scoring works
Evaluation
There is one metric. A prediction is correct only when the selected tool and all of its parameters match the answer. When a request needs several calls, every call must be correct and in the correct order.
The metric
Exact-match accuracy
Higher is better.
What counts as wrong
If the answer is send_money to Tunde for 5000 NGN on MTN MoMo, then each of these predictions is wrong:
- The right tool, but
amount: 500. - The right tool and amount, but the wrong provider.
- A value that is not in the request, such as a provider the user never mentioned.
How answers are compared
- Text ignores case, punctuation and extra spaces, so
"m-pesa"matches"M-Pesa". - Numbers are compared as numbers:
5000matches5000.0, but the text"5000"does not. - A parameter left out counts as
null. - A list containing one call is the same as that call.
Keep this in mind
A model should never invent information that is not in the request. If a value is missing, it is null.
06
From idea to entry
How to submit
The hackathon runs on Codabench. You upload a ZIP file with your predictions, and your score appears on the leaderboard once it has been scored.
Rules
- Use any open-weight model with at most 4B parameters. Gemma 3 270M, 1B and 4B, and FunctionGemma 270M are recommended.
- No API calls or larger models may be used when generating predictions.
- Any training technique is allowed, including fine-tuning, synthetic data generation, prompting and decoding strategies.
- You may augment the training data.
- You may not manually label development or test examples.
Recommended starting point
Starter notebook
Explore the data, prompt Gemma 3 270M, fine-tune it, see what more training data does, and write a submission.zip for the dev leaderboard. It runs on a free Google Colab GPU.
Submission process
- 1Join the competition
Create a Codabench account and register for the hackathon.
- 2Train your model
Start from
train.jsonland use any technique within the rules. - 3Predict every request
Make one prediction for every id in
dev.jsonl(in the final phase,test.jsonl). - 4Write
predictions.jsonMap each id to its tool call, or to a list of calls when the request needs several actions.
- 5Zip it
Place
predictions.jsonat the top level of a ZIP file. - 6Upload
Upload the ZIP under “My Submissions” on the Codabench competition page.
{
"dev-01234": {
"tool": "send_money",
"parameters": {"recipient": "Aisha", "amount": 2500,
"currency": "NGN", "provider": "Airtel Money"}
},
"dev-01235": [
{"tool": "check_balance",
"parameters": {"provider": "M-Pesa"}},
{"tool": "send_money",
"parameters": {"recipient": "Otieno", "amount": 500,
"currency": "KES", "provider": "M-Pesa"}}
]
}What happens next?
Codabench scores your submission and the leaderboard shows your best score. In the development phase you can submit up to 5 times a day (100 in total). In the final phase, up to 2 times a day (5 in total).
07
Key dates
Timeline
The hackathon has two phases. All times are in UTC.
- Development phase 10 Oct – 7 Nov 2026
- Train your model, predict
dev.jsonl, and climb the development leaderboard. Closes at 00:00 UTC on 8 November. - Final phase 9 – 10 Nov 2026
test.jsonlis released. Submit your predictions for it; the final ranking uses exact-match accuracy on the test set. Opens at 00:00 UTC on 9 November and closes at 00:00 UTC on 11 November.
08
Good to know
Frequently asked questions
Do I need my own GPU?
No. The starter notebook fine-tunes Gemma 3 270M on a free Google Colab GPU.
Which models can I use?
Any open-weight model with at most 4 billion parameters. Gemma 3 270M, 1B and 4B, and FunctionGemma 270M are recommended.
Can I use ChatGPT, Gemini or another large model?
Not to make your predictions: no API calls or larger models may be used when generating predictions. Any training technique is allowed, including synthetic data generation.
Can I add my own training data?
Yes. You may augment the training data, for example with synthetic examples. You may not label development or test examples by hand. The meta field in train.jsonl describes each example (category, country, style and more) to help you generate data of your own.
What language are the requests in?
English, set in everyday life across Africa, with local expressions and chat shorthand such as “Abeg” or “500 bob”.
What if a request does not give a value the tool needs?
That value is null. For example, “Send 2,000 naira to Tunde.” does not name a provider, so provider is null. A model should never invent information that is not in the request.
What if a request needs several actions?
Return a list of tool calls, in the order the request asks for them. Every call must be correct for the prediction to count.
Why is my dev score lower than my validation score?
The dev and test sets use names, places and wording that are not in the training data. A validation split taken from train.jsonl shares them, so it is more optimistic. The dev leaderboard is the better guide to your test score.
What should my submission look like?
A ZIP file with predictions.json at its top level. The file maps every request id to its tool call, or to a list of calls. Ids that are missing count as wrong.
My submission failed. What should I check?
Check that predictions.json is valid JSON, that it is a single object keyed by request id, and that it is inside the ZIP you uploaded. The error message on your Codabench submission says what went wrong.
How many times can I submit?
Up to 5 times a day (100 in total) in the development phase, and up to 2 times a day (5 in total) in the final phase. The leaderboard shows your best score.
Which score decides the winner?
Exact-match accuracy on the test set, in the final phase. The development leaderboard is for testing your ideas.
Where can I ask questions?
Post on the competition forum on Codabench, or email ai-research-foundations@aims.ac.za.
Keep learning
Build the foundations first
This hackathon builds on concepts introduced in the AI Research Foundations learning path.
Build Your Own Small Language Model
Establish the foundational concepts required to implement a small language model from scratch.
Fine-tune Your Model
Apply transfer learning techniques to adapt the pre-trained model for specific tasks using a smaller, targeted dataset.
