Skip to content

Commit e123b4f

Browse files
committed
Added Azure OpenAI support and support for Managed Identities (apikey-less) access
1 parent 294adfd commit e123b4f

File tree

17 files changed

+1410
-406
lines changed

17 files changed

+1410
-406
lines changed

.env.example

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,17 @@ HuggingFace_API_KEY=
1616
# You only need this environment variable set if you want to use GPT models
1717
OPENAI_API_KEY=
1818

19+
# Get your Azure Open AI API Key by following these instructions -
20+
# https://help.openai.com/en/articles/4936850-where-do-i-find-my-openai-api-key
21+
# You only need this environment variable set if you want to use GPT models
22+
AZURE_OPENAI_API_KEY=
23+
AZURE_OPENAI_ENDPOINT_NAME=
24+
AZURE_OPENAI_USE_MI=
25+
AZURE_OPENAI_VERSION=
26+
AZURE_TENANT_ID=
27+
AZURE_SUBSCRIPTION_ID=
28+
AZURE_RESOURCE_GROUP_NAME=
29+
1930
# Get your Anthropic API Key in your account settings -
2031
# https://console.anthropic.com/settings/keys
2132
# You only need this environment variable set if you want to use Claude models

Dockerfile

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,13 @@ FROM base AS bolt-ai-production
2323
ARG GROQ_API_KEY
2424
ARG HuggingFace_API_KEY
2525
ARG OPENAI_API_KEY
26+
ARG AZURE_OPENAI_API_KEY
27+
ARG AZURE_OPENAI_ENDPOINT_NAME
28+
ARG AZURE_OPENAI_USE_MI
29+
ARG AZURE_OPENAI_VERSION
30+
ARG AZURE_TENANT_ID
31+
ARG AZURE_SUBSCRIPTION_ID
32+
ARG AZURE_RESOURCE_GROUP_NAME
2633
ARG ANTHROPIC_API_KEY
2734
ARG OPEN_ROUTER_API_KEY
2835
ARG GOOGLE_GENERATIVE_AI_API_KEY
@@ -38,6 +45,13 @@ ENV WRANGLER_SEND_METRICS=false \
3845
GROQ_API_KEY=${GROQ_API_KEY} \
3946
HuggingFace_KEY=${HuggingFace_API_KEY} \
4047
OPENAI_API_KEY=${OPENAI_API_KEY} \
48+
AZURE_OPENAI_API_KEY=${AZURE_OPENAI_API_KEY} \
49+
AZURE_OPENAI_ENDPOINT_NAME=${AZURE_OPENAI_ENDPOINT_NAME} \
50+
AZURE_OPENAI_USE_MI=${AZURE_OPENAI_USE_MI} \
51+
AZURE_OPENAI_VERSION=${AZURE_OPENAI_VERSION} \
52+
AZURE_TENANT_ID=${AZURE_TENANT_ID} \
53+
AZURE_SUBSCRIPTION_ID=${AZURE_SUBSCRIPTION_ID} \
54+
AZURE_RESOURCE_GROUP_NAME=${AZURE_RESOURCE_GROUP_NAME} \
4155
ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY} \
4256
OPEN_ROUTER_API_KEY=${OPEN_ROUTER_API_KEY} \
4357
GOOGLE_GENERATIVE_AI_API_KEY=${GOOGLE_GENERATIVE_AI_API_KEY} \
@@ -65,6 +79,13 @@ FROM base AS bolt-ai-development
6579
ARG GROQ_API_KEY
6680
ARG HuggingFace
6781
ARG OPENAI_API_KEY
82+
ARG AZURE_OPENAI_API_KEY
83+
ARG AZURE_OPENAI_ENDPOINT_NAME
84+
ARG AZURE_OPENAI_USE_MI
85+
ARG AZURE_OPENAI_VERSION
86+
ARG AZURE_TENANT_ID
87+
ARG AZURE_SUBSCRIPTION_ID
88+
ARG AZURE_RESOURCE_GROUP_NAME
6889
ARG ANTHROPIC_API_KEY
6990
ARG OPEN_ROUTER_API_KEY
7091
ARG GOOGLE_GENERATIVE_AI_API_KEY
@@ -78,6 +99,13 @@ ARG DEFAULT_NUM_CTX
7899
ENV GROQ_API_KEY=${GROQ_API_KEY} \
79100
HuggingFace_API_KEY=${HuggingFace_API_KEY} \
80101
OPENAI_API_KEY=${OPENAI_API_KEY} \
102+
AZURE_OPENAI_API_KEY=${AZURE_OPENAI_API_KEY} \
103+
AZURE_OPENAI_ENDPOINT_NAME=${AZURE_OPENAI_ENDPOINT_NAME} \
104+
AZURE_OPENAI_USE_MI=${AZURE_OPENAI_USE_MI} \
105+
AZURE_OPENAI_VERSION=${AZURE_OPENAI_VERSION} \
106+
AZURE_TENANT_ID=${AZURE_TENANT_ID} \
107+
AZURE_SUBSCRIPTION_ID=${AZURE_SUBSCRIPTION_ID} \
108+
AZURE_RESOURCE_GROUP_NAME=${AZURE_RESOURCE_GROUP_NAME} \
81109
ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY} \
82110
OPEN_ROUTER_API_KEY=${OPEN_ROUTER_API_KEY} \
83111
GOOGLE_GENERATIVE_AI_API_KEY=${GOOGLE_GENERATIVE_AI_API_KEY} \

app/components/@settings/tabs/data/DataTab.tsx

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import { useState, useRef } from 'react';
21
import { motion } from 'framer-motion';
2+
import { useRef, useState } from 'react';
33
import { toast } from 'react-toastify';
4-
import { DialogRoot, DialogClose, Dialog, DialogTitle } from '~/components/ui/Dialog';
5-
import { db, getAll, deleteById } from '~/lib/persistence';
4+
import { Dialog, DialogClose, DialogRoot, DialogTitle } from '~/components/ui/Dialog';
5+
import { db, deleteById, getAll } from '~/lib/persistence';
66

77
export default function DataTab() {
88
const [isDownloadingTemplate, setIsDownloadingTemplate] = useState(false);
@@ -139,6 +139,13 @@ export default function DataTab() {
139139
const template = {
140140
Anthropic_API_KEY: '',
141141
OpenAI_API_KEY: '',
142+
AZURE_OPENAI_API_KEY: '',
143+
AZURE_OPENAI_ENDPOINT_NAME: '',
144+
AZURE_OPENAI_USE_MI: '',
145+
AZURE_OPENAI_VERSION: '',
146+
AZURE_TENANT_ID: '',
147+
AZURE_SUBSCRIPTION_ID: '',
148+
AZURE_RESOURCE_GROUP_NAME: '',
142149
Google_API_KEY: '',
143150
Groq_API_KEY: '',
144151
HuggingFace_API_KEY: '',

app/components/@settings/tabs/providers/status/ServiceStatusTab.tsx

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
1-
import React, { useEffect, useState, useCallback } from 'react';
21
import { motion } from 'framer-motion';
3-
import { classNames } from '~/utils/classNames';
4-
import { TbActivityHeartbeat } from 'react-icons/tb';
5-
import { BsCheckCircleFill, BsXCircleFill, BsExclamationCircleFill } from 'react-icons/bs';
6-
import { SiAmazon, SiGoogle, SiHuggingface, SiPerplexity, SiOpenai } from 'react-icons/si';
7-
import { BsRobot, BsCloud } from 'react-icons/bs';
8-
import { TbBrain } from 'react-icons/tb';
9-
import { BiChip, BiCodeBlock } from 'react-icons/bi';
10-
import { FaCloud, FaBrain } from 'react-icons/fa';
2+
import React, { useCallback, useEffect, useState } from 'react';
113
import type { IconType } from 'react-icons';
12-
import { useSettings } from '~/lib/hooks/useSettings';
4+
import { BiChip, BiCodeBlock } from 'react-icons/bi';
5+
import { BsCheckCircleFill, BsCloud, BsExclamationCircleFill, BsRobot, BsXCircleFill } from 'react-icons/bs';
6+
import { FaBrain, FaCloud } from 'react-icons/fa';
7+
import { SiAmazon, SiGoogle, SiHuggingface, SiOpenai, SiPerplexity } from 'react-icons/si';
8+
import { TbActivityHeartbeat, TbBrain, TbBrandAzure } from 'react-icons/tb';
139
import { useToast } from '~/components/ui/use-toast';
10+
import { useSettings } from '~/lib/hooks/useSettings';
11+
import { classNames } from '~/utils/classNames';
1412

1513
// Types
1614
type ProviderName =
@@ -23,6 +21,7 @@ type ProviderName =
2321
| 'HuggingFace'
2422
| 'Mistral'
2523
| 'OpenAI'
24+
| 'AzureOpenAI'
2625
| 'OpenRouter'
2726
| 'Perplexity'
2827
| 'Together'
@@ -73,6 +72,15 @@ const PROVIDER_STATUS_URLS: Record<ProviderName, ProviderConfig> = {
7372
},
7473
testModel: 'gpt-3.5-turbo',
7574
},
75+
AzureOpenAI: {
76+
statusUrl: 'https://azure.status.microsoft/en-us/status',
77+
apiUrl:
78+
'https://$AZURE_OPENAI_API_KEY.openai.azure.com/openai/deployments/gpt-4o-mini/chat/completions?api-version=2024-02-15-preview',
79+
headers: {
80+
Authorization: 'Bearer $AZURE_OPENAI_API_KEY',
81+
},
82+
testModel: 'gpt-4o-mini',
83+
},
7684
Anthropic: {
7785
statusUrl: 'https://status.anthropic.com/',
7886
apiUrl: 'https://api.anthropic.com/v1/messages',
@@ -181,6 +189,7 @@ const PROVIDER_ICONS: Record<ProviderName, IconType> = {
181189
HuggingFace: SiHuggingface,
182190
Mistral: TbBrain,
183191
OpenAI: SiOpenai,
192+
AzureOpenAI: TbBrandAzure,
184193
OpenRouter: FaCloud,
185194
Perplexity: SiPerplexity,
186195
Together: BsCloud,
@@ -208,6 +217,7 @@ const ServiceStatusTab = () => {
208217
// Map provider names to environment variable names
209218
const envKeyMap: Record<ProviderName, string> = {
210219
OpenAI: 'OPENAI_API_KEY',
220+
AzureOpenAI: 'AZURE_OPENAI_API_KEY',
211221
Anthropic: 'ANTHROPIC_API_KEY',
212222
Cohere: 'COHERE_API_KEY',
213223
Google: 'GOOGLE_GENERATIVE_AI_API_KEY',

0 commit comments

Comments
 (0)