feat: add openrouter provider

This commit is contained in:
kangfenmao 2024-07-11 16:11:34 +08:00
parent 990affedd0
commit 7c322b7536
10 changed files with 85 additions and 6 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

View File

@ -311,6 +311,48 @@ export const SYSTEM_MODELS: Record<string, SystemModel[]> = {
defaultEnabled: true defaultEnabled: true
} }
], ],
openrouter: [
{
id: 'google/gemma-2-9b-it:free',
provider: 'openrouter',
name: 'Google: Gemma 2 9B',
group: 'Gemma',
temperature: 0.7,
defaultEnabled: true
},
{
id: 'microsoft/phi-3-mini-128k-instruct:free',
provider: 'openrouter',
name: 'Phi-3 Mini 128K Instruct',
group: 'Phi',
temperature: 0.7,
defaultEnabled: true
},
{
id: 'microsoft/phi-3-medium-128k-instruct:free',
provider: 'openrouter',
name: 'Phi-3 Medium 128K Instruct',
group: 'Phi',
temperature: 0.7,
defaultEnabled: true
},
{
id: 'meta-llama/llama-3-8b-instruct:free',
provider: 'openrouter',
name: 'Meta: Llama 3 8B Instruct',
group: 'Llama3',
temperature: 0.7,
defaultEnabled: true
},
{
id: 'mistralai/mistral-7b-instruct:free',
provider: 'openrouter',
name: 'Mistral: Mistral 7B Instruct',
group: 'Mistral',
temperature: 0.7,
defaultEnabled: true
}
],
groq: [ groq: [
{ {
id: 'llama3-8b-8192', id: 'llama3-8b-8192',

View File

@ -32,7 +32,7 @@ const Navigation: FC<Props> = ({ activeAssistant }) => {
return ( return (
<NavbarCenter style={{ border: 'none' }}> <NavbarCenter style={{ border: 'none' }}>
{activeAssistant?.name} {activeAssistant?.name}
<DropdownMenu menu={{ items }} trigger={['click']}> <DropdownMenu menu={{ items, style: { maxHeight: '80vh', overflow: 'auto' } }} trigger={['click']}>
<Button size="small" type="primary" ghost style={{ fontSize: '11px' }}> <Button size="small" type="primary" ghost style={{ fontSize: '11px' }}>
{model ? model.name : 'Select Model'} {model ? model.name : 'Select Model'}
</Button> </Button>

View File

@ -67,7 +67,9 @@ const PopupContainer: React.FC<Props> = ({ provider: _provider, resolve }) => {
return ( return (
<ListItem key={model.id}> <ListItem key={model.id}>
<ListItemHeader> <ListItemHeader>
<Avatar src={getModelLogo(model.id)} size={24} /> <Avatar src={getModelLogo(model.id)} size={24}>
{model.name[0].toUpperCase()}
</Avatar>
<ListItemName>{model.name}</ListItemName> <ListItemName>{model.name}</ListItemName>
</ListItemHeader> </ListItemHeader>
{hasModel ? ( {hasModel ? (

View File

@ -49,7 +49,7 @@ const ProviderSetting: FC<Props> = ({ provider }) => {
<Switch <Switch
defaultValue={provider.enabled} defaultValue={provider.enabled}
key={provider.id} key={provider.id}
onChange={(enabled) => updateProvider({ ...provider, enabled })} onChange={(enabled) => updateProvider({ ...provider, apiKey, apiHost, enabled })}
/> />
</SettingTitle> </SettingTitle>
<Divider style={{ width: '100%', margin: '10px 0' }} /> <Divider style={{ width: '100%', margin: '10px 0' }} />
@ -74,7 +74,7 @@ const ProviderSetting: FC<Props> = ({ provider }) => {
{modelGroups[group].map((model) => ( {modelGroups[group].map((model) => (
<ModelListItem key={model.id}> <ModelListItem key={model.id}>
<Avatar src={getModelLogo(model.id)} size={22} style={{ marginRight: '8px' }}> <Avatar src={getModelLogo(model.id)} size={22} style={{ marginRight: '8px' }}>
{model.name[0]} {model.name[0].toUpperCase()}
</Avatar> </Avatar>
{model.name} {model.name}
</ModelListItem> </ModelListItem>

View File

@ -6,6 +6,7 @@ import GroqProviderLogo from '@renderer/assets/images/providers/groq.png'
import ZhipuProviderLogo from '@renderer/assets/images/providers/zhipu.png' import ZhipuProviderLogo from '@renderer/assets/images/providers/zhipu.png'
import OllamaProviderLogo from '@renderer/assets/images/providers/ollama.png' import OllamaProviderLogo from '@renderer/assets/images/providers/ollama.png'
import MoonshotProviderLogo from '@renderer/assets/images/providers/moonshot.jpeg' import MoonshotProviderLogo from '@renderer/assets/images/providers/moonshot.jpeg'
import OpenRouterProviderLogo from '@renderer/assets/images/providers/openrouter.png'
import ChatGPTModelLogo from '@renderer/assets/images/models/chatgpt.jpeg' import ChatGPTModelLogo from '@renderer/assets/images/models/chatgpt.jpeg'
import ChatGLMModelLogo from '@renderer/assets/images/models/chatglm.jpeg' import ChatGLMModelLogo from '@renderer/assets/images/models/chatglm.jpeg'
import DeepSeekModelLogo from '@renderer/assets/images/models/deepseek.png' import DeepSeekModelLogo from '@renderer/assets/images/models/deepseek.png'
@ -15,6 +16,7 @@ import YiModelLogo from '@renderer/assets/images/models/yi.svg'
import LlamaModelLogo from '@renderer/assets/images/models/llama.jpeg' import LlamaModelLogo from '@renderer/assets/images/models/llama.jpeg'
import MixtralModelLogo from '@renderer/assets/images/models/mixtral.jpeg' import MixtralModelLogo from '@renderer/assets/images/models/mixtral.jpeg'
import MoonshotModelLogo from '@renderer/assets/images/providers/moonshot.jpeg' import MoonshotModelLogo from '@renderer/assets/images/providers/moonshot.jpeg'
import MicrosoftModelLogo from '@renderer/assets/images/models/microsoft.png'
export function getProviderLogo(providerId: string) { export function getProviderLogo(providerId: string) {
switch (providerId) { switch (providerId) {
@ -34,6 +36,8 @@ export function getProviderLogo(providerId: string) {
return OllamaProviderLogo return OllamaProviderLogo
case 'moonshot': case 'moonshot':
return MoonshotProviderLogo return MoonshotProviderLogo
case 'openrouter':
return OpenRouterProviderLogo
default: default:
return undefined return undefined
} }
@ -49,7 +53,9 @@ export function getModelLogo(modelId: string) {
'yi-': YiModelLogo, 'yi-': YiModelLogo,
llama: LlamaModelLogo, llama: LlamaModelLogo,
mixtral: MixtralModelLogo, mixtral: MixtralModelLogo,
moonshot: MoonshotModelLogo mistral: MixtralModelLogo,
moonshot: MoonshotModelLogo,
phi: MicrosoftModelLogo
} }
for (const key in logoMap) { for (const key in logoMap) {

View File

@ -19,7 +19,7 @@ const persistedReducer = persistReducer(
{ {
key: 'cherry-studio', key: 'cherry-studio',
storage, storage,
version: 5, version: 6,
blacklist: ['runtime'], blacklist: ['runtime'],
migrate migrate
}, },

View File

@ -67,6 +67,15 @@ const initialState: LlmState = {
isSystem: true, isSystem: true,
enabled: false enabled: false
}, },
{
id: 'openrouter',
name: 'OpenRouter',
apiKey: '',
apiHost: 'https://openrouter.ai/api/v1/',
models: SYSTEM_MODELS.openrouter.filter((m) => m.defaultEnabled),
isSystem: true,
enabled: false
},
{ {
id: 'groq', id: 'groq',
name: 'Groq', name: 'Groq',

View File

@ -82,6 +82,26 @@ const migrate = createMigrate({
] ]
} }
} }
},
// @ts-ignore store type is unknown
'6': (state: RootState) => {
return {
...state,
llm: {
...state.llm,
providers: [
...state.llm.providers,
{
id: 'openrouter',
name: 'OpenRouter',
apiKey: '',
apiHost: 'https://openrouter.ai/api/v1/',
models: SYSTEM_MODELS.openrouter.filter((m) => m.defaultEnabled),
isSystem: true
}
]
}
}
} }
}) })