genkitx-cloud-sql-pg
Version:
Genkit AI framework plugin for Cloud SQL for PostgreSQL.
1 lines • 23.1 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Copyright 2025 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { z, type Genkit } from 'genkit';\nimport { type EmbedderArgument } from 'genkit/embedder';\nimport { genkitPlugin, type GenkitPlugin } from 'genkit/plugin';\nimport {\n CommonRetrieverOptionsSchema,\n Document,\n indexerRef,\n retrieverRef,\n} from 'genkit/retriever';\nimport { v4 as uuidv4 } from 'uuid';\nimport { PostgresEngine } from './engine.js';\nimport { DistanceStrategy, type QueryOptions } from './indexes.js';\n\nexport { Column, PostgresEngine } from './engine.js';\nexport {\n DistanceStrategy,\n ExactNearestNeighbor,\n HNSWIndex,\n HNSWQueryOptions,\n IVFFlatIndex,\n IVFFlatQueryOptions,\n} from './indexes.js';\n\nconst PostgresRetrieverOptionsSchema = CommonRetrieverOptionsSchema.extend({\n k: z.number().max(1000),\n filter: z.string().optional(),\n});\n\nconst PostgresIndexerOptionsSchema = z.object({\n batchSize: z.number().default(100),\n});\n\n/**\n * postgresRetrieverRef function creates a retriever for Postgres.\n * @param params The params for the new Postgres retriever\n * @param params.tableName The table name for the postgres retriever\nIf not specified, the default label will be `Postgres - <tableName>`\n * @returns A reference to a Postgres retriever.\n */\nexport const postgresRetrieverRef = (params: { tableName: string }) => {\n return retrieverRef({\n name: `postgres/${params.tableName}`,\n info: {\n label: params.tableName ?? `Postgres - ${params.tableName}`,\n },\n configSchema: PostgresRetrieverOptionsSchema,\n });\n};\n\n/**\n * postgresIndexerRef function creates an indexer for Postgres.\n * @param params The params for the new Postgres indexer.\n * @param params.tableName The table name for the Postgres indexer.\nIf not specified, the default label will be `Postgres - <tableName>`\n * @returns A reference to a Postgres indexer.\n */\nexport const postgresIndexerRef = (params: { tableName: string }) => {\n return indexerRef({\n name: `postgres/${params.tableName}`,\n info: {\n label: params.tableName ?? `Postgres - ${params.tableName}`,\n },\n configSchema: PostgresIndexerOptionsSchema.optional(),\n });\n};\n\n/**\n * Postgres plugin that provides a Postgres retriever and indexer\n * @param params An array of params to set up Postgres retrievers and indexers\n * @param params.tableName The name of the table\n * @param params.embedder The embedder to use for the indexer and retriever\n * @param params.embedderOptions Options to customize the embedder\n * @returns The Postgres Genkit plugin\n */\nexport function postgres<EmbedderCustomOptions extends z.ZodTypeAny>(\n params: {\n tableName: string;\n embedder: EmbedderArgument<EmbedderCustomOptions>;\n embedderOptions?: z.infer<EmbedderCustomOptions>;\n engine: PostgresEngine;\n schemaName?: string;\n contentColumn?: string;\n embeddingColumn?: string;\n metadataColumns?: string[];\n ignoreMetadataColumns?: string[];\n idColumn?: string;\n metadataJsonColumn?: string;\n distanceStrategy?: DistanceStrategy;\n indexQueryOptions?: QueryOptions;\n }[]\n): GenkitPlugin {\n return genkitPlugin('postgres', async (ai: Genkit) => {\n params.map((i) => configurePostgresRetriever(ai, i));\n params.map((i) => configurePostgresIndexer(ai, i));\n });\n}\n\nexport default postgres;\n\n/**\n * Configures a Postgres retriever.\n * @param ai A Genkit instance\n * @param params The params for the retriever\n * @param params.tableName The name of the table\n * @param params.embedder The embedder to use for the retriever\n * @param params.embedderOptions Options to customize the embedder\n * @returns A Postgres retriever\n */\nexport async function configurePostgresRetriever<\n EmbedderCustomOptions extends z.ZodTypeAny,\n>(\n ai: Genkit,\n params: {\n tableName: string;\n embedder: EmbedderArgument<EmbedderCustomOptions>;\n embedderOptions?: z.infer<EmbedderCustomOptions>;\n engine: PostgresEngine;\n schemaName?: string;\n contentColumn?: string;\n embeddingColumn?: string;\n metadataColumns?: string[];\n ignoreMetadataColumns?: string[];\n idColumn?: string;\n metadataJsonColumn?: string;\n distanceStrategy?: DistanceStrategy;\n indexQueryOptions?: QueryOptions;\n }\n) {\n const schemaName = params.schemaName ?? 'public';\n const contentColumn = params.contentColumn ?? 'content';\n const embeddingColumn = params.embeddingColumn ?? 'embedding';\n const distanceStrategy =\n params.distanceStrategy ?? DistanceStrategy.COSINE_DISTANCE;\n if (!params.engine) {\n throw new Error('Engine is required');\n }\n\n async function checkColumns() {\n if (\n params.metadataColumns !== undefined &&\n params.ignoreMetadataColumns !== undefined\n ) {\n throw 'Can not use both metadata_columns and ignore_metadata_columns.';\n }\n\n const { rows } = await params.engine.pool.raw(\n `SELECT column_name, data_type FROM information_schema.columns WHERE table_name = '${params.tableName}' AND table_schema = '${schemaName}'`\n );\n const columns: { [key: string]: any } = {};\n\n for (const index in rows) {\n const row = rows[index];\n columns[row['column_name']] = row['data_type'];\n }\n\n if (params.idColumn && !columns.hasOwnProperty(params.idColumn)) {\n throw `Id column: ${params.idColumn}, does not exist.`;\n }\n\n if (contentColumn && !columns.hasOwnProperty(contentColumn)) {\n throw `Content column: ${params.contentColumn}, does not exist.`;\n }\n\n const contentType = contentColumn ? columns[contentColumn] : '';\n\n if (contentType !== 'text' && !contentType.includes('char')) {\n throw `Content column: ${params.contentColumn}, is type: ${contentType}. It must be a type of character string.`;\n }\n\n if (embeddingColumn && !columns.hasOwnProperty(embeddingColumn)) {\n throw `Embedding column: ${embeddingColumn}, does not exist.`;\n }\n\n if (embeddingColumn && columns[embeddingColumn] !== 'USER-DEFINED') {\n throw `Embedding column: ${embeddingColumn} is not of type Vector.`;\n }\n\n const metadataJsonColumnToCheck = params.metadataJsonColumn ?? '';\n params.metadataJsonColumn = columns.hasOwnProperty(\n metadataJsonColumnToCheck\n )\n ? params.metadataJsonColumn\n : '';\n\n if (params.metadataColumns) {\n for (const column of params.metadataColumns) {\n if (column && !columns.hasOwnProperty(column)) {\n throw `Metadata column: ${column}, does not exist.`;\n }\n }\n }\n\n const allColumns = columns;\n if (\n params.ignoreMetadataColumns !== undefined &&\n params.ignoreMetadataColumns.length > 0\n ) {\n for (const column of params.ignoreMetadataColumns) {\n delete allColumns[column];\n }\n\n if (params.idColumn) {\n delete allColumns[params.idColumn];\n }\n if (contentColumn) {\n delete allColumns[contentColumn];\n }\n if (embeddingColumn) {\n delete allColumns[embeddingColumn];\n }\n params.metadataColumns = Object.keys(allColumns);\n }\n }\n\n async function queryCollection(\n embedding: number[],\n k?: number | undefined,\n filter?: string | undefined\n ) {\n k = k ?? 4;\n const operator = distanceStrategy.operator;\n const searchFunction = distanceStrategy.searchFunction;\n const _filter = filter !== undefined ? `WHERE ${filter}` : '';\n const metadataColNames =\n params.metadataColumns && params.metadataColumns.length > 0\n ? `\"${params.metadataColumns.join('\",\"')}\"`\n : '';\n const metadataJsonColName = params.metadataJsonColumn\n ? `, \"${params.metadataJsonColumn}\"`\n : '';\n\n const query = `SELECT \"${params.idColumn}\", \"${contentColumn}\", \"${embeddingColumn}\", ${metadataColNames} ${metadataJsonColName}, ${searchFunction}(\"${embeddingColumn}\", '[${embedding}]') as distance FROM \"${schemaName}\".\"${params.tableName}\" ${_filter} ORDER BY \"${embeddingColumn}\" ${operator} '[${embedding}]' LIMIT ${k};`;\n\n if (params.indexQueryOptions) {\n await params.engine.pool.raw(\n `SET LOCAL ${params.indexQueryOptions.to_string()}`\n );\n }\n\n const { rows } = await params.engine.pool.raw(query);\n\n return rows;\n }\n\n return ai.defineRetriever(\n {\n name: `postgres/${params.tableName}`,\n configSchema: PostgresRetrieverOptionsSchema,\n },\n async (content, options) => {\n console.log(`Retrieving data for table: ${params.tableName}`);\n checkColumns();\n const queryEmbeddings = await ai.embed({\n embedder: params.embedder,\n content,\n options: params.embedderOptions,\n });\n const embedding = queryEmbeddings[0].embedding;\n const results = await queryCollection(\n embedding,\n options.k,\n options.filter\n );\n const documents: Document[] = [];\n for (const row of results) {\n const metadata =\n params.metadataJsonColumn && row[params.metadataJsonColumn]\n ? row[params.metadataJsonColumn]\n : {};\n if (params.metadataColumns) {\n for (const col of params.metadataColumns) {\n metadata[col] = row[col];\n }\n }\n documents.push(\n new Document({\n content: row[contentColumn],\n metadata: metadata,\n })\n );\n }\n\n return { documents };\n }\n );\n}\n\n/**\n * Configures a Postgres indexer.\n * @param ai A Genkit instance\n * @param params The params for the indexer\n * @param params.tableName The name of the indexer\n * @param params.engine The engine to use for the indexer\n * @param params.embedder The embedder to use for the retriever\n * @param params.embedderOptions Options to customize the embedder\n * @param params.metadataColumns The metadata columns to use for the indexer\n * @param params.idColumn The id column to use for the indexer\n * @param params.metadataJsonColumn The metadata json column to use for the indexer\n * @param params.contentColumn The content column to use for the indexer\n * @param params.embeddingColumn The embedding column to use for the indexer\n * @param params.schemaName The schema name to use for the indexer\n * @param params.chunkSize The chunk size to use for the indexer\n * @returns Add documents to vector store\n */\nexport function configurePostgresIndexer<\n EmbedderCustomOptions extends z.ZodTypeAny,\n>(\n ai: Genkit,\n params: {\n tableName: string;\n engine: PostgresEngine;\n schemaName?: string;\n contentColumn?: string;\n embeddingColumn?: string;\n metadataColumns?: string[];\n ignoreMetadataColumns?: string[];\n idColumn?: string;\n metadataJsonColumn?: string;\n embedder: EmbedderArgument<EmbedderCustomOptions>;\n embedderOptions?: z.infer<EmbedderCustomOptions>;\n }\n) {\n const schemaName = params.schemaName ?? 'public';\n const contentColumn = params.contentColumn ?? 'content';\n const embeddingColumn = params.embeddingColumn ?? 'embedding';\n const idColumn = params.idColumn ?? 'id';\n const metadataJsonColumn = params.metadataJsonColumn ?? 'metadata';\n\n if (!params.engine) {\n throw new Error('Engine is required');\n }\n\n if (params.metadataColumns && params.ignoreMetadataColumns) {\n throw new Error(\n 'Cannot use both metadataColumns and ignoreMetadataColumns'\n );\n }\n\n async function checkColumns() {\n const { rows } = await params.engine.pool.raw(\n `SELECT column_name, data_type FROM information_schema.columns WHERE table_name = '${params.tableName}' AND table_schema = '${schemaName}'`\n );\n\n const columns: { [key: string]: any } = {};\n\n for (const index in rows) {\n const row = rows[index];\n columns[row['column_name']] = row['data_type'];\n }\n\n if (!columns.hasOwnProperty(idColumn)) {\n throw new Error(`Id column: ${idColumn}, does not exist.`);\n }\n\n if (!columns.hasOwnProperty(contentColumn)) {\n throw new Error(`Content column: ${contentColumn}, does not exist.`);\n }\n\n if (!columns.hasOwnProperty(embeddingColumn)) {\n throw new Error(`Embedding column: ${embeddingColumn}, does not exist.`);\n }\n\n if (columns[embeddingColumn] !== 'USER-DEFINED') {\n throw new Error(\n `Embedding column: ${embeddingColumn} is not of type Vector.`\n );\n }\n\n if (params.metadataColumns) {\n for (const column of params.metadataColumns) {\n if (column && !columns.hasOwnProperty(column)) {\n throw new Error(`Metadata column: ${column}, does not exist.`);\n }\n }\n }\n }\n\n return ai.defineIndexer(\n {\n name: `postgres/${params.tableName}`,\n configSchema: PostgresIndexerOptionsSchema.optional(),\n },\n async (\n docs: Document[] | { documents: Document[]; options?: any },\n options?: { batchSize?: number }\n ) => {\n try {\n await checkColumns();\n\n // Normalize input to always have documents array and merged options\n const documents = Array.isArray(docs) ? docs : docs.documents || [];\n const mergedOptions = Array.isArray(docs)\n ? options\n : docs.options || options || {};\n const batchSize = mergedOptions.batchSize || 100;\n\n console.log(\n `Indexing ${documents.length} documents in batches of ${batchSize}`\n );\n\n for (let i = 0; i < documents.length; i += batchSize) {\n const chunk = documents.slice(i, i + batchSize);\n const texts = chunk.map((doc) =>\n Array.isArray(doc.content)\n ? doc.content.map((c) => c.text).join(' ')\n : doc.content\n );\n\n let embeddings;\n try {\n if (ai.embedMany) {\n embeddings = await ai.embedMany({\n embedder: params.embedder,\n content: texts,\n options: params.embedderOptions,\n });\n } else {\n embeddings = await Promise.all(\n texts.map((text) =>\n ai\n .embed({\n embedder: params.embedder,\n content: text,\n options: params.embedderOptions,\n })\n .then((res) => res[0])\n )\n );\n }\n } catch (error: unknown) {\n throw new Error('Embedding failed', { cause: error });\n }\n\n const insertData = chunk.map((doc, index) => ({\n [idColumn]: doc.metadata?.[idColumn] || uuidv4(),\n [contentColumn]: texts[index],\n [embeddingColumn]: JSON.stringify(embeddings[index].embedding),\n ...(metadataJsonColumn && {\n [metadataJsonColumn]: doc.metadata || {},\n }),\n ...Object.fromEntries(\n (params.metadataColumns || [])\n .filter((col) => doc.metadata?.[col] !== undefined)\n .map((col) => [col, doc.metadata?.[col]])\n ),\n }));\n\n const table = schemaName\n ? params.engine.pool.withSchema(schemaName).table(params.tableName)\n : params.engine.pool.table(params.tableName);\n\n await table.insert(insertData);\n }\n } catch (error: unknown) {\n console.error('Error in indexer:', error);\n throw error;\n }\n }\n );\n}\n"],"mappings":"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","names":["PostgresEngine","DistanceStrategy"]}