feat: add azure as first class provider (#6555)
* feat: add azure as first class provider * fix: deployment url
This commit is contained in:
parent
df61546942
commit
8a51cc1656
23
web-app/public/images/model-provider/azure.svg
Normal file
23
web-app/public/images/model-provider/azure.svg
Normal file
@ -0,0 +1,23 @@
|
||||
<svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M181.699 48.0322H312.774L176.705 450.566C175.303 454.703 172.637 458.297 169.082 460.841C165.528 463.386 161.263 464.754 156.889 464.753H54.8776C51.5634 464.753 48.2969 463.965 45.3481 462.454C42.3994 460.944 39.8531 458.754 37.92 456.067C35.9868 453.379 34.7222 450.27 34.2308 446.998C33.7394 443.726 34.0352 440.384 35.0939 437.248L161.883 62.1867C163.285 58.0499 165.951 54.4561 169.506 51.9112C173.06 49.3663 177.325 47.9984 181.699 48V48.0322Z" fill="url(#paint0_linear_20_2)"/>
|
||||
<path d="M372.189 318.029H164.332C162.421 318.074 160.566 318.684 159.002 319.781C157.437 320.879 156.234 322.415 155.545 324.195C154.855 325.975 154.709 327.92 155.126 329.783C155.544 331.645 156.505 333.343 157.888 334.66L291.315 459.059C295.208 462.681 300.332 464.693 305.653 464.689H423.356L372.189 318.029Z" fill="#0078D4"/>
|
||||
<path d="M181.7 48.0322C177.277 48.014 172.964 49.4093 169.393 52.0141C165.822 54.6188 163.179 58.2963 161.851 62.5084L35.2557 436.959C34.128 440.105 33.7755 443.476 34.2281 446.786C34.6808 450.097 35.9252 453.251 37.8561 455.98C39.7871 458.709 42.3477 460.934 45.3218 462.467C48.2958 463.999 51.5958 464.795 54.9426 464.785H159.596C163.495 464.092 167.139 462.377 170.156 459.817C173.174 457.257 175.456 453.942 176.77 450.212L201.999 375.933L292.217 459.895C295.999 463.02 300.744 464.747 305.653 464.785H422.937L371.384 318.029H221.492L313.257 48L181.7 48.0322Z" fill="url(#paint1_linear_20_2)"/>
|
||||
<path d="M349.119 62.1867C347.723 58.0524 345.063 54.4596 341.514 51.9145C337.965 49.3694 333.705 48.0003 329.335 48H183.246C187.616 48.0003 191.875 49.3694 195.425 51.9145C198.974 54.4596 201.634 58.0524 203.03 62.1867L329.819 437.248C330.878 440.384 331.173 443.726 330.682 446.998C330.191 450.27 328.926 453.379 326.993 456.067C325.06 458.754 322.514 460.944 319.565 462.454C316.616 463.965 313.349 464.753 310.035 464.753H456.125C459.439 464.753 462.705 463.965 465.654 462.454C468.603 460.944 471.149 458.754 473.082 456.067C475.016 453.379 476.28 450.27 476.772 446.998C477.263 443.726 476.967 440.384 475.908 437.248L349.119 62.1867Z" fill="url(#paint2_linear_20_2)"/>
|
||||
<defs>
|
||||
<linearGradient id="paint0_linear_20_2" x1="235.192" y1="71.27" x2="99.6672" y2="472.272" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#114A8B"/>
|
||||
<stop offset="1" stop-color="#0669BC"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint1_linear_20_2" x1="277.616" y1="258.105" x2="246.211" y2="268.725" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-opacity="0.3"/>
|
||||
<stop offset="0.07" stop-opacity="0.2"/>
|
||||
<stop offset="0.32" stop-opacity="0.1"/>
|
||||
<stop offset="0.62" stop-opacity="0.05"/>
|
||||
<stop offset="1" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint2_linear_20_2" x1="261.33" y1="59.2258" x2="410.097" y2="456.238" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#3CCBF4"/>
|
||||
<stop offset="1" stop-color="#2892DF"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.9 KiB |
@ -59,6 +59,40 @@ export const predefinedProviders = [
|
||||
],
|
||||
models: [],
|
||||
},
|
||||
{
|
||||
active: true,
|
||||
api_key: '',
|
||||
base_url: 'https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1',
|
||||
explore_models_url: 'https://oai.azure.com/deployments',
|
||||
provider: 'azure',
|
||||
settings: [
|
||||
{
|
||||
key: 'api-key',
|
||||
title: 'API Key',
|
||||
description:
|
||||
'The Azure OpenAI API uses API keys for authentication. Visit your [Azure OpenAI Studio](https://oai.azure.com/) to retrieve the API key from your resource.',
|
||||
controller_type: 'input',
|
||||
controller_props: {
|
||||
placeholder: 'Insert API Key',
|
||||
value: '',
|
||||
type: 'password',
|
||||
input_actions: ['unobscure', 'copy'],
|
||||
},
|
||||
},
|
||||
{
|
||||
key: 'base-url',
|
||||
title: 'Base URL',
|
||||
description:
|
||||
'Your Azure OpenAI resource endpoint. See the [Azure OpenAI documentation](https://learn.microsoft.com/en-us/azure/ai-foundry/openai/latest) for more information.',
|
||||
controller_type: 'input',
|
||||
controller_props: {
|
||||
placeholder: 'https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1',
|
||||
value: 'https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1',
|
||||
},
|
||||
},
|
||||
],
|
||||
models: [],
|
||||
},
|
||||
{
|
||||
active: true,
|
||||
api_key: '',
|
||||
|
||||
@ -51,15 +51,15 @@ export const DialogAddModel = ({ provider, trigger }: DialogAddModelProps) => {
|
||||
(
|
||||
providerModels[
|
||||
provider.provider as unknown as keyof typeof providerModels
|
||||
].supportsToolCalls as unknown as string[]
|
||||
).includes(modelId)
|
||||
]?.supportsToolCalls as unknown as string[]
|
||||
)?.includes(modelId)
|
||||
? ModelCapabilities.TOOLS
|
||||
: undefined,
|
||||
(
|
||||
providerModels[
|
||||
provider.provider as unknown as keyof typeof providerModels
|
||||
].supportsImages as unknown as string[]
|
||||
).includes(modelId)
|
||||
]?.supportsImages as unknown as string[]
|
||||
)?.includes(modelId)
|
||||
? ModelCapabilities.VISION
|
||||
: undefined,
|
||||
].filter(Boolean) as string[],
|
||||
|
||||
@ -28,6 +28,8 @@ export function getProviderLogo(provider: string) {
|
||||
return '/images/model-provider/gemini.svg'
|
||||
case 'openai':
|
||||
return '/images/model-provider/openai.svg'
|
||||
case 'azure':
|
||||
return '/images/model-provider/azure.svg'
|
||||
default:
|
||||
return undefined
|
||||
}
|
||||
@ -161,5 +163,5 @@ export function formatDuration(startTime: number, endTime?: number): string {
|
||||
}
|
||||
|
||||
export function sanitizeModelId(modelId: string): string {
|
||||
return modelId.replace(/[^a-zA-Z0-9/_\-.]/g, '').replace(/\./g, "_")
|
||||
return modelId.replace(/[^a-zA-Z0-9/_\-.]/g, '').replace(/\./g, '_')
|
||||
}
|
||||
|
||||
@ -35,15 +35,15 @@ export class TauriProvidersService extends DefaultProvidersService {
|
||||
(
|
||||
providerModels[
|
||||
provider.provider as unknown as keyof typeof providerModels
|
||||
].supportsToolCalls as unknown as string[]
|
||||
).includes(model)
|
||||
]?.supportsToolCalls as unknown as string[]
|
||||
)?.includes(model)
|
||||
? ModelCapabilities.TOOLS
|
||||
: undefined,
|
||||
(
|
||||
providerModels[
|
||||
provider.provider as unknown as keyof typeof providerModels
|
||||
].supportsImages as unknown as string[]
|
||||
).includes(model)
|
||||
]?.supportsImages as unknown as string[]
|
||||
)?.includes(model)
|
||||
? ModelCapabilities.VISION
|
||||
: undefined,
|
||||
].filter(Boolean) as string[]
|
||||
|
||||
@ -93,8 +93,8 @@ export class WebProvidersService implements ProvidersService {
|
||||
(
|
||||
providerModels[
|
||||
provider.provider as unknown as keyof typeof providerModels
|
||||
].supportsToolCalls as unknown as string[]
|
||||
).includes(model)
|
||||
]?.supportsToolCalls as unknown as string[]
|
||||
)?.includes(model)
|
||||
? ModelCapabilities.TOOLS
|
||||
: undefined,
|
||||
].filter(Boolean) as string[]
|
||||
@ -163,7 +163,9 @@ export class WebProvidersService implements ProvidersService {
|
||||
// Handle different response formats that providers might use
|
||||
if (data.data && Array.isArray(data.data)) {
|
||||
// OpenAI format: { data: [{ id: "model-id" }, ...] }
|
||||
return data.data.map((model: { id: string }) => model.id).filter(Boolean)
|
||||
return data.data
|
||||
.map((model: { id: string }) => model.id)
|
||||
.filter(Boolean)
|
||||
} else if (Array.isArray(data)) {
|
||||
// Direct array format: ["model-id1", "model-id2", ...]
|
||||
return data
|
||||
@ -189,11 +191,15 @@ export class WebProvidersService implements ProvidersService {
|
||||
'Authentication failed',
|
||||
'Access forbidden',
|
||||
'Models endpoint not found',
|
||||
'Failed to fetch models from'
|
||||
'Failed to fetch models from',
|
||||
]
|
||||
|
||||
if (error instanceof Error &&
|
||||
structuredErrorPrefixes.some(prefix => (error as Error).message.startsWith(prefix))) {
|
||||
if (
|
||||
error instanceof Error &&
|
||||
structuredErrorPrefixes.some((prefix) =>
|
||||
(error as Error).message.startsWith(prefix)
|
||||
)
|
||||
) {
|
||||
throw new Error(error.message)
|
||||
}
|
||||
|
||||
@ -211,7 +217,10 @@ export class WebProvidersService implements ProvidersService {
|
||||
}
|
||||
}
|
||||
|
||||
async updateSettings(providerName: string, settings: ProviderSetting[]): Promise<void> {
|
||||
async updateSettings(
|
||||
providerName: string,
|
||||
settings: ProviderSetting[]
|
||||
): Promise<void> {
|
||||
await ExtensionManager.getInstance()
|
||||
.getEngine(providerName)
|
||||
?.updateSettings(
|
||||
@ -233,4 +242,4 @@ export class WebProvidersService implements ProvidersService {
|
||||
// Web implementation uses regular fetch
|
||||
return fetch
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user