@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.
- package/dist/index.js +54 -20
- 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.
|
|
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
|
|
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
|
|
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 || "")
|
|
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
|
|
68409
|
+
models,
|
|
68380
68410
|
message: `${models.length} Antigravity models`
|
|
68381
68411
|
};
|
|
68382
68412
|
}
|
|
68383
68413
|
}
|
|
68384
68414
|
if (key) {
|
|
68385
68415
|
return {
|
|
68386
|
-
models:
|
|
68387
|
-
message: `${
|
|
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:
|
|
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
|
|
96725
|
-
var
|
|
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 (
|
|
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:
|
|
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