diff --git a/src/renderer/src/assets/images/providers/github.svg b/src/renderer/src/assets/images/providers/github.svg new file mode 100644 index 00000000..bf1081a0 --- /dev/null +++ b/src/renderer/src/assets/images/providers/github.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/renderer/src/config/models.ts b/src/renderer/src/config/models.ts index e63f131d..ff170921 100644 --- a/src/renderer/src/config/models.ts +++ b/src/renderer/src/config/models.ts @@ -117,6 +117,14 @@ export const SYSTEM_MODELS: Record = { group: 'DeepSeek Coder' } ], + github: [ + { + id: 'gpt-4o', + provider: 'github', + name: 'OpenAI GPT-4o', + group: 'OpenAI' + } + ], yi: [ { id: 'yi-large', diff --git a/src/renderer/src/config/provider.ts b/src/renderer/src/config/provider.ts index cf909b53..fdd15b9b 100644 --- a/src/renderer/src/config/provider.ts +++ b/src/renderer/src/config/provider.ts @@ -25,6 +25,7 @@ import DashScopeProviderLogo from '@renderer/assets/images/providers/dashscope.p import DeepSeekProviderLogo from '@renderer/assets/images/providers/deepseek.png' import DoubaoProviderLogo from '@renderer/assets/images/providers/doubao.png' import GeminiProviderLogo from '@renderer/assets/images/providers/gemini.png' +import GithubProviderLogo from '@renderer/assets/images/providers/github.svg' import GraphRagProviderLogo from '@renderer/assets/images/providers/graph-rag.png' import GroqProviderLogo from '@renderer/assets/images/providers/groq.png' import MinimaxProviderLogo from '@renderer/assets/images/providers/minimax.png' @@ -76,6 +77,8 @@ export function getProviderLogo(providerId: string) { return GraphRagProviderLogo case 'minimax': return MinimaxProviderLogo + case 'github': + return GithubProviderLogo default: return undefined } @@ -183,6 +186,22 @@ export const PROVIDER_CONFIG = { logo: DeepSeekProviderLogo } }, + github: { + api: { + url: 'https://models.inference.ai.azure.com/' + }, + websites: { + official: 'https://github.com/marketplace/models', + apiKey: 'https://github.com/settings/tokens', + docs: 'https://docs.github.com/en/github-models', + models: 'https://github.com/marketplace/models' + }, + app: { + name: 'Github Models', + url: 'https://github.com/marketplace/models/azure-openai/gpt-4o/playground', + logo: GithubProviderLogo + } + }, yi: { api: { url: 'https://api.lingyiwanwu.com' diff --git a/src/renderer/src/i18n/index.ts b/src/renderer/src/i18n/index.ts index 2a73a7f9..a3933d6c 100644 --- a/src/renderer/src/i18n/index.ts +++ b/src/renderer/src/i18n/index.ts @@ -136,7 +136,8 @@ const resources = { stepfun: 'StepFun', doubao: 'Doubao', minimax: 'MiniMax', - 'graphrag-kylin-mountain': 'GraphRAG' + 'graphrag-kylin-mountain': 'GraphRAG', + github: 'GitHub Models' }, settings: { title: 'Settings', @@ -391,7 +392,8 @@ const resources = { stepfun: '阶跃星辰', doubao: '豆包', minimax: 'MiniMax', - 'graphrag-kylin-mountain': 'GraphRAG' + 'graphrag-kylin-mountain': 'GraphRAG', + github: 'GitHub Models' }, settings: { title: '设置', diff --git a/src/renderer/src/pages/settings/ProviderSettings/EditModelsPopup.tsx b/src/renderer/src/pages/settings/ProviderSettings/EditModelsPopup.tsx index 2f1a2f34..f1ce4dc4 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/EditModelsPopup.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/EditModelsPopup.tsx @@ -155,7 +155,8 @@ const onShowModelInfo = (model: Model) => { title: model.name, content: model?.description, icon: null, - maskClosable: true + maskClosable: true, + width: 600 }) } diff --git a/src/renderer/src/providers/OpenAIProvider.ts b/src/renderer/src/providers/OpenAIProvider.ts index 315686a8..a97b32fd 100644 --- a/src/renderer/src/providers/OpenAIProvider.ts +++ b/src/renderer/src/providers/OpenAIProvider.ts @@ -178,6 +178,17 @@ export default class OpenAIProvider extends BaseProvider { public async models(): Promise { try { const response = await this.sdk.models.list() + + if (this.provider.id === 'github') { + // @ts-ignore key is not typed + return response.body.map((model) => ({ + id: model.name, + description: model.summary, + object: 'model', + owned_by: model.publisher + })) + } + return response.data } catch (error) { return [] diff --git a/src/renderer/src/store/index.ts b/src/renderer/src/store/index.ts index 08a35402..75d64117 100644 --- a/src/renderer/src/store/index.ts +++ b/src/renderer/src/store/index.ts @@ -22,7 +22,7 @@ const persistedReducer = persistReducer( { key: 'cherry-studio', storage, - version: 24, + version: 25, blacklist: ['runtime'], migrate }, diff --git a/src/renderer/src/store/llm.ts b/src/renderer/src/store/llm.ts index 81fe0d41..5db48e41 100644 --- a/src/renderer/src/store/llm.ts +++ b/src/renderer/src/store/llm.ts @@ -77,6 +77,15 @@ const initialState: LlmState = { isSystem: true, enabled: false }, + { + id: 'github', + name: 'Github Models', + apiKey: '', + apiHost: 'https://models.inference.ai.azure.com/', + models: SYSTEM_MODELS.github, + isSystem: true, + enabled: false + }, { id: 'yi', name: 'Yi', diff --git a/src/renderer/src/store/migrate.ts b/src/renderer/src/store/migrate.ts index f29f1de8..340f4caf 100644 --- a/src/renderer/src/store/migrate.ts +++ b/src/renderer/src/store/migrate.ts @@ -399,6 +399,26 @@ const migrateConfig = { topicPosition: 'right' } } + }, + '25': (state: RootState) => { + return { + ...state, + llm: { + ...state.llm, + providers: [ + ...state.llm.providers, + { + id: 'github', + name: 'Github Models', + apiKey: '', + apiHost: 'https://models.inference.ai.azure.com/', + models: SYSTEM_MODELS.github, + isSystem: true, + enabled: false + } + ] + } + } } }