From d360372d9c4bdc17f8f135be7adbc7d9d59e7f85 Mon Sep 17 00:00:00 2001 From: shine1i Date: Mon, 9 Feb 2026 19:48:42 +0100 Subject: [PATCH] add variable handling components and refactor inputs across dialogs - Introduce `AvailableVariables` for displaying variables linked to configs. - Implement `ChipInput` for dynamic value management in category and subcategory dialogs. - Add `AuxVariableBadges` to aux nodes for displaying variable references. - Update inline components with comboboxes for better user experience. - Replace badges and manual inputs with streamlined reusable components. --- docs/canvas-lab-architecture.md | 1 + .../canvas-lab/components/canvas-aux-node.tsx | 31 ++- .../canvas-lab/components/canvas-node.tsx | 66 +++--- .../canvas-lab/components/chip-input.tsx | 67 ++++++ .../inline/inline-category-badges.tsx | 88 ++++++++ .../components/inline/inline-llm.tsx | 79 ++++++-- .../canvas-lab/dialogs/config-dialog.tsx | 4 +- .../dialogs/expression/expression-dialog.tsx | 2 +- .../canvas-lab/dialogs/import-dialog.tsx | 4 +- .../dialogs/llm/available-variables.tsx | 36 ++++ .../canvas-lab/dialogs/llm/llm-dialog.tsx | 23 ++- .../dialogs/models/model-config-dialog.tsx | 13 +- .../dialogs/models/model-provider-dialog.tsx | 4 +- .../canvas-lab/dialogs/processors-dialog.tsx | 10 +- .../dialogs/samplers/category-dialog.tsx | 191 +++++------------- .../dialogs/samplers/subcategory-dialog.tsx | 100 +++------ .../dialogs/shared/validation-banner.tsx | 12 +- .../features/canvas-lab/utils/variables.ts | 26 +++ 18 files changed, 455 insertions(+), 302 deletions(-) create mode 100644 studio/frontend/src/features/canvas-lab/components/chip-input.tsx create mode 100644 studio/frontend/src/features/canvas-lab/components/inline/inline-category-badges.tsx create mode 100644 studio/frontend/src/features/canvas-lab/dialogs/llm/available-variables.tsx create mode 100644 studio/frontend/src/features/canvas-lab/utils/variables.ts diff --git a/docs/canvas-lab-architecture.md b/docs/canvas-lab-architecture.md index f5acbd1ab5..343ecf6608 100644 --- a/docs/canvas-lab-architecture.md +++ b/docs/canvas-lab-architecture.md @@ -228,6 +228,7 @@ Current safe flow: - dialog passes options -> registry -> block dialogs (`LlmDialog`, `ModelConfigDialog`, `TimedeltaDialog`) No dialog component should import store directly. +Exception: read-only derived data (e.g. `available-variables.tsx` reads `configs` for variable list). ## 9) Add New Block (exact flow) diff --git a/studio/frontend/src/features/canvas-lab/components/canvas-aux-node.tsx b/studio/frontend/src/features/canvas-lab/components/canvas-aux-node.tsx index 2c531a432c..1da19b939f 100644 --- a/studio/frontend/src/features/canvas-lab/components/canvas-aux-node.tsx +++ b/studio/frontend/src/features/canvas-lab/components/canvas-aux-node.tsx @@ -1,3 +1,4 @@ +import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; @@ -13,6 +14,7 @@ import { MAX_NODE_WIDTH, MIN_NODE_WIDTH } from "../constants"; import { useCanvasLabStore } from "../stores/canvas-lab"; import type { LayoutDirection, LlmConfig, Score, ScoreOption } from "../types"; import { HANDLE_IDS } from "../utils/handles"; +import { getAvailableVariables } from "../utils/variables"; import { BaseNode, BaseNodeContent, BaseNodeHeader, BaseNodeHeaderTitle } from "./rf-ui/base-node"; type PromptField = "prompt" | "system_prompt"; @@ -56,6 +58,28 @@ function updateOptionAt( ); } +function AuxVariableBadges({ llmId }: { llmId: string }): ReactElement | null { + const configs = useCanvasLabStore((state) => state.configs); + const vars = getAvailableVariables(configs, llmId); + if (vars.length === 0) return null; + return ( +
+

Available references

+
+ {vars.map((v) => ( + + {v} + + ))} +
+
+ ); +} + function AuxNodeBase({ data, }: NodeProps): ReactElement | null { @@ -88,9 +112,9 @@ function AuxNodeBase({ {data.title} - +