@nodaro/shared 1.16.0 → 1.18.0

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nodaro/shared",
3
- "version": "1.16.0",
3
+ "version": "1.18.0",
4
4
  "description": "Shared types, model catalog, wire contracts, and structural vocabularies for the Nodaro platform and SDK.",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -25,7 +25,7 @@ import { PIPELINE_PINNABLE_SCRIPT_LLMS } from "../pipeline-types.js"
25
25
  // ---------------------------------------------------------------------------
26
26
  describe("LLM_MODELS data integrity", () => {
27
27
  it("should have exactly 15 models", () => {
28
- expect(LLM_MODELS).toHaveLength(15)
28
+ expect(LLM_MODELS).toHaveLength(16)
29
29
  })
30
30
 
31
31
  it("each model has all required fields", () => {
@@ -60,14 +60,14 @@ describe("LLM_MODELS data integrity", () => {
60
60
  expect(new Set(ids).size).toBe(ids.length)
61
61
  })
62
62
 
63
- it("has 4 economy, 4 standard, 7 premium models", () => {
63
+ it("has 4 economy, 4 standard, 8 premium models", () => {
64
64
  const tierCounts: Record<LlmTier, number> = { economy: 0, standard: 0, premium: 0 }
65
65
  for (const model of LLM_MODELS) {
66
66
  tierCounts[model.tier]++
67
67
  }
68
68
  expect(tierCounts.economy).toBe(4)
69
69
  expect(tierCounts.standard).toBe(4)
70
- expect(tierCounts.premium).toBe(7)
70
+ expect(tierCounts.premium).toBe(8)
71
71
  })
72
72
 
73
73
  it("all three kieFormats are represented", () => {
@@ -121,6 +121,7 @@ describe("LLM_MODEL_IDS", () => {
121
121
  "gpt-5.6-sol",
122
122
  "claude-sonnet-5",
123
123
  "claude-opus-4.8",
124
+ "claude-opus-5",
124
125
  "claude-fable-5",
125
126
  ]
126
127
  expect(LLM_MODEL_IDS).toEqual(expected)
@@ -399,17 +400,22 @@ describe("LLM_FEATURE_DEFAULTS", () => {
399
400
  expect(getLlmTier(LLM_FEATURE_DEFAULTS["ai-writer"])).toBe("standard")
400
401
  })
401
402
 
402
- it('"describe-to-picker" defaults to "claude-opus-4.7" (premium vision)', () => {
403
- expect(LLM_FEATURE_DEFAULTS["describe-to-picker"]).toBe("claude-opus-4.7")
403
+ it('"describe-to-picker" defaults to "claude-opus-5" (premium vision)', () => {
404
+ expect(LLM_FEATURE_DEFAULTS["describe-to-picker"]).toBe("claude-opus-5")
404
405
  expect(getLlmTier(LLM_FEATURE_DEFAULTS["describe-to-picker"])).toBe("premium")
405
406
  // The default MUST be an accepted analyzer model (vision + structured output).
406
- expect(STRUCTURED_VISION_MODELS.map((m) => m.id)).toContain("claude-opus-4.7")
407
+ expect(STRUCTURED_VISION_MODELS.map((m) => m.id)).toContain("claude-opus-5")
407
408
  })
408
409
 
409
410
  it('"generate-script" defaults to "gemini-3.6-flash" (economy)', () => {
410
411
  expect(LLM_FEATURE_DEFAULTS["generate-script"]).toBe("gemini-3.6-flash")
411
412
  })
412
413
 
414
+ it('"qa-check" defaults to "gemini-3.6-flash" (economy)', () => {
415
+ expect(LLM_FEATURE_DEFAULTS["qa-check"]).toBe("gemini-3.6-flash")
416
+ expect(getLlmTier(LLM_FEATURE_DEFAULTS["qa-check"])).toBe("economy")
417
+ })
418
+
413
419
  it('"translate" defaults to "gemini-3.6-flash" (economy)', () => {
414
420
  expect(LLM_FEATURE_DEFAULTS["translate"]).toBe("gemini-3.6-flash")
415
421
  })
@@ -460,6 +466,7 @@ describe("STRUCTURED_VISION_MODELS", () => {
460
466
  "gemini-3.1-pro",
461
467
  "claude-sonnet-5",
462
468
  "claude-opus-4.8",
469
+ "claude-opus-5",
463
470
  "claude-fable-5",
464
471
  // responses-format GPTs — KIE text.format json_schema live-verified
465
472
  // 2026-07-14 (text AND vision inputs).
@@ -27,6 +27,8 @@ export interface FreecutImportFile {
27
27
 
28
28
  export interface NodaroLoadVideoPayload {
29
29
  readonly videoUrl: string
30
+ /** Display/file name for the primary video ("Shot 1.mp4") — optional; absent = URL-derived name (fork default). */
31
+ readonly videoName?: string
30
32
  readonly videoBuffer?: ArrayBuffer
31
33
  readonly projectJson?: unknown
32
34
  readonly additionalFiles?: ReadonlyArray<FreecutImportFile>
package/src/llm-models.ts CHANGED
@@ -245,7 +245,7 @@ export const LLM_MODELS: readonly LlmModelDef[] = [
245
245
  {
246
246
  id: "claude-opus-4.8",
247
247
  displayName: "Claude Opus 4.8",
248
- desc: "Most capable Claude, long-horizon work",
248
+ desc: "Previous-gen Opus, long-horizon work",
249
249
  tier: "premium",
250
250
  kieFormat: "messages",
251
251
  kieSlugOrModel: "claude-opus-4-8",
@@ -258,6 +258,25 @@ export const LLM_MODELS: readonly LlmModelDef[] = [
258
258
  supportsTemperature: false,
259
259
  preferKie: true,
260
260
  },
261
+ {
262
+ id: "claude-opus-5",
263
+ displayName: "Claude Opus 5",
264
+ desc: "Latest Opus, deepest agentic reasoning",
265
+ tier: "premium",
266
+ kieFormat: "messages",
267
+ // KIE serves Opus 5 on the Claude-native messages dialect under the plain
268
+ // id (docs.kie.ai/market/claude/claude-opus-5.md) — same path shape as
269
+ // claude-opus-4-8 / claude-fable-5.
270
+ kieSlugOrModel: "claude-opus-5",
271
+ vendor: "anthropic",
272
+ structuredOutputMode: "anthropic-tool",
273
+ supportsImages: true,
274
+ maxOutputTokens: 16384,
275
+ directFallbackModel: "claude-opus-5",
276
+ reasoningEfforts: ["low", "medium", "high", "xhigh", "max"],
277
+ supportsTemperature: false,
278
+ preferKie: true,
279
+ },
261
280
  {
262
281
  id: "claude-fable-5",
263
282
  displayName: "Claude Fable 5",
@@ -323,8 +342,8 @@ export const LLM_FEATURE_DEFAULTS: Record<LlmFeature, string> = {
323
342
  "lottie-overlay": "claude-sonnet-4.6",
324
343
  "3d-title": "claude-sonnet-4.6",
325
344
  "image-to-text": "claude-sonnet-4.6",
326
- "describe-to-picker": "claude-opus-4.7",
327
- "qa-check": "claude-sonnet-4.6",
345
+ "describe-to-picker": "claude-opus-5",
346
+ "qa-check": "gemini-3.6-flash",
328
347
  "generate-script": "gemini-3.6-flash",
329
348
  "translate": "gemini-3.6-flash",
330
349
  "image-critic": "claude-sonnet-4.6",
@@ -354,6 +373,7 @@ export const LLM_MODALITY_CAPS: Record<string, { image: boolean; video: boolean;
354
373
  "gpt-5.6-sol": { image: true, video: false, audio: false },
355
374
  "claude-sonnet-5": { image: true, video: false, audio: false },
356
375
  "claude-opus-4.8": { image: true, video: false, audio: false },
376
+ "claude-opus-5": { image: true, video: false, audio: false },
357
377
  "claude-fable-5": { image: true, video: false, audio: false },
358
378
  }
359
379
 
@@ -84,6 +84,7 @@ export const PIPELINE_PINNABLE_SCRIPT_LLMS = [
84
84
  "claude-haiku-4-5",
85
85
  "claude-sonnet-4-6",
86
86
  "claude-opus-4-7",
87
+ "claude-opus-5",
87
88
  ] as const
88
89
  export type PipelinePinnableScriptLlm = (typeof PIPELINE_PINNABLE_SCRIPT_LLMS)[number]
89
90