Model card: open with the ActionMan logo
Browse files- README.md +145 -143
- 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 |
-
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
|
| 30 |
-
|
|
| 31 |
-
|
|
| 32 |
-
|
|
| 33 |
-
|
| 34 |
-
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
|
| 47 |
-
-
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
|
|
| 61 |
-
|
|
| 62 |
-
|
| 63 |
-
|
| 64 |
-
|
| 65 |
-
|
| 66 |
-
|
| 67 |
-
|
| 68 |
-
|
| 69 |
-
|
| 70 |
-
|
| 71 |
-
|
| 72 |
-
|
| 73 |
-
|
|
| 74 |
-
|
|
| 75 |
-
|
|
| 76 |
-
|
| 77 |
-
|
| 78 |
-
|
| 79 |
-
|
| 80 |
-
|
| 81 |
-
|
|
| 82 |
-
|
|
| 83 |
-
|
|
| 84 |
-
|
|
| 85 |
-
|
|
| 86 |
-
| Qwen3-
|
| 87 |
-
|
|
| 88 |
-
|
| 89 |
-
-
|
| 90 |
-
|
| 91 |
-
|
| 92 |
-
|
| 93 |
-
|
| 94 |
-
|
| 95 |
-
|
| 96 |
-
```
|
| 97 |
-
|
| 98 |
-
```
|
| 99 |
-
|
| 100 |
-
|
| 101 |
-
|
| 102 |
-
|
| 103 |
-
|
| 104 |
-
|
| 105 |
-
|
| 106 |
-
|
| 107 |
-
|
| 108 |
-
|
| 109 |
-
am.predict("
|
| 110 |
-
# []
|
| 111 |
-
|
| 112 |
-
|
| 113 |
-
|
| 114 |
-
|
| 115 |
-
- **
|
| 116 |
-
|
| 117 |
-
- **
|
| 118 |
-
|
| 119 |
-
|
| 120 |
-
-
|
| 121 |
-
-
|
| 122 |
-
|
| 123 |
-
|
| 124 |
-
|
| 125 |
-
|
| 126 |
-
|
| 127 |
-
|
| 128 |
-
-
|
| 129 |
-
-
|
| 130 |
-
-
|
| 131 |
-
|
| 132 |
-
|
| 133 |
-
|
| 134 |
-
|
| 135 |
-
|
| 136 |
-
- **The
|
| 137 |
-
|
| 138 |
-
|
| 139 |
-
|
| 140 |
-
|
| 141 |
-
|
| 142 |
-
|
| 143 |
-
|
|
|
|
|
|
|
|
|
| 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 |
+

|
| 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 |
+

|
| 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 |
+

|
| 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
|