@messenger-box/tailwind-ui-inbox 10.0.3-alpha.72 → 10.0.3-alpha.74
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/CHANGELOG.md +8 -0
- package/lib/components/AIAgent/AIAgent.d.ts +7 -0
- package/lib/components/AIAgent/AIAgent.d.ts.map +1 -1
- package/lib/components/AIAgent/AIAgent.js +362 -615
- package/lib/components/AIAgent/AIAgent.js.map +1 -1
- package/lib/components/InboxMessage/InputComponent.d.ts.map +1 -1
- package/lib/components/InboxMessage/InputComponent.js +143 -140
- package/lib/components/InboxMessage/InputComponent.js.map +1 -1
- package/lib/components/InboxMessage/RightSidebarAi.d.ts +23 -0
- package/lib/components/InboxMessage/RightSidebarAi.d.ts.map +1 -0
- package/lib/components/InboxMessage/RightSidebarAi.js +9 -0
- package/lib/components/InboxMessage/RightSidebarAi.js.map +1 -0
- package/lib/components/InboxMessage/index.d.ts +1 -0
- package/lib/components/InboxMessage/index.d.ts.map +1 -1
- package/lib/components/InboxMessage/message-widgets/ErrorFixCard.d.ts +11 -0
- package/lib/components/InboxMessage/message-widgets/ErrorFixCard.d.ts.map +1 -0
- package/lib/components/InboxMessage/message-widgets/ErrorFixCard.js +194 -0
- package/lib/components/InboxMessage/message-widgets/ErrorFixCard.js.map +1 -0
- package/lib/components/InboxMessage/message-widgets/ModernMessageGroup.d.ts +5 -1
- package/lib/components/InboxMessage/message-widgets/ModernMessageGroup.d.ts.map +1 -1
- package/lib/components/InboxMessage/message-widgets/ModernMessageGroup.js +308 -857
- package/lib/components/InboxMessage/message-widgets/ModernMessageGroup.js.map +1 -1
- package/lib/components/ModelConfigPanel.d.ts +12 -0
- package/lib/components/ModelConfigPanel.d.ts.map +1 -0
- package/lib/components/ModelConfigPanel.js +304 -0
- package/lib/components/ModelConfigPanel.js.map +1 -0
- package/lib/components/filler-components/RightSiderBar.d.ts +24 -0
- package/lib/components/filler-components/RightSiderBar.d.ts.map +1 -0
- package/lib/components/filler-components/RightSiderBar.js +335 -0
- package/lib/components/filler-components/RightSiderBar.js.map +1 -0
- package/lib/components/index.d.ts +4 -2
- package/lib/components/index.d.ts.map +1 -1
- package/lib/components/live-code-editor/hybrid-live-editor.d.ts +20 -0
- package/lib/components/live-code-editor/hybrid-live-editor.d.ts.map +1 -0
- package/lib/components/live-code-editor/hybrid-live-editor.js +68 -0
- package/lib/components/live-code-editor/hybrid-live-editor.js.map +1 -0
- package/lib/components/live-code-editor/index.d.ts +4 -0
- package/lib/components/live-code-editor/index.d.ts.map +1 -0
- package/lib/components/live-code-editor/live-code-editor.d.ts +14 -0
- package/lib/components/live-code-editor/live-code-editor.d.ts.map +1 -0
- package/lib/components/live-code-editor/live-code-editor.js +207 -0
- package/lib/components/live-code-editor/live-code-editor.js.map +1 -0
- package/lib/components/slot-fill/chat-message-filler.js +1 -1
- package/lib/components/slot-fill/chat-message-filler.js.map +1 -1
- package/lib/components/slot-fill/index.d.ts +1 -0
- package/lib/components/slot-fill/index.d.ts.map +1 -1
- package/lib/components/slot-fill/right-sidebar-filler.d.ts +4 -0
- package/lib/components/slot-fill/right-sidebar-filler.d.ts.map +1 -0
- package/lib/components/slot-fill/right-sidebar-filler.js +13 -0
- package/lib/components/slot-fill/right-sidebar-filler.js.map +1 -0
- package/lib/components/ui/button.d.ts +9 -0
- package/lib/components/ui/button.d.ts.map +1 -0
- package/lib/compute.js +1 -2
- package/lib/container/AiInbox.d.ts.map +1 -1
- package/lib/container/AiLandingInput.d.ts.map +1 -1
- package/lib/container/AiLandingInput.js +46 -119
- package/lib/container/AiLandingInput.js.map +1 -1
- package/lib/container/Inbox.js +1 -1
- package/lib/container/Inbox.js.map +1 -1
- package/lib/container/InboxAiMessagesLoader.d.ts +0 -21
- package/lib/container/InboxAiMessagesLoader.d.ts.map +1 -1
- package/lib/container/InboxAiMessagesLoader.js +18 -35
- package/lib/container/InboxAiMessagesLoader.js.map +1 -1
- package/lib/container/ServiceInbox.js +1 -1
- package/lib/container/ServiceInbox.js.map +1 -1
- package/lib/container/ThreadMessages.js +1 -1
- package/lib/container/ThreadMessages.js.map +1 -1
- package/lib/container/ThreadMessagesInbox.js +1 -1
- package/lib/container/ThreadMessagesInbox.js.map +1 -1
- package/lib/container/Threads.js +1 -1
- package/lib/container/Threads.js.map +1 -1
- package/lib/container/index.d.ts +5 -4
- package/lib/container/index.d.ts.map +1 -1
- package/lib/enums/messenger-slot-fill-name-enum.d.ts +2 -1
- package/lib/enums/messenger-slot-fill-name-enum.d.ts.map +1 -1
- package/lib/enums/messenger-slot-fill-name-enum.js +1 -0
- package/lib/enums/messenger-slot-fill-name-enum.js.map +1 -1
- package/lib/hooks/index.d.ts +3 -0
- package/lib/hooks/index.d.ts.map +1 -0
- package/lib/hooks/use-file-sync.d.ts +16 -0
- package/lib/hooks/use-file-sync.d.ts.map +1 -0
- package/lib/hooks/use-file-sync.js +63 -0
- package/lib/hooks/use-file-sync.js.map +1 -0
- package/lib/hooks/usePersistentModelConfig.d.ts +15 -0
- package/lib/hooks/usePersistentModelConfig.d.ts.map +1 -0
- package/lib/hooks/usePersistentModelConfig.js +46 -0
- package/lib/hooks/usePersistentModelConfig.js.map +1 -0
- package/lib/index.d.ts +5 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/machines/aiAgentMachine.d.ts.map +1 -1
- package/lib/machines/aiAgentMachine.js +64 -21
- package/lib/machines/aiAgentMachine.js.map +1 -1
- package/lib/machines/aiAgentMachine.simple.d.ts +3 -0
- package/lib/machines/aiAgentMachine.simple.d.ts.map +1 -0
- package/lib/machines/aiAgentMachine.simple.js +108 -0
- package/lib/machines/aiAgentMachine.simple.js.map +1 -0
- package/lib/machines/index.d.ts +3 -0
- package/lib/machines/index.d.ts.map +1 -0
- package/lib/module.d.ts +2 -1
- package/lib/module.d.ts.map +1 -1
- package/lib/module.js +11 -3
- package/lib/module.js.map +1 -1
- package/lib/routes.json +1 -2
- package/lib/templates/InboxWithAi.d.ts.map +1 -1
- package/lib/templates/InboxWithAi.js +129 -70
- package/lib/templates/InboxWithAi.js.map +1 -1
- package/lib/templates/InboxWithAi.tsx +151 -90
- package/lib/templates/index.d.ts +2 -0
- package/lib/templates/index.d.ts.map +1 -0
- package/lib/templates/index.ts +1 -0
- package/lib/utils/utils.d.ts +2 -0
- package/lib/utils/utils.d.ts.map +1 -0
- package/lib/utils/utils.js +3 -0
- package/lib/utils/utils.js.map +1 -0
- package/package.json +8 -5
- package/src/components/AIAgent/AIAgent.tsx +469 -731
- package/src/components/AIAgent/AIAgent.tsx.bk +1365 -0
- package/src/components/InboxMessage/InputComponent.tsx +2 -1
- package/src/components/InboxMessage/RightSidebarAi.tsx +37 -0
- package/src/components/InboxMessage/index.ts +1 -0
- package/src/components/InboxMessage/message-widgets/ErrorFixCard.tsx +240 -0
- package/src/components/InboxMessage/message-widgets/ModernMessageGroup.tsx +337 -1116
- package/src/components/ModelConfigPanel.tsx +334 -0
- package/src/components/filler-components/RightSiderBar.tsx +408 -0
- package/src/components/index.ts +4 -1
- package/src/components/live-code-editor/hybrid-live-editor.tsx +105 -0
- package/src/components/live-code-editor/index.ts +3 -0
- package/src/components/live-code-editor/live-code-editor.tsx +257 -0
- package/src/components/slot-fill/index.ts +1 -0
- package/src/components/slot-fill/right-sidebar-filler.tsx +39 -0
- package/src/components/ui/button.tsx +32 -0
- package/src/container/AiInbox.tsx +26 -3
- package/src/container/AiLandingInput.tsx +48 -22
- package/src/container/InboxAiMessagesLoader.tsx +17 -41
- package/src/container/index.ts +14 -6
- package/src/enums/messenger-slot-fill-name-enum.ts +1 -0
- package/src/hooks/index.ts +2 -0
- package/src/hooks/use-file-sync.ts +91 -0
- package/src/hooks/usePersistentModelConfig.ts +63 -0
- package/src/index.ts +19 -1
- package/src/machines/aiAgentMachine.simple.ts +89 -0
- package/src/machines/aiAgentMachine.ts +67 -19
- package/src/machines/aiAgentMachine.ts.bk +1296 -0
- package/src/machines/index.ts +2 -0
- package/src/module.tsx +10 -1
- package/src/templates/InboxWithAi.tsx +151 -90
- package/src/templates/index.ts +1 -0
- package/src/utils/utils.ts +3 -0
- package/lib/components/InboxMessage/MessageInputComponent.js +0 -173
- package/lib/components/InboxMessage/MessageInputComponent.js.map +0 -1
- package/lib/components/InboxMessage/MessagesBuilderUi.js +0 -162
- package/lib/components/InboxMessage/MessagesBuilderUi.js.map +0 -1
- package/lib/container/AiInbox.js +0 -1520
- package/lib/container/AiInbox.js.map +0 -1
- package/lib/container/AiInboxWithLoader.js +0 -300
- package/lib/container/AiInboxWithLoader.js.map +0 -1
- package/lib/container/InboxTemplate1.js +0 -1375
- package/lib/container/InboxTemplate1.js.map +0 -1
- package/lib/container/InboxTemplate2.js +0 -1426
- package/lib/container/InboxTemplate2.js.map +0 -1
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
import React, { useCallback, useMemo, useRef, useState, useEffect } from 'react';
|
|
2
|
+
import { ModelConfig } from '../hooks/usePersistentModelConfig';
|
|
3
|
+
|
|
4
|
+
interface ModelConfigPanelProps {
|
|
5
|
+
config: ModelConfig;
|
|
6
|
+
onConfigChange: (config: ModelConfig) => void;
|
|
7
|
+
isVisible: boolean;
|
|
8
|
+
onToggleVisibility: () => void;
|
|
9
|
+
showTemplate?: boolean;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const providerIcons: Record<ModelConfig['provider'], string> = {
|
|
13
|
+
openai: '🤖',
|
|
14
|
+
anthropic: '🧠',
|
|
15
|
+
gemini: '✨',
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
const templateOptions = [
|
|
19
|
+
{
|
|
20
|
+
value: 'vite-react' as const,
|
|
21
|
+
label: 'Vite React',
|
|
22
|
+
icon: '⚡',
|
|
23
|
+
description: 'Vite + React 18 with Visual Editor',
|
|
24
|
+
},
|
|
25
|
+
{ value: 'nextjs' as const, label: 'Next.js', icon: '⚛️', description: 'React + Next.js 15 with Shadcn UI' },
|
|
26
|
+
{ value: 'vue' as const, label: 'Vue.js', icon: '🟢', description: 'Vue 3 + Nuxt 3 with Tailwind CSS' },
|
|
27
|
+
];
|
|
28
|
+
|
|
29
|
+
const templateDetails = {
|
|
30
|
+
nextjs: { name: 'Next.js', icon: '⚛️' },
|
|
31
|
+
vue: { name: 'Vue.js', icon: '🟢' },
|
|
32
|
+
'vite-react': { name: 'Vite React', icon: '⚡' },
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const modelOptions: Record<ModelConfig['provider'], { value: string; label: string; description: string }[]> = {
|
|
36
|
+
openai: [
|
|
37
|
+
{ value: 'gpt-4o', label: 'GPT-4o', description: 'Latest multimodal model' },
|
|
38
|
+
{ value: 'gpt-4o-mini', label: 'GPT-4o mini', description: 'Fast and efficient' },
|
|
39
|
+
{ value: 'gpt-4-turbo', label: 'GPT-4 Turbo', description: 'Enhanced GPT-4' },
|
|
40
|
+
{ value: 'gpt-4', label: 'GPT-4', description: 'Most capable model' },
|
|
41
|
+
{ value: 'o1', label: 'o1', description: 'Reasoning model' },
|
|
42
|
+
{ value: 'o1-mini', label: 'o1-mini', description: 'Faster reasoning' },
|
|
43
|
+
],
|
|
44
|
+
anthropic: [
|
|
45
|
+
{ value: 'claude-3-5-sonnet-20241022', label: 'Claude 3.5 Sonnet', description: 'Most intelligent model' },
|
|
46
|
+
{ value: 'claude-3-5-haiku-20241022', label: 'Claude 3.5 Haiku', description: 'Fast and accurate' },
|
|
47
|
+
{ value: 'claude-3-opus-20240229', label: 'Claude 3 Opus', description: 'Powerful reasoning' },
|
|
48
|
+
{ value: 'claude-3-sonnet-20240229', label: 'Claude 3 Sonnet', description: 'Balanced performance' },
|
|
49
|
+
{ value: 'claude-3-haiku-20240307', label: 'Claude 3 Haiku', description: 'Quick responses' },
|
|
50
|
+
],
|
|
51
|
+
gemini: [
|
|
52
|
+
{
|
|
53
|
+
value: 'gemini-2.5-flash-preview-05-20',
|
|
54
|
+
label: 'Gemini 2.5 Flash Preview 05-20',
|
|
55
|
+
description: 'Latest preview model',
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
value: 'gemini-2.5-pro-preview-05-06',
|
|
59
|
+
label: 'Gemini 2.5 Pro Preview 05-06',
|
|
60
|
+
description: 'Advanced reasoning',
|
|
61
|
+
},
|
|
62
|
+
{ value: 'gemini-2.0-flash', label: 'Gemini 2.0 Flash', description: 'Fast generation' },
|
|
63
|
+
{ value: 'gemini-2.0-flash-lite', label: 'Gemini 2.0 Flash Lite', description: 'Lightweight version' },
|
|
64
|
+
{ value: 'gemini-1.5-pro', label: 'Gemini 1.5 Pro', description: 'Most capable' },
|
|
65
|
+
{ value: 'gemini-1.5-flash', label: 'Gemini 1.5 Flash', description: 'Fast and efficient' },
|
|
66
|
+
],
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
const providerDetails = {
|
|
70
|
+
openai: { name: 'OpenAI' },
|
|
71
|
+
anthropic: { name: 'Anthropic' },
|
|
72
|
+
gemini: { name: 'Google Vertex AI' },
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
export const ModelConfigPanel: React.FC<ModelConfigPanelProps> = ({
|
|
76
|
+
config,
|
|
77
|
+
onConfigChange,
|
|
78
|
+
isVisible,
|
|
79
|
+
onToggleVisibility,
|
|
80
|
+
showTemplate = true,
|
|
81
|
+
}) => {
|
|
82
|
+
const [showApiKey, setShowApiKey] = useState(false);
|
|
83
|
+
const [showModelDropdown, setShowModelDropdown] = useState(false);
|
|
84
|
+
const [showApiKeyDropdown, setShowApiKeyDropdown] = useState(false);
|
|
85
|
+
const [showTemplateDropdown, setShowTemplateDropdown] = useState(false);
|
|
86
|
+
const modelDropdownRef = useRef<HTMLDivElement>(null);
|
|
87
|
+
const apiKeyDropdownRef = useRef<HTMLDivElement>(null);
|
|
88
|
+
const templateDropdownRef = useRef<HTMLDivElement>(null);
|
|
89
|
+
|
|
90
|
+
useEffect(() => {
|
|
91
|
+
const handleClickOutside = (event: MouseEvent) => {
|
|
92
|
+
if (modelDropdownRef.current && !modelDropdownRef.current.contains(event.target as Node)) {
|
|
93
|
+
setShowModelDropdown(false);
|
|
94
|
+
}
|
|
95
|
+
if (apiKeyDropdownRef.current && !apiKeyDropdownRef.current.contains(event.target as Node)) {
|
|
96
|
+
setShowApiKeyDropdown(false);
|
|
97
|
+
}
|
|
98
|
+
if (templateDropdownRef.current && !templateDropdownRef.current.contains(event.target as Node)) {
|
|
99
|
+
setShowTemplateDropdown(false);
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
document.addEventListener('mousedown', handleClickOutside);
|
|
103
|
+
return () => document.removeEventListener('mousedown', handleClickOutside);
|
|
104
|
+
}, []);
|
|
105
|
+
|
|
106
|
+
const handleProviderChange = useCallback(
|
|
107
|
+
(provider: ModelConfig['provider']) => {
|
|
108
|
+
const defaultModel = modelOptions[provider][0].value;
|
|
109
|
+
onConfigChange({ ...config, provider, model: defaultModel });
|
|
110
|
+
},
|
|
111
|
+
[config, onConfigChange],
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
const handleModelChange = useCallback(
|
|
115
|
+
(model: string) => {
|
|
116
|
+
onConfigChange({ ...config, model });
|
|
117
|
+
},
|
|
118
|
+
[config, onConfigChange],
|
|
119
|
+
);
|
|
120
|
+
|
|
121
|
+
const handleApiKeyChange = useCallback(
|
|
122
|
+
(e: React.ChangeEvent<HTMLInputElement>) => {
|
|
123
|
+
onConfigChange({ ...config, apiKey: e.target.value });
|
|
124
|
+
},
|
|
125
|
+
[config, onConfigChange],
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
const handleTemplateChange = useCallback(
|
|
129
|
+
(template: ModelConfig['template']) => {
|
|
130
|
+
onConfigChange({ ...config, template });
|
|
131
|
+
},
|
|
132
|
+
[config, onConfigChange],
|
|
133
|
+
);
|
|
134
|
+
|
|
135
|
+
const getApiKeyPlaceholder = () => {
|
|
136
|
+
switch (config.provider) {
|
|
137
|
+
case 'openai':
|
|
138
|
+
return 'sk-...';
|
|
139
|
+
case 'anthropic':
|
|
140
|
+
return 'sk-ant-...';
|
|
141
|
+
case 'gemini':
|
|
142
|
+
return 'AI...';
|
|
143
|
+
default:
|
|
144
|
+
return 'Enter API key';
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
const currentModels = modelOptions[config.provider] || [];
|
|
149
|
+
const currentModel = currentModels.find((m) => m.value === config.model);
|
|
150
|
+
const currentTemplate = templateOptions.find((t) => t.value === config.template);
|
|
151
|
+
|
|
152
|
+
return (
|
|
153
|
+
<div className="relative">
|
|
154
|
+
{/* <div className="flex items-center gap-2 mb-2">
|
|
155
|
+
<button
|
|
156
|
+
type="button"
|
|
157
|
+
className="px-2 py-1 text-xs rounded border border-gray-300 bg-white hover:bg-gray-50"
|
|
158
|
+
onClick={onToggleVisibility}
|
|
159
|
+
>
|
|
160
|
+
{isVisible ? 'Hide' : 'Show'} Config
|
|
161
|
+
</button>
|
|
162
|
+
{!config.apiKey && <span className="text-xs text-amber-600">API key required</span>}
|
|
163
|
+
</div> */}
|
|
164
|
+
|
|
165
|
+
{isVisible && (
|
|
166
|
+
<div className="py-2 bg-gray-50 rounded-lg grid grid-cols-1 md:grid-cols-3 gap-2">
|
|
167
|
+
{showTemplate && (
|
|
168
|
+
<div className="space-y-1 md:col-span-1">
|
|
169
|
+
{/* <label className="block text-xs text-gray-600">Template</label> */}
|
|
170
|
+
<div className="relative" ref={templateDropdownRef}>
|
|
171
|
+
<input
|
|
172
|
+
type="text"
|
|
173
|
+
readOnly
|
|
174
|
+
value={`${currentTemplate?.icon || '🔧'} ${
|
|
175
|
+
currentTemplate?.label || 'Select Template'
|
|
176
|
+
}`}
|
|
177
|
+
onClick={() => setShowTemplateDropdown(!showTemplateDropdown)}
|
|
178
|
+
className="w-full px-2 py-1 border border-gray-300 rounded cursor-pointer"
|
|
179
|
+
/>
|
|
180
|
+
<span className="absolute right-2 top-1/2 -translate-y-1/2 text-gray-400 text-xs pointer-events-none">
|
|
181
|
+
▼
|
|
182
|
+
</span>
|
|
183
|
+
{showTemplateDropdown && (
|
|
184
|
+
<div className="absolute z-10 mt-1 w-full bg-white border border-gray-300 rounded shadow">
|
|
185
|
+
{templateOptions.map((template) => (
|
|
186
|
+
<button
|
|
187
|
+
key={template.value}
|
|
188
|
+
type="button"
|
|
189
|
+
onClick={() => {
|
|
190
|
+
handleTemplateChange(template.value);
|
|
191
|
+
setShowTemplateDropdown(false);
|
|
192
|
+
}}
|
|
193
|
+
className={`w-full text-left px-3 py-2 hover:bg-gray-50 ${
|
|
194
|
+
config.template === template.value ? 'bg-blue-50' : ''
|
|
195
|
+
}`}
|
|
196
|
+
>
|
|
197
|
+
<span className="mr-2">{template.icon}</span>
|
|
198
|
+
<span className="text-sm">{template.label}</span>
|
|
199
|
+
</button>
|
|
200
|
+
))}
|
|
201
|
+
</div>
|
|
202
|
+
)}
|
|
203
|
+
</div>
|
|
204
|
+
</div>
|
|
205
|
+
)}
|
|
206
|
+
|
|
207
|
+
<div className="space-y-1 md:col-span-1">
|
|
208
|
+
{/* <label className="block text-xs text-gray-600">Model</label> */}
|
|
209
|
+
<div className="relative" ref={modelDropdownRef}>
|
|
210
|
+
<input
|
|
211
|
+
type="text"
|
|
212
|
+
readOnly
|
|
213
|
+
value={`${providerIcons[config.provider]} ${currentModel?.label || 'Select Model'}`}
|
|
214
|
+
onClick={() => setShowModelDropdown(!showModelDropdown)}
|
|
215
|
+
className="w-full px-2 py-1 border border-gray-300 rounded cursor-pointer"
|
|
216
|
+
/>
|
|
217
|
+
<span className="absolute right-2 top-1/2 -translate-y-1/2 text-gray-400 text-xs pointer-events-none">
|
|
218
|
+
▼
|
|
219
|
+
</span>
|
|
220
|
+
{showModelDropdown && (
|
|
221
|
+
<div className="absolute z-10 mt-1 w-full bg-white border border-gray-300 rounded shadow max-h-60 overflow-y-auto">
|
|
222
|
+
{currentModels.map((model) => (
|
|
223
|
+
<button
|
|
224
|
+
key={model.value}
|
|
225
|
+
type="button"
|
|
226
|
+
onClick={() => {
|
|
227
|
+
handleModelChange(model.value);
|
|
228
|
+
setShowModelDropdown(false);
|
|
229
|
+
}}
|
|
230
|
+
className={`w-full text-left px-3 py-2 hover:bg-gray-50 ${
|
|
231
|
+
config.model === model.value ? 'bg-blue-50' : ''
|
|
232
|
+
}`}
|
|
233
|
+
>
|
|
234
|
+
<span className="mr-2">{providerIcons[config.provider]}</span>
|
|
235
|
+
<span className="text-sm">{model.label}</span>
|
|
236
|
+
</button>
|
|
237
|
+
))}
|
|
238
|
+
<div className="p-2 border-t border-gray-100 flex gap-2">
|
|
239
|
+
{Object.keys(providerDetails).map((p) => (
|
|
240
|
+
<button
|
|
241
|
+
key={p}
|
|
242
|
+
type="button"
|
|
243
|
+
onClick={() => handleProviderChange(p as ModelConfig['provider'])}
|
|
244
|
+
className={`px-2 py-1 text-xs rounded ${
|
|
245
|
+
config.provider === p ? 'bg-blue-500 text-white' : 'bg-white border'
|
|
246
|
+
}`}
|
|
247
|
+
>
|
|
248
|
+
{providerDetails[p as ModelConfig['provider']].name}
|
|
249
|
+
</button>
|
|
250
|
+
))}
|
|
251
|
+
</div>
|
|
252
|
+
</div>
|
|
253
|
+
)}
|
|
254
|
+
</div>
|
|
255
|
+
</div>
|
|
256
|
+
|
|
257
|
+
<div className="space-y-1 md:col-span-1">
|
|
258
|
+
{/* <label className="block text-xs text-gray-600">API Key</label> */}
|
|
259
|
+
<div className="relative" ref={apiKeyDropdownRef}>
|
|
260
|
+
<input
|
|
261
|
+
type="text"
|
|
262
|
+
readOnly
|
|
263
|
+
value={config.apiKey ? 'API Key ••••••••••••••••' : 'API Key'}
|
|
264
|
+
onClick={() => setShowApiKeyDropdown(!showApiKeyDropdown)}
|
|
265
|
+
className="w-full px-2 py-1 border border-gray-300 rounded cursor-pointer"
|
|
266
|
+
/>
|
|
267
|
+
<span className="absolute right-2 top-1/2 -translate-y-1/2 text-gray-400 text-xs pointer-events-none">
|
|
268
|
+
▼
|
|
269
|
+
</span>
|
|
270
|
+
{showApiKeyDropdown && (
|
|
271
|
+
<div className="absolute right-0 z-10 mt-1 w-80 bg-white border border-gray-300 rounded shadow">
|
|
272
|
+
<div className="p-3">
|
|
273
|
+
<div className="mb-2">
|
|
274
|
+
<label className="block text-xs text-gray-600 mb-1">API Key</label>
|
|
275
|
+
<div className="relative">
|
|
276
|
+
<input
|
|
277
|
+
type={showApiKey ? 'text' : 'password'}
|
|
278
|
+
value={config.apiKey}
|
|
279
|
+
onChange={handleApiKeyChange}
|
|
280
|
+
placeholder={getApiKeyPlaceholder()}
|
|
281
|
+
className="w-full px-2 py-1 border border-gray-300 rounded pr-8"
|
|
282
|
+
/>
|
|
283
|
+
<button
|
|
284
|
+
type="button"
|
|
285
|
+
onClick={() => setShowApiKey(!showApiKey)}
|
|
286
|
+
className="absolute right-2 top-1/2 -translate-y-1/2 text-gray-400"
|
|
287
|
+
>
|
|
288
|
+
{showApiKey ? 'Hide' : 'Show'}
|
|
289
|
+
</button>
|
|
290
|
+
</div>
|
|
291
|
+
</div>
|
|
292
|
+
<div>
|
|
293
|
+
<h4 className="text-xs font-medium text-gray-700 mb-1">Parameters</h4>
|
|
294
|
+
<div className="space-y-1 text-xs text-gray-600">
|
|
295
|
+
<div className="flex justify-between">
|
|
296
|
+
<span>Output tokens</span>
|
|
297
|
+
<span className="bg-gray-100 px-2 rounded">Auto</span>
|
|
298
|
+
</div>
|
|
299
|
+
<div className="flex justify-between">
|
|
300
|
+
<span>Temperature</span>
|
|
301
|
+
<span className="bg-gray-100 px-2 rounded">Auto</span>
|
|
302
|
+
</div>
|
|
303
|
+
<div className="flex justify-between">
|
|
304
|
+
<span>Top P</span>
|
|
305
|
+
<span className="bg-gray-100 px-2 rounded">Auto</span>
|
|
306
|
+
</div>
|
|
307
|
+
<div className="flex justify-between">
|
|
308
|
+
<span>Top K</span>
|
|
309
|
+
<span className="bg-gray-100 px-2 rounded">Auto</span>
|
|
310
|
+
</div>
|
|
311
|
+
<div className="flex justify-between">
|
|
312
|
+
<span>Frequency penalty</span>
|
|
313
|
+
<span className="bg-gray-100 px-2 rounded">Auto</span>
|
|
314
|
+
</div>
|
|
315
|
+
<div className="flex justify-between">
|
|
316
|
+
<span>Presence penalty</span>
|
|
317
|
+
<span className="bg-gray-100 px-2 rounded">Auto</span>
|
|
318
|
+
</div>
|
|
319
|
+
</div>
|
|
320
|
+
</div>
|
|
321
|
+
</div>
|
|
322
|
+
</div>
|
|
323
|
+
)}
|
|
324
|
+
</div>
|
|
325
|
+
</div>
|
|
326
|
+
</div>
|
|
327
|
+
)}
|
|
328
|
+
</div>
|
|
329
|
+
);
|
|
330
|
+
};
|
|
331
|
+
|
|
332
|
+
ModelConfigPanel.displayName = 'ModelConfigPanel';
|
|
333
|
+
|
|
334
|
+
export default ModelConfigPanel;
|