Skip to content

Commit f0f8c94

Browse files
committed
feat: Add Amazon Bedrock provider support with AWS credentials configuration
1 parent e46c8d4 commit f0f8c94

File tree

17 files changed

+614
-6
lines changed

17 files changed

+614
-6
lines changed

client/public/bedrock_logo.png

614 Bytes
Loading

client/src/components/ChatTab.tsx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,15 @@ export function ChatTab({
345345
className="w-8 h-8 object-contain opacity-70 hover:opacity-100 transition-opacity"
346346
/>
347347
</div>
348+
349+
{/* Amazon Bedrock */}
350+
<div className="flex items-center justify-center">
351+
<img
352+
src="/bedrock_logo.png"
353+
alt="Amazon Bedrock"
354+
className="w-8 h-8 object-contain opacity-70 hover:opacity-100 transition-opacity"
355+
/>
356+
</div>
348357
</div>
349358

350359
{/* CTA */}

client/src/components/ChatTabV2.tsx

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ export function ChatTabV2() {
4343
getLiteLLMModelAlias,
4444
getOpenRouterSelectedModels,
4545
getOllamaBaseUrl,
46+
getBedrockRegion,
47+
getBedrockSecretKey,
4648
} = useAiProviderKeys();
4749

4850
const [input, setInput] = useState("");
@@ -95,10 +97,22 @@ export function ChatTabV2() {
9597
apiKey: apiKey,
9698
temperature,
9799
systemPrompt,
100+
ollamaBaseUrl: getOllamaBaseUrl(),
101+
bedrockRegion: getBedrockRegion(),
102+
bedrockSecretKey: getBedrockSecretKey(),
98103
},
99104
headers: authHeaders,
100105
});
101-
}, [selectedModel, getToken, authHeaders, temperature, systemPrompt]);
106+
}, [
107+
selectedModel,
108+
getToken,
109+
authHeaders,
110+
temperature,
111+
systemPrompt,
112+
getOllamaBaseUrl,
113+
getBedrockRegion,
114+
getBedrockSecretKey,
115+
]);
102116

103117
useEffect(() => {
104118
let active = true;

client/src/components/SettingsTab.tsx

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { ProviderConfigDialog } from "./setting/ProviderConfigDialog";
55
import { OllamaConfigDialog } from "./setting/OllamaConfigDialog";
66
import { LiteLLMConfigDialog } from "./setting/LiteLLMConfigDialog";
77
import { OpenRouterConfigDialog } from "./setting/OpenRouterConfigDialog";
8+
import { BedrockConfigDialog } from "./setting/BedrockConfigDialog";
89
import { AccountApiKeySection } from "./setting/AccountApiKeySection";
910

1011
interface ProviderConfig {
@@ -31,6 +32,10 @@ export function SettingsTab() {
3132
setLiteLLMModelAlias,
3233
getOpenRouterSelectedModels,
3334
setOpenRouterSelectedModels,
35+
getBedrockRegion,
36+
setBedrockRegion,
37+
getBedrockSecretKey,
38+
setBedrockSecretKey,
3439
} = useAiProviderKeys();
3540

3641
const [editingValue, setEditingValue] = useState("");
@@ -47,6 +52,10 @@ export function SettingsTab() {
4752
const [openRouterApiKeyInput, setOpenRouterApiKeyInput] = useState("");
4853
const [openRouterSelectedModelsInput, setOpenRouterSelectedModelsInput] =
4954
useState<string[]>([]);
55+
const [bedrockDialogOpen, setBedrockDialogOpen] = useState(false);
56+
const [bedrockAccessKeyIdInput, setBedrockAccessKeyIdInput] = useState("");
57+
const [bedrockSecretKeyInput, setBedrockSecretKeyInput] = useState("");
58+
const [bedrockRegionInput, setBedrockRegionInput] = useState("");
5059

5160
const providerConfigs: ProviderConfig[] = [
5261
{
@@ -94,9 +103,23 @@ export function SettingsTab() {
94103
placeholder: "...",
95104
getApiKeyUrl: "https://console.mistral.ai/api-keys/",
96105
},
106+
{
107+
id: "bedrock",
108+
name: "Amazon Bedrock",
109+
logo: "/bedrock_logo.png",
110+
logoAlt: "Amazon Bedrock",
111+
description: "Claude 3.5, Llama 3, Mistral models on AWS Bedrock",
112+
placeholder: "AWS Access Key ID",
113+
getApiKeyUrl: "https://console.aws.amazon.com/iam/",
114+
},
97115
];
98116

99117
const handleEdit = (providerId: string) => {
118+
if (providerId === "bedrock") {
119+
handleBedrockEdit();
120+
return;
121+
}
122+
100123
const provider = providerConfigs.find((p) => p.id === providerId);
101124
if (provider) {
102125
setSelectedProvider(provider);
@@ -129,6 +152,11 @@ export function SettingsTab() {
129152
if (providerId === "openrouter") {
130153
setOpenRouterSelectedModels([]);
131154
}
155+
// Also clear Bedrock credentials if deleting Bedrock provider
156+
if (providerId === "bedrock") {
157+
setBedrockSecretKey("");
158+
setBedrockRegion("");
159+
}
132160
};
133161

134162
const handleOllamaEdit = () => {
@@ -194,6 +222,30 @@ export function SettingsTab() {
194222
setOpenRouterSelectedModelsInput([]);
195223
};
196224

225+
const handleBedrockEdit = () => {
226+
setBedrockAccessKeyIdInput(tokens.bedrock || "");
227+
setBedrockSecretKeyInput(getBedrockSecretKey());
228+
setBedrockRegionInput(getBedrockRegion());
229+
setBedrockDialogOpen(true);
230+
};
231+
232+
const handleBedrockSave = () => {
233+
setToken("bedrock", bedrockAccessKeyIdInput);
234+
setBedrockSecretKey(bedrockSecretKeyInput);
235+
setBedrockRegion(bedrockRegionInput);
236+
setBedrockDialogOpen(false);
237+
setBedrockAccessKeyIdInput("");
238+
setBedrockSecretKeyInput("");
239+
setBedrockRegionInput("");
240+
};
241+
242+
const handleBedrockCancel = () => {
243+
setBedrockDialogOpen(false);
244+
setBedrockAccessKeyIdInput("");
245+
setBedrockSecretKeyInput("");
246+
setBedrockRegionInput("");
247+
};
248+
197249
return (
198250
<div className="container mx-auto p-6 max-w-6xl space-y-8">
199251
<div className="flex items-center gap-3 mb-6">
@@ -268,6 +320,20 @@ export function SettingsTab() {
268320
onSave={handleOpenRouterSave}
269321
onCancel={handleOpenRouterCancel}
270322
/>
323+
324+
{/* Bedrock Configuration Dialog */}
325+
<BedrockConfigDialog
326+
open={bedrockDialogOpen}
327+
onOpenChange={setBedrockDialogOpen}
328+
accessKeyId={bedrockAccessKeyIdInput}
329+
secretKey={bedrockSecretKeyInput}
330+
region={bedrockRegionInput}
331+
onAccessKeyIdChange={setBedrockAccessKeyIdInput}
332+
onSecretKeyChange={setBedrockSecretKeyInput}
333+
onRegionChange={setBedrockRegionInput}
334+
onSave={handleBedrockSave}
335+
onCancel={handleBedrockCancel}
336+
/>
271337
</div>
272338
);
273339
}

client/src/components/chat-v2/chat-helpers.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import openrouterLogo from "/openrouter_logo.png";
1414
import moonshotLightLogo from "/moonshot_light.png";
1515
import moonshotDarkLogo from "/moonshot_dark.png";
1616
import zAiLogo from "/z-ai.png";
17+
import bedrockLogo from "/bedrock_logo.png";
1718

1819
export const getProviderLogoFromProvider = (
1920
provider: string,
@@ -68,6 +69,8 @@ export const getProviderLogoFromProvider = (
6869
return moonshotLightLogo;
6970
case "z-ai":
7071
return zAiLogo;
72+
case "bedrock":
73+
return bedrockLogo;
7174
default:
7275
return null;
7376
}
@@ -104,6 +107,8 @@ export const getProviderColor = (provider: string) => {
104107
return "text-indigo-600 dark:text-indigo-400";
105108
case "meta":
106109
return "text-blue-500 dark:text-blue-400";
110+
case "bedrock":
111+
return "text-orange-500 dark:text-orange-400";
107112
default:
108113
return "text-blue-600 dark:text-blue-400";
109114
}

client/src/components/chat-v2/model-helpers.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ export function buildAvailableModels(params: {
4646
openrouter: Boolean(
4747
hasToken("openrouter") && getOpenRouterSelectedModels().length > 0,
4848
),
49+
bedrock: hasToken("bedrock"),
4950
meta: false,
5051
"x-ai": false,
5152
} as const;

client/src/components/chat/chat-helpers.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import openrouterLogo from "/openrouter_logo.png";
1414
import moonshotLightLogo from "/moonshot_light.png";
1515
import moonshotDarkLogo from "/moonshot_dark.png";
1616
import zAiLogo from "/z-ai.png";
17+
import bedrockLogo from "/bedrock_logo.png";
1718

1819
export const getProviderLogoFromProvider = (
1920
provider: string,
@@ -68,6 +69,8 @@ export const getProviderLogoFromProvider = (
6869
return moonshotLightLogo;
6970
case "z-ai":
7071
return zAiLogo;
72+
case "bedrock":
73+
return bedrockLogo;
7174
default:
7275
return null;
7376
}
@@ -104,6 +107,8 @@ export const getProviderColor = (provider: string) => {
104107
return "text-indigo-600 dark:text-indigo-400";
105108
case "meta":
106109
return "text-blue-500 dark:text-blue-400";
110+
case "bedrock":
111+
return "text-orange-500 dark:text-orange-400";
107112
default:
108113
return "text-blue-600 dark:text-blue-400";
109114
}

0 commit comments

Comments
 (0)