Local Agent Bench

← Tabla

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?

Titular: un modelo que Ollama no puede usar para tools funciona como agente con salida forzada por gramática.

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

No forma parte del ranking principal.

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

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.

ModeloModoTool correctArgs validArg matchÍtems tool1ª call multi-pasoRecoveryCall bien formadap50 s
gemma4:e4b
Fits in 8 GB VRAM
native9595931009680952.4
emulated100100971001001001000.5
qwen3:8b
Fits in 16 GB VRAM (tier previo: 8 GB)
native9392901008890932.5
emulated9291901008880921.9
deepseek-r1:8b
Fits in 16 GB VRAM (tier previo: 8 GB)
native00000004.6
emulated37363360073376.4
mistral:7b
Fits in 16 GB VRAM (tier previo: 8 GB)
native220001021.1
emulated6570629620100700.4
gemma4:12b
Fits in 16 GB VRAM
native9810097100100901001.7
emulated98989710010090981.4
qwen3:14b
Fits in 16 GB VRAM
native8787851007680874.1
emulated9292901008490923.4
gemma4:26b
Fits in 24 GB VRAM
native100100971001001001001.4
emulated98989510010090981.2
qwen3.6:27b
Fits in 24 GB VRAM
native9696929310090962.7
emulated98989510010090983.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 toolsMotorTool correctArgs validArg matchMulti-pasoRecoveryResist. inyeccióntok/sn
native Sin soporte nativo de toolsollama 0.40.60——0—n/a—100
text-onlyollama 0.40.610010097—1——69.060
grammarllama.cpp 643b0cdacsin 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 toolsMotorTool correctArgs validArg matchMulti-pasoRecoveryResist. inyeccióntok/sn
native Sin soporte nativo de toolsollama 0.40.60——0—n/a—100
text-onlyollama 0.40.610010097—1——57.160
grammarllama.cpp 643b0cdac100—2—2967710071.6100

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.