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

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 +10 -15
  21. package/dist/AiSettingsSlice.d.ts +0 -148
  22. package/dist/AiSettingsSlice.d.ts.map +0 -1
  23. package/dist/AiSettingsSlice.js +0 -180
  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 -413
  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 -17
  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/dist/AiSlice.js DELETED
@@ -1,413 +0,0 @@
1
- import { createId } from '@paralleldrive/cuid2';
2
- import { createSlice, useBaseRoomShellStore, } from '@sqlrooms/room-shell';
3
- import { produce } from 'immer';
4
- import { z } from 'zod';
5
- import { getDefaultInstructions, getDefaultTools, runAnalysis, } from './analysis';
6
- import { AnalysisSessionSchema, } from './schemas';
7
- export const AiSliceConfig = z.object({
8
- ai: z.object({
9
- sessions: z.array(AnalysisSessionSchema),
10
- currentSessionId: z.string().optional(),
11
- }),
12
- });
13
- export function createDefaultAiConfig(props) {
14
- const defaultSessionId = createId();
15
- return {
16
- ai: {
17
- sessions: [
18
- {
19
- id: defaultSessionId,
20
- name: 'Default Session',
21
- modelProvider: 'openai',
22
- model: 'gpt-4.1',
23
- analysisResults: [],
24
- createdAt: new Date(),
25
- },
26
- ],
27
- currentSessionId: defaultSessionId,
28
- ...props,
29
- },
30
- };
31
- }
32
- export function createAiSlice(params) {
33
- const { defaultProvider = 'openai', defaultModel = 'gpt-4.1', initialAnalysisPrompt = '', customTools = {}, toolsOptions, getApiKey, getBaseUrl, maxSteps, getInstructions, } = params;
34
- return createSlice((set, get, store) => {
35
- return {
36
- ai: {
37
- analysisPrompt: initialAnalysisPrompt,
38
- isRunningAnalysis: false,
39
- tools: {
40
- ...getDefaultTools(store, toolsOptions),
41
- ...customTools,
42
- },
43
- setAnalysisPrompt: (prompt) => {
44
- set((state) => produce(state, (draft) => {
45
- draft.ai.analysisPrompt = prompt;
46
- }));
47
- },
48
- /**
49
- * Set the AI model for the current session
50
- * @param model - The model to set
51
- */
52
- setAiModel: (modelProvider, model) => {
53
- set((state) => produce(state, (draft) => {
54
- const currentSession = getCurrentSessionFromState(draft);
55
- if (currentSession) {
56
- currentSession.modelProvider = modelProvider;
57
- currentSession.model = model;
58
- }
59
- }));
60
- },
61
- /**
62
- * Get the current active session
63
- */
64
- getCurrentSession: () => {
65
- const state = get();
66
- const { currentSessionId, sessions } = state.config.ai;
67
- return sessions.find((session) => session.id === currentSessionId);
68
- },
69
- /**
70
- * Create a new session with the given name and model settings
71
- */
72
- createSession: (name, modelProvider, model) => {
73
- const currentSession = get().ai.getCurrentSession();
74
- const newSessionId = createId();
75
- // Generate a default name if none is provided
76
- let sessionName = name;
77
- if (!sessionName) {
78
- // Generate a human-readable date and time for the session name
79
- const now = new Date();
80
- const formattedDate = now.toLocaleDateString('en-US', {
81
- month: 'short',
82
- day: 'numeric',
83
- year: 'numeric',
84
- });
85
- const formattedTime = now.toLocaleTimeString('en-US', {
86
- hour: 'numeric',
87
- minute: 'numeric',
88
- hour12: true,
89
- });
90
- sessionName = `Session ${formattedDate} at ${formattedTime}`;
91
- }
92
- set((state) => produce(state, (draft) => {
93
- // Add to AI sessions
94
- draft.config.ai.sessions.unshift({
95
- id: newSessionId,
96
- name: sessionName,
97
- modelProvider: modelProvider || currentSession?.modelProvider || 'openai',
98
- model: model || currentSession?.model || 'gpt-4.1',
99
- analysisResults: [],
100
- createdAt: new Date(),
101
- });
102
- draft.config.ai.currentSessionId = newSessionId;
103
- }));
104
- },
105
- /**
106
- * Switch to a different session
107
- */
108
- switchSession: (sessionId) => {
109
- set((state) => produce(state, (draft) => {
110
- draft.config.ai.currentSessionId = sessionId;
111
- }));
112
- },
113
- /**
114
- * Rename an existing session
115
- */
116
- renameSession: (sessionId, name) => {
117
- set((state) => produce(state, (draft) => {
118
- const session = draft.config.ai.sessions.find((s) => s.id === sessionId);
119
- if (session) {
120
- session.name = name;
121
- }
122
- }));
123
- },
124
- /**
125
- * Delete a session
126
- */
127
- deleteSession: (sessionId) => {
128
- set((state) => produce(state, (draft) => {
129
- const sessionIndex = draft.config.ai.sessions.findIndex((s) => s.id === sessionId);
130
- if (sessionIndex !== -1) {
131
- // Don't delete the last session
132
- if (draft.config.ai.sessions.length > 1) {
133
- draft.config.ai.sessions.splice(sessionIndex, 1);
134
- // If we deleted the current session, switch to another one
135
- if (draft.config.ai.currentSessionId === sessionId) {
136
- // Make sure there's at least one session before accessing its id
137
- if (draft.config.ai.sessions.length > 0) {
138
- const firstSession = draft.config.ai.sessions[0];
139
- if (firstSession) {
140
- draft.config.ai.currentSessionId = firstSession.id;
141
- }
142
- }
143
- }
144
- }
145
- }
146
- }));
147
- },
148
- /**
149
- * Start the analysis
150
- * TODO: how to pass the history analysisResults?
151
- */
152
- startAnalysis: async () => {
153
- const resultId = createId();
154
- const abortController = new AbortController();
155
- const currentSession = get().ai.getCurrentSession();
156
- if (!currentSession) {
157
- console.error('No current session found');
158
- return;
159
- }
160
- set((state) => produce(state, (draft) => {
161
- draft.ai.analysisAbortController = abortController;
162
- draft.ai.isRunningAnalysis = true;
163
- const session = draft.config.ai.sessions.find((s) => s.id === draft.config.ai.currentSessionId);
164
- if (session) {
165
- session.analysisResults.push({
166
- id: resultId,
167
- prompt: get().ai.analysisPrompt,
168
- streamMessage: {
169
- parts: [
170
- {
171
- type: 'text',
172
- text: '',
173
- },
174
- ],
175
- },
176
- isCompleted: false,
177
- });
178
- }
179
- }));
180
- try {
181
- await runAnalysis({
182
- tableSchemas: get().db.tables,
183
- modelProvider: currentSession.modelProvider || defaultProvider,
184
- model: currentSession.model || defaultModel,
185
- apiKey: get().ai.getApiKeyFromSettings(),
186
- baseUrl: get().ai.getBaseUrlFromSettings(),
187
- prompt: get().ai.analysisPrompt,
188
- abortController,
189
- tools: get().ai.tools,
190
- maxSteps: get().ai.getMaxStepsFromSettings(),
191
- getInstructions: get().ai.getInstructionsFromSettings,
192
- historyAnalysis: currentSession.analysisResults,
193
- onStreamResult: (isCompleted, streamMessage) => {
194
- set(makeResultsAppender({
195
- resultId,
196
- streamMessage,
197
- isCompleted,
198
- }));
199
- },
200
- });
201
- }
202
- catch (err) {
203
- set(makeResultsAppender({
204
- resultId,
205
- isCompleted: true,
206
- errorMessage: {
207
- error: err instanceof Error ? err.message : String(err),
208
- },
209
- }));
210
- }
211
- finally {
212
- set((state) => produce(state, (draft) => {
213
- draft.ai.isRunningAnalysis = false;
214
- draft.ai.analysisPrompt = '';
215
- }));
216
- }
217
- },
218
- cancelAnalysis: () => {
219
- set((state) => produce(state, (draft) => {
220
- draft.ai.isRunningAnalysis = false;
221
- }));
222
- get().ai.analysisAbortController?.abort('Analysis cancelled');
223
- },
224
- /**
225
- * Delete an analysis result from a session
226
- */
227
- deleteAnalysisResult: (sessionId, resultId) => {
228
- set((state) => produce(state, (draft) => {
229
- const session = draft.config.ai.sessions.find((s) => s.id === sessionId);
230
- if (session) {
231
- session.analysisResults = session.analysisResults.filter((r) => r.id !== resultId);
232
- }
233
- }));
234
- },
235
- findToolComponent: (toolName) => {
236
- return Object.entries(get().ai.tools).find(([name]) => name === toolName)?.[1]?.component;
237
- },
238
- getBaseUrlFromSettings: () => {
239
- // First try the getBaseUrl function if provided
240
- const baseUrlFromFunction = getBaseUrl?.();
241
- if (baseUrlFromFunction) {
242
- return baseUrlFromFunction;
243
- }
244
- // Fall back to settings
245
- const store = get();
246
- if (hasAiSettings(store.config)) {
247
- const currentSession = getCurrentSessionFromState(store);
248
- if (currentSession) {
249
- if (currentSession.modelProvider === 'custom') {
250
- const customModel = store.config.aiSettings.customModels.find((m) => m.modelName === currentSession.model);
251
- return customModel?.baseUrl;
252
- }
253
- const provider = store.config.aiSettings.providers[currentSession.modelProvider];
254
- return provider?.baseUrl;
255
- }
256
- }
257
- return undefined;
258
- },
259
- getApiKeyFromSettings: () => {
260
- const store = get();
261
- const currentSession = getCurrentSessionFromState(store);
262
- if (currentSession) {
263
- // First try the getApiKey function if provided
264
- const apiKeyFromFunction = getApiKey?.(currentSession.modelProvider || defaultProvider);
265
- if (apiKeyFromFunction) {
266
- return apiKeyFromFunction;
267
- }
268
- // Fall back to settings
269
- if (hasAiSettings(store.config)) {
270
- if (currentSession.modelProvider === 'custom') {
271
- const customModel = store.config.aiSettings.customModels.find((m) => m.modelName === currentSession.model);
272
- return customModel?.apiKey || '';
273
- }
274
- else {
275
- const provider = store.config.aiSettings.providers?.[currentSession.modelProvider];
276
- return provider?.apiKey || '';
277
- }
278
- }
279
- }
280
- return '';
281
- },
282
- getMaxStepsFromSettings: () => {
283
- const store = get();
284
- // First try the maxSteps parameter if provided
285
- if (maxSteps && Number.isFinite(maxSteps) && maxSteps > 0) {
286
- return maxSteps;
287
- }
288
- // Fall back to settings
289
- if (hasAiSettings(store.config)) {
290
- const settingsMaxSteps = store.config.aiSettings.modelParameters.maxSteps;
291
- if (Number.isFinite(settingsMaxSteps) && settingsMaxSteps > 0) {
292
- return settingsMaxSteps;
293
- }
294
- }
295
- return 5;
296
- },
297
- getInstructionsFromSettings: () => {
298
- const store = get();
299
- const tablesSchema = store.db?.tables || [];
300
- // First try the getInstructions function if provided
301
- if (getInstructions) {
302
- return getInstructions(tablesSchema);
303
- }
304
- // Fall back to settings
305
- if (hasAiSettings(store.config)) {
306
- let instructions = tablesSchema
307
- ? getDefaultInstructions(tablesSchema)
308
- : '';
309
- // get additional instructions from settings
310
- const customInstructions = store.config.aiSettings.modelParameters.additionalInstruction;
311
- if (customInstructions) {
312
- instructions = `${instructions}\n\nAdditional Instructions:\n\n${customInstructions}`;
313
- }
314
- return instructions;
315
- }
316
- return '';
317
- },
318
- },
319
- };
320
- });
321
- }
322
- /**
323
- * Helper function to type guard the store config if we have aiSettings
324
- * @param storeConfig
325
- * @returns
326
- */
327
- function hasAiSettings(storeConfig) {
328
- return (typeof storeConfig === 'object' &&
329
- storeConfig !== null &&
330
- 'aiSettings' in storeConfig);
331
- }
332
- /**
333
- * Helper function to get the current session from state
334
- */
335
- function getCurrentSessionFromState(state) {
336
- const { currentSessionId, sessions } = state.config.ai;
337
- return sessions.find((session) => session.id === currentSessionId);
338
- }
339
- function findResultById(analysisResults, id) {
340
- return analysisResults.find((result) => result.id === id);
341
- }
342
- /**
343
- * Appends the tool results, tool calls, and analysis to the state
344
- *
345
- * @param resultId - The id of the result to append to
346
- * @param message - The message to append to the state. The structure of the message is defined as:
347
- * - reasoning: string The reasoning of the assistant
348
- * - toolCallMessages: ToolCallMessage[] The tool call messages
349
- * - text: string The final text message
350
- * @param isCompleted - Whether the analysis is completed
351
- * @returns The new state
352
- */
353
- function makeResultsAppender({ resultId, streamMessage, errorMessage, isCompleted, }) {
354
- return (state) => produce(state, (draft) => {
355
- const currentSession = getCurrentSessionFromState(draft);
356
- if (!currentSession) {
357
- console.error('No current session found');
358
- return;
359
- }
360
- const result = findResultById(currentSession.analysisResults, resultId);
361
- if (result) {
362
- if (streamMessage && streamMessage.parts) {
363
- // copy all properties from streamMessage
364
- const newStreamMessage = {
365
- parts: streamMessage.parts.map((part) => {
366
- if (part.type === 'text') {
367
- return {
368
- type: 'text',
369
- text: part.text,
370
- additionalData: part.additionalData,
371
- isCompleted: part.isCompleted,
372
- };
373
- }
374
- else if (part.type === 'tool-invocation') {
375
- return {
376
- type: 'tool-invocation',
377
- toolInvocation: {
378
- toolCallId: part.toolInvocation.toolCallId,
379
- toolName: part.toolInvocation.toolName,
380
- args: part.toolInvocation.args,
381
- state: part.toolInvocation.state,
382
- result: part.toolInvocation.state === 'result'
383
- ? part.toolInvocation.result
384
- : undefined,
385
- },
386
- additionalData: part.additionalData,
387
- isCompleted: part.isCompleted,
388
- };
389
- }
390
- else {
391
- // TODO: handle other part types later
392
- return part;
393
- }
394
- }),
395
- };
396
- result.streamMessage = newStreamMessage;
397
- }
398
- if (errorMessage) {
399
- result.errorMessage = errorMessage;
400
- }
401
- if (isCompleted) {
402
- result.isCompleted = isCompleted;
403
- }
404
- }
405
- else {
406
- console.error('Result not found', resultId);
407
- }
408
- });
409
- }
410
- export function useStoreWithAi(selector) {
411
- return useBaseRoomShellStore((state) => selector(state));
412
- }
413
- //# sourceMappingURL=AiSlice.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AiSlice.js","sourceRoot":"","sources":["../src/AiSlice.ts"],"names":[],"mappings":"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","sourcesContent":["import {StreamMessage} from '@openassistant/core';\nimport {ExtendedTool} from '@openassistant/utils';\nimport {createId} from '@paralleldrive/cuid2';\nimport {DataTable} from '@sqlrooms/duckdb';\nimport {\n BaseRoomConfig,\n createSlice,\n RoomShellSliceState,\n useBaseRoomShellStore,\n type StateCreator,\n} from '@sqlrooms/room-shell';\nimport {produce, WritableDraft} from 'immer';\nimport {z} from 'zod';\nimport {\n DefaultToolsOptions,\n getDefaultInstructions,\n getDefaultTools,\n runAnalysis,\n} from './analysis';\nimport {\n AnalysisResultSchema,\n AnalysisSessionSchema,\n ErrorMessageSchema,\n} from './schemas';\nimport {AiSettingsSliceConfig} from './AiSettingsSlice';\n\nexport const AiSliceConfig = z.object({\n ai: z.object({\n sessions: z.array(AnalysisSessionSchema),\n currentSessionId: z.string().optional(),\n }),\n});\nexport type AiSliceConfig = z.infer<typeof AiSliceConfig>;\n\nexport function createDefaultAiConfig(\n props: Partial<AiSliceConfig['ai']>,\n): AiSliceConfig {\n const defaultSessionId = createId();\n return {\n ai: {\n sessions: [\n {\n id: defaultSessionId,\n name: 'Default Session',\n modelProvider: 'openai',\n model: 'gpt-4.1',\n analysisResults: [],\n createdAt: new Date(),\n },\n ],\n currentSessionId: defaultSessionId,\n ...props,\n },\n };\n}\n\n// template for the tool: Argument, LLM Result, Additional Data, Context\nexport type AiSliceTool = ExtendedTool<z.ZodTypeAny, unknown, unknown, unknown>;\n\nexport type AiSliceState = {\n ai: {\n analysisPrompt: string;\n isRunningAnalysis: boolean;\n tools: Record<string, AiSliceTool>;\n analysisAbortController?: AbortController;\n setAnalysisPrompt: (prompt: string) => void;\n startAnalysis: () => Promise<void>;\n cancelAnalysis: () => void;\n setAiModel: (modelProvider: string, model: string) => void;\n createSession: (\n name?: string,\n modelProvider?: string,\n model?: string,\n ) => void;\n switchSession: (sessionId: string) => void;\n renameSession: (sessionId: string, name: string) => void;\n deleteSession: (sessionId: string) => void;\n getCurrentSession: () => AnalysisSessionSchema | undefined;\n deleteAnalysisResult: (sessionId: string, resultId: string) => void;\n findToolComponent: (toolName: string) => React.ComponentType | undefined;\n getApiKeyFromSettings: () => string;\n getBaseUrlFromSettings: () => string | undefined;\n getMaxStepsFromSettings: () => number;\n getInstructionsFromSettings: () => string;\n };\n};\n\n/**\n * Configuration options for creating an AI slice\n */\nexport interface AiSliceOptions {\n /** Initial prompt to display in the analysis input */\n initialAnalysisPrompt?: string;\n /** Custom tools to add to the AI assistant */\n customTools?: Record<string, AiSliceTool>;\n /**\n * Function to get custom instructions for the AI assistant\n * @param tablesSchema - The schema of the tables in the database\n * @returns The instructions string to use\n */\n getInstructions?: (tablesSchema: DataTable[]) => string;\n toolsOptions?: DefaultToolsOptions;\n defaultProvider?: string;\n defaultModel?: string;\n maxSteps?: number;\n getApiKey?: (modelProvider: string) => string;\n getBaseUrl?: () => string;\n}\n\nexport function createAiSlice<PC extends BaseRoomConfig & AiSliceConfig>(\n params: AiSliceOptions,\n): StateCreator<AiSliceState> {\n const {\n defaultProvider = 'openai',\n defaultModel = 'gpt-4.1',\n initialAnalysisPrompt = '',\n customTools = {},\n toolsOptions,\n getApiKey,\n getBaseUrl,\n maxSteps,\n getInstructions,\n } = params;\n\n return createSlice<PC, AiSliceState>((set, get, store) => {\n return {\n ai: {\n analysisPrompt: initialAnalysisPrompt,\n isRunningAnalysis: false,\n\n tools: {\n ...getDefaultTools(store, toolsOptions),\n ...customTools,\n },\n\n setAnalysisPrompt: (prompt: string) => {\n set((state) =>\n produce(state, (draft) => {\n draft.ai.analysisPrompt = prompt;\n }),\n );\n },\n\n /**\n * Set the AI model for the current session\n * @param model - The model to set\n */\n setAiModel: (modelProvider: string, model: string) => {\n set((state) =>\n produce(state, (draft) => {\n const currentSession = getCurrentSessionFromState(draft);\n if (currentSession) {\n currentSession.modelProvider = modelProvider;\n currentSession.model = model;\n }\n }),\n );\n },\n\n /**\n * Get the current active session\n */\n getCurrentSession: () => {\n const state = get();\n const {currentSessionId, sessions} = state.config.ai;\n return sessions.find((session) => session.id === currentSessionId);\n },\n\n /**\n * Create a new session with the given name and model settings\n */\n createSession: (\n name?: string,\n modelProvider?: string,\n model?: string,\n ) => {\n const currentSession = get().ai.getCurrentSession();\n const newSessionId = createId();\n\n // Generate a default name if none is provided\n let sessionName = name;\n if (!sessionName) {\n // Generate a human-readable date and time for the session name\n const now = new Date();\n const formattedDate = now.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n });\n const formattedTime = now.toLocaleTimeString('en-US', {\n hour: 'numeric',\n minute: 'numeric',\n hour12: true,\n });\n sessionName = `Session ${formattedDate} at ${formattedTime}`;\n }\n\n set((state) =>\n produce(state, (draft) => {\n // Add to AI sessions\n draft.config.ai.sessions.unshift({\n id: newSessionId,\n name: sessionName,\n modelProvider:\n modelProvider || currentSession?.modelProvider || 'openai',\n model: model || currentSession?.model || 'gpt-4.1',\n analysisResults: [],\n createdAt: new Date(),\n });\n draft.config.ai.currentSessionId = newSessionId;\n }),\n );\n },\n\n /**\n * Switch to a different session\n */\n switchSession: (sessionId: string) => {\n set((state) =>\n produce(state, (draft) => {\n draft.config.ai.currentSessionId = sessionId;\n }),\n );\n },\n\n /**\n * Rename an existing session\n */\n renameSession: (sessionId: string, name: string) => {\n set((state) =>\n produce(state, (draft) => {\n const session = draft.config.ai.sessions.find(\n (s) => s.id === sessionId,\n );\n if (session) {\n session.name = name;\n }\n }),\n );\n },\n\n /**\n * Delete a session\n */\n deleteSession: (sessionId: string) => {\n set((state) =>\n produce(state, (draft) => {\n const sessionIndex = draft.config.ai.sessions.findIndex(\n (s) => s.id === sessionId,\n );\n if (sessionIndex !== -1) {\n // Don't delete the last session\n if (draft.config.ai.sessions.length > 1) {\n draft.config.ai.sessions.splice(sessionIndex, 1);\n // If we deleted the current session, switch to another one\n if (draft.config.ai.currentSessionId === sessionId) {\n // Make sure there's at least one session before accessing its id\n if (draft.config.ai.sessions.length > 0) {\n const firstSession = draft.config.ai.sessions[0];\n if (firstSession) {\n draft.config.ai.currentSessionId = firstSession.id;\n }\n }\n }\n }\n }\n }),\n );\n },\n\n /**\n * Start the analysis\n * TODO: how to pass the history analysisResults?\n */\n startAnalysis: async () => {\n const resultId = createId();\n const abortController = new AbortController();\n const currentSession = get().ai.getCurrentSession();\n\n if (!currentSession) {\n console.error('No current session found');\n return;\n }\n\n set((state) =>\n produce(state, (draft) => {\n draft.ai.analysisAbortController = abortController;\n draft.ai.isRunningAnalysis = true;\n\n const session = draft.config.ai.sessions.find(\n (s) => s.id === draft.config.ai.currentSessionId,\n );\n\n if (session) {\n session.analysisResults.push({\n id: resultId,\n prompt: get().ai.analysisPrompt,\n streamMessage: {\n parts: [\n {\n type: 'text',\n text: '',\n },\n ],\n },\n isCompleted: false,\n });\n }\n }),\n );\n\n try {\n await runAnalysis({\n tableSchemas: get().db.tables,\n modelProvider: currentSession.modelProvider || defaultProvider,\n model: currentSession.model || defaultModel,\n apiKey: get().ai.getApiKeyFromSettings(),\n baseUrl: get().ai.getBaseUrlFromSettings(),\n prompt: get().ai.analysisPrompt,\n abortController,\n tools: get().ai.tools,\n maxSteps: get().ai.getMaxStepsFromSettings(),\n getInstructions: get().ai.getInstructionsFromSettings,\n historyAnalysis: currentSession.analysisResults,\n onStreamResult: (isCompleted, streamMessage) => {\n set(\n makeResultsAppender({\n resultId,\n streamMessage,\n isCompleted,\n }),\n );\n },\n });\n } catch (err) {\n set(\n makeResultsAppender({\n resultId,\n isCompleted: true,\n errorMessage: {\n error: err instanceof Error ? err.message : String(err),\n },\n }),\n );\n } finally {\n set((state) =>\n produce(state, (draft) => {\n draft.ai.isRunningAnalysis = false;\n draft.ai.analysisPrompt = '';\n }),\n );\n }\n },\n\n cancelAnalysis: () => {\n set((state) =>\n produce(state, (draft) => {\n draft.ai.isRunningAnalysis = false;\n }),\n );\n get().ai.analysisAbortController?.abort('Analysis cancelled');\n },\n\n /**\n * Delete an analysis result from a session\n */\n deleteAnalysisResult: (sessionId: string, resultId: string) => {\n set((state) =>\n produce(state, (draft) => {\n const session = draft.config.ai.sessions.find(\n (s) => s.id === sessionId,\n );\n if (session) {\n session.analysisResults = session.analysisResults.filter(\n (r) => r.id !== resultId,\n );\n }\n }),\n );\n },\n\n findToolComponent: (toolName: string) => {\n return Object.entries(get().ai.tools).find(\n ([name]) => name === toolName,\n )?.[1]?.component as React.ComponentType;\n },\n\n getBaseUrlFromSettings: () => {\n // First try the getBaseUrl function if provided\n const baseUrlFromFunction = getBaseUrl?.();\n if (baseUrlFromFunction) {\n return baseUrlFromFunction;\n }\n\n // Fall back to settings\n const store = get();\n if (hasAiSettings(store.config)) {\n const currentSession = getCurrentSessionFromState(store);\n if (currentSession) {\n if (currentSession.modelProvider === 'custom') {\n const customModel = store.config.aiSettings.customModels.find(\n (m: {modelName: string}) =>\n m.modelName === currentSession.model,\n );\n return customModel?.baseUrl;\n }\n const provider =\n store.config.aiSettings.providers[currentSession.modelProvider];\n return provider?.baseUrl;\n }\n }\n return undefined;\n },\n\n getApiKeyFromSettings: () => {\n const store = get();\n const currentSession = getCurrentSessionFromState(store);\n if (currentSession) {\n // First try the getApiKey function if provided\n const apiKeyFromFunction = getApiKey?.(\n currentSession.modelProvider || defaultProvider,\n );\n if (apiKeyFromFunction) {\n return apiKeyFromFunction;\n }\n\n // Fall back to settings\n if (hasAiSettings(store.config)) {\n if (currentSession.modelProvider === 'custom') {\n const customModel = store.config.aiSettings.customModels.find(\n (m: {modelName: string}) =>\n m.modelName === currentSession.model,\n );\n return customModel?.apiKey || '';\n } else {\n const provider =\n store.config.aiSettings.providers?.[\n currentSession.modelProvider\n ];\n return provider?.apiKey || '';\n }\n }\n }\n return '';\n },\n\n getMaxStepsFromSettings: () => {\n const store = get();\n // First try the maxSteps parameter if provided\n if (maxSteps && Number.isFinite(maxSteps) && maxSteps > 0) {\n return maxSteps;\n }\n\n // Fall back to settings\n if (hasAiSettings(store.config)) {\n const settingsMaxSteps =\n store.config.aiSettings.modelParameters.maxSteps;\n if (Number.isFinite(settingsMaxSteps) && settingsMaxSteps > 0) {\n return settingsMaxSteps;\n }\n }\n return 5;\n },\n\n getInstructionsFromSettings: () => {\n const store = get();\n const tablesSchema = store.db?.tables || [];\n\n // First try the getInstructions function if provided\n if (getInstructions) {\n return getInstructions(tablesSchema);\n }\n\n // Fall back to settings\n if (hasAiSettings(store.config)) {\n let instructions = tablesSchema\n ? getDefaultInstructions(tablesSchema)\n : '';\n // get additional instructions from settings\n const customInstructions =\n store.config.aiSettings.modelParameters.additionalInstruction;\n if (customInstructions) {\n instructions = `${instructions}\\n\\nAdditional Instructions:\\n\\n${customInstructions}`;\n }\n return instructions;\n }\n return '';\n },\n },\n };\n });\n}\n\n/**\n * Helper function to type guard the store config if we have aiSettings\n * @param storeConfig\n * @returns\n */\nfunction hasAiSettings(\n storeConfig: unknown,\n): storeConfig is {aiSettings: AiSettingsSliceConfig['aiSettings']} {\n return (\n typeof storeConfig === 'object' &&\n storeConfig !== null &&\n 'aiSettings' in storeConfig\n );\n}\n\n/**\n * Helper function to get the current session from state\n */\nfunction getCurrentSessionFromState<PC extends BaseRoomConfig & AiSliceConfig>(\n state: RoomShellSliceState<PC> | WritableDraft<RoomShellSliceState<PC>>,\n): AnalysisSessionSchema | undefined {\n const {currentSessionId, sessions} = state.config.ai;\n return sessions.find((session) => session.id === currentSessionId);\n}\n\nfunction findResultById(\n analysisResults: AnalysisResultSchema[],\n id: string,\n): AnalysisResultSchema | undefined {\n return analysisResults.find((result) => result.id === id);\n}\n\n/**\n * Appends the tool results, tool calls, and analysis to the state\n *\n * @param resultId - The id of the result to append to\n * @param message - The message to append to the state. The structure of the message is defined as:\n * - reasoning: string The reasoning of the assistant\n * - toolCallMessages: ToolCallMessage[] The tool call messages\n * - text: string The final text message\n * @param isCompleted - Whether the analysis is completed\n * @returns The new state\n */\nfunction makeResultsAppender<PC extends BaseRoomConfig & AiSliceConfig>({\n resultId,\n streamMessage,\n errorMessage,\n isCompleted,\n}: {\n resultId: string;\n streamMessage?: StreamMessage;\n errorMessage?: ErrorMessageSchema;\n isCompleted?: boolean;\n}) {\n return (state: RoomShellSliceState<PC>) =>\n produce(state, (draft) => {\n const currentSession = getCurrentSessionFromState(draft);\n if (!currentSession) {\n console.error('No current session found');\n return;\n }\n\n const result = findResultById(currentSession.analysisResults, resultId);\n if (result) {\n if (streamMessage && streamMessage.parts) {\n // copy all properties from streamMessage\n const newStreamMessage = {\n parts: streamMessage.parts.map((part) => {\n if (part.type === 'text') {\n return {\n type: 'text' as const,\n text: part.text,\n additionalData: part.additionalData,\n isCompleted: part.isCompleted,\n };\n } else if (part.type === 'tool-invocation') {\n return {\n type: 'tool-invocation' as const,\n toolInvocation: {\n toolCallId: part.toolInvocation.toolCallId,\n toolName: part.toolInvocation.toolName,\n args: part.toolInvocation.args,\n state: part.toolInvocation.state,\n result:\n part.toolInvocation.state === 'result'\n ? part.toolInvocation.result\n : undefined,\n },\n additionalData: part.additionalData,\n isCompleted: part.isCompleted,\n };\n } else {\n // TODO: handle other part types later\n return part;\n }\n }),\n };\n\n result.streamMessage = newStreamMessage as StreamMessage;\n }\n if (errorMessage) {\n result.errorMessage = errorMessage;\n }\n if (isCompleted) {\n result.isCompleted = isCompleted;\n }\n } else {\n console.error('Result not found', resultId);\n }\n });\n}\n\ntype RoomConfigWithAi = BaseRoomConfig & AiSliceConfig;\ntype RoomShellSliceStateWithAi = RoomShellSliceState<RoomConfigWithAi> &\n AiSliceState;\n\nexport function useStoreWithAi<T>(\n selector: (state: RoomShellSliceStateWithAi) => T,\n): T {\n return useBaseRoomShellStore<\n BaseRoomConfig & AiSliceConfig,\n RoomShellSliceState<RoomConfigWithAi>,\n T\n >((state) => selector(state as unknown as RoomShellSliceStateWithAi));\n}\n"]}
@@ -1,79 +0,0 @@
1
- import { StreamMessage } from '@openassistant/core';
2
- import { DataTable, DuckDbSliceState } from '@sqlrooms/duckdb';
3
- import type { StoreApi } from '@sqlrooms/room-shell';
4
- import { AiSliceState, AiSliceTool } from './AiSlice';
5
- import { AnalysisResultSchema } from './schemas';
6
- /**
7
- * Returns the default system instructions for the AI assistant
8
- */
9
- export declare function getDefaultInstructions(tablesSchema: DataTable[]): string;
10
- /**
11
- * Configuration options for running an AI analysis session
12
- */
13
- type AnalysisParameters = {
14
- tableSchemas: DataTable[];
15
- /** Assistant instance identifier (default: 'sqlrooms-ai') */
16
- name?: string;
17
- /** AI model provider (e.g., 'openai', 'anthropic') */
18
- modelProvider: string;
19
- /** Model identifier (e.g., 'gpt-4', 'claude-3') */
20
- model: string;
21
- /** Authentication key for the model provider's API */
22
- apiKey: string;
23
- /** Analysis prompt or question to be processed */
24
- prompt: string;
25
- /** Optional controller for canceling the analysis operation */
26
- abortController?: AbortController;
27
- /** Maximum number of analysis steps allowed (default: 100) */
28
- maxSteps?: number;
29
- /** The history of analysis results (e.g. saved in localStorage) */
30
- historyAnalysis?: AnalysisResultSchema[];
31
- /** Tools to use in the analysis */
32
- tools?: Record<string, AiSliceTool>;
33
- /** Base URL for Ollama provider (required when modelProvider is 'ollama') */
34
- baseUrl?: string;
35
- /**
36
- * Function to get custom instructions for the AI assistant
37
- * @param tablesSchema - The schema of the tables in the database
38
- * @returns The instructions string to use
39
- */
40
- getInstructions?: (tablesSchema: DataTable[]) => string;
41
- /**
42
- * Callback for handling streaming results
43
- * @param isCompleted - Indicates if this is the final message in the stream
44
- * @param streamMessage - Current message content being streamed
45
- */
46
- onStreamResult: (isCompleted: boolean, streamMessage?: StreamMessage) => void;
47
- };
48
- /**
49
- * Executes an AI analysis session on the room data
50
- *
51
- * @param config - Analysis configuration options. See {@link AnalysisParameters} for more details.
52
- * @returns Object containing tool calls executed and the final analysis result
53
- */
54
- export declare function runAnalysis({ name, tableSchemas, modelProvider, model, apiKey, prompt, abortController, historyAnalysis, onStreamResult, maxSteps, tools, getInstructions, baseUrl, }: AnalysisParameters): Promise<{
55
- streamMessage: StreamMessage;
56
- messages: import("ai").CoreMessage[];
57
- }>;
58
- export type DefaultToolsOptions = {
59
- /**
60
- * Whether to enable read only mode (default: true)
61
- */
62
- readOnly?: boolean;
63
- /**
64
- * Number of rows to share with LLM (default: 0)
65
- */
66
- numberOfRowsToShareWithLLM?: number;
67
- /**
68
- * Whether to automatically generate a summary of the query result (default: true)
69
- */
70
- autoSummary?: boolean;
71
- };
72
- /**
73
- * Default tools available to the AI assistant for data analysis
74
- * Includes:
75
- * - query: Executes SQL queries against DuckDB
76
- */
77
- export declare function getDefaultTools(store: StoreApi<AiSliceState & DuckDbSliceState>, options?: DefaultToolsOptions): Record<string, AiSliceTool>;
78
- export {};
79
- //# sourceMappingURL=analysis.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"analysis.d.ts","sourceRoot":"","sources":["../src/analysis.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,aAAa,EACd,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAEL,SAAS,EAET,gBAAgB,EAEjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAC,YAAY,EAAE,WAAW,EAAC,MAAM,WAAW,CAAC;AAEpD,OAAO,EAAC,oBAAoB,EAAsB,MAAM,WAAW,CAAC;AA4DpE;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,SAAS,EAAE,GAAG,MAAM,CAExE;AAwBD;;GAEG;AACH,KAAK,kBAAkB,GAAG;IACxB,YAAY,EAAE,SAAS,EAAE,CAAC;IAE1B,6DAA6D;IAC7D,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,sDAAsD;IACtD,aAAa,EAAE,MAAM,CAAC;IAEtB,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAC;IAEd,sDAAsD;IACtD,MAAM,EAAE,MAAM,CAAC;IAEf,kDAAkD;IAClD,MAAM,EAAE,MAAM,CAAC;IAEf,+DAA+D;IAC/D,eAAe,CAAC,EAAE,eAAe,CAAC;IAElC,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,mEAAmE;IACnE,eAAe,CAAC,EAAE,oBAAoB,EAAE,CAAC;IAEzC,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAEpC,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,eAAe,CAAC,EAAE,CAAC,YAAY,EAAE,SAAS,EAAE,KAAK,MAAM,CAAC;IAExD;;;;OAIG;IACH,cAAc,EAAE,CAAC,WAAW,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;CAC/E,CAAC;AAEF;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,EAChC,IAAoB,EACpB,YAAY,EACZ,aAAa,EACb,KAAK,EACL,MAAM,EACN,MAAM,EACN,eAAe,EACf,eAAe,EACf,cAAc,EACd,QAAY,EACZ,KAAU,EACV,eAAe,EACf,OAAO,GACR,EAAE,kBAAkB;;;GA4CpB;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;OAEG;IAEH,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,QAAQ,CAAC,YAAY,GAAG,gBAAgB,CAAC,EAChD,OAAO,CAAC,EAAE,mBAAmB,GAC5B,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAiG7B"}