diff --git a/site/src/pages/AgentsPage/AgentSettingsModelsPage.tsx b/site/src/pages/AgentsPage/AgentSettingsModelsPage.tsx index 4b8c50fd96..b045ee8756 100644 --- a/site/src/pages/AgentsPage/AgentSettingsModelsPage.tsx +++ b/site/src/pages/AgentsPage/AgentSettingsModelsPage.tsx @@ -1,5 +1,6 @@ import type { FC } from "react"; import { useMutation, useQuery, useQueryClient } from "react-query"; +import { API } from "#/api/api"; import { chatModelConfigs, chatModels, @@ -84,6 +85,9 @@ const AgentSettingsModelsPage: FC = () => { onUpdateModel={(modelConfigId, req) => updateModelMutation.mutateAsync({ modelConfigId, req }) } + onCascadeUpdateModel={(modelConfigId, req) => + API.experimental.updateChatModelConfig(modelConfigId, req) + } onDeleteModel={(id) => deleteModelMutation.mutateAsync(id)} isCreatingModel={createModelMutation.isPending} isUpdatingModel={updateModelMutation.isPending} diff --git a/site/src/pages/AgentsPage/AgentSettingsProvidersPage.tsx b/site/src/pages/AgentsPage/AgentSettingsProvidersPage.tsx index 7fc3f3396c..e5cdfa1abc 100644 --- a/site/src/pages/AgentsPage/AgentSettingsProvidersPage.tsx +++ b/site/src/pages/AgentsPage/AgentSettingsProvidersPage.tsx @@ -1,5 +1,6 @@ import type { FC } from "react"; import { useMutation, useQuery, useQueryClient } from "react-query"; +import { API } from "#/api/api"; import { chatModelConfigs, chatModels, @@ -84,6 +85,9 @@ const AgentSettingsProvidersPage: FC = () => { onUpdateModel={(modelConfigId, req) => updateModelMutation.mutateAsync({ modelConfigId, req }) } + onCascadeUpdateModel={(modelConfigId, req) => + API.experimental.updateChatModelConfig(modelConfigId, req) + } onDeleteModel={(id) => deleteModelMutation.mutateAsync(id)} isCreatingModel={createModelMutation.isPending} isUpdatingModel={updateModelMutation.isPending} diff --git a/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ChatModelAdminPanel.stories.tsx b/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ChatModelAdminPanel.stories.tsx index 98a8ed406d..bfb6de7220 100644 --- a/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ChatModelAdminPanel.stories.tsx +++ b/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ChatModelAdminPanel.stories.tsx @@ -246,6 +246,7 @@ const meta: Meta = { providerMutationError: null, onCreateModel: fn(async () => ({})), onUpdateModel: fn(async () => ({})), + onCascadeUpdateModel: fn(async () => ({})), onDeleteModel: fn(async () => undefined), isCreatingModel: false, isUpdatingModel: false, @@ -2380,7 +2381,7 @@ export const ProviderDeleteWaitingForModels: Story = { await body.findByRole("button", { name: "Delete provider" }), ).toBeDisabled(); expect(args.onDeleteProvider).not.toHaveBeenCalled(); - expect(args.onUpdateModel).not.toHaveBeenCalled(); + expect(args.onCascadeUpdateModel).not.toHaveBeenCalled(); }, }; @@ -2476,19 +2477,19 @@ export const ProviderDeleteConfirmed: Story = { ); await waitFor(() => { - expect(args.onUpdateModel).toHaveBeenCalledTimes(3); + expect(args.onCascadeUpdateModel).toHaveBeenCalledTimes(3); }); - expect(args.onUpdateModel).toHaveBeenNthCalledWith( + expect(args.onCascadeUpdateModel).toHaveBeenNthCalledWith( 1, "model-anthropic-fallback", { is_default: true }, ); - expect(args.onUpdateModel).toHaveBeenNthCalledWith( + expect(args.onCascadeUpdateModel).toHaveBeenNthCalledWith( 2, "model-openai-default", { enabled: false }, ); - expect(args.onUpdateModel).toHaveBeenNthCalledWith( + expect(args.onCascadeUpdateModel).toHaveBeenNthCalledWith( 3, "model-openai-secondary", { enabled: false }, @@ -2503,7 +2504,7 @@ export const ProviderDeleteConfirmed: Story = { export const ProviderDeleteCascadeFailure: Story = { args: { ...providerDeleteCascadeArgs, - onUpdateModel: fn(async (id: string) => { + onCascadeUpdateModel: fn(async (id: string) => { if (id === "model-openai-default") { throw new Error("Failed to disable model."); } @@ -2520,13 +2521,14 @@ export const ProviderDeleteCascadeFailure: Story = { ); await waitFor(() => { - expect(args.onUpdateModel).toHaveBeenCalledWith( + expect(args.onCascadeUpdateModel).toHaveBeenCalledWith( "model-anthropic-fallback", { is_default: true }, ); - expect(args.onUpdateModel).toHaveBeenCalledWith("model-openai-default", { - enabled: false, - }); + expect(args.onCascadeUpdateModel).toHaveBeenCalledWith( + "model-openai-default", + { enabled: false }, + ); }); expect(args.onDeleteProvider).not.toHaveBeenCalled(); await expect(await body.findByRole("dialog")).toBeInTheDocument(); diff --git a/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ChatModelAdminPanel.tsx b/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ChatModelAdminPanel.tsx index 26e7c455e0..26600d8c77 100644 --- a/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ChatModelAdminPanel.tsx +++ b/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ChatModelAdminPanel.tsx @@ -259,6 +259,10 @@ interface ChatModelAdminPanelProps { modelConfigId: string, req: TypesGen.UpdateChatModelConfigRequest, ) => Promise; + onCascadeUpdateModel: ( + modelConfigId: string, + req: TypesGen.UpdateChatModelConfigRequest, + ) => Promise; onDeleteModel: (modelConfigId: string) => Promise; isCreatingModel: boolean; isUpdatingModel: boolean; @@ -285,6 +289,7 @@ export const ChatModelAdminPanel: FC = ({ providerMutationError, onCreateModel, onUpdateModel, + onCascadeUpdateModel, onDeleteModel, isCreatingModel, isUpdatingModel, @@ -327,7 +332,7 @@ export const ChatModelAdminPanel: FC = ({ onCreateProvider={onCreateProvider} onUpdateProvider={onUpdateProvider} onDeleteProvider={onDeleteProvider} - onUpdateModel={onUpdateModel} + onCascadeUpdateModel={onCascadeUpdateModel} allModelConfigs={modelConfigs} /> ) : ( diff --git a/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ProviderForm.tsx b/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ProviderForm.tsx index 83723de969..979b67f1b1 100644 --- a/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ProviderForm.tsx +++ b/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ProviderForm.tsx @@ -51,7 +51,7 @@ interface ProviderFormProps { req: TypesGen.UpdateChatProviderConfigRequest, ) => Promise; onDeleteProvider: (providerConfigId: string) => Promise; - onUpdateModel: ( + onCascadeUpdateModel: ( modelConfigId: string, req: TypesGen.UpdateChatModelConfigRequest, ) => Promise; @@ -67,7 +67,7 @@ export const ProviderForm: FC = ({ onCreateProvider, onUpdateProvider, onDeleteProvider, - onUpdateModel, + onCascadeUpdateModel, allModelConfigs, onBack, }) => { @@ -423,7 +423,7 @@ export const ProviderForm: FC = ({ await cascadeDisableProviderModels({ associatedModels: providerState.modelConfigs, allModels: allModelConfigs, - updateModelConfig: onUpdateModel, + updateModelConfig: onCascadeUpdateModel, }); } catch (error) { toast.error( diff --git a/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ProvidersSection.tsx b/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ProvidersSection.tsx index 2b3f52e160..0b8b9be23e 100644 --- a/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ProvidersSection.tsx +++ b/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ProvidersSection.tsx @@ -82,7 +82,7 @@ interface ProvidersSectionProps { req: UpdateChatProviderConfigRequest, ) => Promise; onDeleteProvider: (providerConfigId: string) => Promise; - onUpdateModel: ( + onCascadeUpdateModel: ( modelConfigId: string, req: UpdateChatModelConfigRequest, ) => Promise; @@ -99,7 +99,7 @@ export const ProvidersSection: FC = ({ onCreateProvider, onUpdateProvider, onDeleteProvider, - onUpdateModel, + onCascadeUpdateModel, allModelConfigs, }) => { const [searchParams, setSearchParams] = useSearchParams(); @@ -210,7 +210,7 @@ export const ProvidersSection: FC = ({ } }} onBack={clearProviderView} - onUpdateModel={onUpdateModel} + onCascadeUpdateModel={onCascadeUpdateModel} allModelConfigs={allModelConfigs} /> );