{"version":3,"sources":["../lib/index.ts","../lib/zhipu-ai.ts","../lib/core/jwt.ts","../lib/core/request.ts","../lib/core/baseApi.ts","../lib/capability/completions.ts","../lib/capability/images.ts","../lib/capability/embeddings.ts","../lib/capability/files.ts"],"sourcesContent":["export { default as ZhipuAI } from \"./zhipu-ai.js\"\nexport { default } from \"./zhipu-ai.js\"\nexport { Completions, Images, Embeddings } from \"./capability/index.js\"","import assert from \"assert\"\nimport { generateToken } from \"./core/jwt.js\"\nimport Request from \"./core/request.js\"\nimport { Completions, Images, Embeddings } from \"./capability\"\nimport {\n    CompletionsResponseMessage, CreateCompletionsOptions,\n    CreateImagesOptions, ImagesResponse,\n    CreateEmbeddingsOptions, EmbeddingsResponse,\n    CreateFileOptions, FileResponse, FileListResponse, FindFileListOptions,\n} from \"./types\"\nimport Files from \"./capability/files.js\"\nimport { IncomingMessage } from \"http\"\n\nexport type ZhipuAIOptions = {\n    apiKey?: string,\n    baseUrl?: string,\n    timeout?: number,\n    maxRetries?: number,\n    customHeaders?: object,\n    cacheToken?: boolean\n}\n\nexport class ZhipuAI {\n    public __esModule = false\n    public request: Request\n    public completions: Completions\n    public images: Images\n    public embeddings: Embeddings\n    public files: Files\n    private apiKey: string\n\n\n    constructor(private readonly options: ZhipuAIOptions = {}) {\n        this.apiKey = process.env['ZHIPUAI_API_KEY'] || ''\n        if (options.apiKey) {\n            this.apiKey = options.apiKey\n        }\n\n        assert.ok(this.apiKey, \"未提供api_key，请通过参数或环境变量提供\")\n        if (!options.baseUrl) options.baseUrl = process.env[\"ZHIPUAI_BASE_URL\"] || ''\n        if (!options.baseUrl) options.baseUrl = \"https://open.bigmodel.cn/api/paas/v4\"\n        options.cacheToken = options.cacheToken ?? true\n        this.request = new Request({\n            timeout: options.timeout,\n            headers: options.customHeaders,\n            baseURL: options.baseUrl\n        }, this.authHeaders.bind(this));\n\n        this.completions = new Completions(this.request)\n        this.images = new Images(this.request)\n        this.embeddings = new Embeddings(this.request)\n        this.files = new Files(this.request)\n    }\n\n    public async createCompletions(options: CreateCompletionsOptions): Promise<CompletionsResponseMessage | IncomingMessage> {\n        return this.completions.create(options);\n    }\n\n    public async createImages(options: CreateImagesOptions): Promise<ImagesResponse> {\n        return this.images.create(options)\n    }\n\n    public async createEmbeddings(options: CreateEmbeddingsOptions): Promise<EmbeddingsResponse> {\n        return this.embeddings.create(options)\n    }\n\n    public async createFiles(options: CreateFileOptions): Promise<FileResponse> {\n        return this.files.create(options)\n    }\n\n    public async findFiles(options: FindFileListOptions = {}): Promise<FileListResponse> {\n        return this.files.findList(options)\n    }\n\n    public authHeaders(): { [key: string]: string } {\n        const token = generateToken(this.apiKey, this.options.cacheToken)\n        return { \"Authorization\": token }\n    }\n}\n\nexport default ZhipuAI","import jsonwebtoken from \"jsonwebtoken\"\n\nconst API_TOKEN_TTL_SECONDS = 3 * 60\nconst CACHE_TTL_SECONDS = API_TOKEN_TTL_SECONDS - 30\nconst tokenCache: {\n    [key: string]: {\n        token: string,\n        createAt: number\n    }\n} = {}\n\nexport const generateToken = (apiSecretKey: string, cache: boolean = true): string => {\n    try {\n        if (tokenCache[apiSecretKey] && Date.now() - tokenCache[apiSecretKey].createAt < (CACHE_TTL_SECONDS * 1000)) {\n            return tokenCache[apiSecretKey].token\n        }\n\n        const [apiKey, secret] = apiSecretKey.split(\".\")\n        const payload = {\n            \"api_key\": apiKey,\n            \"exp\": Math.round(Date.now() * 1000) + API_TOKEN_TTL_SECONDS * 1000,\n            \"timestamp\": Math.round(Date.now() * 1000),\n        }\n        // algorithm = \"HS256\", headers = { \"alg\": \"HS256\", \"sign_type\": \"SIGN\" }\n        //@ts-ignore 不用管\n        const ret = jsonwebtoken.sign(payload, secret, {\n            algorithm: \"HS256\",\n            header: { alg: \"HS256\", sign_type: \"SIGN\" }\n        })\n        if (cache) {\n            tokenCache[apiSecretKey] = {\n                token: ret,\n                createAt: Date.now()\n            }\n        }\n        return ret\n    } catch (e) {\n        throw \"invalid api_key\"\n    }\n}\n","import Axios, { AxiosInstance, CreateAxiosDefaults, AxiosResponse, AxiosRequestConfig, AxiosHeaderValue } from \"axios\";\n\nexport default class Request {\n    public request: AxiosInstance\n\n    constructor(config: CreateAxiosDefaults, authHeaders: () => { [key: string]: AxiosHeaderValue }) {\n        this.request = Axios.create(config)\n\n        this.request.interceptors.request.use((config) => {\n            config.headers.set(authHeaders())\n            return config;\n        })\n    }\n\n    async post<T = any, R = T | any, D = any>(url: string, data?: D, config?: AxiosRequestConfig<D>): Promise<R> {\n        return this.request.post(url, data, config).then(res => res.data)\n    }\n\n    async postForm<T = any, R = T | any, D = object>(url: string, data: D, config?: AxiosRequestConfig<D>): Promise<R> {\n        return this.request.post(url, data, config).then(res => res.data)\n    }\n\n    async get<T = any, R = T | any, D = any>(url: string, config?: AxiosRequestConfig<D>): Promise<R> {\n        return this.request.get(url, config).then(res => res.data)\n    }\n\n    async put<T = any, R = T | any, D = any>(url: string, data?: D, config?: AxiosRequestConfig<D>): Promise<R> {\n        return this.request.put(url, data, config).then(res => res.data)\n    }\n\n    async delete<T = any, R = T | any, D = any>(url: string, config?: AxiosRequestConfig<D>): Promise<R> {\n        return this.request.delete(url, config).then(res => res.data)\n    }\n}","import Request from \"./request.js\";\nexport default class BaseApi {\n    constructor(protected readonly request: Request) {\n    }\n\n    protected processError(err: any) {\n        const data = err?.response?.data ?? err\n        return Promise.reject(data)\n    }\n} ","import BaseApi from \"../core/baseApi.js\";\nimport { CreateCompletionsOptions, CompletionsResponseMessage } from \"../types/index.js\";\nimport { IncomingMessage } from \"http\";\n\nexport default class Completions extends BaseApi {\n    public async create(options: CreateCompletionsOptions): Promise<CompletionsResponseMessage | IncomingMessage> {\n        return this.request.post(\"/chat/completions\", {\n            \"model\": options.model,\n            \"request_id\": options.requestId,\n            \"temperature\": options.temperature,\n            \"top_p\": options.topP,\n            \"do_sample\": options.doSample,\n            \"max_tokens\": options.maxTokens,\n            \"seed\": options.seed,\n            \"messages\": options.messages,\n            \"stop\": options.stop,\n            \"sensitive_word_check\": options.sensitiveWordCheck,\n            \"stream\": options.stream,\n            \"tools\": options.tools,\n            \"tool_choice\": options.toolChoice,\n        }, {\n            headers: options.extraHeaders,\n            timeout: options.timeout,\n            responseType: options.stream ? 'stream' : 'json'\n        })\n            .catch(this.processError)\n    }\n} ","import BaseApi from \"../core/baseApi.js\";\nimport { CreateImagesOptions, ImagesResponse } from \"../types/index.js\";\n\nexport default class Images extends BaseApi {\n    public async create(options: CreateImagesOptions): Promise<ImagesResponse> {\n        return this.request.post(\"/images/generations\", {\n            \"prompt\": options.prompt,\n            \"model\": options.model,\n            \"n\": options.n,\n            \"quality\": options.quality,\n            \"response_format\": options.responseFormat,\n            \"size\": options.size,\n            \"style\": options.style,\n            \"user\": options.user,\n        }, {\n            headers: options.extraHeaders,\n            timeout: options.timeout,\n            responseType: options.stream ? 'stream' : 'json'\n        })\n            .catch(this.processError)\n    }\n} ","import BaseApi from \"../core/baseApi.js\";\nimport { CreateEmbeddingsOptions, EmbeddingsResponse } from \"../types/index.js\";\n\nexport default class Embeddings extends BaseApi {\n    public async create(options: CreateEmbeddingsOptions): Promise<EmbeddingsResponse> {\n        return this.request.post(\"/embeddings\", {\n            \"input\": options.input,\n            \"model\": options.model,\n            \"encoding_format\": options.encodingFormat,\n            \"user\": options.user,\n            \"sensitive_word_check\": options.sensitiveWordCheck,\n        }, {\n            headers: options.extraHeaders,\n            timeout: options.timeout,\n            responseType: options.stream ? 'stream' : 'json'\n        })\n            .catch(this.processError)\n    }\n} ","import BaseApi from \"../core/baseApi.js\";\nimport { CreateFileOptions, FileResponse, FindFileListOptions, FileListResponse } from \"../types/index.js\";\n\nexport default class Files extends BaseApi {\n    public async create(options: CreateFileOptions): Promise<FileResponse> {\n        const formData = new FormData()\n        formData.append(\"purpose\", options.purpose);\n        formData.append(\"file\", options.file);\n        return this.request.postForm(\"/files\", formData, options)\n            .catch(this.processError)\n    }\n\n    public async findList(options: FindFileListOptions): Promise<FileListResponse> {\n        return this.request.get(\"/files\", {\n            params: {\n                \"purpose\": options.purpose,\n                \"limit\": options.limit,\n                \"after\": options.after,\n                \"order\": options.order,\n            },\n            headers: options.extraHeaders,\n            timeout: options.timeout,\n            responseType: options.stream ? 'stream' : 'json'\n        })\n    }\n} "],"mappings":"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","names":["jsonwebtoken","Axios","config","assert"]}