mongodb-chatbot-server
Version:
A chatbot server for retrieval augmented generation (RAG).
102 lines • 3.67 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.makeRequestError = exports.areEquivalentIpAddresses = exports.isValidIp = exports.convertConversationFromDbToApi = exports.convertMessageFromDbToApi = exports.ApiConversation = exports.ApiMessage = void 0;
const net_1 = require("net");
const ip_address_1 = require("ip-address");
const mongodb_rag_core_1 = require("mongodb-rag-core");
const zod_1 = require("zod");
exports.ApiMessage = zod_1.z.object({
id: zod_1.z.string(),
role: zod_1.z.enum(["system", "assistant", "user", "function"]),
content: zod_1.z.string(),
rating: zod_1.z.boolean().optional(),
createdAt: zod_1.z.number(),
references: mongodb_rag_core_1.References.optional(),
metadata: zod_1.z.record(zod_1.z.unknown()).optional(),
});
exports.ApiConversation = zod_1.z.object({
_id: zod_1.z.string(),
messages: zod_1.z.array(exports.ApiMessage),
createdAt: zod_1.z.number(),
});
function convertMessageFromDbToApi(message, conversationId) {
const { id, createdAt, role, content } = message;
const apiMessage = {
id: id.toString(),
role,
content,
createdAt: createdAt.getTime(),
};
if (role === "assistant") {
const { rating, references, metadata = {} } = message;
if (conversationId) {
metadata.conversationId = conversationId?.toString();
}
const augmentedApiMessage = {
...apiMessage,
rating,
references,
};
if (Object.keys(metadata).length > 0) {
augmentedApiMessage.metadata = metadata;
}
return augmentedApiMessage;
}
return apiMessage;
}
exports.convertMessageFromDbToApi = convertMessageFromDbToApi;
function assertNever(x) {
throw new Error("Unexpected object: " + x);
}
function isMessageAllowedInApiResponse(message) {
// Only return user messages and assistant messages that are not function calls
switch (message.role) {
case "system":
return false;
case "user":
return true;
case "assistant":
return message.functionCall === undefined;
case "function":
return false;
default:
// This should never happen - it means we missed a case in the switch.
// The assertNever function raises a type error if this happens.
return assertNever(message);
}
}
function convertConversationFromDbToApi(conversation) {
return {
_id: conversation._id.toHexString(),
createdAt: conversation.createdAt.getTime(),
messages: conversation.messages
.filter(isMessageAllowedInApiResponse)
.map((message) => convertMessageFromDbToApi(message)),
};
}
exports.convertConversationFromDbToApi = convertConversationFromDbToApi;
function isValidIp(ip) {
return ip !== undefined && (0, net_1.isIP)(ip) > 0;
}
exports.isValidIp = isValidIp;
function areEquivalentIpAddresses(ip1, ip2) {
if (ip_address_1.Address6.isValid(ip1)) {
ip1 = new ip_address_1.Address6(ip1).to4().correctForm();
}
if (ip_address_1.Address6.isValid(ip2)) {
ip2 = new ip_address_1.Address6(ip2).to4().correctForm();
}
return ip1 === ip2;
}
exports.areEquivalentIpAddresses = areEquivalentIpAddresses;
const makeRequestError = ({ message, httpStatus, stack: stackIn, }) => {
const stack = stackIn ?? new Error(message).stack;
return {
stack,
message,
httpStatus,
name: "RequestError",
};
};
exports.makeRequestError = makeRequestError;
//# sourceMappingURL=utils.js.map