mirror of
https://github.com/ItzCrazyKns/Perplexica.git
synced 2025-10-30 19:08:15 +00:00
99 lines
3.3 KiB
TypeScript
99 lines
3.3 KiB
TypeScript
import Select from '@/components/ui/Select';
|
|
import { ConfigModelProvider } from '@/lib/config/types';
|
|
import { useChat } from '@/lib/hooks/useChat';
|
|
import { useState } from 'react';
|
|
import { toast } from 'sonner';
|
|
|
|
const ModelSelect = ({
|
|
providers,
|
|
type,
|
|
}: {
|
|
providers: ConfigModelProvider[];
|
|
type: 'chat' | 'embedding';
|
|
}) => {
|
|
const [selectedModel, setSelectedModel] = useState<string>(
|
|
type === 'chat'
|
|
? `${localStorage.getItem('chatModelProviderId')}/${localStorage.getItem('chatModelKey')}`
|
|
: `${localStorage.getItem('embeddingModelProviderId')}/${localStorage.getItem('embeddingModelKey')}`,
|
|
);
|
|
const [loading, setLoading] = useState(false);
|
|
const { setChatModelProvider, setEmbeddingModelProvider } = useChat();
|
|
|
|
const handleSave = async (newValue: string) => {
|
|
setLoading(true);
|
|
setSelectedModel(newValue);
|
|
|
|
try {
|
|
if (type === 'chat') {
|
|
const providerId = newValue.split('/')[0];
|
|
const modelKey = newValue.split('/').slice(1).join('/');
|
|
|
|
localStorage.setItem('chatModelProviderId', providerId);
|
|
localStorage.setItem('chatModelKey', modelKey);
|
|
|
|
setChatModelProvider({
|
|
providerId: providerId,
|
|
key: modelKey,
|
|
});
|
|
} else {
|
|
const providerId = newValue.split('/')[0];
|
|
const modelKey = newValue.split('/').slice(1).join('/');
|
|
|
|
localStorage.setItem('embeddingModelProviderId', providerId);
|
|
localStorage.setItem('embeddingModelKey', modelKey);
|
|
|
|
setEmbeddingModelProvider({
|
|
providerId: providerId,
|
|
key: modelKey,
|
|
});
|
|
}
|
|
} catch (error) {
|
|
console.error('Error saving config:', error);
|
|
toast.error('Failed to save configuration.');
|
|
} finally {
|
|
setLoading(false);
|
|
}
|
|
};
|
|
|
|
return (
|
|
<section className="rounded-xl border border-light-200 bg-light-primary/80 p-4 lg:p-6 transition-colors dark:border-dark-200 dark:bg-dark-primary/80">
|
|
<div className="space-y-3 lg:space-y-5">
|
|
<div>
|
|
<h4 className="text-sm lg:text-base text-black dark:text-white">
|
|
Select {type === 'chat' ? 'Chat Model' : 'Embedding Model'}
|
|
</h4>
|
|
<p className="text-[11px] lg:text-xs text-black/50 dark:text-white/50">
|
|
{type === 'chat'
|
|
? 'Choose which model to use for generating responses'
|
|
: 'Choose which model to use for generating embeddings'}
|
|
</p>
|
|
</div>
|
|
<Select
|
|
value={selectedModel}
|
|
onChange={(event) => handleSave(event.target.value)}
|
|
options={
|
|
type === 'chat'
|
|
? providers.flatMap((provider) =>
|
|
provider.chatModels.map((model) => ({
|
|
value: `${provider.id}/${model.key}`,
|
|
label: `${provider.name} - ${model.name}`,
|
|
})),
|
|
)
|
|
: providers.flatMap((provider) =>
|
|
provider.embeddingModels.map((model) => ({
|
|
value: `${provider.id}/${model.key}`,
|
|
label: `${provider.name} - ${model.name}`,
|
|
})),
|
|
)
|
|
}
|
|
className="!text-xs lg:!text-sm"
|
|
loading={loading}
|
|
disabled={loading}
|
|
/>
|
|
</div>
|
|
</section>
|
|
);
|
|
};
|
|
|
|
export default ModelSelect;
|