langgenius/dify · error · ValueError

Unsupported creator_ids type.

Error message

Unsupported creator_ids type.

What it means

Raised by the Pydantic field_validator on AppListBaseQuery.creator_ids (mode='before') when creator_ids is truthy but not a Python list. Mirror of the tag_ids type check. Surfaces as a Pydantic ValidationError on GET /console/apps and GET /console/apps/starred.

Source

Thrown at api/controllers/console/app/app.py:131

            raise ValueError("Unsupported tag_ids type.")

        items = [str(item).strip() for item in value if item and str(item).strip()]
        if not items:
            return None

        try:
            return [str(uuid.UUID(item)) for item in items]
        except ValueError as exc:
            raise ValueError("Invalid UUID format in tag_ids.") from exc

    @field_validator("creator_ids", mode="before")
    @classmethod
    def validate_creator_ids(cls, value: list[str] | None) -> list[str] | None:
        if not value:
            return None

        if not isinstance(value, list):
            raise ValueError("Unsupported creator_ids type.")

        items = [str(item).strip() for item in value if item and str(item).strip()]
        if not items:
            return None

        try:
            return [str(uuid.UUID(item)) for item in items]
        except ValueError as exc:
            raise ValueError("Invalid UUID format in creator_ids.") from exc


class RecentAppListQuery(BaseModel):
    limit: int = Field(default=8, ge=1, le=8, description="Number of recently modified apps to return (1-8)")


class AppListQuery(AppListBaseQuery):
    pass

View on GitHub (pinned to ef8544b173)

Solutions

  1. Send creator_ids as repeated query parameters: ?creator_ids=<uuid1>&creator_ids=<uuid2>.
  2. Configure the HTTP client's paramsSerializer to use repeated-key format.
  3. Omit the param when no creator filter is needed.

Example fix

// before
axios.get('/apps', { params: { creator_ids: creatorIds.join(',') } })

// after
axios.get('/apps', {
  params: { creator_ids: creatorIds },
  paramsSerializer: { indexes: null },
})
Defensive patterns

Strategy: type-guard

Validate before calling

function buildAppsParams(filters) {
  const params = {};
  if (Array.isArray(filters.creator_ids) && filters.creator_ids.length) params.creator_ids = filters.creator_ids;
  return params;
}

Type guard

const isStringArray = (v) => Array.isArray(v) && v.every((x) => typeof x === 'string');

Try / catch

try { await axios.get('/apps', { params, paramsSerializer: { indexes: null } }); }
catch (e) { if (/Unsupported creator_ids type/.test(e.message)) params.creator_ids = []; }

Prevention

When it happens

Trigger: Sending creator_ids as a single scalar, a comma-joined string, or any non-array type in the query string. Triggered before UUID validation runs.

Common situations: Query serializer using 'comma' format instead of 'repeat'; passing account email or name string instead of an array of account IDs.

Related errors


AI-assisted analysis of langgenius/dify@ef8544b173 (2026-08-12). Data as JSON: /api/errors/0a9fab28194197de. Report an issue: GitHub.