Skip to content

Commit aee83e1

Browse files
committed
Add support for forge
1 parent f65c4cc commit aee83e1

File tree

9 files changed

+267
-22
lines changed

9 files changed

+267
-22
lines changed

src/components/chat/ChatMessageArea.tsx

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React, { useState, FormEvent, useRef, useEffect } from 'react';
22
import { Conversation } from '../../types/chat';
3-
import { Send, Loader, Square, Copy, RotateCcw, Share2, Trash2, Pencil } from 'lucide-react';
3+
import { Send, Square, Copy, RotateCcw, Share2, Pencil, Loader2 } from 'lucide-react';
44
import MarkdownContent from './MarkdownContent';
55
import MessageToolboxMenu, { ToolboxAction } from '../ui/MessageToolboxMenu';
66

@@ -143,13 +143,6 @@ export const ChatMessageArea: React.FC<ChatMessageAreaProps> = ({
143143
icon: Copy,
144144
label: 'Copy',
145145
onClick: () => handleCopyMessage(message.content),
146-
},
147-
{
148-
id: 'delete',
149-
icon: Trash2,
150-
label: 'Delete',
151-
onClick: () => handleActionError('Delete functionality is disabled'),
152-
disabled: true
153146
}
154147
]
155148
: [
@@ -170,13 +163,6 @@ export const ChatMessageArea: React.FC<ChatMessageAreaProps> = ({
170163
icon: RotateCcw,
171164
label: 'Regenerate',
172165
onClick: () => handleRegenerateResponse(),
173-
},
174-
{
175-
id: 'delete',
176-
icon: Trash2,
177-
label: 'Delete',
178-
onClick: () => handleActionError('Delete functionality is disabled'),
179-
disabled: true
180166
}
181167
];
182168

@@ -224,7 +210,11 @@ export const ChatMessageArea: React.FC<ChatMessageAreaProps> = ({
224210
{isUserMessage ? (
225211
<p className="whitespace-pre-wrap">{message.content}</p>
226212
) : (
227-
<MarkdownContent content={message.content} />
213+
message.content === '' ? (
214+
<div className="w-4 h-4 bg-blue-600 rounded-full animate-bounce"></div>
215+
) : (
216+
<MarkdownContent content={message.content} />
217+
)
228218
)}
229219
</div>
230220

@@ -245,7 +235,7 @@ export const ChatMessageArea: React.FC<ChatMessageAreaProps> = ({
245235
<div className="flex justify-start">
246236
<div className="max-w-[80%] rounded-lg p-3 bg-gray-200 text-gray-800 rounded-tl-none">
247237
<div className="flex items-center space-x-2">
248-
<Loader size={16} className="animate-spin" />
238+
<Loader2 size={16} className="animate-spin" />
249239
<span>AI is thinking...</span>
250240
</div>
251241
</div>

src/components/layout/MainLayout.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ const MainLayout: React.FC<MainLayoutProps> = ({ children }) => {
5555
<TopBar
5656
onSelectModel={handleSelectModel}
5757
selectedModel={SettingsService.getInstance().getSelectedModel()}
58+
selectedProvider={SettingsService.getInstance().getSelectedProvider()}
5859
onOpenSettingsDialog={handleOpenSettingsDialog}
5960
/>
6061

src/components/layout/TopBar.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@ import { ModelOption } from '../../services/ai-service';
66
interface TopBarProps {
77
onSelectModel: (model: string, provider: string) => void;
88
selectedModel?: string;
9+
selectedProvider?: string;
910
onOpenSettingsDialog: () => void;
1011
}
1112

12-
const TopBar: React.FC<TopBarProps> = ({ onSelectModel, selectedModel, onOpenSettingsDialog }) => {
13+
const TopBar: React.FC<TopBarProps> = ({ onSelectModel, selectedModel, selectedProvider, onOpenSettingsDialog }) => {
1314
const [isModelDialogOpen, setIsModelDialogOpen] = useState(false);
1415

1516
const handleOpenModelDialog = () => {
@@ -48,6 +49,7 @@ const TopBar: React.FC<TopBarProps> = ({ onSelectModel, selectedModel, onOpenSet
4849
onClose={handleCloseModelDialog}
4950
onSelectModel={handleSelectModel}
5051
currentModelId={selectedModel}
52+
currentProviderName={selectedProvider}
5153
/>
5254
</div>
5355
);

src/components/models/SelectModelDialog.tsx

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,21 @@ interface SelectModelDialogProps {
77
onClose: () => void;
88
onSelectModel: (model: ModelOption, provider: string) => void;
99
currentModelId?: string;
10+
currentProviderName?: string;
1011
}
1112

1213
export const SelectModelDialog: React.FC<SelectModelDialogProps> = ({
1314
isOpen,
1415
onClose,
1516
onSelectModel,
16-
currentModelId
17+
currentModelId,
18+
currentProviderName
1719
}) => {
1820
const [models, setModels] = useState<ModelOption[]>([]);
1921
const [isLoading, setIsLoading] = useState<boolean>(false);
2022
const [searchQuery, setSearchQuery] = useState<string>('');
2123
const [selectedModelId, setSelectedModelId] = useState<string | undefined>(currentModelId);
24+
const [selectedProviderName, setSelectedProviderName] = useState<string | undefined>(currentProviderName);
2225
const [collapsedList, setCollapsedList] = useState<Map<string, boolean>>(new Map());
2326
const [aiService] = useState(() => AIService.getInstance());
2427

@@ -38,6 +41,10 @@ export const SelectModelDialog: React.FC<SelectModelDialogProps> = ({
3841
useEffect(() => {
3942
setSelectedModelId(currentModelId);
4043
}, [currentModelId]);
44+
45+
useEffect(() => {
46+
setSelectedProviderName(currentProviderName);
47+
}, [currentProviderName]);
4148

4249
const loadModels = async () => {
4350
try {
@@ -65,6 +72,7 @@ export const SelectModelDialog: React.FC<SelectModelDialogProps> = ({
6572

6673
const handleSelectModel = (model: ModelOption, provider: string) => {
6774
setSelectedModelId(model.id);
75+
setSelectedProviderName(provider);
6876
onSelectModel(model, provider);
6977
};
7078

@@ -166,7 +174,7 @@ export const SelectModelDialog: React.FC<SelectModelDialogProps> = ({
166174
key={model.id}
167175
onClick={() => handleSelectModel(model, provider)}
168176
className={`flex items-center justify-between p-3 rounded-lg cursor-pointer ${
169-
selectedModelId === model.id
177+
(selectedModelId === model.id && selectedProviderName === model.provider)
170178
? 'bg-blue-600 text-white'
171179
: 'bg-gray-800 text-gray-200 hover:bg-gray-700'
172180
}`}

src/components/settings/ApiManagement.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React, { useState } from 'react';
22
import { ChevronRight, Save, AlertCircle } from 'lucide-react';
33
import { ProviderSettings } from '../../services/settings-service';
44

5-
export type AIProvider = 'OpenAI' | 'Anthropic' | 'Gemini' | 'Fireworks.ai' | 'Together.ai' | 'OpenRouter' | 'Custom';
5+
export type AIProvider = 'Forge' | 'OpenAI' | 'Anthropic' | 'Gemini' | 'Fireworks.ai' | 'Together.ai' | 'OpenRouter' | 'Custom';
66

77
interface ApiManagementProps {
88
selectedProvider: AIProvider;
@@ -33,6 +33,7 @@ export const ApiManagement: React.FC<ApiManagementProps> = ({
3333
const currentProviderSettings = providerSettings[selectedProvider] || { apiKey: '' };
3434

3535
const providers: AIProvider[] = [
36+
'Forge',
3637
'OpenAI',
3738
'Anthropic',
3839
'Gemini',

src/services/ai-service.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ export class AIService {
6262
private constructor() {
6363
// Initialize with default providers
6464
this.addOpenAIProvider();
65+
this.addForgeProvider();
6566
this.setupSettingsListener();
6667
}
6768

@@ -72,6 +73,13 @@ export class AIService {
7273
}
7374
}
7475

76+
private addForgeProvider(): void {
77+
const forgeProvider = ProviderFactory.getProvider('Forge');
78+
if (forgeProvider) {
79+
this.providers.set('Forge', forgeProvider);
80+
}
81+
}
82+
7583
/**
7684
* Setup event listener for settings changes
7785
*/
@@ -376,6 +384,8 @@ export class AIService {
376384
provider: providerName
377385
}));
378386

387+
console.log('Models for provider', providerName, modelOptions);
388+
379389
// Cache results
380390
this.modelCache.set(providerName, modelOptions);
381391
this.lastFetchTime.set(providerName, now);

src/services/chat-service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ export class ChatService {
274274
{
275275
model: settingsService.getSelectedModel(),
276276
provider: settingsService.getSelectedProvider(),
277-
stream: isStreaming
277+
stream: provider === 'Forge' ? false : true
278278
},
279279
streamController
280280
);

0 commit comments

Comments
 (0)