Skip to content

Commit eb9ce5b

Browse files
committed
Fix: Fix local settings
1 parent 00f97d1 commit eb9ce5b

19 files changed

+148
-254
lines changed

src/components/chat/ChatMessageArea.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { MessageHelper } from '../../services/message-helper';
77
import { DatabaseIntegrationService } from '../../services/database-integration';
88
import { SettingsService } from '../../services/settings-service';
99
import { ChatService } from '../../services/chat-service';
10-
import { AIServiceCapability } from '../../services/core/capabilities';
10+
import { AIServiceCapability } from '../../types/capabilities';
1111

1212
interface ChatMessageAreaProps {
1313
activeConversation: Conversation | null;

src/components/settings/ApiManagement.tsx

Lines changed: 36 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
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';
44
import { AIProvider } from '../../types/ai-providers';
55

6-
76
interface ApiManagementProps {
87
selectedProvider: AIProvider;
98
providerSettings: Record<string, ProviderSettings>;
@@ -27,22 +26,21 @@ export const ApiManagement: React.FC<ApiManagementProps> = ({
2726
saveStatus,
2827
onSaveSettings,
2928
}) => {
30-
const [showApiKey, setShowApiKey] = useState(false);
3129

30+
const [showApiKey, setShowApiKey] = useState(false);
31+
3232
// Get current provider settings
3333
const currentProviderSettings = providerSettings[selectedProvider] || { apiKey: '' };
3434

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+
4644
return (
4745
<div className="flex flex-col h-full">
4846
<div className="flex items-center justify-between mb-4">
@@ -65,28 +63,35 @@ export const ApiManagement: React.FC<ApiManagementProps> = ({
6563

6664
<div className="flex flex-1">
6765
{/* 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">
6967
<h3 className="mb-4 text-lg font-medium">AI Service Providers</h3>
7068
<p className="mb-4 text-sm text-gray-600">
7169
Select an AI service provider to configure its API settings.
7270
</p>
7371

7472
<div className="space-y-2">
75-
{providers.map((provider) => (
73+
{handleMapProviderSettings().map((provider) => (
7674
<button
77-
key={provider}
75+
key={provider.providerName}
7876
className={`flex items-center justify-between w-full px-4 py-3 text-left rounded-lg ${
79-
selectedProvider === provider
77+
selectedProvider === provider.providerName
8078
? 'bg-blue-50 text-blue-600 border border-blue-200'
8179
: 'bg-white border border-gray-200 hover:bg-gray-50'
8280
}`}
83-
onClick={() => onProviderChange(provider)}
81+
onClick={() => onProviderChange(provider.providerName as AIProvider)}
8482
>
85-
<span>{provider}</span>
86-
{selectedProvider === provider && <ChevronRight size={16} />}
83+
<span>{provider.providerName}</span>
84+
{selectedProvider === provider.providerName && <ChevronRight size={16} />}
8785
</button>
8886
))}
8987
</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>
9095
</div>
9196

9297
{/* Provider Settings */}
@@ -127,22 +132,6 @@ export const ApiManagement: React.FC<ApiManagementProps> = ({
127132
</p>
128133
</div>
129134

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-
146135
{/* Anthropic-specific settings */}
147136
{selectedProvider === 'Anthropic' && (
148137
<div>
@@ -160,63 +149,24 @@ export const ApiManagement: React.FC<ApiManagementProps> = ({
160149
</div>
161150
)}
162151

163-
{/* Gemini-specific settings */}
164-
{/* {selectedProvider === 'Gemini' && (
152+
{/* Custom provider settings */}
153+
{selectedProvider === 'Custom' && (
165154
<>
166155
<div>
167156
<label className="block mb-2 text-sm font-medium text-gray-700">
168-
Base URL
157+
Provider Name
169158
</label>
170159
<input
171160
type="text"
172-
value={currentProviderSettings.baseUrl || 'https://generativelanguage.googleapis.com'}
161+
value={currentProviderSettings.providerName || ''}
173162
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"
187164
className="w-full p-3 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500"
188165
/>
166+
<p className="mt-2 text-xs text-gray-500">
167+
The name of your custom provider
168+
</p>
189169
</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-
<>
220170
<div>
221171
<label className="block mb-2 text-sm font-medium text-gray-700">
222172
Base URL
@@ -236,20 +186,7 @@ export const ApiManagement: React.FC<ApiManagementProps> = ({
236186
<div className="pt-6 mt-6 border-t border-gray-200">
237187
<h4 className="mb-4 font-medium text-md">API Endpoints</h4>
238188

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">
253190
<div>
254191
<label className="block mb-2 text-sm font-medium text-gray-700">
255192
Chat Completions Endpoint

src/pages/SettingsPage.tsx

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import React, { useState, useEffect } from 'react';
22
import { Server, MessageSquare } from 'lucide-react';
3-
import { SettingsService, ProviderSettings } from '../services/settings-service';
3+
import { SettingsService } from '../services/settings-service';
4+
import { ProviderSettings } from '../types/settings';
45
import { ApiManagement, ModelManagement, ChatSettings } from '../components/settings';
56
import { AIProvider } from '../types/ai-providers';
67
import { DatabaseIntegrationService } from '../services/database-integration';
@@ -144,12 +145,6 @@ export const SettingsPage: React.FC<SettingsPageProps> = ({
144145
settingsService.updateProviderSettings(providerSettings[provider], provider);
145146
});
146147

147-
// Update selected provider
148-
settingsService.setSelectedProvider(selectedProvider);
149-
150-
// Update selected model
151-
settingsService.setSelectedModel(selectedModel);
152-
153148
// Update streaming setting
154149
settingsService.setUseStreaming(useStreaming);
155150

src/services/api-settings.ts

Lines changed: 0 additions & 8 deletions
This file was deleted.

src/services/chat-service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { AIService } from './ai-service';
44
import { SettingsService } from './settings-service';
55
import { StreamControlHandler } from './streaming-control';
66
import { MessageHelper } from './message-helper';
7-
import { AIServiceCapability } from './core/capabilities';
7+
import { AIServiceCapability } from '../types/capabilities';
88
import { AIProvider as AIProviderType } from '../types/ai-providers';
99
/**
1010
* Service for managing chat conversations

src/services/core/ai-service-provider.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Message } from '../../types/chat';
22
import { StreamControlHandler } from '../streaming-control';
3-
import { AIServiceCapability } from './capabilities';
3+
import { AIServiceCapability } from '../../types/capabilities';
44

55
/**
66
* Configuration for AI service providers

src/services/database-integration.ts

Lines changed: 10 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
import { DatabaseService } from './database';
2-
import { SettingsService, ProviderSettings } from './settings-service';
2+
import { SettingsService } from './settings-service';
33
import { Conversation, Message, ConversationFolder } from '../types/chat';
4-
import { ApiSettings } from './api-settings';
4+
import { ProviderSettings } from '../types/settings';
55
import { v4 as uuidv4 } from 'uuid';
6-
import { AIProvider } from '../types/ai-providers';
76

87
/**
98
* Service for integrating database operations with app components
@@ -253,49 +252,13 @@ export class DatabaseIntegrationService {
253252
*/
254253
private async loadApiSettings(): Promise<void> {
255254
try {
256-
const providers: AIProvider[] = [
257-
'OpenAI',
258-
'Anthropic',
259-
'Gemini',
260-
'Fireworks.ai',
261-
'Together.ai',
262-
'OpenRouter',
263-
'Custom'
264-
];
265-
266-
const settings = this.settingsService.getSettings();
267-
let selectedProvider = settings.selectedProvider;
255+
const apiSettingsList = await this.dbService.getApiSettingsList();
268256

269257
// Load each provider's settings
270-
for (const provider of providers) {
271-
const dbSettings = await this.dbService.getApiSettings(provider);
272-
if (dbSettings) {
273-
// Convert to ProviderSettings format
274-
const providerSettings: ProviderSettings = {
275-
apiKey: dbSettings.apiKey,
276-
organizationId: dbSettings.organizationId,
277-
apiVersion: dbSettings.apiVersion,
278-
baseUrl: dbSettings.baseUrl,
279-
};
280-
281-
// Add any additional settings
282-
if (dbSettings.additional) {
283-
Object.assign(providerSettings, dbSettings.additional);
284-
}
285-
286-
// Update settings service
287-
this.settingsService.updateProviderSettings(providerSettings, provider);
288-
289-
// If this is the first provider with an API key, make it selected
290-
if (providerSettings.apiKey && !settings.providers[selectedProvider]?.apiKey) {
291-
selectedProvider = provider;
292-
}
293-
}
294-
}
295-
296-
// Update selected provider if changed
297-
if (selectedProvider !== settings.selectedProvider) {
298-
this.settingsService.setSelectedProvider(selectedProvider);
258+
for (const apiSettings of apiSettingsList) {
259+
260+
// Update settings service
261+
this.settingsService.updateProviderSettings(apiSettings);
299262
}
300263

301264
} catch (error) {
@@ -315,28 +278,12 @@ export class DatabaseIntegrationService {
315278
const providerSettings = settings.providers[provider];
316279
if (providerSettings) {
317280
// Create database settings object
318-
const dbSettings: ApiSettings = {
319-
provider,
320-
apiKey: providerSettings.apiKey || '',
321-
organizationId: providerSettings.organizationId,
322-
apiVersion: providerSettings.apiVersion,
323-
baseUrl: providerSettings.baseUrl
281+
const dbSettings: ProviderSettings = {
282+
...providerSettings,
324283
};
325284

326-
// Add additional fields
327-
const additional: Record<string, string | number | boolean> = {};
328-
for (const key in providerSettings) {
329-
if (!['apiKey', 'organizationId', 'apiVersion', 'baseUrl'].includes(key)) {
330-
additional[key] = providerSettings[key as keyof ProviderSettings] as string | number | boolean;
331-
}
332-
}
333-
334-
if (Object.keys(additional).length > 0) {
335-
dbSettings.additional = additional;
336-
}
337-
338285
// Save to database
339-
await this.dbService.saveApiSettings(provider, dbSettings);
286+
await this.dbService.saveApiSettings(dbSettings);
340287
}
341288
}
342289
} catch (error) {

0 commit comments

Comments
 (0)