From 8d3f791966ee0098e7a306a5df53526e6332e29e Mon Sep 17 00:00:00 2001 From: Alexander Thiess Date: Mon, 22 Sep 2025 11:36:45 +0200 Subject: [PATCH] changed fields --- src/components/ollama_model_edit.py | 100 +++++++++++++--------------- 1 file changed, 47 insertions(+), 53 deletions(-) diff --git a/src/components/ollama_model_edit.py b/src/components/ollama_model_edit.py index 084ca7d..5c00b74 100644 --- a/src/components/ollama_model_edit.py +++ b/src/components/ollama_model_edit.py @@ -100,22 +100,22 @@ class OllamaModelEditComponent(AsyncCard): ui.label('Common Parameters').classes('text-md font-medium mt-2 mb-3') # Temperature - self.build_float_component(label='Temperature', switch_binding='use_temperature', value_binding='temperature', - value_min=0.0, value_max=2.0, value_step=0.1, - value=model_parameters['temperature'] if 'temperature' in model_parameters else None, - value_default=0.8, - info='The temperature of the model. Higher values (e.g., 1.2) make output more creative, lower values (e.g., 0.5) more focused. Default: 0.8', - backward=lambda x: f'{x:.1f}') + self.build_slider_component(label='Temperature', switch_binding='use_temperature', value_binding='temperature', + value_min=0.0, value_max=2.0, value_step=0.1, + value=model_parameters['temperature'] if 'temperature' in model_parameters else None, + value_default=0.8, + info='The temperature of the model. Higher values (e.g., 1.2) make output more creative, lower values (e.g., 0.5) more focused. Default: 0.8', + backward=lambda x: f'{x:.1f}') # Context Length (always visible) model_context_length: Optional[int] = None # the context length the model supports for model_info_key, model_info_value in model_info['model_info'].items(): if model_info_key.endswith('context_length'): model_context_length = model_info_value - self.build_float_component('Context Length', 'use_num_ctx', 'num_ctx', 512, model_context_length, 1, - model_parameters['num_ctx'] if 'num_ctx' in model_parameters else None, - 4096, - 'Size of the context window used to generate the next token. Default: 4096') + self.build_slider_component('Context Length', 'use_num_ctx', 'num_ctx', 512, model_context_length, 1, + model_parameters['num_ctx'] if 'num_ctx' in model_parameters else None, + 4096, + 'Size of the context window used to generate the next token. Default: 4096') # Max Tokens (always visible) # TODO MISSING ????? @@ -132,56 +132,50 @@ class OllamaModelEditComponent(AsyncCard): with ui.expansion('Generation', icon='tune', group='creation_group').classes('w-full mb-2'): with ui.column().classes('w-full gap-1 pt-2'): # Top K - with ui.row().classes('items-center gap-2 w-full'): - ui.switch().bind_value(self, 'use_top_k').props('dense') - ui.label('Top K').classes('min-w-fit') - ui.number(value=40, min=1, max=200).classes('flex-1').props('dense').bind_value(self, 'top_k').bind_enabled_from(self, 'use_top_k') - ui.icon('info', size='sm').classes('text-gray-500 cursor-help').tooltip('Reduces probability of generating nonsense. Higher values (e.g., 100) give more diverse answers, lower values (e.g., 10) are more conservative. Default: 40') - + self.build_slider_component(label='Top K', switch_binding='use_top_k', value_binding='top_k', + value_min=1, value_max=200, value_step=1, + value=model_parameters['top_k'] if 'top_k' in model_parameters else None, + value_default=40, + info='Reduces probability of generating nonsense. Higher values (e.g., 100) give more diverse answers, lower values (e.g., 10) are more conservative. Default: 40') # Top P - with ui.row().classes('items-center gap-2 w-full'): - ui.switch().bind_value(self, 'use_top_p').props('dense') - ui.label('Top P').classes('min-w-fit') - ui.slider(min=0.0, max=1.0, step=0.05).classes('flex-1').props('dense').bind_value(self, 'top_p').bind_enabled_from(self, 'use_top_p') - ui.label().bind_text_from(self, 'top_p', backward=lambda x: f'{x:.2f}').classes('text-xs text-gray-500 min-w-fit') - ui.icon('info', size='sm').classes('text-gray-500 cursor-help').tooltip('Works with top-k. Higher values (e.g., 0.95) lead to more diverse text, lower values (e.g., 0.5) generate more focused text. Default: 0.9') - + self.build_slider_component(label='Top P', switch_binding='use_top_p', value_binding='top_p', + value_min=0.0, value_max=1.0, value_step=0.01, + value=model_parameters['top_p'] if 'top_p' in model_parameters else None, + value_default=0.9, + info='Works with top-k. Higher values (e.g., 0.95) lead to more diverse text, lower values (e.g., 0.5) generate more focused text. Default: 0.9', + backward=lambda x: f'{x:.2f}') # Min P - with ui.row().classes('items-center gap-2 w-full'): - ui.switch().bind_value(self, 'use_min_p').props('dense') - ui.label('Min P').classes('min-w-fit') - ui.slider(min=0.0, max=1.0, step=0.01).classes('flex-1').props('dense').bind_value(self, 'min_p').bind_enabled_from(self, 'use_min_p') - ui.label().bind_text_from(self, 'min_p', backward=lambda x: f'{x:.2f}').classes('text-xs text-gray-500 min-w-fit') - ui.icon('info', size='sm').classes('text-gray-500 cursor-help').tooltip('Alternative to top_p. Minimum probability for a token relative to the most likely token. Default: 0.0') - + self.build_slider_component(label='Min P', switch_binding='use_min_p', value_binding='min_p', + value_min=0.0, value_max=1.0, value_step=0.01, + value=model_parameters['min_p'] if 'min_p' in model_parameters else None, + value_default=0.0, + info='Alternative to top_p. Minimum probability for a token relative to the most likely token. Default: 0.0', + backward=lambda x: f'{x:.2f}') # Repetition Parameters with ui.expansion('Repetition Control', icon='repeat', group='creation_group').classes('w-full mb-2'): with ui.column().classes('w-full gap-1 pt-2'): # Repeat Last N - with ui.row().classes('items-center gap-2 w-full'): - ui.switch().bind_value(self, 'use_repeat_last_n').props('dense') - ui.label('Repeat Last N').classes('min-w-fit') - ui.number(value=64, min=-1, max=512).classes('flex-1').props('dense').bind_value(self, 'repeat_last_n').bind_enabled_from(self, 'use_repeat_last_n') - ui.icon('info', size='sm').classes('text-gray-500 cursor-help').tooltip('How far back the model looks to prevent repetition. 0=disabled, -1=num_ctx. Default: 64') - + self.build_slider_component(label='Repeat Last N', switch_binding='use_repeat_last_n', value_binding='repeat_last_n', + value_min=-1, value_max=512, value_step=1, + value=model_parameters['repeat_last_n'] if 'repeat_last_n' in model_parameters else None, + value_default=64, + info='How far back the model looks to prevent repetition. 0=disabled, -1=num_ctx. Default: 64') # Repeat Penalty - with ui.row().classes('items-center gap-2 w-full'): - ui.switch().bind_value(self, 'use_repeat_penalty').props('dense') - ui.label('Repeat Penalty').classes('min-w-fit') - ui.slider(min=0.5, max=2.0, step=0.1).classes('flex-1').bind_value(self, 'repeat_penalty').bind_enabled_from(self, 'use_repeat_penalty') - ui.label().bind_text_from(self, 'repeat_penalty', backward=lambda x: f'{x:.1f}').classes('text-xs text-gray-500 min-w-fit').props('dense') - ui.icon('info', size='sm').classes('text-gray-500 cursor-help').tooltip('How strongly to penalize repetitions. Higher values (e.g., 1.5) penalize more, lower values (e.g., 0.9) are more lenient. Default: 1.1') - + self.build_slider_component(label='Repeat Penalty', switch_binding='use_repeat_penalty', value_binding='repeat_penalty', + value_min=0.5, value_max=2.0, value_step=0.1, + value=model_parameters['repeat_penalty'] if 'repeat_penalty' in model_parameters else None, + value_default=1.1, + info='How strongly to penalize repetitions. Higher values (e.g., 1.5) penalize more, lower values (e.g., 0.9) are more lenient. Default: 1.1', + backward=lambda x: f'{x:.1f}') # Control Parameters with ui.expansion('Control', icon='settings', group='creation_group').classes('w-full mb-2'): with ui.column().classes('w-full gap-1 pt-2'): # Seed - with ui.row().classes('items-center gap-2 w-full'): - ui.switch().bind_value(self, 'use_seed').props('dense') - ui.label('Seed').classes('min-w-fit') - ui.number(value=0, min=0, max=999999).classes('flex-1').props('dense').bind_value(self, 'seed').bind_enabled_from(self, 'use_seed') - ui.icon('info', size='sm').classes('text-gray-500 cursor-help').tooltip('Random number seed for generation. Same seed produces same output for same prompt. Default: 0') - + self.build_slider_component(label='Seed', switch_binding='use_seed', value_binding='seed', + value_min=0, value_max=999999, value_step=1, + value=model_parameters['seed'] if 'seed' in model_parameters else None, + value_default=0, + info='Random number seed for generation. Same seed produces same output for same prompt. Default: 0') # Stop Sequences with ui.row().classes('items-center gap-2 w-full'): ui.switch().bind_value(self, 'use_stop').props('dense') @@ -209,10 +203,10 @@ class OllamaModelEditComponent(AsyncCard): # Save button self.create_btn = ui.button('Save Model', icon='save', on_click=self.create_model).props('color=primary').classes('w-full').bind_enabled_from(self, 'model_name', backward=lambda x: bool(x) and not self.is_downloading) - def build_float_component(self, label, switch_binding, - value_binding, value_min, value_max, value_step, value, value_default, - info, backward=None - ): + def build_slider_component(self, label, switch_binding, + value_binding, value_min, value_max, value_step, value, value_default, + info, backward=None + ): with ui.row().classes('items-center gap-2 w-full mb-1'): ui.switch().bind_value(self, switch_binding).props('dense').set_value(value is not None) ui.label(label).classes('min-w-fit')