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
+ }
+ ]
+ }
+ }
}
}