nexu-io/open-design · error · Error

Vela model ${wireModel} does not publish quality ${tier}; su

Error message

Vela model ${wireModel} does not publish quality ${tier}; supported: ${published.qualityValues.join(', ')}

What it means

Thrown by qualityArgs() when the model does publish a quality capability (qualityValues is non-null) but the requested tier does not case-insensitively match any published value. The error lists the supported tiers so the caller can correct the request. matchPublishedValue folds case, so '2k' matches '2K'; a mismatch means a genuinely unsupported tier name.

Source

Thrown at apps/daemon/src/media/vela.ts:247

 * request for a tier the model publishes sends it verbatim; a request the
 * model cannot honour fails here, before it costs anything, with the tiers it
 * does publish.
 */
function qualityArgs(
  requested: string | undefined,
  published: VelaPublishedImageCapabilities,
  wireModel: string,
): string[] {
  const tier = requested?.trim();
  if (!tier) return [];
  if (!published.qualityValues) {
    throw new Error(
      `Vela model ${wireModel} does not publish a quality capability, so quality ${tier} cannot be requested`,
    );
  }
  const publishedTier = matchPublishedValue(tier, published.qualityValues);
  if (!publishedTier) {
    throw new Error(
      `Vela model ${wireModel} does not publish quality ${tier}; supported: ${published.qualityValues.join(', ')}`,
    );
  }
  return ['--quality', publishedTier];
}

// Vela owns which shapes and tiers a model can actually deliver, so read the
// published capabilities per request instead of caching a copy here: a
// catalogue that gained or lost one must take effect immediately, and one
// extra CLI call is nothing beside the generation it precedes.
async function fetchPublishedImageCapabilities(
  input: VelaImageRenderInput,
  edits: boolean,
  wireModel: string,
  runCommand: VelaCommandRunner,
): Promise<VelaPublishedImageCapabilities | null> {
  const stdout = await runCommand(['media', 'models', '--json'], {
    ...velaWorkspaceCommandOptions(input.workspaceId),

View on GitHub (pinned to 5be4028344)

Solutions

  1. Read the supported list in the error message and use one of those exact values
  2. Check `vela media models --json` for the model's current quality.values
  3. If the tier name was correct before, the catalogue may have changed — update the caller

Example fix

// before
await renderVelaImage({ ...input, quality: 'ultra' }); // only standard/high published
// after
await renderVelaImage({ ...input, quality: 'high' });
Defensive patterns

Strategy: validation

Validate before calling

function qualityIsPublished(tier: string, published: string[] | null): boolean {
  if (!published) return false;
  const folded = tier.toLowerCase();
  return published.some(v => v.toLowerCase() === folded);
}

if (requestedQuality && !qualityIsPublished(requestedQuality, published?.qualityValues ?? null)) {
  // correct the tier or drop it
}

Try / catch

try {
  const args = qualityArgs(requestedQuality, published, wireModel);
} catch (err) {
  if (err instanceof Error && /does not publish quality/.test(err.message)) {
    // parse the supported list from the message and pick one, or drop quality
  } else throw err;
}

Prevention

When it happens

Trigger: input.quality is a string that is not in the model's published qualityValues list (e.g. requesting 'ultra' when only 'standard' and 'high' are published).

Common situations: Typo in the quality tier; tier renamed in a newer catalogue; caller copied a tier name from a different model; case-only differences are handled but spelling differences are not.

Related errors


AI-assisted analysis of nexu-io/open-design@5be4028344 (2026-08-12). Data as JSON: /api/errors/6dde4ad7a4b0bb89. Report an issue: GitHub.