From 62aee8bee95a8841a2eb50320b8f369252cf20c7 Mon Sep 17 00:00:00 2001
From: "devin-ai-integration[bot]"
<158243242+devin-ai-integration[bot]@users.noreply.github.com>
Date: Fri, 9 Oct 2026 20:03:01 -0700
Subject: [PATCH] feat(ui): build System One playground requests with a form
(#45721)
* feat(ui): build System One playground requests with a form
* test(ui): fill System One form fields with single change events
---------
Co-authored-by: mateo-berri <277851410+mateo-berri@users.noreply.github.com>
---
.../components/systemOneUI/JsonEditor.tsx | 4 +-
.../components/systemOneUI/SystemOneForm.tsx | 337 ++++++++++++++++++
.../SystemOneUI.integration.test.tsx | 178 ++++++++-
.../components/systemOneUI/SystemOneUI.tsx | 37 +-
.../systemOneUI/lib/formPayload.test.ts | 124 +++++++
.../components/systemOneUI/lib/formPayload.ts | 89 +++++
6 files changed, 754 insertions(+), 15 deletions(-)
create mode 100644 ui/litellm-dashboard/src/app/(dashboard)/playground/components/systemOneUI/SystemOneForm.tsx
create mode 100644 ui/litellm-dashboard/src/app/(dashboard)/playground/components/systemOneUI/lib/formPayload.test.ts
create mode 100644 ui/litellm-dashboard/src/app/(dashboard)/playground/components/systemOneUI/lib/formPayload.ts
diff --git a/ui/litellm-dashboard/src/app/(dashboard)/playground/components/systemOneUI/JsonEditor.tsx b/ui/litellm-dashboard/src/app/(dashboard)/playground/components/systemOneUI/JsonEditor.tsx
index 1effe55ef41..fce617b4c47 100644
--- a/ui/litellm-dashboard/src/app/(dashboard)/playground/components/systemOneUI/JsonEditor.tsx
+++ b/ui/litellm-dashboard/src/app/(dashboard)/playground/components/systemOneUI/JsonEditor.tsx
@@ -31,7 +31,7 @@ interface JsonEditorProps {
validation: SystemOnePayloadValidation;
}
-function ValidationStatus({ validation }: { validation: SystemOnePayloadValidation }) {
+export function ValidationStatus({ validation }: { validation: SystemOnePayloadValidation }) {
const errorCount = validation.issues.filter((issue) => issue.severity === "error").length;
if (errorCount > 0) {
return (
@@ -43,7 +43,7 @@ function ValidationStatus({ validation }: { validation: SystemOnePayloadValidati
return Valid payload;
}
-function IssueList({ id, validation }: { id: string; validation: SystemOnePayloadValidation }) {
+export function IssueList({ id, validation }: { id: string; validation: SystemOnePayloadValidation }) {
if (validation.issues.length === 0) {
return (
diff --git a/ui/litellm-dashboard/src/app/(dashboard)/playground/components/systemOneUI/SystemOneForm.tsx b/ui/litellm-dashboard/src/app/(dashboard)/playground/components/systemOneUI/SystemOneForm.tsx
new file mode 100644
index 00000000000..d799afd13ea
--- /dev/null
+++ b/ui/litellm-dashboard/src/app/(dashboard)/playground/components/systemOneUI/SystemOneForm.tsx
@@ -0,0 +1,337 @@
+"use client";
+
+import { Button } from "@/components/ui/button";
+import { Input } from "@/components/ui/input";
+import { Label } from "@/components/ui/label";
+import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
+import { Textarea } from "@/components/ui/textarea";
+import { cn } from "@/lib/cva.config";
+import { Plus, Trash2 } from "lucide-react";
+import { useId, useMemo, useState, type ReactNode } from "react";
+import { IssueList, ValidationStatus } from "./JsonEditor";
+import {
+ blankQuestion,
+ freeName,
+ readForm,
+ removeAt,
+ renameKey,
+ replaceAt,
+ retype,
+ withNoulCriterion,
+ withoutKey,
+ type ChoiceQuestion,
+ type FormPayload,
+ type FormQuestion,
+ type NoulQuestion,
+ type QuestionType,
+ type ScoreQuestion,
+} from "./lib/formPayload";
+import type { SystemOnePayloadValidation } from "./lib/validatePayload";
+
+const QUESTION_TYPES: readonly QuestionType[] = ["choice", "noul", "score"];
+const TYPE_LABELS: Record = { choice: "Choice", noul: "Yes / no", score: "Score" };
+
+const isQuestionType = (value: unknown): value is QuestionType => QUESTION_TYPES.some((type) => type === value);
+
+interface SystemOneFormProps {
+ value: string;
+ onChange: (value: string) => void;
+ validation: SystemOnePayloadValidation;
+ onOpenJson: () => void;
+}
+
+interface QuestionEditorProps {
+ question: Q;
+ onChange: (question: FormQuestion) => void;
+}
+
+interface KeyInputProps {
+ value: string;
+ taken: readonly string[];
+ onCommit: (value: string) => void;
+ label: string;
+ placeholder?: string;
+}
+
+function keyError(next: string, current: string, taken: readonly string[]): string | undefined {
+ if (next === "") {
+ return "Enter a name";
+ }
+ if (next !== current && taken.includes(next)) {
+ return `"${next}" is already used`;
+ }
+ return undefined;
+}
+
+function KeyInput({ value, taken, onCommit, label, placeholder }: KeyInputProps) {
+ const errorId = useId();
+ const [draft, setDraft] = useState(value);
+ const next = draft.trim();
+ const error = keyError(next, value, taken);
+
+ function commit() {
+ if (error === undefined && next !== value) {
+ onCommit(next);
+ return;
+ }
+ setDraft(value);
+ }
+
+ return (
+
+
setDraft(event.target.value)}
+ onBlur={commit}
+ />
+ {error !== undefined && (
+
+ {error}
+
+ )}
+
+ );
+}
+
+function RemoveButton({ label, onClick }: { label: string; onClick: () => void }) {
+ return (
+
+ );
+}
+
+function AddButton({ children, onClick }: { children: ReactNode; onClick: () => void }) {
+ return (
+
+ );
+}
+
+function ChoiceOptions({ question, onChange }: QuestionEditorProps) {
+ const labels = Object.keys(question.criteria);
+ const writeCriteria = (criteria: Record) => onChange({ ...question, criteria });
+
+ return (
+
+
Options
+ {Object.entries(question.criteria).map(([label, description], index) => (
+
+ writeCriteria(renameKey(question.criteria, label, next))}
+ />
+ writeCriteria({ ...question.criteria, [label]: event.target.value })}
+ />
+ writeCriteria(withoutKey(question.criteria, label))}
+ />
+
+ ))}
+
writeCriteria({ ...question.criteria, [freeName(labels, "option")]: "" })}>
+ Add option
+
+
+ );
+}
+
+function NoulCriteria({ question, onChange }: QuestionEditorProps) {
+ const yesId = useId();
+ const noId = useId();
+
+ return (
+
+ );
+}
+
+function ScoreLevels({ question, onChange }: QuestionEditorProps) {
+ const writeCriteria = (criteria: string[]) => onChange({ ...question, criteria });
+
+ return (
+
+
Levels, lowest first
+ {question.criteria.map((level, index) => (
+
+ {index}
+ writeCriteria(replaceAt(question.criteria, index, event.target.value))}
+ />
+ writeCriteria(removeAt(question.criteria, index))}
+ />
+
+ ))}
+
writeCriteria([...question.criteria, ""])}>Add level
+
+ );
+}
+
+function CriteriaEditor({ question, onChange }: QuestionEditorProps) {
+ switch (question.type) {
+ case "choice":
+ return ;
+ case "noul":
+ return ;
+ case "score":
+ return ;
+ }
+}
+
+interface QuestionCardProps extends QuestionEditorProps {
+ name: string;
+ taken: readonly string[];
+ onRename: (name: string) => void;
+ onRemove: () => void;
+}
+
+function QuestionCard({ name, question, taken, onChange, onRename, onRemove }: QuestionCardProps) {
+ const instructionsId = useId();
+
+ return (
+
+ );
+}
+
+function FormFrame({ validation, children }: { validation: SystemOnePayloadValidation; children: ReactNode }) {
+ const issuesId = useId();
+
+ return (
+
+
+ Request form
+
+
+
{children}
+
+
+ );
+}
+
+export default function SystemOneForm({ value, onChange, validation, onOpenJson }: SystemOneFormProps) {
+ const stateId = useId();
+ const form = useMemo(() => readForm(value), [value]);
+
+ if (form === undefined) {
+ return (
+
+
+ This request has JSON the form can't show, such as a syntax error or a value that isn't text.
+
+
+
+ );
+ }
+
+ const questions = form.questions ?? {};
+ const names = Object.keys(questions);
+ const write = (next: FormPayload) => onChange(JSON.stringify(next, null, 2));
+ const writeQuestions = (next: Record) => write({ ...form, questions: next });
+
+ return (
+
+
+
+
+ The text the model reads before it answers, such as a support ticket or a chat message.
+
+
+ {Object.entries(questions).map(([name, question], index) => (
+ writeQuestions({ ...questions, [name]: next })}
+ onRename={(next) => writeQuestions(renameKey(questions, name, next))}
+ onRemove={() => writeQuestions(withoutKey(questions, name))}
+ />
+ ))}
+ writeQuestions({ ...questions, [freeName(names, "question")]: blankQuestion() })}>
+ Add question
+
+
+ );
+}
diff --git a/ui/litellm-dashboard/src/app/(dashboard)/playground/components/systemOneUI/SystemOneUI.integration.test.tsx b/ui/litellm-dashboard/src/app/(dashboard)/playground/components/systemOneUI/SystemOneUI.integration.test.tsx
index 367b779ecf7..8c0b6ef12dc 100644
--- a/ui/litellm-dashboard/src/app/(dashboard)/playground/components/systemOneUI/SystemOneUI.integration.test.tsx
+++ b/ui/litellm-dashboard/src/app/(dashboard)/playground/components/systemOneUI/SystemOneUI.integration.test.tsx
@@ -6,6 +6,7 @@ import {
screen,
waitFor,
waitForElementToBeRemoved,
+ within,
} from "@testing-library/react";
import type { ReactElement } from "react";
import userEvent from "@testing-library/user-event";
@@ -58,6 +59,11 @@ const isModelLookup = (input: RequestInfo | URL) => String(input).endsWith("/mod
const lookupAuthHeaders = (calls: Parameters[]) =>
calls.map(([, init]) => Object.values((init?.headers ?? {}) as Record));
+const openJsonEditor = async () => {
+ await userEvent.click(screen.getByRole("tab", { name: "JSON" }));
+ return screen.getByRole("textbox", { name: "System One JSON payload" });
+};
+
const createResponse = (body: SystemOneResponse, status = 200, errorText = "") =>
({
ok: status >= 200 && status < 300,
@@ -89,7 +95,7 @@ describe("SystemOneUI integration", () => {
it("restores the example after the request is edited", async () => {
const user = userEvent.setup();
render();
- const editor = screen.getByRole("textbox", { name: "System One JSON payload" });
+ const editor = await openJsonEditor();
const example = (editor as HTMLTextAreaElement).value;
const resetButton = screen.getByRole("button", { name: "Reset example" });
expect(resetButton).toBeDisabled();
@@ -153,7 +159,7 @@ describe("SystemOneUI integration", () => {
expect(screen.queryByRole("option", { name: "gpt-5.5" })).not.toBeInTheDocument();
await user.click(screen.getByRole("option", { name: "pplx-decider" }));
- const editor = screen.getByRole("textbox", { name: "System One JSON payload" });
+ const editor = await openJsonEditor();
expect(JSON.parse((editor as HTMLTextAreaElement).value)).toMatchObject({
model: "pplx-decider",
questions: { has_repro_steps: { type: "noul" } },
@@ -210,7 +216,7 @@ describe("SystemOneUI integration", () => {
const models = Promise.withResolvers();
mockModelLookup.mockReturnValue(models.promise);
render();
- const editor = screen.getByRole("textbox", { name: "System One JSON payload" });
+ const editor = await openJsonEditor();
const draft = JSON.stringify({ state: "edited", questions: { q: { type: "noul", instructions: "Yes?" } } });
fireEvent.change(editor, { target: { value: draft } });
@@ -226,7 +232,7 @@ describe("SystemOneUI integration", () => {
it("shows invalid JSON and disables Send", async () => {
render();
- fireEvent.change(screen.getByRole("textbox", { name: "System One JSON payload" }), {
+ fireEvent.change(await openJsonEditor(), {
target: { value: "{" },
});
@@ -273,7 +279,7 @@ describe("SystemOneUI integration", () => {
it("keeps legacy validation when question values have invalid types", async () => {
render();
- fireEvent.change(screen.getByRole("textbox", { name: "System One JSON payload" }), {
+ fireEvent.change(await openJsonEditor(), {
target: {
value: JSON.stringify({
state: "A new support request",
@@ -299,7 +305,7 @@ describe("SystemOneUI integration", () => {
screen.getByRole("combobox", { name: "Decision endpoint" }).focus();
await user.keyboard("{ArrowDown}");
await user.click(await screen.findByRole("option", { name: "System One · /v1/systemone" }));
- const editor = screen.getByRole("textbox", { name: "System One JSON payload" });
+ const editor = await openJsonEditor();
const draft = JSON.stringify({
model: "my-decider",
state: {},
@@ -337,7 +343,7 @@ describe("SystemOneUI integration", () => {
await user.keyboard("{ArrowDown}");
await user.click(await screen.findByRole("option", { name: "System One · /v1/systemone" }));
const payload = { state: "An outage", questions: { urgent: { type: "noul", instructions: "Is this urgent?" } } };
- fireEvent.change(screen.getByRole("textbox", { name: "System One JSON payload" }), {
+ fireEvent.change(await openJsonEditor(), {
target: { value: JSON.stringify(payload) },
});
expect(screen.getByRole("button", { name: "Send" })).toBeEnabled();
@@ -442,7 +448,7 @@ describe("SystemOneUI integration", () => {
await user.click(screen.getByRole("button", { name: "Send" }));
expect(await screen.findByText("Selected choice")).toBeInTheDocument();
- fireEvent.change(screen.getByRole("textbox", { name: "System One JSON payload" }), {
+ fireEvent.change(await openJsonEditor(), {
target: {
value: JSON.stringify({
state: "A different support request",
@@ -500,4 +506,160 @@ describe("SystemOneUI integration", () => {
expect(mockFetch.mock.calls[0]?.[1]?.signal?.aborted).toBe(true);
expect(screen.getByRole("button", { name: "Send" })).toBeEnabled();
});
+
+ describe("request form", () => {
+ const question = (name: string) => within(screen.getByRole("group", { name: `Question ${name}` }));
+ const sentBody = () => JSON.parse(mockFetch.mock.calls[0]?.[1]?.body as string);
+
+ async function pickAnswerType(user: ReturnType, name: string, type: string) {
+ question(name).getByRole("combobox", { name: "Answer type" }).focus();
+ await user.keyboard("{ArrowDown}");
+ await user.click(await screen.findByRole("option", { name: type }));
+ }
+
+ const fill = (field: HTMLElement, value: string) => fireEvent.change(field, { target: { value } });
+
+ function rename(field: HTMLElement, name: string) {
+ fill(field, name);
+ fireEvent.blur(field);
+ }
+
+ it("sends a choice and a yes/no question built in the form without opening JSON", async () => {
+ const user = userEvent.setup();
+ render();
+ const input = screen.getByRole("textbox", { name: "Input" });
+ fill(input, "The login page is blank after the upgrade");
+ for (const name of ["area", "has_repro_steps", "severity"]) {
+ await user.click(screen.getByRole("button", { name: `Remove question ${name}` }));
+ }
+
+ await user.click(screen.getByRole("button", { name: "Add question" }));
+ rename(question("question_1").getByRole("textbox", { name: "Question name" }), "team");
+ fill(question("team").getByRole("textbox", { name: "Instructions" }), "Which team owns this?");
+ const [first, second] = question("team").getAllByRole("textbox", { name: "Option label" });
+ rename(first, "frontend");
+ rename(second, "backend");
+ fill(question("team").getByRole("textbox", { name: "Description of frontend" }), "Dashboard and UI");
+ await user.click(question("team").getByRole("button", { name: "Add option" }));
+ rename(question("team").getAllByRole("textbox", { name: "Option label" })[2], "infra");
+ fill(question("team").getByRole("textbox", { name: "Description of infra" }), "Deploys");
+
+ await user.click(screen.getByRole("button", { name: "Add question" }));
+ await pickAnswerType(user, "question_1", "Yes / no");
+ rename(question("question_1").getByRole("textbox", { name: "Question name" }), "urgent");
+ fill(question("urgent").getByRole("textbox", { name: "Instructions" }), "Is this blocking users?");
+ fill(question("urgent").getByRole("textbox", { name: "Yes means" }), "Nobody can log in");
+
+ await user.click(screen.getByRole("button", { name: "Send" }));
+
+ expect(await screen.findByText("Selected choice")).toBeInTheDocument();
+ expect(screen.queryByRole("textbox", { name: "System One JSON payload" })).not.toBeInTheDocument();
+ expect(mockFetch.mock.calls[0]?.[0]).toMatch(/\/typesafe\/v1\/systemone$/);
+ expect(sentBody()).toEqual({
+ model: "jev-latest",
+ state: "The login page is blank after the upgrade",
+ questions: {
+ team: {
+ type: "choice",
+ instructions: "Which team owns this?",
+ criteria: { frontend: "Dashboard and UI", backend: "", infra: "Deploys" },
+ },
+ urgent: { type: "noul", instructions: "Is this blocking users?", criteria: { true: "Nobody can log in" } },
+ },
+ });
+ expect(Object.keys(sentBody().questions)).toEqual(["team", "urgent"]);
+ expect(Object.keys(sentBody().questions.team.criteria)).toEqual(["frontend", "backend", "infra"]);
+ });
+
+ it("edits score levels and keeps instructions when a question changes type", async () => {
+ const user = userEvent.setup();
+ mockModelLookup.mockResolvedValue(modelGroupInfoResponse(DECISION_AND_CHAT_MODELS));
+ render();
+ expect(await screen.findByRole("combobox", { name: "Decision model" })).toHaveValue("jev-latest");
+
+ const level = question("severity").getByRole("textbox", { name: "Level 0" });
+ fill(level, "Typo");
+ await user.click(question("severity").getByRole("button", { name: "Remove level 4" }));
+ await user.click(question("severity").getByRole("button", { name: "Add level" }));
+ fill(question("severity").getByRole("textbox", { name: "Level 4" }), "Data loss");
+ await pickAnswerType(user, "has_repro_steps", "Choice");
+ await user.click(question("has_repro_steps").getByRole("button", { name: "Add option" }));
+ await user.click(question("area").getByRole("button", { name: "Remove option docs" }));
+
+ await user.click(screen.getByRole("button", { name: "Send" }));
+
+ expect(await screen.findByText("Selected choice")).toBeInTheDocument();
+ expect(mockFetch.mock.calls[0]?.[0]).toMatch(/\/v1\/systemone$/);
+ expect(sentBody().model).toBe("jev-latest");
+ expect(sentBody().questions.severity.criteria).toEqual([
+ "Typo",
+ "Minor bug with an easy workaround",
+ "Broken feature with a workaround",
+ "Broken feature with no workaround",
+ "Data loss",
+ ]);
+ expect(sentBody().questions.has_repro_steps).toEqual({
+ type: "choice",
+ instructions: "Does the issue include steps someone could follow to reproduce it?",
+ criteria: { option_1: "", option_2: "", option_3: "" },
+ });
+ expect(Object.keys(sentBody().questions.area.criteria)).toEqual(["backend", "sdk", "ui"]);
+ });
+
+ it("refuses an empty or taken question name and trims a new one", async () => {
+ const user = userEvent.setup();
+ render();
+ const name = question("severity").getByRole("textbox", { name: "Question name" });
+ expect(name).toHaveAttribute("aria-invalid", "false");
+
+ fill(name, "area");
+ expect(name).toHaveAttribute("aria-invalid", "true");
+ expect(question("severity").getByText('"area" is already used')).toBeInTheDocument();
+ fireEvent.blur(name);
+ expect(name).toHaveValue("severity");
+
+ fill(name, "");
+ expect(question("severity").getByText("Enter a name")).toBeInTheDocument();
+ fireEvent.blur(name);
+ expect(name).toHaveValue("severity");
+
+ rename(name, " impact ");
+ expect(question("impact").getByRole("textbox", { name: "Question name" })).toHaveValue("impact");
+ await user.click(screen.getByRole("button", { name: "Add question" }));
+ await user.click(screen.getByRole("button", { name: "Add question" }));
+ const json = JSON.parse(((await openJsonEditor()) as HTMLTextAreaElement).value);
+ expect(Object.keys(json.questions)).toEqual(["area", "has_repro_steps", "impact", "question_1", "question_2"]);
+ });
+
+ it("round-trips unknown fields between JSON and the form and points to JSON when it cannot show one", async () => {
+ const user = userEvent.setup();
+ render();
+ expect(screen.queryByRole("button", { name: "Format JSON" })).not.toBeInTheDocument();
+
+ fireEvent.change(await openJsonEditor(), {
+ target: { value: JSON.stringify({ state: { ticket: 1 }, questions: {} }) },
+ });
+ expect(screen.getByRole("button", { name: "Format JSON" })).toBeInTheDocument();
+ await user.click(screen.getByRole("tab", { name: "Form" }));
+ expect(screen.getByText(/This request has JSON the form can.t show/)).toBeInTheDocument();
+ await user.click(screen.getByRole("button", { name: "Edit in JSON" }));
+
+ const payload = {
+ model: "m",
+ state: "s",
+ metadata: { k: 1 },
+ questions: { q: { type: "noul", instructions: "i", note: "x" } },
+ };
+ fireEvent.change(screen.getByRole("textbox", { name: "System One JSON payload" }), {
+ target: { value: JSON.stringify(payload) },
+ });
+ await user.click(screen.getByRole("tab", { name: "Form" }));
+ expect(screen.getByRole("textbox", { name: "Input" })).toHaveValue("s");
+ fill(question("q").getByRole("textbox", { name: "Yes means" }), "y");
+
+ const json = JSON.parse(((await openJsonEditor()) as HTMLTextAreaElement).value);
+ expect(json).toEqual({ ...payload, questions: { q: { ...payload.questions.q, criteria: { true: "y" } } } });
+ expect(Object.keys(json)).toEqual(["model", "state", "metadata", "questions"]);
+ });
+ });
});
diff --git a/ui/litellm-dashboard/src/app/(dashboard)/playground/components/systemOneUI/SystemOneUI.tsx b/ui/litellm-dashboard/src/app/(dashboard)/playground/components/systemOneUI/SystemOneUI.tsx
index 3e61030da7b..d1effc9ece6 100644
--- a/ui/litellm-dashboard/src/app/(dashboard)/playground/components/systemOneUI/SystemOneUI.tsx
+++ b/ui/litellm-dashboard/src/app/(dashboard)/playground/components/systemOneUI/SystemOneUI.tsx
@@ -4,6 +4,7 @@ import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
+import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
import { SearchSelect } from "@/components/shared/SearchSelect";
import { DECISIONS_DOCS_URL } from "@/lib/decisionModels";
import { uiHref } from "@/utils/uiHref";
@@ -17,6 +18,7 @@ import type { DecisionEndpoint, PlaygroundRequest } from "./lib/schemas";
import JsonEditor from "./JsonEditor";
import QuestionBreakdown from "./QuestionBreakdown";
import ResponseView from "./ResponseView";
+import SystemOneForm from "./SystemOneForm";
import { validateSystemOnePayload } from "./lib/validatePayload";
import { useDecisionModels, type ApiKeySource } from "./useDecisionModels";
@@ -25,6 +27,8 @@ interface SystemOneUIProps {
disabledPersonalKeyCreation?: boolean;
}
+type EditorView = "form" | "json";
+
interface SystemOneSendVariables {
payload: PlaygroundRequest;
endpoint: DecisionEndpoint;
@@ -52,6 +56,7 @@ export default function SystemOneUI({ accessToken, disabledPersonalKeyCreation =
const endpoint: DecisionEndpoint =
chosenEndpoint ?? (decisionModels.length > 0 ? "/v1/systemone" : "/typesafe/v1/systemone");
const [drafts, setDrafts] = useState>>({});
+ const [view, setView] = useState("form");
const examplePayload =
endpoint === "/v1/systemone"
? JSON.stringify(decisionsExample(decisionModels[0] ?? PLACEHOLDER_DECISION_MODEL), null, 2)
@@ -206,10 +211,12 @@ export default function SystemOneUI({ accessToken, disabledPersonalKeyCreation =
Reset example
-
+ {view === "json" && (
+
+ )}
{isLoading && (