{"record":{"id":"0a9fab28194197de","repo":"langgenius/dify","slug":"unsupported-creator-ids-type","errorCode":null,"errorMessage":"Unsupported creator_ids type.","messagePattern":"Unsupported creator_ids type\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"api/controllers/console/app/app.py","lineNumber":131,"sourceCode":"            raise ValueError(\"Unsupported tag_ids type.\")\n\n        items = [str(item).strip() for item in value if item and str(item).strip()]\n        if not items:\n            return None\n\n        try:\n            return [str(uuid.UUID(item)) for item in items]\n        except ValueError as exc:\n            raise ValueError(\"Invalid UUID format in tag_ids.\") from exc\n\n    @field_validator(\"creator_ids\", mode=\"before\")\n    @classmethod\n    def validate_creator_ids(cls, value: list[str] | None) -> list[str] | None:\n        if not value:\n            return None\n\n        if not isinstance(value, list):\n            raise ValueError(\"Unsupported creator_ids type.\")\n\n        items = [str(item).strip() for item in value if item and str(item).strip()]\n        if not items:\n            return None\n\n        try:\n            return [str(uuid.UUID(item)) for item in items]\n        except ValueError as exc:\n            raise ValueError(\"Invalid UUID format in creator_ids.\") from exc\n\n\nclass RecentAppListQuery(BaseModel):\n    limit: int = Field(default=8, ge=1, le=8, description=\"Number of recently modified apps to return (1-8)\")\n\n\nclass AppListQuery(AppListBaseQuery):\n    pass\n","sourceCodeStart":113,"sourceCodeEnd":149,"githubUrl":"https://github.com/langgenius/dify/blob/ef8544b173fd6cd7a8e71df2cab576e52bebbfbc/api/controllers/console/app/app.py#L113-L149","documentation":"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.","triggerScenarios":"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.","commonSituations":"Query serializer using 'comma' format instead of 'repeat'; passing account email or name string instead of an array of account IDs.","solutions":["Send creator_ids as repeated query parameters: ?creator_ids=<uuid1>&creator_ids=<uuid2>.","Configure the HTTP client's paramsSerializer to use repeated-key format.","Omit the param when no creator filter is needed."],"exampleFix":"// before\naxios.get('/apps', { params: { creator_ids: creatorIds.join(',') } })\n\n// after\naxios.get('/apps', {\n  params: { creator_ids: creatorIds },\n  paramsSerializer: { indexes: null },\n})","handlingStrategy":"type-guard","validationCode":"function buildAppsParams(filters) {\n  const params = {};\n  if (Array.isArray(filters.creator_ids) && filters.creator_ids.length) params.creator_ids = filters.creator_ids;\n  return params;\n}","typeGuard":"const isStringArray = (v) => Array.isArray(v) && v.every((x) => typeof x === 'string');","tryCatchPattern":"try { await axios.get('/apps', { params, paramsSerializer: { indexes: null } }); }\ncatch (e) { if (/Unsupported creator_ids type/.test(e.message)) params.creator_ids = []; }","preventionTips":["Serialize creator_ids as repeated query keys.","Validate the value is an array before sending.","Use account UUIDs, never emails."],"tags":["apps","pydantic","query-params","validation","console-api"],"backgroundTag":null,"analyzedSha":"ef8544b173fd6cd7a8e71df2cab576e52bebbfbc","analyzedAt":"2026-08-12T05:15:17.394Z","schemaVersion":2},"datasetVersion":"2026-08-12T13:17:24.610Z"}