bench
No description
- Stars
- 0
- Language
- JavaScript
- Created
- Aug 27, 2026
- Updated
- Aug 27, 2026
Introduction
bench
Plugin de composición para DeepSeek Harness (dsh) que expone una Tool para comparar latencia y tokens/segundo entre modelos, en el mismo prompt: bench_run.
Compara dos backends:
- LM Studio (local, API compatible con OpenAI —
/v1/chat/completions). - Ollama (local o modelos
:cloud— API nativa/api/chat).
No shellea a nada — solo fetch() HTTP directo a los servidores locales.
Requisito
Los servidores que quieras comparar tienen que estar corriendo y accesibles (LM Studio en http://localhost:1234 por default, Ollama en http://localhost:11434). El plugin no los levanta ni los verifica de antemano — si un target no responde, esa fila del resultado queda ok: false.
Instalación
-
Dependencias locales:
cd bench npm install -
Montarlo en el perfil de
dsh(~/.dsh/profiles/<perfil>/cordis.patch.yml):- insert: - id: bench name: 'file:///C:/ruta/a/bench/host.js' -
Reiniciar el proceso de
dshpara que cargue el plugin.
Tool
bench_run
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
prompt | string | sí | Prompt idéntico para todos los targets. |
systemPrompt | string | no | Aplicado a todos los targets. |
lmStudioModels | array<string> | no | Ids de modelo a probar vía LM Studio (deben estar ya cargados ahí). |
lmStudioBaseURL | string | no | Default http://localhost:1234. |
ollamaModels | array<string> | no | Ids de modelo a probar vía Ollama, ej. "glm-5.3-flash:cloud". |
ollamaBaseURL | string | no | Default http://localhost:11434. |
maxTokens | integer | no | Tope de tokens de completion (solo afecta a los targets de LM Studio). Default 256. |
timeoutMs | integer | no | Timeout por request. Default 180000 — los modelos de razonamiento locales pueden ser muy lentos (un solo dígito de tok/s), no asumir que un timeout corto significa que algo cuelga. |
Corre los targets secuencialmente (no en paralelo): correrlos a la vez competiría por la misma GPU/CPU local y ensuciaría la medición de latencia.
Devuelve { ok, results: [{ backend, model, ok, latencyMs, promptTokens, completionTokens, tokensPerSec, error? }] }.
Decisiones de diseño (por qué está armado así)
tokensPerSec/promptTokens/completionTokenssonnull, nuncaundefined, cuando el dato no está disponible.dsh-toolsvalida que el valor devuelto por una tool sea JSON "lossless" y rechazaundefinedcomo valor de propiedad (a diferencia deJSON.stringify, que lo descarta en silencio) — el error es"value is not lossless JSON". Encontrado en vivo durante la verificación de este plugin, no en la documentación.- El tok/s de Ollama usa
eval_durationcuando está, y cae atotal_durationsi no. Los modelos:cloudde Ollama (probado congpt-oss:20b-cloud) no devuelven el desgloseeval_duration/prompt_eval_durationque sí traen los modelos locales — solototal_duration. Sin el fallback, todo target:cloudreportabatok/s n/daunque la llamada hubiera funcionado bien. - El tok/s de LM Studio se calcula con latencia de wall-clock, no con timing del servidor.
/v1/chat/completionsdevuelveusage.completion_tokenspero el campostatsviene vacío — no hay timing propio que usar. - Targets hardcodeados a estos dos backends (no una lista genérica de endpoints) — es lo que se necesitaba probar hoy; una lista de targets arbitrarios con schema propio (
baseURL+apiStyle+modelpor objeto) hubiera requerido parámetros de tipo objeto anidado, evitados por precedente (ver la nota de schemas tipados en el README dekdd-gates).
Estado verificado
lmStudioModels: ["lfm2.5-230m-tomoe"]contra LM Studio real:64ms, 78.1 tok/s (5 tokens).ollamaModels: ["gpt-oss:20b-cloud"]contra Ollama Cloud real:1407ms, 82.6 tok/s (109 tokens), confirmando el fallback atotal_duration.