import { z } from 'zod/v4';
import { GoogleAuthOptions } from 'google-auth-library';
import { EmbeddingModelV3, ProviderV3, LanguageModelV3, ImageModelV3, Experimental_VideoModelV3 } from '@ai-sdk/provider';
import * as _ai_sdk_provider_utils from '@ai-sdk/provider-utils';
import { Resolvable, FetchFunction } from '@ai-sdk/provider-utils';

type GoogleVertexEmbeddingModelId = 'textembedding-gecko' | 'textembedding-gecko@001' | 'textembedding-gecko@003' | 'textembedding-gecko-multilingual' | 'textembedding-gecko-multilingual@001' | 'text-multilingual-embedding-002' | 'text-embedding-004' | 'text-embedding-005' | 'gemini-embedding-001' | 'gemini-embedding-2-preview' | (string & {});
declare const googleVertexEmbeddingModelOptions: z.ZodObject<{
    outputDimensionality: z.ZodOptional<z.ZodNumber>;
    taskType: z.ZodOptional<z.ZodEnum<{
        SEMANTIC_SIMILARITY: "SEMANTIC_SIMILARITY";
        CLASSIFICATION: "CLASSIFICATION";
        CLUSTERING: "CLUSTERING";
        RETRIEVAL_DOCUMENT: "RETRIEVAL_DOCUMENT";
        RETRIEVAL_QUERY: "RETRIEVAL_QUERY";
        QUESTION_ANSWERING: "QUESTION_ANSWERING";
        FACT_VERIFICATION: "FACT_VERIFICATION";
        CODE_RETRIEVAL_QUERY: "CODE_RETRIEVAL_QUERY";
    }>>;
    title: z.ZodOptional<z.ZodString>;
    autoTruncate: z.ZodOptional<z.ZodBoolean>;
}, z.core.$strip>;
type GoogleVertexEmbeddingModelOptions = z.infer<typeof googleVertexEmbeddingModelOptions>;

type GoogleVertexImageModelId = 'imagen-3.0-generate-001' | 'imagen-3.0-generate-002' | 'imagen-3.0-fast-generate-001' | 'imagen-4.0-generate-001' | 'imagen-4.0-ultra-generate-001' | 'imagen-4.0-fast-generate-001' | 'gemini-2.5-flash-image' | 'gemini-3-pro-image-preview' | 'gemini-3.1-flash-image-preview' | (string & {});

declare const googleVertexImageModelOptionsSchema: z.ZodObject<{
    negativePrompt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
    personGeneration: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
        dont_allow: "dont_allow";
        allow_adult: "allow_adult";
        allow_all: "allow_all";
    }>>>;
    safetySetting: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
        block_low_and_above: "block_low_and_above";
        block_medium_and_above: "block_medium_and_above";
        block_only_high: "block_only_high";
        block_none: "block_none";
    }>>>;
    addWatermark: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
    storageUri: z.ZodOptional<z.ZodNullable<z.ZodString>>;
    sampleImageSize: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
        "1K": "1K";
        "2K": "2K";
    }>>>;
    edit: z.ZodOptional<z.ZodNullable<z.ZodObject<{
        baseSteps: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
        mode: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
            EDIT_MODE_INPAINT_INSERTION: "EDIT_MODE_INPAINT_INSERTION";
            EDIT_MODE_INPAINT_REMOVAL: "EDIT_MODE_INPAINT_REMOVAL";
            EDIT_MODE_OUTPAINT: "EDIT_MODE_OUTPAINT";
            EDIT_MODE_CONTROLLED_EDITING: "EDIT_MODE_CONTROLLED_EDITING";
            EDIT_MODE_PRODUCT_IMAGE: "EDIT_MODE_PRODUCT_IMAGE";
            EDIT_MODE_BGSWAP: "EDIT_MODE_BGSWAP";
        }>>>;
        maskMode: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
            MASK_MODE_DEFAULT: "MASK_MODE_DEFAULT";
            MASK_MODE_USER_PROVIDED: "MASK_MODE_USER_PROVIDED";
            MASK_MODE_DETECTION_BOX: "MASK_MODE_DETECTION_BOX";
            MASK_MODE_CLOTHING_AREA: "MASK_MODE_CLOTHING_AREA";
            MASK_MODE_PARSED_PERSON: "MASK_MODE_PARSED_PERSON";
        }>>>;
        maskDilation: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
    }, z.core.$strip>>>;
}, z.core.$strip>;
type GoogleVertexImageModelOptions = z.infer<typeof googleVertexImageModelOptionsSchema>;

type GoogleVertexVideoModelId = 'veo-2.0-generate-preview' | 'veo-2.0-generate-exp' | 'veo-2.0-generate-001' | 'veo-3.0-generate-001' | 'veo-3.0-fast-generate-001' | 'veo-3.0-generate-preview' | 'veo-3.0-fast-generate-preview' | 'veo-3.1-generate-001' | 'veo-3.1-fast-generate-001' | 'veo-3.1-generate-preview' | 'veo-3.1-fast-generate-preview' | (string & {});

type GoogleVertexVideoModelOptions = {
    pollIntervalMs?: number | null;
    pollTimeoutMs?: number | null;
    personGeneration?: 'dont_allow' | 'allow_adult' | 'allow_all' | null;
    negativePrompt?: string | null;
    generateAudio?: boolean | null;
    gcsOutputDirectory?: string | null;
    referenceImages?: Array<{
        bytesBase64Encoded?: string;
        gcsUri?: string;
    }> | null;
    [key: string]: unknown;
};

interface GoogleVertexConfig {
    provider: string;
    baseURL: string;
    headers: Resolvable<Record<string, string | undefined>>;
    fetch?: FetchFunction;
}

declare class GoogleVertexEmbeddingModel implements EmbeddingModelV3 {
    readonly specificationVersion = "v3";
    readonly modelId: GoogleVertexEmbeddingModelId;
    readonly maxEmbeddingsPerCall = 2048;
    readonly supportsParallelCalls = true;
    private readonly config;
    get provider(): string;
    constructor(modelId: GoogleVertexEmbeddingModelId, config: GoogleVertexConfig);
    doEmbed({ values, headers, abortSignal, providerOptions, }: Parameters<EmbeddingModelV3['doEmbed']>[0]): Promise<Awaited<ReturnType<EmbeddingModelV3['doEmbed']>>>;
}

type GoogleVertexModelId = 'gemini-3.5-flash' | 'gemini-2.5-pro' | 'gemini-2.5-flash' | 'gemini-2.5-flash-lite' | 'gemini-2.0-flash-lite' | 'gemini-2.0-flash' | 'gemini-2.0-flash-001' | 'gemini-1.5-flash' | 'gemini-1.5-flash-001' | 'gemini-1.5-flash-002' | 'gemini-1.5-pro' | 'gemini-1.5-pro-001' | 'gemini-1.5-pro-002' | 'gemini-1.0-pro-001' | 'gemini-1.0-pro-vision-001' | 'gemini-1.0-pro' | 'gemini-1.0-pro-002' | 'gemini-2.0-flash-lite-preview-02-05' | 'gemini-2.5-flash-preview-09-2025' | 'gemini-3-pro-preview' | 'gemini-3-pro-image-preview' | 'gemini-3-flash-preview' | 'gemini-3.1-pro-preview' | 'gemini-3.1-flash-image-preview' | 'gemini-3.1-flash-lite-preview' | 'gemini-2.0-pro-exp-02-05' | 'gemini-2.0-flash-exp' | (string & {});

declare const googleVertexTools: {
    googleSearch: _ai_sdk_provider_utils.ProviderToolFactory<{}, {
        [x: string]: unknown;
        searchTypes?: {
            webSearch?: Record<string, never> | undefined;
            imageSearch?: Record<string, never> | undefined;
        } | undefined;
        timeRangeFilter?: {
            startTime: string;
            endTime: string;
        } | undefined;
    }>;
    enterpriseWebSearch: _ai_sdk_provider_utils.ProviderToolFactory<{}, {}>;
    googleMaps: _ai_sdk_provider_utils.ProviderToolFactory<{}, {}>;
    urlContext: _ai_sdk_provider_utils.ProviderToolFactory<{}, {}>;
    fileSearch: _ai_sdk_provider_utils.ProviderToolFactory<{}, {
        [x: string]: unknown;
        fileSearchStoreNames: string[];
        topK?: number | undefined;
        metadataFilter?: string | undefined;
    }>;
    codeExecution: _ai_sdk_provider_utils.ProviderToolFactoryWithOutputSchema<{
        language: string;
        code: string;
    }, {
        outcome: string;
        output: string;
    }, {}>;
    vertexRagStore: _ai_sdk_provider_utils.ProviderToolFactory<{}, {
        ragCorpus: string;
        topK?: number;
    }>;
};

interface GoogleVertexProvider extends ProviderV3 {
    /**
     * Creates a model for text generation.
     */
    (modelId: GoogleVertexModelId): LanguageModelV3;
    languageModel: (modelId: GoogleVertexModelId) => LanguageModelV3;
    /**
     * Creates a model for image generation.
     */
    image(modelId: GoogleVertexImageModelId): ImageModelV3;
    /**
     * Creates a model for image generation.
     */
    imageModel(modelId: GoogleVertexImageModelId): ImageModelV3;
    tools: typeof googleVertexTools;
    /**
     * @deprecated Use `embeddingModel` instead.
     */
    textEmbeddingModel(modelId: GoogleVertexEmbeddingModelId): GoogleVertexEmbeddingModel;
    /**
     * Creates a model for video generation.
     */
    video(modelId: GoogleVertexVideoModelId): Experimental_VideoModelV3;
    /**
     * Creates a model for video generation.
     */
    videoModel(modelId: GoogleVertexVideoModelId): Experimental_VideoModelV3;
}
interface GoogleVertexProviderSettings$1 {
    /**
     * Optional. The API key for the Google Cloud project. If provided, the
     * provider will use express mode with API key authentication. Defaults to
     * the value of the `GOOGLE_VERTEX_API_KEY` environment variable.
     */
    apiKey?: string;
    /**
     * Your Google Vertex location. Defaults to the environment variable `GOOGLE_VERTEX_LOCATION`.
     */
    location?: string;
    /**
     * Your Google Vertex project. Defaults to the environment variable `GOOGLE_VERTEX_PROJECT`.
     */
    project?: string;
    /**
     * Headers to use for requests. Can be:
     * - A headers object
     * - A Promise that resolves to a headers object
     * - A function that returns a headers object
     * - A function that returns a Promise of a headers object
     */
    headers?: Resolvable<Record<string, string | undefined>>;
    /**
     * Custom fetch implementation. You can use it as a middleware to intercept requests,
     * or to provide a custom fetch implementation for e.g. testing.
     */
    fetch?: FetchFunction;
    generateId?: () => string;
    /**
     * Base URL for the Google Vertex API calls.
     */
    baseURL?: string;
}

interface GoogleVertexProviderSettings extends GoogleVertexProviderSettings$1 {
    /**
     * Optional. The Authentication options provided by google-auth-library.
     * Complete list of authentication options is documented in the
     * GoogleAuthOptions interface:
     * https://github.com/googleapis/google-auth-library-nodejs/blob/main/src/auth/googleauth.ts.
     */
    googleAuthOptions?: GoogleAuthOptions;
}

declare function createVertex(options?: GoogleVertexProviderSettings): GoogleVertexProvider;
/**
 * Default Google Vertex AI provider instance.
 */
declare const vertex: GoogleVertexProvider;

declare const VERSION: string;

export { type GoogleVertexEmbeddingModelOptions, type GoogleVertexImageModelOptions, type GoogleVertexImageModelOptions as GoogleVertexImageProviderOptions, type GoogleVertexProvider, type GoogleVertexProviderSettings, type GoogleVertexVideoModelId, type GoogleVertexVideoModelOptions, type GoogleVertexVideoModelOptions as GoogleVertexVideoProviderOptions, VERSION, createVertex, vertex };
