From 401c50ae9723b9aee1d5072a07270b58c9cf5f9f Mon Sep 17 00:00:00 2001 From: Daniel Sill Date: Wed, 4 Mar 2026 16:01:11 -0500 Subject: [PATCH 1/8] Fix website monitor LLM toggle to set context_classifier='llm' - Set context_classifier: "llm" when LLM toggle is enabled, clear it when disabled - Detect existing LLM config via context_classifier === "llm" instead of llm_model_override - Include llm_model_override only when explicitly provided (optional) Co-Authored-By: Claude Sonnet 4.6 --- .../ConfigureWebsiteMonitorForm.tsx | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/clients/admin-ui/src/features/integrations/configure-monitor/ConfigureWebsiteMonitorForm.tsx b/clients/admin-ui/src/features/integrations/configure-monitor/ConfigureWebsiteMonitorForm.tsx index 616e150e61..543c2f5095 100644 --- a/clients/admin-ui/src/features/integrations/configure-monitor/ConfigureWebsiteMonitorForm.tsx +++ b/clients/admin-ui/src/features/integrations/configure-monitor/ConfigureWebsiteMonitorForm.tsx @@ -116,7 +116,7 @@ const ConfigureWebsiteMonitorForm = ({ // Check if monitor currently uses LLM classifier const monitorUsesLlmClassifier = - !!monitor?.classify_params?.llm_model_override; + monitor?.classify_params?.context_classifier === "llm"; const initialValues: WebsiteMonitorConfigFormValues = { name: monitor?.name || "", @@ -151,12 +151,19 @@ const ConfigureWebsiteMonitorForm = ({ }; // Build classify_params based on LLM classifier toggle - const classifyParams = { - ...(monitor?.classify_params || {}), - llm_model_override: values.use_llm_classifier - ? values.llm_model_override - : undefined, - }; + const classifyParams = values.use_llm_classifier + ? { + ...(monitor?.classify_params || {}), + context_classifier: "llm", + ...(values.llm_model_override && { + llm_model_override: values.llm_model_override, + }), + } + : { + ...(monitor?.classify_params || {}), + context_classifier: undefined, + llm_model_override: undefined, + }; // Destructure form-only fields to exclude them from payload // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-unused-vars const { From f02a25b1fc31c1346101b1b9f865f7ed9e8fada0 Mon Sep 17 00:00:00 2001 From: Daniel Sill Date: Wed, 4 Mar 2026 16:03:08 -0500 Subject: [PATCH 2/8] add changelog for PR #7566 --- .../7566-fix-website-monitor-llm-context-classifier.yaml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 changelog/7566-fix-website-monitor-llm-context-classifier.yaml diff --git a/changelog/7566-fix-website-monitor-llm-context-classifier.yaml b/changelog/7566-fix-website-monitor-llm-context-classifier.yaml new file mode 100644 index 0000000000..04b6aae93e --- /dev/null +++ b/changelog/7566-fix-website-monitor-llm-context-classifier.yaml @@ -0,0 +1,4 @@ +type: Fixed +description: Fixed website monitor LLM toggle to set context_classifier when enabling LLM classification +pr: 7566 +labels: [] From 57ae375b67ed7e1068fb316ae0294999aa4ff4c7 Mon Sep 17 00:00:00 2001 From: Daniel Sill Date: Wed, 4 Mar 2026 16:09:18 -0500 Subject: [PATCH 3/8] Fix Save button briefly disabled when LLM toggle flipped --- .../ConfigureWebsiteMonitorForm.tsx | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/clients/admin-ui/src/features/integrations/configure-monitor/ConfigureWebsiteMonitorForm.tsx b/clients/admin-ui/src/features/integrations/configure-monitor/ConfigureWebsiteMonitorForm.tsx index 543c2f5095..a4be83c47b 100644 --- a/clients/admin-ui/src/features/integrations/configure-monitor/ConfigureWebsiteMonitorForm.tsx +++ b/clients/admin-ui/src/features/integrations/configure-monitor/ConfigureWebsiteMonitorForm.tsx @@ -185,10 +185,15 @@ const ConfigureWebsiteMonitorForm = ({ }; useEffect(() => { - form - .validateFields({ validateOnly: true }) - .then(() => setSubmittable(true)) - .catch(() => setSubmittable(false)); + // Defer validation to allow dynamically mounted Form.Items (e.g. LlmModelSelector) + // to finish registering with the form before validateFields runs. + const timer = setTimeout(() => { + form + .validateFields({ validateOnly: true }) + .then(() => setSubmittable(true)) + .catch(() => setSubmittable(false)); + }, 0); + return () => clearTimeout(timer); }, [form, formValues]); // TODO: build better pattern for async form initialization From 6179da91e1ab605a093ffc363d787a31120c65c0 Mon Sep 17 00:00:00 2001 From: Daniel Sill Date: Wed, 4 Mar 2026 16:14:40 -0500 Subject: [PATCH 4/8] Remove stale llm_model_override from classify_params when not provided --- .../configure-monitor/ConfigureWebsiteMonitorForm.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/clients/admin-ui/src/features/integrations/configure-monitor/ConfigureWebsiteMonitorForm.tsx b/clients/admin-ui/src/features/integrations/configure-monitor/ConfigureWebsiteMonitorForm.tsx index a4be83c47b..ebf5502f5d 100644 --- a/clients/admin-ui/src/features/integrations/configure-monitor/ConfigureWebsiteMonitorForm.tsx +++ b/clients/admin-ui/src/features/integrations/configure-monitor/ConfigureWebsiteMonitorForm.tsx @@ -151,18 +151,19 @@ const ConfigureWebsiteMonitorForm = ({ }; // Build classify_params based on LLM classifier toggle + const { llm_model_override: _omit, ...baseClassifyParams } = + monitor?.classify_params || {}; const classifyParams = values.use_llm_classifier ? { - ...(monitor?.classify_params || {}), + ...baseClassifyParams, context_classifier: "llm", ...(values.llm_model_override && { llm_model_override: values.llm_model_override, }), } : { - ...(monitor?.classify_params || {}), + ...baseClassifyParams, context_classifier: undefined, - llm_model_override: undefined, }; // Destructure form-only fields to exclude them from payload // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-unused-vars From 271b1d4f1178c1922abf8e8ec0921acc5680c8ed Mon Sep 17 00:00:00 2001 From: Daniel Sill Date: Wed, 4 Mar 2026 16:24:51 -0500 Subject: [PATCH 5/8] Fix linting: avoid unused _omit variable in classifyParams --- .../configure-monitor/ConfigureWebsiteMonitorForm.tsx | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/clients/admin-ui/src/features/integrations/configure-monitor/ConfigureWebsiteMonitorForm.tsx b/clients/admin-ui/src/features/integrations/configure-monitor/ConfigureWebsiteMonitorForm.tsx index ebf5502f5d..a13f514ee0 100644 --- a/clients/admin-ui/src/features/integrations/configure-monitor/ConfigureWebsiteMonitorForm.tsx +++ b/clients/admin-ui/src/features/integrations/configure-monitor/ConfigureWebsiteMonitorForm.tsx @@ -151,19 +151,16 @@ const ConfigureWebsiteMonitorForm = ({ }; // Build classify_params based on LLM classifier toggle - const { llm_model_override: _omit, ...baseClassifyParams } = - monitor?.classify_params || {}; const classifyParams = values.use_llm_classifier ? { - ...baseClassifyParams, + ...(monitor?.classify_params || {}), context_classifier: "llm", - ...(values.llm_model_override && { - llm_model_override: values.llm_model_override, - }), + llm_model_override: values.llm_model_override || undefined, } : { - ...baseClassifyParams, + ...(monitor?.classify_params || {}), context_classifier: undefined, + llm_model_override: undefined, }; // Destructure form-only fields to exclude them from payload // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-unused-vars From 41e32e35a1cd15a2ec66c57a3a890adefa58e962 Mon Sep 17 00:00:00 2001 From: Daniel Sill Date: Wed, 4 Mar 2026 20:11:15 -0500 Subject: [PATCH 6/8] Address PR review feedback - Simplify classifyParams to a flat object spread - Use hidden prop on LLM model override Form.Item instead of conditional rendering, eliminating the need for the setTimeout(0) validation workaround Co-Authored-By: Claude Sonnet 4.6 --- .../features/common/form/LlmModelSelector.tsx | 43 +++++++++---------- .../ConfigureWebsiteMonitorForm.tsx | 29 ++++--------- 2 files changed, 29 insertions(+), 43 deletions(-) diff --git a/clients/admin-ui/src/features/common/form/LlmModelSelector.tsx b/clients/admin-ui/src/features/common/form/LlmModelSelector.tsx index f01aa643be..ccc23a49a1 100644 --- a/clients/admin-ui/src/features/common/form/LlmModelSelector.tsx +++ b/clients/admin-ui/src/features/common/form/LlmModelSelector.tsx @@ -126,29 +126,26 @@ export const LlmModelSelector = ({ /> )} - {showModelField && ( - - {modelOverrideLabel} - - ) : ( - modelOverrideLabel - ) - } - tooltip={ - serverSupportsLlmClassifier ? modelOverrideTooltip : undefined - } - > - - - )} + + {modelOverrideLabel} + + ) : ( + modelOverrideLabel + ) + } + tooltip={serverSupportsLlmClassifier ? modelOverrideTooltip : undefined} + hidden={!showModelField} + > + + ); }; diff --git a/clients/admin-ui/src/features/integrations/configure-monitor/ConfigureWebsiteMonitorForm.tsx b/clients/admin-ui/src/features/integrations/configure-monitor/ConfigureWebsiteMonitorForm.tsx index a13f514ee0..2853f2c39f 100644 --- a/clients/admin-ui/src/features/integrations/configure-monitor/ConfigureWebsiteMonitorForm.tsx +++ b/clients/admin-ui/src/features/integrations/configure-monitor/ConfigureWebsiteMonitorForm.tsx @@ -151,17 +151,11 @@ const ConfigureWebsiteMonitorForm = ({ }; // Build classify_params based on LLM classifier toggle - const classifyParams = values.use_llm_classifier - ? { - ...(monitor?.classify_params || {}), - context_classifier: "llm", - llm_model_override: values.llm_model_override || undefined, - } - : { - ...(monitor?.classify_params || {}), - context_classifier: undefined, - llm_model_override: undefined, - }; + const classifyParams = { + ...(monitor?.classify_params ?? {}), + context_classifier: values.use_llm_classifier ? "llm" : undefined, + llm_model_override: values.llm_model_override || undefined, + }; // Destructure form-only fields to exclude them from payload // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-unused-vars const { @@ -183,15 +177,10 @@ const ConfigureWebsiteMonitorForm = ({ }; useEffect(() => { - // Defer validation to allow dynamically mounted Form.Items (e.g. LlmModelSelector) - // to finish registering with the form before validateFields runs. - const timer = setTimeout(() => { - form - .validateFields({ validateOnly: true }) - .then(() => setSubmittable(true)) - .catch(() => setSubmittable(false)); - }, 0); - return () => clearTimeout(timer); + form + .validateFields({ validateOnly: true }) + .then(() => setSubmittable(true)) + .catch(() => setSubmittable(false)); }, [form, formValues]); // TODO: build better pattern for async form initialization From d94a28952a7a568ab0d4c4a513f28a7b599e2751 Mon Sep 17 00:00:00 2001 From: Daniel Sill Date: Thu, 5 Mar 2026 10:09:47 -0500 Subject: [PATCH 7/8] Fix test assertions for LlmModelSelector hidden field The model override Form.Item now uses hidden prop instead of conditional rendering, so the input is always in the DOM. Update assertions from not.toBeInTheDocument / not.exist to not.toBeVisible / not.be.visible. Co-Authored-By: Claude Sonnet 4.6 --- .../features/common/form/LlmModelSelector.test.tsx | 4 ++-- clients/admin-ui/cypress/e2e/integration-management.cy.ts | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/clients/admin-ui/__tests__/features/common/form/LlmModelSelector.test.tsx b/clients/admin-ui/__tests__/features/common/form/LlmModelSelector.test.tsx index 942cc835b6..a5b36e7ded 100644 --- a/clients/admin-ui/__tests__/features/common/form/LlmModelSelector.test.tsx +++ b/clients/admin-ui/__tests__/features/common/form/LlmModelSelector.test.tsx @@ -113,7 +113,7 @@ describe("LlmModelSelector", () => { expect( screen.queryByTestId("input-llm_model_override"), - ).not.toBeInTheDocument(); + ).not.toBeVisible(); }); it("shows model override field when switch is on", () => { @@ -195,7 +195,7 @@ describe("LlmModelSelector", () => { expect( screen.queryByTestId("input-llm_model_override"), - ).not.toBeInTheDocument(); + ).not.toBeVisible(); }); }); diff --git a/clients/admin-ui/cypress/e2e/integration-management.cy.ts b/clients/admin-ui/cypress/e2e/integration-management.cy.ts index 7082551ad2..51545da464 100644 --- a/clients/admin-ui/cypress/e2e/integration-management.cy.ts +++ b/clients/admin-ui/cypress/e2e/integration-management.cy.ts @@ -821,7 +821,7 @@ describe("Integration management for data detection & discovery", () => { // Toggle it back off cy.getByTestId("input-use_llm_classifier").click(); - cy.getByTestId("input-llm_model_override").should("not.exist"); + cy.getByTestId("input-llm_model_override").should("not.be.visible"); cy.getByTestId("controlled-select-prompt_template").should( "not.exist", ); @@ -846,8 +846,8 @@ describe("Integration management for data detection & discovery", () => { .should("exist") .should("be.disabled"); - // LLM fields should not exist - cy.getByTestId("input-llm_model_override").should("not.exist"); + // LLM fields should not be visible + cy.getByTestId("input-llm_model_override").should("not.be.visible"); cy.getByTestId("controlled-select-prompt_template").should( "not.exist", ); From ef09d09940cfa347aad8e8ec82eb84eea78e195d Mon Sep 17 00:00:00 2001 From: Daniel Sill Date: Thu, 5 Mar 2026 11:53:06 -0500 Subject: [PATCH 8/8] fix: stabilize bulk-vendor-add redirect test Wait for dictionary to load before checking rows (dictionary reload was resetting row selections), and wait for POST to complete before checking URL redirect. Co-Authored-By: Claude Sonnet 4.6 --- .../admin-ui/cypress/e2e/systems/plus/bulk-vendor-add.cy.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/clients/admin-ui/cypress/e2e/systems/plus/bulk-vendor-add.cy.ts b/clients/admin-ui/cypress/e2e/systems/plus/bulk-vendor-add.cy.ts index da9f796921..bb223f8aaf 100644 --- a/clients/admin-ui/cypress/e2e/systems/plus/bulk-vendor-add.cy.ts +++ b/clients/admin-ui/cypress/e2e/systems/plus/bulk-vendor-add.cy.ts @@ -86,12 +86,18 @@ describe("Plus Bulk Vendor Add", () => { stubDatamap(); cy.visit(ADD_SYSTEMS_MULTIPLE_ROUTE); cy.wait("@getSystemVendors"); + cy.wait("@getDict"); + // unreliable test because when dictionary loads it overrides the rows selected + // adding a .wait to make it more reliable + // eslint-disable-next-line cypress/no-unnecessary-waiting + cy.wait(500); cy.get('[type="checkbox"').check({ force: true }); cy.getByTestId("add-multiple-systems-btn") .should("exist") .click({ force: true }); cy.getByTestId("confirmation-modal"); cy.getByTestId("continue-btn").click({ force: true }); + cy.wait("@postSystemVendors"); cy.url().should("include", DATAMAP_ROUTE); });