@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.
Files changed (46) hide show
  1. package/README.md +76 -1
  2. package/dist/AiSettingsSlice.d.ts +148 -0
  3. package/dist/AiSettingsSlice.d.ts.map +1 -0
  4. package/dist/AiSettingsSlice.js +180 -0
  5. package/dist/AiSettingsSlice.js.map +1 -0
  6. package/dist/AiSlice.d.ts +15 -24
  7. package/dist/AiSlice.d.ts.map +1 -1
  8. package/dist/AiSlice.js +99 -32
  9. package/dist/AiSlice.js.map +1 -1
  10. package/dist/analysis.d.ts +1 -3
  11. package/dist/analysis.d.ts.map +1 -1
  12. package/dist/analysis.js +2 -4
  13. package/dist/analysis.js.map +1 -1
  14. package/dist/components/AnalysisResult.js +1 -1
  15. package/dist/components/AnalysisResult.js.map +1 -1
  16. package/dist/components/settings/AiModelParameters.d.ts +6 -0
  17. package/dist/components/settings/AiModelParameters.d.ts.map +1 -0
  18. package/dist/components/settings/AiModelParameters.js +91 -0
  19. package/dist/components/settings/AiModelParameters.js.map +1 -0
  20. package/dist/components/settings/AiModelUsage.d.ts +18 -0
  21. package/dist/components/settings/AiModelUsage.d.ts.map +1 -0
  22. package/dist/components/settings/AiModelUsage.js +60 -0
  23. package/dist/components/settings/AiModelUsage.js.map +1 -0
  24. package/dist/components/settings/AiModelsSettings.d.ts +10 -0
  25. package/dist/components/settings/AiModelsSettings.d.ts.map +1 -0
  26. package/dist/components/settings/AiModelsSettings.js +229 -0
  27. package/dist/components/settings/AiModelsSettings.js.map +1 -0
  28. package/dist/components/settings/AiProvidersSettings.d.ts +3 -0
  29. package/dist/components/settings/AiProvidersSettings.d.ts.map +1 -0
  30. package/dist/components/settings/AiProvidersSettings.js +88 -0
  31. package/dist/components/settings/AiProvidersSettings.js.map +1 -0
  32. package/dist/components/settings/AiSettingsPanel.d.ts +17 -0
  33. package/dist/components/settings/AiSettingsPanel.d.ts.map +1 -0
  34. package/dist/components/settings/AiSettingsPanel.js +20 -0
  35. package/dist/components/settings/AiSettingsPanel.js.map +1 -0
  36. package/dist/components/tools/ToolResultErrorBoundary.d.ts +1 -1
  37. package/dist/index.d.ts +9 -0
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +7 -0
  40. package/dist/index.js.map +1 -1
  41. package/dist/schemas.d.ts +5 -5
  42. package/dist/utils.d.ts +17 -0
  43. package/dist/utils.d.ts.map +1 -0
  44. package/dist/utils.js +31 -0
  45. package/dist/utils.js.map +1 -0
  46. package/package.json +12 -10
@@ -0,0 +1,88 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React, { useState } from 'react';
3
+ import { Button, Input, Label, Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogTrigger, DialogFooter, useDisclosure, useToast, } from '@sqlrooms/ui';
4
+ import { Cone, Settings, Plus, Server, Key, Trash2, CirclePlus, } from 'lucide-react';
5
+ import { useStoreWithAiSettings } from '../../AiSettingsSlice';
6
+ export const AiProvidersSettings = () => {
7
+ const { toast } = useToast();
8
+ const updateProvider = useStoreWithAiSettings((state) => state.updateProvider);
9
+ const addProvider = useStoreWithAiSettings((state) => state.addProvider);
10
+ const removeProvider = useStoreWithAiSettings((state) => state.removeProvider);
11
+ const providers = useStoreWithAiSettings((state) => state.config.aiSettings.providers);
12
+ const modelProviders = React.useMemo(() => {
13
+ const result = {};
14
+ Object.entries(providers).forEach(([key, provider]) => {
15
+ result[key] = {
16
+ apiKey: provider.apiKey,
17
+ baseUrl: provider.baseUrl,
18
+ };
19
+ });
20
+ return result;
21
+ }, [providers]);
22
+ const [expandedProviders, setExpandedProviders] = useState(new Set());
23
+ // Dialog state for adding a new provider
24
+ const { isOpen, onOpen, onClose } = useDisclosure();
25
+ const [newProviderKey, setNewProviderKey] = useState('');
26
+ const [newProviderApiKey, setNewProviderApiKey] = useState('');
27
+ const [newProviderBaseUrl, setNewProviderBaseUrl] = useState('');
28
+ // Dialog state for delete confirmation
29
+ const { isOpen: isDeleteOpen, onOpen: onDeleteOpen, onClose: onDeleteClose, } = useDisclosure();
30
+ const [providerToDelete, setProviderToDelete] = useState(null);
31
+ const handleAddProvider = () => {
32
+ if (newProviderKey) {
33
+ // Check if provider already exists
34
+ if (providers[newProviderKey]) {
35
+ toast({
36
+ title: 'Provider already exists',
37
+ description: `A provider with the key "${newProviderKey}" already exists. Please choose a different key.`,
38
+ variant: 'destructive',
39
+ });
40
+ return;
41
+ }
42
+ addProvider(newProviderKey, newProviderBaseUrl, newProviderApiKey);
43
+ setNewProviderKey('');
44
+ setNewProviderApiKey('');
45
+ setNewProviderBaseUrl('');
46
+ onClose();
47
+ toast({
48
+ title: 'Provider added successfully',
49
+ description: `Provider "${newProviderKey}" has been added.`,
50
+ });
51
+ }
52
+ };
53
+ const handleUpdateProvider = (providerKey, field, value) => {
54
+ updateProvider(providerKey, { [field]: value });
55
+ };
56
+ const handleDeleteProvider = (providerKey) => {
57
+ setProviderToDelete({ key: providerKey });
58
+ onDeleteOpen();
59
+ };
60
+ const confirmDeleteProvider = () => {
61
+ if (providerToDelete) {
62
+ removeProvider(providerToDelete.key);
63
+ onDeleteClose();
64
+ setProviderToDelete(null);
65
+ toast({
66
+ title: 'Provider deleted successfully',
67
+ description: `Provider "${providerToDelete.key}" and its associated models have been removed.`,
68
+ });
69
+ }
70
+ };
71
+ const toggleProviderExpanded = (providerKey) => {
72
+ setExpandedProviders((prev) => {
73
+ const newSet = new Set(prev);
74
+ if (newSet.has(providerKey)) {
75
+ newSet.delete(providerKey);
76
+ }
77
+ else {
78
+ newSet.add(providerKey);
79
+ }
80
+ return newSet;
81
+ });
82
+ };
83
+ return (_jsxs("div", { className: "space-y-2", children: [_jsxs("label", { className: "text-md flex items-center gap-2 pb-6 font-medium", children: [_jsx(Cone, { className: "h-4 w-4" }), "Providers"] }), _jsx("div", { className: "space-y-1", children: Object.entries(modelProviders).map(([providerKey, provider]) => {
84
+ const isExpanded = expandedProviders.has(providerKey);
85
+ return (_jsxs("div", { className: "space-y-0 rounded-lg p-0", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx(Label, { className: "w-20 flex-shrink-0 text-sm", children: providerKey.charAt(0).toUpperCase() + providerKey.slice(1) }), _jsx(Input, { id: `${providerKey}-apiKey`, type: "password", value: provider.apiKey, onChange: (e) => handleUpdateProvider(providerKey, 'apiKey', e.target.value), placeholder: "Enter API key", className: "flex-1" }), _jsx(Button, { variant: "ghost", size: "icon", onClick: () => handleDeleteProvider(providerKey), className: "h-6 h-8 w-6 w-8 p-0 text-gray-500 hover:bg-gray-100 hover:text-gray-700", children: _jsx(Trash2, { className: "h-4 w-4" }) }), _jsx(Button, { variant: "ghost", size: "icon", onClick: () => toggleProviderExpanded(providerKey), className: "h-8 w-8 flex-shrink-0", children: _jsx(Settings, { className: "h-4 w-4" }) })] }), isExpanded && (_jsxs("div", { className: "flex items-center gap-3 pt-1", children: [_jsx("div", { className: "w-20 flex-shrink-0" }), ' ', _jsxs("div", { className: "flex flex-1 items-center gap-3", children: [_jsx(Label, { htmlFor: `${providerKey}-baseUrl`, className: "text-muted-foreground flex-shrink-0 text-xs", children: "baseUrl:" }), _jsx(Input, { id: `${providerKey}-baseUrl`, type: "url", value: provider.baseUrl, onChange: (e) => handleUpdateProvider(providerKey, 'baseUrl', e.target.value), placeholder: "Enter base URL", className: "flex-1" })] }), _jsx("div", { className: "w-16 flex-shrink-0" }), ' '] }))] }, providerKey));
86
+ }) }), _jsx("div", { className: "flex w-full p-2", children: _jsxs(Button, { onClick: onOpen, variant: "secondary", size: "sm", children: [_jsx(CirclePlus, { className: "h-3 w-3" }), "Add"] }) }), _jsxs(Dialog, { open: isOpen, onOpenChange: (open) => (open ? onOpen() : onClose()), children: [_jsx(DialogTrigger, { asChild: true }), _jsxs(DialogContent, { className: "border-0 p-5", children: [_jsxs(DialogHeader, { className: "mb-1", children: [_jsxs(DialogTitle, { className: "flex items-center gap-2 text-base", children: [_jsx(Cone, { className: "h-4 w-4" }), " Add New Provider"] }), _jsx(DialogDescription, { className: "text-xs", children: "Configure a new model provider with API credentials." })] }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx(Label, { htmlFor: "new-provider-key", className: "w-20 text-sm", children: "Key" }), _jsxs("div", { className: "relative flex-1", children: [_jsx(Cone, { className: "absolute left-2 top-1/2 h-4 w-4 -translate-y-1/2" }), _jsx(Input, { id: "new-provider-key", value: newProviderKey, onChange: (e) => setNewProviderKey(e.target.value), placeholder: "e.g., anthropic", className: "pl-8" })] })] }), _jsxs("div", { className: "flex items-center gap-3", children: [_jsx(Label, { htmlFor: "new-provider-api-key", className: "w-20 text-sm", children: "API Key" }), _jsxs("div", { className: "relative flex-1", children: [_jsx(Key, { className: "absolute left-2 top-1/2 h-4 w-4 -translate-y-1/2" }), _jsx(Input, { id: "new-provider-api-key", type: "password", value: newProviderApiKey, onChange: (e) => setNewProviderApiKey(e.target.value), placeholder: "Enter API key", className: "pl-8" })] })] }), _jsxs("div", { className: "flex items-center gap-3", children: [_jsx(Label, { htmlFor: "new-provider-url", className: "w-20 text-sm", children: "baseUrl" }), _jsxs("div", { className: "relative flex-1", children: [_jsx(Server, { className: "absolute left-2 top-1/2 h-4 w-4 -translate-y-1/2" }), _jsx(Input, { id: "new-provider-url", type: "url", value: newProviderBaseUrl, onChange: (e) => setNewProviderBaseUrl(e.target.value), placeholder: "Enter base URL", className: "pl-8" })] })] }), _jsx("div", { className: "flex justify-end pt-1", children: _jsxs(Button, { size: "sm", onClick: handleAddProvider, children: [_jsx(Plus, { className: "mr-2 h-4 w-4" }), " Add Provider"] }) })] })] })] }), _jsx(Dialog, { open: isDeleteOpen, onOpenChange: (open) => (open ? onDeleteOpen() : onDeleteClose()), children: _jsxs(DialogContent, { className: "border-0 p-5", children: [_jsxs(DialogHeader, { className: "mb-1", children: [_jsxs(DialogTitle, { className: "text-destructive flex items-center gap-2 text-base", children: [_jsx(Trash2, { className: "h-4 w-4" }), " Delete Provider"] }), _jsx(DialogDescription, { className: "text-xs", children: "This action cannot be undone. This will permanently delete the provider and all its associated models." })] }), _jsxs("div", { className: "py-2", children: [_jsxs("p", { className: "text-sm", children: ["Are you sure you want to delete the provider", ' ', _jsxs("strong", { children: ["\u201C", providerToDelete?.key, "\u201D"] }), "?"] }), _jsx("p", { className: "text-muted-foreground mt-1 text-xs", children: "All models associated with this provider will also be removed." })] }), _jsxs(DialogFooter, { className: "gap-2", children: [_jsx(Button, { variant: "outline", size: "sm", onClick: onDeleteClose, children: "Cancel" }), _jsxs(Button, { variant: "destructive", size: "sm", onClick: confirmDeleteProvider, children: [_jsx(Trash2, { className: "mr-2 h-4 w-4" }), "Delete Provider"] })] })] }) })] }));
87
+ };
88
+ //# sourceMappingURL=AiProvidersSettings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AiProvidersSettings.js","sourceRoot":"","sources":["../../../src/components/settings/AiProvidersSettings.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, {FC, useState} from 'react';\nimport {\n Button,\n Input,\n Label,\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n DialogTrigger,\n DialogFooter,\n useDisclosure,\n useToast,\n} from '@sqlrooms/ui';\nimport {\n Cone,\n Settings,\n Plus,\n Server,\n Key,\n Trash2,\n CirclePlus,\n} from 'lucide-react';\nimport {useStoreWithAiSettings} from '../../AiSettingsSlice';\n\nexport const AiProvidersSettings: FC = () => {\n const {toast} = useToast();\n const updateProvider = useStoreWithAiSettings(\n (state) => state.updateProvider,\n );\n const addProvider = useStoreWithAiSettings((state) => state.addProvider);\n const removeProvider = useStoreWithAiSettings(\n (state) => state.removeProvider,\n );\n const providers = useStoreWithAiSettings(\n (state) => state.config.aiSettings.providers,\n );\n const modelProviders = React.useMemo(() => {\n const result: Record<string, {apiKey: string; baseUrl: string}> = {};\n Object.entries(providers).forEach(([key, provider]) => {\n result[key] = {\n apiKey: provider.apiKey,\n baseUrl: provider.baseUrl,\n };\n });\n return result;\n }, [providers]);\n\n const [expandedProviders, setExpandedProviders] = useState<Set<string>>(\n new Set(),\n );\n\n // Dialog state for adding a new provider\n const {isOpen, onOpen, onClose} = useDisclosure();\n const [newProviderKey, setNewProviderKey] = useState('');\n const [newProviderApiKey, setNewProviderApiKey] = useState('');\n const [newProviderBaseUrl, setNewProviderBaseUrl] = useState('');\n\n // Dialog state for delete confirmation\n const {\n isOpen: isDeleteOpen,\n onOpen: onDeleteOpen,\n onClose: onDeleteClose,\n } = useDisclosure();\n const [providerToDelete, setProviderToDelete] = useState<{\n key: string;\n } | null>(null);\n\n const handleAddProvider = () => {\n if (newProviderKey) {\n // Check if provider already exists\n if (providers[newProviderKey]) {\n toast({\n title: 'Provider already exists',\n description: `A provider with the key \"${newProviderKey}\" already exists. Please choose a different key.`,\n variant: 'destructive',\n });\n return;\n }\n\n addProvider(newProviderKey, newProviderBaseUrl, newProviderApiKey);\n setNewProviderKey('');\n setNewProviderApiKey('');\n setNewProviderBaseUrl('');\n onClose();\n\n toast({\n title: 'Provider added successfully',\n description: `Provider \"${newProviderKey}\" has been added.`,\n });\n }\n };\n\n const handleUpdateProvider = (\n providerKey: string,\n field: 'apiKey' | 'baseUrl',\n value: string,\n ) => {\n updateProvider(providerKey, {[field]: value});\n };\n\n const handleDeleteProvider = (providerKey: string) => {\n setProviderToDelete({key: providerKey});\n onDeleteOpen();\n };\n\n const confirmDeleteProvider = () => {\n if (providerToDelete) {\n removeProvider(providerToDelete.key);\n onDeleteClose();\n setProviderToDelete(null);\n\n toast({\n title: 'Provider deleted successfully',\n description: `Provider \"${providerToDelete.key}\" and its associated models have been removed.`,\n });\n }\n };\n\n const toggleProviderExpanded = (providerKey: string) => {\n setExpandedProviders((prev) => {\n const newSet = new Set(prev);\n if (newSet.has(providerKey)) {\n newSet.delete(providerKey);\n } else {\n newSet.add(providerKey);\n }\n return newSet;\n });\n };\n\n return (\n <div className=\"space-y-2\">\n <label className=\"text-md flex items-center gap-2 pb-6 font-medium\">\n <Cone className=\"h-4 w-4\" />\n Providers\n </label>\n\n {/* Existing Providers */}\n <div className=\"space-y-1\">\n {Object.entries(modelProviders).map(([providerKey, provider]) => {\n const isExpanded = expandedProviders.has(providerKey);\n\n return (\n <div key={providerKey} className=\"space-y-0 rounded-lg p-0\">\n {/* First row: Provider name, API key input, delete button, and cogwheel button */}\n <div className=\"flex items-center gap-3\">\n <Label className=\"w-20 flex-shrink-0 text-sm\">\n {providerKey.charAt(0).toUpperCase() + providerKey.slice(1)}\n </Label>\n <Input\n id={`${providerKey}-apiKey`}\n type=\"password\"\n value={provider.apiKey}\n onChange={(e) =>\n handleUpdateProvider(providerKey, 'apiKey', e.target.value)\n }\n placeholder=\"Enter API key\"\n className=\"flex-1\"\n />\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => handleDeleteProvider(providerKey)}\n className=\"h-6 h-8 w-6 w-8 p-0 text-gray-500 hover:bg-gray-100 hover:text-gray-700\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => toggleProviderExpanded(providerKey)}\n className=\"h-8 w-8 flex-shrink-0\"\n >\n <Settings className=\"h-4 w-4\" />\n </Button>\n </div>\n\n {/* Second row: baseUrl input (toggleable) */}\n {isExpanded && (\n <div className=\"flex items-center gap-3 pt-1\">\n <div className=\"w-20 flex-shrink-0\" />{' '}\n {/* Spacer to align with provider name above */}\n <div className=\"flex flex-1 items-center gap-3\">\n <Label\n htmlFor={`${providerKey}-baseUrl`}\n className=\"text-muted-foreground flex-shrink-0 text-xs\"\n >\n baseUrl:\n </Label>\n <Input\n id={`${providerKey}-baseUrl`}\n type=\"url\"\n value={provider.baseUrl}\n onChange={(e) =>\n handleUpdateProvider(\n providerKey,\n 'baseUrl',\n e.target.value,\n )\n }\n placeholder=\"Enter base URL\"\n className=\"flex-1\"\n />\n </div>\n <div className=\"w-16 flex-shrink-0\" />{' '}\n {/* Spacer to align with delete and cogwheel buttons above */}\n </div>\n )}\n </div>\n );\n })}\n </div>\n\n {/* Add New Provider */}\n <div className=\"flex w-full p-2\">\n <Button onClick={onOpen} variant=\"secondary\" size=\"sm\">\n <CirclePlus className=\"h-3 w-3\" />\n Add\n </Button>\n </div>\n\n {/* Add New Provider Dialog */}\n <Dialog\n open={isOpen}\n onOpenChange={(open) => (open ? onOpen() : onClose())}\n >\n <DialogTrigger asChild>\n {/* handled via onOpen button above */}\n </DialogTrigger>\n <DialogContent className=\"border-0 p-5\">\n <DialogHeader className=\"mb-1\">\n <DialogTitle className=\"flex items-center gap-2 text-base\">\n <Cone className=\"h-4 w-4\" /> Add New Provider\n </DialogTitle>\n <DialogDescription className=\"text-xs\">\n Configure a new model provider with API credentials.\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-3\">\n <Label htmlFor=\"new-provider-key\" className=\"w-20 text-sm\">\n Key\n </Label>\n <div className=\"relative flex-1\">\n <Cone className=\"absolute left-2 top-1/2 h-4 w-4 -translate-y-1/2\" />\n <Input\n id=\"new-provider-key\"\n value={newProviderKey}\n onChange={(e) => setNewProviderKey(e.target.value)}\n placeholder=\"e.g., anthropic\"\n className=\"pl-8\"\n />\n </div>\n </div>\n\n <div className=\"flex items-center gap-3\">\n <Label htmlFor=\"new-provider-api-key\" className=\"w-20 text-sm\">\n API Key\n </Label>\n <div className=\"relative flex-1\">\n <Key className=\"absolute left-2 top-1/2 h-4 w-4 -translate-y-1/2\" />\n <Input\n id=\"new-provider-api-key\"\n type=\"password\"\n value={newProviderApiKey}\n onChange={(e) => setNewProviderApiKey(e.target.value)}\n placeholder=\"Enter API key\"\n className=\"pl-8\"\n />\n </div>\n </div>\n\n <div className=\"flex items-center gap-3\">\n <Label htmlFor=\"new-provider-url\" className=\"w-20 text-sm\">\n baseUrl\n </Label>\n <div className=\"relative flex-1\">\n <Server className=\"absolute left-2 top-1/2 h-4 w-4 -translate-y-1/2\" />\n <Input\n id=\"new-provider-url\"\n type=\"url\"\n value={newProviderBaseUrl}\n onChange={(e) => setNewProviderBaseUrl(e.target.value)}\n placeholder=\"Enter base URL\"\n className=\"pl-8\"\n />\n </div>\n </div>\n\n <div className=\"flex justify-end pt-1\">\n <Button size=\"sm\" onClick={handleAddProvider}>\n <Plus className=\"mr-2 h-4 w-4\" /> Add Provider\n </Button>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n\n {/* Delete Confirmation Dialog */}\n <Dialog\n open={isDeleteOpen}\n onOpenChange={(open) => (open ? onDeleteOpen() : onDeleteClose())}\n >\n <DialogContent className=\"border-0 p-5\">\n <DialogHeader className=\"mb-1\">\n <DialogTitle className=\"text-destructive flex items-center gap-2 text-base\">\n <Trash2 className=\"h-4 w-4\" /> Delete Provider\n </DialogTitle>\n <DialogDescription className=\"text-xs\">\n This action cannot be undone. This will permanently delete the\n provider and all its associated models.\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"py-2\">\n <p className=\"text-sm\">\n Are you sure you want to delete the provider{' '}\n <strong>&ldquo;{providerToDelete?.key}&rdquo;</strong>?\n </p>\n <p className=\"text-muted-foreground mt-1 text-xs\">\n All models associated with this provider will also be removed.\n </p>\n </div>\n\n <DialogFooter className=\"gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={onDeleteClose}>\n Cancel\n </Button>\n <Button\n variant=\"destructive\"\n size=\"sm\"\n onClick={confirmDeleteProvider}\n >\n <Trash2 className=\"mr-2 h-4 w-4\" />\n Delete Provider\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </div>\n );\n};\n"]}
@@ -0,0 +1,17 @@
1
+ import { FC, PropsWithChildren } from 'react';
2
+ import { UseDisclosureReturnValue } from '@sqlrooms/ui';
3
+ interface AiSettingsPanelProps {
4
+ disclosure: UseDisclosureReturnValue;
5
+ }
6
+ export declare const AiSettingsPanelBase: FC<PropsWithChildren<AiSettingsPanelProps>>;
7
+ export declare const AiSettingsPanel: FC<PropsWithChildren<AiSettingsPanelProps>> & {
8
+ ProvidersSettings: FC;
9
+ ModelsSettings: FC<import("./AiModelsSettings").AiModelsSettingsProps>;
10
+ ModelUsage: FC<{
11
+ className?: string;
12
+ modelUsage?: import("./AiModelUsage").ModelUsageData;
13
+ }>;
14
+ ModelParametersSettings: FC<import("./AiModelParameters").AiModelParametersProps>;
15
+ };
16
+ export {};
17
+ //# sourceMappingURL=AiSettingsPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AiSettingsPanel.d.ts","sourceRoot":"","sources":["../../../src/components/settings/AiSettingsPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,EAAE,EAAE,iBAAiB,EAAC,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAS,wBAAwB,EAAC,MAAM,cAAc,CAAC;AAQ9D,UAAU,oBAAoB;IAC5B,UAAU,EAAE,wBAAwB,CAAC;CACtC;AAED,eAAO,MAAM,mBAAmB,EAAE,EAAE,CAClC,iBAAiB,CAAC,oBAAoB,CAAC,CAoBxC,CAAC;AAEF,eAAO,MAAM,eAAe;;;;;;;;CAK1B,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Button } from '@sqlrooms/ui';
3
+ import { X } from 'lucide-react';
4
+ import { AiModelParameters } from './AiModelParameters';
5
+ import { AiModelUsage } from './AiModelUsage';
6
+ import { AiProvidersSettings } from './AiProvidersSettings';
7
+ import { AiModelsSettings } from './AiModelsSettings';
8
+ export const AiSettingsPanelBase = ({ disclosure, children }) => {
9
+ const { isOpen, onClose } = disclosure;
10
+ if (!isOpen)
11
+ return null;
12
+ return (_jsx("div", { className: "bg-background border-border w-full rounded-lg border shadow-sm", children: _jsxs("div", { className: "relative flex flex-col gap-12 overflow-y-auto p-6", children: [_jsx(Button, { variant: "ghost", size: "icon", onClick: onClose, className: "absolute right-2 top-2 z-10", children: _jsx(X, { className: "h-4 w-4" }) }), children] }) }));
13
+ };
14
+ export const AiSettingsPanel = Object.assign(AiSettingsPanelBase, {
15
+ ProvidersSettings: AiProvidersSettings,
16
+ ModelsSettings: AiModelsSettings,
17
+ ModelUsage: AiModelUsage,
18
+ ModelParametersSettings: AiModelParameters,
19
+ });
20
+ //# sourceMappingURL=AiSettingsPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AiSettingsPanel.js","sourceRoot":"","sources":["../../../src/components/settings/AiSettingsPanel.tsx"],"names":[],"mappings":";AACA,OAAO,EAAC,MAAM,EAA2B,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAC,CAAC,EAAC,MAAM,cAAc,CAAC;AAE/B,OAAO,EAAC,iBAAiB,EAAC,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAC,mBAAmB,EAAC,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAC,gBAAgB,EAAC,MAAM,oBAAoB,CAAC;AAMpD,MAAM,CAAC,MAAM,mBAAmB,GAE5B,CAAC,EAAC,UAAU,EAAE,QAAQ,EAAC,EAAE,EAAE;IAC7B,MAAM,EAAC,MAAM,EAAE,OAAO,EAAC,GAAG,UAAU,CAAC;IACrC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,OAAO,CACL,cAAK,SAAS,EAAC,gEAAgE,YAC7E,eAAK,SAAS,EAAC,mDAAmD,aAChE,KAAC,MAAM,IACL,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,MAAM,EACX,OAAO,EAAE,OAAO,EAChB,SAAS,EAAC,6BAA6B,YAEvC,KAAC,CAAC,IAAC,SAAS,EAAC,SAAS,GAAG,GAClB,EACR,QAAQ,IACL,GACF,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,mBAAmB,EAAE;IAChE,iBAAiB,EAAE,mBAAmB;IACtC,cAAc,EAAE,gBAAgB;IAChC,UAAU,EAAE,YAAY;IACxB,uBAAuB,EAAE,iBAAiB;CAC3C,CAAC,CAAC","sourcesContent":["import {FC, PropsWithChildren} from 'react';\nimport {Button, UseDisclosureReturnValue} from '@sqlrooms/ui';\nimport {X} from 'lucide-react';\n\nimport {AiModelParameters} from './AiModelParameters';\nimport {AiModelUsage} from './AiModelUsage';\nimport {AiProvidersSettings} from './AiProvidersSettings';\nimport {AiModelsSettings} from './AiModelsSettings';\n\ninterface AiSettingsPanelProps {\n disclosure: UseDisclosureReturnValue;\n}\n\nexport const AiSettingsPanelBase: FC<\n PropsWithChildren<AiSettingsPanelProps>\n> = ({disclosure, children}) => {\n const {isOpen, onClose} = disclosure;\n if (!isOpen) return null;\n\n return (\n <div className=\"bg-background border-border w-full rounded-lg border shadow-sm\">\n <div className=\"relative flex flex-col gap-12 overflow-y-auto p-6\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onClose}\n className=\"absolute right-2 top-2 z-10\"\n >\n <X className=\"h-4 w-4\" />\n </Button>\n {children}\n </div>\n </div>\n );\n};\n\nexport const AiSettingsPanel = Object.assign(AiSettingsPanelBase, {\n ProvidersSettings: AiProvidersSettings,\n ModelsSettings: AiModelsSettings,\n ModelUsage: AiModelUsage,\n ModelParametersSettings: AiModelParameters,\n});\n"]}
@@ -14,6 +14,6 @@ export declare class ToolCallErrorBoundary extends React.Component<{
14
14
  hasError: boolean;
15
15
  };
16
16
  componentDidCatch(error: Error): void;
17
- render(): string | number | bigint | boolean | import("react/jsx-runtime").JSX.Element | Iterable<React.ReactNode> | Promise<string | number | bigint | boolean | React.ReactPortal | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | null | undefined> | null | undefined;
17
+ render(): string | number | bigint | boolean | Iterable<React.ReactNode> | Promise<string | number | bigint | boolean | React.ReactPortal | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | null | undefined> | import("react/jsx-runtime").JSX.Element | null | undefined;
18
18
  }
19
19
  //# sourceMappingURL=ToolResultErrorBoundary.d.ts.map
package/dist/index.d.ts CHANGED
@@ -20,4 +20,13 @@ export * from './components/session/SessionDropdown';
20
20
  export * from './components/session/SessionTitle';
21
21
  export * from './components/session/SessionType';
22
22
  export * from './components/tools/ToolErrorMessage';
23
+ export { createAiSettingsSlice, useStoreWithAiSettings, AiSettingsSliceConfig, createDefaultAiSettings, } from './AiSettingsSlice';
24
+ export type { AiSettingsSliceState } from './AiSettingsSlice';
25
+ export { AiSettingsPanel } from './components/settings/AiSettingsPanel';
26
+ export { AiProvidersSettings } from './components/settings/AiProvidersSettings';
27
+ export { AiModelsSettings } from './components/settings/AiModelsSettings';
28
+ export { AiModelParameters } from './components/settings/AiModelParameters';
29
+ export { AiModelUsage } from './components/settings/AiModelUsage';
30
+ export type { ModelUsageData } from './components/settings/AiModelUsage';
31
+ export { extractModelsFromSettings } from './utils';
23
32
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,aAAa,EACb,aAAa,EACb,cAAc,EACd,qBAAqB,GACtB,MAAM,WAAW,CAAC;AAEnB,YAAY,EAAC,YAAY,EAAC,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAC,aAAa,EAAC,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAC,wBAAwB,EAAC,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAC,cAAc,EAAC,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAC,iBAAiB,EAAC,MAAM,2BAA2B,CAAC;AAC5D,YAAY,EAAC,WAAW,EAAC,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAC,eAAe,EAAC,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAC,sBAAsB,EAAC,MAAM,YAAY,CAAC;AAElD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0CAA0C,CAAC;AACzD,cAAc,qCAAqC,CAAC;AACpD,cAAc,sCAAsC,CAAC;AACrD,cAAc,mCAAmC,CAAC;AAClD,cAAc,kCAAkC,CAAC;AACjD,cAAc,qCAAqC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,aAAa,EACb,aAAa,EACb,cAAc,EACd,qBAAqB,GACtB,MAAM,WAAW,CAAC;AAEnB,YAAY,EAAC,YAAY,EAAC,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAC,aAAa,EAAC,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAC,wBAAwB,EAAC,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAC,cAAc,EAAC,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAC,iBAAiB,EAAC,MAAM,2BAA2B,CAAC;AAC5D,YAAY,EAAC,WAAW,EAAC,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAC,eAAe,EAAC,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAC,sBAAsB,EAAC,MAAM,YAAY,CAAC;AAElD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0CAA0C,CAAC;AACzD,cAAc,qCAAqC,CAAC;AACpD,cAAc,sCAAsC,CAAC;AACrD,cAAc,mCAAmC,CAAC;AAClD,cAAc,kCAAkC,CAAC;AACjD,cAAc,qCAAqC,CAAC;AAEpD,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EAAC,oBAAoB,EAAC,MAAM,mBAAmB,CAAC;AAE5D,OAAO,EAAC,eAAe,EAAC,MAAM,uCAAuC,CAAC;AACtE,OAAO,EAAC,mBAAmB,EAAC,MAAM,2CAA2C,CAAC;AAC9E,OAAO,EAAC,gBAAgB,EAAC,MAAM,wCAAwC,CAAC;AACxE,OAAO,EAAC,iBAAiB,EAAC,MAAM,yCAAyC,CAAC;AAC1E,OAAO,EAAC,YAAY,EAAC,MAAM,oCAAoC,CAAC;AAChE,YAAY,EAAC,cAAc,EAAC,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAC,yBAAyB,EAAC,MAAM,SAAS,CAAC"}
package/dist/index.js CHANGED
@@ -18,4 +18,11 @@ export * from './components/session/SessionDropdown';
18
18
  export * from './components/session/SessionTitle';
19
19
  export * from './components/session/SessionType';
20
20
  export * from './components/tools/ToolErrorMessage';
21
+ export { createAiSettingsSlice, useStoreWithAiSettings, AiSettingsSliceConfig, createDefaultAiSettings, } from './AiSettingsSlice';
22
+ export { AiSettingsPanel } from './components/settings/AiSettingsPanel';
23
+ export { AiProvidersSettings } from './components/settings/AiProvidersSettings';
24
+ export { AiModelsSettings } from './components/settings/AiModelsSettings';
25
+ export { AiModelParameters } from './components/settings/AiModelParameters';
26
+ export { AiModelUsage } from './components/settings/AiModelUsage';
27
+ export { extractModelsFromSettings } from './utils';
21
28
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,aAAa,EACb,aAAa,EACb,cAAc,EACd,qBAAqB,GACtB,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAC,aAAa,EAAC,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAC,wBAAwB,EAAC,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAC,cAAc,EAAC,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAC,iBAAiB,EAAC,MAAM,2BAA2B,CAAC;AAE5D,OAAO,EAAC,eAAe,EAAC,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAC,sBAAsB,EAAC,MAAM,YAAY,CAAC;AAElD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0CAA0C,CAAC;AACzD,cAAc,qCAAqC,CAAC;AACpD,cAAc,sCAAsC,CAAC;AACrD,cAAc,mCAAmC,CAAC;AAClD,cAAc,kCAAkC,CAAC;AACjD,cAAc,qCAAqC,CAAC","sourcesContent":["/**\n * {@include ../README.md}\n * @packageDocumentation\n */\n\nexport {\n AiSliceConfig,\n createAiSlice,\n useStoreWithAi,\n createDefaultAiConfig,\n} from './AiSlice';\n\nexport type {AiSliceState} from './AiSlice';\nexport {QueryControls} from './components/QueryControls';\nexport {AnalysisResultsContainer} from './components/AnalysisResultsContainer';\nexport {AnalysisResult} from './components/AnalysisResult';\nexport {useScrollToBottom} from './hooks/useScrollToBottom';\nexport type {AiSliceTool} from './AiSlice';\nexport {QueryToolResult} from './components/tools/QueryToolResult';\nexport {getDefaultInstructions} from './analysis';\n\nexport * from './components/ModelSelector';\nexport * from './components/SessionControls';\nexport * from './components/QueryControls';\nexport * from './components/session/DeleteSessionDialog';\nexport * from './components/session/SessionActions';\nexport * from './components/session/SessionDropdown';\nexport * from './components/session/SessionTitle';\nexport * from './components/session/SessionType';\nexport * from './components/tools/ToolErrorMessage';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,aAAa,EACb,aAAa,EACb,cAAc,EACd,qBAAqB,GACtB,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAC,aAAa,EAAC,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAC,wBAAwB,EAAC,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAC,cAAc,EAAC,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAC,iBAAiB,EAAC,MAAM,2BAA2B,CAAC;AAE5D,OAAO,EAAC,eAAe,EAAC,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAC,sBAAsB,EAAC,MAAM,YAAY,CAAC;AAElD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0CAA0C,CAAC;AACzD,cAAc,qCAAqC,CAAC;AACpD,cAAc,sCAAsC,CAAC;AACrD,cAAc,mCAAmC,CAAC;AAClD,cAAc,kCAAkC,CAAC;AACjD,cAAc,qCAAqC,CAAC;AAEpD,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAI3B,OAAO,EAAC,eAAe,EAAC,MAAM,uCAAuC,CAAC;AACtE,OAAO,EAAC,mBAAmB,EAAC,MAAM,2CAA2C,CAAC;AAC9E,OAAO,EAAC,gBAAgB,EAAC,MAAM,wCAAwC,CAAC;AACxE,OAAO,EAAC,iBAAiB,EAAC,MAAM,yCAAyC,CAAC;AAC1E,OAAO,EAAC,YAAY,EAAC,MAAM,oCAAoC,CAAC;AAEhE,OAAO,EAAC,yBAAyB,EAAC,MAAM,SAAS,CAAC","sourcesContent":["/**\n * {@include ../README.md}\n * @packageDocumentation\n */\n\nexport {\n AiSliceConfig,\n createAiSlice,\n useStoreWithAi,\n createDefaultAiConfig,\n} from './AiSlice';\n\nexport type {AiSliceState} from './AiSlice';\nexport {QueryControls} from './components/QueryControls';\nexport {AnalysisResultsContainer} from './components/AnalysisResultsContainer';\nexport {AnalysisResult} from './components/AnalysisResult';\nexport {useScrollToBottom} from './hooks/useScrollToBottom';\nexport type {AiSliceTool} from './AiSlice';\nexport {QueryToolResult} from './components/tools/QueryToolResult';\nexport {getDefaultInstructions} from './analysis';\n\nexport * from './components/ModelSelector';\nexport * from './components/SessionControls';\nexport * from './components/QueryControls';\nexport * from './components/session/DeleteSessionDialog';\nexport * from './components/session/SessionActions';\nexport * from './components/session/SessionDropdown';\nexport * from './components/session/SessionTitle';\nexport * from './components/session/SessionType';\nexport * from './components/tools/ToolErrorMessage';\n\nexport {\n createAiSettingsSlice,\n useStoreWithAiSettings,\n AiSettingsSliceConfig,\n createDefaultAiSettings,\n} from './AiSettingsSlice';\n\nexport type {AiSettingsSliceState} from './AiSettingsSlice';\n\nexport {AiSettingsPanel} from './components/settings/AiSettingsPanel';\nexport {AiProvidersSettings} from './components/settings/AiProvidersSettings';\nexport {AiModelsSettings} from './components/settings/AiModelsSettings';\nexport {AiModelParameters} from './components/settings/AiModelParameters';\nexport {AiModelUsage} from './components/settings/AiModelUsage';\nexport type {ModelUsageData} from './components/settings/AiModelUsage';\nexport {extractModelsFromSettings} from './utils';\n"]}
package/dist/schemas.d.ts CHANGED
@@ -4,12 +4,12 @@ export declare const QueryToolParameters: z.ZodObject<{
4
4
  sqlQuery: z.ZodString;
5
5
  reasoning: z.ZodString;
6
6
  }, "strip", z.ZodTypeAny, {
7
- sqlQuery: string;
8
7
  type: "query";
8
+ sqlQuery: string;
9
9
  reasoning: string;
10
10
  }, {
11
- sqlQuery: string;
12
11
  type: "query";
12
+ sqlQuery: string;
13
13
  reasoning: string;
14
14
  }>;
15
15
  export type QueryToolParameters = z.infer<typeof QueryToolParameters>;
@@ -448,8 +448,8 @@ export declare const AnalysisSessionSchema: z.ZodEffects<z.ZodObject<{
448
448
  error: string;
449
449
  } | undefined;
450
450
  }[];
451
- customModelName?: string | undefined;
452
451
  baseUrl?: string | undefined;
452
+ customModelName?: string | undefined;
453
453
  createdAt?: Date | undefined;
454
454
  }, {
455
455
  id: string;
@@ -465,8 +465,8 @@ export declare const AnalysisSessionSchema: z.ZodEffects<z.ZodObject<{
465
465
  error: string;
466
466
  } | undefined;
467
467
  }[];
468
- customModelName?: string | undefined;
469
468
  baseUrl?: string | undefined;
469
+ customModelName?: string | undefined;
470
470
  createdAt?: Date | undefined;
471
471
  }>, {
472
472
  id: string;
@@ -504,8 +504,8 @@ export declare const AnalysisSessionSchema: z.ZodEffects<z.ZodObject<{
504
504
  error: string;
505
505
  } | undefined;
506
506
  }[];
507
- customModelName?: string | undefined;
508
507
  baseUrl?: string | undefined;
508
+ customModelName?: string | undefined;
509
509
  createdAt?: Date | undefined;
510
510
  }, unknown>;
511
511
  export type AnalysisSessionSchema = z.infer<typeof AnalysisSessionSchema>;
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Utility functions for AI Chat UI configuration
3
+ */
4
+ import { AiSettingsSliceConfig } from './AiSettingsSlice';
5
+ type AiModelConfig = AiSettingsSliceConfig['aiSettings'];
6
+ /**
7
+ * Extract models from aiSettings in the format expected by ModelSelector
8
+ * @param config - The AI model configuration
9
+ * @returns Array of models with provider, label, and value properties
10
+ */
11
+ export declare function extractModelsFromSettings(config: AiModelConfig): Array<{
12
+ provider: string;
13
+ label: string;
14
+ value: string;
15
+ }>;
16
+ export {};
17
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAC,qBAAqB,EAAC,MAAM,mBAAmB,CAAC;AAExD,KAAK,aAAa,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAAC;AAEzD;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,aAAa,GAAG,KAAK,CAAC;IACtE,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf,CAAC,CA4BD"}
package/dist/utils.js ADDED
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Utility functions for AI Chat UI configuration
3
+ */
4
+ /**
5
+ * Extract models from aiSettings in the format expected by ModelSelector
6
+ * @param config - The AI model configuration
7
+ * @returns Array of models with provider, label, and value properties
8
+ */
9
+ export function extractModelsFromSettings(config) {
10
+ const models = [];
11
+ // Extract models from providers
12
+ Object.entries(config.providers).forEach(([providerKey, provider]) => {
13
+ provider.models.forEach((model) => {
14
+ models.push({
15
+ provider: providerKey,
16
+ label: model.modelName,
17
+ value: model.modelName,
18
+ });
19
+ });
20
+ });
21
+ // Add custom models
22
+ config.customModels.forEach((customModel) => {
23
+ models.push({
24
+ provider: 'custom',
25
+ label: customModel.modelName,
26
+ value: customModel.modelName,
27
+ });
28
+ });
29
+ return models;
30
+ }
31
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CAAC,MAAqB;IAK7D,MAAM,MAAM,GAIP,EAAE,CAAC;IAER,gCAAgC;IAChC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,EAAE;QACnE,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAChC,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,WAAW;gBACrB,KAAK,EAAE,KAAK,CAAC,SAAS;gBACtB,KAAK,EAAE,KAAK,CAAC,SAAS;aACvB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,oBAAoB;IACpB,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE;QAC1C,MAAM,CAAC,IAAI,CAAC;YACV,QAAQ,EAAE,QAAQ;YAClB,KAAK,EAAE,WAAW,CAAC,SAAS;YAC5B,KAAK,EAAE,WAAW,CAAC,SAAS;SAC7B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["/**\n * Utility functions for AI Chat UI configuration\n */\n\nimport {AiSettingsSliceConfig} from './AiSettingsSlice';\n\ntype AiModelConfig = AiSettingsSliceConfig['aiSettings'];\n\n/**\n * Extract models from aiSettings in the format expected by ModelSelector\n * @param config - The AI model configuration\n * @returns Array of models with provider, label, and value properties\n */\nexport function extractModelsFromSettings(config: AiModelConfig): Array<{\n provider: string;\n label: string;\n value: string;\n}> {\n const models: Array<{\n provider: string;\n label: string;\n value: string;\n }> = [];\n\n // Extract models from providers\n Object.entries(config.providers).forEach(([providerKey, provider]) => {\n provider.models.forEach((model) => {\n models.push({\n provider: providerKey,\n label: model.modelName,\n value: model.modelName,\n });\n });\n });\n\n // Add custom models\n config.customModels.forEach((customModel) => {\n models.push({\n provider: 'custom',\n label: customModel.modelName,\n value: customModel.modelName,\n });\n });\n\n return models;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sqlrooms/ai",
3
- "version": "0.24.24",
3
+ "version": "0.24.25",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "module": "dist/index.js",
@@ -22,17 +22,19 @@
22
22
  "@openassistant/core": "0.5.17",
23
23
  "@openassistant/utils": "0.5.17",
24
24
  "@paralleldrive/cuid2": "^2.2.2",
25
- "@sqlrooms/data-table": "0.24.24",
26
- "@sqlrooms/duckdb": "0.24.24",
27
- "@sqlrooms/monaco-editor": "0.24.24",
28
- "@sqlrooms/room-config": "0.24.24",
29
- "@sqlrooms/room-shell": "0.24.24",
30
- "@sqlrooms/ui": "0.24.24",
31
- "@sqlrooms/utils": "0.24.24",
25
+ "@sqlrooms/data-table": "0.24.25",
26
+ "@sqlrooms/duckdb": "0.24.25",
27
+ "@sqlrooms/monaco-editor": "0.24.25",
28
+ "@sqlrooms/recharts": "0.24.25",
29
+ "@sqlrooms/room-config": "0.24.25",
30
+ "@sqlrooms/room-shell": "0.24.25",
31
+ "@sqlrooms/ui": "0.24.25",
32
+ "@sqlrooms/utils": "0.24.25",
32
33
  "ai": "^4.3.19",
33
34
  "immer": "^10.1.1",
34
35
  "lucide-react": "^0.475.0",
35
36
  "react-markdown": "^10.1.0",
37
+ "recharts": "^2.12.7",
36
38
  "rehype-raw": "^7.0.0",
37
39
  "remark-gfm": "^4.0.0",
38
40
  "zod": "^3.25.73"
@@ -49,5 +51,5 @@
49
51
  "typecheck": "tsc --noEmit",
50
52
  "typedoc": "typedoc"
51
53
  },
52
- "gitHead": "37bb4689a2f54a2697b49b31f80ba4728fdc26ab"
53
- }
54
+ "gitHead": "e523a7efbbf2ea0f109479166663d379bdeb4159"
55
+ }