@yoqa/runner 0.3.29 → 0.3.30

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/index.js +54 -20
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -16855,7 +16855,7 @@ function getCatalogDb() {
16855
16855
  // package.json
16856
16856
  var package_default = {
16857
16857
  name: "@yoqa/runner",
16858
- version: "0.3.29",
16858
+ version: "0.3.30",
16859
16859
  description: "Yoqa local runner \u2014 Appium + catalog HTTP API (Bun). Start with yoqa serve or the yoqa-runner bin.",
16860
16860
  license: "UNLICENSED",
16861
16861
  type: "module",
@@ -49069,6 +49069,7 @@ class AgentProviderError extends Error {
49069
49069
  }
49070
49070
  }
49071
49071
  var EXAMPLE_OPENCODE_VISION_MODEL = "mimo-v2.5-free";
49072
+ var EXAMPLE_GROQ_VISION_MODEL = "qwen/qwen3.8-27b";
49072
49073
  var VISION_MAX_TOKENS = 4096;
49073
49074
  var VISION_MAX_EDGE = 1170;
49074
49075
  var JSON_REPAIR_PROMPT = "Your previous reply was not valid JSON for this task. Reply again with ONLY one strict JSON object using double quotes for every key and string (no single quotes, no markdown, no prose).";
@@ -49136,6 +49137,9 @@ function formatProviderHttpError(label, status, body) {
49136
49137
  if (label === "OpenCode" && status >= 500 && (body.includes("Internal server error") || body.includes('"type":"error"'))) {
49137
49138
  return `OpenCode Zen returned an internal error for this vision request. Many free models reject screenshots. In Settings \u2192 Provider, set the default model to ${EXAMPLE_OPENCODE_VISION_MODEL} (or another vision-capable model).`;
49138
49139
  }
49140
+ if (label === "Groq" && status === 400 && body.includes("content must be a string")) {
49141
+ return `This Groq model cannot read screenshots (text-only). In Settings \u2192 Provider, set the default model to ${EXAMPLE_GROQ_VISION_MODEL}. openai/gpt-oss and Llama 3 reject image parts; Llama 4 Scout is shut down.`;
49142
+ }
49139
49143
  if (label === "Groq" && status === 400 && (body.includes("invalid JSON schema for response_format") || body.includes("required") && body.includes("every key in properties"))) {
49140
49144
  return "Groq rejected strict JSON schema mode for this model (response_format requires every key in properties). The runner already compensates with prompt JSON \u2014 retry the run; if it persists, pick a different Groq model in Settings \u2192 Provider.";
49141
49145
  }
@@ -58737,6 +58741,40 @@ var anthropicDriver = {
58737
58741
  }
58738
58742
  };
58739
58743
 
58744
+ // src/domains/providers/drivers/antigravity-models.ts
58745
+ var ANTIGRAVITY_DEFAULT_VISION_MODEL = "gemini-3.8-flash-medium";
58746
+ var ANTIGRAVITY_FALLBACK_MODELS = [
58747
+ { id: "gemini-3.8-flash-medium", name: "Gemini 3.8 Flash (Medium)" },
58748
+ { id: "gemini-3.8-flash-low", name: "Gemini 3.8 Flash (Low)" },
58749
+ { id: "gemini-3.1-pro-low", name: "Gemini 3.1 Pro (Low)" },
58750
+ { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6 (Thinking)" }
58751
+ ];
58752
+ var SKIP_LINE = /^(usage|fetching|available models|error:|warning:)/i;
58753
+ function parseAgyModelLines(text3) {
58754
+ const models = [];
58755
+ for (const raw2 of text3.split(`
58756
+ `)) {
58757
+ const line = raw2.trim();
58758
+ if (!line || SKIP_LINE.test(line))
58759
+ continue;
58760
+ const tab = line.indexOf("\t");
58761
+ const id = (tab >= 0 ? line.slice(0, tab) : line.split(/\s{2,}/)[0] ?? line).trim();
58762
+ const name29 = (tab >= 0 ? line.slice(tab + 1) : line.slice(id.length)).trim() || id;
58763
+ if (!id || /\s/.test(id))
58764
+ continue;
58765
+ models.push({ id, name: name29 });
58766
+ }
58767
+ return models;
58768
+ }
58769
+ function resolveAgyModelId(raw2, fallback = ANTIGRAVITY_DEFAULT_VISION_MODEL) {
58770
+ const trimmed = raw2?.trim();
58771
+ if (!trimmed)
58772
+ return fallback;
58773
+ const tab = trimmed.indexOf("\t");
58774
+ const id = (tab >= 0 ? trimmed.slice(0, tab) : trimmed.split(/\s+/)[0] ?? trimmed).trim();
58775
+ return id || fallback;
58776
+ }
58777
+
58740
58778
  // src/domains/providers/drivers/antigravity-vision.ts
58741
58779
  import { mkdtemp as mkdtemp4, rm as rm4, writeFile as writeFile4 } from "fs/promises";
58742
58780
  import { tmpdir as tmpdir5 } from "os";
@@ -68206,7 +68244,6 @@ function createGoogle(options = {}) {
68206
68244
  var google = createGoogle();
68207
68245
 
68208
68246
  // src/domains/providers/drivers/antigravity-vision.ts
68209
- var ANTIGRAVITY_DEFAULT_VISION_MODEL = "gemini-3.5-flash-medium";
68210
68247
  var JSON_REPAIR_PROMPT2 = "Your previous reply was not valid JSON for this task. Reply again with ONLY one strict JSON object using double quotes for every key and string (no single quotes, no markdown, no prose).";
68211
68248
  async function completeWithAgyCli(input, repairHint) {
68212
68249
  const resolved = await resolveBinary("agy", input.auth.binaryPath);
@@ -68214,7 +68251,7 @@ async function completeWithAgyCli(input, repairHint) {
68214
68251
  throw new AgentProviderError(resolved.detail || "Antigravity CLI (`agy`) not found. Install it or paste a Google AI Studio API key.");
68215
68252
  }
68216
68253
  const image = input.image ?? await prepareVisionImage(input.imageBase64);
68217
- const model = input.auth.defaultModel?.trim() || ANTIGRAVITY_DEFAULT_VISION_MODEL;
68254
+ const model = resolveAgyModelId(input.auth.defaultModel);
68218
68255
  const ext = image.mediaType === "image/jpeg" ? "jpg" : "png";
68219
68256
  const dir = await mkdtemp4(join14(tmpdir5(), "yoqa-agy-"));
68220
68257
  const shotPath = join14(dir, `shot.${ext}`);
@@ -68266,7 +68303,7 @@ var antigravityVision = {
68266
68303
  async completeObject(input) {
68267
68304
  const apiKey = resolveGoogleKey(input.auth);
68268
68305
  if (apiKey) {
68269
- const requested = input.auth.defaultModel?.trim() || ANTIGRAVITY_DEFAULT_VISION_MODEL;
68306
+ const requested = resolveAgyModelId(input.auth.defaultModel);
68270
68307
  const googleModelId = requested.startsWith("gemini-1.") || requested.startsWith("gemini-2.") ? requested : "gemini-2.5-flash";
68271
68308
  const image = input.image ?? await prepareVisionImage(input.imageBase64);
68272
68309
  const provider = createGoogle({ apiKey });
@@ -68293,18 +68330,11 @@ var antigravityVision = {
68293
68330
  };
68294
68331
 
68295
68332
  // src/domains/providers/drivers/antigravity.ts
68296
- var FALLBACK_MODELS = [
68297
- "gemini-3.5-flash-medium",
68298
- "gemini-3.5-flash-low",
68299
- "gemini-3.1-pro-low",
68300
- "claude-sonnet-4-6"
68301
- ];
68302
68333
  async function listAgyModels(binary) {
68303
68334
  const result = await runCommand4([binary, "models"], { timeoutMs: 15000 });
68304
68335
  if (result.exitCode !== 0)
68305
68336
  return [];
68306
- return (result.stdout || "").split(`
68307
- `).map((line) => line.trim()).filter((line) => line.length > 0 && !line.toLowerCase().startsWith("usage"));
68337
+ return parseAgyModelLines(result.stdout || result.stderr || "");
68308
68338
  }
68309
68339
  var antigravityDriver = {
68310
68340
  kind: "antigravity",
@@ -68376,19 +68406,19 @@ var antigravityDriver = {
68376
68406
  const models = await listAgyModels(probe.binaryPath);
68377
68407
  if (models.length > 0) {
68378
68408
  return {
68379
- models: models.map((id) => ({ id, name: id })),
68409
+ models,
68380
68410
  message: `${models.length} Antigravity models`
68381
68411
  };
68382
68412
  }
68383
68413
  }
68384
68414
  if (key) {
68385
68415
  return {
68386
- models: FALLBACK_MODELS.map((id) => ({ id, name: id })),
68387
- message: `${FALLBACK_MODELS.length} fallback models (CLI list unavailable)`
68416
+ models: ANTIGRAVITY_FALLBACK_MODELS,
68417
+ message: `${ANTIGRAVITY_FALLBACK_MODELS.length} fallback models (CLI list unavailable)`
68388
68418
  };
68389
68419
  }
68390
68420
  return {
68391
- models: FALLBACK_MODELS.map((id) => ({ id, name: id })),
68421
+ models: ANTIGRAVITY_FALLBACK_MODELS,
68392
68422
  message: probe.found ? "Using fallback model list" : probe.detail || "Antigravity CLI not found"
68393
68423
  };
68394
68424
  }
@@ -96721,8 +96751,9 @@ var groq = createGroq();
96721
96751
 
96722
96752
  // src/domains/providers/drivers/groq.ts
96723
96753
  var DEFAULT_BASE2 = "https://api.groq.com/openai/v1";
96724
- var GROQ_VISION_MODEL_RE = /llama-4-(scout|maverick)/i;
96725
- var GROQ_TEXT_ONLY_MODEL_RE = /^(qwen|deepseek|llama-3|gemma|mixtral|whisper|openai\/gpt-oss|compound-beta)/i;
96754
+ var GROQ_DEFAULT_VISION_MODEL = "qwen/qwen3.8-27b";
96755
+ var GROQ_VISION_MODEL_RE = /llama-4-(scout|maverick)|qwen\/qwen3\.[6-9]/i;
96756
+ var GROQ_TEXT_ONLY_MODEL_RE = /^(qwen|deepseek|llama-3|gemma|mixtral|whisper|openai\/gpt-oss|compound-beta|kimi)/i;
96726
96757
  function groqModelVision(modelId) {
96727
96758
  const id = modelId.trim();
96728
96759
  if (!id)
@@ -96736,7 +96767,7 @@ function groqModelVision(modelId) {
96736
96767
  var groqDriver = {
96737
96768
  kind: "groq",
96738
96769
  label: "Groq",
96739
- description: "Groq API via @ai-sdk/groq (fast Llama / vision-capable scout models).",
96770
+ description: "Groq API via @ai-sdk/groq (Qwen 3.8 vision; Llama 4 Scout is shut down).",
96740
96771
  defaultBinary: null,
96741
96772
  authModes: ["api_key"],
96742
96773
  envHints: ["GROQ_API_KEY"],
@@ -96744,13 +96775,16 @@ var groqDriver = {
96744
96775
  capabilities: { vision: true },
96745
96776
  vision: createSdkVisionPort({
96746
96777
  label: "Groq",
96747
- defaultModel: "meta-llama/llama-4-scout-17b-16e-instruct",
96778
+ defaultModel: GROQ_DEFAULT_VISION_MODEL,
96748
96779
  maxOutputTokens: 2048,
96749
96780
  createModel: (auth, modelId) => {
96750
96781
  const apiKey = resolveGroqKey(auth);
96751
96782
  if (!apiKey) {
96752
96783
  throw new AgentProviderError("Groq provider has no API key");
96753
96784
  }
96785
+ if (groqModelVision(modelId) === false) {
96786
+ throw new AgentProviderError(`This Groq model (${modelId}) cannot read screenshots (text-only). In Settings \u2192 Provider, set the default model to ${GROQ_DEFAULT_VISION_MODEL}.`);
96787
+ }
96754
96788
  const baseURL = auth.baseUrl?.trim().replace(/\/$/, "") || DEFAULT_BASE2;
96755
96789
  return createGroq({ apiKey, baseURL, fetch: withGroqRequestHooks({}) })(modelId);
96756
96790
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yoqa/runner",
3
- "version": "0.3.29",
3
+ "version": "0.3.30",
4
4
  "description": "Yoqa local runner — Appium + catalog HTTP API (Bun). Start with yoqa serve or the yoqa-runner bin.",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",