@sqlrooms/ai-rag 0.26.1-rc.4 → 0.26.1-rc.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/createRagTool.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createRagTool.d.ts","sourceRoot":"","sources":["../src/createRagTool.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,iBAAiB,EAAC,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"createRagTool.d.ts","sourceRoot":"","sources":["../src/createRagTool.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,sBAAsB,CAAC;AAI5D,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAGtB;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;iBAiB5B,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAElE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACpC,CAAC,CAAC;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAE1D,MAAM,MAAM,cAAc,GAAG,OAAO,CAAC;AAoErC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,aAAa,IAAI,iBAAiB,CAChD,OAAO,iBAAiB,EACxB,gBAAgB,EAChB,qBAAqB,EACrB,cAAc,CACf,CA4FA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createRagTool.js","sourceRoot":"","sources":["../src/createRagTool.tsx"],"names":[],"mappings":"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","sourcesContent":["import {OpenAssistantTool} from '@openassistant/utils';\nimport {ReasoningBox} from '@sqlrooms/ai-core';\nimport {Button} from '@sqlrooms/ui';\nimport {useState} from 'react';\nimport {z} from 'zod';\nimport type {RagSliceState} from './RagSlice';\n\n/**\n * Zod schema for the RAG tool parameters\n */\nexport const RagToolParameters = z.object({\n query: z\n .string()\n .describe(\n 'The search query. Be specific and descriptive. Example: \"How to create a table in DuckDB\" or \"React hooks usage\"',\n ),\n database: z\n .string()\n .optional()\n .describe(\n 'Which documentation database to search (e.g., \"duckdb_docs\", \"react_docs\"). If not specified, searches the default database.',\n ),\n topK: z\n .number()\n .optional()\n .default(5)\n .describe('Number of results to return (default: 5, max: 20)'),\n});\n\nexport type RagToolParameters = z.infer<typeof RagToolParameters>;\n\nexport type RagToolLlmResult = {\n success: boolean;\n error?: string;\n query?: string;\n database?: string;\n results?: Array<{\n text: string;\n score: number;\n metadata?: Record<string, unknown>;\n }>;\n context?: string;\n details?: string;\n};\n\nexport type RagToolAdditionalData = Record<string, never>;\n\nexport type RagToolContext = unknown;\n\n/**\n * Individual result item with collapsible details\n */\nfunction RagResultItem({\n result,\n index,\n}: {\n result: {text: string; score: number; metadata?: Record<string, unknown>};\n index: number;\n}) {\n const [isExpanded, setIsExpanded] = useState(false);\n\n return (\n <div>\n <Button\n variant=\"ghost\"\n size=\"xs\"\n onClick={() => setIsExpanded(!isExpanded)}\n className=\"flex w-full items-center justify-between text-left\"\n >\n <span className=\"text-xs font-semibold text-gray-700 dark:text-gray-300\">\n {isExpanded ? '▼' : '▶'} Result #{index + 1}\n </span>\n <span className=\"text-muted-foreground/50 text-xs\">\n Score: {result.score.toFixed(3)}\n </span>\n </Button>\n\n {isExpanded && (\n <p className=\"text-muted-foreground/50 whitespace-pre-wrap p-5 font-mono text-xs\">\n {result.text}\n </p>\n )}\n </div>\n );\n}\n\n/**\n * Result component for displaying RAG search results\n */\nfunction RagToolResult(result: RagToolLlmResult) {\n if (!result?.success) {\n return (\n <div className=\"rounded border border-red-300 bg-red-50 p-3 text-red-600 dark:border-red-700 dark:bg-red-900/20 dark:text-red-400\">\n <p className=\"text-xs font-semibold\">RAG Search Failed</p>\n <p className=\"text-xs\">{result?.error || 'Unknown error'}</p>\n </div>\n );\n }\n\n const {query, results, database} = result;\n\n return (\n <ReasoningBox title={`Found ${results?.length || 0} results`}>\n <div className=\"space-y-2 p-3\">\n <div className=\"space-y-2\">\n {results &&\n results.map((result, i) => (\n <RagResultItem key={i} result={result} index={i} />\n ))}\n </div>\n </div>\n </ReasoningBox>\n );\n}\n\n/**\n * Create a RAG (Retrieval Augmented Generation) tool for AI.\n *\n * This tool allows the AI to search through embedded documentation\n * to find relevant context before answering questions.\n *\n * @example\n * ```typescript\n * const store = createRoomStore({\n * slices: [\n * createRagSlice({embeddingsDatabases: [...]}),\n * createAiSlice({\n * tools: {\n * rag: createRagTool(),\n * }\n * })\n * ]\n * });\n * ```\n */\nexport function createRagTool(): OpenAssistantTool<\n typeof RagToolParameters,\n RagToolLlmResult,\n RagToolAdditionalData,\n RagToolContext\n> {\n return {\n name: 'search_documentation',\n description: `Search through documentation and knowledge bases using semantic search.\n \nUse this tool when you need to:\n- Find specific information in documentation\n- Look up API references or technical details\n- Get context about features, functions, or concepts\n- Answer questions that require domain knowledge\n\nThe search uses vector embeddings to find semantically similar content, not just keyword matching.`,\n\n parameters: RagToolParameters,\n\n execute: async (params: RagToolParameters) => {\n const {query, database, topK = 5} = params;\n // Get the store instance\n const store = (globalThis as any).__ROOM_STORE__;\n if (!store) {\n return {\n llmResult: {\n success: false,\n error: 'Store not available',\n } satisfies RagToolLlmResult,\n };\n }\n\n const state = store.getState() as RagSliceState;\n\n try {\n // Initialize RAG if not already initialized\n await state.rag.initialize();\n\n // Clamp topK to reasonable limits\n const clampedTopK = Math.min(Math.max(1, topK), 20);\n\n // Determine which database to search\n const targetDatabase = database || state.rag.listDatabases()[0];\n\n if (!targetDatabase) {\n return {\n llmResult: {\n success: false,\n error: 'No RAG databases configured',\n } satisfies RagToolLlmResult,\n };\n }\n\n // Perform the search\n const results = await state.rag.queryByText(query, {\n topK: clampedTopK,\n database: targetDatabase,\n });\n\n // Format results for LLM\n const formattedContext = results\n .map(\n (result, i) =>\n `[Result ${i + 1}] (Score: ${result.score.toFixed(3)})\\n${result.text}`,\n )\n .join('\\n\\n---\\n\\n');\n\n return {\n llmResult: {\n success: true,\n query,\n database: targetDatabase,\n results: results.map((r) => ({\n text: r.text,\n score: r.score,\n metadata: r.metadata,\n })),\n // Provide formatted context for the LLM\n context: formattedContext,\n details: `Found ${results.length} relevant documents in ${targetDatabase}`,\n } satisfies RagToolLlmResult,\n };\n } catch (error) {\n console.error('RAG search error:', error);\n return {\n llmResult: {\n success: false,\n error:\n error instanceof Error ? error.message : 'Unknown error occurred',\n } satisfies RagToolLlmResult,\n };\n }\n },\n\n component: RagToolResult,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"createRagTool.js","sourceRoot":"","sources":["../src/createRagTool.tsx"],"names":[],"mappings":"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","sourcesContent":["import type {OpenAssistantTool} from '@openassistant/utils';\nimport {ReasoningBox} from '@sqlrooms/ai-core';\nimport {Button} from '@sqlrooms/ui';\nimport {useState} from 'react';\nimport {z} from 'zod';\nimport type {RagSliceState} from './RagSlice';\n\n/**\n * Zod schema for the RAG tool parameters\n */\nexport const RagToolParameters = z.object({\n query: z\n .string()\n .describe(\n 'The search query. Be specific and descriptive. Example: \"How to create a table in DuckDB\" or \"React hooks usage\"',\n ),\n database: z\n .string()\n .optional()\n .describe(\n 'Which documentation database to search (e.g., \"duckdb_docs\", \"react_docs\"). If not specified, searches the default database.',\n ),\n topK: z\n .number()\n .optional()\n .default(5)\n .describe('Number of results to return (default: 5, max: 20)'),\n});\n\nexport type RagToolParameters = z.infer<typeof RagToolParameters>;\n\nexport type RagToolLlmResult = {\n success: boolean;\n error?: string;\n query?: string;\n database?: string;\n results?: Array<{\n text: string;\n score: number;\n metadata?: Record<string, unknown>;\n }>;\n context?: string;\n details?: string;\n};\n\nexport type RagToolAdditionalData = Record<string, never>;\n\nexport type RagToolContext = unknown;\n\n/**\n * Individual result item with collapsible details\n */\nfunction RagResultItem({\n result,\n index,\n}: {\n result: {text: string; score: number; metadata?: Record<string, unknown>};\n index: number;\n}) {\n const [isExpanded, setIsExpanded] = useState(false);\n\n return (\n <div>\n <Button\n variant=\"ghost\"\n size=\"xs\"\n onClick={() => setIsExpanded(!isExpanded)}\n className=\"flex w-full items-center justify-between text-left\"\n >\n <span className=\"text-xs font-semibold text-gray-700 dark:text-gray-300\">\n {isExpanded ? '▼' : '▶'} Result #{index + 1}\n </span>\n <span className=\"text-muted-foreground/50 text-xs\">\n Score: {result.score.toFixed(3)}\n </span>\n </Button>\n\n {isExpanded && (\n <p className=\"text-muted-foreground/50 whitespace-pre-wrap p-5 font-mono text-xs\">\n {result.text}\n </p>\n )}\n </div>\n );\n}\n\n/**\n * Result component for displaying RAG search results\n */\nfunction RagToolResult(result: RagToolLlmResult) {\n if (!result?.success) {\n return (\n <div className=\"rounded border border-red-300 bg-red-50 p-3 text-red-600 dark:border-red-700 dark:bg-red-900/20 dark:text-red-400\">\n <p className=\"text-xs font-semibold\">RAG Search Failed</p>\n <p className=\"text-xs\">{result?.error || 'Unknown error'}</p>\n </div>\n );\n }\n\n const {query, results, database} = result;\n\n return (\n <ReasoningBox title={`Found ${results?.length || 0} results`}>\n <div className=\"space-y-2 p-3\">\n <div className=\"space-y-2\">\n {results &&\n results.map((result, i) => (\n <RagResultItem key={i} result={result} index={i} />\n ))}\n </div>\n </div>\n </ReasoningBox>\n );\n}\n\n/**\n * Create a RAG (Retrieval Augmented Generation) tool for AI.\n *\n * This tool allows the AI to search through embedded documentation\n * to find relevant context before answering questions.\n *\n * @example\n * ```typescript\n * const store = createRoomStore({\n * slices: [\n * createRagSlice({embeddingsDatabases: [...]}),\n * createAiSlice({\n * tools: {\n * rag: createRagTool(),\n * }\n * })\n * ]\n * });\n * ```\n */\nexport function createRagTool(): OpenAssistantTool<\n typeof RagToolParameters,\n RagToolLlmResult,\n RagToolAdditionalData,\n RagToolContext\n> {\n return {\n name: 'search_documentation',\n description: `Search through documentation and knowledge bases using semantic search.\n \nUse this tool when you need to:\n- Find specific information in documentation\n- Look up API references or technical details\n- Get context about features, functions, or concepts\n- Answer questions that require domain knowledge\n\nThe search uses vector embeddings to find semantically similar content, not just keyword matching.`,\n\n parameters: RagToolParameters,\n\n execute: async (params: RagToolParameters) => {\n const {query, database, topK = 5} = params;\n // Get the store instance\n const store = (globalThis as any).__ROOM_STORE__;\n if (!store) {\n return {\n llmResult: {\n success: false,\n error: 'Store not available',\n } satisfies RagToolLlmResult,\n };\n }\n\n const state = store.getState() as RagSliceState;\n\n try {\n // Initialize RAG if not already initialized\n await state.rag.initialize();\n\n // Clamp topK to reasonable limits\n const clampedTopK = Math.min(Math.max(1, topK), 20);\n\n // Determine which database to search\n const targetDatabase = database || state.rag.listDatabases()[0];\n\n if (!targetDatabase) {\n return {\n llmResult: {\n success: false,\n error: 'No RAG databases configured',\n } satisfies RagToolLlmResult,\n };\n }\n\n // Perform the search\n const results = await state.rag.queryByText(query, {\n topK: clampedTopK,\n database: targetDatabase,\n });\n\n // Format results for LLM\n const formattedContext = results\n .map(\n (result, i) =>\n `[Result ${i + 1}] (Score: ${result.score.toFixed(3)})\\n${result.text}`,\n )\n .join('\\n\\n---\\n\\n');\n\n return {\n llmResult: {\n success: true,\n query,\n database: targetDatabase,\n results: results.map((r) => ({\n text: r.text,\n score: r.score,\n metadata: r.metadata,\n })),\n // Provide formatted context for the LLM\n context: formattedContext,\n details: `Found ${results.length} relevant documents in ${targetDatabase}`,\n } satisfies RagToolLlmResult,\n };\n } catch (error) {\n console.error('RAG search error:', error);\n return {\n llmResult: {\n success: false,\n error:\n error instanceof Error ? error.message : 'Unknown error occurred',\n } satisfies RagToolLlmResult,\n };\n }\n },\n\n component: RagToolResult,\n };\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sqlrooms/ai-rag",
|
|
3
|
-
"version": "0.26.1-rc.
|
|
3
|
+
"version": "0.26.1-rc.6",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"module": "dist/index.js",
|
|
7
7
|
"type": "module",
|
|
8
|
+
"sideEffects": false,
|
|
8
9
|
"author": "Ilya Boyandin <ilya@boyandin.me>",
|
|
9
10
|
"license": "MIT",
|
|
10
11
|
"repository": {
|
|
@@ -19,10 +20,10 @@
|
|
|
19
20
|
},
|
|
20
21
|
"dependencies": {
|
|
21
22
|
"@openassistant/utils": "1.0.0-alpha.0",
|
|
22
|
-
"@sqlrooms/ai-core": "0.26.1-rc.
|
|
23
|
-
"@sqlrooms/duckdb": "0.26.1-rc.
|
|
24
|
-
"@sqlrooms/room-store": "0.26.1-rc.
|
|
25
|
-
"@sqlrooms/ui": "0.26.1-rc.
|
|
23
|
+
"@sqlrooms/ai-core": "0.26.1-rc.6",
|
|
24
|
+
"@sqlrooms/duckdb": "0.26.1-rc.6",
|
|
25
|
+
"@sqlrooms/room-store": "0.26.1-rc.6",
|
|
26
|
+
"@sqlrooms/ui": "0.26.1-rc.6",
|
|
26
27
|
"ai": "^5.0.44",
|
|
27
28
|
"zod": "^4.1.8"
|
|
28
29
|
},
|
|
@@ -38,5 +39,5 @@
|
|
|
38
39
|
"typecheck": "tsc --noEmit",
|
|
39
40
|
"typedoc": "typedoc"
|
|
40
41
|
},
|
|
41
|
-
"gitHead": "
|
|
42
|
+
"gitHead": "d76c80398057ecab2248c8341557a78ecf718d48"
|
|
42
43
|
}
|