{"record":{"id":"2cf9bb520f9846a0","repo":"immich-app/immich","slug":"asset-dto-queryassetid-has-no-embedding","errorCode":null,"errorMessage":"Asset ${dto.queryAssetId} has no embedding","messagePattern":"Asset (.+?) has no embedding","errorType":"exception","errorClass":"BadRequestException","httpStatus":400,"severity":"warning","filePath":"server/src/services/search.service.ts","lineNumber":348,"sourceCode":"    if (dto.query) {\n      const key = machineLearning.clip.modelName + dto.query + dto.language;\n      let embedding = this.embeddingCache.get(key);\n      if (!embedding) {\n        embedding = await this.machineLearningRepository.encodeText(dto.query, {\n          modelName: machineLearning.clip.modelName,\n          language: dto.language,\n        });\n        this.embeddingCache.set(key, embedding);\n      }\n      return embedding;\n    }\n\n    if (dto.queryAssetId) {\n      await this.requireAccess({ auth, permission: Permission.AssetRead, ids: [dto.queryAssetId] });\n      const getEmbeddingResponse = await this.searchRepository.getEmbedding(dto.queryAssetId);\n      const assetEmbedding = getEmbeddingResponse?.embedding;\n      if (!assetEmbedding) {\n        throw new BadRequestException(`Asset ${dto.queryAssetId} has no embedding`);\n      }\n      return assetEmbedding;\n    }\n\n    throw new BadRequestException('Either `query` or `queryAssetId` must be set');\n  }\n\n  private async getUserIdsToSearch(auth: AuthDto, visibility?: AssetVisibility): Promise<string[]> {\n    // Locked assets are personal. Never include partner IDs, regardless of A's elevated session.\n    if (visibility === AssetVisibility.Locked) {\n      return [auth.user.id];\n    }\n    const partnerIds = await getMyPartnerIds({\n      userId: auth.user.id,\n      repository: this.partnerRepository,\n      timelineEnabled: true,\n    });\n    return [auth.user.id, ...partnerIds];","sourceCodeStart":330,"sourceCodeEnd":366,"githubUrl":"https://github.com/immich-app/immich/blob/e55ac299a4ec7cb372e35dbf2c6c05ee9ce77f6c/server/src/services/search.service.ts#L330-L366","documentation":"resolveEmbedding supports searching by an existing asset: it fetches the asset's stored smart-search embedding and throws when the asset exists but has no embedding. This happens for assets whose smart-search embedding was never generated or was wiped (e.g. ML disabled previously).","triggerScenarios":"Smart search with `queryAssetId` set to an asset that (a) has no embedding row yet because ML hasn't processed it, (b) had embeddings cleared, or (c) was uploaded while smart search was disabled.","commonSituations":"Building 'find similar' UIs on freshly uploaded assets before ML jobs run; installations that recently enabled smart search so old assets lack embeddings; assets queued but ML service down.","solutions":["Wait for/backfill ML jobs so the asset gets an embedding (re-run machine learning job for the asset)","Pick a different queryAssetId known to have embeddings, or send a text `query` instead","Enable smart search/ML service so new assets get embedded","Check asset status before using it as a similarity seed"],"exampleFix":"// before\nawait api.searchSmart({ queryAssetId: freshUploadId }); // may throw\n// after\nif (asset.smartSearchStatus === 'ok') {\n  await api.searchSmart({ queryAssetId: asset.id });\n} else {\n  await api.searchSmart({ query: asset.originalFileName });","handlingStrategy":"fallback","validationCode":"if (asset.smartSearch?.status !== 'ok') {\n  // embedding not ready; use text query instead\n  return await api.searchSmart({ query: asset.originalFileName });\n}","typeGuard":"function hasEmbedding(a: { smartSearch?: { status?: string } }): boolean {\n  return a.smartSearch?.status === 'ok';\n}","tryCatchPattern":"try {\n  return await searchService.searchSmart(auth, { queryAssetId });\n} catch (e) {\n  if (e instanceof BadRequestException && /has no embedding/.test(e.message)) {\n    return await searchService.searchSmart(auth, { query: fallbackText });\n  }\n  throw e;\n}","preventionTips":["Ensure ML jobs complete before using assets as similarity seeds","Re-run embedding jobs after enabling smart search on old libraries","Prefer text queries when asset embedding status is unknown"],"tags":["search","embedding","machine-learning"],"backgroundTag":"empty-required-field","analyzedSha":"e55ac299a4ec7cb372e35dbf2c6c05ee9ce77f6c","analyzedAt":"2026-09-15T07:20:19.675Z","contentChangedAt":"2026-09-15T07:20:19.675Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}