NousResearch/hermes-function-calling-v1
Viewer • Updated • 11.6k • 56.4k • 504

Decision models choose. Action models act.
ActionMan-0.1 is an action model: a 0.4B encoder that selects the tool in one forward pass and writes every argument with masked diffusion. It finishes in 2-3 forward passes, with no autoregressive decoding and no JSON generated.
| One tool call, median, batch 1 | latency |
|---|---|
| ActionMan-0.1 (RTX 4090) | 17 ms |
| Qwen3-0.6B fine-tuned on the same data (vLLM, tuned, same GPU) | 122 ms |
| GPT-6 Luna (API, network included) | 1,455 ms |
In the time GPT-6 Luna returns one call, ActionMan returns 85.
[CALL]
markers once. The context is cached.[CALL] scores every tool, or none. A length head sizes the slots for every argument.A language model runs its full stack once per output token. The same call takes about 80 forward passes.
Latency is flat in the size of the answer:
| 1 call | 3+ calls | |
|---|---|---|
| ActionMan-0.1 | 16.8 ms | 21.0 ms |
| Qwen3-0.6B, vLLM | 111 ms | 331 ms |
On a server CPU (8 threads), ActionMan fp32 takes 0.45 s and llama.cpp Q8_0 takes 1.66 s.
Three real-time games played only through tool calls, where thinking time is charged to the model.
| Wins out of 12 | ActionMan-0.1 | Qwen3-0.6B, same data | GPT-6 Luna |
|---|---|---|---|
| 2D Minecraft | 10 | 9 | 10 |
| Rally | 11 | 9 | 3 |
| Cycling | 11 | 3 | 3 |
| BFCL v4, official harness | size | Non-Live | Live | Irrelevance |
|---|---|---|---|---|
| ActionMan-0.1 | 0.4B | 66.0 | 45.1 | 81.2 |
| Hammer2.1-0.5b | 0.49B | 65.9 | 54.7 | 80.7 |
| granite-4.0-350m | 0.35B | 67.7 | 46.7 | 61.1 |
| Qwen3-0.6B (FC) | 0.75B | 72.9 | 58.8 | 80.9 |
| Qwen3-0.6B fine-tuned on the same data | 0.75B | 75.7 | 54.1 | 79.1 |
| Qwen3-1.7B (FC) | 2.0B | 82.7 | 74.7 | 76.8 |
| GPT-6 Luna (API, reasoning low) | - | 78.2 | 68.8 | 75.6 |
bfcl-eval==2026.3.23 on one box, single-turn categories only.pip install "git+https://github.com/shing1Sks/ActionMan" # torch, transformers>=5, safetensors, huggingface_hub
from actionman.api import ActionMan
am = ActionMan.from_pretrained("shing-dev/ActionMan-0.1") # compiles on GPU (one-off warm-up)
tools = [{"type": "function", "function": {
"name": "get_weather", "description": "Current weather for a city",
"parameters": {"type": "object", "properties": {
"city": {"type": "string"}, "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}},
"required": ["city"]}}}]
am.predict("What's the weather in Paris in celsius?", tools)
# [{"name": "get_weather", "arguments": {"city": "Paris", "unit": "celsius"}, "confidence": 0.9812}]
am.predict("Tell me a joke", tools)
# []
code/actionman/. Add code/ to sys.path.[] means no tool fits. require=True forces a call, like tool_choice="required".confidence is the minimum over the tool and every argument. Abstaining below a threshold works well: skipping the 10% least
confident calls takes accuracy on our 2,340-prompt eval from 78.6 to 85.1.Research by Shreyash Kumar Singh with an AI coding agent (Claude).
Base model
answerdotai/ModernBERT-large