beyoru commited on
Commit
dc8b7e4
·
verified ·
1 Parent(s): 2534177

Create README.md

Browse files
Files changed (1) hide show
  1. README.md +180 -0
README.md ADDED
@@ -0,0 +1,180 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: apache-2.0
3
+ base_model: Qwen/Qwen3.6-27B
4
+ base_model_relation: finetune
5
+ pipeline_tag: text-generation
6
+ library_name: transformers
7
+ language:
8
+ - en
9
+ - vi
10
+ tags:
11
+ - function-calling
12
+ - tool-use
13
+ - tool-calling
14
+ - agent
15
+ - agentic
16
+ - workflow-automation
17
+ - vllm
18
+ - sglang
19
+ - qwen3.6
20
+ - vietnamese
21
+ - enterprise-automation
22
+ ---
23
+
24
+ # Ops-I — a 27B agent for business workflow automation
25
+
26
+ **Ops-I** is a fine-tune of **Qwen3.6-27B** aimed at *workflow* agents: episodes where the
27
+ model reads a business request, discovers the right tool out of a large surface, chains
28
+ several calls together, and — just as importantly — knows when **not** to act.
29
+
30
+ On the public 600-task [AutomationBench](https://github.com/zapier/AutomationBench)
31
+ (Zapier), Ops-I is the **strongest of four open-weight models** we measured, ahead of the
32
+ Qwen3.6-27B base it was tuned from.
33
+
34
+ **Use it if you need:** an open-weight backend for business automation (finance, HR,
35
+ operations, sales, support) that holds up across long multi-step tool episodes.
36
+
37
+ | | |
38
+ |---|---|
39
+ | Base | `Qwen/Qwen3.6-27B` (dense, VL architecture) |
40
+ | Precision / size | bf16, 27.8B params, 15 shards (~56 GB) |
41
+ | Context | base supports 262 144; 16K validated in our runs |
42
+ | Reasoning | thinking **on** — how it was evaluated |
43
+ | Tool-call format | Qwen3.5-style XML (`<function=...>`), **not** JSON — see gotchas |
44
+ | License | Apache-2.0 |
45
+
46
+ ---
47
+
48
+ ## Results — AutomationBench 600
49
+
50
+ Official metric is **pass rate**: a task counts only if *every* assertion passes.
51
+ `partial credit` = fraction of assertions satisfied. Benchmark v1.0.5, `--toolset api`,
52
+ served locally on 8×H200. Full per-task data:
53
+ [Hert4/automationbench-opera-gemma4](https://github.com/Hert4/automationbench-opera-gemma4).
54
+
55
+ | Model | Pass rate | Passed / 600 | Partial credit | Wall clock |
56
+ |---|---|---|---|---|
57
+ | **beyoru/Ops-I** | **10.17%** | **61** | **45.54%** | 1.96 h |
58
+ | gemma-4-31B-it (thinking on) | 10.17% | 61 | 41.64% | 2.15 h |
59
+ | Qwen3.6-27B (base) | 9.67% | 58 | 46.00% | 1.95 h |
60
+
61
+ **Read this honestly:** at n=600 one task is worth 0.17 points, so Ops-I, Gemma 4 and the
62
+ base model sit within three tasks of each other — that spread is noise, not a ranking.
63
+ What the numbers *do* support is that Ops-I is at least not worse than its base while
64
+ being the fastest of the tuned models, and that it beats Opera by 10 tasks.
65
+
66
+ For scale, the reference models in the upstream README (run at their highest reasoning
67
+ effort) land at Claude Opus 4.8 30.33%, GPT-5.6 Sol 29.17%, GLM 5.2 20.33%,
68
+ Gemini 3.5 Flash 14.83%.
69
+
70
+ ### Per domain
71
+
72
+ Tasks passed out of 100, partial credit in parentheses.
73
+
74
+ | Model | Finance | HR | Marketing | Operations | Sales | Support |
75
+ |---|---|---|---|---|---|---|
76
+ | **beyoru/Ops-I** | **20** (57.0) | 3 (10.1) | 5 (51.4) | **18** (60.5) | **10** (38.2) | 5 (55.9) |
77
+ | Qwen3.6-27B base | 21 (57.7) | 3 (12.4) | 3 (45.1) | 17 (60.9) | 8 (41.4) | 6 (58.4) |
78
+ | gemma-4-31B-it | 18 (48.7) | 1 (5.2) | **14** (56.3) | 15 (56.2) | 9 (34.3) | 4 (49.1) |
79
+
80
+ Finance and operations carry the score. HR is the floor for every model tested (1-3 / 100).
81
+
82
+ ---
83
+
84
+ ## Known weakness: it acts too much
85
+
86
+ The dominant failure mode is **not** inability to act — it is failure to *refrain*.
87
+
88
+ | Assertion type | Ops-I |
89
+ |---|---|
90
+ | Positive ("do send / do create") | 3028 / 5636 = **53.7%** |
91
+ | Negative ("do **not** send / do **not** create") | 65 / 585 = **11.1%** |
92
+
93
+ Some negative assertion types never pass, aggregated across all four models tested:
94
+ `gmail_message_not_sent` 0/203, `slack_message_not_in_channel` 0/166,
95
+ `google_sheets_row_not_exists` 0/161.
96
+
97
+ This is uniform across two model families and four checkpoints, so treat it as a property
98
+ of the current open-weight generation rather than of Ops-I specifically. **If you deploy
99
+ this in a workflow that can send email, post to chat, or write to a sheet, gate those
100
+ actions behind confirmation.**
101
+
102
+ ---
103
+
104
+ ## Quickstart
105
+
106
+ ### Serve with SGLang
107
+
108
+ ```bash
109
+ python3 -m sglang.launch_server --model-path beyoru/Ops-I --served-model-name Ops-I \
110
+ --host 0.0.0.0 --port 30014 --tp 4 \
111
+ --reasoning-parser qwen3 --tool-call-parser qwen3_coder \
112
+ --mem-fraction-static 0.85
113
+ ```
114
+
115
+ ### Serve with vLLM
116
+
117
+ ```bash
118
+ vllm serve beyoru/Ops-I --served-model-name Ops-I \
119
+ -tp 4 --max-model-len 16384 \
120
+ --enable-auto-tool-choice --tool-call-parser qwen3_coder --reasoning-parser qwen3
121
+ ```
122
+
123
+ ### Call it
124
+
125
+ ```python
126
+ from openai import OpenAI
127
+
128
+ client = OpenAI(base_url="http://localhost:30014/v1", api_key="EMPTY")
129
+
130
+ tools = [{
131
+ "type": "function",
132
+ "function": {
133
+ "name": "crm_update_contact",
134
+ "description": "Update a contact's details in the CRM.",
135
+ "parameters": {
136
+ "type": "object",
137
+ "properties": {"contact_id": {"type": "string"}, "phone": {"type": "string"}},
138
+ "required": ["contact_id", "phone"],
139
+ },
140
+ },
141
+ }]
142
+
143
+ r = client.chat.completions.create(
144
+ model="Ops-I",
145
+ messages=[{"role": "user", "content": "Update Le Van A's phone to 0912345678."}],
146
+ tools=tools,
147
+ tool_choice="auto",
148
+ )
149
+ print(r.choices[0].message.tool_calls)
150
+ ```
151
+
152
+ ---
153
+
154
+ ## Training
155
+
156
+
157
+ ---
158
+
159
+ ## Evaluation notes
160
+
161
+ - All numbers above come from a single run per model (k=1) on the full public 600-task
162
+ set, temperature left at server default. No task was excluded.
163
+ - AutomationBench has **no separate train split** — the 600 public tasks are both the
164
+ dataset and the scoring set. Ops-I was **not** trained on them; if you fine-tune against
165
+ this benchmark, its scores stop being comparable to anything.
166
+ - Numbers were produced with SGLang 0.5.12. A vLLM baseline was not measured, so do not
167
+ mix serving stacks when comparing.
168
+
169
+ ## Citation
170
+
171
+ Benchmark tasks, tools and assertions are Zapier's:
172
+
173
+ ```bibtex
174
+ @misc{automationbench,
175
+ title = {AutomationBench},
176
+ author = {Zapier},
177
+ year = {2026},
178
+ url = {https://github.com/zapier/AutomationBench}
179
+ }
180
+ ```