@maximai/maxim-js
Version:
Maxim AI JS SDK. Visit https://getmaxim.ai for more info.
455 lines • 20.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseLangchainModelAndParameters = parseLangchainModelAndParameters;
exports.determineProvider = determineProvider;
exports.parseMessage = parseMessage;
exports.convertLLMResultToCompletionResult = convertLLMResultToCompletionResult;
exports.parseTokenUsageForResult = parseTokenUsageForResult;
exports.parseLangchainErrorToMaximError = parseLangchainErrorToMaximError;
exports.maybeParseJSON = maybeParseJSON;
exports.parseLangchainMessages = parseLangchainMessages;
exports.parseLangchainTags = parseLangchainTags;
exports.addParsedTagsToLogger = addParsedTagsToLogger;
const messages_1 = require("@langchain/core/messages");
const uuid_1 = require("uuid");
function parseLangchainModelAndParameters(metadata, extraParams) {
let modelParams = (extraParams === null || extraParams === void 0 ? void 0 : extraParams["invocation_params"]) || {};
if ("inferenceConfig" in modelParams && typeof modelParams["inferenceConfig"] === "object") {
const { inferenceConfig, ...rest } = modelParams;
modelParams = { ...inferenceConfig, ...rest };
}
let model = "unknown";
if ("model_name" in modelParams) {
model = modelParams["model_name"];
modelParams === null || modelParams === void 0 ? true : delete modelParams["model_name"];
}
else if ("model" in modelParams) {
model = modelParams["model"];
modelParams === null || modelParams === void 0 ? true : delete modelParams["model"];
}
else if ("model_id" in modelParams) {
model = modelParams["model_id"];
modelParams === null || modelParams === void 0 ? true : delete modelParams["model_id"];
}
if (model === "unknown") {
if (metadata && "ls_model_name" in metadata && typeof metadata["ls_model_name"] === "string") {
model = metadata["ls_model_name"];
}
}
return [model, { ...modelParams }];
}
function determineProvider(ids, metadata) {
const mapper = (param) => {
if (param.includes("azure"))
return "azure";
if (param.includes("azure_openai"))
return "azure";
if (param.includes("amazon_bedrock"))
return "bedrock";
if (param.includes("bedrock"))
return "bedrock";
if (param.includes("huggingface"))
return "huggingface";
if (param.includes("together"))
return "together";
if (param.includes("openai"))
return "openai";
if (param.includes("anthropic"))
return "anthropic";
if (param.includes("google"))
return "google";
if (param.includes("groq"))
return "groq";
return null;
};
const provider = mapper(ids);
if (provider !== null) {
return provider;
}
if (metadata && "ls_provider" in metadata && typeof metadata["ls_provider"] === "string") {
const lsProvider = metadata["ls_provider"];
const provider = mapper(lsProvider);
if (provider !== null) {
return provider;
}
}
return "openai";
}
function parseMessage(generation) {
var _a;
if (!("message" in generation)) {
return undefined;
}
const message = generation.message;
if (!message) {
return undefined;
}
let toolCalls = undefined;
if ((0, messages_1.isAIMessage)(message)) {
const aiMessage = new messages_1.AIMessage(message);
toolCalls = (_a = aiMessage["tool_calls"]) === null || _a === void 0 ? void 0 : _a.map((toolCall) => {
return {
type: "function",
id: toolCall.id,
function: {
name: toolCall.name,
arguments: JSON.stringify(toolCall.args),
},
};
});
}
return {
role: "assistant",
content: typeof message.content === "string" ? message.content : JSON.stringify(message.content),
tool_calls: toolCalls,
function_call: toolCalls,
};
}
function convertLLMResultToCompletionResult(result) {
var _a, _b, _c, _d;
let model = "unknown";
if (result.generations.length === 0) {
return {
id: (0, uuid_1.v4)(),
object: "chat_completion",
created: Math.floor(Date.now() / 1000),
model,
choices: [],
usage: {
prompt_tokens: 0,
completion_tokens: 0,
total_tokens: 0,
},
};
}
let finishReason = "stop";
if ((_a = result.llmOutput) === null || _a === void 0 ? void 0 : _a["stop_reason"]) {
finishReason = result.llmOutput["stop_reason"];
}
const choices = result.generations[0].map((gen, index) => {
var _a, _b;
return ({
index,
text: gen.text.trim() === "" ? undefined : gen.text.trim(),
message: parseMessage(gen),
logprobs: null,
finish_reason: (_b = (_a = gen.generationInfo) === null || _a === void 0 ? void 0 : _a["finish_reason"]) !== null && _b !== void 0 ? _b : finishReason,
});
});
const [gen] = result.generations[0];
if ("message" in gen) {
const message = gen.message;
model = (_c = (_b = message.response_metadata) === null || _b === void 0 ? void 0 : _b["model_name"]) !== null && _c !== void 0 ? _c : "unknown";
}
return {
id: (0, uuid_1.v4)(),
object: ((_d = choices === null || choices === void 0 ? void 0 : choices[0]) === null || _d === void 0 ? void 0 : _d.text) ? "text_completion" : "chat_completion",
created: Math.floor(Date.now() / 1000),
model: model,
choices,
usage: parseTokenUsageForResult(result),
};
}
function parseTokenUsageForResult(result) {
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7;
let usage = (_a = result.llmOutput) === null || _a === void 0 ? void 0 : _a["tokenUsage"];
if (usage) {
const promptTokens = (_b = usage.promptTokens) !== null && _b !== void 0 ? _b : 0;
const completionTokens = (_c = usage.completionTokens) !== null && _c !== void 0 ? _c : 0;
const totalTokens = promptTokens + completionTokens;
return {
prompt_tokens: promptTokens,
completion_tokens: completionTokens,
total_tokens: totalTokens,
};
}
const llm_usage = (_d = result.llmOutput) === null || _d === void 0 ? void 0 : _d["usage"];
if (llm_usage) {
if (llm_usage.input_tokens !== undefined) {
usage = {
prompt_tokens: (_e = llm_usage.input_tokens) !== null && _e !== void 0 ? _e : 0,
completion_tokens: (_f = llm_usage.output_tokens) !== null && _f !== void 0 ? _f : 0,
total_tokens: ((_g = llm_usage.input_tokens) !== null && _g !== void 0 ? _g : 0) + ((_h = llm_usage.output_tokens) !== null && _h !== void 0 ? _h : 0),
};
}
else if (llm_usage.prompt_tokens !== undefined) {
usage = {
prompt_tokens: (_j = llm_usage.prompt_tokens) !== null && _j !== void 0 ? _j : 0,
completion_tokens: (_k = llm_usage.completion_tokens) !== null && _k !== void 0 ? _k : 0,
total_tokens: ((_l = llm_usage.prompt_tokens) !== null && _l !== void 0 ? _l : 0) + ((_m = llm_usage.completion_tokens) !== null && _m !== void 0 ? _m : 0),
};
}
}
if (usage) {
return usage;
}
let prompt_tokens = 0;
let output_tokens = 0;
let total_tokens = 0;
const generations = result.generations;
if (generations) {
for (const generation of generations) {
for (const gen of generation) {
const message = "message" in gen ? gen.message : undefined;
const usage_data = message === null || message === void 0 ? void 0 : message.usage_metadata;
if (usage_data) {
if (usage_data.input_tokens !== undefined) {
prompt_tokens += (_o = usage_data.input_tokens) !== null && _o !== void 0 ? _o : 0;
output_tokens += (_p = usage_data.output_tokens) !== null && _p !== void 0 ? _p : 0;
total_tokens += ((_q = usage_data.input_tokens) !== null && _q !== void 0 ? _q : 0) + ((_r = usage_data.output_tokens) !== null && _r !== void 0 ? _r : 0);
continue;
}
else if (usage_data.prompt_tokens !== undefined) {
prompt_tokens += (_s = usage_data.prompt_tokens) !== null && _s !== void 0 ? _s : 0;
output_tokens += (_t = usage_data.completion_tokens) !== null && _t !== void 0 ? _t : 0;
total_tokens += ((_u = usage_data.prompt_tokens) !== null && _u !== void 0 ? _u : 0) + ((_v = usage_data.completion_tokens) !== null && _v !== void 0 ? _v : 0);
continue;
}
}
const resp_metadata = message === null || message === void 0 ? void 0 : message.response_metadata;
if (resp_metadata) {
const metadata_usage = resp_metadata.usage;
if (metadata_usage) {
if (metadata_usage.input_tokens !== undefined) {
prompt_tokens += (_w = metadata_usage.input_tokens) !== null && _w !== void 0 ? _w : 0;
output_tokens += (_x = metadata_usage.output_tokens) !== null && _x !== void 0 ? _x : 0;
total_tokens += ((_y = metadata_usage.input_tokens) !== null && _y !== void 0 ? _y : 0) + ((_z = metadata_usage.output_tokens) !== null && _z !== void 0 ? _z : 0);
continue;
}
else if (metadata_usage.prompt_tokens !== undefined) {
prompt_tokens += (_0 = metadata_usage.prompt_tokens) !== null && _0 !== void 0 ? _0 : 0;
output_tokens += (_1 = metadata_usage.completion_tokens) !== null && _1 !== void 0 ? _1 : 0;
total_tokens += ((_2 = metadata_usage.prompt_tokens) !== null && _2 !== void 0 ? _2 : 0) + ((_3 = metadata_usage.completion_tokens) !== null && _3 !== void 0 ? _3 : 0);
continue;
}
}
const bedrock_usage = resp_metadata["amazon-bedrock-invocationMetrics"];
if (bedrock_usage) {
prompt_tokens += (_4 = bedrock_usage.inputTokenCount) !== null && _4 !== void 0 ? _4 : 0;
output_tokens += (_5 = bedrock_usage.outputTokenCount) !== null && _5 !== void 0 ? _5 : 0;
total_tokens += ((_6 = bedrock_usage.inputTokenCount) !== null && _6 !== void 0 ? _6 : 0) + ((_7 = bedrock_usage.outputTokenCount) !== null && _7 !== void 0 ? _7 : 0);
}
}
}
}
}
return {
prompt_tokens,
completion_tokens: output_tokens,
total_tokens,
};
}
function parseLangchainErrorToMaximError(error) {
if (error instanceof Error) {
return {
message: error.message,
type: error.name,
code: error.code,
};
}
else if (typeof error === "object" && error !== null) {
const errorObj = error;
return {
message: String(errorObj["message"] || "Unknown error"),
type: String(errorObj["type"] || errorObj["name"] || "Unknown"),
code: errorObj["code"] ? String(errorObj["code"]) : undefined,
};
}
else if (typeof error === "string") {
return {
message: error,
type: "Unknown",
};
}
else {
return {
message: "An unknown error occurred",
type: "Unknown",
};
}
}
function maybeParseJSON(input = "") {
try {
return JSON.parse(input);
}
catch (e) {
return input;
}
}
function parseLangchainMessages(input, defaultRole = "user") {
try {
const messages = [];
if (Array.isArray(input[0])) {
input.forEach((messageList) => {
messageList.forEach((message) => {
var _a;
if (typeof message === "string") {
return;
}
try {
if ((0, messages_1.isBaseMessage)(message)) {
try {
if ((0, messages_1.isSystemMessage)(message)) {
messages.push({ role: "system", content: message.content });
return;
}
}
catch (err) { }
try {
if ((0, messages_1.isHumanMessage)(message)) {
messages.push({ role: "user", content: message.content });
return;
}
}
catch (err) { }
try {
if ((0, messages_1.isAIMessage)(message)) {
messages.push({
role: "assistant",
content: message.content,
tool_calls: (_a = message.tool_calls) === null || _a === void 0 ? void 0 : _a.map((tc) => {
var _a, _b;
return ({
id: (_a = tc.id) !== null && _a !== void 0 ? _a : "",
type: (_b = tc.type) !== null && _b !== void 0 ? _b : "",
function: {
name: tc.name,
arguments: typeof tc.args === "string" ? tc.args : JSON.stringify(tc.args),
},
});
}),
});
return;
}
}
catch (err) { }
try {
if ((0, messages_1.isChatMessage)(message)) {
messages.push({
role: "assistant",
content: message.content,
});
return;
}
}
catch (err) { }
try {
if ((0, messages_1.isToolMessage)(message)) {
messages.push({
role: "tool",
content: message.content,
tool_call_id: message.tool_call_id,
});
return;
}
}
catch (err) { }
try {
if ((0, messages_1.isFunctionMessage)(message)) {
messages.push({
role: "function",
content: message.content,
});
return;
}
}
catch (err) { }
console.error(`[Maxim SDK] Invalid message type: ${message.getType()}`, { message });
}
else {
console.error(`[Maxim SDK] Invalid message: The message is not of type BaseMessage`, { message });
}
}
catch (err) {
console.error(`[Maxim SDK] Invalid message: The message is not of type BaseMessage`, { message });
}
});
});
}
else {
const delimiterToRole = {
System: "system",
Human: "user",
User: "user",
Assistant: "assistant",
Model: "assistant",
Tool: "tool",
Function: "function",
};
input.forEach((message) => {
if (typeof message !== "string") {
console.error(`Invalid message type: ${typeof message}`);
throw new Error(`Invalid message type: ${typeof message}`);
}
const pattern = /(System:|Human:|User:|Assistant:|Model:|Tool:|Function:)/;
const splits = message.split(pattern).filter((s) => s.trim());
for (let i = 0; i < splits.length; i += 2) {
if (i + 1 < splits.length) {
const delimiter = splits[i].replace(":", "").trim();
const content = splits[i + 1].trim();
messages.push({
role: delimiterToRole[delimiter] || "user",
content: maybeParseJSON(content),
});
}
else {
if (splits[i].indexOf(":") === -1) {
messages.push({
role: delimiterToRole[defaultRole] || "user",
content: maybeParseJSON(splits[i]),
});
}
else {
const delimiter = splits[i].replace(":", "").trim();
messages.push({
role: delimiterToRole[delimiter] || "user",
content: "",
});
}
}
}
});
}
return messages;
}
catch (e) {
console.error(`Error parsing messages: ${e}`);
throw new Error(`Error parsing messages: ${e}`);
}
}
function parseLangchainTags(maximMetadataTags, langchainTags) {
const result = {
...(maximMetadataTags !== null && maximMetadataTags !== void 0 ? maximMetadataTags : {}),
};
if (langchainTags) {
langchainTags.forEach((tag) => {
let key;
let value;
if (tag.includes(":")) {
const [tagKey, tagValue] = tag.split(":", 2);
key = (tagKey === null || tagKey === void 0 ? void 0 : tagKey.trim()) || tag;
value = (tagValue === null || tagValue === void 0 ? void 0 : tagValue.trim()) || "From MaximLangchainTracer";
}
else if (tag.includes("=")) {
const [tagKey, tagValue] = tag.split("=", 2);
key = (tagKey === null || tagKey === void 0 ? void 0 : tagKey.trim()) || tag;
value = (tagValue === null || tagValue === void 0 ? void 0 : tagValue.trim()) || "From MaximLangchainTracer";
}
else {
key = tag;
value = "From MaximLangchainTracer";
}
result[key] = value;
});
}
return result;
}
function addParsedTagsToLogger(tags, addTagFunction) {
if (!tags)
return;
const parsedTags = parseLangchainTags(undefined, tags);
Object.entries(parsedTags).forEach(([key, value]) => {
addTagFunction(key, value);
});
}
//# sourceMappingURL=utils.js.map