Maharshi Gor commited on
Commit
e1ce295
Β·
1 Parent(s): 38e3800

Update ModelStep

Browse files

Bugfix: 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 "question_text"
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="question_text")
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("❌", elem_classes="icon-button delete-button", scale=0)
 
 
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("❌", elem_classes="icon-button delete-button", scale=0)
 
 
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):