Skip to content

Commit 65a3bb6

Browse files
Merge branch 'dev' into zip-backend
2 parents bd12fb8 + 3bbce97 commit 65a3bb6

File tree

7 files changed

+87
-19
lines changed

7 files changed

+87
-19
lines changed
Lines changed: 23 additions & 0 deletions
Loading

web-app/src/consts/providers.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,40 @@ export const predefinedProviders = [
5959
],
6060
models: [],
6161
},
62+
{
63+
active: true,
64+
api_key: '',
65+
base_url: 'https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1',
66+
explore_models_url: 'https://oai.azure.com/deployments',
67+
provider: 'azure',
68+
settings: [
69+
{
70+
key: 'api-key',
71+
title: 'API Key',
72+
description:
73+
'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.',
74+
controller_type: 'input',
75+
controller_props: {
76+
placeholder: 'Insert API Key',
77+
value: '',
78+
type: 'password',
79+
input_actions: ['unobscure', 'copy'],
80+
},
81+
},
82+
{
83+
key: 'base-url',
84+
title: 'Base URL',
85+
description:
86+
'Your Azure OpenAI resource endpoint. See the [Azure OpenAI documentation](https://learn.microsoft.com/en-us/azure/ai-foundry/openai/latest) for more information.',
87+
controller_type: 'input',
88+
controller_props: {
89+
placeholder: 'https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1',
90+
value: 'https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1',
91+
},
92+
},
93+
],
94+
models: [],
95+
},
6296
{
6397
active: true,
6498
api_key: '',

web-app/src/containers/DropdownModelProvider.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -461,11 +461,11 @@ const DropdownModelProvider = ({
461461

462462
return (
463463
<Popover open={open} onOpenChange={onOpenChange}>
464-
<div className="flex items-center gap-1.5 w-full">
464+
<div className="flex items-center gap-1.5 mr-2">
465465
<PopoverTrigger asChild>
466466
<button
467467
type="button"
468-
className="font-medium cursor-pointer flex items-center gap-1.5 relative z-20 w-full"
468+
className="font-medium cursor-pointer flex items-center gap-1.5 relative z-20"
469469
>
470470
{provider && (
471471
<div className="shrink-0">

web-app/src/containers/dialogs/AddModel.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,15 +51,15 @@ export const DialogAddModel = ({ provider, trigger }: DialogAddModelProps) => {
5151
(
5252
providerModels[
5353
provider.provider as unknown as keyof typeof providerModels
54-
].supportsToolCalls as unknown as string[]
55-
).includes(modelId)
54+
]?.supportsToolCalls as unknown as string[]
55+
)?.includes(modelId)
5656
? ModelCapabilities.TOOLS
5757
: undefined,
5858
(
5959
providerModels[
6060
provider.provider as unknown as keyof typeof providerModels
61-
].supportsImages as unknown as string[]
62-
).includes(modelId)
61+
]?.supportsImages as unknown as string[]
62+
)?.includes(modelId)
6363
? ModelCapabilities.VISION
6464
: undefined,
6565
].filter(Boolean) as string[],

web-app/src/lib/utils.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ export function getProviderLogo(provider: string) {
2828
return '/images/model-provider/gemini.svg'
2929
case 'openai':
3030
return '/images/model-provider/openai.svg'
31+
case 'azure':
32+
return '/images/model-provider/azure.svg'
3133
default:
3234
return undefined
3335
}
@@ -161,5 +163,5 @@ export function formatDuration(startTime: number, endTime?: number): string {
161163
}
162164

163165
export function sanitizeModelId(modelId: string): string {
164-
return modelId.replace(/[^a-zA-Z0-9/_\-.]/g, '').replace(/\./g, "_")
166+
return modelId.replace(/[^a-zA-Z0-9/_\-.]/g, '').replace(/\./g, '_')
165167
}

web-app/src/services/providers/tauri.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,15 @@ export class TauriProvidersService extends DefaultProvidersService {
3535
(
3636
providerModels[
3737
provider.provider as unknown as keyof typeof providerModels
38-
].supportsToolCalls as unknown as string[]
39-
).includes(model)
38+
]?.supportsToolCalls as unknown as string[]
39+
)?.includes(model)
4040
? ModelCapabilities.TOOLS
4141
: undefined,
4242
(
4343
providerModels[
4444
provider.provider as unknown as keyof typeof providerModels
45-
].supportsImages as unknown as string[]
46-
).includes(model)
45+
]?.supportsImages as unknown as string[]
46+
)?.includes(model)
4747
? ModelCapabilities.VISION
4848
: undefined,
4949
].filter(Boolean) as string[]

web-app/src/services/providers/web.ts

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,8 @@ export class WebProvidersService implements ProvidersService {
9393
(
9494
providerModels[
9595
provider.provider as unknown as keyof typeof providerModels
96-
].supportsToolCalls as unknown as string[]
97-
).includes(model)
96+
]?.supportsToolCalls as unknown as string[]
97+
)?.includes(model)
9898
? ModelCapabilities.TOOLS
9999
: undefined,
100100
].filter(Boolean) as string[]
@@ -163,7 +163,9 @@ export class WebProvidersService implements ProvidersService {
163163
// Handle different response formats that providers might use
164164
if (data.data && Array.isArray(data.data)) {
165165
// OpenAI format: { data: [{ id: "model-id" }, ...] }
166-
return data.data.map((model: { id: string }) => model.id).filter(Boolean)
166+
return data.data
167+
.map((model: { id: string }) => model.id)
168+
.filter(Boolean)
167169
} else if (Array.isArray(data)) {
168170
// Direct array format: ["model-id1", "model-id2", ...]
169171
return data
@@ -189,11 +191,15 @@ export class WebProvidersService implements ProvidersService {
189191
'Authentication failed',
190192
'Access forbidden',
191193
'Models endpoint not found',
192-
'Failed to fetch models from'
194+
'Failed to fetch models from',
193195
]
194196

195-
if (error instanceof Error &&
196-
structuredErrorPrefixes.some(prefix => (error as Error).message.startsWith(prefix))) {
197+
if (
198+
error instanceof Error &&
199+
structuredErrorPrefixes.some((prefix) =>
200+
(error as Error).message.startsWith(prefix)
201+
)
202+
) {
197203
throw new Error(error.message)
198204
}
199205

@@ -211,7 +217,10 @@ export class WebProvidersService implements ProvidersService {
211217
}
212218
}
213219

214-
async updateSettings(providerName: string, settings: ProviderSetting[]): Promise<void> {
220+
async updateSettings(
221+
providerName: string,
222+
settings: ProviderSetting[]
223+
): Promise<void> {
215224
await ExtensionManager.getInstance()
216225
.getEngine(providerName)
217226
?.updateSettings(
@@ -233,4 +242,4 @@ export class WebProvidersService implements ProvidersService {
233242
// Web implementation uses regular fetch
234243
return fetch
235244
}
236-
}
245+
}

0 commit comments

Comments
 (0)