QuantumNous/new-api · error · Error

Failed to update channel

Error message

Failed to update channel

What it means

Fallback thrown by the channels form mutation when updateChannel(id, payload) responds with success falsy and no message. The admin API rejected the channel update — validation failure, duplicate channel name, invalid key, or insufficient admin privilege. The server's message, when present, is shown instead.

Source

Thrown at web/src/features/channels/hooks/use-channel-mutate-form.ts:123

          }
        }
        const payloadWithKeyMode =
          canEditSensitive &&
          props.isMultiKeyChannel &&
          data.key?.trim() &&
          data.key_mode
            ? {
                ...payload,
                key_mode: data.key_mode,
              }
            : payload

        const response = await updateChannel(
          props.currentRow.id,
          payloadWithKeyMode
        )
        if (!response.success) {
          throw new Error(response.message || t(ERROR_MESSAGES.UPDATE_FAILED))
        }
        return SUCCESS_MESSAGES.UPDATED
      }

      const payload = transformFormDataToCreatePayload(data)
      const response = await createChannel(payload)
      if (!response.success) {
        throw new Error(response.message || t(ERROR_MESSAGES.CREATE_FAILED))
      }
      return SUCCESS_MESSAGES.CREATED
    },
    onSuccess: (messageKey) => {
      toast.success(t(messageKey))
      props.onSuccess()
    },
    onError: (error: unknown) => {
      toast.error(getErrorMessage(error) || t(ERROR_MESSAGES.CREATE_FAILED))
    },

View on GitHub (pinned to e2c7aa7b10)

Solutions

  1. Read the PUT /api/channel/:id response body in DevTools — the message names the rejected field.
  2. Fix the highlighted form fields (key format, base_url, models) and resubmit.
  3. Refresh the channel list to confirm the row still exists; re-open the edit dialog if the id is stale.
  4. Verify you are logged in as an admin with channel-edit rights.
Defensive patterns

Strategy: try-catch

Validate before calling

if (!props.currentRow?.id) {
  toast.error('Channel no longer exists. Refresh the list.')
  return
}

Type guard

const isChannelRow = (r: unknown): r is { id: number } =>
  typeof r === 'object' && r !== null && typeof (r as { id?: unknown }).id === 'number'

Try / catch

// already the pattern in use-secure style mutations:
// onError receives the thrown Error; keep the dialog open on validation-style failures
onError: (error: unknown) => {
  toast.error(getErrorMessage(error) || t(ERROR_MESSAGES.UPDATE_FAILED))
  // keep form state so the user can fix fields and resubmit
}

Prevention

When it happens

Trigger: PUT /api/channel/:id with a payload failing server validation (bad base URL, empty model list, invalid key format); editing a channel that another admin deleted concurrently; non-root user hitting the admin route.

Common situations: Editing a channel with an expired or malformed provider API key; model list containing names the backend rejects; permission changed mid-session; channel id stale after a re-seed of the database.

Related errors


AI-assisted analysis of QuantumNous/new-api@e2c7aa7b10 (2026-08-15). Data as JSON: /api/errors/54afa6434a510644. Report an issue: GitHub.