1
1
import React , { useState } from 'react' ;
2
- import { ChevronRight , Save , AlertCircle } from 'lucide-react' ;
3
- import { ProviderSettings } from '../../services /settings-service ' ;
2
+ import { ChevronRight , Save , AlertCircle , Plus } from 'lucide-react' ;
3
+ import { ProviderSettings } from '../../types /settings' ;
4
4
import { AIProvider } from '../../types/ai-providers' ;
5
5
6
-
7
6
interface ApiManagementProps {
8
7
selectedProvider : AIProvider ;
9
8
providerSettings : Record < string , ProviderSettings > ;
@@ -27,22 +26,21 @@ export const ApiManagement: React.FC<ApiManagementProps> = ({
27
26
saveStatus,
28
27
onSaveSettings,
29
28
} ) => {
30
- const [ showApiKey , setShowApiKey ] = useState ( false ) ;
31
29
30
+ const [ showApiKey , setShowApiKey ] = useState ( false ) ;
31
+
32
32
// Get current provider settings
33
33
const currentProviderSettings = providerSettings [ selectedProvider ] || { apiKey : '' } ;
34
34
35
- const providers : AIProvider [ ] = [
36
- 'TensorBlock' ,
37
- 'OpenAI' ,
38
- 'Anthropic' ,
39
- 'Gemini' ,
40
- 'Fireworks.ai' ,
41
- 'Together.ai' ,
42
- 'OpenRouter' ,
43
- 'Custom'
44
- ] ;
45
-
35
+ const handleMapProviderSettings = ( ) => {
36
+ const providers = Object . keys ( providerSettings ) . map ( ( provider ) => {
37
+ providerSettings [ provider ] . providerName = provider ;
38
+ return providerSettings [ provider ] ;
39
+ } ) ;
40
+
41
+ return providers ;
42
+ }
43
+
46
44
return (
47
45
< div className = "flex flex-col h-full" >
48
46
< div className = "flex items-center justify-between mb-4" >
@@ -65,28 +63,35 @@ export const ApiManagement: React.FC<ApiManagementProps> = ({
65
63
66
64
< div className = "flex flex-1" >
67
65
{ /* Provider Selection */ }
68
- < div className = "w-1/3 pr-6 border-r border-gray-200" >
66
+ < div className = "relative w-1/3 pr-6 border-r border-gray-200" >
69
67
< h3 className = "mb-4 text-lg font-medium" > AI Service Providers</ h3 >
70
68
< p className = "mb-4 text-sm text-gray-600" >
71
69
Select an AI service provider to configure its API settings.
72
70
</ p >
73
71
74
72
< div className = "space-y-2" >
75
- { providers . map ( ( provider ) => (
73
+ { handleMapProviderSettings ( ) . map ( ( provider ) => (
76
74
< button
77
- key = { provider }
75
+ key = { provider . providerName }
78
76
className = { `flex items-center justify-between w-full px-4 py-3 text-left rounded-lg ${
79
- selectedProvider === provider
77
+ selectedProvider === provider . providerName
80
78
? 'bg-blue-50 text-blue-600 border border-blue-200'
81
79
: 'bg-white border border-gray-200 hover:bg-gray-50'
82
80
} `}
83
- onClick = { ( ) => onProviderChange ( provider ) }
81
+ onClick = { ( ) => onProviderChange ( provider . providerName as AIProvider ) }
84
82
>
85
- < span > { provider } </ span >
86
- { selectedProvider === provider && < ChevronRight size = { 16 } /> }
83
+ < span > { provider . providerName } </ span >
84
+ { selectedProvider === provider . providerName && < ChevronRight size = { 16 } /> }
87
85
</ button >
88
86
) ) }
89
87
</ div >
88
+
89
+ < div className = "absolute w-[calc(100%-1.5rem)] bottom-2" >
90
+ < button className = "flex items-center w-full px-4 py-2 text-gray-600 bg-white border border-gray-300 rounded-lg hover:text-gray-800" >
91
+ < Plus size = { 16 } className = "mr-2 text-base" />
92
+ < span > Add Custom Provider</ span >
93
+ </ button >
94
+ </ div >
90
95
</ div >
91
96
92
97
{ /* Provider Settings */ }
@@ -127,22 +132,6 @@ export const ApiManagement: React.FC<ApiManagementProps> = ({
127
132
</ p >
128
133
</ div >
129
134
130
- { /* OpenAI-specific settings */ }
131
- { /* {selectedProvider === 'OpenAI' && (
132
- <div>
133
- <label className="block mb-2 text-sm font-medium text-gray-700">
134
- Organization ID (optional)
135
- </label>
136
- <input
137
- type="text"
138
- value={currentProviderSettings.organizationId || ''}
139
- onChange={(e) => onOrgIdChange(e.target.value)}
140
- placeholder="org-..."
141
- className="w-full p-3 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500"
142
- />
143
- </div>
144
- )} */ }
145
-
146
135
{ /* Anthropic-specific settings */ }
147
136
{ selectedProvider === 'Anthropic' && (
148
137
< div >
@@ -160,63 +149,24 @@ export const ApiManagement: React.FC<ApiManagementProps> = ({
160
149
</ div >
161
150
) }
162
151
163
- { /* Gemini-specific settings */ }
164
- { /* { selectedProvider === 'Gemini ' && (
152
+ { /* Custom provider settings */ }
153
+ { selectedProvider === 'Custom ' && (
165
154
< >
166
155
< div >
167
156
< label className = "block mb-2 text-sm font-medium text-gray-700" >
168
- Base URL
157
+ Provider Name
169
158
</ label >
170
159
< input
171
160
type = "text"
172
- value={currentProviderSettings.baseUrl || 'https://generativelanguage.googleapis.com '}
161
+ value = { currentProviderSettings . providerName || '' }
173
162
onChange = { ( e ) => onBaseUrlChange && onBaseUrlChange ( e . target . value ) }
174
- placeholder="https://generativelanguage.googleapis.com"
175
- className="w-full p-3 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500"
176
- />
177
- </div>
178
- <div>
179
- <label className="block mb-2 text-sm font-medium text-gray-700">
180
- API Version
181
- </label>
182
- <input
183
- type="text"
184
- value={currentProviderSettings.apiVersion || 'v1'}
185
- onChange={(e) => onApiVersionChange(e.target.value)}
186
- placeholder="v1"
163
+ placeholder = "Custom Provider Name"
187
164
className = "w-full p-3 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500"
188
165
/>
166
+ < p className = "mt-2 text-xs text-gray-500" >
167
+ The name of your custom provider
168
+ </ p >
189
169
</ div >
190
- </>
191
- )} */ }
192
-
193
- { /* Base URL setting for providers that need it */ }
194
- { /* {(selectedProvider === 'Fireworks.ai' ||
195
- selectedProvider === 'Together' ||
196
- selectedProvider === 'OpenRouter') && (
197
- <div>
198
- <label className="block mb-2 text-sm font-medium text-gray-700">
199
- Base URL
200
- </label>
201
- <input
202
- type="text"
203
- value={currentProviderSettings.baseUrl || ''}
204
- onChange={(e) => onBaseUrlChange && onBaseUrlChange(e.target.value)}
205
- placeholder={
206
- selectedProvider === 'Fireworks.ai'
207
- ? 'https://api.fireworks.ai/inference/v1'
208
- : selectedProvider === 'Together'
209
- ? 'https://api.together.xyz/v1'
210
- : 'https://openrouter.ai/api/v1'
211
- }
212
- className="w-full p-3 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500"
213
- />
214
- </div>
215
- )} */ }
216
-
217
- { /* Custom provider settings */ }
218
- { selectedProvider === 'Custom' && (
219
- < >
220
170
< div >
221
171
< label className = "block mb-2 text-sm font-medium text-gray-700" >
222
172
Base URL
@@ -236,20 +186,7 @@ export const ApiManagement: React.FC<ApiManagementProps> = ({
236
186
< div className = "pt-6 mt-6 border-t border-gray-200" >
237
187
< h4 className = "mb-4 font-medium text-md" > API Endpoints</ h4 >
238
188
239
- < div className = "space-y-4" >
240
- < div >
241
- < label className = "block mb-2 text-sm font-medium text-gray-700" >
242
- Completions Endpoint
243
- </ label >
244
- < input
245
- type = "text"
246
- value = { currentProviderSettings . completionsEndpoint || '/completions' }
247
- onChange = { ( e ) => onEndpointChange && onEndpointChange ( 'completionsEndpoint' , e . target . value ) }
248
- placeholder = "/completions"
249
- className = "w-full p-3 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500"
250
- />
251
- </ div >
252
-
189
+ < div className = "space-y-4" >
253
190
< div >
254
191
< label className = "block mb-2 text-sm font-medium text-gray-700" >
255
192
Chat Completions Endpoint
0 commit comments