mongodb-rag-core
Version:
Common elements used by MongoDB Chatbot Framework components.
136 lines (132 loc) • 5.42 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.tagifyMetadata = exports.classifyMongoDbMetadata = exports.classifyMongoDbProgrammingLanguageAndProduct = exports.classifyMongoDbTopic = exports.ClassifyMongoDbTopicSchema = exports.classifyMongoDbProduct = exports.ClassifyMongoDbProductSchema = exports.classifyMongoDbProgrammingLanguage = exports.ClassifyMongoDbProgrammingLanguageSchema = void 0;
const zod_1 = require("zod");
const aiSdk_1 = require("mongodb-rag-core/aiSdk");
const products_1 = require("./products");
const programmingLanguages_1 = require("./programmingLanguages");
const topics_1 = require("./topics");
const braintrust_1 = require("braintrust");
const baseSystemPrompt = `You are an expert data labeler employed by MongoDB.
You must label metadata based on the provided label categories:`;
exports.ClassifyMongoDbProgrammingLanguageSchema = zod_1.z.object({
programmingLanguage: zod_1.z
.enum(programmingLanguages_1.mongoDbProgrammingLanguageIds)
.nullable()
.describe("Most important programming language present in the content. If no programming language is present, set to `null`."),
});
/**
Classify metadata relevant to the MongoDB docs chatbot
from a user message in the conversation.
*/
exports.classifyMongoDbProgrammingLanguage = (0, braintrust_1.wrapTraced)(async (model, data, maxRetries) => (await (0, aiSdk_1.generateObject)({
maxRetries,
messages: [
{
role: "system",
content: `${baseSystemPrompt}
${programmingLanguages_1.mongoDbProgrammingLanguages.map((l) => ` - ${l.id}: ${l.name}`).join("\n")}`,
},
{
role: "user",
content: data,
},
],
model,
schema: exports.ClassifyMongoDbProgrammingLanguageSchema,
})).object.programmingLanguage, {
name: "classifyMongoDbProgrammingLanguage",
});
exports.ClassifyMongoDbProductSchema = zod_1.z.object({
mongoDbProduct: zod_1.z
.enum(products_1.mongoDbProducts.map((p) => p.id))
.nullable()
.describe(`Most important MongoDB product present in the content.
If it is not clear what the product is, set to \`null\`.`),
});
exports.classifyMongoDbProduct = (0, braintrust_1.wrapTraced)(async (model, data, maxRetries) => (await (0, aiSdk_1.generateObject)({
maxRetries,
messages: [
{
role: "system",
content: `${baseSystemPrompt}
${products_1.mongoDbProducts
.map((p) => ` - ${p.id}: **${p.name}**. ${p.description}`)
.join("\n")}
Keep in mind:
1. Include "Driver" if the user is asking about a programming language with a MongoDB driver.
2. If asking about MongoDB database but not specifying if Atlas/Server/Op Manager, etc, set to "MongoDB Server".
3. If not clear what product is being asked about, set to \`null\`.`,
},
{
role: "user",
content: data,
},
],
model,
schema: exports.ClassifyMongoDbProductSchema,
})).object.mongoDbProduct, {
name: "classifyMongoDbProduct",
});
exports.ClassifyMongoDbTopicSchema = zod_1.z.object({
topic: zod_1.z
.enum(topics_1.mongoDbTopics.map((t) => t.id))
.nullable()
.describe(`Most important MongoDB-related topic present in the content. If none of the listed topics are clearly present, set to \`null\`.`),
});
exports.classifyMongoDbTopic = (0, braintrust_1.wrapTraced)(async (model, data, maxRetries) => (await (0, aiSdk_1.generateObject)({
maxRetries,
messages: [
{
role: "system",
content: `${baseSystemPrompt}
${topics_1.mongoDbTopics
.map((t) => ` - ${t.id}: **${t.name}**. ${t.description}`)
.join("\n")}`,
},
{
role: "user",
content: data,
},
],
model,
schema: exports.ClassifyMongoDbTopicSchema,
})).object.topic, {
name: "classifyMongoDbTopic",
});
function nullOnErr() {
return null;
}
exports.classifyMongoDbProgrammingLanguageAndProduct = (0, braintrust_1.wrapTraced)(async (model, data, maxRetries) => {
const [programmingLanguage, product] = await Promise.all([
(0, exports.classifyMongoDbProgrammingLanguage)(model, data, maxRetries).catch(nullOnErr),
(0, exports.classifyMongoDbProduct)(model, data, maxRetries).catch(nullOnErr),
]);
return { programmingLanguage, product };
}, { name: "classifyMongoDbProgrammingLanguageAndProduct" });
exports.classifyMongoDbMetadata = (0, braintrust_1.wrapTraced)(async (model, data, maxRetries) => {
const [programmingLanguage, product, topic] = await Promise.all([
(0, exports.classifyMongoDbProgrammingLanguage)(model, data, maxRetries).catch(nullOnErr),
(0, exports.classifyMongoDbProduct)(model, data, maxRetries).catch(nullOnErr),
(0, exports.classifyMongoDbTopic)(model, data, maxRetries).catch(nullOnErr),
]);
return {
programmingLanguage,
product,
topic,
};
}, {
name: "classifyMongoDbMetadata",
});
// Type guard to check if a value is a non-null MongoDbTag
function isMongoDbTag(value) {
return value !== null;
}
/**
Convert metadata to tags
*/
function tagifyMetadata(metadata) {
return Object.values(metadata).filter(isMongoDbTag);
}
exports.tagifyMetadata = tagifyMetadata;
//# sourceMappingURL=classifyMetadata.js.map