import { default as OpenAI } from 'openai';
import { DashscopeChat } from './chat';
import { DashscopeCompletions } from './completions';
import { DashscopeEmbeddings } from './embeddings';

export declare namespace OpenAICompletionsCompatibility {
    type CompletionModel = DashscopeCompletions.CompletionModel;
    interface StreamOptions {
        /**
         * 启用增量输出
         *
         * 在启用流输出参数后，是否每次输出是否每次都包含前面输出的内容。
         *
         * @defaultValue true
         */
        incremental_output?: boolean | null;
    }
    interface CompletionCreateParamsBase extends Pick<DashscopeCompletions.CompletionParametersParam, 'enable_search' | 'temperature' | 'presence_penalty' | 'repetition_penalty' | 'top_k' | 'top_p' | 'seed' | 'stop' | 'max_tokens' | 'stream'> {
        /**
         * 生成模型
         *
         * 内置的 {@link CompletionModel} 是经过测试的，但你可以通过 [模型列表](https://help.aliyun.com/zh/dashscope/developer-reference/model-square) 测试其他支持的模型。
         */
        model: ({} & string) | CompletionModel;
        /**
         * 用户输入的指令，用于指导模型生成回复
         */
        prompt: string;
        /**
         * 流输出额外参数
         */
        stream_options?: StreamOptions | null;
        /**
         * 响应格式
         */
        response_format?: {
            type?: 'text';
        };
    }
    interface CompletionCreateParamsNonStreaming extends CompletionCreateParamsBase {
        /**
         * 启用流式输出
         *
         * 默认每次输出为当前生成的整个序列，最后一次输出为最终全部生成结果
         * 可以使用 {@link StreamOptions stream_options} 参数关闭。
         */
        stream?: false | null;
    }
    interface CompletionCreateParamsStreaming extends CompletionCreateParamsBase {
        /**
         * 启用流式输出
         *
         * 默认每次输出为当前生成的整个序列，最后一次输出为最终全部生成结果
         * 可以使用 {@link StreamOptions stream_options} 参数关闭。
         */
        stream: true;
    }
    type CompletionCreateParams = CompletionCreateParamsNonStreaming | CompletionCreateParamsStreaming;
}
export declare namespace OpenAIChatCompatibility {
    type ChatModel = DashscopeChat.ChatModel;
    interface ChatCompletionCreateParamsBase extends Pick<DashscopeCompletions.CompletionParametersParam, 'enable_search' | 'temperature' | 'presence_penalty' | 'repetition_penalty' | 'top_k' | 'top_p' | 'seed' | 'stop' | 'max_tokens' | 'stream'> {
        /**
         * 聊天模型
         *
         * 内置的 {@link ChatModel} 是经过测试的，但你可以通过 [模型列表](https://help.aliyun.com/zh/dashscope/developer-reference/model-square) 测试其他支持的模型。
         */
        model: ({} & string) | ChatModel;
        /**
         * 聊天上下文信息
         */
        messages: OpenAI.ChatCompletionMessageParam[];
        /**
         * 指定可供模型调用的工具列表
         *
         * 当输入多个工具时，模型会选择其中一个生成结果。
         */
        tools?: OpenAI.ChatCompletionTool[];
        /**
         * SDK 内部有特殊的多模型消息适配机制
         *
         * 设置为 true 可以直接采用外部传递的消息格式
         */
        raw?: boolean | null;
        /**
         * 流输出额外参数
         */
        stream_options?: OpenAICompletionsCompatibility.StreamOptions | null;
        /**
         * 响应格式
         */
        response_format?: {
            type?: 'text';
        };
    }
    interface ChatCompletionCreateParamsNonStreaming extends ChatCompletionCreateParamsBase {
        /**
         * 启用流式输出
         *
         * 默认每次输出为当前生成的整个序列，最后一次输出为最终全部生成结果
         * 可以使用 {@link ChatCompletionCreateParamsBase.stream_options stream_options} 参数关闭。
         */
        stream?: false | null;
    }
    interface ChatCompletionCreateParamsStreaming extends ChatCompletionCreateParamsBase {
        /**
         * 启用流式输出
         *
         * 默认每次输出为当前生成的整个序列，最后一次输出为最终全部生成结果
         * 可以使用 {@link ChatCompletionCreateParamsBase.stream_options stream_options} 参数关闭。
         */
        stream: true;
    }
    type ChatCompletionCreateParams = ChatCompletionCreateParamsNonStreaming | ChatCompletionCreateParamsStreaming;
}
export declare namespace OpenAIEmbeddingsCompatibility {
    interface EmbeddingCreateParams {
        /**
         * 模型
         */
        model: ({} & string) | DashscopeEmbeddings.EmbeddingModel;
        /**
         * 输入文本
         */
        input: string | Array<string> | Array<number> | Array<Array<number>>;
        /**
         * 文本转换为向量后可以应用于检索、聚类、分类等下游任务，对检索这类非对称任务为了达到更好的检索效果
         * 建议区分查询文本（query）和底库文本（document）类型,
         * 聚类、分类等对称任务可以不用特殊指定，采用系统默认值"document"即可
         *
         * @defaultValue 'query'
         */
        type?: 'query' | 'document';
    }
}
