Needle 2 Calendar Write (German)

Task-specific fine-tune of Needle 2 for creating, moving, and canceling calendar appointments in German. Extracts literal spans (title, date, time, location, participants, action_span, modifier) from natural language queries. Every argument value is grounded as a substring of the input query.

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 ~1914 German calendar examples (train split), evaluated on ~300 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_write",
    "description": "Create, move, edit or cancel a calendar appointment. Extract only literal spans that appear in the query. Omit every field without evidence.",
    "parameters": {
      "type": "object",
      "properties": {
        "title": {
          "type": "string",
          "description": "Appointment title exactly as written in the query, e.g. 'Zahnarzt', 'Teammeeting'."
        },
        "date": {
          "type": "string",
          "description": "Date phrase exactly as written, e.g. 'morgen', 'nächsten Dienstag', 'am 18. September'."
        },
        "time": {
          "type": "string",
          "description": "Start time phrase exactly as written, e.g. '14 Uhr', 'halb drei', '15:00'."
        },
        "end_time": {
          "type": "string",
          "description": "End time phrase exactly as written, e.g. '16 Uhr', '17:30'."
        },
        "person": {
          "type": "string",
          "description": "Owner name exactly as written, e.g. 'Lisa' in 'Termin für Lisa'."
        },
        "participants": {
          "type": "string",
          "description": "Participant names exactly as written, e.g. 'Jana und Peter'."
        },
        "location": {
          "type": "string",
          "description": "Location phrase exactly as written, e.g. 'im Besprechungsraum', 'Praxis am Markt'."
        },
        "action_span": {
          "type": "string",
          "description": "The literal action verb span copied from the query, e.g. 'Verschieb', 'Sag', 'Trag', 'Plane', 'Lösch'."
        },
        "modifier": {
          "type": "string",
          "description": "Literal modifier span copied from the query, e.g. 'doch', 'auch', 'jetzt'."
        }
      }
    }
  }
]],
    weights="autmoate/cactus-needle2-calendar-write-dt.cact",  # download from HF, pass local path
)

# Example: Trag Zahnarzt am Montag um 9 Uhr ein
response = agent.complete("Trag Zahnarzt am Montag um 9 Uhr ein")
print(response["function_calls"])

Evaluation Results (Base vs Fine-Tuned)

Metric Base Fine-Tuned
Full-frame Exact Match 0.1267 0.2867
Tool Call Accuracy 0.7727 0.9091
Field Precision 0.7044 0.9316
Field Recall 0.2811 0.6307
Field F1 0.4019 0.7521
Hallucinated Field Rate 26.9% 3.1%
False Positive Tool Rate 5.6% 5.6%
False Negative Tool Rate 22.7% 9.1%
Mean Latency (ms) 239 240

Training Data

  • Training examples: 1914 (deterministic, seedable)
  • Evaluation examples: 300 (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).

Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for autmoate/cactus-needle2-calendar-write-dt

Finetuned
(7)
this model