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'
}
],
'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: [
{
id: 'gemini-1.5-flash',

View File

@ -1,4 +1,5 @@
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 AnthropicProviderLogo from '@renderer/assets/images/providers/anthropic.png'
import BaichuanProviderLogo from '@renderer/assets/images/providers/baichuan.png'
@ -73,7 +74,8 @@ export function getProviderLogo(providerId: string) {
return ZhinaoProviderLogo
case 'nvidia':
return NvidiaProviderLogo
case 'azure-openai':
return AzureProviderLogo
default:
return undefined
}
@ -336,5 +338,16 @@ export const PROVIDER_CONFIG = {
docs: 'https://docs.api.nvidia.com/nim/reference/llm-apis',
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",
"graphrag-kylin-mountain": "GraphRAG",
"github": "GitHub Models",
"ocoolai": "ocoolAI"
"ocoolai": "ocoolAI",
"azure-openai": "Azure OpenAI"
},
"settings": {
"title": "Settings",
@ -220,6 +221,7 @@
"provider.check": "Check",
"provider.get_api_key": "Get API Key",
"provider.api_host": "API Host",
"provider.api_version": "API Version",
"provider.docs_check": "Check",
"provider.docs_more_details": "for more details",
"provider.search_placeholder": "Search model id or name",

View File

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

View File

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

View File

@ -41,6 +41,7 @@ const ProviderSetting: FC<Props> = ({ provider: _provider }) => {
const { provider } = useProvider(_provider.id)
const [apiKey, setApiKey] = useState(provider.apiKey)
const [apiHost, setApiHost] = useState(provider.apiHost)
const [apiVersion, setApiVersion] = useState(provider.apiVersion)
const [apiValid, setApiValid] = useState(false)
const [apiChecking, setApiChecking] = useState(false)
const { updateProvider, models, removeModel } = useProvider(provider.id)
@ -56,6 +57,7 @@ const ProviderSetting: FC<Props> = ({ provider: _provider }) => {
const onUpdateApiKey = () => updateProvider({ ...provider, apiKey })
const onUpdateApiHost = () => updateProvider({ ...provider, apiHost })
const onUpdateApiVersion = () => updateProvider({ ...provider, apiVersion })
const onManageModel = () => EditModelsPopup.show({ 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>
)}
</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 === 'graphrag-kylin-mountain' && provider.models.length > 0 && (
<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 { removeQuotes } from '@renderer/utils'
import { first, takeRight } from 'lodash'
import OpenAI from 'openai'
import OpenAI, { AzureOpenAI } from 'openai'
import {
ChatCompletionContentPart,
ChatCompletionCreateParamsNonStreaming,
@ -20,6 +20,16 @@ export default class OpenAIProvider extends BaseProvider {
constructor(provider: 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({
dangerouslyAllowBrowser: true,
apiKey: provider.apiKey,

View File

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

View File

@ -59,6 +59,16 @@ const initialState: LlmState = {
isSystem: true,
enabled: false
},
{
id: 'azure-openai',
name: 'Azure OpenAI',
apiKey: '',
apiHost: '',
apiVersion: '',
models: SYSTEM_MODELS['azure-openai'],
isSystem: true,
enabled: false
},
{
id: '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
apiKey: string
apiHost: string
apiVersion?: string
models: Model[]
enabled?: boolean
isSystem?: boolean