feat: add azure openai provider

This commit is contained in:
kangfenmao 2024-10-08 20:14:50 +08:00
parent 68d57ba238
commit 302d7511dc
11 changed files with 96 additions and 6 deletions

View File

@ -343,6 +343,20 @@ export const SYSTEM_MODELS: Record<string, Model[]> = {
group: 'o1' group: 'o1'
} }
], ],
'azure-openai': [
{
id: 'gpt-4o',
provider: 'openai',
name: ' GPT-4o',
group: 'GPT 4o'
},
{
id: 'gpt-4o-mini',
provider: 'openai',
name: ' GPT-4o-mini',
group: 'GPT 4o'
}
],
gemini: [ gemini: [
{ {
id: 'gemini-1.5-flash', id: 'gemini-1.5-flash',

View File

@ -1,4 +1,5 @@
import ZhinaoProviderLogo from '@renderer/assets/images/models/360.png' import ZhinaoProviderLogo from '@renderer/assets/images/models/360.png'
import AzureProviderLogo from '@renderer/assets/images/models/microsoft.png'
import AiHubMixProviderLogo from '@renderer/assets/images/providers/aihubmix.jpg' import AiHubMixProviderLogo from '@renderer/assets/images/providers/aihubmix.jpg'
import AnthropicProviderLogo from '@renderer/assets/images/providers/anthropic.png' import AnthropicProviderLogo from '@renderer/assets/images/providers/anthropic.png'
import BaichuanProviderLogo from '@renderer/assets/images/providers/baichuan.png' import BaichuanProviderLogo from '@renderer/assets/images/providers/baichuan.png'
@ -73,7 +74,8 @@ export function getProviderLogo(providerId: string) {
return ZhinaoProviderLogo return ZhinaoProviderLogo
case 'nvidia': case 'nvidia':
return NvidiaProviderLogo return NvidiaProviderLogo
case 'azure-openai':
return AzureProviderLogo
default: default:
return undefined return undefined
} }
@ -336,5 +338,16 @@ export const PROVIDER_CONFIG = {
docs: 'https://docs.api.nvidia.com/nim/reference/llm-apis', docs: 'https://docs.api.nvidia.com/nim/reference/llm-apis',
models: 'https://build.nvidia.com/nim' models: 'https://build.nvidia.com/nim'
} }
},
'azure-openai': {
api: {
url: ''
},
websites: {
official: 'https://azure.microsoft.com/en-us/products/ai-services/openai-service',
apiKey: 'https://portal.azure.com/#view/Microsoft_Azure_ProjectOxford/CognitiveServicesHub/~/OpenAI',
docs: 'https://learn.microsoft.com/en-us/azure/ai-services/openai/',
models: 'https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models'
}
} }
} }

View File

@ -175,7 +175,8 @@
"minimax": "MiniMax", "minimax": "MiniMax",
"graphrag-kylin-mountain": "GraphRAG", "graphrag-kylin-mountain": "GraphRAG",
"github": "GitHub Models", "github": "GitHub Models",
"ocoolai": "ocoolAI" "ocoolai": "ocoolAI",
"azure-openai": "Azure OpenAI"
}, },
"settings": { "settings": {
"title": "Settings", "title": "Settings",
@ -220,6 +221,7 @@
"provider.check": "Check", "provider.check": "Check",
"provider.get_api_key": "Get API Key", "provider.get_api_key": "Get API Key",
"provider.api_host": "API Host", "provider.api_host": "API Host",
"provider.api_version": "API Version",
"provider.docs_check": "Check", "provider.docs_check": "Check",
"provider.docs_more_details": "for more details", "provider.docs_more_details": "for more details",
"provider.search_placeholder": "Search model id or name", "provider.search_placeholder": "Search model id or name",

View File

@ -175,7 +175,8 @@
"minimax": "MiniMax", "minimax": "MiniMax",
"graphrag-kylin-mountain": "GraphRAG", "graphrag-kylin-mountain": "GraphRAG",
"github": "GitHub Models", "github": "GitHub Models",
"ocoolai": "ocoolAI" "ocoolai": "ocoolAI",
"azure-openai": "Azure OpenAI"
}, },
"settings": { "settings": {
"title": "设置", "title": "设置",
@ -220,6 +221,7 @@
"provider.check": "检查", "provider.check": "检查",
"provider.get_api_key": "点击这里获取密钥", "provider.get_api_key": "点击这里获取密钥",
"provider.api_host": "API 地址", "provider.api_host": "API 地址",
"provider.api_version": "API 版本",
"provider.docs_check": "查看", "provider.docs_check": "查看",
"provider.docs_more_details": "获取更多详情", "provider.docs_more_details": "获取更多详情",
"provider.search_placeholder": "搜索模型 ID 或名称", "provider.search_placeholder": "搜索模型 ID 或名称",

View File

@ -175,7 +175,8 @@
"minimax": "MiniMax", "minimax": "MiniMax",
"graphrag-kylin-mountain": "GraphRAG", "graphrag-kylin-mountain": "GraphRAG",
"github": "GitHub Models", "github": "GitHub Models",
"ocoolai": "ocoolAI" "ocoolai": "ocoolAI",
"azure-openai": "Azure OpenAI"
}, },
"settings": { "settings": {
"title": "設定", "title": "設定",
@ -220,6 +221,7 @@
"provider.check": "檢查", "provider.check": "檢查",
"provider.get_api_key": "獲取 API 密鑰", "provider.get_api_key": "獲取 API 密鑰",
"provider.api_host": "API 主機地址", "provider.api_host": "API 主機地址",
"provider.api_version": "API 版本",
"provider.docs_check": "檢查", "provider.docs_check": "檢查",
"provider.docs_more_details": "查看更多細節", "provider.docs_more_details": "查看更多細節",
"provider.search_placeholder": "搜尋模型 ID 或名稱", "provider.search_placeholder": "搜尋模型 ID 或名稱",

View File

@ -41,6 +41,7 @@ const ProviderSetting: FC<Props> = ({ provider: _provider }) => {
const { provider } = useProvider(_provider.id) const { provider } = useProvider(_provider.id)
const [apiKey, setApiKey] = useState(provider.apiKey) const [apiKey, setApiKey] = useState(provider.apiKey)
const [apiHost, setApiHost] = useState(provider.apiHost) const [apiHost, setApiHost] = useState(provider.apiHost)
const [apiVersion, setApiVersion] = useState(provider.apiVersion)
const [apiValid, setApiValid] = useState(false) const [apiValid, setApiValid] = useState(false)
const [apiChecking, setApiChecking] = useState(false) const [apiChecking, setApiChecking] = useState(false)
const { updateProvider, models, removeModel } = useProvider(provider.id) const { updateProvider, models, removeModel } = useProvider(provider.id)
@ -56,6 +57,7 @@ const ProviderSetting: FC<Props> = ({ provider: _provider }) => {
const onUpdateApiKey = () => updateProvider({ ...provider, apiKey }) const onUpdateApiKey = () => updateProvider({ ...provider, apiKey })
const onUpdateApiHost = () => updateProvider({ ...provider, apiHost }) const onUpdateApiHost = () => updateProvider({ ...provider, apiHost })
const onUpdateApiVersion = () => updateProvider({ ...provider, apiVersion })
const onManageModel = () => EditModelsPopup.show({ provider }) const onManageModel = () => EditModelsPopup.show({ provider })
const onAddModel = () => AddModelPopup.show({ title: t('settings.models.add.add_model'), provider }) const onAddModel = () => AddModelPopup.show({ title: t('settings.models.add.add_model'), provider })
@ -136,6 +138,19 @@ const ProviderSetting: FC<Props> = ({ provider: _provider }) => {
<Button onClick={onReset}>{t('settings.provider.api.url.reset')}</Button> <Button onClick={onReset}>{t('settings.provider.api.url.reset')}</Button>
)} )}
</Space.Compact> </Space.Compact>
{provider.id === 'azure-openai' && (
<>
<SettingSubtitle>{t('settings.provider.api_version')}</SettingSubtitle>
<Space.Compact style={{ width: '100%', marginTop: 5 }}>
<Input
value={apiVersion}
placeholder="2024-xx-xx-preview"
onChange={(e) => setApiVersion(e.target.value)}
onBlur={onUpdateApiVersion}
/>
</Space.Compact>
</>
)}
{provider.id === 'ollama' && <OllamSettings />} {provider.id === 'ollama' && <OllamSettings />}
{provider.id === 'graphrag-kylin-mountain' && provider.models.length > 0 && ( {provider.id === 'graphrag-kylin-mountain' && provider.models.length > 0 && (
<GraphRAGSettings provider={provider} /> <GraphRAGSettings provider={provider} />

View File

@ -6,7 +6,7 @@ import { filterContextMessages } from '@renderer/services/messages'
import { Assistant, FileTypes, Message, Model, Provider, Suggestion } from '@renderer/types' import { Assistant, FileTypes, Message, Model, Provider, Suggestion } from '@renderer/types'
import { removeQuotes } from '@renderer/utils' import { removeQuotes } from '@renderer/utils'
import { first, takeRight } from 'lodash' import { first, takeRight } from 'lodash'
import OpenAI from 'openai' import OpenAI, { AzureOpenAI } from 'openai'
import { import {
ChatCompletionContentPart, ChatCompletionContentPart,
ChatCompletionCreateParamsNonStreaming, ChatCompletionCreateParamsNonStreaming,
@ -20,6 +20,16 @@ export default class OpenAIProvider extends BaseProvider {
constructor(provider: Provider) { constructor(provider: Provider) {
super(provider) super(provider)
if (provider.id === 'azure-openai') {
this.sdk = new AzureOpenAI({
dangerouslyAllowBrowser: true,
apiKey: provider.apiKey,
apiVersion: provider.apiVersion,
endpoint: provider.apiHost
})
return
}
this.sdk = new OpenAI({ this.sdk = new OpenAI({
dangerouslyAllowBrowser: true, dangerouslyAllowBrowser: true,
apiKey: provider.apiKey, apiKey: provider.apiKey,

View File

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

View File

@ -59,6 +59,16 @@ const initialState: LlmState = {
isSystem: true, isSystem: true,
enabled: false enabled: false
}, },
{
id: 'azure-openai',
name: 'Azure OpenAI',
apiKey: '',
apiHost: '',
apiVersion: '',
models: SYSTEM_MODELS['azure-openai'],
isSystem: true,
enabled: false
},
{ {
id: 'gemini', id: 'gemini',
name: 'Gemini', name: 'Gemini',

View File

@ -504,6 +504,27 @@ const migrateConfig = {
}) })
} }
} }
},
'30': (state: RootState) => {
return {
...state,
llm: {
...state.llm,
providers: [
...state.llm.providers,
{
id: 'azure-openai',
name: 'Azure OpenAI',
apiKey: '',
apiHost: '',
apiVersion: '',
models: SYSTEM_MODELS['azure-openai'],
isSystem: true,
enabled: false
}
]
}
}
} }
} }

View File

@ -55,6 +55,7 @@ export type Provider = {
name: string name: string
apiKey: string apiKey: string
apiHost: string apiHost: string
apiVersion?: string
models: Model[] models: Model[]
enabled?: boolean enabled?: boolean
isSystem?: boolean isSystem?: boolean