import type { Core } from '@strapi/types';
import { File } from '../types';
import type { UnstableGenerateAIMetadata } from '../../../shared/contracts/files';
export type AIMetadataFileResult = UnstableGenerateAIMetadata.FileResult;
declare const createAIMetadataService: ({ strapi }: {
    strapi: Core.Strapi;
}) => {
    isEnabled(): Promise<boolean>;
    countImagesWithoutMetadata(): Promise<{
        imagesWithoutMetadataCount: number;
        totalImages: number;
    }>;
    /**
     * Update files with AI-generated metadata
     * Shared logic used by both upload flow and retroactive processing
     */
    updateFilesWithAIMetadata(files: File[], metadataResults: Array<{
        altText: string;
        caption: string;
    } | null>, user: {
        id: string | number;
    }): Promise<void>;
    /**
     * Process existing files with job tracking for progress updates
     */
    processExistingFiles(jobId: number, user: {
        id: string | number;
    }): Promise<void>;
    /**
     * Generate AI metadata for an explicit selection of files, synchronously.
     *
     * Unlike `processExistingFiles`, this does not create a job and does not
     * filter on missing metadata — the selection is what the user asked for.
     * Existing alt text / captions are still preserved by
     * `updateFilesWithAIMetadata`, so a file that already has both is reported
     * as `success` without being modified.
     *
     * Images are processed in sequential chunks so one failing chunk only
     * affects its own files; every other chunk still runs.
     *
     * @experimental
     */
    generateForFiles(fileIds: Array<number | string>, user: {
        id: string | number;
    }): Promise<AIMetadataFileResult[]>;
    /**
     * Processes provided files for AI metadata generation
     */
    processFiles(files: File[]): Promise<Array<{
        altText: string;
        caption: string;
    } | null>>;
};
export { createAIMetadataService };
//# sourceMappingURL=ai-metadata.d.ts.map