
import { EmbeddingItem } from '@azure/openai';
import axios from 'axios';

export interface ApiResult {
    /**
     * return the result of api called
     * @type {boolean}
     */
    'successed': boolean
    /**
     * The error info 
     * @type {any}
     * @memberof ChatReponse
     */
    'error'?: any;
}
/**
 * Api封装后的返回结果
 */
export interface ChatReponse extends ApiResult {

    /**
     * The name of the user in a multi-user chat
     * @type {Array<any>}
     * @memberof ChatReponse
     */
    'message'?: Array<any>;
    'usage'?: any;
}
/**
 * 调用OpenAI Api的参数约定
 */
export interface OpenAIApiParameters {
    'embedding'?: string,       ///模型引擎，兼容Azure
    'model'?: string,      ///模型名称
    'maxtoken'?: number;    ///返回的最大token
    'temperature'?: number;
    'top_p'?: number;
    'presence_penalty'?: number;
    'frequency_penalty'?: number;
    'replyCounts'?: number;  ///返回多少答案
    'tools'?: Array<any>,
    'tool_choice'?: string,
    'enableToolCall'?: number ///是否允许调用toolfunction
}
/**
 * Azure 上的OpenAI的链接参数
 */
export interface ProxyPatameters {
    'serviceurl': string;  ///端点
}

/**
 * OpenAI Proxy 链接参数
 */
export interface AzureOpenAIPatameters {
    'endpoint': string;  ///端点
    'engine': string;    ///GPT部署的项目名称
    'embedding'?: string;  ///向量引擎项目名称
    'version'?: string;   ///Api 版本
}

/**
 * 调用OpenAI Api的向量约定
 */
export interface EmbeddingResult extends ApiResult {
    'embedding'?: EmbeddingItem[],
}
/**
 * 远程请求的返回
 */
export interface RpcResult extends ApiResult {
    'data'?: any;
}

/**
 * Axios远程请求封装
 * @param opts 
 * @returns 
 */
export async function request(opts: any = {}): Promise<RpcResult> {
    if (!opts.data) opts.data = opts.body;
    try {
        let result = await axios(opts);
        return { successed: true, data: result.data }
    } catch (err) {
        return { successed: false, error: err, data: err }
    }
}
/**
 * 
 * @param opts 
 * @returns 
 */
export function requestStream(opts: any = {},processChunkData:Function) {
    if (!opts.data) opts.data = opts.body;
    axios(opts)
    .then((res: any) => {
        res.data.on('data', (chunk: any) => {
            processChunkData(chunk);
        });
    })
}


/**
 * 数据缓存提供者接口
 */
export interface CacheProvider {
    /**
     * 缓存数据
     * @param key 数据的键名称
     * @param value 数据的键值
     */
    set(key: string, value: string | object, exp?: number): void;
    /**
     * 从缓存中读取数据
     * @param key 数据的键名称
     */
    get(key: string): Promise<string | null>;


    /**
     * 删除缓存信息
     * @param key 数据的键名称
     */
    delete(key: string): void;

}


export interface StabilityOption {
    'cfg_scale'?: number,
    'clip_guidance_preset'?: string,
    'height'?: number,
    'width'?: number,
    'samples'?: number,
    'seed'?: number,
    'steps'?: number,
    'sampler'?: string,
    'negative'?: string,
    'engine'?: string,
    'endpoint'?: string
    'denoising_strength'?: number,
    'hr_scale'?: number
}

export interface StabilityResult extends ApiResult {
    'data'?: any;
    'type'?: string;
}