ollanet 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +3 -2
  2. package/dist/bench.js +18 -10
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -151,8 +151,9 @@ ollanet bench localhost gemma4:12b --runs 5 --cold-load --json
151
151
  Runs a built-in suite (`quick` default, or `--suite full`) against one or more **completion**
152
152
  models: instruction checks once, throughput case repeated (`--runs`, default 3) with
153
153
  pinned `num_predict` / `seed` / `temperature`. Reports median tok/s + spread. Under `--all`,
154
- skips embedding models and vision-capable models (text suite; use `--include-vision` to
155
- include them). Saves `benchmarks/<id>.json` (or `~/.ollanet/benchmarks/` when installed).
154
+ skips non-completion models (embeddings); multimodal `completion`+`vision` models stay in
155
+ (early-stop / pass_rate handle text-suite failures). Use `--exclude-vision` to drop them.
156
+ Saves `benchmarks/<id>.json` (or `~/.ollanet/benchmarks/` when installed).
156
157
  See [`docs/bench-spec.md`](docs/bench-spec.md) for measurement rules.
157
158
 
158
159
  `quick` has only two scored checks (`ping`, `math`), so `pass` is a coarse
package/dist/bench.js CHANGED
@@ -19,8 +19,7 @@ function usage() {
19
19
 
20
20
  Options:
21
21
  --all Every completion-capable model from /api/tags
22
- (skips vision models; use --include-vision)
23
- --include-vision With --all, also bench vision-capable models
22
+ --exclude-vision With --all, skip models that advertise vision
24
23
  --suite quick|full Prompt suite (default quick)
25
24
  --runs <n> Throughput repeats (default 3)
26
25
  --warmup / --no-warmup
@@ -85,7 +84,7 @@ function parseArgs(argv) {
85
84
  let suite = "quick";
86
85
  let runs = 3;
87
86
  let all = false;
88
- let includeVision = false;
87
+ let excludeVision = false;
89
88
  let warmup = true;
90
89
  let coldLoad = false;
91
90
  let json = false;
@@ -105,8 +104,13 @@ function parseArgs(argv) {
105
104
  all = true;
106
105
  continue;
107
106
  }
107
+ if (arg === "--exclude-vision") {
108
+ excludeVision = true;
109
+ continue;
110
+ }
111
+ // Back-compat no-op: 0.2.0 defaulted to skipping vision; prefer --exclude-vision.
108
112
  if (arg === "--include-vision") {
109
- includeVision = true;
113
+ excludeVision = false;
110
114
  continue;
111
115
  }
112
116
  if (arg === "--json") {
@@ -215,7 +219,7 @@ function parseArgs(argv) {
215
219
  machine,
216
220
  models,
217
221
  all,
218
- includeVision,
222
+ excludeVision,
219
223
  suite,
220
224
  runs,
221
225
  warmup,
@@ -433,7 +437,8 @@ function printTable(machine, suite, runs, revision, compKey, models, skipped, co
433
437
  return -1;
434
438
  else if (pb !== pa)
435
439
  return pb - pa;
436
- // Unavailable tok/s sinks below any defined median (including 0).
440
+ // Unavailable tok/s (all early-stop / errors) intentionally sinks below any
441
+ // defined median, including 0 — same pass_rate cohort, then speed.
437
442
  const ta = a.summary.tok_s_median;
438
443
  const tb = b.summary.tok_s_median;
439
444
  if (ta == null && tb == null)
@@ -446,8 +451,9 @@ function printTable(machine, suite, runs, revision, compKey, models, skipped, co
446
451
  });
447
452
  for (const m of sorted) {
448
453
  const tok = m.summary.tok_s_median != null ? m.summary.tok_s_median.toFixed(1) : "—";
454
+ // Match median precision — toFixed(0) on min/max can print "83.8 84–86".
449
455
  const spread = m.summary.tok_s_min != null && m.summary.tok_s_max != null
450
- ? `${m.summary.tok_s_min.toFixed(0)}–${m.summary.tok_s_max.toFixed(0)}`
456
+ ? `${m.summary.tok_s_min.toFixed(1)}–${m.summary.tok_s_max.toFixed(1)}`
451
457
  : "—";
452
458
  const pass = m.summary.pass_rate != null
453
459
  ? `${Math.round(m.summary.pass_rate * checkDenom(m))}/${checkDenom(m)}`
@@ -486,7 +492,7 @@ function printTable(machine, suite, runs, revision, compKey, models, skipped, co
486
492
  }
487
493
  if (vision.length) {
488
494
  lines.push(`Skipped ${vision.length} vision model(s): ${vision.map((s) => s.name).join(", ")}` +
489
- " (text suite; pass --include-vision to bench)");
495
+ " (--exclude-vision)");
490
496
  }
491
497
  }
492
498
  process.stdout.write(`${lines.join("\n")}\n`);
@@ -521,8 +527,10 @@ export async function main() {
521
527
  skipped.push({ name: t.name, reason: "non-completion", capabilities: caps ?? [] });
522
528
  continue;
523
529
  }
524
- // Text-only suite: vision models (moondream, etc.) usually early-stop / fail checks.
525
- if (!parsed.includeVision && isVisionCapable(caps)) {
530
+ // Default: completion only (spec). Vision+completion models (gemma3, etc.)
531
+ // stay in --all; early-stop / pass_rate report text-suite failures.
532
+ // Opt out of vision-capable models with --exclude-vision.
533
+ if (parsed.excludeVision && isVisionCapable(caps)) {
526
534
  skipped.push({ name: t.name, reason: "vision", capabilities: caps ?? [] });
527
535
  continue;
528
536
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ollanet",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "Chat with Ollama servers on any reachable network — scan hosts, prompt models, continue chats by hash",
5
5
  "type": "module",
6
6
  "bin": {