@sqlrooms/ai 0.24.24 → 0.24.25
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 +76 -1
- package/dist/AiSettingsSlice.d.ts +148 -0
- package/dist/AiSettingsSlice.d.ts.map +1 -0
- package/dist/AiSettingsSlice.js +180 -0
- package/dist/AiSettingsSlice.js.map +1 -0
- package/dist/AiSlice.d.ts +15 -24
- package/dist/AiSlice.d.ts.map +1 -1
- package/dist/AiSlice.js +99 -32
- package/dist/AiSlice.js.map +1 -1
- package/dist/analysis.d.ts +1 -3
- package/dist/analysis.d.ts.map +1 -1
- package/dist/analysis.js +2 -4
- package/dist/analysis.js.map +1 -1
- package/dist/components/AnalysisResult.js +1 -1
- package/dist/components/AnalysisResult.js.map +1 -1
- package/dist/components/settings/AiModelParameters.d.ts +6 -0
- package/dist/components/settings/AiModelParameters.d.ts.map +1 -0
- package/dist/components/settings/AiModelParameters.js +91 -0
- package/dist/components/settings/AiModelParameters.js.map +1 -0
- package/dist/components/settings/AiModelUsage.d.ts +18 -0
- package/dist/components/settings/AiModelUsage.d.ts.map +1 -0
- package/dist/components/settings/AiModelUsage.js +60 -0
- package/dist/components/settings/AiModelUsage.js.map +1 -0
- package/dist/components/settings/AiModelsSettings.d.ts +10 -0
- package/dist/components/settings/AiModelsSettings.d.ts.map +1 -0
- package/dist/components/settings/AiModelsSettings.js +229 -0
- package/dist/components/settings/AiModelsSettings.js.map +1 -0
- package/dist/components/settings/AiProvidersSettings.d.ts +3 -0
- package/dist/components/settings/AiProvidersSettings.d.ts.map +1 -0
- package/dist/components/settings/AiProvidersSettings.js +88 -0
- package/dist/components/settings/AiProvidersSettings.js.map +1 -0
- package/dist/components/settings/AiSettingsPanel.d.ts +17 -0
- package/dist/components/settings/AiSettingsPanel.d.ts.map +1 -0
- package/dist/components/settings/AiSettingsPanel.js +20 -0
- package/dist/components/settings/AiSettingsPanel.js.map +1 -0
- package/dist/components/tools/ToolResultErrorBoundary.d.ts +1 -1
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/schemas.d.ts +5 -5
- package/dist/utils.d.ts +17 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +31 -0
- package/dist/utils.js.map +1 -0
- package/package.json +12 -10
package/README.md
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# @sqlrooms/ai
|
|
2
|
+
|
|
1
3
|
An AI integration package for SQLRooms that provides components and utilities for adding AI-powered features to your data applications. This package enables natural language querying, data analysis, and AI-assisted insights.
|
|
2
4
|
|
|
3
5
|
## Features
|
|
@@ -408,7 +410,7 @@ Each `toolCallMessages` has the following properties:
|
|
|
408
410
|
|
|
409
411
|
## Rendering
|
|
410
412
|
|
|
411
|
-
```
|
|
413
|
+
```text
|
|
412
414
|
|--------------------------------|
|
|
413
415
|
| AnalysisResultsContainer |
|
|
414
416
|
|--------------------------------|
|
|
@@ -490,3 +492,76 @@ const functions = {
|
|
|
490
492
|
- **Feedback Loop**: Collect user feedback to improve AI responses
|
|
491
493
|
|
|
492
494
|
For more information, visit the SQLRooms documentation.
|
|
495
|
+
|
|
496
|
+
## AI Settings Configuration
|
|
497
|
+
|
|
498
|
+
This package now includes comprehensive AI settings components. These components provide a complete set of UI elements for managing AI model configuration, parameters, and usage tracking.
|
|
499
|
+
|
|
500
|
+
### AI Settings Features
|
|
501
|
+
|
|
502
|
+
- **createAiSettingsSlice**: Function to create a Zustand slice for managing AI model configuration with room-shell integration
|
|
503
|
+
- **AiSettingsPanel**: Main configuration panel with modular sub-components for different configuration aspects
|
|
504
|
+
- **ProvidersSettings**: Component for configuring AI providers (OpenAI, Anthropic, etc.) with API keys and base URLs
|
|
505
|
+
- **ModelsSettings**: Component for managing available models and their parameters
|
|
506
|
+
- **ModelParametersSettings**: Component for configuring model parameters like max steps and system instructions
|
|
507
|
+
- **ModelSelector**: Standalone model selector component for quick model switching
|
|
508
|
+
- **extractModelsFromSettings**: Utility function to extract models from configuration for use in selectors
|
|
509
|
+
|
|
510
|
+
### AI Settings Usage
|
|
511
|
+
|
|
512
|
+
#### Individual Components
|
|
513
|
+
|
|
514
|
+
```tsx
|
|
515
|
+
import {
|
|
516
|
+
AiSettingsPanel,
|
|
517
|
+
ModelSelector,
|
|
518
|
+
extractModelsFromSettings,
|
|
519
|
+
} from '@sqlrooms/ai';
|
|
520
|
+
import {useRoomStore} from '../store';
|
|
521
|
+
|
|
522
|
+
// Access AI model configuration from store
|
|
523
|
+
const aiSettings = useRoomStore((s) => s.config.aiSettings);
|
|
524
|
+
const models = extractModelsFromSettings(aiSettings);
|
|
525
|
+
|
|
526
|
+
// Main configuration panel with sub-components
|
|
527
|
+
<AiSettingsPanel isOpen={isConfigOpen} setIsOpen={setIsConfigOpen}>
|
|
528
|
+
<AiSettingsPanel.ProvidersSettings />
|
|
529
|
+
<AiSettingsPanel.ModelsSettings />
|
|
530
|
+
<AiSettingsPanel.ModelParametersSettings
|
|
531
|
+
getDefaultInstructions={getDefaultInstructionsWrapper}
|
|
532
|
+
/>
|
|
533
|
+
</AiSettingsPanel>
|
|
534
|
+
|
|
535
|
+
// Standalone model selector
|
|
536
|
+
<ModelSelector models={models} />
|
|
537
|
+
```
|
|
538
|
+
|
|
539
|
+
### AI Settings API Reference
|
|
540
|
+
|
|
541
|
+
#### Core Components
|
|
542
|
+
|
|
543
|
+
- **`AiSettingsPanel`**: Main configuration panel with modular sub-components
|
|
544
|
+
- `AiSettingsPanel.ProvidersSettings`: Configure AI providers (OpenAI, Anthropic, etc.)
|
|
545
|
+
- `AiSettingsPanel.ModelsSettings`: Manage available models and their parameters
|
|
546
|
+
- `AiSettingsPanel.ModelParametersSettings`: Configure model parameters and instructions
|
|
547
|
+
- **`ModelSelector`**: Standalone model selector for quick switching
|
|
548
|
+
- **`extractModelsFromSettings(config)`**: Utility to extract models from configuration
|
|
549
|
+
|
|
550
|
+
#### Slice Configuration
|
|
551
|
+
|
|
552
|
+
The package uses a slice-based configuration system that integrates with SQLRooms room-shell:
|
|
553
|
+
|
|
554
|
+
- **`createAiSettingsSlice()`**: Creates the AI settings configuration slice for state management
|
|
555
|
+
- **`AiSettingsSliceConfig`**: TypeScript type for configuration schema
|
|
556
|
+
- **`createDefaultAiSettings(providers)`**: Helper to create default configuration with providers
|
|
557
|
+
- **`getApiKey(config, provider, model)`**: Utility to get API key from configuration
|
|
558
|
+
- **`getBaseUrl(config, provider, model)`**: Utility to get base URL from configuration
|
|
559
|
+
|
|
560
|
+
#### Store Integration
|
|
561
|
+
|
|
562
|
+
The AI settings configuration integrates with the main AI slice through helper functions:
|
|
563
|
+
|
|
564
|
+
- **`getApiKey()`**: Function to retrieve API key from current session and model config
|
|
565
|
+
- **`getMaxSteps()`**: Function to get max steps from model configuration
|
|
566
|
+
- **`getBaseUrl()`**: Function to get base URL from current session and model config
|
|
567
|
+
- **`getInstructions(tablesSchema)`**: Function to generate system instructions with optional custom instructions
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { BaseRoomConfig, RoomShellSliceState, type StateCreator } from '@sqlrooms/room-shell';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
export declare const AiSettingsSliceConfig: z.ZodObject<{
|
|
4
|
+
aiSettings: z.ZodObject<{
|
|
5
|
+
providers: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
6
|
+
baseUrl: z.ZodString;
|
|
7
|
+
apiKey: z.ZodString;
|
|
8
|
+
models: z.ZodArray<z.ZodObject<{
|
|
9
|
+
modelName: z.ZodString;
|
|
10
|
+
}, "strip", z.ZodTypeAny, {
|
|
11
|
+
modelName: string;
|
|
12
|
+
}, {
|
|
13
|
+
modelName: string;
|
|
14
|
+
}>, "many">;
|
|
15
|
+
}, "strip", z.ZodTypeAny, {
|
|
16
|
+
baseUrl: string;
|
|
17
|
+
apiKey: string;
|
|
18
|
+
models: {
|
|
19
|
+
modelName: string;
|
|
20
|
+
}[];
|
|
21
|
+
}, {
|
|
22
|
+
baseUrl: string;
|
|
23
|
+
apiKey: string;
|
|
24
|
+
models: {
|
|
25
|
+
modelName: string;
|
|
26
|
+
}[];
|
|
27
|
+
}>>;
|
|
28
|
+
customModels: z.ZodArray<z.ZodObject<{
|
|
29
|
+
baseUrl: z.ZodString;
|
|
30
|
+
apiKey: z.ZodString;
|
|
31
|
+
modelName: z.ZodString;
|
|
32
|
+
}, "strip", z.ZodTypeAny, {
|
|
33
|
+
baseUrl: string;
|
|
34
|
+
apiKey: string;
|
|
35
|
+
modelName: string;
|
|
36
|
+
}, {
|
|
37
|
+
baseUrl: string;
|
|
38
|
+
apiKey: string;
|
|
39
|
+
modelName: string;
|
|
40
|
+
}>, "many">;
|
|
41
|
+
modelParameters: z.ZodObject<{
|
|
42
|
+
maxSteps: z.ZodNumber;
|
|
43
|
+
additionalInstruction: z.ZodString;
|
|
44
|
+
}, "strip", z.ZodTypeAny, {
|
|
45
|
+
maxSteps: number;
|
|
46
|
+
additionalInstruction: string;
|
|
47
|
+
}, {
|
|
48
|
+
maxSteps: number;
|
|
49
|
+
additionalInstruction: string;
|
|
50
|
+
}>;
|
|
51
|
+
}, "strip", z.ZodTypeAny, {
|
|
52
|
+
providers: Record<string, {
|
|
53
|
+
baseUrl: string;
|
|
54
|
+
apiKey: string;
|
|
55
|
+
models: {
|
|
56
|
+
modelName: string;
|
|
57
|
+
}[];
|
|
58
|
+
}>;
|
|
59
|
+
customModels: {
|
|
60
|
+
baseUrl: string;
|
|
61
|
+
apiKey: string;
|
|
62
|
+
modelName: string;
|
|
63
|
+
}[];
|
|
64
|
+
modelParameters: {
|
|
65
|
+
maxSteps: number;
|
|
66
|
+
additionalInstruction: string;
|
|
67
|
+
};
|
|
68
|
+
}, {
|
|
69
|
+
providers: Record<string, {
|
|
70
|
+
baseUrl: string;
|
|
71
|
+
apiKey: string;
|
|
72
|
+
models: {
|
|
73
|
+
modelName: string;
|
|
74
|
+
}[];
|
|
75
|
+
}>;
|
|
76
|
+
customModels: {
|
|
77
|
+
baseUrl: string;
|
|
78
|
+
apiKey: string;
|
|
79
|
+
modelName: string;
|
|
80
|
+
}[];
|
|
81
|
+
modelParameters: {
|
|
82
|
+
maxSteps: number;
|
|
83
|
+
additionalInstruction: string;
|
|
84
|
+
};
|
|
85
|
+
}>;
|
|
86
|
+
}, "strip", z.ZodTypeAny, {
|
|
87
|
+
aiSettings: {
|
|
88
|
+
providers: Record<string, {
|
|
89
|
+
baseUrl: string;
|
|
90
|
+
apiKey: string;
|
|
91
|
+
models: {
|
|
92
|
+
modelName: string;
|
|
93
|
+
}[];
|
|
94
|
+
}>;
|
|
95
|
+
customModels: {
|
|
96
|
+
baseUrl: string;
|
|
97
|
+
apiKey: string;
|
|
98
|
+
modelName: string;
|
|
99
|
+
}[];
|
|
100
|
+
modelParameters: {
|
|
101
|
+
maxSteps: number;
|
|
102
|
+
additionalInstruction: string;
|
|
103
|
+
};
|
|
104
|
+
};
|
|
105
|
+
}, {
|
|
106
|
+
aiSettings: {
|
|
107
|
+
providers: Record<string, {
|
|
108
|
+
baseUrl: string;
|
|
109
|
+
apiKey: string;
|
|
110
|
+
models: {
|
|
111
|
+
modelName: string;
|
|
112
|
+
}[];
|
|
113
|
+
}>;
|
|
114
|
+
customModels: {
|
|
115
|
+
baseUrl: string;
|
|
116
|
+
apiKey: string;
|
|
117
|
+
modelName: string;
|
|
118
|
+
}[];
|
|
119
|
+
modelParameters: {
|
|
120
|
+
maxSteps: number;
|
|
121
|
+
additionalInstruction: string;
|
|
122
|
+
};
|
|
123
|
+
};
|
|
124
|
+
}>;
|
|
125
|
+
export type AiSettingsSliceConfig = z.infer<typeof AiSettingsSliceConfig>;
|
|
126
|
+
export declare function createDefaultAiSettings(props: Partial<AiSettingsSliceConfig['aiSettings']>): AiSettingsSliceConfig;
|
|
127
|
+
export type AiSettingsSliceState = {
|
|
128
|
+
getAiSettings: () => AiSettingsSliceConfig['aiSettings'];
|
|
129
|
+
setMaxSteps: (maxSteps: number) => void;
|
|
130
|
+
setAdditionalInstruction: (additionalInstruction: string) => void;
|
|
131
|
+
updateProvider: (provider: string, updates: {
|
|
132
|
+
baseUrl?: string;
|
|
133
|
+
apiKey?: string;
|
|
134
|
+
}) => void;
|
|
135
|
+
addProvider: (provider: string, baseUrl: string, apiKey: string) => void;
|
|
136
|
+
addModelToProvider: (provider: string, modelName: string) => void;
|
|
137
|
+
removeModelFromProvider: (provider: string, modelName: string) => void;
|
|
138
|
+
removeProvider: (provider: string) => void;
|
|
139
|
+
addCustomModel: (baseUrl: string, apiKey: string, modelName: string) => void;
|
|
140
|
+
updateCustomModel: (oldModelName: string, baseUrl: string, apiKey: string, newModelName: string) => void;
|
|
141
|
+
removeCustomModel: (modelName: string) => void;
|
|
142
|
+
};
|
|
143
|
+
export declare function createAiSettingsSlice<PC extends BaseRoomConfig & AiSettingsSliceConfig>(): StateCreator<AiSettingsSliceState>;
|
|
144
|
+
type RoomConfigWithAiSettings = BaseRoomConfig & AiSettingsSliceConfig;
|
|
145
|
+
type RoomShellSliceStateWithAiSettings = RoomShellSliceState<RoomConfigWithAiSettings> & AiSettingsSliceState;
|
|
146
|
+
export declare function useStoreWithAiSettings<T>(selector: (state: RoomShellSliceStateWithAiSettings) => T): T;
|
|
147
|
+
export {};
|
|
148
|
+
//# sourceMappingURL=AiSettingsSlice.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AiSettingsSlice.d.ts","sourceRoot":"","sources":["../src/AiSettingsSlice.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,cAAc,EACd,mBAAmB,EACnB,KAAK,YAAY,EAClB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2BhC,CAAC;AACH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAE1E,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,OAAO,CAAC,qBAAqB,CAAC,YAAY,CAAC,CAAC,GAClD,qBAAqB,CAwCvB;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,aAAa,EAAE,MAAM,qBAAqB,CAAC,YAAY,CAAC,CAAC;IACzD,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,wBAAwB,EAAE,CAAC,qBAAqB,EAAE,MAAM,KAAK,IAAI,CAAC;IAClE,cAAc,EAAE,CACd,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE;QACP,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,KACE,IAAI,CAAC;IACV,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACzE,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAClE,uBAAuB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACvE,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7E,iBAAiB,EAAE,CACjB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,KACjB,IAAI,CAAC;IACV,iBAAiB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAChD,CAAC;AAEF,wBAAgB,qBAAqB,CACnC,EAAE,SAAS,cAAc,GAAG,qBAAqB,KAC9C,YAAY,CAAC,oBAAoB,CAAC,CA4KtC;AAED,KAAK,wBAAwB,GAAG,cAAc,GAAG,qBAAqB,CAAC;AACvE,KAAK,iCAAiC,GACpC,mBAAmB,CAAC,wBAAwB,CAAC,GAAG,oBAAoB,CAAC;AAGvE,wBAAgB,sBAAsB,CAAC,CAAC,EACtC,QAAQ,EAAE,CAAC,KAAK,EAAE,iCAAiC,KAAK,CAAC,GACxD,CAAC,CAMH"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { useBaseRoomShellStore, createSlice, } from '@sqlrooms/room-shell';
|
|
2
|
+
import { produce } from 'immer';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
export const AiSettingsSliceConfig = z.object({
|
|
5
|
+
aiSettings: z.object({
|
|
6
|
+
providers: z.record(z.string(), // provider name
|
|
7
|
+
z.object({
|
|
8
|
+
baseUrl: z.string(),
|
|
9
|
+
apiKey: z.string(),
|
|
10
|
+
models: z.array(z.object({
|
|
11
|
+
modelName: z.string(),
|
|
12
|
+
})),
|
|
13
|
+
})),
|
|
14
|
+
// custom models using provider 'custom'
|
|
15
|
+
customModels: z.array(z.object({
|
|
16
|
+
baseUrl: z.string(),
|
|
17
|
+
apiKey: z.string(),
|
|
18
|
+
modelName: z.string(),
|
|
19
|
+
})),
|
|
20
|
+
modelParameters: z.object({
|
|
21
|
+
maxSteps: z.number(),
|
|
22
|
+
additionalInstruction: z.string(),
|
|
23
|
+
}),
|
|
24
|
+
}),
|
|
25
|
+
});
|
|
26
|
+
export function createDefaultAiSettings(props) {
|
|
27
|
+
return {
|
|
28
|
+
aiSettings: {
|
|
29
|
+
providers: {
|
|
30
|
+
openai: {
|
|
31
|
+
baseUrl: 'https://api.openai.com/v1',
|
|
32
|
+
apiKey: '',
|
|
33
|
+
models: [
|
|
34
|
+
{
|
|
35
|
+
modelName: 'gpt-4.1',
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
modelName: 'gpt-5',
|
|
39
|
+
},
|
|
40
|
+
],
|
|
41
|
+
},
|
|
42
|
+
anthropic: {
|
|
43
|
+
baseUrl: 'https://api.anthropic.com',
|
|
44
|
+
apiKey: '',
|
|
45
|
+
models: [
|
|
46
|
+
{
|
|
47
|
+
modelName: 'claude-4-sonnet',
|
|
48
|
+
},
|
|
49
|
+
],
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
customModels: [
|
|
53
|
+
// {
|
|
54
|
+
// baseUrl: 'http://localhost:11434/v1',
|
|
55
|
+
// apiKey: '',
|
|
56
|
+
// modelName: 'qwen3',
|
|
57
|
+
// },
|
|
58
|
+
],
|
|
59
|
+
modelParameters: {
|
|
60
|
+
maxSteps: 5,
|
|
61
|
+
additionalInstruction: '',
|
|
62
|
+
},
|
|
63
|
+
...props,
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
export function createAiSettingsSlice() {
|
|
68
|
+
return createSlice((set, get) => {
|
|
69
|
+
return {
|
|
70
|
+
getAiSettings: () => {
|
|
71
|
+
const state = get();
|
|
72
|
+
return state.config.aiSettings;
|
|
73
|
+
},
|
|
74
|
+
setMaxSteps: (maxSteps) => {
|
|
75
|
+
set((state) => produce(state, (draft) => {
|
|
76
|
+
draft.config.aiSettings.modelParameters.maxSteps = maxSteps;
|
|
77
|
+
}));
|
|
78
|
+
},
|
|
79
|
+
setAdditionalInstruction: (additionalInstruction) => {
|
|
80
|
+
set((state) => produce(state, (draft) => {
|
|
81
|
+
draft.config.aiSettings.modelParameters.additionalInstruction =
|
|
82
|
+
additionalInstruction;
|
|
83
|
+
}));
|
|
84
|
+
},
|
|
85
|
+
updateProvider: (provider, updates) => {
|
|
86
|
+
set((state) => produce(state, (draft) => {
|
|
87
|
+
if (draft.config.aiSettings.providers[provider]) {
|
|
88
|
+
Object.assign(draft.config.aiSettings.providers[provider], updates);
|
|
89
|
+
}
|
|
90
|
+
}));
|
|
91
|
+
},
|
|
92
|
+
addProvider: (provider, baseUrl, apiKey) => {
|
|
93
|
+
set((state) => produce(state, (draft) => {
|
|
94
|
+
draft.config.aiSettings.providers[provider] = {
|
|
95
|
+
baseUrl,
|
|
96
|
+
apiKey,
|
|
97
|
+
models: [],
|
|
98
|
+
};
|
|
99
|
+
}));
|
|
100
|
+
},
|
|
101
|
+
addModelToProvider: (provider, modelName) => {
|
|
102
|
+
set((state) => produce(state, (draft) => {
|
|
103
|
+
if (draft.config.aiSettings.providers[provider]) {
|
|
104
|
+
// Check if model already exists
|
|
105
|
+
const modelExists = draft.config.aiSettings.providers[provider].models.some((model) => model.modelName === modelName);
|
|
106
|
+
if (!modelExists) {
|
|
107
|
+
draft.config.aiSettings.providers[provider].models.push({
|
|
108
|
+
modelName: modelName,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}));
|
|
113
|
+
},
|
|
114
|
+
removeModelFromProvider: (provider, modelName) => {
|
|
115
|
+
set((state) => produce(state, (draft) => {
|
|
116
|
+
if (draft.config.aiSettings.providers[provider]) {
|
|
117
|
+
draft.config.aiSettings.providers[provider].models =
|
|
118
|
+
draft.config.aiSettings.providers[provider].models.filter((model) => model.modelName !== modelName);
|
|
119
|
+
}
|
|
120
|
+
}));
|
|
121
|
+
},
|
|
122
|
+
removeProvider: (provider) => {
|
|
123
|
+
set((state) => produce(state, (draft) => {
|
|
124
|
+
delete draft.config.aiSettings.providers[provider];
|
|
125
|
+
}));
|
|
126
|
+
},
|
|
127
|
+
addCustomModel: (baseUrl, apiKey, modelName) => {
|
|
128
|
+
set((state) => produce(state, (draft) => {
|
|
129
|
+
const newCustomModel = {
|
|
130
|
+
baseUrl,
|
|
131
|
+
apiKey,
|
|
132
|
+
modelName,
|
|
133
|
+
};
|
|
134
|
+
// Check if a custom model with the same name already exists
|
|
135
|
+
const existingModelIndex = draft.config.aiSettings.customModels.findIndex((model) => model.modelName.toLowerCase() === modelName.toLowerCase());
|
|
136
|
+
if (existingModelIndex !== -1) {
|
|
137
|
+
// Update existing model
|
|
138
|
+
draft.config.aiSettings.customModels[existingModelIndex] =
|
|
139
|
+
newCustomModel;
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
// Add new model
|
|
143
|
+
draft.config.aiSettings.customModels.push(newCustomModel);
|
|
144
|
+
}
|
|
145
|
+
}));
|
|
146
|
+
},
|
|
147
|
+
updateCustomModel: (oldModelName, baseUrl, apiKey, newModelName) => {
|
|
148
|
+
set((state) => produce(state, (draft) => {
|
|
149
|
+
// Find the model to update
|
|
150
|
+
const modelIndex = draft.config.aiSettings.customModels.findIndex((model) => model.modelName === oldModelName);
|
|
151
|
+
if (modelIndex !== -1) {
|
|
152
|
+
// Check if the new name conflicts with another model (excluding the current one)
|
|
153
|
+
const conflictingModelIndex = draft.config.aiSettings.customModels.findIndex((model, index) => index !== modelIndex &&
|
|
154
|
+
model.modelName.toLowerCase() ===
|
|
155
|
+
newModelName.toLowerCase());
|
|
156
|
+
if (conflictingModelIndex === -1) {
|
|
157
|
+
// Update the model
|
|
158
|
+
draft.config.aiSettings.customModels[modelIndex] = {
|
|
159
|
+
baseUrl,
|
|
160
|
+
apiKey,
|
|
161
|
+
modelName: newModelName,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}));
|
|
166
|
+
},
|
|
167
|
+
removeCustomModel: (modelName) => {
|
|
168
|
+
set((state) => produce(state, (draft) => {
|
|
169
|
+
draft.config.aiSettings.customModels =
|
|
170
|
+
draft.config.aiSettings.customModels.filter((model) => model.modelName !== modelName);
|
|
171
|
+
}));
|
|
172
|
+
},
|
|
173
|
+
};
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
// Hook to access aiSettings from the room store
|
|
177
|
+
export function useStoreWithAiSettings(selector) {
|
|
178
|
+
return useBaseRoomShellStore((state) => selector(state));
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=AiSettingsSlice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AiSettingsSlice.js","sourceRoot":"","sources":["../src/AiSettingsSlice.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n useBaseRoomShellStore,\n createSlice,\n BaseRoomConfig,\n RoomShellSliceState,\n type StateCreator,\n} from '@sqlrooms/room-shell';\nimport {produce} from 'immer';\nimport {z} from 'zod';\n\nexport const AiSettingsSliceConfig = z.object({\n aiSettings: z.object({\n providers: z.record(\n z.string(), // provider name\n z.object({\n baseUrl: z.string(),\n apiKey: z.string(),\n models: z.array(\n z.object({\n modelName: z.string(),\n }),\n ),\n }),\n ),\n // custom models using provider 'custom'\n customModels: z.array(\n z.object({\n baseUrl: z.string(),\n apiKey: z.string(),\n modelName: z.string(),\n }),\n ),\n modelParameters: z.object({\n maxSteps: z.number(),\n additionalInstruction: z.string(),\n }),\n }),\n});\nexport type AiSettingsSliceConfig = z.infer<typeof AiSettingsSliceConfig>;\n\nexport function createDefaultAiSettings(\n props: Partial<AiSettingsSliceConfig['aiSettings']>,\n): AiSettingsSliceConfig {\n return {\n aiSettings: {\n providers: {\n openai: {\n baseUrl: 'https://api.openai.com/v1',\n apiKey: '',\n models: [\n {\n modelName: 'gpt-4.1',\n },\n {\n modelName: 'gpt-5',\n },\n ],\n },\n anthropic: {\n baseUrl: 'https://api.anthropic.com',\n apiKey: '',\n models: [\n {\n modelName: 'claude-4-sonnet',\n },\n ],\n },\n },\n customModels: [\n // {\n // baseUrl: 'http://localhost:11434/v1',\n // apiKey: '',\n // modelName: 'qwen3',\n // },\n ],\n modelParameters: {\n maxSteps: 5,\n additionalInstruction: '',\n },\n ...props,\n },\n };\n}\n\nexport type AiSettingsSliceState = {\n getAiSettings: () => AiSettingsSliceConfig['aiSettings'];\n setMaxSteps: (maxSteps: number) => void;\n setAdditionalInstruction: (additionalInstruction: string) => void;\n updateProvider: (\n provider: string,\n updates: {\n baseUrl?: string;\n apiKey?: string;\n },\n ) => void;\n addProvider: (provider: string, baseUrl: string, apiKey: string) => void;\n addModelToProvider: (provider: string, modelName: string) => void;\n removeModelFromProvider: (provider: string, modelName: string) => void;\n removeProvider: (provider: string) => void;\n addCustomModel: (baseUrl: string, apiKey: string, modelName: string) => void;\n updateCustomModel: (\n oldModelName: string,\n baseUrl: string,\n apiKey: string,\n newModelName: string,\n ) => void;\n removeCustomModel: (modelName: string) => void;\n};\n\nexport function createAiSettingsSlice<\n PC extends BaseRoomConfig & AiSettingsSliceConfig,\n>(): StateCreator<AiSettingsSliceState> {\n return createSlice<PC, AiSettingsSliceState>((set, get) => {\n return {\n getAiSettings: () => {\n const state = get();\n return state.config.aiSettings;\n },\n\n setMaxSteps: (maxSteps: number) => {\n set((state) =>\n produce(state, (draft) => {\n draft.config.aiSettings.modelParameters.maxSteps = maxSteps;\n }),\n );\n },\n\n setAdditionalInstruction: (additionalInstruction: string) => {\n set((state) =>\n produce(state, (draft) => {\n draft.config.aiSettings.modelParameters.additionalInstruction =\n additionalInstruction;\n }),\n );\n },\n\n updateProvider: (\n provider: string,\n updates: {\n baseUrl?: string;\n apiKey?: string;\n },\n ) => {\n set((state) =>\n produce(state, (draft) => {\n if (draft.config.aiSettings.providers[provider]) {\n Object.assign(\n draft.config.aiSettings.providers[provider],\n updates,\n );\n }\n }),\n );\n },\n\n addProvider: (provider: string, baseUrl: string, apiKey: string) => {\n set((state) =>\n produce(state, (draft) => {\n draft.config.aiSettings.providers[provider] = {\n baseUrl,\n apiKey,\n models: [],\n };\n }),\n );\n },\n\n addModelToProvider: (provider: string, modelName: string) => {\n set((state) =>\n produce(state, (draft) => {\n if (draft.config.aiSettings.providers[provider]) {\n // Check if model already exists\n const modelExists = draft.config.aiSettings.providers[\n provider\n ].models.some((model) => model.modelName === modelName);\n\n if (!modelExists) {\n draft.config.aiSettings.providers[provider].models.push({\n modelName: modelName,\n });\n }\n }\n }),\n );\n },\n\n removeModelFromProvider: (provider: string, modelName: string) => {\n set((state) =>\n produce(state, (draft) => {\n if (draft.config.aiSettings.providers[provider]) {\n draft.config.aiSettings.providers[provider].models =\n draft.config.aiSettings.providers[provider].models.filter(\n (model) => model.modelName !== modelName,\n );\n }\n }),\n );\n },\n\n removeProvider: (provider: string) => {\n set((state) =>\n produce(state, (draft) => {\n delete draft.config.aiSettings.providers[provider];\n }),\n );\n },\n\n addCustomModel: (baseUrl: string, apiKey: string, modelName: string) => {\n set((state) =>\n produce(state, (draft) => {\n const newCustomModel = {\n baseUrl,\n apiKey,\n modelName,\n };\n\n // Check if a custom model with the same name already exists\n const existingModelIndex =\n draft.config.aiSettings.customModels.findIndex(\n (model) =>\n model.modelName.toLowerCase() === modelName.toLowerCase(),\n );\n\n if (existingModelIndex !== -1) {\n // Update existing model\n draft.config.aiSettings.customModels[existingModelIndex] =\n newCustomModel;\n } else {\n // Add new model\n draft.config.aiSettings.customModels.push(newCustomModel);\n }\n }),\n );\n },\n\n updateCustomModel: (\n oldModelName: string,\n baseUrl: string,\n apiKey: string,\n newModelName: string,\n ) => {\n set((state) =>\n produce(state, (draft) => {\n // Find the model to update\n const modelIndex = draft.config.aiSettings.customModels.findIndex(\n (model) => model.modelName === oldModelName,\n );\n\n if (modelIndex !== -1) {\n // Check if the new name conflicts with another model (excluding the current one)\n const conflictingModelIndex =\n draft.config.aiSettings.customModels.findIndex(\n (model, index) =>\n index !== modelIndex &&\n model.modelName.toLowerCase() ===\n newModelName.toLowerCase(),\n );\n\n if (conflictingModelIndex === -1) {\n // Update the model\n draft.config.aiSettings.customModels[modelIndex] = {\n baseUrl,\n apiKey,\n modelName: newModelName,\n };\n }\n }\n }),\n );\n },\n\n removeCustomModel: (modelName: string) => {\n set((state) =>\n produce(state, (draft) => {\n draft.config.aiSettings.customModels =\n draft.config.aiSettings.customModels.filter(\n (model) => model.modelName !== modelName,\n );\n }),\n );\n },\n };\n });\n}\n\ntype RoomConfigWithAiSettings = BaseRoomConfig & AiSettingsSliceConfig;\ntype RoomShellSliceStateWithAiSettings =\n RoomShellSliceState<RoomConfigWithAiSettings> & AiSettingsSliceState;\n\n// Hook to access aiSettings from the room store\nexport function useStoreWithAiSettings<T>(\n selector: (state: RoomShellSliceStateWithAiSettings) => T,\n): T {\n return useBaseRoomShellStore<\n BaseRoomConfig & AiSettingsSliceConfig,\n RoomShellSliceState<RoomConfigWithAiSettings>,\n T\n >((state) => selector(state as unknown as RoomShellSliceStateWithAiSettings));\n}\n"]}
|
package/dist/AiSlice.d.ts
CHANGED
|
@@ -241,8 +241,8 @@ export declare const AiSliceConfig: z.ZodObject<{
|
|
|
241
241
|
error: string;
|
|
242
242
|
} | undefined;
|
|
243
243
|
}[];
|
|
244
|
-
customModelName?: string | undefined;
|
|
245
244
|
baseUrl?: string | undefined;
|
|
245
|
+
customModelName?: string | undefined;
|
|
246
246
|
createdAt?: Date | undefined;
|
|
247
247
|
}, {
|
|
248
248
|
id: string;
|
|
@@ -258,8 +258,8 @@ export declare const AiSliceConfig: z.ZodObject<{
|
|
|
258
258
|
error: string;
|
|
259
259
|
} | undefined;
|
|
260
260
|
}[];
|
|
261
|
-
customModelName?: string | undefined;
|
|
262
261
|
baseUrl?: string | undefined;
|
|
262
|
+
customModelName?: string | undefined;
|
|
263
263
|
createdAt?: Date | undefined;
|
|
264
264
|
}>, {
|
|
265
265
|
id: string;
|
|
@@ -297,8 +297,8 @@ export declare const AiSliceConfig: z.ZodObject<{
|
|
|
297
297
|
error: string;
|
|
298
298
|
} | undefined;
|
|
299
299
|
}[];
|
|
300
|
-
customModelName?: string | undefined;
|
|
301
300
|
baseUrl?: string | undefined;
|
|
301
|
+
customModelName?: string | undefined;
|
|
302
302
|
createdAt?: Date | undefined;
|
|
303
303
|
}, unknown>, "many">;
|
|
304
304
|
currentSessionId: z.ZodOptional<z.ZodString>;
|
|
@@ -339,8 +339,8 @@ export declare const AiSliceConfig: z.ZodObject<{
|
|
|
339
339
|
error: string;
|
|
340
340
|
} | undefined;
|
|
341
341
|
}[];
|
|
342
|
-
customModelName?: string | undefined;
|
|
343
342
|
baseUrl?: string | undefined;
|
|
343
|
+
customModelName?: string | undefined;
|
|
344
344
|
createdAt?: Date | undefined;
|
|
345
345
|
}[];
|
|
346
346
|
currentSessionId?: string | undefined;
|
|
@@ -386,8 +386,8 @@ export declare const AiSliceConfig: z.ZodObject<{
|
|
|
386
386
|
error: string;
|
|
387
387
|
} | undefined;
|
|
388
388
|
}[];
|
|
389
|
-
customModelName?: string | undefined;
|
|
390
389
|
baseUrl?: string | undefined;
|
|
390
|
+
customModelName?: string | undefined;
|
|
391
391
|
createdAt?: Date | undefined;
|
|
392
392
|
}[];
|
|
393
393
|
currentSessionId?: string | undefined;
|
|
@@ -411,8 +411,6 @@ export type AiSliceState = {
|
|
|
411
411
|
startAnalysis: () => Promise<void>;
|
|
412
412
|
cancelAnalysis: () => void;
|
|
413
413
|
setAiModel: (modelProvider: string, model: string) => void;
|
|
414
|
-
setCustomModelName: (customModelName: string) => void;
|
|
415
|
-
setBaseUrl: (baseUrl: string) => void;
|
|
416
414
|
createSession: (name?: string, modelProvider?: string, model?: string) => void;
|
|
417
415
|
switchSession: (sessionId: string) => void;
|
|
418
416
|
renameSession: (sessionId: string, name: string) => void;
|
|
@@ -420,6 +418,10 @@ export type AiSliceState = {
|
|
|
420
418
|
getCurrentSession: () => AnalysisSessionSchema | undefined;
|
|
421
419
|
deleteAnalysisResult: (sessionId: string, resultId: string) => void;
|
|
422
420
|
findToolComponent: (toolName: string) => React.ComponentType | undefined;
|
|
421
|
+
getApiKeyFromSettings: () => string;
|
|
422
|
+
getBaseUrlFromSettings: () => string | undefined;
|
|
423
|
+
getMaxStepsFromSettings: () => number;
|
|
424
|
+
getInstructionsFromSettings: () => string;
|
|
423
425
|
};
|
|
424
426
|
};
|
|
425
427
|
/**
|
|
@@ -437,24 +439,13 @@ export interface AiSliceOptions {
|
|
|
437
439
|
*/
|
|
438
440
|
getInstructions?: (tablesSchema: DataTable[]) => string;
|
|
439
441
|
toolsOptions?: DefaultToolsOptions;
|
|
440
|
-
|
|
441
|
-
/**
|
|
442
|
-
* API key configuration for the AI slice
|
|
443
|
-
*/
|
|
444
|
-
export type AiSliceApiConfig = {
|
|
442
|
+
defaultProvider?: string;
|
|
445
443
|
defaultModel?: string;
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
baseUrl?: never;
|
|
452
|
-
});
|
|
453
|
-
/**
|
|
454
|
-
* Complete configuration for creating an AI slice
|
|
455
|
-
*/
|
|
456
|
-
export type CreateAiSliceConfig = AiSliceOptions & AiSliceApiConfig;
|
|
457
|
-
export declare function createAiSlice<PC extends BaseRoomConfig & AiSliceConfig>(params: CreateAiSliceConfig): StateCreator<AiSliceState>;
|
|
444
|
+
maxSteps?: number;
|
|
445
|
+
getApiKey?: (modelProvider: string) => string;
|
|
446
|
+
getBaseUrl?: () => string;
|
|
447
|
+
}
|
|
448
|
+
export declare function createAiSlice<PC extends BaseRoomConfig & AiSliceConfig>(params: AiSliceOptions): StateCreator<AiSliceState>;
|
|
458
449
|
type RoomConfigWithAi = BaseRoomConfig & AiSliceConfig;
|
|
459
450
|
type RoomShellSliceStateWithAi = RoomShellSliceState<RoomConfigWithAi> & AiSliceState;
|
|
460
451
|
export declare function useStoreWithAi<T>(selector: (state: RoomShellSliceStateWithAi) => T): T;
|
package/dist/AiSlice.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiSlice.d.ts","sourceRoot":"","sources":["../src/AiSlice.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,YAAY,EAAC,MAAM,sBAAsB,CAAC;AAElD,OAAO,EAAC,SAAS,EAAC,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EACL,cAAc,EAEd,mBAAmB,EAEnB,KAAK,YAAY,EAClB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AACtB,OAAO,
|
|
1
|
+
{"version":3,"file":"AiSlice.d.ts","sourceRoot":"","sources":["../src/AiSlice.ts"],"names":[],"mappings":"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"}
|