@langchain/community
Version:
Third-party integrations for LangChain.js
117 lines (116 loc) • 3.88 kB
JavaScript
import { __exportAll } from "../_virtual/_rolldown/runtime.js";
import { getPortkeySession } from "../llms/portkey.js";
import { BaseChatModel } from "@langchain/core/language_models/chat_models";
import { AIMessage, AIMessageChunk, ChatMessage, ChatMessageChunk, FunctionMessageChunk, HumanMessage, HumanMessageChunk, SystemMessage, SystemMessageChunk } from "@langchain/core/messages";
import { ChatGenerationChunk } from "@langchain/core/outputs";
//#region src/chat_models/portkey.ts
var portkey_exports = /* @__PURE__ */ __exportAll({ PortkeyChat: () => PortkeyChat });
function portkeyResponseToChatMessage(message) {
switch (message.role) {
case "user": return new HumanMessage(message.content || "");
case "assistant": return new AIMessage(message.content || "");
case "system": return new SystemMessage(message.content || "");
default: return new ChatMessage(message.content || "", message.role ?? "unknown");
}
}
function _convertDeltaToMessageChunk(delta) {
const { role } = delta;
const content = delta.content ?? "";
let additional_kwargs;
if (delta.function_call) additional_kwargs = { function_call: delta.function_call };
else additional_kwargs = {};
if (role === "user") return new HumanMessageChunk({ content });
else if (role === "assistant") return new AIMessageChunk({
content,
additional_kwargs
});
else if (role === "system") return new SystemMessageChunk({ content });
else if (role === "function") return new FunctionMessageChunk({
content,
additional_kwargs,
name: delta.name
});
else return new ChatMessageChunk({
content,
role
});
}
var PortkeyChat = class extends BaseChatModel {
apiKey = void 0;
baseURL = void 0;
mode = void 0;
llms = void 0;
session;
constructor(init) {
super(init ?? {});
this.apiKey = init?.apiKey;
this.baseURL = init?.baseURL;
this.mode = init?.mode;
this.llms = init?.llms;
this.session = getPortkeySession({
apiKey: this.apiKey,
baseURL: this.baseURL,
llms: this.llms,
mode: this.mode
});
}
_llmType() {
return "portkey";
}
async _generate(messages, options, _) {
const messagesList = messages.map((message) => {
if (typeof message.content !== "string") throw new Error("PortkeyChat does not support non-string message content.");
return {
role: message._getType(),
content: message.content
};
});
const response = await this.session.portkey.chatCompletions.create({
messages: messagesList,
...options,
stream: false
});
const generations = [];
for (const data of response.choices ?? []) {
const generation = {
text: data.message?.content ?? "",
message: portkeyResponseToChatMessage(data.message ?? {})
};
if (data.finish_reason) generation.generationInfo = { finish_reason: data.finish_reason };
generations.push(generation);
}
return { generations };
}
async *_streamResponseChunks(messages, options, runManager) {
const messagesList = messages.map((message) => {
if (typeof message.content !== "string") throw new Error("PortkeyChat does not support non-string message content.");
return {
role: message._getType(),
content: message.content
};
});
const response = await this.session.portkey.chatCompletions.create({
messages: messagesList,
...options,
stream: true
});
for await (const data of response) {
const choice = data?.choices[0];
if (!choice) continue;
const chunk = new ChatGenerationChunk({
message: _convertDeltaToMessageChunk(choice.delta ?? {}),
text: choice.message?.content ?? "",
generationInfo: { finishReason: choice.finish_reason }
});
yield chunk;
runManager?.handleLLMNewToken(chunk.text ?? "");
}
if (options.signal?.aborted) throw new Error("AbortError");
}
_combineLLMOutput() {
return {};
}
};
//#endregion
export { PortkeyChat, portkey_exports };
//# sourceMappingURL=portkey.js.map