Maharshi Gor
commited on
Commit
Β·
e1ce295
1
Parent(s):
38e3800
Update ModelStep
Browse filesBugfix: Disallow removing rows when the last one is left
Reordered the placement of var, name, description
Suggest name when variable is selected and name is empty.
src/components/model_pipeline/model_pipeline.py
CHANGED
@@ -119,7 +119,7 @@ class PipelineInterface:
|
|
119 |
return step_interface
|
120 |
|
121 |
is_multi_step = n_steps > 1
|
122 |
-
logger.debug(f"Rendering step {position} of {n_steps}")
|
123 |
|
124 |
# Add step controls below
|
125 |
with gr.Row(elem_classes="step-controls", visible=is_multi_step):
|
|
|
119 |
return step_interface
|
120 |
|
121 |
is_multi_step = n_steps > 1
|
122 |
+
# logger.debug(f"Rendering step {position} of {n_steps}")
|
123 |
|
124 |
# Add step controls below
|
125 |
with gr.Row(elem_classes="step-controls", visible=is_multi_step):
|
src/components/model_step/model_step.py
CHANGED
@@ -4,6 +4,7 @@ from typing import Any
|
|
4 |
import gradio as gr
|
5 |
from gradio.components import FormComponent
|
6 |
|
|
|
7 |
from components.model_pipeline.state_manager import ModelStepUIState, PipelineState, PipelineStateManager
|
8 |
from utils import get_full_model_name
|
9 |
from workflows.structs import ModelStep
|
@@ -50,7 +51,7 @@ class ModelStepComponent(FormComponent):
|
|
50 |
"output": max_output_fields,
|
51 |
}
|
52 |
self.model_options = model_options
|
53 |
-
self.input_variables = input_variables
|
54 |
self.sm = ModelStepStateManager(max_input_fields, max_output_fields)
|
55 |
self.pipeline_sm: PipelineStateManager = pipeline_state_manager
|
56 |
|
@@ -100,26 +101,13 @@ class ModelStepComponent(FormComponent):
|
|
100 |
inputs = self.model_step.input_fields
|
101 |
is_visible = i < len(inputs)
|
102 |
label_visible = i == 0
|
|
|
103 |
initial_name = inputs[i].name if is_visible else ""
|
104 |
initial_desc = inputs[i].description if is_visible else ""
|
105 |
-
initial_var = inputs[i].variable if is_visible else
|
106 |
|
107 |
with gr.Row(visible=is_visible, elem_classes="field-row form") as row:
|
108 |
-
button_group = InputRowButtonGroup()
|
109 |
-
|
110 |
-
inp_name = gr.Textbox(
|
111 |
-
label="Input Name",
|
112 |
-
placeholder="Field name",
|
113 |
-
value=initial_name,
|
114 |
-
elem_classes="field-name",
|
115 |
-
scale=1,
|
116 |
-
show_label=label_visible,
|
117 |
-
)
|
118 |
-
|
119 |
-
# Get variable choices safely
|
120 |
-
# variable_choices = []
|
121 |
-
# if self.pipeline_sm is not None:
|
122 |
-
# variable_choices = self.pipeline_sm.get_all_variables(self.step_id)
|
123 |
|
124 |
inp_var = gr.Dropdown(
|
125 |
choices=self.input_variables,
|
@@ -129,6 +117,14 @@ class ModelStepComponent(FormComponent):
|
|
129 |
scale=1,
|
130 |
show_label=label_visible,
|
131 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
132 |
inp_desc = gr.Textbox(
|
133 |
label="Description",
|
134 |
placeholder="Field description",
|
@@ -146,11 +142,12 @@ class ModelStepComponent(FormComponent):
|
|
146 |
outputs = self.model_step.output_fields
|
147 |
is_visible = i < len(outputs)
|
148 |
label_visible = i == 0
|
|
|
149 |
initial_name = outputs[i].name if is_visible else ""
|
150 |
initial_desc = outputs[i].description if is_visible else ""
|
151 |
initial_type = outputs[i].type if is_visible else "str"
|
152 |
with gr.Row(visible=is_visible, elem_classes="field-row") as row:
|
153 |
-
button_group = OutputRowButtonGroup()
|
154 |
|
155 |
out_name = gr.Textbox(
|
156 |
label="Output Field",
|
@@ -334,7 +331,7 @@ class ModelStepComponent(FormComponent):
|
|
334 |
|
335 |
inp_var.change(
|
336 |
fn=self.sm.update_input_field_variable,
|
337 |
-
inputs=[self.model_step_state, inp_var, row_index],
|
338 |
outputs=[self.model_step_state],
|
339 |
)
|
340 |
|
|
|
4 |
import gradio as gr
|
5 |
from gradio.components import FormComponent
|
6 |
|
7 |
+
from app_configs import UNSELECTED_VAR_NAME
|
8 |
from components.model_pipeline.state_manager import ModelStepUIState, PipelineState, PipelineStateManager
|
9 |
from utils import get_full_model_name
|
10 |
from workflows.structs import ModelStep
|
|
|
51 |
"output": max_output_fields,
|
52 |
}
|
53 |
self.model_options = model_options
|
54 |
+
self.input_variables = [UNSELECTED_VAR_NAME] + input_variables
|
55 |
self.sm = ModelStepStateManager(max_input_fields, max_output_fields)
|
56 |
self.pipeline_sm: PipelineStateManager = pipeline_state_manager
|
57 |
|
|
|
101 |
inputs = self.model_step.input_fields
|
102 |
is_visible = i < len(inputs)
|
103 |
label_visible = i == 0
|
104 |
+
disable_delete = i == 0 and len(inputs) == 1
|
105 |
initial_name = inputs[i].name if is_visible else ""
|
106 |
initial_desc = inputs[i].description if is_visible else ""
|
107 |
+
initial_var = inputs[i].variable or UNSELECTED_VAR_NAME if is_visible else UNSELECTED_VAR_NAME
|
108 |
|
109 |
with gr.Row(visible=is_visible, elem_classes="field-row form") as row:
|
110 |
+
button_group = InputRowButtonGroup(disable_delete=disable_delete)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
111 |
|
112 |
inp_var = gr.Dropdown(
|
113 |
choices=self.input_variables,
|
|
|
117 |
scale=1,
|
118 |
show_label=label_visible,
|
119 |
)
|
120 |
+
inp_name = gr.Textbox(
|
121 |
+
label="Input Name",
|
122 |
+
placeholder="Field name",
|
123 |
+
value=initial_name,
|
124 |
+
elem_classes="field-name",
|
125 |
+
scale=1,
|
126 |
+
show_label=label_visible,
|
127 |
+
)
|
128 |
inp_desc = gr.Textbox(
|
129 |
label="Description",
|
130 |
placeholder="Field description",
|
|
|
142 |
outputs = self.model_step.output_fields
|
143 |
is_visible = i < len(outputs)
|
144 |
label_visible = i == 0
|
145 |
+
disable_delete = i == 0 and len(outputs) == 1
|
146 |
initial_name = outputs[i].name if is_visible else ""
|
147 |
initial_desc = outputs[i].description if is_visible else ""
|
148 |
initial_type = outputs[i].type if is_visible else "str"
|
149 |
with gr.Row(visible=is_visible, elem_classes="field-row") as row:
|
150 |
+
button_group = OutputRowButtonGroup(disable_delete=disable_delete)
|
151 |
|
152 |
out_name = gr.Textbox(
|
153 |
label="Output Field",
|
|
|
331 |
|
332 |
inp_var.change(
|
333 |
fn=self.sm.update_input_field_variable,
|
334 |
+
inputs=[self.model_step_state, inp_var, inp_name, row_index],
|
335 |
outputs=[self.model_step_state],
|
336 |
)
|
337 |
|
src/components/model_step/state_manager.py
CHANGED
@@ -1,7 +1,9 @@
|
|
1 |
from typing import Any, Literal, Union
|
2 |
|
3 |
import gradio as gr
|
|
|
4 |
|
|
|
5 |
from components.model_pipeline.state_manager import ModelStepUIState
|
6 |
from components.utils import DIRECTIONS, move_item
|
7 |
from utils import get_model_and_provider
|
@@ -41,8 +43,14 @@ class ModelStepStateManager:
|
|
41 |
"""Update a specific field of an input field at the given index."""
|
42 |
return model_step.update_field("input", index, "name", value)
|
43 |
|
44 |
-
def update_input_field_variable(self, model_step: ModelStep, value: str, index: int) -> ModelStep:
|
45 |
"""Update a specific field of an input field at the given index."""
|
|
|
|
|
|
|
|
|
|
|
|
|
46 |
return model_step.update_field("input", index, "variable", value)
|
47 |
|
48 |
def update_input_field_description(self, model_step: ModelStep, value: str, index: int) -> ModelStep:
|
@@ -115,7 +123,7 @@ class ModelStepStateManager:
|
|
115 |
|
116 |
# Field add/delete functions
|
117 |
def add_input_field(self, model_step: ModelStep, index: int = -1):
|
118 |
-
updates = self._add_field(model_step, "input", index, input_var=
|
119 |
return *updates, *self.make_input_field_updates(model_step)
|
120 |
|
121 |
def add_output_field(self, model_step: ModelStep, index: int = -1):
|
|
|
1 |
from typing import Any, Literal, Union
|
2 |
|
3 |
import gradio as gr
|
4 |
+
from loguru import logger
|
5 |
|
6 |
+
from app_configs import UNSELECTED_VAR_NAME
|
7 |
from components.model_pipeline.state_manager import ModelStepUIState
|
8 |
from components.utils import DIRECTIONS, move_item
|
9 |
from utils import get_model_and_provider
|
|
|
43 |
"""Update a specific field of an input field at the given index."""
|
44 |
return model_step.update_field("input", index, "name", value)
|
45 |
|
46 |
+
def update_input_field_variable(self, model_step: ModelStep, value: str, name: str, index: int) -> ModelStep:
|
47 |
"""Update a specific field of an input field at the given index."""
|
48 |
+
if value == UNSELECTED_VAR_NAME:
|
49 |
+
return model_step.update_field("input", index, "variable", "")
|
50 |
+
if name == "":
|
51 |
+
suggested_name = value.split(".", 1)[-1]
|
52 |
+
logger.info(f"Updating input field variable to {value}. Suggested name: {suggested_name}")
|
53 |
+
model_step = model_step.update_field("input", index, "name", suggested_name)
|
54 |
return model_step.update_field("input", index, "variable", value)
|
55 |
|
56 |
def update_input_field_description(self, model_step: ModelStep, value: str, index: int) -> ModelStep:
|
|
|
123 |
|
124 |
# Field add/delete functions
|
125 |
def add_input_field(self, model_step: ModelStep, index: int = -1):
|
126 |
+
updates = self._add_field(model_step, "input", index, input_var=UNSELECTED_VAR_NAME)
|
127 |
return *updates, *self.make_input_field_updates(model_step)
|
128 |
|
129 |
def add_output_field(self, model_step: ModelStep, index: int = -1):
|
src/components/model_step/ui_components.py
CHANGED
@@ -45,11 +45,14 @@ class InputRowButtonGroup(ButtonGroup):
|
|
45 |
EVENTS = ["delete", "add"]
|
46 |
|
47 |
def __init__(self, *args, **kwargs):
|
|
|
48 |
super().__init__(self.EVENTS, *args, **kwargs)
|
49 |
|
50 |
def render(self):
|
51 |
with gr.Column(scale=0, min_width=40, elem_classes="button-column"):
|
52 |
-
self.buttons["delete"] = gr.Button(
|
|
|
|
|
53 |
self.buttons["add"] = gr.Button("β", elem_classes="icon-button add-field-button", scale=0)
|
54 |
super().render()
|
55 |
|
@@ -66,11 +69,14 @@ class OutputRowButtonGroup(ButtonGroup):
|
|
66 |
EVENTS = ["delete", "add", "up", "down"]
|
67 |
|
68 |
def __init__(self, *args, **kwargs):
|
|
|
69 |
super().__init__(self.EVENTS, *args, **kwargs)
|
70 |
|
71 |
def render(self):
|
72 |
with gr.Column(scale=0, elem_classes="button-column", min_width=40):
|
73 |
-
self.buttons["delete"] = gr.Button(
|
|
|
|
|
74 |
self.buttons["add"] = gr.Button("β", elem_classes="icon-button add-field-button", scale=0)
|
75 |
|
76 |
with gr.Column(scale=0, elem_classes="button-column", min_width=40):
|
|
|
45 |
EVENTS = ["delete", "add"]
|
46 |
|
47 |
def __init__(self, *args, **kwargs):
|
48 |
+
self.disable_delete = kwargs.pop("disable_delete", False)
|
49 |
super().__init__(self.EVENTS, *args, **kwargs)
|
50 |
|
51 |
def render(self):
|
52 |
with gr.Column(scale=0, min_width=40, elem_classes="button-column"):
|
53 |
+
self.buttons["delete"] = gr.Button(
|
54 |
+
"β", elem_classes="icon-button delete-button", scale=0, interactive=not self.disable_delete
|
55 |
+
)
|
56 |
self.buttons["add"] = gr.Button("β", elem_classes="icon-button add-field-button", scale=0)
|
57 |
super().render()
|
58 |
|
|
|
69 |
EVENTS = ["delete", "add", "up", "down"]
|
70 |
|
71 |
def __init__(self, *args, **kwargs):
|
72 |
+
self.disable_delete = kwargs.pop("disable_delete", False)
|
73 |
super().__init__(self.EVENTS, *args, **kwargs)
|
74 |
|
75 |
def render(self):
|
76 |
with gr.Column(scale=0, elem_classes="button-column", min_width=40):
|
77 |
+
self.buttons["delete"] = gr.Button(
|
78 |
+
"β", elem_classes="icon-button delete-button", scale=0, interactive=not self.disable_delete
|
79 |
+
)
|
80 |
self.buttons["add"] = gr.Button("β", elem_classes="icon-button add-field-button", scale=0)
|
81 |
|
82 |
with gr.Column(scale=0, elem_classes="button-column", min_width=40):
|