PyTorch
Safetensors
action-model
function-calling
tool-calling
tool-use
non-autoregressive
masked-diffusion
modernbert
shing-dev commited on
Commit
840653a
·
verified ·
1 Parent(s): e2aa6d1

Model card: open with the ActionMan logo

Browse files
Files changed (2) hide show
  1. README.md +145 -143
  2. assets/actionman-logo.png +0 -0
README.md CHANGED
@@ -1,143 +1,145 @@
1
- ---
2
- license: other
3
- license_name: actionman-research-preview
4
- license_link: LICENSE
5
- library_name: pytorch
6
- base_model: answerdotai/ModernBERT-large
7
- tags:
8
- - action-model
9
- - function-calling
10
- - tool-calling
11
- - tool-use
12
- - non-autoregressive
13
- - masked-diffusion
14
- - modernbert
15
- datasets:
16
- - Salesforce/xlam-function-calling-60k
17
- - Team-ACE/ToolACE
18
- - NousResearch/hermes-function-calling-v1
19
- ---
20
-
21
- # ActionMan-0.1
22
-
23
- **Decision models choose. Action models act.**
24
-
25
- ActionMan-0.1 is an action model: a 0.4B encoder that selects the tool in one forward pass and writes every argument with
26
- masked diffusion. It finishes in 2-3 forward passes, with no autoregressive decoding and no JSON generated.
27
-
28
- | One tool call, median, batch 1 | latency |
29
- |---|---|
30
- | **ActionMan-0.1** (RTX 4090) | **17 ms** |
31
- | Qwen3-0.6B fine-tuned on the same data (vLLM, tuned, same GPU) | 122 ms |
32
- | GPT-6 Luna (API, network included) | 1,455 ms |
33
-
34
- In the time GPT-6 Luna returns one call, ActionMan returns 85.
35
-
36
- ## Inside
37
-
38
- ![Masked diffusion: encode once, then denoise every argument in parallel](assets/inside.jpg)
39
-
40
- 1. **Encode.** ModernBERT-large (28 layers, 395M weights) encodes the tool signatures, the instruction and up to four `[CALL]`
41
- markers once. The context is cached.
42
- 2. **Select tool.** Each `[CALL]` scores every tool, or none. A length head sizes the slots for every argument.
43
- 3. **[MASK] slots.** One block of masked slots is appended, covering every argument.
44
- 4. **Denoise.** All slots are predicted in parallel:
45
- - values that appear in the instruction are copied as spans;
46
- - enums and booleans are picked from their options;
47
- - lists get a count head and item slots.
48
- 5. **Re-mask < 0.85, denoise.** Low-confidence slots are re-masked and predicted again. The passes run as CUDA graphs.
49
-
50
- A language model runs its full stack once per output token. The same call takes about 80 forward passes.
51
-
52
- ## Speed
53
-
54
- ![latency](assets/latency_vs_output_size.png)
55
-
56
- Latency is flat in the size of the answer:
57
-
58
- | | 1 call | 3+ calls |
59
- |---|---|---|
60
- | ActionMan-0.1 | 16.8 ms | 21.0 ms |
61
- | Qwen3-0.6B, vLLM | 111 ms | 331 ms |
62
-
63
- On a server CPU (8 threads), ActionMan fp32 takes 0.45 s and llama.cpp Q8_0 takes 1.66 s.
64
-
65
- ## The Arena
66
-
67
- ![2D Minecraft](assets/arena-minecraft.jpg)
68
-
69
- Three real-time games played only through tool calls, where thinking time is charged to the model.
70
-
71
- | Wins out of 12 | ActionMan-0.1 | Qwen3-0.6B, same data | GPT-6 Luna |
72
- |---|---|---|---|
73
- | 2D Minecraft | **10** | 9 | 10 |
74
- | Rally | **11** | 9 | 3 |
75
- | Cycling | **11** | 3 | 3 |
76
-
77
- ## Accuracy
78
-
79
- | BFCL v4, official harness | size | Non-Live | Live | Irrelevance |
80
- |---|---|---|---|---|
81
- | **ActionMan-0.1** | 0.4B | 66.0 | 45.1 | **81.2** |
82
- | Hammer2.1-0.5b | 0.49B | 65.9 | 54.7 | 80.7 |
83
- | granite-4.0-350m | 0.35B | 67.7 | 46.7 | 61.1 |
84
- | Qwen3-0.6B (FC) | 0.75B | 72.9 | 58.8 | 80.9 |
85
- | Qwen3-0.6B fine-tuned on the same data | 0.75B | 75.7 | 54.1 | 79.1 |
86
- | Qwen3-1.7B (FC) | 2.0B | 82.7 | 74.7 | 76.8 |
87
- | GPT-6 Luna (API, reasoning low) | - | 78.2 | 68.8 | 75.6 |
88
-
89
- - **The run:** every model ran with `bfcl-eval==2026.3.23` on one box, single-turn categories only.
90
- - **Full report:** per-category scores, confidence intervals and error classes are in [benchmark.md](https://github.com/shing1Sks/ActionMan/blob/main/docs/results/benchmark.md).
91
-
92
- ## Usage
93
-
94
- ```bash
95
- pip install "git+https://github.com/shing1Sks/ActionMan" # torch, transformers>=5, safetensors, huggingface_hub
96
- ```
97
-
98
- ```python
99
- from actionman.api import ActionMan
100
-
101
- am = ActionMan.from_pretrained("shing-dev/ActionMan-0.1") # compiles on GPU (one-off warm-up)
102
- tools = [{"type": "function", "function": {
103
- "name": "get_weather", "description": "Current weather for a city",
104
- "parameters": {"type": "object", "properties": {
105
- "city": {"type": "string"}, "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}},
106
- "required": ["city"]}}}]
107
- am.predict("What's the weather in Paris in celsius?", tools)
108
- # [{"name": "get_weather", "arguments": {"city": "Paris", "unit": "celsius"}, "confidence": 0.9812}]
109
- am.predict("Tell me a joke", tools)
110
- # []
111
- ```
112
-
113
- - **Without pip:** the inference code is also in this repo under `code/actionman/`. Add `code/` to `sys.path`.
114
- - **No call:** `[]` means no tool fits. `require=True` forces a call, like `tool_choice="required"`.
115
- - **`confidence`** is the minimum over the tool and every argument. Abstaining below a threshold works well: skipping the 10% least
116
- confident calls takes accuracy on our 2,340-prompt eval from 78.6 to 85.1.
117
- - **Specs:**
118
- - single turn, English;
119
- - up to 4 calls per request;
120
- - lists of up to 7 items;
121
- - an input of about 896 tokens.
122
-
123
- ## Training
124
-
125
- - **Data:** 5 epochs over 80,459 rows:
126
- - xLAM-60k, 58,000;
127
- - ToolACE, 10,359;
128
- - Hermes v1, 1,100;
129
- - no-call examples, 11,000.
130
- - **Hardware:** one RTX 4090, about 2 hours.
131
-
132
- ## Licence
133
-
134
- - **The weights are for research use only.** The training data includes Salesforce's xLAM-60k, whose card says "This release is for research purposes only."
135
- - **ToolACE and Hermes** are Apache-2.0.
136
- - **The inference code** is MIT.
137
-
138
- ## Links
139
-
140
- - **Code, benchmarks, the Arena:** [github.com/shing1Sks/ActionMan](https://github.com/shing1Sks/ActionMan)
141
- - **The launch film:** [actionman-launch-film.mp4](https://github.com/shing1Sks/ActionMan/releases/download/v0.1/actionman-launch-film.mp4)
142
-
143
- Research by Shreyash Kumar Singh with an AI coding agent (Claude).
 
 
 
1
+ ---
2
+ license: other
3
+ license_name: actionman-research-preview
4
+ license_link: LICENSE
5
+ library_name: pytorch
6
+ base_model: answerdotai/ModernBERT-large
7
+ tags:
8
+ - action-model
9
+ - function-calling
10
+ - tool-calling
11
+ - tool-use
12
+ - non-autoregressive
13
+ - masked-diffusion
14
+ - modernbert
15
+ datasets:
16
+ - Salesforce/xlam-function-calling-60k
17
+ - Team-ACE/ToolACE
18
+ - NousResearch/hermes-function-calling-v1
19
+ ---
20
+
21
+ <p align="center"><img src="assets/actionman-logo.png" width="132" alt="ActionMan logo: an A with a red cape"></p>
22
+
23
+ <h1 align="center">ActionMan-0.1</h1>
24
+
25
+ <p align="center"><b>Decision models choose. Action models act.</b></p>
26
+
27
+ ActionMan-0.1 is an action model: a 0.4B encoder that selects the tool in one forward pass and writes every argument with
28
+ masked diffusion. It finishes in 2-3 forward passes, with no autoregressive decoding and no JSON generated.
29
+
30
+ | One tool call, median, batch 1 | latency |
31
+ |---|---|
32
+ | **ActionMan-0.1** (RTX 4090) | **17 ms** |
33
+ | Qwen3-0.6B fine-tuned on the same data (vLLM, tuned, same GPU) | 122 ms |
34
+ | GPT-6 Luna (API, network included) | 1,455 ms |
35
+
36
+ In the time GPT-6 Luna returns one call, ActionMan returns 85.
37
+
38
+ ## Inside
39
+
40
+ ![Masked diffusion: encode once, then denoise every argument in parallel](assets/inside.jpg)
41
+
42
+ 1. **Encode.** ModernBERT-large (28 layers, 395M weights) encodes the tool signatures, the instruction and up to four `[CALL]`
43
+ markers once. The context is cached.
44
+ 2. **Select tool.** Each `[CALL]` scores every tool, or none. A length head sizes the slots for every argument.
45
+ 3. **[MASK] slots.** One block of masked slots is appended, covering every argument.
46
+ 4. **Denoise.** All slots are predicted in parallel:
47
+ - values that appear in the instruction are copied as spans;
48
+ - enums and booleans are picked from their options;
49
+ - lists get a count head and item slots.
50
+ 5. **Re-mask < 0.85, denoise.** Low-confidence slots are re-masked and predicted again. The passes run as CUDA graphs.
51
+
52
+ A language model runs its full stack once per output token. The same call takes about 80 forward passes.
53
+
54
+ ## Speed
55
+
56
+ ![latency](assets/latency_vs_output_size.png)
57
+
58
+ Latency is flat in the size of the answer:
59
+
60
+ | | 1 call | 3+ calls |
61
+ |---|---|---|
62
+ | ActionMan-0.1 | 16.8 ms | 21.0 ms |
63
+ | Qwen3-0.6B, vLLM | 111 ms | 331 ms |
64
+
65
+ On a server CPU (8 threads), ActionMan fp32 takes 0.45 s and llama.cpp Q8_0 takes 1.66 s.
66
+
67
+ ## The Arena
68
+
69
+ ![2D Minecraft](assets/arena-minecraft.jpg)
70
+
71
+ Three real-time games played only through tool calls, where thinking time is charged to the model.
72
+
73
+ | Wins out of 12 | ActionMan-0.1 | Qwen3-0.6B, same data | GPT-6 Luna |
74
+ |---|---|---|---|
75
+ | 2D Minecraft | **10** | 9 | 10 |
76
+ | Rally | **11** | 9 | 3 |
77
+ | Cycling | **11** | 3 | 3 |
78
+
79
+ ## Accuracy
80
+
81
+ | BFCL v4, official harness | size | Non-Live | Live | Irrelevance |
82
+ |---|---|---|---|---|
83
+ | **ActionMan-0.1** | 0.4B | 66.0 | 45.1 | **81.2** |
84
+ | Hammer2.1-0.5b | 0.49B | 65.9 | 54.7 | 80.7 |
85
+ | granite-4.0-350m | 0.35B | 67.7 | 46.7 | 61.1 |
86
+ | Qwen3-0.6B (FC) | 0.75B | 72.9 | 58.8 | 80.9 |
87
+ | Qwen3-0.6B fine-tuned on the same data | 0.75B | 75.7 | 54.1 | 79.1 |
88
+ | Qwen3-1.7B (FC) | 2.0B | 82.7 | 74.7 | 76.8 |
89
+ | GPT-6 Luna (API, reasoning low) | - | 78.2 | 68.8 | 75.6 |
90
+
91
+ - **The run:** every model ran with `bfcl-eval==2026.3.23` on one box, single-turn categories only.
92
+ - **Full report:** per-category scores, confidence intervals and error classes are in [benchmark.md](https://github.com/shing1Sks/ActionMan/blob/main/docs/results/benchmark.md).
93
+
94
+ ## Usage
95
+
96
+ ```bash
97
+ pip install "git+https://github.com/shing1Sks/ActionMan" # torch, transformers>=5, safetensors, huggingface_hub
98
+ ```
99
+
100
+ ```python
101
+ from actionman.api import ActionMan
102
+
103
+ am = ActionMan.from_pretrained("shing-dev/ActionMan-0.1") # compiles on GPU (one-off warm-up)
104
+ tools = [{"type": "function", "function": {
105
+ "name": "get_weather", "description": "Current weather for a city",
106
+ "parameters": {"type": "object", "properties": {
107
+ "city": {"type": "string"}, "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}},
108
+ "required": ["city"]}}}]
109
+ am.predict("What's the weather in Paris in celsius?", tools)
110
+ # [{"name": "get_weather", "arguments": {"city": "Paris", "unit": "celsius"}, "confidence": 0.9812}]
111
+ am.predict("Tell me a joke", tools)
112
+ # []
113
+ ```
114
+
115
+ - **Without pip:** the inference code is also in this repo under `code/actionman/`. Add `code/` to `sys.path`.
116
+ - **No call:** `[]` means no tool fits. `require=True` forces a call, like `tool_choice="required"`.
117
+ - **`confidence`** is the minimum over the tool and every argument. Abstaining below a threshold works well: skipping the 10% least
118
+ confident calls takes accuracy on our 2,340-prompt eval from 78.6 to 85.1.
119
+ - **Specs:**
120
+ - single turn, English;
121
+ - up to 4 calls per request;
122
+ - lists of up to 7 items;
123
+ - an input of about 896 tokens.
124
+
125
+ ## Training
126
+
127
+ - **Data:** 5 epochs over 80,459 rows:
128
+ - xLAM-60k, 58,000;
129
+ - ToolACE, 10,359;
130
+ - Hermes v1, 1,100;
131
+ - no-call examples, 11,000.
132
+ - **Hardware:** one RTX 4090, about 2 hours.
133
+
134
+ ## Licence
135
+
136
+ - **The weights are for research use only.** The training data includes Salesforce's xLAM-60k, whose card says "This release is for research purposes only."
137
+ - **ToolACE and Hermes** are Apache-2.0.
138
+ - **The inference code** is MIT.
139
+
140
+ ## Links
141
+
142
+ - **Code, benchmarks, the Arena:** [github.com/shing1Sks/ActionMan](https://github.com/shing1Sks/ActionMan)
143
+ - **The launch film:** [actionman-launch-film.mp4](https://github.com/shing1Sks/ActionMan/releases/download/v0.1/actionman-launch-film.mp4)
144
+
145
+ Research by Shreyash Kumar Singh with an AI coding agent (Claude).
assets/actionman-logo.png ADDED