@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.
Files changed (161) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/lib/components/AIAgent/AIAgent.d.ts +7 -0
  3. package/lib/components/AIAgent/AIAgent.d.ts.map +1 -1
  4. package/lib/components/AIAgent/AIAgent.js +362 -615
  5. package/lib/components/AIAgent/AIAgent.js.map +1 -1
  6. package/lib/components/InboxMessage/InputComponent.d.ts.map +1 -1
  7. package/lib/components/InboxMessage/InputComponent.js +143 -140
  8. package/lib/components/InboxMessage/InputComponent.js.map +1 -1
  9. package/lib/components/InboxMessage/RightSidebarAi.d.ts +23 -0
  10. package/lib/components/InboxMessage/RightSidebarAi.d.ts.map +1 -0
  11. package/lib/components/InboxMessage/RightSidebarAi.js +9 -0
  12. package/lib/components/InboxMessage/RightSidebarAi.js.map +1 -0
  13. package/lib/components/InboxMessage/index.d.ts +1 -0
  14. package/lib/components/InboxMessage/index.d.ts.map +1 -1
  15. package/lib/components/InboxMessage/message-widgets/ErrorFixCard.d.ts +11 -0
  16. package/lib/components/InboxMessage/message-widgets/ErrorFixCard.d.ts.map +1 -0
  17. package/lib/components/InboxMessage/message-widgets/ErrorFixCard.js +194 -0
  18. package/lib/components/InboxMessage/message-widgets/ErrorFixCard.js.map +1 -0
  19. package/lib/components/InboxMessage/message-widgets/ModernMessageGroup.d.ts +5 -1
  20. package/lib/components/InboxMessage/message-widgets/ModernMessageGroup.d.ts.map +1 -1
  21. package/lib/components/InboxMessage/message-widgets/ModernMessageGroup.js +308 -857
  22. package/lib/components/InboxMessage/message-widgets/ModernMessageGroup.js.map +1 -1
  23. package/lib/components/ModelConfigPanel.d.ts +12 -0
  24. package/lib/components/ModelConfigPanel.d.ts.map +1 -0
  25. package/lib/components/ModelConfigPanel.js +304 -0
  26. package/lib/components/ModelConfigPanel.js.map +1 -0
  27. package/lib/components/filler-components/RightSiderBar.d.ts +24 -0
  28. package/lib/components/filler-components/RightSiderBar.d.ts.map +1 -0
  29. package/lib/components/filler-components/RightSiderBar.js +335 -0
  30. package/lib/components/filler-components/RightSiderBar.js.map +1 -0
  31. package/lib/components/index.d.ts +4 -2
  32. package/lib/components/index.d.ts.map +1 -1
  33. package/lib/components/live-code-editor/hybrid-live-editor.d.ts +20 -0
  34. package/lib/components/live-code-editor/hybrid-live-editor.d.ts.map +1 -0
  35. package/lib/components/live-code-editor/hybrid-live-editor.js +68 -0
  36. package/lib/components/live-code-editor/hybrid-live-editor.js.map +1 -0
  37. package/lib/components/live-code-editor/index.d.ts +4 -0
  38. package/lib/components/live-code-editor/index.d.ts.map +1 -0
  39. package/lib/components/live-code-editor/live-code-editor.d.ts +14 -0
  40. package/lib/components/live-code-editor/live-code-editor.d.ts.map +1 -0
  41. package/lib/components/live-code-editor/live-code-editor.js +207 -0
  42. package/lib/components/live-code-editor/live-code-editor.js.map +1 -0
  43. package/lib/components/slot-fill/chat-message-filler.js +1 -1
  44. package/lib/components/slot-fill/chat-message-filler.js.map +1 -1
  45. package/lib/components/slot-fill/index.d.ts +1 -0
  46. package/lib/components/slot-fill/index.d.ts.map +1 -1
  47. package/lib/components/slot-fill/right-sidebar-filler.d.ts +4 -0
  48. package/lib/components/slot-fill/right-sidebar-filler.d.ts.map +1 -0
  49. package/lib/components/slot-fill/right-sidebar-filler.js +13 -0
  50. package/lib/components/slot-fill/right-sidebar-filler.js.map +1 -0
  51. package/lib/components/ui/button.d.ts +9 -0
  52. package/lib/components/ui/button.d.ts.map +1 -0
  53. package/lib/compute.js +1 -2
  54. package/lib/container/AiInbox.d.ts.map +1 -1
  55. package/lib/container/AiLandingInput.d.ts.map +1 -1
  56. package/lib/container/AiLandingInput.js +46 -119
  57. package/lib/container/AiLandingInput.js.map +1 -1
  58. package/lib/container/Inbox.js +1 -1
  59. package/lib/container/Inbox.js.map +1 -1
  60. package/lib/container/InboxAiMessagesLoader.d.ts +0 -21
  61. package/lib/container/InboxAiMessagesLoader.d.ts.map +1 -1
  62. package/lib/container/InboxAiMessagesLoader.js +18 -35
  63. package/lib/container/InboxAiMessagesLoader.js.map +1 -1
  64. package/lib/container/ServiceInbox.js +1 -1
  65. package/lib/container/ServiceInbox.js.map +1 -1
  66. package/lib/container/ThreadMessages.js +1 -1
  67. package/lib/container/ThreadMessages.js.map +1 -1
  68. package/lib/container/ThreadMessagesInbox.js +1 -1
  69. package/lib/container/ThreadMessagesInbox.js.map +1 -1
  70. package/lib/container/Threads.js +1 -1
  71. package/lib/container/Threads.js.map +1 -1
  72. package/lib/container/index.d.ts +5 -4
  73. package/lib/container/index.d.ts.map +1 -1
  74. package/lib/enums/messenger-slot-fill-name-enum.d.ts +2 -1
  75. package/lib/enums/messenger-slot-fill-name-enum.d.ts.map +1 -1
  76. package/lib/enums/messenger-slot-fill-name-enum.js +1 -0
  77. package/lib/enums/messenger-slot-fill-name-enum.js.map +1 -1
  78. package/lib/hooks/index.d.ts +3 -0
  79. package/lib/hooks/index.d.ts.map +1 -0
  80. package/lib/hooks/use-file-sync.d.ts +16 -0
  81. package/lib/hooks/use-file-sync.d.ts.map +1 -0
  82. package/lib/hooks/use-file-sync.js +63 -0
  83. package/lib/hooks/use-file-sync.js.map +1 -0
  84. package/lib/hooks/usePersistentModelConfig.d.ts +15 -0
  85. package/lib/hooks/usePersistentModelConfig.d.ts.map +1 -0
  86. package/lib/hooks/usePersistentModelConfig.js +46 -0
  87. package/lib/hooks/usePersistentModelConfig.js.map +1 -0
  88. package/lib/index.d.ts +5 -2
  89. package/lib/index.d.ts.map +1 -1
  90. package/lib/index.js +1 -1
  91. package/lib/machines/aiAgentMachine.d.ts.map +1 -1
  92. package/lib/machines/aiAgentMachine.js +64 -21
  93. package/lib/machines/aiAgentMachine.js.map +1 -1
  94. package/lib/machines/aiAgentMachine.simple.d.ts +3 -0
  95. package/lib/machines/aiAgentMachine.simple.d.ts.map +1 -0
  96. package/lib/machines/aiAgentMachine.simple.js +108 -0
  97. package/lib/machines/aiAgentMachine.simple.js.map +1 -0
  98. package/lib/machines/index.d.ts +3 -0
  99. package/lib/machines/index.d.ts.map +1 -0
  100. package/lib/module.d.ts +2 -1
  101. package/lib/module.d.ts.map +1 -1
  102. package/lib/module.js +11 -3
  103. package/lib/module.js.map +1 -1
  104. package/lib/routes.json +1 -2
  105. package/lib/templates/InboxWithAi.d.ts.map +1 -1
  106. package/lib/templates/InboxWithAi.js +129 -70
  107. package/lib/templates/InboxWithAi.js.map +1 -1
  108. package/lib/templates/InboxWithAi.tsx +151 -90
  109. package/lib/templates/index.d.ts +2 -0
  110. package/lib/templates/index.d.ts.map +1 -0
  111. package/lib/templates/index.ts +1 -0
  112. package/lib/utils/utils.d.ts +2 -0
  113. package/lib/utils/utils.d.ts.map +1 -0
  114. package/lib/utils/utils.js +3 -0
  115. package/lib/utils/utils.js.map +1 -0
  116. package/package.json +8 -5
  117. package/src/components/AIAgent/AIAgent.tsx +469 -731
  118. package/src/components/AIAgent/AIAgent.tsx.bk +1365 -0
  119. package/src/components/InboxMessage/InputComponent.tsx +2 -1
  120. package/src/components/InboxMessage/RightSidebarAi.tsx +37 -0
  121. package/src/components/InboxMessage/index.ts +1 -0
  122. package/src/components/InboxMessage/message-widgets/ErrorFixCard.tsx +240 -0
  123. package/src/components/InboxMessage/message-widgets/ModernMessageGroup.tsx +337 -1116
  124. package/src/components/ModelConfigPanel.tsx +334 -0
  125. package/src/components/filler-components/RightSiderBar.tsx +408 -0
  126. package/src/components/index.ts +4 -1
  127. package/src/components/live-code-editor/hybrid-live-editor.tsx +105 -0
  128. package/src/components/live-code-editor/index.ts +3 -0
  129. package/src/components/live-code-editor/live-code-editor.tsx +257 -0
  130. package/src/components/slot-fill/index.ts +1 -0
  131. package/src/components/slot-fill/right-sidebar-filler.tsx +39 -0
  132. package/src/components/ui/button.tsx +32 -0
  133. package/src/container/AiInbox.tsx +26 -3
  134. package/src/container/AiLandingInput.tsx +48 -22
  135. package/src/container/InboxAiMessagesLoader.tsx +17 -41
  136. package/src/container/index.ts +14 -6
  137. package/src/enums/messenger-slot-fill-name-enum.ts +1 -0
  138. package/src/hooks/index.ts +2 -0
  139. package/src/hooks/use-file-sync.ts +91 -0
  140. package/src/hooks/usePersistentModelConfig.ts +63 -0
  141. package/src/index.ts +19 -1
  142. package/src/machines/aiAgentMachine.simple.ts +89 -0
  143. package/src/machines/aiAgentMachine.ts +67 -19
  144. package/src/machines/aiAgentMachine.ts.bk +1296 -0
  145. package/src/machines/index.ts +2 -0
  146. package/src/module.tsx +10 -1
  147. package/src/templates/InboxWithAi.tsx +151 -90
  148. package/src/templates/index.ts +1 -0
  149. package/src/utils/utils.ts +3 -0
  150. package/lib/components/InboxMessage/MessageInputComponent.js +0 -173
  151. package/lib/components/InboxMessage/MessageInputComponent.js.map +0 -1
  152. package/lib/components/InboxMessage/MessagesBuilderUi.js +0 -162
  153. package/lib/components/InboxMessage/MessagesBuilderUi.js.map +0 -1
  154. package/lib/container/AiInbox.js +0 -1520
  155. package/lib/container/AiInbox.js.map +0 -1
  156. package/lib/container/AiInboxWithLoader.js +0 -300
  157. package/lib/container/AiInboxWithLoader.js.map +0 -1
  158. package/lib/container/InboxTemplate1.js +0 -1375
  159. package/lib/container/InboxTemplate1.js.map +0 -1
  160. package/lib/container/InboxTemplate2.js +0 -1426
  161. 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;