changed fields

This commit is contained in:
2025-09-22 11:36:45 +02:00
parent 6cda81088d
commit 8d3f791966

View File

@@ -100,7 +100,7 @@ class OllamaModelEditComponent(AsyncCard):
ui.label('Common Parameters').classes('text-md font-medium mt-2 mb-3') ui.label('Common Parameters').classes('text-md font-medium mt-2 mb-3')
# Temperature # Temperature
self.build_float_component(label='Temperature', switch_binding='use_temperature', value_binding='temperature', 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_min=0.0, value_max=2.0, value_step=0.1,
value=model_parameters['temperature'] if 'temperature' in model_parameters else None, value=model_parameters['temperature'] if 'temperature' in model_parameters else None,
value_default=0.8, value_default=0.8,
@@ -112,7 +112,7 @@ class OllamaModelEditComponent(AsyncCard):
if model_info_key.endswith('context_length'): if model_info_key.endswith('context_length'):
model_context_length = model_info_value model_context_length = model_info_value
self.build_float_component('Context Length', 'use_num_ctx', 'num_ctx', 512, model_context_length, 1, 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, model_parameters['num_ctx'] if 'num_ctx' in model_parameters else None,
4096, 4096,
'Size of the context window used to generate the next token. Default: 4096') 'Size of the context window used to generate the next token. Default: 4096')
@@ -132,56 +132,50 @@ class OllamaModelEditComponent(AsyncCard):
with ui.expansion('Generation', icon='tune', group='creation_group').classes('w-full mb-2'): with ui.expansion('Generation', icon='tune', group='creation_group').classes('w-full mb-2'):
with ui.column().classes('w-full gap-1 pt-2'): with ui.column().classes('w-full gap-1 pt-2'):
# Top K # Top K
with ui.row().classes('items-center gap-2 w-full'): self.build_slider_component(label='Top K', switch_binding='use_top_k', value_binding='top_k',
ui.switch().bind_value(self, 'use_top_k').props('dense') value_min=1, value_max=200, value_step=1,
ui.label('Top K').classes('min-w-fit') value=model_parameters['top_k'] if 'top_k' in model_parameters else None,
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') value_default=40,
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') 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 # Top P
with ui.row().classes('items-center gap-2 w-full'): self.build_slider_component(label='Top P', switch_binding='use_top_p', value_binding='top_p',
ui.switch().bind_value(self, 'use_top_p').props('dense') value_min=0.0, value_max=1.0, value_step=0.01,
ui.label('Top P').classes('min-w-fit') value=model_parameters['top_p'] if 'top_p' in model_parameters else None,
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') value_default=0.9,
ui.label().bind_text_from(self, 'top_p', backward=lambda x: f'{x:.2f}').classes('text-xs text-gray-500 min-w-fit') 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',
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') backward=lambda x: f'{x:.2f}')
# Min P # Min P
with ui.row().classes('items-center gap-2 w-full'): self.build_slider_component(label='Min P', switch_binding='use_min_p', value_binding='min_p',
ui.switch().bind_value(self, 'use_min_p').props('dense') value_min=0.0, value_max=1.0, value_step=0.01,
ui.label('Min P').classes('min-w-fit') value=model_parameters['min_p'] if 'min_p' in model_parameters else None,
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') value_default=0.0,
ui.label().bind_text_from(self, 'min_p', backward=lambda x: f'{x:.2f}').classes('text-xs text-gray-500 min-w-fit') info='Alternative to top_p. Minimum probability for a token relative to the most likely token. Default: 0.0',
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') backward=lambda x: f'{x:.2f}')
# Repetition Parameters # Repetition Parameters
with ui.expansion('Repetition Control', icon='repeat', group='creation_group').classes('w-full mb-2'): 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'): with ui.column().classes('w-full gap-1 pt-2'):
# Repeat Last N # Repeat Last N
with ui.row().classes('items-center gap-2 w-full'): self.build_slider_component(label='Repeat Last N', switch_binding='use_repeat_last_n', value_binding='repeat_last_n',
ui.switch().bind_value(self, 'use_repeat_last_n').props('dense') value_min=-1, value_max=512, value_step=1,
ui.label('Repeat Last N').classes('min-w-fit') value=model_parameters['repeat_last_n'] if 'repeat_last_n' in model_parameters else None,
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') value_default=64,
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') info='How far back the model looks to prevent repetition. 0=disabled, -1=num_ctx. Default: 64')
# Repeat Penalty # Repeat Penalty
with ui.row().classes('items-center gap-2 w-full'): self.build_slider_component(label='Repeat Penalty', switch_binding='use_repeat_penalty', value_binding='repeat_penalty',
ui.switch().bind_value(self, 'use_repeat_penalty').props('dense') value_min=0.5, value_max=2.0, value_step=0.1,
ui.label('Repeat Penalty').classes('min-w-fit') value=model_parameters['repeat_penalty'] if 'repeat_penalty' in model_parameters else None,
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') value_default=1.1,
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') 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',
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') backward=lambda x: f'{x:.1f}')
# Control Parameters # Control Parameters
with ui.expansion('Control', icon='settings', group='creation_group').classes('w-full mb-2'): with ui.expansion('Control', icon='settings', group='creation_group').classes('w-full mb-2'):
with ui.column().classes('w-full gap-1 pt-2'): with ui.column().classes('w-full gap-1 pt-2'):
# Seed # Seed
with ui.row().classes('items-center gap-2 w-full'): self.build_slider_component(label='Seed', switch_binding='use_seed', value_binding='seed',
ui.switch().bind_value(self, 'use_seed').props('dense') value_min=0, value_max=999999, value_step=1,
ui.label('Seed').classes('min-w-fit') value=model_parameters['seed'] if 'seed' in model_parameters else None,
ui.number(value=0, min=0, max=999999).classes('flex-1').props('dense').bind_value(self, 'seed').bind_enabled_from(self, 'use_seed') value_default=0,
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') info='Random number seed for generation. Same seed produces same output for same prompt. Default: 0')
# Stop Sequences # Stop Sequences
with ui.row().classes('items-center gap-2 w-full'): with ui.row().classes('items-center gap-2 w-full'):
ui.switch().bind_value(self, 'use_stop').props('dense') ui.switch().bind_value(self, 'use_stop').props('dense')
@@ -209,7 +203,7 @@ class OllamaModelEditComponent(AsyncCard):
# Save button # 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) 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, def build_slider_component(self, label, switch_binding,
value_binding, value_min, value_max, value_step, value, value_default, value_binding, value_min, value_max, value_step, value, value_default,
info, backward=None info, backward=None
): ):