Skip to content

Commit 191c5da

Browse files
committed
Components for processor_run column types in sheet
1 parent 4bf3f07 commit 191c5da

File tree

3 files changed

+149
-11
lines changed

3 files changed

+149
-11
lines changed
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
import React, { useEffect, useState } from "react";
2+
import { Stack, Box, Tab } from "@mui/material";
3+
import { TabContext, TabList, TabPanel } from "@mui/lab";
4+
import ApiBackendSelector from "../ApiBackendSelector";
5+
import ThemedJsonForm from "../ThemedJsonForm";
6+
import validator from "@rjsf/validator-ajv8";
7+
import { useRecoilValue } from "recoil";
8+
import { apiBackendSelectedState } from "../../data/atoms";
9+
import TextFieldWithVars from "../apps/TextFieldWithVars";
10+
11+
export default function ProcessorRunForm({
12+
setData,
13+
providerSlug,
14+
processorSlug,
15+
processorInput,
16+
processorConfig,
17+
processorOutputTemplate,
18+
columns,
19+
}) {
20+
const apiBackendSelected = useRecoilValue(apiBackendSelectedState);
21+
const [tabValue, setTabValue] = useState("input");
22+
23+
const handleTabChange = (event, newValue) => {
24+
setTabValue(newValue);
25+
};
26+
27+
useEffect(() => {
28+
setData({
29+
processor_slug: apiBackendSelected?.slug,
30+
provider_slug: apiBackendSelected?.api_provider?.slug,
31+
});
32+
}, [apiBackendSelected, setData]);
33+
34+
return (
35+
<Stack spacing={2}>
36+
<ApiBackendSelector
37+
hideDescription={true}
38+
defaultProvider={providerSlug}
39+
defaultProcessor={processorSlug}
40+
/>
41+
<TabContext value={tabValue}>
42+
<Box sx={{ borderBottom: 1, borderColor: "divider" }}>
43+
<TabList
44+
onChange={handleTabChange}
45+
aria-label="Processor run form tabs"
46+
>
47+
<Tab label="Input" value="input" />
48+
<Tab label="Config" value="config" />
49+
<Tab label="Output" value="output" />
50+
</TabList>
51+
</Box>
52+
<TabPanel value="input">
53+
<ThemedJsonForm
54+
schema={apiBackendSelected ? apiBackendSelected.input_schema : {}}
55+
uiSchema={
56+
apiBackendSelected ? apiBackendSelected.input_ui_schema : {}
57+
}
58+
formData={processorInput}
59+
validator={validator}
60+
onChange={(e) => {
61+
setData({
62+
input: e.formData,
63+
});
64+
}}
65+
disableAdvanced={true}
66+
/>
67+
</TabPanel>
68+
<TabPanel value="config">
69+
<ThemedJsonForm
70+
schema={apiBackendSelected ? apiBackendSelected.config_schema : {}}
71+
uiSchema={
72+
apiBackendSelected ? apiBackendSelected.config_ui_schema : {}
73+
}
74+
formData={processorConfig}
75+
validator={validator}
76+
onChange={(e) => {
77+
setData({
78+
config: e.formData,
79+
});
80+
}}
81+
/>
82+
</TabPanel>
83+
<TabPanel value="output">
84+
<TextFieldWithVars
85+
label="Output Template"
86+
multiline
87+
value={processorOutputTemplate?.markdown || ""}
88+
onChange={(text) => {
89+
setData({
90+
output_template: { markdown: text },
91+
});
92+
}}
93+
sx={{ width: "100%" }}
94+
introText="Use the {{ }} syntax to reference data from the processor's own output."
95+
schemas={[
96+
{
97+
label: apiBackendSelected?.name,
98+
pillPrefix: `${apiBackendSelected?.api_provider?.name} / ${apiBackendSelected?.name} / `,
99+
items: apiBackendSelected?.output_schema,
100+
id: null,
101+
},
102+
]}
103+
/>
104+
</TabPanel>
105+
</TabContext>
106+
</Stack>
107+
);
108+
}

llmstack/client/src/components/sheets/Sheet.jsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,9 @@ function Sheet(props) {
7272

7373
return {
7474
kind:
75-
(cell?.kind === "app_run" ? GridCellKind.Text : cell?.kind) ||
76-
columns[column].kind,
75+
(cell?.kind === "app_run" || cell?.kind === "processor_run"
76+
? GridCellKind.Text
77+
: cell?.kind) || columns[column].kind,
7778
displayData: cell?.display_data || "",
7879
data: cell?.display_data || "",
7980
allowOverlay: true,
@@ -98,7 +99,7 @@ function Sheet(props) {
9899
data: column.data,
99100
hasMenu: true,
100101
icon:
101-
column.kind === "app_run"
102+
column.kind === "app_run" || column.kind === "processor_run"
102103
? GridColumnIcon.HeaderRollup
103104
: GridColumnIcon.HeaderString,
104105
width: column.width || 300,

llmstack/client/src/components/sheets/SheetColumnMenu.jsx

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
import { DeleteOutlined, AddOutlined } from "@mui/icons-material";
1515
import { GridCellKind } from "@glideapps/glide-data-grid";
1616
import AppRunForm from "./AppRunForm";
17+
import ProcessorRunForm from "./ProcessorRunForm"; // Added this import
1718
import "@glideapps/glide-data-grid/dist/index.css";
1819

1920
const numberToLetters = (num) => {
@@ -37,12 +38,12 @@ export function SheetColumnMenu({
3738
}) {
3839
const [columnName, setColumnName] = useState(column?.title || "");
3940
const [columnType, setColumnType] = useState(GridCellKind.Text);
40-
const columnAppRunData = useRef(column?.data || {});
41+
const columnRunData = useRef(column?.data || {});
4142

4243
useEffect(() => {
4344
setColumnType(column?.kind || GridCellKind.Text);
4445
setColumnName(column?.title || "");
45-
columnAppRunData.current = column?.data || {};
46+
columnRunData.current = column?.data || {};
4647
}, [column]);
4748

4849
const handleAddOrEditColumn = () => {
@@ -51,8 +52,9 @@ export function SheetColumnMenu({
5152
title: columnName || "New Column",
5253
kind: columnType,
5354
data:
54-
columnType === "app_run" && columnAppRunData.current
55-
? columnAppRunData.current
55+
(columnType === "app_run" || columnType === "processor_run") &&
56+
columnRunData.current
57+
? columnRunData.current
5658
: {},
5759
};
5860

@@ -80,7 +82,12 @@ export function SheetColumnMenu({
8082
role={undefined}
8183
placement="bottom-start"
8284
transition
83-
sx={{ width: "450px" }}
85+
sx={{
86+
width: "450px",
87+
maxHeight: "90vh",
88+
overflowY: "auto",
89+
padding: "0px 2px 8px 2px",
90+
}}
8491
>
8592
{({ TransitionProps, placement }) => (
8693
<Grow
@@ -131,14 +138,36 @@ export function SheetColumnMenu({
131138
<MenuItem value={"number"}>Number</MenuItem>
132139
<MenuItem value={"image"}>Image</MenuItem>
133140
<MenuItem value={"app_run"}>App Run</MenuItem>
141+
<MenuItem value={"processor_run"}>Processor Run</MenuItem>
134142
</Select>
135143
{columnType === "app_run" && (
136144
<AppRunForm
137145
setData={(data) => {
138-
columnAppRunData.current = data;
146+
columnRunData.current = {
147+
...columnRunData.current,
148+
...data,
149+
};
139150
}}
140-
appSlug={columnAppRunData.current?.app_slug}
141-
appInput={columnAppRunData.current?.input}
151+
appSlug={columnRunData.current?.app_slug}
152+
appInput={columnRunData.current?.input}
153+
columns={columns}
154+
/>
155+
)}
156+
{columnType === "processor_run" && (
157+
<ProcessorRunForm
158+
setData={(data) => {
159+
columnRunData.current = {
160+
...columnRunData.current,
161+
...data,
162+
};
163+
}}
164+
providerSlug={columnRunData.current?.provider_slug}
165+
processorSlug={columnRunData.current?.processor_slug}
166+
processorInput={columnRunData.current?.input}
167+
processorConfig={columnRunData.current?.config}
168+
processorOutputTemplate={
169+
columnRunData.current?.output_template
170+
}
142171
columns={columns}
143172
/>
144173
)}

0 commit comments

Comments
 (0)