{"record":{"id":"d3dc1941ed6fc4a7","repo":"langgenius/dify","slug":"invalid-uuid-format-in-creator-ids","errorCode":null,"errorMessage":"Invalid UUID format in creator_ids.","messagePattern":"Invalid UUID format in creator_ids\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"api/controllers/console/app/app.py","lineNumber":140,"sourceCode":"            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\n\nclass StarredAppListQuery(AppListBaseQuery):\n    pass\n\n\nclass CreateAppPayload(BaseModel):\n    name: str = Field(..., min_length=1, description=\"App name\")\n    description: str | None = Field(default=None, description=\"App description (max 400 chars)\", max_length=400)\n    mode: Literal[\"chat\", \"agent-chat\", \"advanced-chat\", \"workflow\", \"completion\"] = Field(..., description=\"App mode\")","sourceCodeStart":122,"sourceCodeEnd":158,"githubUrl":"https://github.com/langgenius/dify/blob/ef8544b173fd6cd7a8e71df2cab576e52bebbfbc/api/controllers/console/app/app.py#L122-L158","documentation":"Raised by AppListBaseQuery.validate_creator_ids when any stripped item fails uuid.UUID() parsing. Items are normalized to stringified UUIDs; a malformed value re-raises as 'Invalid UUID format in creator_ids.' inside a Pydantic ValidationError.","triggerScenarios":"Passing a non-UUID string (email, username, integer, partial ID) in creator_ids; URL-encoding that mangles the UUID; stale IDs from a different environment.","commonSituations":"Frontend stores creator emails instead of account IDs; copy-paste of partial account ID from UI; cross-tenant account ID leakage.","solutions":["Use full account UUIDs from the accounts/members endpoint.","Validate UUID format client-side before submitting the query.","Strip whitespace and confirm canonical 8-4-4-4-12 format."],"exampleFix":"// before\nconst creatorIds = members.map(m => m.email);\n\n// after\nconst creatorIds = members.map(m => m.id); // account UUID","handlingStrategy":"validation","validationCode":"const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\nfunction filterValidCreatorUuids(ids) { return (ids || []).filter((id) => UUID_RE.test(id)); }","typeGuard":"const isUuid = (v) => typeof v === 'string' && UUID_RE.test(v);","tryCatchPattern":"try { await axios.get('/apps', { params }); }\ncatch (e) { if (/Invalid UUID format in creator_ids/.test(e.message)) params.creator_ids = filterValidCreatorUuids(params.creator_ids); }","preventionTips":["Source creator IDs only from the accounts/members endpoint.","Validate UUID format client-side before submitting.","Never substitute emails or names for account UUIDs."],"tags":["apps","pydantic","uuid","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"}