diegosouzapw/OmniRoute · error · Error

errorPayload.error || t("saveFailed")

Error message

errorPayload.error || t("saveFailed")

What it means

Per-provider pricing save failure: saveProvider() PATCHes /api/pricing with the edited provider's pricing entry ([writeKey]: pricingData[writeKey]); on non-ok it reads the JSON body and throws errorPayload.error or the localized 'saveFailed'. It means that one provider's model pricing edits were rejected server-side (schema/validation or server error) and were not persisted.

Solutions

  1. Inspect the PATCH response error for the rejected pricing fields (per-model input/output rates)
  2. Verify pricingKey vs providerAlias mapping for split providers
  3. Correct the values and save the provider again
Defensive patterns

Strategy: try-catch

When it happens

Trigger: Thrown at src/app/(dashboard)/dashboard/settings/components/PricingTab.tsx:335 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of diegosouzapw/OmniRoute@a179ffed5b (2026-08-25). Data as JSON: /api/errors/6c156829c20b0c9c. Report an issue: GitHub.

Appendix: source

Thrown at src/app/(dashboard)/dashboard/settings/components/PricingTab.tsx:335

      setEditedProviders((previous) => new Set(previous).add(provider));
    },
    []
  );

  const saveProvider = useCallback(
    async (providerAlias: string, pricingKey?: string) => {
      setSaving(true);
      try {
        const writeKey = pricingKey || providerAlias;
        const response = await fetch("/api/pricing", {
          method: "PATCH",
          headers: { "Content-Type": "application/json" },
          body: JSON.stringify({ [writeKey]: pricingData[writeKey] || {} }),
        });

        if (!response.ok) {
          const errorPayload = (await response.json().catch(() => ({}))) as { error?: string };
          throw new Error(errorPayload.error || t("saveFailed"));
        }

        setEditedProviders((previous) => {
          const next = new Set(previous);
          next.delete(writeKey);
          return next;
        });
        await loadData();
        showStatus("success", t("pricingSavedProvider", { provider: providerAlias.toUpperCase() }));
      } catch (error: any) {
        showStatus(
          "error",
          t("pricingSaveFailedWithReason", {
            reason: error?.message || t("unknownError"),
          })
        );
      } finally {
        setSaving(false);

View on GitHub (pinned to a179ffed5b)