From eb2a0e1a076ec28bb25731063ce7659ec7c1bfcc Mon Sep 17 00:00:00 2001 From: nishika26 Date: Mon, 4 May 2026 10:13:35 +0530 Subject: [PATCH 1/6] fixing updating validator --- app/(main)/guardrails/page.tsx | 64 +++++++++++++++++++++------------- app/lib/types/guardrails.ts | 15 ++++++++ 2 files changed, 55 insertions(+), 24 deletions(-) diff --git a/app/(main)/guardrails/page.tsx b/app/(main)/guardrails/page.tsx index 4d31775d..829e4957 100644 --- a/app/(main)/guardrails/page.tsx +++ b/app/(main)/guardrails/page.tsx @@ -16,6 +16,7 @@ import { Validator, SavedValidatorConfig, OrgContext, + buildValidatorUpdatePayload, } from "@/app/lib/types/guardrails"; import ValidatorConfigPanel from "@/app/components/guardrails/ValidatorConfigPanel"; import SavedConfigsList from "@/app/components/guardrails/SavedConfigsList"; @@ -74,28 +75,34 @@ export default function GuardrailsPage() { ? `?organization_id=${parseInt(String(orgContext.organization_id), 10)}&project_id=${parseInt(String(orgContext.project_id), 10)}` : null; - const fetchSavedConfigs = useCallback(() => { - if (!configsQueryString) return; + const fetchSavedConfigs = useCallback(async (): Promise< + SavedValidatorConfig[] + > => { + if (!configsQueryString) return []; setSavedConfigsLoading(true); - guardrailsFetch<{ - data?: { configs?: SavedValidatorConfig[] } | SavedValidatorConfig[]; - configs?: SavedValidatorConfig[]; - }>(`/api/guardrails/validators/configs${configsQueryString}`, apiKey) - .then((data) => { - const nested = data?.data; - const list: SavedValidatorConfig[] = Array.isArray( - (nested as { configs?: SavedValidatorConfig[] })?.configs, - ) - ? (nested as { configs: SavedValidatorConfig[] }).configs - : Array.isArray(nested) - ? (nested as SavedValidatorConfig[]) - : Array.isArray(data?.configs) - ? data.configs! - : []; - setSavedConfigs(list); - }) - .catch(() => toast.error("Failed to load saved configs")) - .finally(() => setSavedConfigsLoading(false)); + try { + const data = await guardrailsFetch<{ + data?: { configs?: SavedValidatorConfig[] } | SavedValidatorConfig[]; + configs?: SavedValidatorConfig[]; + }>(`/api/guardrails/validators/configs${configsQueryString}`, apiKey); + const nested = data?.data; + const list: SavedValidatorConfig[] = Array.isArray( + (nested as { configs?: SavedValidatorConfig[] })?.configs, + ) + ? (nested as { configs: SavedValidatorConfig[] }).configs + : Array.isArray(nested) + ? (nested as SavedValidatorConfig[]) + : Array.isArray(data?.configs) + ? data.configs! + : []; + setSavedConfigs(list); + return list; + } catch { + toast.error("Failed to load saved configs"); + return []; + } finally { + setSavedConfigsLoading(false); + } }, [configsQueryString, apiKey]); useEffect(() => { @@ -150,7 +157,9 @@ export default function GuardrailsPage() { ? `${base}/${selectedSavedConfig!.id}${configsQueryString}` : `${base}${configsQueryString}`; - const body = configValues; + const body = isUpdate + ? buildValidatorUpdatePayload(configValues) + : configValues; await guardrailsFetch(url, apiKey, { method: isUpdate ? "PATCH" : "POST", @@ -159,8 +168,15 @@ export default function GuardrailsPage() { toast.success( isUpdate ? `Config "${name}" updated` : `Config "${name}" saved`, ); - fetchSavedConfigs(); - setSelectedSavedConfig(null); + const savedConfigId = selectedSavedConfig?.id; + const freshList = await fetchSavedConfigs(); + if (isUpdate && savedConfigId) { + setSelectedSavedConfig( + freshList.find((c) => c.id === savedConfigId) ?? null, + ); + } else { + setSelectedSavedConfig(null); + } } catch (e) { toast.error(e instanceof Error ? e.message : "Failed to save config"); } finally { diff --git a/app/lib/types/guardrails.ts b/app/lib/types/guardrails.ts index b493db92..060f0c83 100644 --- a/app/lib/types/guardrails.ts +++ b/app/lib/types/guardrails.ts @@ -62,3 +62,18 @@ export interface OrgContext { organization_id: number; project_id: number; } + +export interface ValidatorUpdatePayload { + name?: unknown; + type?: unknown; + stage?: unknown; + on_fail_action?: unknown; + is_enabled?: unknown; +} + +export function buildValidatorUpdatePayload( + configValues: Record, +): ValidatorUpdatePayload { + const { name, type, stage, on_fail_action, is_enabled } = configValues; + return { name, type, stage, on_fail_action, is_enabled }; +} From e385d798bf012036989306e4d582ab1916bf1126 Mon Sep 17 00:00:00 2001 From: nishika26 Date: Tue, 5 May 2026 17:11:56 +0530 Subject: [PATCH 2/6] pr review comments --- app/(main)/guardrails/page.tsx | 8 ++++---- app/lib/types/guardrails.ts | 17 +++++------------ app/lib/utils/guardrails.ts | 14 ++++++++++++++ 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/app/(main)/guardrails/page.tsx b/app/(main)/guardrails/page.tsx index 829e4957..f126ce08 100644 --- a/app/(main)/guardrails/page.tsx +++ b/app/(main)/guardrails/page.tsx @@ -16,8 +16,8 @@ import { Validator, SavedValidatorConfig, OrgContext, - buildValidatorUpdatePayload, } from "@/app/lib/types/guardrails"; +import { buildValidatorUpdatePayload } from "@/app/lib/utils/guardrails"; import ValidatorConfigPanel from "@/app/components/guardrails/ValidatorConfigPanel"; import SavedConfigsList from "@/app/components/guardrails/SavedConfigsList"; @@ -62,9 +62,9 @@ export default function GuardrailsPage() { setValidatorsLoading(true); guardrailsFetch<{ validators?: Validator[] }>("/api/guardrails", apiKey) .then((data) => { - const list: Validator[] = Array.isArray(data?.validators) - ? data.validators - : []; + const list: Validator[] = ( + Array.isArray(data?.validators) ? data.validators : [] + ).filter((v) => v.type !== "llm_critic"); setValidators(list); }) .catch(() => toast.error("Failed to load validators")) diff --git a/app/lib/types/guardrails.ts b/app/lib/types/guardrails.ts index 060f0c83..80a4a640 100644 --- a/app/lib/types/guardrails.ts +++ b/app/lib/types/guardrails.ts @@ -64,16 +64,9 @@ export interface OrgContext { } export interface ValidatorUpdatePayload { - name?: unknown; - type?: unknown; - stage?: unknown; - on_fail_action?: unknown; - is_enabled?: unknown; -} - -export function buildValidatorUpdatePayload( - configValues: Record, -): ValidatorUpdatePayload { - const { name, type, stage, on_fail_action, is_enabled } = configValues; - return { name, type, stage, on_fail_action, is_enabled }; + name?: string; + type?: string; + stage?: string; + on_fail_action?: string; + is_enabled?: boolean; } diff --git a/app/lib/utils/guardrails.ts b/app/lib/utils/guardrails.ts index d3743071..aead79ac 100644 --- a/app/lib/utils/guardrails.ts +++ b/app/lib/utils/guardrails.ts @@ -2,6 +2,7 @@ import { NextRequest } from "next/server"; import type { ValidatorConfigSchema, ValidatorMeta, + ValidatorUpdatePayload, } from "@/app/lib/types/guardrails"; import { VALIDATOR_META } from "@/app/lib/data/guardrails/validators"; @@ -45,6 +46,19 @@ export function resolveRef( * Builds the initial form values from a validator's config schema by * pulling each property's `default` (skipping `type`). */ +export function buildValidatorUpdatePayload( + configValues: Record, +): ValidatorUpdatePayload { + const { name, type, stage, on_fail_action, is_enabled } = configValues; + return { + name: name as string, + type: type as string, + stage: stage as string, + on_fail_action: on_fail_action as string, + is_enabled: is_enabled as boolean, + }; +} + export function buildDefaultValues( schema: ValidatorConfigSchema, ): Record { From a8d8c57b70ad76731177d6e5bb341642216d2c81 Mon Sep 17 00:00:00 2001 From: nishika26 Date: Tue, 5 May 2026 17:54:44 +0530 Subject: [PATCH 3/6] pr review fixes --- app/lib/types/guardrails.ts | 5 ++++- app/lib/utils/guardrails.ts | 25 +++++++++++++------------ 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/app/lib/types/guardrails.ts b/app/lib/types/guardrails.ts index 80a4a640..77b08f56 100644 --- a/app/lib/types/guardrails.ts +++ b/app/lib/types/guardrails.ts @@ -67,6 +67,9 @@ export interface ValidatorUpdatePayload { name?: string; type?: string; stage?: string; - on_fail_action?: string; + on_fail_action?: string; //todo: to consider in future if this variable should be renamed as "on" prefix makes it seems like it is a function is_enabled?: boolean; } + +//todo: to consider in future if "on_fail_action" variable should be renamed +// as "on" prefix makes it seems like it is a function diff --git a/app/lib/utils/guardrails.ts b/app/lib/utils/guardrails.ts index aead79ac..99c387fa 100644 --- a/app/lib/utils/guardrails.ts +++ b/app/lib/utils/guardrails.ts @@ -46,18 +46,6 @@ export function resolveRef( * Builds the initial form values from a validator's config schema by * pulling each property's `default` (skipping `type`). */ -export function buildValidatorUpdatePayload( - configValues: Record, -): ValidatorUpdatePayload { - const { name, type, stage, on_fail_action, is_enabled } = configValues; - return { - name: name as string, - type: type as string, - stage: stage as string, - on_fail_action: on_fail_action as string, - is_enabled: is_enabled as boolean, - }; -} export function buildDefaultValues( schema: ValidatorConfigSchema, @@ -71,3 +59,16 @@ export function buildDefaultValues( } return values; } + +export function buildValidatorUpdatePayload( + configValues: Record, +): ValidatorUpdatePayload { + const { name, type, stage, on_fail_action, is_enabled } = configValues; + return { + name: name as string, + type: type as string, + stage: stage as string, + on_fail_action: on_fail_action as string, + is_enabled: is_enabled as boolean, + }; +} From 8bb82bf05016b44a9c68ecf572e25f42833d6cf2 Mon Sep 17 00:00:00 2001 From: Ayush <80516839+Ayush8923@users.noreply.github.com> Date: Tue, 5 May 2026 18:10:09 +0530 Subject: [PATCH 4/6] Apply suggestions from code review Co-authored-by: Ayush <80516839+Ayush8923@users.noreply.github.com> --- app/lib/utils/guardrails.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/app/lib/utils/guardrails.ts b/app/lib/utils/guardrails.ts index 99c387fa..7b505153 100644 --- a/app/lib/utils/guardrails.ts +++ b/app/lib/utils/guardrails.ts @@ -46,7 +46,6 @@ export function resolveRef( * Builds the initial form values from a validator's config schema by * pulling each property's `default` (skipping `type`). */ - export function buildDefaultValues( schema: ValidatorConfigSchema, ): Record { From 2a0c6bec4da59597979caa0cbb902752f7ce6c76 Mon Sep 17 00:00:00 2001 From: Ayush <80516839+Ayush8923@users.noreply.github.com> Date: Tue, 5 May 2026 18:11:06 +0530 Subject: [PATCH 5/6] Apply suggestions from code review Co-authored-by: Ayush <80516839+Ayush8923@users.noreply.github.com> --- app/lib/types/guardrails.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/lib/types/guardrails.ts b/app/lib/types/guardrails.ts index 77b08f56..4d4d305c 100644 --- a/app/lib/types/guardrails.ts +++ b/app/lib/types/guardrails.ts @@ -71,5 +71,3 @@ export interface ValidatorUpdatePayload { is_enabled?: boolean; } -//todo: to consider in future if "on_fail_action" variable should be renamed -// as "on" prefix makes it seems like it is a function From 75793e2c3c4aeccf0d79da0e03a75362f5ee5956 Mon Sep 17 00:00:00 2001 From: Ayush8923 <80516839+Ayush8923@users.noreply.github.com> Date: Tue, 5 May 2026 18:12:57 +0530 Subject: [PATCH 6/6] fix(guardrails): formatting --- app/lib/types/guardrails.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/app/lib/types/guardrails.ts b/app/lib/types/guardrails.ts index 4d4d305c..a93ddfbc 100644 --- a/app/lib/types/guardrails.ts +++ b/app/lib/types/guardrails.ts @@ -70,4 +70,3 @@ export interface ValidatorUpdatePayload { on_fail_action?: string; //todo: to consider in future if this variable should be renamed as "on" prefix makes it seems like it is a function is_enabled?: boolean; } -