@maximai/maxim-js
Version:
Maxim AI JS SDK. Visit https://getmaxim.ai for more info.
177 lines • 7.55 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Generation = void 0;
const utils_1 = require("../utils");
const base_1 = require("./base");
const types_1 = require("./types");
class Generation extends base_1.EvaluatableBaseContainer {
constructor(config, writer) {
const [processedMessages, attachments] = parseAttachmentsFromMessages(config.messages);
const processedConfig = {
...config,
messages: processedMessages,
};
super(types_1.Entity.GENERATION, processedConfig, writer);
this.model = config.model;
this.provider = config.provider;
this.maximPromptId = config.maximPromptId;
this.modelParameters = config.modelParameters;
for (const attachment of attachments) {
this.addAttachment(attachment);
}
}
setModel(model) {
this.model = model;
this.commit("update", { model });
}
static setModel_(writer, id, model) {
base_1.EvaluatableBaseContainer.commit_(writer, types_1.Entity.GENERATION, id, "update", { model });
}
addMessages(messages) {
const [processedMessages, attachments] = parseAttachmentsFromMessages(messages);
this.commit("update", { messages: processedMessages });
for (const attachment of attachments) {
this.addAttachment(attachment);
}
}
static addMessages_(writer, id, messages) {
const [processedMessages, attachments] = parseAttachmentsFromMessages(messages);
base_1.EvaluatableBaseContainer.commit_(writer, types_1.Entity.GENERATION, id, "update", { messages: processedMessages });
for (const attachment of attachments) {
Generation.addAttachment_(writer, id, attachment);
}
}
setModelParameters(modelParameters) {
this.commit("update", { modelParameters });
}
static setModelParameters_(writer, id, modelParameters) {
base_1.EvaluatableBaseContainer.commit_(writer, types_1.Entity.GENERATION, id, "update", { modelParameters });
}
result(result) {
this.commit("result", { result });
this.end();
}
static result_(writer, id, result) {
base_1.EvaluatableBaseContainer.commit_(writer, types_1.Entity.GENERATION, id, "result", { result });
base_1.EvaluatableBaseContainer.end_(writer, types_1.Entity.GENERATION, id, { endTimestamp: (0, utils_1.utcNow)() });
}
error(error) {
this.commit("result", { result: { error: error, id: (0, utils_1.uniqueId)() } });
this.end();
}
static error_(writer, id, error) {
base_1.EvaluatableBaseContainer.commit_(writer, types_1.Entity.GENERATION, id, "result", { result: { error: error, id: (0, utils_1.uniqueId)() } });
base_1.EvaluatableBaseContainer.end_(writer, types_1.Entity.GENERATION, id, { endTimestamp: (0, utils_1.utcNow)() });
}
addAttachment(attachment) {
this.commit("upload-attachment", attachment);
}
static addAttachment_(writer, id, attachment) {
base_1.EvaluatableBaseContainer.commit_(writer, types_1.Entity.GENERATION, id, "upload-attachment", attachment);
}
static end_(writer, id, data) {
base_1.EvaluatableBaseContainer.end_(writer, types_1.Entity.GENERATION, id, data);
}
data() {
return {
...super.data(),
provider: this.provider,
model: this.model,
maximPromptId: this.maximPromptId,
modelParameters: this.modelParameters,
};
}
}
exports.Generation = Generation;
function parseAttachmentsFromMessages(messages) {
const attachments = [];
const modifiedMessages = [];
for (const message of messages) {
const content = message.content;
const attachedTo = message.role === "assistant" ? "output" : "input";
if (typeof content === "string") {
modifiedMessages.push(message);
continue;
}
if (Array.isArray(content)) {
const filteredContent = [];
for (const item of content) {
if (typeof item === "string") {
filteredContent.push({ type: "text", text: item });
continue;
}
if (item.type === "image_url") {
const imageUrl = item.image_url.url;
if (imageUrl) {
if (imageUrl.startsWith("data:image")) {
const match = imageUrl.match(/^data:image\/(\w+);base64,(.+)$/);
if (match) {
const ext = match[1];
const base64Data = match[2];
try {
const binaryData = atob(base64Data);
const bytes = new Uint8Array(binaryData.length);
for (let i = 0; i < binaryData.length; i++) {
bytes[i] = binaryData.charCodeAt(i);
}
const attachment = {
type: "fileData",
id: (0, utils_1.uniqueId)(),
name: `image.${ext}`,
data: Buffer.from(bytes),
mimeType: `image/${ext}`,
tags: { attachedTo: attachedTo },
};
attachments.push(attachment);
}
catch (error) {
console.error("[MaximSDK] Error while parsing base64 attachment:", error);
filteredContent.push(item);
}
}
else {
filteredContent.push(item);
}
}
else {
const attachment = {
type: "url",
id: (0, utils_1.uniqueId)(),
url: imageUrl,
mimeType: "image/*",
tags: { attachedTo: attachedTo },
};
attachments.push(attachment);
}
}
}
else {
filteredContent.push(item);
}
}
if (filteredContent.length === 1 && filteredContent[0].type === "text") {
modifiedMessages.push({
...message,
content: filteredContent[0].text,
});
}
else if (filteredContent.length === 0) {
modifiedMessages.push({
...message,
content: "",
});
}
else {
modifiedMessages.push({
...message,
content: filteredContent,
});
}
}
else {
modifiedMessages.push(message);
}
}
return [modifiedMessages, attachments];
}
//# sourceMappingURL=generation.js.map