Needle 2 Calendar Read (German)
Task-specific fine-tune of Needle 2 for reading and querying calendars in German. Handles questions like 'Was steht morgen an?', 'Wann hat Lisa Termine?', 'Wann sind Lisa und Max frei?'. Extracts literal spans (query_span, when, person, persons, target) from natural language queries.
Base Model
This model is a fine-tune of Cactus-Compute/needle2, a 45M-parameter tool-calling model that runs in 28MB of RAM. See the original model card for details on the Simple Attention Network architecture, deployment targets, and benchmarks.
What Was Done
LoRA fine-tuning (rank 16, alpha 32) on ~1157 German calendar examples (train split), evaluated on ~240 held-out German examples (eval split).
- Backend: JAX 0.10.2 on CUDA (Jetson AGX Orin 64GB, sm_87)
- Training: 10 epochs, lr 1e-4, batch size 16, cosine decay with warmup
- Numerics: Quantization-aware training (CQ mixed STE + A8)
- Export: W4A8 (4-bit weights, 8-bit activations)
- Size: ~23 MB per .cact archive
Usage
import needle
# Load the fine-tuned calendar model
agent = needle.Needle(
tools=[[
{
"name": "calendar_read",
"description": "Answer a calendar question: list upcoming events, look up one event, show a person's calendar, or find joint free time slots. Extract only literal spans that appear in the query. Omit every field without evidence.",
"parameters": {
"type": "object",
"properties": {
"query_span": {
"type": "string",
"description": "The question-intent span copied verbatim from the query, e.g. 'Was steht an', 'frei', 'Zeig', 'Welche Termine'."
},
"when": {
"type": "string",
"description": "Time scope phrase exactly as written, e.g. 'morgen', 'diese Woche', 'heute Nachmittag'."
},
"person": {
"type": "string",
"description": "Person name exactly as written when the question is about one person, e.g. 'Lisa'."
},
"persons": {
"type": "string",
"description": "Person names exactly as written when the question is about several people, e.g. 'Lisa und Max'."
},
"target": {
"type": "string",
"description": "Event title to look up, exactly as written, e.g. 'Zahnarzt' in 'Wann ist Zahnarzt?'."
}
}
}
}
]],
weights="autmoate/cactus-needle2-calendar-read-dt.cact", # download from HF, pass local path
)
# Example: Was steht morgen an
response = agent.complete("Was steht morgen an")
print(response["function_calls"])
Evaluation Results (Base vs Fine-Tuned)
| Metric | Base | Fine-Tuned |
|---|---|---|
| Full-frame Exact Match | 0.1167 | 0.1750 |
| Tool Call Accuracy | 0.8821 | 0.9575 |
| Field Precision | 0.4417 | 0.8413 |
| Field Recall | 0.1165 | 0.3495 |
| Field F1 | 0.1843 | 0.4938 |
| Hallucinated Field Rate | 8.4% | 5.8% |
| False Positive Tool Rate | 14.3% | 21.4% |
| False Negative Tool Rate | 11.8% | 4.2% |
| Mean Latency (ms) | 177 | 145 |
Training Data
- Training examples: 1157 (deterministic, seedable)
- Evaluation examples: 240 (held-out values and phrasings)
- Language: German only
- Negative examples: ~12% (cross-task + off-topic)
- Grounding: Every argument value is a literal substring of the query
Datasets generated with a template-based dataset builder (needle-only/calendar_ft/build_dataset.py).
Citation
If you use this model, please cite both the base model and this fine-tune:
@misc{needle2_2026,
title = {Needle 2: A 45M-Parameter Foundation Tool-Calling Model for Tiny Devices},
author = {Ndubuaku, Henry and Mosoyan, Karen and Mroz, Jakub and Cylich, Noah and
Kumar, Satyajit and Sandhu, Parkirat and Shemet, Roman and Lee, Justin H.},
year = {2026},
organization = {Cactus Compute, Inc.},
howpublished = {\url{https://github.com/cactus-compute/needle}}
}
@misc{autmoate_calendar_ft_2026,
title = {Task-Specific Needle 2 Fine-Tunes for German Calendar Operations},
author = {autmoate},
year = {2026},
howpublished = {\url{https://huggingface.co/autmoate}},
note = {LoRA fine-tune of Cactus-Compute/needle2 on German calendar data}
}
License
Apache 2.0 (inherited from the base model).
Model tree for autmoate/cactus-needle2-calendar-read-dt
Base model
Cactus-Compute/needle2