Qwen-AgentWorld-35B su Apple Silicon: merita un posto nel tuo agent loop?
Una nota di valutazione per chi esegue modelli locali e costruisce agenti autonomi. Cos'è: un world-model linguistico — predice ciò che un terminale restituirebbe dopo un'azione, non agisce. Cosa gira: MLX, oppure llama.cpp/Metal con un override dei metadati su una riga (un GGUF semplice non si carica senza di esso); nessuna build MLX ufficiale. L'unico elemento distintivo che abbiamo misurato: mantiene il ruolo di simulatore lungo sequenze multi-step dove un generalista deriva. Il suo costo: pesante over-reasoning — limitabile. I numeri sono small-N e direzionali, ciascuno etichettato con la sua dimensione campionaria; le cifre di benchmark degli autori sono segnalate come affermazioni.
Misurato con
asiaisu un M5 Max, MLX 4-bit, un motore alla volta, 2026-06. Correzioni benvenute su github.com/druide67/asiai.
Quando usarlo / quando no
Usalo come simulatore d'ambiente per rollout di agenti economici, un mock per output di tool/terminale, o un verificatore di traiettorie al posto di un LLM-as-judge (il caso d'uso come verificatore non è testato qui — vedi §6). Regge anche come semplice generalista 35B se lo istruisci come un assistente.
Non usarlo come assistente quotidiano: gli autori non forniscono alcun percorso d'uso chat/code e porta con sé una pesante tassa di over-reasoning (limitabile, vedi §5). E non aspettare la variante 397B che "batte GPT-5.4" — non è scaricabile (HF restituisce 401 nonostante l'annuncio Apache-2.0).
1. Eseguibilità e riproduzione (leggi prima questo)
Se non gira sulla tua macchina, niente altro conta. Verdetto, senza giri di parole:
- Oggi funzionano due percorsi; nessuno dei due è chiavi-in-mano. Non esiste alcuna build MLX ufficiale —
abbiamo usato una conversione MLX della community, ed è il percorso su cui abbiamo misurato. Il GGUF
si carica anch'esso su llama.cpp / Metal, ma non out of the box: così com'è fallisce con
missing tensor 'blk.40.attn_norm.weight'(build 9780, riconfermato 2026-06-25). La causa è un off-by-one del convertitore, non pesi mancanti — il GGUF dichiarablock_count=41(un layer MTP extra all'indice 40) pur fornendo solo i 40 layer reali 0–39, quindi llama.cpp chiede un layer che non avrebbe mai dovuto esistere. Effettua l'override dei metadati al caricamento e si carica e genera:--override-kv qwen35moe.block_count=int:40 --override-kv qwen35moe.nextn_predict_layers=int:0. Ollama e LM Studio incapsulano llama.cpp ma non espongono in modo affidabile--override-kv, quindi considera questi due come non testati. Il deployment server ufficiale è vLLM / SGLang / Transformers. - Un quant che si carica non è prova che emetta una catena-di-pensiero lunga e corretta — valida la generazione, non solo il caricamento.
Setup di riproduzione:
| Repo (Hugging Face) | Dimensione | |
|---|---|---|
| AgentWorld (specialista) | jedisct1/Qwen-AgentWorld-35B-A3B-oQ4-MLX |
~20 GB |
| Qwen3.6 (baseline generalista) | mlx-community/Qwen3.6-35B-A3B-4bit |
~19 GB |
mlx-lm 0.31.3 · M5 Max 128 GB · sampling temp 0.6 / top-p 0.95 / top-k 20 · un modello caricato alla volta.
Il budget di token è una variabile di setup di prima classe
AgentWorld emette una traccia di reasoning molto lunga. Con max_tokens=4096 il suo output
viene troncato prima della risposta e conta come falso fallimento. Necessita di
8192–12288 token di reasoning per terminare su alcuni casi banali. Chiunque
ri-esegua con un budget basso otterrà numeri peggiori in apparenza per AgentWorld che
sono artefatti dell'harness, non errori del modello.
Adattamento RAM / contesto: pesi ~20 GB; picco ~27 GB a 64K di contesto su un Mac da 128 GB; la cache KV cresce solo di ~5 GB da 4K a 64K (una proprietà dell'architettura ibrida condivisa). Un Mac da 64 GB lo esegue comodamente a contesto ridotto; 36–48 GB è stretto ma utilizzabile a 4K–32K.
2. Cos'è, e come lo posizionano gli autori
Un world-model linguistico: dato uno stato e un'azione (un comando tipizzato), esso predice l'osservazione successiva (ciò che il terminale restituisce) tramite una lunga catena-di-pensiero. Sette domini digitali (MCP, Search, Terminal, SWE, Android, Web, OS). È addestrato a essere l'ambiente, non ad agire in esso.
Gli autori lo forniscono come world-model, non come assistente: i system prompt sono prompt di simulazione, e non esiste alcun percorso d'uso chat/code documentato. Quindi una preoccupazione legittima è che, usato come assistente, simuli un output di console invece di rispondere. Il nostro test sfuma questo punto (§4): con un prompt assistente standard scrive codice e ragiona alla pari del generalista. Il comportamento è deciso dal prompt, non da una capacità persa.
Sulla parola world-model
L'obiezione più comune della community è terminologica: questo è un LLM autoregressivo che fa predizione next-text-state, non un world-model non-autoregressivo / energy-based nel senso di LeCun. Vale la pena saperlo prima che il nome crei un'aspettativa che il modello non pretende di soddisfare.
Specifiche verificate (model card HF, in chiaro):
| Parametri | 34.66 B totali · ~3 B attivi (MoE) |
| Architettura | qwen3_5_moe, ibrida Attention + Gated-DeltaNet |
| Esperti | 256 (8 routed + 1 shared) |
| Contesto | fino a 256K token |
| Licenza | Apache-2.0 (~65 GB in BF16) |
3. L'elemento distintivo: fedeltà di ruolo multi-step
Questo è l'unico risultato nuovo e difendibile — ed esattamente ciò che il benchmark degli stessi autori non misura mai (è solo single-step). Il test: concatenare comandi che costruiscono stato (creare una dir, entrarci, scrivere un file, rileggerlo) e, a ogni passo, far predire al modello l'esatto output del terminale.
Inquadralo come una proprietà di affidabilità — disciplina di formato/ruolo — non come un vantaggio di comprensione. Qwen3.6 comprende il terminale perfettamente (traccia la directory di lavoro, conta le righe giuste); la differenza è che a volte esce dal ruolo.
| Test | AgentWorld | Qwen3.6 | Nota |
|---|---|---|---|
Output plausibile (ls, git, ps) — N=3 |
9/9 | 9/9 | parità |
| Sequenza A — 6 step, ancorata (4 run) | 0 role-break / 24 step | intermittente | tiene il ruolo |
| Sequenza B — 8 step, ancorata (3 run) | 0 role-break / 24 step | intermittente | tiene il ruolo |
| Closed-loop (si alimenta da solo) — N=2 | 6/6 ×2 | intermittente | tiene il ruolo |
Lettura onesta: AgentWorld ha rotto il ruolo in 0 step su 48 osservati lungo due sequenze e quattro run. Qwen3.6 rompe il ruolo in modo intermittente — i suoi run ancorati hanno oscillato 0/6 → 6/6 tra ripetizioni (N=2), quindi questo è direzionale, non un tasso. Quando fallisce, rigurgita il JSON dell'azione invece di simulare l'output:
$ cat log.txt # log.txt was just deleted → env must return an error
AgentWorld (in role):
root@host:/home/user# cat log.txt
cat: log.txt: No such file or directory
root@host:/home/user#
Qwen3.6 (out of role, ~1 run in 2 here):
[{"keystrokes": "cat log.txt\n", "duration": 0.1}] # echoes the input command
# instead of the output
La risposta corretta è spesso presente nell'output di Qwen3.6 — è un fallimento di formato/ruolo, non un'incomprensione. Per un loop in cui ogni passo deve essere leggibile dalla macchina al passo successivo, un singolo role-break avvelena la catena, ed è proprio ciò che AgentWorld evita.
Riserve sulla misurazione (dichiarate)
Lo scoring byte-exact sulla riga di echo del comando è severo, e le nostre fixture Sequenza-D vs
Sequenza-E erano incoerenti sul fatto che un'osservazione di cd includa
l'echo — quindi la metrica di fedeltà di ruolo ha una nota irregolarità. La direzione è
robusta su quattro file; lo scarto preciso no.
4. Capacità generalista: la base non è degradata
La domanda del proprietario (il fine-tune del world-model ha rotto l'LLM di base?) ottiene una sezione sobria, non il titolo. Risposta breve: no — N=3, direzionale.
| Task | AgentWorld | Qwen3.6 | |
|---|---|---|---|
| Reasoning (5 enigmi verificabili incl. il trap strawberry-'r') | 15/15 | 15/15 | parità |
| Generazione di codice (4 funzioni, eseguite contro unit test) | 12/12 | 12/12 | parità |
Eseguito con un prompt assistente (non il prompt simulatore), AgentWorld scrive codice corretto e ragiona correttamente, alla pari del generalista. Non "deraglia" — è un generalista competente che si dà il caso ragioni troppo.
5. Il costo: una tassa di over-reasoning — e il rimedio
Promuovi questo da nota a piè di pagina a criterio di adozione, perché per un verificatore per-step è il numero decisivo — ma ha una soluzione.
Misurato su casi di terminale deterministici (N=2 per caso):
| Modalità | AgentWorld | Qwen3.6 |
|---|---|---|
| Reasoning on (modalità simulatore di default) | mediana 1140 tok/pred, max 2558 · ~14 s · 8/8 esatti | 504 tok · ~4.5 s · 8/8 |
Reasoning off (enable_thinking=false) |
45 tok/pred · ~0.5 s · 8/8 esatti | 45 tok · ~0.4 s · 8/8 |
AgentWorld emette ~2.3× più token del generalista e su un banale cd ; pwd il
suo reasoning è andato oltre gli 8192 token in 2 run su 3. La risposta finale è corretta —
si tratta di una tassa di latenza/calcolo per passo, non di un difetto di correttezza.
Il rimedio: limitalo
Disattivare il reasoning off per il ruolo di simulatore taglia i token di ~25× e la latenza
di ~28× senza alcuna perdita di fedeltà byte-exact sui casi deterministici (ancora 8/8).
Per un verificatore o mock per-step, eseguilo con enable_thinking=false e un
tetto di max_tokens. Riserva: questo è testato solo su casi deterministici —
su output dove il reasoning aiuta davvero (stato ambiguo, contenuto
complesso), reasoning-off potrebbe costare fedeltà. Non testato qui.
6. Prestazioni (single-run, indicative ★)
Stessa famiglia, stessa architettura, quindi i profili sono vicini. Leggi questi come tendenze.
| Misura | AgentWorld | Qwen3.6 | Lettura |
|---|---|---|---|
| Time to first token ★ | ~360 ms | ~510 ms | AW in vantaggio |
| Throughput di decode ★ | ~110 t/s | ~117 t/s | ~7% più lento |
| Decode a 64K di contesto | ~132 t/s | ~160 t/s | ~73% mantenuto |
| Memoria 4K → 64K | +5 GB | +5 GB | arch ibrida, non specifica di AW |
| Cache di contesto (riuso prefisso di 13K token) | ~×21 | ~×23 | proprietà MLX, non del modello |
Lo scarto di decode di ~7% è molto probabilmente la ricetta 4-bit (AgentWorld protegge la sua proiezione linear-attention in 6-bit; Qwen3.6 protegge il gate MoE in 8-bit), su lunghezze di output disuguali — un confondente, non uno svantaggio del modello. Il prompt caching è una feature di mlx-lm identica su entrambi i modelli; il suo guadagno di ~20× scala con la lunghezza del prefisso in cache, non è una proprietà di AgentWorld.
Non testato ma di alto valore (il caso d'uso #2 della community): usare la predizione next-state come verificatore di traiettorie — quando l'ambiente reale diverge dalla predizione, ciò segnala un agente fuori-rotta. Non abbiamo misurato il suo comportamento falso-positivo / falso-negativo. Domanda aperta.
7. Cosa affermano gli autori
Benchmark degli autori — un'affermazione, non una misurazione
Sul loro benchmark (AgentWorldBench), AgentWorld-35B totalizza 56.4, allo stesso livello di Claude Sonnet 4.6 (56.0). I guadagni che attribuiscono alla specializzazione, per ablazione contro la base Qwen3.5 (auto-riportato, non un confronto diretto vs Qwen3.6): +21.9 tool-use (MCP), +18.1 software engineering, +10.2 terminal. Tesi: la specializzazione world-model batte il miglioramento generazionale — il generalista Qwen3.6 totalizza al di sotto della base (42.9 vs 47.7) sulla fedeltà di simulazione, perché è tarato per agire, non per predire lo stato.
Queste cifre provengono da un benchmark interno a fonte singola, valutato da un giudice LLM, su un modello con meno di 48 h di vita alla pubblicazione — nessuna replica di terze parti. La cima della loro tabella sta entro ~2 punti sotto un solo giudice, quindi l'ordinamento vicino alla cima è dentro il rumore; il margine 397B "batte GPT-5.4" è +0.46 (rumore), e quella variante è non pubblica (HF 401) nonostante l'annuncio Apache-2.0.
Il nostro risultato multi-step (§3) è su una metrica diversa e non replicata rispetto al loro bench single-step; punta nella stessa direzione (Qwen3.6 più debole sulla simulazione), ma questa è convergenza di tesi, non conferma.
8. Come lo collegherei
- Prompt: usa il system prompt ufficiale di simulazione del terminale per eseguirlo come ambiente; usa un semplice prompt assistente solo se vuoi output generalista. Le due modalità sono lavori diversi.
- Controllo dei costi:
enable_thinking=false+ un tetto dimax_tokensper il ruolo di simulatore (§5). Con reasoning attivo, prevedi ~1000–2500 token/passo. - Closed loop: ri-alimenta le predizioni del modello stesso, ma àncorati all'ambiente reale quando lo hai; aspettati che la severità di formato conti (la riga di echo).
- Footprint: ~20 GB di pesi, ~27 GB di picco a 64K.
- La questione build-vs-adopt: il "non esce mai dal ruolo" è intrinseco all'addestramento world-model, oppure un generalista + decoding vincolato da grammatica potrebbe colmare gran parte dello scarto? Non abbiamo testato l'alternativa generalista-vincolato — ponderala prima di adottare un modello dedicato.
Limiti di questo bench
- Campioni piccoli (N=1–5, nessuna deviazione standard). Ogni scarto numerico è una tendenza, non un risultato statistico.
- Un solo dominio per i due risultati chiave (sequenze di terminale). Il tenere il ruolo "in un loop" resta da confermare altrove.
- Quantizzazione non isolata: le due ricette 4-bit differiscono leggermente; lo scarto di decode è probabilmente legato a ciò ma non è provato qui.
- Non ancora testati: scenari casuali/complessi, un secondo dominio, un confronto a tre contro la base Qwen3.5 per isolare l'effetto esatto del fine-tune, e il caso d'uso del verificatore di traiettorie.
- Solo il 35B è pubblico. La variante 397B non è scaricabile.
Fonti: arXiv 2606.24597 · Qwen-AgentWorld-35B-A3B (Apache-2.0). Risultati revisionati internamente in modo incrociato per il bias prima della pubblicazione. ★ = misurazione singola, indicativa.