feat: add azure openai provider
This commit is contained in:
parent
68d57ba238
commit
302d7511dc
@ -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',
|
||||||
|
|||||||
@ -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'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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",
|
||||||
|
|||||||
@ -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 或名称",
|
||||||
|
|||||||
@ -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 或名稱",
|
||||||
|
|||||||
@ -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} />
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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
|
||||||
},
|
},
|
||||||
|
|||||||
@ -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',
|
||||||
|
|||||||
@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user