changed fields
This commit is contained in:
@@ -100,22 +100,22 @@ 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,
|
||||||
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',
|
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}')
|
backward=lambda x: f'{x:.1f}')
|
||||||
# Context Length (always visible)
|
# Context Length (always visible)
|
||||||
model_context_length: Optional[int] = None # the context length the model supports
|
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():
|
for model_info_key, model_info_value in model_info['model_info'].items():
|
||||||
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')
|
||||||
|
|
||||||
# Max Tokens (always visible)
|
# Max Tokens (always visible)
|
||||||
# TODO MISSING ?????
|
# 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.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,10 +203,10 @@ 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
|
||||||
):
|
):
|
||||||
with ui.row().classes('items-center gap-2 w-full mb-1'):
|
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.switch().bind_value(self, switch_binding).props('dense').set_value(value is not None)
|
||||||
ui.label(label).classes('min-w-fit')
|
ui.label(label).classes('min-w-fit')
|
||||||
|
|||||||
Reference in New Issue
Block a user