@sqlrooms/ai 0.25.0-rc.0 → 0.26.0-rc.1

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.
Files changed (140) hide show
  1. package/README.md +18 -33
  2. package/dist/index.d.ts +8 -27
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +7 -23
  5. package/dist/index.js.map +1 -1
  6. package/dist/tools/defaultInstructions.d.ts +8 -0
  7. package/dist/tools/defaultInstructions.d.ts.map +1 -0
  8. package/dist/tools/defaultInstructions.js +64 -0
  9. package/dist/tools/defaultInstructions.js.map +1 -0
  10. package/dist/tools/defaultTools.d.ts +14 -0
  11. package/dist/tools/defaultTools.d.ts.map +1 -0
  12. package/dist/tools/defaultTools.js +13 -0
  13. package/dist/tools/defaultTools.js.map +1 -0
  14. package/dist/tools/query/QueryToolResult.d.ts.map +1 -0
  15. package/dist/tools/query/QueryToolResult.js.map +1 -0
  16. package/dist/tools/query/queryTool.d.ts +25 -0
  17. package/dist/tools/query/queryTool.d.ts.map +1 -0
  18. package/dist/tools/query/queryTool.js +108 -0
  19. package/dist/tools/query/queryTool.js.map +1 -0
  20. package/package.json +13 -18
  21. package/dist/AiSettingsSlice.d.ts +0 -113
  22. package/dist/AiSettingsSlice.d.ts.map +0 -1
  23. package/dist/AiSettingsSlice.js +0 -174
  24. package/dist/AiSettingsSlice.js.map +0 -1
  25. package/dist/AiSlice.d.ts +0 -453
  26. package/dist/AiSlice.d.ts.map +0 -1
  27. package/dist/AiSlice.js +0 -416
  28. package/dist/AiSlice.js.map +0 -1
  29. package/dist/analysis.d.ts +0 -79
  30. package/dist/analysis.d.ts.map +0 -1
  31. package/dist/analysis.js +0 -218
  32. package/dist/analysis.js.map +0 -1
  33. package/dist/components/AnalysisAnswer.d.ts +0 -15
  34. package/dist/components/AnalysisAnswer.d.ts.map +0 -1
  35. package/dist/components/AnalysisAnswer.js +0 -102
  36. package/dist/components/AnalysisAnswer.js.map +0 -1
  37. package/dist/components/AnalysisResult.d.ts +0 -22
  38. package/dist/components/AnalysisResult.d.ts.map +0 -1
  39. package/dist/components/AnalysisResult.js +0 -39
  40. package/dist/components/AnalysisResult.js.map +0 -1
  41. package/dist/components/AnalysisResultsContainer.d.ts +0 -5
  42. package/dist/components/AnalysisResultsContainer.d.ts.map +0 -1
  43. package/dist/components/AnalysisResultsContainer.js +0 -26
  44. package/dist/components/AnalysisResultsContainer.js.map +0 -1
  45. package/dist/components/ErrorMessage.d.ts +0 -4
  46. package/dist/components/ErrorMessage.d.ts.map +0 -1
  47. package/dist/components/ErrorMessage.js +0 -8
  48. package/dist/components/ErrorMessage.js.map +0 -1
  49. package/dist/components/MessageContainer.d.ts +0 -10
  50. package/dist/components/MessageContainer.d.ts.map +0 -1
  51. package/dist/components/MessageContainer.js +0 -9
  52. package/dist/components/MessageContainer.js.map +0 -1
  53. package/dist/components/ModelSelector.d.ts +0 -13
  54. package/dist/components/ModelSelector.d.ts.map +0 -1
  55. package/dist/components/ModelSelector.js +0 -29
  56. package/dist/components/ModelSelector.js.map +0 -1
  57. package/dist/components/QueryControls.d.ts +0 -10
  58. package/dist/components/QueryControls.d.ts.map +0 -1
  59. package/dist/components/QueryControls.js +0 -55
  60. package/dist/components/QueryControls.js.map +0 -1
  61. package/dist/components/SessionControls.d.ts +0 -17
  62. package/dist/components/SessionControls.d.ts.map +0 -1
  63. package/dist/components/SessionControls.js +0 -20
  64. package/dist/components/SessionControls.js.map +0 -1
  65. package/dist/components/session/DeleteSessionButton.d.ts +0 -19
  66. package/dist/components/session/DeleteSessionButton.d.ts.map +0 -1
  67. package/dist/components/session/DeleteSessionButton.js +0 -54
  68. package/dist/components/session/DeleteSessionButton.js.map +0 -1
  69. package/dist/components/session/DeleteSessionDialog.d.ts +0 -27
  70. package/dist/components/session/DeleteSessionDialog.d.ts.map +0 -1
  71. package/dist/components/session/DeleteSessionDialog.js +0 -19
  72. package/dist/components/session/DeleteSessionDialog.js.map +0 -1
  73. package/dist/components/session/SessionActions.d.ts +0 -18
  74. package/dist/components/session/SessionActions.d.ts.map +0 -1
  75. package/dist/components/session/SessionActions.js +0 -19
  76. package/dist/components/session/SessionActions.js.map +0 -1
  77. package/dist/components/session/SessionDropdown.d.ts +0 -18
  78. package/dist/components/session/SessionDropdown.d.ts.map +0 -1
  79. package/dist/components/session/SessionDropdown.js +0 -21
  80. package/dist/components/session/SessionDropdown.js.map +0 -1
  81. package/dist/components/session/SessionTitle.d.ts +0 -18
  82. package/dist/components/session/SessionTitle.d.ts.map +0 -1
  83. package/dist/components/session/SessionTitle.js +0 -22
  84. package/dist/components/session/SessionTitle.js.map +0 -1
  85. package/dist/components/session/SessionType.d.ts +0 -24
  86. package/dist/components/session/SessionType.d.ts.map +0 -1
  87. package/dist/components/session/SessionType.js +0 -2
  88. package/dist/components/session/SessionType.js.map +0 -1
  89. package/dist/components/session/index.d.ts +0 -7
  90. package/dist/components/session/index.d.ts.map +0 -1
  91. package/dist/components/session/index.js +0 -7
  92. package/dist/components/session/index.js.map +0 -1
  93. package/dist/components/settings/AiModelParameters.d.ts +0 -6
  94. package/dist/components/settings/AiModelParameters.d.ts.map +0 -1
  95. package/dist/components/settings/AiModelParameters.js +0 -91
  96. package/dist/components/settings/AiModelParameters.js.map +0 -1
  97. package/dist/components/settings/AiModelUsage.d.ts +0 -18
  98. package/dist/components/settings/AiModelUsage.d.ts.map +0 -1
  99. package/dist/components/settings/AiModelUsage.js +0 -60
  100. package/dist/components/settings/AiModelUsage.js.map +0 -1
  101. package/dist/components/settings/AiModelsSettings.d.ts +0 -10
  102. package/dist/components/settings/AiModelsSettings.d.ts.map +0 -1
  103. package/dist/components/settings/AiModelsSettings.js +0 -229
  104. package/dist/components/settings/AiModelsSettings.js.map +0 -1
  105. package/dist/components/settings/AiProvidersSettings.d.ts +0 -3
  106. package/dist/components/settings/AiProvidersSettings.d.ts.map +0 -1
  107. package/dist/components/settings/AiProvidersSettings.js +0 -88
  108. package/dist/components/settings/AiProvidersSettings.js.map +0 -1
  109. package/dist/components/settings/AiSettingsPanel.d.ts +0 -17
  110. package/dist/components/settings/AiSettingsPanel.d.ts.map +0 -1
  111. package/dist/components/settings/AiSettingsPanel.js +0 -20
  112. package/dist/components/settings/AiSettingsPanel.js.map +0 -1
  113. package/dist/components/tools/QueryToolResult.d.ts.map +0 -1
  114. package/dist/components/tools/QueryToolResult.js.map +0 -1
  115. package/dist/components/tools/ToolErrorMessage.d.ts +0 -39
  116. package/dist/components/tools/ToolErrorMessage.d.ts.map +0 -1
  117. package/dist/components/tools/ToolErrorMessage.js +0 -20
  118. package/dist/components/tools/ToolErrorMessage.js.map +0 -1
  119. package/dist/components/tools/ToolResult.d.ts +0 -11
  120. package/dist/components/tools/ToolResult.d.ts.map +0 -1
  121. package/dist/components/tools/ToolResult.js +0 -29
  122. package/dist/components/tools/ToolResult.js.map +0 -1
  123. package/dist/components/tools/ToolResultErrorBoundary.d.ts +0 -19
  124. package/dist/components/tools/ToolResultErrorBoundary.d.ts.map +0 -1
  125. package/dist/components/tools/ToolResultErrorBoundary.js +0 -24
  126. package/dist/components/tools/ToolResultErrorBoundary.js.map +0 -1
  127. package/dist/hooks/useScrollToBottom.d.ts +0 -82
  128. package/dist/hooks/useScrollToBottom.d.ts.map +0 -1
  129. package/dist/hooks/useScrollToBottom.js +0 -142
  130. package/dist/hooks/useScrollToBottom.js.map +0 -1
  131. package/dist/schemas.d.ts +0 -512
  132. package/dist/schemas.d.ts.map +0 -1
  133. package/dist/schemas.js +0 -93
  134. package/dist/schemas.js.map +0 -1
  135. package/dist/utils.d.ts +0 -15
  136. package/dist/utils.d.ts.map +0 -1
  137. package/dist/utils.js +0 -31
  138. package/dist/utils.js.map +0 -1
  139. /package/dist/{components/tools → tools/query}/QueryToolResult.d.ts +0 -0
  140. /package/dist/{components/tools → tools/query}/QueryToolResult.js +0 -0
package/README.md CHANGED
@@ -60,7 +60,7 @@ npm install ollama-ai-provider-v2
60
60
  ### Setting Up AI Integration
61
61
 
62
62
  ```tsx
63
- import {createAiSlice, createDefaultAiConfig} from '@sqlrooms/ai';
63
+ import {createAiSlice} from '@sqlrooms/ai';
64
64
  import {createRoomStore} from '@sqlrooms/room-shell';
65
65
 
66
66
  // Create a room store with AI capabilities
@@ -69,7 +69,6 @@ const {roomStore, useRoomStore} = createRoomStore({
69
69
  ...createRoomShellSlice({
70
70
  config: {
71
71
  // Your room configuration
72
- ...createDefaultAiConfig(), // Default AI configuration
73
72
  },
74
73
  }),
75
74
  // Add AI slice
@@ -104,11 +103,7 @@ function MyApp() {
104
103
  For more complex applications, you can combine multiple slices:
105
104
 
106
105
  ```tsx
107
- import {
108
- createAiSlice,
109
- createDefaultAiConfig,
110
- AiSliceConfig,
111
- } from '@sqlrooms/ai';
106
+ import {createAiSlice} from '@sqlrooms/ai';
112
107
  import {
113
108
  createSqlEditorSlice,
114
109
  createDefaultSqlEditorConfig,
@@ -126,26 +121,25 @@ export const {roomStore, useRoomStore} = createRoomStore<RoomConfig, RoomState>(
126
121
  // Base room slice
127
122
  ...createRoomShellSlice({
128
123
  config: {
129
- // Your base configuration
130
- ...createDefaultAiConfig({
131
- // Optional: Pre-configured AI sessions
132
- sessions: [
133
- {
134
- id: 'default-session',
135
- name: 'Default Analysis',
136
- modelProvider: 'openai',
137
- model: 'gpt-4o',
138
- analysisResults: [],
139
- createdAt: new Date(),
140
- },
141
- ],
142
- currentSessionId: 'default-session',
143
- }),
144
124
  ...createDefaultSqlEditorConfig(),
145
125
  },
146
126
  }),
147
127
  // AI slice
148
128
  ...createAiSlice({
129
+ config: {
130
+ // Optional: Pre-configured AI sessions
131
+ sessions: [
132
+ {
133
+ id: 'default-session',
134
+ name: 'Default Analysis',
135
+ modelProvider: 'openai',
136
+ model: 'gpt-4o',
137
+ analysisResults: [],
138
+ createdAt: new Date(),
139
+ },
140
+ ],
141
+ currentSessionId: 'default-session',
142
+ }
149
143
  getApiKey: (modelProvider) => {
150
144
  // Return API key based on provider
151
145
  return apiKeys[modelProvider] || '';
@@ -505,7 +499,6 @@ This package now includes comprehensive AI settings components. These components
505
499
  - **ModelsSettings**: Component for managing available models and their parameters
506
500
  - **ModelParametersSettings**: Component for configuring model parameters like max steps and system instructions
507
501
  - **ModelSelector**: Standalone model selector component for quick model switching
508
- - **extractModelsFromSettings**: Utility function to extract models from configuration for use in selectors
509
502
 
510
503
  ### AI Settings Usage
511
504
 
@@ -515,25 +508,18 @@ This package now includes comprehensive AI settings components. These components
515
508
  import {
516
509
  AiSettingsPanel,
517
510
  ModelSelector,
518
- extractModelsFromSettings,
519
511
  } from '@sqlrooms/ai';
520
512
  import {useRoomStore} from '../store';
521
513
 
522
- // Access AI model configuration from store
523
- const aiSettings = useRoomStore((s) => s.aiSettings.config);
524
- const models = extractModelsFromSettings(aiSettings);
525
-
526
514
  // Main configuration panel with sub-components
527
515
  <AiSettingsPanel isOpen={isConfigOpen} setIsOpen={setIsConfigOpen}>
528
516
  <AiSettingsPanel.ProvidersSettings />
529
517
  <AiSettingsPanel.ModelsSettings />
530
- <AiSettingsPanel.ModelParametersSettings
531
- getDefaultInstructions={getDefaultInstructionsWrapper}
532
- />
518
+ <AiSettingsPanel.ModelParametersSettings />
533
519
  </AiSettingsPanel>
534
520
 
535
521
  // Standalone model selector
536
- <ModelSelector models={models} />
522
+ <ModelSelector />
537
523
  ```
538
524
 
539
525
  ### AI Settings API Reference
@@ -545,7 +531,6 @@ const models = extractModelsFromSettings(aiSettings);
545
531
  - `AiSettingsPanel.ModelsSettings`: Manage available models and their parameters
546
532
  - `AiSettingsPanel.ModelParametersSettings`: Configure model parameters and instructions
547
533
  - **`ModelSelector`**: Standalone model selector for quick switching
548
- - **`extractModelsFromSettings(config)`**: Utility to extract models from configuration
549
534
 
550
535
  #### Slice Configuration
551
536
 
package/dist/index.d.ts CHANGED
@@ -2,31 +2,12 @@
2
2
  * {@include ../README.md}
3
3
  * @packageDocumentation
4
4
  */
5
- export { AiSliceConfig, createAiSlice, useStoreWithAi, createDefaultAiConfig, } from './AiSlice';
6
- export type { AiSliceState } from './AiSlice';
7
- export { QueryControls } from './components/QueryControls';
8
- export { AnalysisResultsContainer } from './components/AnalysisResultsContainer';
9
- export { AnalysisResult } from './components/AnalysisResult';
10
- export { useScrollToBottom } from './hooks/useScrollToBottom';
11
- export type { AiSliceTool } from './AiSlice';
12
- export { QueryToolResult } from './components/tools/QueryToolResult';
13
- export { getDefaultInstructions } from './analysis';
14
- export * from './components/ModelSelector';
15
- export * from './components/SessionControls';
16
- export * from './components/QueryControls';
17
- export * from './components/session/DeleteSessionDialog';
18
- export * from './components/session/SessionActions';
19
- export * from './components/session/SessionDropdown';
20
- export * from './components/session/SessionTitle';
21
- export * from './components/session/SessionType';
22
- export * from './components/tools/ToolErrorMessage';
23
- export { createAiSettingsSlice, useStoreWithAiSettings, AiSettingsSliceConfig, createDefaultAiSettingsConfig, } from './AiSettingsSlice';
24
- export type { AiSettingsSliceState } from './AiSettingsSlice';
25
- export { AiSettingsPanel } from './components/settings/AiSettingsPanel';
26
- export { AiProvidersSettings } from './components/settings/AiProvidersSettings';
27
- export { AiModelsSettings } from './components/settings/AiModelsSettings';
28
- export { AiModelParameters } from './components/settings/AiModelParameters';
29
- export { AiModelUsage } from './components/settings/AiModelUsage';
30
- export type { ModelUsageData } from './components/settings/AiModelUsage';
31
- export { extractModelsFromSettings } from './utils';
5
+ export { QueryToolResult } from './tools/query/QueryToolResult';
6
+ export { QueryToolParameters } from './tools/query/queryTool';
7
+ export { createDefaultAiTools } from './tools/defaultTools';
8
+ export type { DefaultToolsOptions } from './tools/defaultTools';
9
+ export { createDefaultAiInstructions } from './tools/defaultInstructions';
10
+ export * from '@sqlrooms/ai-core';
11
+ export * from '@sqlrooms/ai-config';
12
+ export * from '@sqlrooms/ai-settings';
32
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,aAAa,EACb,aAAa,EACb,cAAc,EACd,qBAAqB,GACtB,MAAM,WAAW,CAAC;AAEnB,YAAY,EAAC,YAAY,EAAC,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAC,aAAa,EAAC,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAC,wBAAwB,EAAC,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAC,cAAc,EAAC,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAC,iBAAiB,EAAC,MAAM,2BAA2B,CAAC;AAC5D,YAAY,EAAC,WAAW,EAAC,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAC,eAAe,EAAC,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAC,sBAAsB,EAAC,MAAM,YAAY,CAAC;AAElD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0CAA0C,CAAC;AACzD,cAAc,qCAAqC,CAAC;AACpD,cAAc,sCAAsC,CAAC;AACrD,cAAc,mCAAmC,CAAC;AAClD,cAAc,kCAAkC,CAAC;AACjD,cAAc,qCAAqC,CAAC;AAEpD,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,6BAA6B,GAC9B,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EAAC,oBAAoB,EAAC,MAAM,mBAAmB,CAAC;AAE5D,OAAO,EAAC,eAAe,EAAC,MAAM,uCAAuC,CAAC;AACtE,OAAO,EAAC,mBAAmB,EAAC,MAAM,2CAA2C,CAAC;AAC9E,OAAO,EAAC,gBAAgB,EAAC,MAAM,wCAAwC,CAAC;AACxE,OAAO,EAAC,iBAAiB,EAAC,MAAM,yCAAyC,CAAC;AAC1E,OAAO,EAAC,YAAY,EAAC,MAAM,oCAAoC,CAAC;AAChE,YAAY,EAAC,cAAc,EAAC,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAC,yBAAyB,EAAC,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAC,eAAe,EAAC,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAC,mBAAmB,EAAC,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAC,oBAAoB,EAAC,MAAM,sBAAsB,CAAC;AAC1D,YAAY,EAAC,mBAAmB,EAAC,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAC,2BAA2B,EAAC,MAAM,6BAA6B,CAAC;AAExE,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC"}
package/dist/index.js CHANGED
@@ -2,27 +2,11 @@
2
2
  * {@include ../README.md}
3
3
  * @packageDocumentation
4
4
  */
5
- export { AiSliceConfig, createAiSlice, useStoreWithAi, createDefaultAiConfig, } from './AiSlice';
6
- export { QueryControls } from './components/QueryControls';
7
- export { AnalysisResultsContainer } from './components/AnalysisResultsContainer';
8
- export { AnalysisResult } from './components/AnalysisResult';
9
- export { useScrollToBottom } from './hooks/useScrollToBottom';
10
- export { QueryToolResult } from './components/tools/QueryToolResult';
11
- export { getDefaultInstructions } from './analysis';
12
- export * from './components/ModelSelector';
13
- export * from './components/SessionControls';
14
- export * from './components/QueryControls';
15
- export * from './components/session/DeleteSessionDialog';
16
- export * from './components/session/SessionActions';
17
- export * from './components/session/SessionDropdown';
18
- export * from './components/session/SessionTitle';
19
- export * from './components/session/SessionType';
20
- export * from './components/tools/ToolErrorMessage';
21
- export { createAiSettingsSlice, useStoreWithAiSettings, AiSettingsSliceConfig, createDefaultAiSettingsConfig, } from './AiSettingsSlice';
22
- export { AiSettingsPanel } from './components/settings/AiSettingsPanel';
23
- export { AiProvidersSettings } from './components/settings/AiProvidersSettings';
24
- export { AiModelsSettings } from './components/settings/AiModelsSettings';
25
- export { AiModelParameters } from './components/settings/AiModelParameters';
26
- export { AiModelUsage } from './components/settings/AiModelUsage';
27
- export { extractModelsFromSettings } from './utils';
5
+ export { QueryToolResult } from './tools/query/QueryToolResult';
6
+ export { QueryToolParameters } from './tools/query/queryTool';
7
+ export { createDefaultAiTools } from './tools/defaultTools';
8
+ export { createDefaultAiInstructions } from './tools/defaultInstructions';
9
+ export * from '@sqlrooms/ai-core';
10
+ export * from '@sqlrooms/ai-config';
11
+ export * from '@sqlrooms/ai-settings';
28
12
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,aAAa,EACb,aAAa,EACb,cAAc,EACd,qBAAqB,GACtB,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAC,aAAa,EAAC,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAC,wBAAwB,EAAC,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAC,cAAc,EAAC,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAC,iBAAiB,EAAC,MAAM,2BAA2B,CAAC;AAE5D,OAAO,EAAC,eAAe,EAAC,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAC,sBAAsB,EAAC,MAAM,YAAY,CAAC;AAElD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0CAA0C,CAAC;AACzD,cAAc,qCAAqC,CAAC;AACpD,cAAc,sCAAsC,CAAC;AACrD,cAAc,mCAAmC,CAAC;AAClD,cAAc,kCAAkC,CAAC;AACjD,cAAc,qCAAqC,CAAC;AAEpD,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,6BAA6B,GAC9B,MAAM,mBAAmB,CAAC;AAI3B,OAAO,EAAC,eAAe,EAAC,MAAM,uCAAuC,CAAC;AACtE,OAAO,EAAC,mBAAmB,EAAC,MAAM,2CAA2C,CAAC;AAC9E,OAAO,EAAC,gBAAgB,EAAC,MAAM,wCAAwC,CAAC;AACxE,OAAO,EAAC,iBAAiB,EAAC,MAAM,yCAAyC,CAAC;AAC1E,OAAO,EAAC,YAAY,EAAC,MAAM,oCAAoC,CAAC;AAEhE,OAAO,EAAC,yBAAyB,EAAC,MAAM,SAAS,CAAC","sourcesContent":["/**\n * {@include ../README.md}\n * @packageDocumentation\n */\n\nexport {\n AiSliceConfig,\n createAiSlice,\n useStoreWithAi,\n createDefaultAiConfig,\n} from './AiSlice';\n\nexport type {AiSliceState} from './AiSlice';\nexport {QueryControls} from './components/QueryControls';\nexport {AnalysisResultsContainer} from './components/AnalysisResultsContainer';\nexport {AnalysisResult} from './components/AnalysisResult';\nexport {useScrollToBottom} from './hooks/useScrollToBottom';\nexport type {AiSliceTool} from './AiSlice';\nexport {QueryToolResult} from './components/tools/QueryToolResult';\nexport {getDefaultInstructions} from './analysis';\n\nexport * from './components/ModelSelector';\nexport * from './components/SessionControls';\nexport * from './components/QueryControls';\nexport * from './components/session/DeleteSessionDialog';\nexport * from './components/session/SessionActions';\nexport * from './components/session/SessionDropdown';\nexport * from './components/session/SessionTitle';\nexport * from './components/session/SessionType';\nexport * from './components/tools/ToolErrorMessage';\n\nexport {\n createAiSettingsSlice,\n useStoreWithAiSettings,\n AiSettingsSliceConfig,\n createDefaultAiSettingsConfig,\n} from './AiSettingsSlice';\n\nexport type {AiSettingsSliceState} from './AiSettingsSlice';\n\nexport {AiSettingsPanel} from './components/settings/AiSettingsPanel';\nexport {AiProvidersSettings} from './components/settings/AiProvidersSettings';\nexport {AiModelsSettings} from './components/settings/AiModelsSettings';\nexport {AiModelParameters} from './components/settings/AiModelParameters';\nexport {AiModelUsage} from './components/settings/AiModelUsage';\nexport type {ModelUsageData} from './components/settings/AiModelUsage';\nexport {extractModelsFromSettings} from './utils';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAC,eAAe,EAAC,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAC,mBAAmB,EAAC,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAC,oBAAoB,EAAC,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAC,2BAA2B,EAAC,MAAM,6BAA6B,CAAC;AAExE,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC","sourcesContent":["/**\n * {@include ../README.md}\n * @packageDocumentation\n */\n\nexport {QueryToolResult} from './tools/query/QueryToolResult';\nexport {QueryToolParameters} from './tools/query/queryTool';\nexport {createDefaultAiTools} from './tools/defaultTools';\nexport type {DefaultToolsOptions} from './tools/defaultTools';\nexport {createDefaultAiInstructions} from './tools/defaultInstructions';\n\nexport * from '@sqlrooms/ai-core';\nexport * from '@sqlrooms/ai-config';\nexport * from '@sqlrooms/ai-settings';\n"]}
@@ -0,0 +1,8 @@
1
+ import { AiSliceState } from '@sqlrooms/ai-core';
2
+ import { DuckDbSliceState } from '@sqlrooms/duckdb';
3
+ import { StoreApi } from '@sqlrooms/room-shell';
4
+ /**
5
+ * Returns the default system instructions for the AI assistant
6
+ */
7
+ export declare function createDefaultAiInstructions(store: StoreApi<AiSliceState & DuckDbSliceState>): string;
8
+ //# sourceMappingURL=defaultInstructions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaultInstructions.d.ts","sourceRoot":"","sources":["../../src/tools/defaultInstructions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAC,gBAAgB,EAAC,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAC,QAAQ,EAAC,MAAM,sBAAsB,CAAC;AA2D9C;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,QAAQ,CAAC,YAAY,GAAG,gBAAgB,CAAC,GAC/C,MAAM,CAGR"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * System prompt template for the AI assistant that provides instructions for:
3
+ * - Using DuckDB-specific SQL syntax and functions
4
+ * - Handling query results and error cases
5
+ * - Creating visualizations with VegaLite
6
+ * - Formatting final answers
7
+ */
8
+ const DEFAULT_INSTRUCTIONS = `
9
+ You are analyzing tables in DuckDB database in the context of a room.
10
+
11
+ Instructions for analysis:
12
+ - When using 'query' tool, please assign parameter 'type' with value 'query'
13
+ - Use DuckDB-specific SQL syntax and functions (not Oracle, PostgreSQL, or other SQL dialects)
14
+ - Some key DuckDB-specific functions to use:
15
+ * regexp_matches() for regex (not regexp_like)
16
+ * strftime() for date formatting (not to_char)
17
+ * list_aggregate() for array operations
18
+ * unnest() for array expansion
19
+ * regr_sxy()
20
+ * corr()
21
+ * skewness()
22
+ - Please always try to use SQL queries to answer users questions
23
+ - Please run tool calls sequentially, don't run multiple tool calls in parallel
24
+ - IMPORTANT: Do not list out raw query results in your response. Instead:
25
+ * Describe the results in natural language
26
+ * Provide summary statistics
27
+ * Use comparisons and relative terms
28
+ * Include only the most relevant values if necessary
29
+ - Break down complex problems into smaller steps
30
+ - Use "SUMMARIZE table_name"for quick overview of the table
31
+ - Please don't modify data
32
+ - IMPORTANT: When you receive an error response from a tool call (where success: false):
33
+ * Stop making any further tool calls immediately
34
+ * Return a final answer that includes the error message
35
+ * Explain what went wrong and suggest possible fixes if applicable
36
+
37
+ When creating visualizations:
38
+ - Follow VegaLite syntax
39
+ - Choose appropriate chart types based on the data and analysis goals
40
+ - Use clear titles and axis labels
41
+ - Consider color schemes for better readability
42
+ - Add meaningful tooltips when relevant
43
+ - Format numbers and dates appropriately
44
+ - Use aggregations when dealing with large datasets
45
+
46
+ For your final answer:
47
+ - Provide an explanation for how you got it
48
+ - Explain your reasoning step by step
49
+ - Include relevant statistics or metrics
50
+ - For each prompt, please always provide the final answer.
51
+ - IMPORTANT: Query tool results may include sample rows (firstRows) or may be empty:
52
+ * If no sample rows provided: Never fabricate data. Direct users to the table component for actual results.
53
+ * If sample rows provided: Use them to enhance your analysis, but always direct users to the table component for complete results.
54
+
55
+ Please use the following schema for the tables:
56
+ `;
57
+ /**
58
+ * Returns the default system instructions for the AI assistant
59
+ */
60
+ export function createDefaultAiInstructions(store) {
61
+ const tables = store.getState().db.tables;
62
+ return `${DEFAULT_INSTRUCTIONS}\n${JSON.stringify(tables)}`;
63
+ }
64
+ //# sourceMappingURL=defaultInstructions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaultInstructions.js","sourceRoot":"","sources":["../../src/tools/defaultInstructions.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgD5B,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,2BAA2B,CACzC,KAAgD;IAEhD,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC;IAC1C,OAAO,GAAG,oBAAoB,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;AAC9D,CAAC","sourcesContent":["import {AiSliceState} from '@sqlrooms/ai-core';\nimport {DuckDbSliceState} from '@sqlrooms/duckdb';\nimport {StoreApi} from '@sqlrooms/room-shell';\n\n/**\n * System prompt template for the AI assistant that provides instructions for:\n * - Using DuckDB-specific SQL syntax and functions\n * - Handling query results and error cases\n * - Creating visualizations with VegaLite\n * - Formatting final answers\n */\nconst DEFAULT_INSTRUCTIONS = `\nYou are analyzing tables in DuckDB database in the context of a room.\n\nInstructions for analysis:\n- When using 'query' tool, please assign parameter 'type' with value 'query'\n- Use DuckDB-specific SQL syntax and functions (not Oracle, PostgreSQL, or other SQL dialects)\n- Some key DuckDB-specific functions to use:\n * regexp_matches() for regex (not regexp_like)\n * strftime() for date formatting (not to_char)\n * list_aggregate() for array operations\n * unnest() for array expansion\n * regr_sxy()\n * corr()\n * skewness()\n- Please always try to use SQL queries to answer users questions\n- Please run tool calls sequentially, don't run multiple tool calls in parallel\n- IMPORTANT: Do not list out raw query results in your response. Instead:\n * Describe the results in natural language\n * Provide summary statistics\n * Use comparisons and relative terms\n * Include only the most relevant values if necessary\n- Break down complex problems into smaller steps\n- Use \"SUMMARIZE table_name\"for quick overview of the table\n- Please don't modify data\n- IMPORTANT: When you receive an error response from a tool call (where success: false):\n * Stop making any further tool calls immediately\n * Return a final answer that includes the error message\n * Explain what went wrong and suggest possible fixes if applicable\n\nWhen creating visualizations:\n- Follow VegaLite syntax\n- Choose appropriate chart types based on the data and analysis goals\n- Use clear titles and axis labels\n- Consider color schemes for better readability\n- Add meaningful tooltips when relevant\n- Format numbers and dates appropriately\n- Use aggregations when dealing with large datasets\n\nFor your final answer:\n- Provide an explanation for how you got it\n- Explain your reasoning step by step\n- Include relevant statistics or metrics\n- For each prompt, please always provide the final answer.\n- IMPORTANT: Query tool results may include sample rows (firstRows) or may be empty:\n * If no sample rows provided: Never fabricate data. Direct users to the table component for actual results.\n * If sample rows provided: Use them to enhance your analysis, but always direct users to the table component for complete results.\n\nPlease use the following schema for the tables:\n`;\n\n/**\n * Returns the default system instructions for the AI assistant\n */\nexport function createDefaultAiInstructions(\n store: StoreApi<AiSliceState & DuckDbSliceState>,\n): string {\n const tables = store.getState().db.tables;\n return `${DEFAULT_INSTRUCTIONS}\\n${JSON.stringify(tables)}`;\n}\n"]}
@@ -0,0 +1,14 @@
1
+ import { AiSliceState, AiSliceTool } from '@sqlrooms/ai-core';
2
+ import { DuckDbSliceState } from '@sqlrooms/duckdb';
3
+ import { StoreApi } from '@sqlrooms/room-shell';
4
+ import { QueryToolOptions } from './query/queryTool';
5
+ export type DefaultToolsOptions = {
6
+ query?: QueryToolOptions;
7
+ };
8
+ /**
9
+ * Default tools available to the AI assistant for data analysis
10
+ * Includes:
11
+ * - query: Executes SQL queries against DuckDB
12
+ */
13
+ export declare function createDefaultAiTools(store: StoreApi<AiSliceState & DuckDbSliceState>, options?: DefaultToolsOptions): Record<string, AiSliceTool>;
14
+ //# sourceMappingURL=defaultTools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaultTools.d.ts","sourceRoot":"","sources":["../../src/tools/defaultTools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAE,WAAW,EAAC,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAC,gBAAgB,EAAC,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAC,QAAQ,EAAC,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAkB,gBAAgB,EAAC,MAAM,mBAAmB,CAAC;AAEpE,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,CAAC,EAAE,gBAAgB,CAAC;CAC1B,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,QAAQ,CAAC,YAAY,GAAG,gBAAgB,CAAC,EAChD,OAAO,CAAC,EAAE,mBAAmB,GAC5B,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAK7B"}
@@ -0,0 +1,13 @@
1
+ import { createQueryTool } from './query/queryTool';
2
+ /**
3
+ * Default tools available to the AI assistant for data analysis
4
+ * Includes:
5
+ * - query: Executes SQL queries against DuckDB
6
+ */
7
+ export function createDefaultAiTools(store, options) {
8
+ const { query } = options || {};
9
+ return {
10
+ query: createQueryTool(store, query),
11
+ };
12
+ }
13
+ //# sourceMappingURL=defaultTools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaultTools.js","sourceRoot":"","sources":["../../src/tools/defaultTools.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,eAAe,EAAmB,MAAM,mBAAmB,CAAC;AAMpE;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,KAAgD,EAChD,OAA6B;IAE7B,MAAM,EAAC,KAAK,EAAC,GAAG,OAAO,IAAI,EAAE,CAAC;IAC9B,OAAO;QACL,KAAK,EAAE,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC;KACrC,CAAC;AACJ,CAAC","sourcesContent":["import {AiSliceState, AiSliceTool} from '@sqlrooms/ai-core';\nimport {DuckDbSliceState} from '@sqlrooms/duckdb';\nimport {StoreApi} from '@sqlrooms/room-shell';\nimport {createQueryTool, QueryToolOptions} from './query/queryTool';\n\nexport type DefaultToolsOptions = {\n query?: QueryToolOptions;\n};\n\n/**\n * Default tools available to the AI assistant for data analysis\n * Includes:\n * - query: Executes SQL queries against DuckDB\n */\nexport function createDefaultAiTools(\n store: StoreApi<AiSliceState & DuckDbSliceState>,\n options?: DefaultToolsOptions,\n): Record<string, AiSliceTool> {\n const {query} = options || {};\n return {\n query: createQueryTool(store, query),\n };\n}\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueryToolResult.d.ts","sourceRoot":"","sources":["../../../src/tools/query/QueryToolResult.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAGtC,KAAK,oBAAoB,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,kEAAkE;IAClE,UAAU,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC;CAC1B,CAAC;AAEF,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,2CA2C1D"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueryToolResult.js","sourceRoot":"","sources":["../../../src/tools/query/QueryToolResult.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,cAAc,EAAC,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAC,MAAM,EAAE,UAAU,EAAE,aAAa,EAAC,MAAM,cAAc,CAAC;AAE/D,OAAO,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AASvC,MAAM,UAAU,eAAe,CAAC,KAA2B;IACzD,MAAM,EAAC,KAAK,EAAE,QAAQ,EAAC,GAAG,KAAK,CAAC;IAChC,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,OAAO,CACL,8BACE,eAAK,SAAS,EAAC,6GAA6G,aAC1H,cAAK,SAAS,EAAC,sCAAsC,YAAE,QAAQ,GAAO,EACtE,cAAK,SAAS,EAAC,wBAAwB,YACrC,KAAC,UAAU,IACT,IAAI,EAAE,QAAQ,EACd,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,MAAM,EACX,SAAS,EAAC,SAAS,EACnB,SAAS,EAAC,UAAU,GACpB,GACE,IACF,EACN,cAAK,SAAS,EAAC,yBAAyB,YACtC,MAAC,MAAM,IAAC,OAAO,EAAC,OAAO,EAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAE,UAAU,CAAC,MAAM,aAC1D,KAAC,SAAS,IAAC,SAAS,EAAC,SAAS,GAAG,EACjC,aAAI,SAAS,EAAC,SAAS,kCAAuB,IACvC,GACL,EAEL,YAAY,IAAI,KAAK,CAAC,CAAC,CAAC,CACvB,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CACjB,KAAC,cAAc,IACb,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,KAAK,CAAC,UAAU,EAC5B,UAAU,EAAE,UAAU,GACtB,CACH,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,aAAa,wBAAc,CAC3C,CACF,CAAC,CAAC,CAAC,CACF,KAAC,cAAc,IACb,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,QAAQ,EACf,UAAU,EAAE,UAAU,GACtB,CACH,IACA,CACJ,CAAC;AACJ,CAAC","sourcesContent":["import {DataTableModal} from '@sqlrooms/data-table';\nimport {Button, CopyButton, useDisclosure} from '@sqlrooms/ui';\nimport * as arrow from 'apache-arrow';\nimport {TableIcon} from 'lucide-react';\n\ntype QueryToolResultProps = {\n title: string;\n sqlQuery: string;\n /** Provided in case the query result is already an arrow table */\n arrowTable?: arrow.Table;\n};\n\nexport function QueryToolResult(props: QueryToolResultProps) {\n const {title, sqlQuery} = props;\n const tableModal = useDisclosure();\n return (\n <>\n <div className=\"text-muted-foreground bg-muted relative max-h-[150px] w-full overflow-auto rounded-md p-2 font-mono text-xs\">\n <pre className=\"whitespace-pre-wrap break-words pr-8\">{sqlQuery}</pre>\n <div className=\"absolute right-1 top-1\">\n <CopyButton\n text={sqlQuery}\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n ariaLabel=\"Copy SQL\"\n />\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button variant=\"ghost\" size=\"xs\" onClick={tableModal.onOpen}>\n <TableIcon className=\"h-4 w-4\" />\n <h3 className=\"text-xs\">Show Query Result</h3>\n </Button>\n </div>\n\n {'arrowTable' in props ? (\n props.arrowTable ? (\n <DataTableModal\n title={title}\n arrowTable={props.arrowTable}\n tableModal={tableModal}\n />\n ) : (\n <div className=\"p-4 text-xs\">No data</div>\n )\n ) : (\n <DataTableModal\n title={title}\n query={sqlQuery}\n tableModal={tableModal}\n />\n )}\n </>\n );\n}\n"]}
@@ -0,0 +1,25 @@
1
+ import { AiSliceState, AiSliceTool } from '@sqlrooms/ai-core';
2
+ import { DuckDbSliceState } from '@sqlrooms/duckdb';
3
+ import type { StoreApi } from '@sqlrooms/room-shell';
4
+ import { z } from 'zod';
5
+ export declare const QueryToolParameters: z.ZodObject<{
6
+ type: z.ZodLiteral<"query">;
7
+ sqlQuery: z.ZodString;
8
+ reasoning: z.ZodString;
9
+ }, "strip", z.ZodTypeAny, {
10
+ sqlQuery: string;
11
+ type: "query";
12
+ reasoning: string;
13
+ }, {
14
+ sqlQuery: string;
15
+ type: "query";
16
+ reasoning: string;
17
+ }>;
18
+ export type QueryToolParameters = z.infer<typeof QueryToolParameters>;
19
+ export type QueryToolOptions = {
20
+ readOnly?: boolean;
21
+ autoSummary?: boolean;
22
+ numberOfRowsToShareWithLLM?: number;
23
+ };
24
+ export declare function createQueryTool(store: StoreApi<AiSliceState & DuckDbSliceState>, options?: QueryToolOptions): AiSliceTool;
25
+ //# sourceMappingURL=queryTool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryTool.d.ts","sourceRoot":"","sources":["../../../src/tools/query/queryTool.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,YAAY,EAAE,WAAW,EAAC,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAGL,gBAAgB,EAEjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAGtB,eAAO,MAAM,mBAAmB;;;;;;;;;;;;EAI9B,CAAC;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEtE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,0BAA0B,CAAC,EAAE,MAAM,CAAC;CACrC,CAAC;AAEF,wBAAgB,eAAe,CAC7B,KAAK,EAAE,QAAQ,CAAC,YAAY,GAAG,gBAAgB,CAAC,EAChD,OAAO,CAAC,EAAE,gBAAgB,GACzB,WAAW,CA6Fb"}
@@ -0,0 +1,108 @@
1
+ import { extendedTool } from '@openassistant/utils';
2
+ import { arrowTableToJson, splitSqlStatements, } from '@sqlrooms/duckdb';
3
+ import { z } from 'zod';
4
+ import { QueryToolResult } from './QueryToolResult';
5
+ export const QueryToolParameters = z.object({
6
+ type: z.literal('query'),
7
+ sqlQuery: z.string(),
8
+ reasoning: z.string(),
9
+ });
10
+ export function createQueryTool(store, options) {
11
+ const { readOnly = true, autoSummary = false, numberOfRowsToShareWithLLM = 0, } = options || {};
12
+ return extendedTool({
13
+ description: `A tool for running SQL queries on the tables in the database.
14
+ Please only run one query at a time.
15
+ If a query fails, please don't try to run it again with the same syntax.`,
16
+ parameters: QueryToolParameters,
17
+ execute: async ({ type, sqlQuery }) => {
18
+ try {
19
+ const connector = await store.getState().db.getConnector();
20
+ // TODO use options.abortSignal: maybe call db.cancelPendingQuery
21
+ const result = await connector.query(sqlQuery);
22
+ const parsedQuery = await store.getState().db.sqlSelectToJson(sqlQuery);
23
+ if (parsedQuery.error &&
24
+ // Only SELECT statements can be serialized to json, so we ignore not implemented errors
25
+ parsedQuery.error_type !== 'not implemented') {
26
+ throw new Error(parsedQuery.error_message);
27
+ }
28
+ if (readOnly) {
29
+ if (parsedQuery.error) {
30
+ throw new Error(`Query is not a valid SELECT statement: ${parsedQuery.error_message}`);
31
+ }
32
+ if (parsedQuery.statements.length !== 1 || // only one statement allowed
33
+ parsedQuery.statements[0]?.node.type !== 'SELECT_NODE' // only SELECT statements allowed
34
+ ) {
35
+ throw new Error('Query is not a valid SELECT statement');
36
+ }
37
+ }
38
+ const summaryData = await (async () => {
39
+ if (!autoSummary)
40
+ return null;
41
+ if (parsedQuery.error)
42
+ return null;
43
+ const lastNode = parsedQuery.statements[parsedQuery.statements.length - 1]?.node;
44
+ // Only get summary if the last statement isn't already a SUMMARIZE query
45
+ if (lastNode?.type === 'SELECT_NODE' &&
46
+ lastNode?.from_table?.show_type === 'SUMMARY') {
47
+ return arrowTableToJson(result);
48
+ }
49
+ const statements = splitSqlStatements(sqlQuery);
50
+ const lastStatement = statements[statements.length - 1];
51
+ if (!lastStatement)
52
+ return null;
53
+ return await getQuerySummary(connector, lastStatement);
54
+ })();
55
+ // Conditionally get rows of the result as a json object based on numberOfRowsToShareWithLLM
56
+ const firstRows = numberOfRowsToShareWithLLM > 0
57
+ ? arrowTableToJson(result.slice(0, numberOfRowsToShareWithLLM))
58
+ : [];
59
+ return {
60
+ llmResult: {
61
+ success: true,
62
+ data: {
63
+ type,
64
+ summary: summaryData,
65
+ ...(numberOfRowsToShareWithLLM > 0 ? { firstRows } : {}),
66
+ },
67
+ },
68
+ additionalData: {
69
+ title: 'Query Result',
70
+ sqlQuery,
71
+ },
72
+ };
73
+ }
74
+ catch (error) {
75
+ return {
76
+ llmResult: {
77
+ success: false,
78
+ details: 'Query execution failed.',
79
+ errorMessage: error instanceof Error ? error.message : 'Unknown error',
80
+ },
81
+ };
82
+ }
83
+ },
84
+ component: QueryToolResult,
85
+ });
86
+ }
87
+ /**
88
+ * Generates summary statistics for a SQL query result
89
+ * @param connector - DuckDB connection instance
90
+ * @param sqlQuery - SQL SELECT query to analyze
91
+ * @returns Summary statistics as JSON object, or null if the query is not a SELECT statement or if summary generation fails
92
+ */
93
+ async function getQuerySummary(connector, sqlQuery) {
94
+ if (!sqlQuery.toLowerCase().trim().startsWith('select')) {
95
+ return null;
96
+ }
97
+ try {
98
+ const summaryResult = await connector.query(`SUMMARIZE (
99
+ ${sqlQuery}
100
+ )`);
101
+ return arrowTableToJson(summaryResult);
102
+ }
103
+ catch (error) {
104
+ console.warn('Failed to get summary for query. Error:', error);
105
+ return null;
106
+ }
107
+ }
108
+ //# sourceMappingURL=queryTool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryTool.js","sourceRoot":"","sources":["../../../src/tools/query/queryTool.ts"],"names":[],"mappings":"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","sourcesContent":["import {extendedTool} from '@openassistant/utils';\nimport {AiSliceState, AiSliceTool} from '@sqlrooms/ai-core';\nimport {\n arrowTableToJson,\n DuckDbConnector,\n DuckDbSliceState,\n splitSqlStatements,\n} from '@sqlrooms/duckdb';\nimport type {StoreApi} from '@sqlrooms/room-shell';\nimport {z} from 'zod';\nimport {QueryToolResult} from './QueryToolResult';\n\nexport const QueryToolParameters = z.object({\n type: z.literal('query'),\n sqlQuery: z.string(),\n reasoning: z.string(),\n});\nexport type QueryToolParameters = z.infer<typeof QueryToolParameters>;\n\nexport type QueryToolOptions = {\n readOnly?: boolean;\n autoSummary?: boolean;\n numberOfRowsToShareWithLLM?: number;\n};\n\nexport function createQueryTool(\n store: StoreApi<AiSliceState & DuckDbSliceState>,\n options?: QueryToolOptions,\n): AiSliceTool {\n const {\n readOnly = true,\n autoSummary = false,\n numberOfRowsToShareWithLLM = 0,\n } = options || {};\n return extendedTool({\n description: `A tool for running SQL queries on the tables in the database.\nPlease only run one query at a time.\nIf a query fails, please don't try to run it again with the same syntax.`,\n parameters: QueryToolParameters,\n execute: async ({type, sqlQuery}) => {\n try {\n const connector = await store.getState().db.getConnector();\n // TODO use options.abortSignal: maybe call db.cancelPendingQuery\n const result = await connector.query(sqlQuery);\n\n const parsedQuery = await store.getState().db.sqlSelectToJson(sqlQuery);\n\n if (\n parsedQuery.error &&\n // Only SELECT statements can be serialized to json, so we ignore not implemented errors\n parsedQuery.error_type !== 'not implemented'\n ) {\n throw new Error(parsedQuery.error_message);\n }\n\n if (readOnly) {\n if (parsedQuery.error) {\n throw new Error(\n `Query is not a valid SELECT statement: ${parsedQuery.error_message}`,\n );\n }\n if (\n parsedQuery.statements.length !== 1 || // only one statement allowed\n parsedQuery.statements[0]?.node.type !== 'SELECT_NODE' // only SELECT statements allowed\n ) {\n throw new Error('Query is not a valid SELECT statement');\n }\n }\n\n const summaryData = await (async () => {\n if (!autoSummary) return null;\n if (parsedQuery.error) return null;\n const lastNode =\n parsedQuery.statements[parsedQuery.statements.length - 1]?.node;\n\n // Only get summary if the last statement isn't already a SUMMARIZE query\n if (\n lastNode?.type === 'SELECT_NODE' &&\n lastNode?.from_table?.show_type === 'SUMMARY'\n ) {\n return arrowTableToJson(result);\n }\n const statements = splitSqlStatements(sqlQuery);\n const lastStatement = statements[statements.length - 1];\n if (!lastStatement) return null;\n return await getQuerySummary(connector, lastStatement);\n })();\n\n // Conditionally get rows of the result as a json object based on numberOfRowsToShareWithLLM\n const firstRows =\n numberOfRowsToShareWithLLM > 0\n ? arrowTableToJson(result.slice(0, numberOfRowsToShareWithLLM))\n : [];\n\n return {\n llmResult: {\n success: true,\n data: {\n type,\n summary: summaryData,\n ...(numberOfRowsToShareWithLLM > 0 ? {firstRows} : {}),\n },\n },\n additionalData: {\n title: 'Query Result',\n sqlQuery,\n },\n };\n } catch (error) {\n return {\n llmResult: {\n success: false,\n details: 'Query execution failed.',\n errorMessage:\n error instanceof Error ? error.message : 'Unknown error',\n },\n };\n }\n },\n component: QueryToolResult,\n });\n}\n\n/**\n * Generates summary statistics for a SQL query result\n * @param connector - DuckDB connection instance\n * @param sqlQuery - SQL SELECT query to analyze\n * @returns Summary statistics as JSON object, or null if the query is not a SELECT statement or if summary generation fails\n */\nasync function getQuerySummary(connector: DuckDbConnector, sqlQuery: string) {\n if (!sqlQuery.toLowerCase().trim().startsWith('select')) {\n return null;\n }\n\n try {\n const summaryResult = await connector.query(`SUMMARIZE (\n ${sqlQuery}\n )`);\n return arrowTableToJson(summaryResult);\n } catch (error) {\n console.warn('Failed to get summary for query. Error:', error);\n return null;\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sqlrooms/ai",
3
- "version": "0.25.0-rc.0",
3
+ "version": "0.26.0-rc.1",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "module": "dist/index.js",
@@ -18,26 +18,21 @@
18
18
  "access": "public"
19
19
  },
20
20
  "dependencies": {
21
- "@ai-sdk/provider": "^1.1.3",
22
- "@openassistant/core": "0.5.17",
23
- "@openassistant/utils": "0.5.17",
24
- "@paralleldrive/cuid2": "^2.2.2",
25
- "@sqlrooms/data-table": "0.25.0-rc.0",
26
- "@sqlrooms/duckdb": "0.25.0-rc.0",
27
- "@sqlrooms/monaco-editor": "0.25.0-rc.0",
28
- "@sqlrooms/recharts": "0.25.0-rc.0",
29
- "@sqlrooms/room-config": "0.25.0-rc.0",
30
- "@sqlrooms/room-shell": "0.25.0-rc.0",
31
- "@sqlrooms/ui": "0.25.0-rc.0",
32
- "@sqlrooms/utils": "0.25.0-rc.0",
21
+ "@sqlrooms/ai-config": "0.26.0-rc.1",
22
+ "@sqlrooms/ai-core": "0.26.0-rc.1",
23
+ "@sqlrooms/ai-settings": "0.26.0-rc.1",
24
+ "@sqlrooms/duckdb": "0.26.0-rc.1",
25
+ "@sqlrooms/room-shell": "0.26.0-rc.1",
26
+ "@sqlrooms/ui": "0.26.0-rc.1",
27
+ "@sqlrooms/utils": "0.26.0-rc.1",
33
28
  "ai": "^4.3.19",
34
- "immer": "^10.1.1",
35
- "lucide-react": "^0.475.0",
29
+ "immer": "^10.1.3",
30
+ "lucide-react": "^0.544.0",
36
31
  "react-markdown": "^10.1.0",
37
32
  "recharts": "^2.12.7",
38
33
  "rehype-raw": "^7.0.0",
39
34
  "remark-gfm": "^4.0.0",
40
- "zod": "^3.25.73"
35
+ "zod": "^3.25.76"
41
36
  },
42
37
  "peerDependencies": {
43
38
  "apache-arrow": "17.0.0",
@@ -51,5 +46,5 @@
51
46
  "typecheck": "tsc --noEmit",
52
47
  "typedoc": "typedoc"
53
48
  },
54
- "gitHead": "063d7608fe608031c690ea3b2e67bb1f4e25a8dd"
55
- }
49
+ "gitHead": "803cf5fa875f7099746a48db15a3111aee5c0359"
50
+ }