farion1231/cc-switch · warning · PiFormValidationError

pi.form.positiveNumberRequired

Error message

pi.form.positiveNumberRequired

What it means

positiveNumber in the Pi form rejects values that are empty, non-finite, or <= 0, throwing PiFormValidationError with the localized 'pi.form.positiveNumberRequired' message, the offending field's selector (e.g. '#pi-model-context-window-<key>' or '#pi-model-max-tokens-<key>'), and revealAdvanced=true so the UI can open the advanced panel. Applied to per-model contextWindow and maxTokens fields.

Source

Thrown at src/components/providers/forms/PiProviderForm.tsx:241

  let parsed: URL;
  try {
    parsed = new URL(value);
  } catch {
    throw new Error(errorMessage);
  }
  if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
    throw new Error(errorMessage);
  }
}

function positiveNumber(
  value: string,
  errorMessage: string,
  fieldSelector: string,
): number {
  const parsed = Number(value);
  if (value.trim() === "" || !Number.isFinite(parsed) || parsed <= 0) {
    throw new PiFormValidationError(errorMessage, fieldSelector, true);
  }
  return parsed;
}

function supportsImageInput(value: unknown): boolean {
  return Array.isArray(value) && value.includes("image");
}

function withImageInput(value: unknown, enabled: boolean): string[] {
  const additionalInputTypes = Array.isArray(value)
    ? value.filter(
        (item): item is string =>
          typeof item === "string" && item !== "text" && item !== "image",
      )
    : [];
  return [
    "text",
    ...(enabled ? ["image"] : []),

View on GitHub (pinned to a2e22f3302)

Solutions

  1. Enter a plain positive number without units or letters
  2. Validate on change and strip non-numeric characters from the field
  3. Default the field to a sane positive value so it is never empty

Example fix

// before
contextWindow = "10k"; // Number('10k') -> NaN -> error

// after
contextWindow = "10000";
Defensive patterns

Strategy: validation

Validate before calling

function isPositiveNumberValue(value: string): boolean {
  const parsed = Number(value);
  return value.trim() !== "" && Number.isFinite(parsed) && parsed > 0;
}

if (!isPositiveNumberValue(model.contextWindow)) {
  setFieldError(
    `#pi-model-context-window-${model.key}`,
    "Enter a positive number (no units)",
  );
}

Type guard

function isPositiveNumberString(v: string): v is `${number}` {
  const n = Number(v);
  return v.trim() !== "" && Number.isFinite(n) && n > 0;
}

Try / catch

try {
  buildPiProviderConfig(form);
} catch (e) {
  if (e instanceof PiFormValidationError && e.message.includes("positiveNumberRequired")) {
    focusField(e.fieldSelector); // e.g. '#pi-model-context-window-<key>'
    revealAdvancedPanel(e.revealAdvanced);
  } else {
    throw e;
  }
}

Prevention

When it happens

Trigger: contextWindow or maxTokens field set to '0', '-1', 'abc', '' , or '1e999' (Number() -> Infinity) - Number(value) yields empty/NaN/Infinity/negative.

Common situations: Clearing a numeric field and submitting; pasting values with units ('10s', '8k'); minus-sign typos.

Related errors


AI-assisted analysis of farion1231/cc-switch@a2e22f3302 (2026-08-16). Data as JSON: /api/errors/eff133c4956b26d3. Report an issue: GitHub.