UNPKG

@langchain/community

Version:
1 lines 6.49 kB
{"version":3,"file":"portkey.cjs","names":["_Portkey","_","BaseLLM","GenerationChunk"],"sources":["../../src/llms/portkey.ts"],"sourcesContent":["import _ from \"lodash\";\nimport { LLMOptions, Portkey as _Portkey } from \"portkey-ai\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport { GenerationChunk, LLMResult } from \"@langchain/core/outputs\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport { BaseLLM } from \"@langchain/core/language_models/llms\";\n\ninterface PortkeyOptions {\n apiKey?: string;\n baseURL?: string;\n mode?: string;\n llms?: [LLMOptions] | null;\n}\n\nconst readEnv = (env: string, default_val?: string): string | undefined =>\n getEnvironmentVariable(env) ?? default_val;\n\nexport class PortkeySession {\n portkey: _Portkey;\n\n constructor(options: PortkeyOptions = {}) {\n if (!options.apiKey) {\n options.apiKey = readEnv(\"PORTKEY_API_KEY\");\n }\n\n if (!options.baseURL) {\n options.baseURL = readEnv(\"PORTKEY_BASE_URL\", \"https://api.portkey.ai\");\n }\n\n this.portkey = new _Portkey({});\n this.portkey.llms = [{}];\n if (!options.apiKey) {\n throw new Error(\"Set Portkey ApiKey in PORTKEY_API_KEY env variable\");\n }\n\n this.portkey = new _Portkey(options);\n }\n}\n\nconst defaultPortkeySession: {\n session: PortkeySession;\n options: PortkeyOptions;\n}[] = [];\n\n/**\n * Get a session for the Portkey API. If one already exists with the same options,\n * it will be returned. Otherwise, a new session will be created.\n * @param options\n * @returns\n */\nexport function getPortkeySession(options: PortkeyOptions = {}) {\n let session = defaultPortkeySession.find((session) =>\n _.isEqual(session.options, options)\n )?.session;\n\n if (!session) {\n session = new PortkeySession(options);\n defaultPortkeySession.push({ session, options });\n }\n return session;\n}\n\n/**\n * @example\n * ```typescript\n * const model = new Portkey({\n * mode: \"single\",\n * llms: [\n * {\n * provider: \"openai\",\n * virtual_key: \"open-ai-key-1234\",\n * model: \"gpt-3.5-turbo-instruct\",\n * max_tokens: 2000,\n * },\n * ],\n * });\n *\n * // Stream the output of the model and process it\n * const res = await model.stream(\n * \"Question: Write a story about a king\\nAnswer:\"\n * );\n * for await (const i of res) {\n * process.stdout.write(i);\n * }\n * ```\n */\nexport class Portkey extends BaseLLM {\n apiKey?: string = undefined;\n\n baseURL?: string = undefined;\n\n mode?: string = undefined;\n\n llms?: [LLMOptions] | null = undefined;\n\n session: PortkeySession;\n\n constructor(init?: Partial<Portkey>) {\n super(init ?? {});\n this.apiKey = init?.apiKey;\n\n this.baseURL = init?.baseURL;\n\n this.mode = init?.mode;\n\n this.llms = init?.llms;\n\n this.session = getPortkeySession({\n apiKey: this.apiKey,\n baseURL: this.baseURL,\n llms: this.llms,\n mode: this.mode,\n });\n }\n\n _llmType() {\n return \"portkey\";\n }\n\n async _generate(\n prompts: string[],\n options: this[\"ParsedCallOptions\"],\n _?: CallbackManagerForLLMRun\n ): Promise<LLMResult> {\n const choices = [];\n for (let i = 0; i < prompts.length; i += 1) {\n const response = await this.session.portkey.completions.create({\n prompt: prompts[i],\n ...options,\n stream: false,\n });\n choices.push(response.choices);\n }\n const generations = choices.map((promptChoices) =>\n promptChoices.map((choice) => ({\n text: choice.text ?? \"\",\n generationInfo: {\n finishReason: choice.finish_reason,\n logprobs: choice.logprobs,\n },\n }))\n );\n\n return {\n generations,\n };\n }\n\n async *_streamResponseChunks(\n input: string,\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<GenerationChunk> {\n const response = await this.session.portkey.completions.create({\n prompt: input,\n ...options,\n stream: true,\n });\n for await (const data of response) {\n const choice = data?.choices[0];\n if (!choice) {\n continue;\n }\n const chunk = new GenerationChunk({\n text: choice.text ?? \"\",\n generationInfo: {\n finishReason: choice.finish_reason,\n },\n });\n yield chunk;\n // eslint-disable-next-line no-void\n void runManager?.handleLLMNewToken(chunk.text ?? \"\");\n }\n if (options.signal?.aborted) {\n throw new Error(\"AbortError\");\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAcA,MAAM,WAAW,KAAa,iBAAA,GAAA,0BAAA,wBACL,IAAI,IAAI;AAEjC,IAAa,iBAAb,MAA4B;CAC1B;CAEA,YAAY,UAA0B,EAAE,EAAE;AACxC,MAAI,CAAC,QAAQ,OACX,SAAQ,SAAS,QAAQ,kBAAkB;AAG7C,MAAI,CAAC,QAAQ,QACX,SAAQ,UAAU,QAAQ,oBAAoB,yBAAyB;AAGzE,OAAK,UAAU,IAAIA,WAAAA,QAAS,EAAE,CAAC;AAC/B,OAAK,QAAQ,OAAO,CAAC,EAAE,CAAC;AACxB,MAAI,CAAC,QAAQ,OACX,OAAM,IAAI,MAAM,qDAAqD;AAGvE,OAAK,UAAU,IAAIA,WAAAA,QAAS,QAAQ;;;AAIxC,MAAM,wBAGA,EAAE;;;;;;;AAQR,SAAgB,kBAAkB,UAA0B,EAAE,EAAE;CAC9D,IAAI,UAAU,sBAAsB,MAAM,YACxCC,OAAAA,QAAE,QAAQ,QAAQ,SAAS,QAAQ,CACpC,EAAE;AAEH,KAAI,CAAC,SAAS;AACZ,YAAU,IAAI,eAAe,QAAQ;AACrC,wBAAsB,KAAK;GAAE;GAAS;GAAS,CAAC;;AAElD,QAAO;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BT,IAAa,UAAb,cAA6BC,qCAAAA,QAAQ;CACnC,SAAkB,KAAA;CAElB,UAAmB,KAAA;CAEnB,OAAgB,KAAA;CAEhB,OAA6B,KAAA;CAE7B;CAEA,YAAY,MAAyB;AACnC,QAAM,QAAQ,EAAE,CAAC;AACjB,OAAK,SAAS,MAAM;AAEpB,OAAK,UAAU,MAAM;AAErB,OAAK,OAAO,MAAM;AAElB,OAAK,OAAO,MAAM;AAElB,OAAK,UAAU,kBAAkB;GAC/B,QAAQ,KAAK;GACb,SAAS,KAAK;GACd,MAAM,KAAK;GACX,MAAM,KAAK;GACZ,CAAC;;CAGJ,WAAW;AACT,SAAO;;CAGT,MAAM,UACJ,SACA,SACA,GACoB;EACpB,MAAM,UAAU,EAAE;AAClB,OAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK,GAAG;GAC1C,MAAM,WAAW,MAAM,KAAK,QAAQ,QAAQ,YAAY,OAAO;IAC7D,QAAQ,QAAQ;IAChB,GAAG;IACH,QAAQ;IACT,CAAC;AACF,WAAQ,KAAK,SAAS,QAAQ;;AAYhC,SAAO,EACL,aAXkB,QAAQ,KAAK,kBAC/B,cAAc,KAAK,YAAY;GAC7B,MAAM,OAAO,QAAQ;GACrB,gBAAgB;IACd,cAAc,OAAO;IACrB,UAAU,OAAO;IAClB;GACF,EAAE,CACJ,EAIA;;CAGH,OAAO,sBACL,OACA,SACA,YACiC;EACjC,MAAM,WAAW,MAAM,KAAK,QAAQ,QAAQ,YAAY,OAAO;GAC7D,QAAQ;GACR,GAAG;GACH,QAAQ;GACT,CAAC;AACF,aAAW,MAAM,QAAQ,UAAU;GACjC,MAAM,SAAS,MAAM,QAAQ;AAC7B,OAAI,CAAC,OACH;GAEF,MAAM,QAAQ,IAAIC,wBAAAA,gBAAgB;IAChC,MAAM,OAAO,QAAQ;IACrB,gBAAgB,EACd,cAAc,OAAO,eACtB;IACF,CAAC;AACF,SAAM;AAED,eAAY,kBAAkB,MAAM,QAAQ,GAAG;;AAEtD,MAAI,QAAQ,QAAQ,QAClB,OAAM,IAAI,MAAM,aAAa"}