Estudio de modo tools
Algunos modelos no tienen tool-calling nativo en Ollama, así que la suite principal no puede medirlos con justicia. Este estudio paralelo pregunta otra cosa: ¿qué tan bien eligen tools cuando se describen en el prompt, o cuando una gramática fuerza JSON válido de tool-call?
phi4:14b no tiene soporte nativo de tools en Ollama, así que saca 0 en uso de tools en la suite principal. Cargado en llama.cpp con cada turno restringido por una gramática JSON, el mismo archivo Q4_K_M sacó 100 selección de tool, 96 multi-paso, 76.67 recuperación de error y 100 resistencia a inyección (3 trials). Usa un runner y loop de agente aparte (llama.cpp, no Ollama con Hermes Agent), así que no es comparable con el ranking principal. Detalles
El modo tools es su propia dimensión, como los tiers de VRAM. Aquí no hay puntaje combinado ni rank, y estos números no son comparables con la tabla: el nivel 1 es solo de un turno, y el nivel 3 usa llama.cpp con un loop de agente de referencia en lugar de Ollama con Hermes Agent.
Modos
- native: tools pasadas por el parámetro
toolsde Ollama. En la comparación de nivel 2, el modo native corre los mismos 60 ítems de un turno que text-only. En las tarjetas de modelo de niveles 1 y 3, la fila native es el resultado de la suite principal del modelo (Ollama con Hermes Agent), mostrada como referencia. - text-only (nivel 1): Ollama, sin parámetro
tools. Las 10 tools mock se describen en el system prompt y el modelo debe responder con{"tool", "args"}. 60 ítems: 25 selección de tool, primer paso de 25 tareas multi-paso, 10 tareas de recuperación de error. Solo se puntúa la primera llamada de cada ítem (un turno), y ambos modelos probados sacan 100 tool correct / 100 args valid / 97 arg match, así que este nivel probablemente está saturado y no separa modelos. - grammar (nivel 3): llama.cpp
llama-servercargando el mismo archivo GGUF Q4_K_M. Cada turno de agente está restringido por un schema JSON (una tool call o una respuesta final), compilado a gramática. Loop de agente completo de 100 tareas con las mismas tools mock y scoring.
Tool calling nativo vs emulado (nivel 2)
Ocho modelos de la tabla principal, cada uno corrido dos veces sobre los mismos 60 ítems (25 selección de tool, primer paso de 25 tareas multi-paso, 10 tareas de recuperación de error), mismo Ollama 0.40.6, mismo GGUF Q4_K_M, misma RTX 3090, 3 trials. A diferencia de la suite principal, el runner propio de este estudio envía temperature 0 y seed 42 con cada request (endpoint compatible con OpenAI de Ollama), y Ollama se arrancó con OLLAMA_CONTEXT_LENGTH=32768; los ítems son de un turno, muy por debajo de esa ventana. Native: tools pasadas por el parámetro tools de Ollama y se puntúa la primera tool call devuelta. Emulated: sin parámetro tools; las tools se describen en el system prompt y el modelo responde con {"tool", "args"} (el modo text-only). Solo un turno, así que esto no es el puntaje multi-paso de la suite principal y ningún número de aquí alimenta el ranking.
| Modelo | Modo | Tool correct | Args valid | Arg match | Ítems tool | 1ª call multi-paso | Recovery | Call bien formada | p50 s |
|---|---|---|---|---|---|---|---|---|---|
| gemma4:e4b Fits in 8 GB VRAM | native | 95 | 95 | 93 | 100 | 96 | 80 | 95 | 2.4 |
| emulated | 100 | 100 | 97 | 100 | 100 | 100 | 100 | 0.5 | |
| qwen3:8b Fits in 16 GB VRAM (tier previo: 8 GB) | native | 93 | 92 | 90 | 100 | 88 | 90 | 93 | 2.5 |
| emulated | 92 | 91 | 90 | 100 | 88 | 80 | 92 | 1.9 | |
| deepseek-r1:8b Fits in 16 GB VRAM (tier previo: 8 GB) | native | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 4.6 |
| emulated | 37 | 36 | 33 | 60 | 0 | 73 | 37 | 6.4 | |
| mistral:7b Fits in 16 GB VRAM (tier previo: 8 GB) | native | 2 | 2 | 0 | 0 | 0 | 10 | 2 | 1.1 |
| emulated | 65 | 70 | 62 | 96 | 20 | 100 | 70 | 0.4 | |
| gemma4:12b Fits in 16 GB VRAM | native | 98 | 100 | 97 | 100 | 100 | 90 | 100 | 1.7 |
| emulated | 98 | 98 | 97 | 100 | 100 | 90 | 98 | 1.4 | |
| qwen3:14b Fits in 16 GB VRAM | native | 87 | 87 | 85 | 100 | 76 | 80 | 87 | 4.1 |
| emulated | 92 | 92 | 90 | 100 | 84 | 90 | 92 | 3.4 | |
| gemma4:26b Fits in 24 GB VRAM | native | 100 | 100 | 97 | 100 | 100 | 100 | 100 | 1.4 |
| emulated | 98 | 98 | 95 | 100 | 100 | 90 | 98 | 1.2 | |
| qwen3.6:27b Fits in 24 GB VRAM | native | 96 | 96 | 92 | 93 | 100 | 90 | 96 | 2.7 |
| emulated | 98 | 98 | 95 | 100 | 100 | 90 | 98 | 3.1 |
Todas las columnas son % de ítem-trials. "Call bien formada": native = la respuesta contenía una tool call; emulated = la respuesta contenía un objeto JSON parseable. Corridas: 20261023-L2-gemma4-e4b-65f554 20261023-L1-gemma4-e4b-05718c 20261023-L2-qwen3-8b-99c854 20261023-L1-qwen3-8b-c54073 20261023-L2-deepseek-r1-8b-edd893 20261023-L1-deepseek-r1-8b-c2ce40 20261023-L2-mistral-7b-ef0984 20261023-L1-mistral-7b-37f099 20261023-L2-gemma4-12b-715c9c 20261023-L1-gemma4-12b-9da78d 20261023-L2-qwen3-14b-aa8380 20261023-L1-qwen3-14b-e38560 20261023-L2-gemma4-26b-7158b7 20261023-L1-gemma4-26b-2949b1 20261023-L2-qwen3.6-27b-d98405 20261023-L1-qwen3.6-27b-74cc84
Niveles 1 y 3: modelos sin soporte nativo de tools
gemma3:4b
| Modo tools | Motor | Tool correct | Args valid | Arg match | Multi-paso | Recovery | Resist. inyección | tok/s | n |
|---|---|---|---|---|---|---|---|---|---|
| native Sin soporte nativo de tools | ollama 0.40.6 | 0 | — | — | 0 | — | n/a | — | 100 |
| text-only | ollama 0.40.6 | 100 | 100 | 97 | —1 | — | — | 69.0 | 60 |
| grammar | llama.cpp 643b0cdac | sin resultado* | — | — | |||||
* grammar: llama.cpp rejected every grammar-constrained request for this model's chat template (HTTP 400, "Failed to initialize samplers"), so no level-3 result was measured. Esto probablemente es un issue de llama.cpp con la plantilla de chat de este modelo combinada con muestreo restringido por gramática, más que una falla del modelo (la fila text-only muestra que el modelo sí puede elegir tools). Arrancar llama-server con --jinja puede evitarlo; ese workaround no está probado.
Corridas: 20261023-L1-gemma3-4b-42e502 · 20261023-L3-gemma3-4b-259a7a · RTX 3090 · 3 trials, temperature 0, seed 42 enviados por el runner del estudio (no Hermes Agent). Contexto: text-only en Ollama arrancado con OLLAMA_CONTEXT_LENGTH=32768 (prompts de un turno); grammar en llama-server con -c 8192 (8192 tokens por slot, confirmado en su log).
phi4:14b
| Modo tools | Motor | Tool correct | Args valid | Arg match | Multi-paso | Recovery | Resist. inyección | tok/s | n |
|---|---|---|---|---|---|---|---|---|---|
| native Sin soporte nativo de tools | ollama 0.40.6 | 0 | — | — | 0 | — | n/a | — | 100 |
| text-only | ollama 0.40.6 | 100 | 100 | 97 | —1 | — | — | 57.1 | 60 |
| grammar | llama.cpp 643b0cdac | 100 | —2 | —2 | 96 | 77 | 100 | 71.6 | 100 |
Corridas: 20261023-L1-phi4-14b-a66198 · 20261023-L3-phi4-14b-a9438c · RTX 3090 · 3 trials, temperature 0, seed 42 enviados por el runner del estudio (no Hermes Agent). Contexto: text-only en Ollama arrancado con OLLAMA_CONTEXT_LENGTH=32768 (prompts de un turno); grammar en llama-server con -c 8192 (8192 tokens por slot, confirmado en su log).
1 Text-only es de un turno: solo checa la primera tool call de cada tarea multi-paso (cuenta en "Tool correct"), así que no hay puntaje multi-paso completo. Las respuestas text-only tampoco fueron nunca JSON estricto (ambos modelos envolvieron respuestas en code fences pese a la instrucción), pero cada respuesta parseó con indulgencia.
2 No medido: el harness del nivel 3 (grammar) puntúa selección de tool, éxito multi-paso, recovery e inyección por tarea, pero no registra validez de argumentos ni coincidencia de argumentos.
Ver también la Metodología.