diff --git a/app/api/guardrails/topic_relevance_configs/[topic_relevance_config_id]/route.ts b/app/api/guardrails/llm_prompt_configs/[llm_prompt_config_id]/route.ts similarity index 64% rename from app/api/guardrails/topic_relevance_configs/[topic_relevance_config_id]/route.ts rename to app/api/guardrails/llm_prompt_configs/[llm_prompt_config_id]/route.ts index d7a81e1..d91b5e5 100644 --- a/app/api/guardrails/topic_relevance_configs/[topic_relevance_config_id]/route.ts +++ b/app/api/guardrails/llm_prompt_configs/[llm_prompt_config_id]/route.ts @@ -3,13 +3,13 @@ import { NextResponse, NextRequest } from "next/server"; export async function GET( request: NextRequest, - { params }: { params: Promise<{ topic_relevance_config_id: string }> }, + { params }: { params: Promise<{ llm_prompt_config_id: string }> }, ) { try { - const { topic_relevance_config_id } = await params; + const { llm_prompt_config_id } = await params; const { status, data } = await guardrailsUserClient( request, - `/api/v1/guardrails/topic_relevance_configs/${topic_relevance_config_id}`, + `/api/v1/guardrails/llm_prompt_configs/${llm_prompt_config_id}`, ); return NextResponse.json(data, { status }); } catch (e: unknown) { @@ -20,18 +20,18 @@ export async function GET( } } -export async function PUT( +export async function PATCH( request: NextRequest, - { params }: { params: Promise<{ topic_relevance_config_id: string }> }, + { params }: { params: Promise<{ llm_prompt_config_id: string }> }, ) { try { - const { topic_relevance_config_id } = await params; + const { llm_prompt_config_id } = await params; const body = await request.json(); const { status, data } = await guardrailsUserClient( request, - `/api/v1/guardrails/topic_relevance_configs/${topic_relevance_config_id}`, + `/api/v1/guardrails/llm_prompt_configs/${llm_prompt_config_id}`, { - method: "PUT", + method: "PATCH", body: JSON.stringify(body), }, ); @@ -46,13 +46,13 @@ export async function PUT( export async function DELETE( request: NextRequest, - { params }: { params: Promise<{ topic_relevance_config_id: string }> }, + { params }: { params: Promise<{ llm_prompt_config_id: string }> }, ) { try { - const { topic_relevance_config_id } = await params; + const { llm_prompt_config_id } = await params; const { status, data } = await guardrailsUserClient( request, - `/api/v1/guardrails/topic_relevance_configs/${topic_relevance_config_id}`, + `/api/v1/guardrails/llm_prompt_configs/${llm_prompt_config_id}`, { method: "DELETE", }, diff --git a/app/api/guardrails/topic_relevance_configs/route.ts b/app/api/guardrails/llm_prompt_configs/route.ts similarity index 74% rename from app/api/guardrails/topic_relevance_configs/route.ts rename to app/api/guardrails/llm_prompt_configs/route.ts index 0c47046..57c103c 100644 --- a/app/api/guardrails/topic_relevance_configs/route.ts +++ b/app/api/guardrails/llm_prompt_configs/route.ts @@ -3,10 +3,10 @@ import { NextResponse, NextRequest } from "next/server"; export async function GET(request: NextRequest) { try { - const { status, data } = await guardrailsUserClient( - request, - "/api/v1/guardrails/topic_relevance_configs/", - ); + const url = new URL(request.url); + const qs = url.searchParams.toString(); + const path = `/api/v1/guardrails/llm_prompt_configs/${qs ? `?${qs}` : ""}`; + const { status, data } = await guardrailsUserClient(request, path); return NextResponse.json(data, { status }); } catch (e: unknown) { return NextResponse.json( @@ -21,7 +21,7 @@ export async function POST(request: NextRequest) { const body = await request.json(); const { status, data } = await guardrailsUserClient( request, - "/api/v1/guardrails/topic_relevance_configs/", + "/api/v1/guardrails/llm_prompt_configs/", { method: "POST", body: JSON.stringify(body), diff --git a/app/components/analytics/AnalyticsChartCard.tsx b/app/components/analytics/AnalyticsChartCard.tsx index 52438b4..785ff24 100644 --- a/app/components/analytics/AnalyticsChartCard.tsx +++ b/app/components/analytics/AnalyticsChartCard.tsx @@ -15,8 +15,8 @@ import BreakdownPanel from "./BreakdownPanel"; import LineTrendChart from "./LineTrendChart"; const SERIES_COLORS = [ - "#2563eb", - "#e11d48", + "#1f4496", + "#ffce00", "#16a34a", "#f59e0b", "#7c3aed", diff --git a/app/components/analytics/AnalyticsTotalsRow.tsx b/app/components/analytics/AnalyticsTotalsRow.tsx index 9eb24e9..053d2ee 100644 --- a/app/components/analytics/AnalyticsTotalsRow.tsx +++ b/app/components/analytics/AnalyticsTotalsRow.tsx @@ -2,7 +2,16 @@ import { ReactNode } from "react"; import { InfoTooltip, Loader } from "@/app/components/ui"; -import { AnalyticsTotalsRowProps } from "@/app/lib/types/analytics"; +import { + AnalyticsCardAccent, + AnalyticsTotalsRowProps, +} from "@/app/lib/types/analytics"; + +const ACCENT_CARD: Record = { + cost: "bg-status-success-bg/40 border-status-success-border/40", + usage: "bg-accent-primary/5 border-accent-primary/20", + activity: "bg-status-warning-bg/40 border-status-warning-border/40", +}; function formatTokens(n: number): string { if (!Number.isFinite(n)) return "0"; @@ -52,29 +61,26 @@ export default function AnalyticsTotalsRow({

All-time totals

-

- Real users on the left, quality checks on the right. -

); } -type Accent = "cost" | "usage" | "activity"; - -const ACCENT_CARD: Record = { - cost: "bg-status-success-bg/40 border-status-success-border/40", - usage: "bg-accent-primary/5 border-accent-primary/20", - activity: "bg-status-warning-bg/40 border-status-warning-border/40", -}; - function StatCard({ label, value, @@ -124,7 +122,7 @@ function StatCard({ value: string; hint?: string; tooltip?: ReactNode; - accent: Accent; + accent: AnalyticsCardAccent; }) { return (
diff --git a/app/components/guardrails/TopicRelevanceField.tsx b/app/components/guardrails/TopicRelevanceField.tsx index 4895e48..f7cb820 100644 --- a/app/components/guardrails/TopicRelevanceField.tsx +++ b/app/components/guardrails/TopicRelevanceField.tsx @@ -49,25 +49,25 @@ export default function TopicRelevanceField({ guardrailsFetch<{ data?: - | { topic_relevance_configs?: TopicRelevanceConfig[] } + | { llm_prompt_configs?: TopicRelevanceConfig[] } | TopicRelevanceConfig[]; - topic_relevance_configs?: TopicRelevanceConfig[]; - }>("/api/guardrails/topic_relevance_configs", apiKey) + llm_prompt_configs?: TopicRelevanceConfig[]; + }>( + "/api/guardrails/llm_prompt_configs?validator_name=topic_relevance", + apiKey, + ) .then((data) => { const nested = data?.data; const list: TopicRelevanceConfig[] = Array.isArray( - (nested as { topic_relevance_configs?: TopicRelevanceConfig[] }) - ?.topic_relevance_configs, + (nested as { llm_prompt_configs?: TopicRelevanceConfig[] }) + ?.llm_prompt_configs, ) - ? ( - nested as { - topic_relevance_configs: TopicRelevanceConfig[]; - } - ).topic_relevance_configs + ? (nested as { llm_prompt_configs: TopicRelevanceConfig[] }) + .llm_prompt_configs : Array.isArray(nested) ? (nested as TopicRelevanceConfig[]) - : Array.isArray(data?.topic_relevance_configs) - ? data.topic_relevance_configs! + : Array.isArray(data?.llm_prompt_configs) + ? data.llm_prompt_configs! : []; setConfigs(list); }) @@ -101,16 +101,17 @@ export default function TopicRelevanceField({ let cancelled = false; setDetailsLoading(true); guardrailsFetch<{ - data?: TopicRelevanceConfigDetails; + data?: TopicRelevanceConfigDetails & { llm_prompt?: string | null }; description?: string | null; configuration?: string | null; - }>(`/api/guardrails/topic_relevance_configs/${value}`, apiKey) + llm_prompt?: string | null; + }>(`/api/guardrails/llm_prompt_configs/${value}`, apiKey) .then((d) => { if (cancelled) return; const entity = d?.data ?? d; setDetails({ description: entity?.description ?? null, - configuration: entity?.configuration ?? null, + configuration: entity?.llm_prompt ?? entity?.configuration ?? null, }); }) .catch(() => { diff --git a/app/components/guardrails/TopicRelevanceModal.tsx b/app/components/guardrails/TopicRelevanceModal.tsx index 0321cbd..9b8a768 100644 --- a/app/components/guardrails/TopicRelevanceModal.tsx +++ b/app/components/guardrails/TopicRelevanceModal.tsx @@ -41,13 +41,14 @@ export default function TopicRelevanceModal({ try { setIsSaving(true); const body = { + validator_name: "topic_relevance", name: name.trim(), description: description.trim(), - configuration: configuration.trim(), + llm_prompt: configuration.trim(), prompt_schema_version: promptSchemaVersion, }; const data = await guardrailsFetch<{ id: string; name?: string }>( - "/api/guardrails/topic_relevance_configs", + "/api/guardrails/llm_prompt_configs", apiKey, { method: "POST", body: JSON.stringify(body) }, ); diff --git a/app/lib/types/analytics.ts b/app/lib/types/analytics.ts index 7577ec4..16a44ca 100644 --- a/app/lib/types/analytics.ts +++ b/app/lib/types/analytics.ts @@ -100,6 +100,8 @@ export interface AnalyticsTotalsRowProps { error: string | null; } +export type AnalyticsCardAccent = "cost" | "usage" | "activity"; + export interface AnalyticsChartRow { month: string; monthIso: string;