ai-speedometer 2.1.4 → 2.1.5

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 (2) hide show
  1. package/dist/ai-speedometer +100 -19
  2. package/package.json +1 -1
@@ -1777,8 +1777,22 @@ async function benchmarkSingleModelRest(model) {
1777
1777
  body: JSON.stringify(body)
1778
1778
  });
1779
1779
  if (!response.ok) {
1780
- await response.text();
1781
- throw new Error(`API request failed: ${response.status} ${response.statusText}`);
1780
+ const errBody = await response.text();
1781
+ let errDetail = "";
1782
+ try {
1783
+ const parsed = JSON.parse(errBody);
1784
+ if (typeof parsed.error === "object" && parsed.error?.message)
1785
+ errDetail = parsed.error.message;
1786
+ else if (typeof parsed.error === "string")
1787
+ errDetail = parsed.error;
1788
+ else if (parsed.message)
1789
+ errDetail = parsed.message;
1790
+ else
1791
+ errDetail = errBody.slice(0, 200);
1792
+ } catch {
1793
+ errDetail = errBody.slice(0, 200);
1794
+ }
1795
+ throw new Error(`${response.status} ${response.statusText}${errDetail ? ": " + errDetail : ""}`);
1782
1796
  }
1783
1797
  const reader = response.body.getReader();
1784
1798
  const decoder = new TextDecoder;
@@ -2161,7 +2175,7 @@ var package_default;
2161
2175
  var init_package = __esm(() => {
2162
2176
  package_default = {
2163
2177
  name: "ai-speedometer",
2164
- version: "2.1.4",
2178
+ version: "2.1.5",
2165
2179
  description: "A comprehensive CLI tool for benchmarking AI models across multiple providers with parallel execution and professional metrics",
2166
2180
  bin: {
2167
2181
  "ai-speedometer": "dist/ai-speedometer",
@@ -2614,7 +2628,7 @@ function ModelSelectScreen() {
2614
2628
  navigate("benchmark");
2615
2629
  }, [dispatch, navigate]);
2616
2630
  usePaste((text) => {
2617
- setSearchQuery((q) => q + text);
2631
+ setSearchQuery((q) => q + text.replace(/[\r\n]/g, ""));
2618
2632
  });
2619
2633
  useKeyboard4((key) => {
2620
2634
  if (key.name === "escape") {
@@ -3307,6 +3321,68 @@ function BenchmarkScreen() {
3307
3321
  }, `ttft-${s.model.id}-${s.model.providerId}`, true, undefined, this));
3308
3322
  }
3309
3323
  }
3324
+ if (allDone && errors.length > 0) {
3325
+ rows.push(/* @__PURE__ */ jsxDEV10("box", {
3326
+ height: 1,
3327
+ backgroundColor: "#292e42"
3328
+ }, "div-errors", false, undefined, this));
3329
+ rows.push(/* @__PURE__ */ jsxDEV10("box", {
3330
+ height: 1,
3331
+ flexDirection: "row",
3332
+ paddingLeft: 1,
3333
+ children: /* @__PURE__ */ jsxDEV10("text", {
3334
+ fg: "#f7768e",
3335
+ children: [
3336
+ " FAILED (",
3337
+ errors.length,
3338
+ ") "
3339
+ ]
3340
+ }, undefined, true, undefined, this)
3341
+ }, "hdr-errors", false, undefined, this));
3342
+ for (const s of errors) {
3343
+ rows.push(/* @__PURE__ */ jsxDEV10("box", {
3344
+ flexDirection: "column",
3345
+ paddingLeft: 2,
3346
+ paddingTop: 1,
3347
+ paddingBottom: 1,
3348
+ children: [
3349
+ /* @__PURE__ */ jsxDEV10("box", {
3350
+ height: 1,
3351
+ flexDirection: "row",
3352
+ children: [
3353
+ /* @__PURE__ */ jsxDEV10("text", {
3354
+ fg: "#f7768e",
3355
+ children: "\u2717 "
3356
+ }, undefined, false, undefined, this),
3357
+ /* @__PURE__ */ jsxDEV10("text", {
3358
+ fg: "#c0caf5",
3359
+ children: [
3360
+ s.model.name,
3361
+ " "
3362
+ ]
3363
+ }, undefined, true, undefined, this),
3364
+ /* @__PURE__ */ jsxDEV10("text", {
3365
+ fg: "#565f89",
3366
+ children: [
3367
+ "(",
3368
+ s.model.providerName,
3369
+ ")"
3370
+ ]
3371
+ }, undefined, true, undefined, this)
3372
+ ]
3373
+ }, undefined, true, undefined, this),
3374
+ /* @__PURE__ */ jsxDEV10("box", {
3375
+ height: 1,
3376
+ paddingLeft: 3,
3377
+ children: /* @__PURE__ */ jsxDEV10("text", {
3378
+ fg: "#f7768e",
3379
+ children: s.error ?? "Unknown error"
3380
+ }, undefined, false, undefined, this)
3381
+ }, undefined, false, undefined, this)
3382
+ ]
3383
+ }, `err-${s.model.id}-${s.model.providerId}`, true, undefined, this));
3384
+ }
3385
+ }
3310
3386
  rows.push(/* @__PURE__ */ jsxDEV10("box", {
3311
3387
  height: 1,
3312
3388
  backgroundColor: "#292e42"
@@ -3515,10 +3591,11 @@ function AddVerifiedScreen() {
3515
3591
  }
3516
3592
  }
3517
3593
  usePaste((text) => {
3594
+ const clean = text.replace(/[\r\n]/g, "");
3518
3595
  if (step === "browse")
3519
- setSearchQuery((q) => q + text);
3596
+ setSearchQuery((q) => q + clean);
3520
3597
  else if (step === "confirm")
3521
- setApiKey((k) => k + text);
3598
+ setApiKey((k) => k + clean);
3522
3599
  });
3523
3600
  useKeyboard6((key) => {
3524
3601
  if (step === "browse") {
@@ -3930,7 +4007,7 @@ function AddCustomScreen() {
3930
4007
  baseUrl: baseUrl.trim(),
3931
4008
  apiKey: apiKey.trim(),
3932
4009
  models: models.map((m) => ({
3933
- id: m.toLowerCase().replace(/[^a-z0-9-]/g, "-"),
4010
+ id: m,
3934
4011
  name: m
3935
4012
  }))
3936
4013
  });
@@ -3945,16 +4022,17 @@ function AddCustomScreen() {
3945
4022
  }
3946
4023
  }
3947
4024
  usePaste((text) => {
4025
+ const clean = text.replace(/[\r\n]/g, "");
3948
4026
  if (step === "id")
3949
- setProviderId((v) => v + text);
4027
+ setProviderId((v) => v + clean);
3950
4028
  else if (step === "name")
3951
- setProviderName((v) => v + text);
4029
+ setProviderName((v) => v + clean);
3952
4030
  else if (step === "url")
3953
- setBaseUrl((v) => v + text);
4031
+ setBaseUrl((v) => v + clean);
3954
4032
  else if (step === "key")
3955
- setApiKey((v) => v + text);
4033
+ setApiKey((v) => v + clean);
3956
4034
  else if (step === "models")
3957
- setModelInput((v) => v + text);
4035
+ setModelInput((v) => v + clean);
3958
4036
  });
3959
4037
  useKeyboard7((key) => {
3960
4038
  if (step === "done") {
@@ -4018,10 +4096,8 @@ function AddCustomScreen() {
4018
4096
  }
4019
4097
  if (step === "name") {
4020
4098
  if (key.name === "return" || key.name === "enter") {
4021
- if (!providerName.trim()) {
4022
- setInputError("Name is required");
4023
- return;
4024
- }
4099
+ if (!providerName.trim())
4100
+ setProviderName(providerId);
4025
4101
  setInputError("");
4026
4102
  setStep("url");
4027
4103
  return;
@@ -4310,8 +4386,12 @@ function AddCustomScreen() {
4310
4386
  height: 1,
4311
4387
  children: /* @__PURE__ */ jsxDEV12("text", {
4312
4388
  fg: "#565f89",
4313
- children: "e.g. My OpenAI"
4314
- }, undefined, false, undefined, this)
4389
+ children: [
4390
+ 'e.g. My OpenAI (Enter to use "',
4391
+ providerId,
4392
+ '")'
4393
+ ]
4394
+ }, undefined, true, undefined, this)
4315
4395
  }, undefined, false, undefined, this)
4316
4396
  ]
4317
4397
  }, undefined, true, undefined, this),
@@ -4485,8 +4565,9 @@ function AddModelsScreen() {
4485
4565
  load();
4486
4566
  }, []);
4487
4567
  usePaste((text) => {
4568
+ const clean = text.replace(/[\r\n]/g, "");
4488
4569
  if (step === "add")
4489
- setModelInput((v) => v + text);
4570
+ setModelInput((v) => v + clean);
4490
4571
  });
4491
4572
  useKeyboard8((key) => {
4492
4573
  if (done) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ai-speedometer",
3
- "version": "2.1.4",
3
+ "version": "2.1.5",
4
4
  "description": "A comprehensive CLI tool for benchmarking AI models across multiple providers with parallel execution and professional metrics",
5
5
  "bin": {
6
6
  "ai-speedometer": "dist/ai-speedometer",