nodal-agents 0.6.0 → 0.6.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.
- package/README.md +2 -1
- package/cli.js +279 -0
- package/package.json +1 -1
- package/runner.js +209 -9
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/app-path-routes-manifest.json +4 -4
- package/web/.next/build-manifest.json +2 -2
- package/web/.next/server/app/(dashboard)/agents/[id]/edit/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/agents/[id]/telegram/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/agents/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/approvals/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/automations/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/billing/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/connectors/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/credentials/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/jobs/[id]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/jobs/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/learned-skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/llm-providers/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/logs/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/mcp/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/memories/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/settings/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/settings/root-context/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/skills/[id]/edit/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/skills/new/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error.html +1 -1
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_not-found.html +1 -1
- package/web/.next/server/app/_not-found.rsc +1 -1
- package/web/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/web/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/onboarding.html +1 -1
- package/web/.next/server/app/onboarding.rsc +1 -1
- package/web/.next/server/app/onboarding.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/onboarding.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/onboarding.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/onboarding.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/onboarding.segments/onboarding/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/onboarding.segments/onboarding.segment.rsc +1 -1
- package/web/.next/server/app-paths-manifest.json +4 -4
- package/web/.next/server/chunks/1761.js +1 -1
- package/web/.next/server/chunks/4370.js +5 -5
- package/web/.next/server/chunks/4574.js +1 -1
- package/web/.next/server/middleware-build-manifest.js +1 -1
- package/web/.next/server/pages/404.html +1 -1
- package/web/.next/server/pages/500.html +1 -1
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +1 -1
- package/web/.next/static/chunks/{4905-65b5713d2e04086d.js → 4905-272003c6fbcb2e79.js} +1 -1
- /package/web/.next/static/{kbJ7RnqJJkxulS2bJpJy2 → KhwbJu08qtDMXMHHv9JeS}/_buildManifest.js +0 -0
- /package/web/.next/static/{kbJ7RnqJJkxulS2bJpJy2 → KhwbJu08qtDMXMHHv9JeS}/_ssgManifest.js +0 -0
package/README.md
CHANGED
|
@@ -10,6 +10,7 @@ A self-hosted platform for building and orchestrating a **team of AI agents** on
|
|
|
10
10
|
[](https://nodejs.org)
|
|
11
11
|
[](https://www.typescriptlang.org)
|
|
12
12
|
[](https://kwintspiracy.github.io/nodal-agents/)
|
|
13
|
+
[](CHANGELOG.md)
|
|
13
14
|
|
|
14
15
|
| Home dashboard — light theme | Agent detail — dark theme |
|
|
15
16
|
| :---: | :---: |
|
|
@@ -164,7 +165,7 @@ pnpm deps:check
|
|
|
164
165
|
|
|
165
166
|
## Status
|
|
166
167
|
|
|
167
|
-
Used daily by the maintainer; stable enough for personal production. **Pre-1.0** — breaking changes are still possible between minors.
|
|
168
|
+
Used daily by the maintainer; stable enough for personal production. **Pre-1.0** — breaking changes are still possible between minors. See the [changelog](CHANGELOG.md) for what shipped in each release.
|
|
168
169
|
|
|
169
170
|
**On the roadmap** (genuine, not vaporware):
|
|
170
171
|
|
package/cli.js
CHANGED
|
@@ -12171,9 +12171,288 @@ var init_community_skill_catalog = __esm({
|
|
|
12171
12171
|
});
|
|
12172
12172
|
|
|
12173
12173
|
// ../../packages/shared/src/model-catalog.ts
|
|
12174
|
+
var MODEL_CATALOG, VISION_MODEL_IDS;
|
|
12174
12175
|
var init_model_catalog = __esm({
|
|
12175
12176
|
"../../packages/shared/src/model-catalog.ts"() {
|
|
12176
12177
|
"use strict";
|
|
12178
|
+
MODEL_CATALOG = {
|
|
12179
|
+
// ─── Native DeepSeek (api.deepseek.com) ─────────────────────────────────────
|
|
12180
|
+
// Model IDs verified against DeepSeek API docs (June 2026).
|
|
12181
|
+
// Context windows from DeepSeek's documentation: both deepseek-chat and
|
|
12182
|
+
// deepseek-reasoner support 64K output / 128K context.
|
|
12183
|
+
deepseek: [
|
|
12184
|
+
{
|
|
12185
|
+
modelId: "deepseek-chat",
|
|
12186
|
+
label: "DeepSeek Chat (V3)",
|
|
12187
|
+
// deepseek-chat is the production alias for DeepSeek V3. Standard tool
|
|
12188
|
+
// calling with forced tool_choice supported.
|
|
12189
|
+
capabilities: { tools: true, forcedToolChoice: true },
|
|
12190
|
+
contextWindow: 128e3
|
|
12191
|
+
},
|
|
12192
|
+
{
|
|
12193
|
+
modelId: "deepseek-reasoner",
|
|
12194
|
+
label: "DeepSeek Reasoner (R1)",
|
|
12195
|
+
// DeepSeek R1 — a reasoning/thinking model. Requires `thinking: {type: 'enabled'}`
|
|
12196
|
+
// in the request (the deepseek.ts provider sets this automatically when
|
|
12197
|
+
// reasoning:true). Also requires reasoning_content to be echoed back on
|
|
12198
|
+
// assistant messages with tool_calls (the deepseek fetch shim handles this).
|
|
12199
|
+
capabilities: { tools: true, forcedToolChoice: true, reasoning: true },
|
|
12200
|
+
contextWindow: 128e3
|
|
12201
|
+
}
|
|
12202
|
+
],
|
|
12203
|
+
// ─── Native MiniMax (api.minimax.io/anthropic) ───────────────────────────────
|
|
12204
|
+
// Current MiniMax text models, from the official docs
|
|
12205
|
+
// (platform.minimax.io/docs/api-reference/text-chat — June 2026). The M2/M3
|
|
12206
|
+
// line supersedes M1, which is no longer listed, so it's dropped here. The
|
|
12207
|
+
// full lineup also includes M2.1/M2.5 and `-highspeed` variants — use the
|
|
12208
|
+
// model picker's "Custom…" field for those; this is the curated short list.
|
|
12209
|
+
// forcedToolChoice:false across the M-series — the MiniMax endpoint rejects a
|
|
12210
|
+
// forced tool_choice with a 400/404 (observed on M3 via OpenRouter); the
|
|
12211
|
+
// runtime completion floor covers it. Context windows are docs-sourced where
|
|
12212
|
+
// available, else a conservative 200K until a live probe confirms.
|
|
12213
|
+
minimax: [
|
|
12214
|
+
{
|
|
12215
|
+
modelId: "MiniMax-M3",
|
|
12216
|
+
label: "MiniMax M3",
|
|
12217
|
+
// Newest flagship — a reasoning model (adaptive `thinking`), 1M context.
|
|
12218
|
+
capabilities: { tools: true, forcedToolChoice: false, reasoning: true },
|
|
12219
|
+
contextWindow: 1048576
|
|
12220
|
+
},
|
|
12221
|
+
{
|
|
12222
|
+
modelId: "MiniMax-M2.7",
|
|
12223
|
+
label: "MiniMax M2.7",
|
|
12224
|
+
// Latest M2-series — non-reasoning per MiniMax docs.
|
|
12225
|
+
capabilities: { tools: true, forcedToolChoice: false },
|
|
12226
|
+
contextWindow: 2e5
|
|
12227
|
+
},
|
|
12228
|
+
{
|
|
12229
|
+
modelId: "MiniMax-M2",
|
|
12230
|
+
label: "MiniMax M2",
|
|
12231
|
+
// Stable previous-generation baseline — non-reasoning.
|
|
12232
|
+
capabilities: { tools: true, forcedToolChoice: false },
|
|
12233
|
+
contextWindow: 2e5
|
|
12234
|
+
}
|
|
12235
|
+
],
|
|
12236
|
+
anthropic: [
|
|
12237
|
+
{
|
|
12238
|
+
modelId: "claude-opus-4-8",
|
|
12239
|
+
label: "Claude Opus 4.8",
|
|
12240
|
+
capabilities: { tools: true, forcedToolChoice: true },
|
|
12241
|
+
contextWindow: 2e5
|
|
12242
|
+
},
|
|
12243
|
+
{
|
|
12244
|
+
modelId: "claude-sonnet-4-6",
|
|
12245
|
+
label: "Claude Sonnet 4.6",
|
|
12246
|
+
capabilities: { tools: true, forcedToolChoice: true },
|
|
12247
|
+
contextWindow: 2e5
|
|
12248
|
+
},
|
|
12249
|
+
{
|
|
12250
|
+
modelId: "claude-haiku-4-5-20251001",
|
|
12251
|
+
label: "Claude Haiku 4.5",
|
|
12252
|
+
capabilities: { tools: true, forcedToolChoice: true },
|
|
12253
|
+
contextWindow: 2e5
|
|
12254
|
+
}
|
|
12255
|
+
],
|
|
12256
|
+
openai: [
|
|
12257
|
+
{
|
|
12258
|
+
modelId: "gpt-5",
|
|
12259
|
+
label: "GPT-5",
|
|
12260
|
+
capabilities: { tools: true, forcedToolChoice: true },
|
|
12261
|
+
contextWindow: 4e5
|
|
12262
|
+
},
|
|
12263
|
+
{
|
|
12264
|
+
modelId: "gpt-5-mini",
|
|
12265
|
+
label: "GPT-5 mini",
|
|
12266
|
+
capabilities: { tools: true, forcedToolChoice: true },
|
|
12267
|
+
contextWindow: 4e5
|
|
12268
|
+
}
|
|
12269
|
+
],
|
|
12270
|
+
google: [
|
|
12271
|
+
{
|
|
12272
|
+
modelId: "gemini-2.0-flash",
|
|
12273
|
+
label: "Gemini 2.0 Flash",
|
|
12274
|
+
capabilities: { tools: true, forcedToolChoice: true },
|
|
12275
|
+
contextWindow: 1048576
|
|
12276
|
+
},
|
|
12277
|
+
{
|
|
12278
|
+
modelId: "gemini-2.5-pro",
|
|
12279
|
+
label: "Gemini 2.5 Pro",
|
|
12280
|
+
capabilities: { tools: true, forcedToolChoice: true },
|
|
12281
|
+
contextWindow: 1048576
|
|
12282
|
+
}
|
|
12283
|
+
],
|
|
12284
|
+
groq: [
|
|
12285
|
+
{
|
|
12286
|
+
modelId: "llama-3.3-70b-versatile",
|
|
12287
|
+
label: "Llama 3.3 70B",
|
|
12288
|
+
capabilities: { tools: true, forcedToolChoice: true },
|
|
12289
|
+
contextWindow: 131072
|
|
12290
|
+
}
|
|
12291
|
+
],
|
|
12292
|
+
mistral: [
|
|
12293
|
+
{
|
|
12294
|
+
modelId: "mistral-large-latest",
|
|
12295
|
+
label: "Mistral Large",
|
|
12296
|
+
capabilities: { tools: true, forcedToolChoice: true },
|
|
12297
|
+
contextWindow: 131072
|
|
12298
|
+
}
|
|
12299
|
+
],
|
|
12300
|
+
// OpenRouter models are namespaced by sub-vendor (anthropic/, deepseek/, …).
|
|
12301
|
+
// The UI groups them by that vendor (see modelGroupLabel). Tested + working
|
|
12302
|
+
// routes. `forcedToolChoice` is per-model: most accept tool_choice:'required';
|
|
12303
|
+
// MiniMax M3 does not (some of its OpenRouter endpoints reject the forced
|
|
12304
|
+
// value), so it runs on 'auto' + the runtime floor.
|
|
12305
|
+
openrouter: [
|
|
12306
|
+
// Anthropic
|
|
12307
|
+
{
|
|
12308
|
+
modelId: "anthropic/claude-haiku-4.5",
|
|
12309
|
+
label: "Claude Haiku 4.5",
|
|
12310
|
+
capabilities: { tools: true, forcedToolChoice: true },
|
|
12311
|
+
contextWindow: 2e5
|
|
12312
|
+
},
|
|
12313
|
+
{
|
|
12314
|
+
modelId: "anthropic/claude-opus-4.7",
|
|
12315
|
+
label: "Claude Opus 4.7",
|
|
12316
|
+
capabilities: { tools: true, forcedToolChoice: true },
|
|
12317
|
+
contextWindow: 1e6
|
|
12318
|
+
},
|
|
12319
|
+
{
|
|
12320
|
+
modelId: "anthropic/claude-opus-4.7-fast",
|
|
12321
|
+
label: "Claude Opus 4.7 (fast)",
|
|
12322
|
+
capabilities: { tools: true, forcedToolChoice: true },
|
|
12323
|
+
contextWindow: 1e6
|
|
12324
|
+
},
|
|
12325
|
+
{
|
|
12326
|
+
modelId: "anthropic/claude-opus-4.8",
|
|
12327
|
+
label: "Claude Opus 4.8",
|
|
12328
|
+
capabilities: { tools: true, forcedToolChoice: true },
|
|
12329
|
+
contextWindow: 1e6
|
|
12330
|
+
},
|
|
12331
|
+
{
|
|
12332
|
+
modelId: "anthropic/claude-opus-4.8-fast",
|
|
12333
|
+
label: "Claude Opus 4.8 (fast)",
|
|
12334
|
+
capabilities: { tools: true, forcedToolChoice: true },
|
|
12335
|
+
contextWindow: 1e6
|
|
12336
|
+
},
|
|
12337
|
+
{
|
|
12338
|
+
modelId: "anthropic/claude-sonnet-4.6",
|
|
12339
|
+
label: "Claude Sonnet 4.6",
|
|
12340
|
+
capabilities: { tools: true, forcedToolChoice: true },
|
|
12341
|
+
contextWindow: 1e6
|
|
12342
|
+
},
|
|
12343
|
+
// DeepSeek
|
|
12344
|
+
{
|
|
12345
|
+
modelId: "deepseek/deepseek-v3.2",
|
|
12346
|
+
label: "DeepSeek V3.2",
|
|
12347
|
+
capabilities: { tools: true, forcedToolChoice: true },
|
|
12348
|
+
contextWindow: 131072
|
|
12349
|
+
},
|
|
12350
|
+
{
|
|
12351
|
+
modelId: "deepseek/deepseek-v4-flash",
|
|
12352
|
+
label: "DeepSeek V4 Flash",
|
|
12353
|
+
// DeepSeek V4 is a reasoning model (reasoning_content / reasoning effort).
|
|
12354
|
+
// Flagging reasoning makes the OpenRouter provider enable reasoning + round-trip
|
|
12355
|
+
// its reasoning_details across tool calls — without it the model misbehaves
|
|
12356
|
+
// (gathers then emits no answer). Matches how Hermes drives DeepSeek.
|
|
12357
|
+
capabilities: { tools: true, forcedToolChoice: true, reasoning: true },
|
|
12358
|
+
contextWindow: 1048576,
|
|
12359
|
+
providerOrder: ["deepseek"]
|
|
12360
|
+
},
|
|
12361
|
+
{
|
|
12362
|
+
modelId: "deepseek/deepseek-v4-pro",
|
|
12363
|
+
label: "DeepSeek V4 Pro",
|
|
12364
|
+
capabilities: { tools: true, forcedToolChoice: true, reasoning: true },
|
|
12365
|
+
contextWindow: 1048576,
|
|
12366
|
+
providerOrder: ["deepseek"]
|
|
12367
|
+
},
|
|
12368
|
+
// Google
|
|
12369
|
+
{
|
|
12370
|
+
modelId: "google/gemini-3.1-flash-lite-preview",
|
|
12371
|
+
label: "Gemini 3.1 Flash Lite (preview)",
|
|
12372
|
+
capabilities: { tools: true, forcedToolChoice: true },
|
|
12373
|
+
contextWindow: 1048576
|
|
12374
|
+
},
|
|
12375
|
+
{
|
|
12376
|
+
modelId: "google/gemini-3.1-pro-preview",
|
|
12377
|
+
label: "Gemini 3.1 Pro (preview)",
|
|
12378
|
+
capabilities: { tools: true, forcedToolChoice: true },
|
|
12379
|
+
contextWindow: 1048576
|
|
12380
|
+
},
|
|
12381
|
+
{
|
|
12382
|
+
modelId: "google/gemini-3.5-flash",
|
|
12383
|
+
label: "Gemini 3.5 Flash",
|
|
12384
|
+
capabilities: { tools: true, forcedToolChoice: true },
|
|
12385
|
+
contextWindow: 1048576
|
|
12386
|
+
},
|
|
12387
|
+
{
|
|
12388
|
+
modelId: "google/gemma-4-31b-it",
|
|
12389
|
+
label: "Gemma 4 31B-IT",
|
|
12390
|
+
capabilities: { tools: true, forcedToolChoice: true },
|
|
12391
|
+
contextWindow: 262144
|
|
12392
|
+
},
|
|
12393
|
+
// MiniMax
|
|
12394
|
+
{
|
|
12395
|
+
modelId: "minimax/minimax-m3",
|
|
12396
|
+
label: "MiniMax M3",
|
|
12397
|
+
// A reasoning model. Some of its OpenRouter endpoints reject a FORCED
|
|
12398
|
+
// tool_choice ('required') → we send 'auto' (forcedToolChoice:false).
|
|
12399
|
+
// reasoning:true makes the provider return reasoning_details so the runner
|
|
12400
|
+
// can round-trip them across tool-call turns.
|
|
12401
|
+
capabilities: { tools: true, forcedToolChoice: false, reasoning: true },
|
|
12402
|
+
contextWindow: 1048576
|
|
12403
|
+
},
|
|
12404
|
+
// Z.ai (GLM)
|
|
12405
|
+
{
|
|
12406
|
+
modelId: "z-ai/glm-5.2",
|
|
12407
|
+
label: "GLM 5.2",
|
|
12408
|
+
// A reasoning model (reasoning effort high/xhigh), strong at coding + tool
|
|
12409
|
+
// use. reasoning:true → provider returns reasoning_details for round-trip.
|
|
12410
|
+
// forcedToolChoice:false: send 'auto' (don't risk a rejected 'required' on
|
|
12411
|
+
// a reasoning model; workers are 'auto' after turn 1 anyway).
|
|
12412
|
+
capabilities: { tools: true, forcedToolChoice: false, reasoning: true },
|
|
12413
|
+
contextWindow: 1048576
|
|
12414
|
+
},
|
|
12415
|
+
// Moonshot (Kimi)
|
|
12416
|
+
{
|
|
12417
|
+
modelId: "moonshotai/kimi-k2.7-code",
|
|
12418
|
+
label: "Kimi K2.7 Code",
|
|
12419
|
+
// Always operates in thinking mode and preserves reasoning_content across
|
|
12420
|
+
// turns (like DeepSeek) → reasoning:true is required so the provider
|
|
12421
|
+
// round-trips reasoning_details. forcedToolChoice:false for the same reason
|
|
12422
|
+
// as the other reasoning models.
|
|
12423
|
+
capabilities: { tools: true, forcedToolChoice: false, reasoning: true },
|
|
12424
|
+
contextWindow: 262144
|
|
12425
|
+
}
|
|
12426
|
+
]
|
|
12427
|
+
};
|
|
12428
|
+
VISION_MODEL_IDS = /* @__PURE__ */ new Set([
|
|
12429
|
+
// OpenRouter (verified via /api/v1/models)
|
|
12430
|
+
"anthropic/claude-haiku-4.5",
|
|
12431
|
+
"anthropic/claude-opus-4.7",
|
|
12432
|
+
"anthropic/claude-opus-4.7-fast",
|
|
12433
|
+
"anthropic/claude-opus-4.8",
|
|
12434
|
+
"anthropic/claude-opus-4.8-fast",
|
|
12435
|
+
"anthropic/claude-sonnet-4.6",
|
|
12436
|
+
"google/gemini-3.1-flash-lite-preview",
|
|
12437
|
+
"google/gemini-3.1-pro-preview",
|
|
12438
|
+
"google/gemini-3.5-flash",
|
|
12439
|
+
"google/gemma-4-31b-it",
|
|
12440
|
+
"minimax/minimax-m3",
|
|
12441
|
+
"moonshotai/kimi-k2.7-code",
|
|
12442
|
+
// Native-provider forms
|
|
12443
|
+
"claude-opus-4-8",
|
|
12444
|
+
"claude-sonnet-4-6",
|
|
12445
|
+
"claude-haiku-4-5-20251001",
|
|
12446
|
+
"gpt-5",
|
|
12447
|
+
"gpt-5-mini",
|
|
12448
|
+
"gemini-2.0-flash",
|
|
12449
|
+
"gemini-2.5-pro",
|
|
12450
|
+
"mistral-large-latest",
|
|
12451
|
+
"MiniMax-M3"
|
|
12452
|
+
]);
|
|
12453
|
+
for (const entries of Object.values(MODEL_CATALOG)) {
|
|
12454
|
+
for (const e of entries) e.capabilities.vision = VISION_MODEL_IDS.has(e.modelId);
|
|
12455
|
+
}
|
|
12177
12456
|
}
|
|
12178
12457
|
});
|
|
12179
12458
|
|