Dhee-Pravega v3
Agentic tool-calling model for 18 languages, fine-tuned from
google/gemma-4-E2B-it and merged to bf16.
What v3 changes
Accuracy when the model is offered numerous choices of tools.
v1 and v2 were trained on a corpus that presents one tool per conversation and fills every argument slot in 92.2% of its calls. A model trained that way is never given a choice it can get wrong, so it learns to call whatever it is shown
- all tools or none. v3 is trained instead on our own 18-language corpus, where 68.8% of turns offer a genuine choice among several tools and 12.3% of conversations correctly make no call at all.
The schema diversity behind that: 16,037 distinct tool schemas, against 1,071 in the corpus v1/v2 saw.
v3 also introduces language switching (change_language) and translation
prompts, neither of which existed in any earlier Pravega training data.
Evaluation
720 held-out conversations, 40 per language across all 18, scored against the reference tool call:
| metric | v3 |
|---|---|
| tool call emitted when expected | 0.9847 |
| correct tool selected | 0.9653 |
| all arguments correct | 0.7111 |
Read the tool-selection number in context: it is measured on a test set where most turns present several candidate tools, which is a materially harder task than the single-tool setting earlier versions were scored in. The two are not directly comparable.
Usage
Tools are rendered with Gemma-4's own chat template - pass them structured, not as prose in the system prompt.
from transformers import AutoModelForCausalLM, AutoTokenizer
tok = AutoTokenizer.from_pretrained("dheeyantra/dhee-pravega")
model = AutoModelForCausalLM.from_pretrained("dheeyantra/dhee-pravega",
dtype="bfloat16", device_map="auto")
messages = [{"role": "user", "content": "Mumbai ka mausam kaisa hai?"}]
tools = [{"type": "function", "function": {
"name": "get_weather",
"description": "Current weather for a city",
"parameters": {"type": "object",
"properties": {"city": {"type": "string"}},
"required": ["city"]}}}]
ids = tok.apply_chat_template(messages, tools=tools,
add_generation_prompt=True, return_tensors="pt")
print(tok.decode(model.generate(ids.to(model.device), max_new_tokens=128)[0]))
Training
| base | google/gemma-4-E2B-it |
| method | QLoRA (r=16, alpha=32) on the text decoder, merged to bf16 |
| corpus | 181,191 conversations / 18 languages |
| schedule | 11,472 steps, effective batch 16, max_seq_len 1536, lr 5e-5 |
| continues from | the v2 adapter, rather than the base |
These weights are the final checkpoint. The best checkpoint by held-out loss was step 9,000 (0.9654 against 0.9664 at the end) - a noise-level difference, and the evaluation above was run on the final weights, so the reported numbers describe exactly what is published here.
Licence
Research use only. Dhee-Pravega is released under the Dhee Research-Only Licence v1.0: academic research, evaluation, benchmarking, red-teaming, teaching and personal experimentation are permitted; commercial use is not. Commercial licences are available from Dheeyantra Research Labs on request.
Two sets of terms apply, not one. This model is a fine-tune of Google's Gemma, so the Gemma Terms of Use and the Gemma Prohibited Use Policy continue to apply in addition to ours. Nothing in our licence grants rights Google has not granted. Where ours is narrower, ours controls for Dheeyantra's contribution; where Gemma's is narrower, Gemma's controls.
If you redistribute the model or anything derived from it, you must pass both sets of terms along.
Earlier versions. Revisions tagged v2 and earlier were published under
license: gemma and remain available under the terms in force when they were
distributed. This licence applies from v3 onward.