diff --git a/cli/src/api/open-api/api.ts b/cli/src/api/open-api/api.ts index 04bbc42583..2ce8d3ec54 100644 --- a/cli/src/api/open-api/api.ts +++ b/cli/src/api/open-api/api.ts @@ -355,12 +355,6 @@ export interface AllJobStatusResponseDto { * @memberof AllJobStatusResponseDto */ 'backgroundTask': JobStatusDto; - /** - * - * @type {JobStatusDto} - * @memberof AllJobStatusResponseDto - */ - 'clipEncoding': JobStatusDto; /** * * @type {JobStatusDto} @@ -403,6 +397,12 @@ export interface AllJobStatusResponseDto { * @memberof AllJobStatusResponseDto */ 'sidecar': JobStatusDto; + /** + * + * @type {JobStatusDto} + * @memberof AllJobStatusResponseDto + */ + 'smartSearch': JobStatusDto; /** * * @type {JobStatusDto} @@ -2017,7 +2017,7 @@ export const JobName = { VideoConversion: 'videoConversion', ObjectTagging: 'objectTagging', RecognizeFaces: 'recognizeFaces', - ClipEncoding: 'clipEncoding', + SmartSearch: 'smartSearch', BackgroundTask: 'backgroundTask', StorageTemplateMigration: 'storageTemplateMigration', Migration: 'migration', @@ -3785,12 +3785,6 @@ export interface SystemConfigJobDto { * @memberof SystemConfigJobDto */ 'backgroundTask': JobSettingsDto; - /** - * - * @type {JobSettingsDto} - * @memberof SystemConfigJobDto - */ - 'clipEncoding': JobSettingsDto; /** * * @type {JobSettingsDto} @@ -3833,6 +3827,12 @@ export interface SystemConfigJobDto { * @memberof SystemConfigJobDto */ 'sidecar': JobSettingsDto; + /** + * + * @type {JobSettingsDto} + * @memberof SystemConfigJobDto + */ + 'smartSearch': JobSettingsDto; /** * * @type {JobSettingsDto} diff --git a/docs/docs/FAQ.md b/docs/docs/FAQ.md index 27906660e7..39696e6f94 100644 --- a/docs/docs/FAQ.md +++ b/docs/docs/FAQ.md @@ -26,7 +26,7 @@ Immich optionally uses machine learning for several features. However, it can be ### How can I lower Immich's CPU usage? -The initial backup is the most intensive due to the number of jobs running. The most CPU-intensive ones are transcoding and machine learning jobs (Tag Images, Encode CLIP, Recognize Faces), and to a lesser extent thumbnail generation. Here are some ways to lower their CPU usage: +The initial backup is the most intensive due to the number of jobs running. The most CPU-intensive ones are transcoding and machine learning jobs (Tag Images, Smart Search, Recognize Faces), and to a lesser extent thumbnail generation. Here are some ways to lower their CPU usage: - Lower the job concurrency for these jobs to 1. - Under Settings > Transcoding Settings > Threads, set the number of threads to a low number like 1 or 2. diff --git a/mobile/openapi/doc/AllJobStatusResponseDto.md b/mobile/openapi/doc/AllJobStatusResponseDto.md index 71b50efbe0..7b54ead21e 100644 Binary files a/mobile/openapi/doc/AllJobStatusResponseDto.md and b/mobile/openapi/doc/AllJobStatusResponseDto.md differ diff --git a/mobile/openapi/doc/SystemConfigJobDto.md b/mobile/openapi/doc/SystemConfigJobDto.md index 5660b245ee..b0944930d4 100644 Binary files a/mobile/openapi/doc/SystemConfigJobDto.md and b/mobile/openapi/doc/SystemConfigJobDto.md differ diff --git a/mobile/openapi/lib/model/all_job_status_response_dto.dart b/mobile/openapi/lib/model/all_job_status_response_dto.dart index 4d3008a3bc..138d1cd79f 100644 Binary files a/mobile/openapi/lib/model/all_job_status_response_dto.dart and b/mobile/openapi/lib/model/all_job_status_response_dto.dart differ diff --git a/mobile/openapi/lib/model/job_name.dart b/mobile/openapi/lib/model/job_name.dart index c1008d0791..bc88c2efd8 100644 Binary files a/mobile/openapi/lib/model/job_name.dart and b/mobile/openapi/lib/model/job_name.dart differ diff --git a/mobile/openapi/lib/model/system_config_job_dto.dart b/mobile/openapi/lib/model/system_config_job_dto.dart index d7ff7ea6fb..c8da684ae5 100644 Binary files a/mobile/openapi/lib/model/system_config_job_dto.dart and b/mobile/openapi/lib/model/system_config_job_dto.dart differ diff --git a/mobile/openapi/test/all_job_status_response_dto_test.dart b/mobile/openapi/test/all_job_status_response_dto_test.dart index 4f6d964cbe..fdbafc544d 100644 Binary files a/mobile/openapi/test/all_job_status_response_dto_test.dart and b/mobile/openapi/test/all_job_status_response_dto_test.dart differ diff --git a/mobile/openapi/test/system_config_job_dto_test.dart b/mobile/openapi/test/system_config_job_dto_test.dart index 4900e722f7..2a85c0ff5d 100644 Binary files a/mobile/openapi/test/system_config_job_dto_test.dart and b/mobile/openapi/test/system_config_job_dto_test.dart differ diff --git a/server/immich-openapi-specs.json b/server/immich-openapi-specs.json index 4de277f2b4..24c7306760 100644 --- a/server/immich-openapi-specs.json +++ b/server/immich-openapi-specs.json @@ -6470,9 +6470,6 @@ "backgroundTask": { "$ref": "#/components/schemas/JobStatusDto" }, - "clipEncoding": { - "$ref": "#/components/schemas/JobStatusDto" - }, "library": { "$ref": "#/components/schemas/JobStatusDto" }, @@ -6494,6 +6491,9 @@ "sidecar": { "$ref": "#/components/schemas/JobStatusDto" }, + "smartSearch": { + "$ref": "#/components/schemas/JobStatusDto" + }, "storageTemplateMigration": { "$ref": "#/components/schemas/JobStatusDto" }, @@ -6509,7 +6509,7 @@ "metadataExtraction", "videoConversion", "objectTagging", - "clipEncoding", + "smartSearch", "storageTemplateMigration", "migration", "backgroundTask", @@ -7821,7 +7821,7 @@ "videoConversion", "objectTagging", "recognizeFaces", - "clipEncoding", + "smartSearch", "backgroundTask", "storageTemplateMigration", "migration", @@ -9182,9 +9182,6 @@ "backgroundTask": { "$ref": "#/components/schemas/JobSettingsDto" }, - "clipEncoding": { - "$ref": "#/components/schemas/JobSettingsDto" - }, "library": { "$ref": "#/components/schemas/JobSettingsDto" }, @@ -9206,6 +9203,9 @@ "sidecar": { "$ref": "#/components/schemas/JobSettingsDto" }, + "smartSearch": { + "$ref": "#/components/schemas/JobSettingsDto" + }, "storageTemplateMigration": { "$ref": "#/components/schemas/JobSettingsDto" }, @@ -9221,7 +9221,7 @@ "metadataExtraction", "videoConversion", "objectTagging", - "clipEncoding", + "smartSearch", "storageTemplateMigration", "migration", "backgroundTask", diff --git a/server/src/domain/job/job.constants.ts b/server/src/domain/job/job.constants.ts index 287d22db60..50c4fbc519 100644 --- a/server/src/domain/job/job.constants.ts +++ b/server/src/domain/job/job.constants.ts @@ -4,7 +4,7 @@ export enum QueueName { VIDEO_CONVERSION = 'videoConversion', OBJECT_TAGGING = 'objectTagging', RECOGNIZE_FACES = 'recognizeFaces', - CLIP_ENCODING = 'clipEncoding', + SMART_SEARCH = 'smartSearch', BACKGROUND_TASK = 'backgroundTask', STORAGE_TEMPLATE_MIGRATION = 'storageTemplateMigration', MIGRATION = 'migration', @@ -135,8 +135,8 @@ export const JOBS_TO_QUEUE: Record = { [JobName.RECOGNIZE_FACES]: QueueName.RECOGNIZE_FACES, // clip - [JobName.QUEUE_ENCODE_CLIP]: QueueName.CLIP_ENCODING, - [JobName.ENCODE_CLIP]: QueueName.CLIP_ENCODING, + [JobName.QUEUE_ENCODE_CLIP]: QueueName.SMART_SEARCH, + [JobName.ENCODE_CLIP]: QueueName.SMART_SEARCH, // XMP sidecars [JobName.QUEUE_SIDECAR]: QueueName.SIDECAR, diff --git a/server/src/domain/job/job.dto.ts b/server/src/domain/job/job.dto.ts index ec4cf7bb6e..cdbb3fa8ec 100644 --- a/server/src/domain/job/job.dto.ts +++ b/server/src/domain/job/job.dto.ts @@ -63,7 +63,7 @@ export class AllJobStatusResponseDto implements Record [QueueName.OBJECT_TAGGING]!: JobStatusDto; @ApiProperty({ type: JobStatusDto }) - [QueueName.CLIP_ENCODING]!: JobStatusDto; + [QueueName.SMART_SEARCH]!: JobStatusDto; @ApiProperty({ type: JobStatusDto }) [QueueName.STORAGE_TEMPLATE_MIGRATION]!: JobStatusDto; diff --git a/server/src/domain/job/job.service.spec.ts b/server/src/domain/job/job.service.spec.ts index c37f1ad21e..0ce36cb890 100644 --- a/server/src/domain/job/job.service.spec.ts +++ b/server/src/domain/job/job.service.spec.ts @@ -97,7 +97,7 @@ describe(JobService.name, () => { await expect(sut.getAllJobsStatus()).resolves.toEqual({ [QueueName.BACKGROUND_TASK]: expectedJobStatus, - [QueueName.CLIP_ENCODING]: expectedJobStatus, + [QueueName.SMART_SEARCH]: expectedJobStatus, [QueueName.METADATA_EXTRACTION]: expectedJobStatus, [QueueName.OBJECT_TAGGING]: expectedJobStatus, [QueueName.SEARCH]: expectedJobStatus, @@ -171,7 +171,7 @@ describe(JobService.name, () => { it('should handle a start clip encoding command', async () => { jobMock.getQueueStatus.mockResolvedValue({ isActive: false, isPaused: false }); - await sut.handleCommand(QueueName.CLIP_ENCODING, { command: JobCommand.START, force: false }); + await sut.handleCommand(QueueName.SMART_SEARCH, { command: JobCommand.START, force: false }); expect(jobMock.queue).toHaveBeenCalledWith({ name: JobName.QUEUE_ENCODE_CLIP, data: { force: false } }); }); @@ -232,7 +232,7 @@ describe(JobService.name, () => { SystemConfigCore.create(newSystemConfigRepositoryMock(false)).config$.next({ job: { [QueueName.BACKGROUND_TASK]: { concurrency: 10 }, - [QueueName.CLIP_ENCODING]: { concurrency: 10 }, + [QueueName.SMART_SEARCH]: { concurrency: 10 }, [QueueName.METADATA_EXTRACTION]: { concurrency: 10 }, [QueueName.OBJECT_TAGGING]: { concurrency: 10 }, [QueueName.RECOGNIZE_FACES]: { concurrency: 10 }, @@ -247,7 +247,7 @@ describe(JobService.name, () => { } as SystemConfig); expect(jobMock.setConcurrency).toHaveBeenCalledWith(QueueName.BACKGROUND_TASK, 10); - expect(jobMock.setConcurrency).toHaveBeenCalledWith(QueueName.CLIP_ENCODING, 10); + expect(jobMock.setConcurrency).toHaveBeenCalledWith(QueueName.SMART_SEARCH, 10); expect(jobMock.setConcurrency).toHaveBeenCalledWith(QueueName.METADATA_EXTRACTION, 10); expect(jobMock.setConcurrency).toHaveBeenCalledWith(QueueName.OBJECT_TAGGING, 10); expect(jobMock.setConcurrency).toHaveBeenCalledWith(QueueName.RECOGNIZE_FACES, 10); @@ -367,7 +367,7 @@ describe(JobService.name, () => { const featureTests: Array<{ queue: QueueName; feature: FeatureFlag; configKey: SystemConfigKey }> = [ { - queue: QueueName.CLIP_ENCODING, + queue: QueueName.SMART_SEARCH, feature: FeatureFlag.CLIP_ENCODE, configKey: SystemConfigKey.MACHINE_LEARNING_CLIP_ENABLED, }, diff --git a/server/src/domain/job/job.service.ts b/server/src/domain/job/job.service.ts index 0e266c4c41..37b2f07339 100644 --- a/server/src/domain/job/job.service.ts +++ b/server/src/domain/job/job.service.ts @@ -98,7 +98,7 @@ export class JobService { await this.configCore.requireFeature(FeatureFlag.TAG_IMAGE); return this.jobRepository.queue({ name: JobName.QUEUE_OBJECT_TAGGING, data: { force } }); - case QueueName.CLIP_ENCODING: + case QueueName.SMART_SEARCH: await this.configCore.requireFeature(FeatureFlag.CLIP_ENCODE); return this.jobRepository.queue({ name: JobName.QUEUE_ENCODE_CLIP, data: { force } }); diff --git a/server/src/domain/smart-info/smart-info.service.ts b/server/src/domain/smart-info/smart-info.service.ts index 88208dec9f..2a73ecf6e7 100644 --- a/server/src/domain/smart-info/smart-info.service.ts +++ b/server/src/domain/smart-info/smart-info.service.ts @@ -29,13 +29,13 @@ export class SmartInfoService { } async init() { - await this.jobRepository.pause(QueueName.CLIP_ENCODING); + await this.jobRepository.pause(QueueName.SMART_SEARCH); - let { isActive } = await this.jobRepository.getQueueStatus(QueueName.CLIP_ENCODING); + let { isActive } = await this.jobRepository.getQueueStatus(QueueName.SMART_SEARCH); while (isActive) { this.logger.verbose('Waiting for CLIP encoding queue to stop...'); await setTimeout(1000).then(async () => { - ({ isActive } = await this.jobRepository.getQueueStatus(QueueName.CLIP_ENCODING)); + ({ isActive } = await this.jobRepository.getQueueStatus(QueueName.SMART_SEARCH)); }); } @@ -43,7 +43,7 @@ export class SmartInfoService { await this.repository.init(machineLearning.clip.modelName); - await this.jobRepository.resume(QueueName.CLIP_ENCODING); + await this.jobRepository.resume(QueueName.SMART_SEARCH); } async handleQueueObjectTagging({ force }: IBaseJob) { diff --git a/server/src/domain/system-config/dto/system-config-job.dto.ts b/server/src/domain/system-config/dto/system-config-job.dto.ts index e3d19418f6..98e382028e 100644 --- a/server/src/domain/system-config/dto/system-config-job.dto.ts +++ b/server/src/domain/system-config/dto/system-config-job.dto.ts @@ -39,7 +39,7 @@ export class SystemConfigJobDto implements Record { @ValidateNested() @IsObject() @Type(() => JobSettingsDto) - [QueueName.CLIP_ENCODING]!: JobSettingsDto; + [QueueName.SMART_SEARCH]!: JobSettingsDto; @ApiProperty({ type: JobSettingsDto }) @ValidateNested() diff --git a/server/src/domain/system-config/system-config.core.ts b/server/src/domain/system-config/system-config.core.ts index 2eeb805380..b4b6afc7ed 100644 --- a/server/src/domain/system-config/system-config.core.ts +++ b/server/src/domain/system-config/system-config.core.ts @@ -47,7 +47,7 @@ export const defaults = Object.freeze({ }, job: { [QueueName.BACKGROUND_TASK]: { concurrency: 5 }, - [QueueName.CLIP_ENCODING]: { concurrency: 2 }, + [QueueName.SMART_SEARCH]: { concurrency: 2 }, [QueueName.METADATA_EXTRACTION]: { concurrency: 5 }, [QueueName.OBJECT_TAGGING]: { concurrency: 2 }, [QueueName.RECOGNIZE_FACES]: { concurrency: 2 }, diff --git a/server/src/domain/system-config/system-config.service.spec.ts b/server/src/domain/system-config/system-config.service.spec.ts index 4ab1880d69..3951083c1e 100644 --- a/server/src/domain/system-config/system-config.service.spec.ts +++ b/server/src/domain/system-config/system-config.service.spec.ts @@ -27,7 +27,7 @@ const updates: SystemConfigEntity[] = [ const updatedConfig = Object.freeze({ job: { [QueueName.BACKGROUND_TASK]: { concurrency: 5 }, - [QueueName.CLIP_ENCODING]: { concurrency: 2 }, + [QueueName.SMART_SEARCH]: { concurrency: 2 }, [QueueName.METADATA_EXTRACTION]: { concurrency: 5 }, [QueueName.OBJECT_TAGGING]: { concurrency: 2 }, [QueueName.RECOGNIZE_FACES]: { concurrency: 2 }, diff --git a/web/src/api/api.ts b/web/src/api/api.ts index aecf28e12e..a3ff5dbf18 100644 --- a/web/src/api/api.ts +++ b/web/src/api/api.ts @@ -136,7 +136,7 @@ class ImmichApi { [JobName.MetadataExtraction]: 'Extract Metadata', [JobName.Sidecar]: 'Sidecar Metadata', [JobName.ObjectTagging]: 'Tag Objects', - [JobName.ClipEncoding]: 'Encode Clip', + [JobName.SmartSearch]: 'Smart Search', [JobName.RecognizeFaces]: 'Recognize Faces', [JobName.VideoConversion]: 'Transcode Videos', [JobName.StorageTemplateMigration]: 'Storage Template Migration', diff --git a/web/src/api/open-api/api.ts b/web/src/api/open-api/api.ts index 04bbc42583..2ce8d3ec54 100644 --- a/web/src/api/open-api/api.ts +++ b/web/src/api/open-api/api.ts @@ -355,12 +355,6 @@ export interface AllJobStatusResponseDto { * @memberof AllJobStatusResponseDto */ 'backgroundTask': JobStatusDto; - /** - * - * @type {JobStatusDto} - * @memberof AllJobStatusResponseDto - */ - 'clipEncoding': JobStatusDto; /** * * @type {JobStatusDto} @@ -403,6 +397,12 @@ export interface AllJobStatusResponseDto { * @memberof AllJobStatusResponseDto */ 'sidecar': JobStatusDto; + /** + * + * @type {JobStatusDto} + * @memberof AllJobStatusResponseDto + */ + 'smartSearch': JobStatusDto; /** * * @type {JobStatusDto} @@ -2017,7 +2017,7 @@ export const JobName = { VideoConversion: 'videoConversion', ObjectTagging: 'objectTagging', RecognizeFaces: 'recognizeFaces', - ClipEncoding: 'clipEncoding', + SmartSearch: 'smartSearch', BackgroundTask: 'backgroundTask', StorageTemplateMigration: 'storageTemplateMigration', Migration: 'migration', @@ -3785,12 +3785,6 @@ export interface SystemConfigJobDto { * @memberof SystemConfigJobDto */ 'backgroundTask': JobSettingsDto; - /** - * - * @type {JobSettingsDto} - * @memberof SystemConfigJobDto - */ - 'clipEncoding': JobSettingsDto; /** * * @type {JobSettingsDto} @@ -3833,6 +3827,12 @@ export interface SystemConfigJobDto { * @memberof SystemConfigJobDto */ 'sidecar': JobSettingsDto; + /** + * + * @type {JobSettingsDto} + * @memberof SystemConfigJobDto + */ + 'smartSearch': JobSettingsDto; /** * * @type {JobSettingsDto} diff --git a/web/src/lib/components/admin-page/jobs/jobs-panel.svelte b/web/src/lib/components/admin-page/jobs/jobs-panel.svelte index 350ff3b21e..e2c909af61 100644 --- a/web/src/lib/components/admin-page/jobs/jobs-panel.svelte +++ b/web/src/lib/components/admin-page/jobs/jobs-panel.svelte @@ -12,10 +12,10 @@ mdiFileJpgBox, mdiFileXmlBox, mdiFolderMove, + mdiImageSearch, mdiLibraryShelves, mdiTable, mdiTagMultiple, - mdiVectorCircle, mdiVideo, } from '@mdi/js'; import ConfirmDialogue from '../../shared-components/confirm-dialogue.svelte'; @@ -56,12 +56,12 @@ [JobName.ThumbnailGeneration]: { icon: mdiFileJpgBox, title: api.getJobName(JobName.ThumbnailGeneration), - subtitle: 'Regenerate JPEG and WebP thumbnails', + subtitle: 'Generate large, small and blurred thumbnails for each asset, as well as thumbnails for each person', }, [JobName.MetadataExtraction]: { icon: mdiTable, title: api.getJobName(JobName.MetadataExtraction), - subtitle: 'Extract metadata information i.e. GPS, resolution...etc', + subtitle: 'Extract metadata information from each asset, such as GPS and resolution', }, [JobName.Library]: { icon: mdiLibraryShelves, @@ -81,26 +81,27 @@ [JobName.ObjectTagging]: { icon: mdiTagMultiple, title: api.getJobName(JobName.ObjectTagging), - subtitle: 'Run machine learning to tag objects\nNote that some assets may not have any objects detected', + subtitle: + 'Run machine learning on assets to tag objects\nNote that some assets may not have any objects detected', disabled: !$featureFlags.tagImage, }, - [JobName.ClipEncoding]: { - icon: mdiVectorCircle, - title: api.getJobName(JobName.ClipEncoding), - subtitle: 'Run machine learning to generate clip embeddings', + [JobName.SmartSearch]: { + icon: mdiImageSearch, + title: api.getJobName(JobName.SmartSearch), + subtitle: 'Run machine learning on assets to support smart search', disabled: !$featureFlags.clipEncode, }, [JobName.RecognizeFaces]: { icon: mdiFaceRecognition, title: api.getJobName(JobName.RecognizeFaces), - subtitle: 'Run machine learning to recognize faces', + subtitle: 'Run machine learning on assets to recognize faces', handleCommand: handleFaceCommand, disabled: !$featureFlags.facialRecognition, }, [JobName.VideoConversion]: { icon: mdiVideo, title: api.getJobName(JobName.VideoConversion), - subtitle: 'Transcode videos not in the desired format', + subtitle: 'Transcode videos for wider compatibility with browsers and devices', }, [JobName.StorageTemplateMigration]: { icon: mdiFolderMove, diff --git a/web/src/lib/components/admin-page/settings/job-settings/job-settings.svelte b/web/src/lib/components/admin-page/settings/job-settings/job-settings.svelte index f102e791d0..96a379139a 100644 --- a/web/src/lib/components/admin-page/settings/job-settings/job-settings.svelte +++ b/web/src/lib/components/admin-page/settings/job-settings/job-settings.svelte @@ -23,7 +23,7 @@ JobName.Library, JobName.Sidecar, JobName.ObjectTagging, - JobName.ClipEncoding, + JobName.SmartSearch, JobName.RecognizeFaces, JobName.VideoConversion, JobName.StorageTemplateMigration,