@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.
- package/README.md +18 -33
- package/dist/index.d.ts +8 -27
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -23
- package/dist/index.js.map +1 -1
- package/dist/tools/defaultInstructions.d.ts +8 -0
- package/dist/tools/defaultInstructions.d.ts.map +1 -0
- package/dist/tools/defaultInstructions.js +64 -0
- package/dist/tools/defaultInstructions.js.map +1 -0
- package/dist/tools/defaultTools.d.ts +14 -0
- package/dist/tools/defaultTools.d.ts.map +1 -0
- package/dist/tools/defaultTools.js +13 -0
- package/dist/tools/defaultTools.js.map +1 -0
- package/dist/tools/query/QueryToolResult.d.ts.map +1 -0
- package/dist/tools/query/QueryToolResult.js.map +1 -0
- package/dist/tools/query/queryTool.d.ts +25 -0
- package/dist/tools/query/queryTool.d.ts.map +1 -0
- package/dist/tools/query/queryTool.js +108 -0
- package/dist/tools/query/queryTool.js.map +1 -0
- package/package.json +10 -15
- package/dist/AiSettingsSlice.d.ts +0 -148
- package/dist/AiSettingsSlice.d.ts.map +0 -1
- package/dist/AiSettingsSlice.js +0 -180
- package/dist/AiSettingsSlice.js.map +0 -1
- package/dist/AiSlice.d.ts +0 -453
- package/dist/AiSlice.d.ts.map +0 -1
- package/dist/AiSlice.js +0 -413
- package/dist/AiSlice.js.map +0 -1
- package/dist/analysis.d.ts +0 -79
- package/dist/analysis.d.ts.map +0 -1
- package/dist/analysis.js +0 -218
- package/dist/analysis.js.map +0 -1
- package/dist/components/AnalysisAnswer.d.ts +0 -15
- package/dist/components/AnalysisAnswer.d.ts.map +0 -1
- package/dist/components/AnalysisAnswer.js +0 -102
- package/dist/components/AnalysisAnswer.js.map +0 -1
- package/dist/components/AnalysisResult.d.ts +0 -22
- package/dist/components/AnalysisResult.d.ts.map +0 -1
- package/dist/components/AnalysisResult.js +0 -39
- package/dist/components/AnalysisResult.js.map +0 -1
- package/dist/components/AnalysisResultsContainer.d.ts +0 -5
- package/dist/components/AnalysisResultsContainer.d.ts.map +0 -1
- package/dist/components/AnalysisResultsContainer.js +0 -26
- package/dist/components/AnalysisResultsContainer.js.map +0 -1
- package/dist/components/ErrorMessage.d.ts +0 -4
- package/dist/components/ErrorMessage.d.ts.map +0 -1
- package/dist/components/ErrorMessage.js +0 -8
- package/dist/components/ErrorMessage.js.map +0 -1
- package/dist/components/MessageContainer.d.ts +0 -10
- package/dist/components/MessageContainer.d.ts.map +0 -1
- package/dist/components/MessageContainer.js +0 -9
- package/dist/components/MessageContainer.js.map +0 -1
- package/dist/components/ModelSelector.d.ts +0 -13
- package/dist/components/ModelSelector.d.ts.map +0 -1
- package/dist/components/ModelSelector.js +0 -29
- package/dist/components/ModelSelector.js.map +0 -1
- package/dist/components/QueryControls.d.ts +0 -10
- package/dist/components/QueryControls.d.ts.map +0 -1
- package/dist/components/QueryControls.js +0 -55
- package/dist/components/QueryControls.js.map +0 -1
- package/dist/components/SessionControls.d.ts +0 -17
- package/dist/components/SessionControls.d.ts.map +0 -1
- package/dist/components/SessionControls.js +0 -20
- package/dist/components/SessionControls.js.map +0 -1
- package/dist/components/session/DeleteSessionButton.d.ts +0 -19
- package/dist/components/session/DeleteSessionButton.d.ts.map +0 -1
- package/dist/components/session/DeleteSessionButton.js +0 -54
- package/dist/components/session/DeleteSessionButton.js.map +0 -1
- package/dist/components/session/DeleteSessionDialog.d.ts +0 -27
- package/dist/components/session/DeleteSessionDialog.d.ts.map +0 -1
- package/dist/components/session/DeleteSessionDialog.js +0 -19
- package/dist/components/session/DeleteSessionDialog.js.map +0 -1
- package/dist/components/session/SessionActions.d.ts +0 -18
- package/dist/components/session/SessionActions.d.ts.map +0 -1
- package/dist/components/session/SessionActions.js +0 -19
- package/dist/components/session/SessionActions.js.map +0 -1
- package/dist/components/session/SessionDropdown.d.ts +0 -18
- package/dist/components/session/SessionDropdown.d.ts.map +0 -1
- package/dist/components/session/SessionDropdown.js +0 -21
- package/dist/components/session/SessionDropdown.js.map +0 -1
- package/dist/components/session/SessionTitle.d.ts +0 -18
- package/dist/components/session/SessionTitle.d.ts.map +0 -1
- package/dist/components/session/SessionTitle.js +0 -22
- package/dist/components/session/SessionTitle.js.map +0 -1
- package/dist/components/session/SessionType.d.ts +0 -24
- package/dist/components/session/SessionType.d.ts.map +0 -1
- package/dist/components/session/SessionType.js +0 -2
- package/dist/components/session/SessionType.js.map +0 -1
- package/dist/components/session/index.d.ts +0 -7
- package/dist/components/session/index.d.ts.map +0 -1
- package/dist/components/session/index.js +0 -7
- package/dist/components/session/index.js.map +0 -1
- package/dist/components/settings/AiModelParameters.d.ts +0 -6
- package/dist/components/settings/AiModelParameters.d.ts.map +0 -1
- package/dist/components/settings/AiModelParameters.js +0 -91
- package/dist/components/settings/AiModelParameters.js.map +0 -1
- package/dist/components/settings/AiModelUsage.d.ts +0 -18
- package/dist/components/settings/AiModelUsage.d.ts.map +0 -1
- package/dist/components/settings/AiModelUsage.js +0 -60
- package/dist/components/settings/AiModelUsage.js.map +0 -1
- package/dist/components/settings/AiModelsSettings.d.ts +0 -10
- package/dist/components/settings/AiModelsSettings.d.ts.map +0 -1
- package/dist/components/settings/AiModelsSettings.js +0 -229
- package/dist/components/settings/AiModelsSettings.js.map +0 -1
- package/dist/components/settings/AiProvidersSettings.d.ts +0 -3
- package/dist/components/settings/AiProvidersSettings.d.ts.map +0 -1
- package/dist/components/settings/AiProvidersSettings.js +0 -88
- package/dist/components/settings/AiProvidersSettings.js.map +0 -1
- package/dist/components/settings/AiSettingsPanel.d.ts +0 -17
- package/dist/components/settings/AiSettingsPanel.d.ts.map +0 -1
- package/dist/components/settings/AiSettingsPanel.js +0 -20
- package/dist/components/settings/AiSettingsPanel.js.map +0 -1
- package/dist/components/tools/QueryToolResult.d.ts.map +0 -1
- package/dist/components/tools/QueryToolResult.js.map +0 -1
- package/dist/components/tools/ToolErrorMessage.d.ts +0 -39
- package/dist/components/tools/ToolErrorMessage.d.ts.map +0 -1
- package/dist/components/tools/ToolErrorMessage.js +0 -20
- package/dist/components/tools/ToolErrorMessage.js.map +0 -1
- package/dist/components/tools/ToolResult.d.ts +0 -11
- package/dist/components/tools/ToolResult.d.ts.map +0 -1
- package/dist/components/tools/ToolResult.js +0 -29
- package/dist/components/tools/ToolResult.js.map +0 -1
- package/dist/components/tools/ToolResultErrorBoundary.d.ts +0 -19
- package/dist/components/tools/ToolResultErrorBoundary.d.ts.map +0 -1
- package/dist/components/tools/ToolResultErrorBoundary.js +0 -24
- package/dist/components/tools/ToolResultErrorBoundary.js.map +0 -1
- package/dist/hooks/useScrollToBottom.d.ts +0 -82
- package/dist/hooks/useScrollToBottom.d.ts.map +0 -1
- package/dist/hooks/useScrollToBottom.js +0 -142
- package/dist/hooks/useScrollToBottom.js.map +0 -1
- package/dist/schemas.d.ts +0 -512
- package/dist/schemas.d.ts.map +0 -1
- package/dist/schemas.js +0 -93
- package/dist/schemas.js.map +0 -1
- package/dist/utils.d.ts +0 -17
- package/dist/utils.d.ts.map +0 -1
- package/dist/utils.js +0 -31
- package/dist/utils.js.map +0 -1
- /package/dist/{components/tools → tools/query}/QueryToolResult.d.ts +0 -0
- /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
|
package/dist/AiSlice.js.map
DELETED
|
@@ -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"]}
|
package/dist/analysis.d.ts
DELETED
|
@@ -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
|
package/dist/analysis.d.ts.map
DELETED
|
@@ -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"}
|