@convex-dev/agent
Version:
A agent component for Convex.
56 lines • 2.26 kB
JavaScript
import { omit } from "convex-helpers";
import { literals } from "convex-helpers/validators";
import { defineTable, } from "convex/server";
import { v, } from "convex/values";
// We only generate embeddings for non-tool, non-system messages
const embeddings = {
model: v.string(),
// What table it's stored in. (usually messages or memories)
table: v.string(),
userId: v.optional(v.string()),
threadId: v.optional(v.string()),
// not set for private threads
model_table_userId: v.optional(v.array(v.string())),
model_table_threadId: v.optional(v.array(v.string())),
vector: v.array(v.number()),
};
export const vEmbeddingsWithoutDenormalizedFields = v.object(omit(embeddings, ["model_table_userId", "model_table_threadId"]));
function table(dimensions) {
return defineTable(embeddings)
.vectorIndex("vector", {
vectorField: "vector",
dimensions,
filterFields: ["model_table_userId", "model_table_threadId"],
})
.index("model_table_threadId", ["model", "table", "threadId"]);
}
export const VectorDimensions = [
128, 256, 512, 768, 1024, 1408, 1536, 2048, 3072, 4096,
];
export function validateVectorDimension(dimension) {
if (!VectorDimensions.includes(dimension)) {
throw new Error(`Unsupported vector dimension${dimension}. Supported: ${VectorDimensions.join(", ")}`);
}
}
export const VectorTableNames = VectorDimensions.map((d) => `embeddings_${d}`);
export const vVectorDimension = literals(...VectorDimensions);
export const vVectorTableName = literals(...VectorTableNames);
export const vVectorId = v.union(...VectorTableNames.map((name) => v.id(name)));
export function getVectorTableName(dimension) {
return `embeddings_${dimension}`;
}
export function getVectorIdInfo(ctx, id) {
for (const dimension of VectorDimensions) {
const tableName = getVectorTableName(dimension);
if (ctx.db.normalizeId(tableName, id)) {
return { tableName, dimension };
}
}
throw new Error(`Unknown vector table id: ${id}`);
}
const tables = Object.fromEntries(VectorDimensions.map((dimensions) => [
`embeddings_${dimensions}`,
table(dimensions),
]));
export default tables;
//# sourceMappingURL=tables.js.map