diff --git a/core/src/types/setting/settingComponent.ts b/core/src/types/setting/settingComponent.ts index 2474f6bd4d..7294b0bbee 100644 --- a/core/src/types/setting/settingComponent.ts +++ b/core/src/types/setting/settingComponent.ts @@ -3,7 +3,11 @@ export type SettingComponentProps = { title: string description: string controllerType: ControllerType - controllerProps: SliderComponentProps | CheckboxComponentProps | InputComponentProps + controllerProps: + | SliderComponentProps + | CheckboxComponentProps + | InputComponentProps + | DropdownComponentProps extensionName?: string requireModelReload?: boolean @@ -12,13 +16,26 @@ export type SettingComponentProps = { export type ConfigType = 'runtime' | 'setting' -export type ControllerType = 'slider' | 'checkbox' | 'input' | 'tag' - -export type InputType = 'password' | 'text' | 'email' | 'number' | 'tel' | 'url' +export type ControllerType = + | 'slider' + | 'checkbox' + | 'input' + | 'tag' + | 'dropdown' + +export type InputType = + | 'password' + | 'text' + | 'email' + | 'number' + | 'tel' + | 'url' + | 'dropdown' const InputActions = ['unobscure', 'copy'] as const export type InputActionsTuple = typeof InputActions export type InputAction = InputActionsTuple[number] +export type DropdownOption = { name: string; value: string } export type InputComponentProps = { placeholder: string @@ -38,3 +55,9 @@ export type SliderComponentProps = { export type CheckboxComponentProps = { value: boolean } + +export type DropdownComponentProps = { + value: string + type?: InputType + options?: DropdownOption[] +} diff --git a/extensions/inference-cortex-extension/resources/default_settings.json b/extensions/inference-cortex-extension/resources/default_settings.json index 6a0dcd4a0b..a3a93f305f 100644 --- a/extensions/inference-cortex-extension/resources/default_settings.json +++ b/extensions/inference-cortex-extension/resources/default_settings.json @@ -1,8 +1,8 @@ [ { "key": "cont_batching", - "title": "Continuous batching", - "description": "The number of parallel operations", + "title": "Continuous Batching", + "description": "Allows processing prompts in parallel with text generation, which usually improves performance.", "controllerType": "checkbox", "controllerProps": { "value": true @@ -10,28 +10,32 @@ }, { "key": "n_parallel", - "title": "Parallel operations", - "description": "The number of parallel operations", + "title": "Parallel Operations", + "description": "Number of prompts that can be processed simultaneously by the model.", "controllerType": "input", "controllerProps": { "value": "4", - "placeholder": "4" + "placeholder": "4", + "type": "number", + "textAlign": "right" } }, { "key": "cpu_threads", "title": "CPU Threads", - "description": "The number of CPU threads to use (when in CPU mode)", + "description": "Number of CPU cores used for model processing when running without GPU.", "controllerType": "input", "controllerProps": { "value": "", - "placeholder": "Number of CPU threads" + "placeholder": "Number of CPU threads", + "type": "number", + "textAlign": "right" } }, { "key": "flash_attn", - "title": "Flash Attention enabled", - "description": "To enable Flash Attention, default is true", + "title": "Flash Attention", + "description": "Optimizes memory usage and speeds up model inference using an efficient attention implementation.", "controllerType": "checkbox", "controllerProps": { "value": true @@ -40,8 +44,8 @@ { "key": "caching_enabled", - "title": "Caching enabled", - "description": "To enable prompt caching or not", + "title": "Caching", + "description": "Stores recent prompts and responses to improve speed when similar questions are asked.", "controllerType": "checkbox", "controllerProps": { "value": true @@ -50,17 +54,30 @@ { "key": "cache_type", "title": "KV Cache Type", - "description": "KV cache type: f16, q8_0, q4_0, default is f16 (change this could break the model).", - "controllerType": "input", + "description": "Controls memory usage and precision trade-off.", + "controllerType": "dropdown", "controllerProps": { - "placeholder": "f16", - "value": "f16" + "value": "f16", + "options": [ + { + "value": "q4_0", + "name": "q4_0" + }, + { + "value": "q8_0", + "name": "q8_0" + }, + { + "value": "f16", + "name": "f16" + } + ] } }, { "key": "use_mmap", - "title": "To enable mmap", - "description": "To enable mmap, default is true", + "title": "MMAP", + "description": "Loads model files more efficiently by mapping them to memory, reducing RAM usage.", "controllerType": "checkbox", "controllerProps": { "value": true diff --git a/web/screens/Settings/SettingDetail/SettingDetailItem/SettingDetailDropdownItem/index.tsx b/web/screens/Settings/SettingDetail/SettingDetailItem/SettingDetailDropdownItem/index.tsx new file mode 100644 index 0000000000..e4066998d9 --- /dev/null +++ b/web/screens/Settings/SettingDetail/SettingDetailItem/SettingDetailDropdownItem/index.tsx @@ -0,0 +1,50 @@ +import { DropdownComponentProps, SettingComponentProps } from '@janhq/core' +import { Select } from '@janhq/joi' +import { Marked, Renderer } from 'marked' + +type Props = { + settingProps: SettingComponentProps + onValueChanged?: (e: string) => void +} + +const marked: Marked = new Marked({ + renderer: { + link: (href, title, text) => { + return Renderer.prototype.link + ?.apply(this, [href, title, text]) + .replace( + ' = ({ + settingProps, + onValueChanged, +}) => { + const { value, options } = + settingProps.controllerProps as DropdownComponentProps + + const description = marked.parse(settingProps.description ?? '', { + async: false, + }) + + return ( +
+
+

{settingProps.title}

+ { +
+ } +
+ onValueChanged?.(e.target.value)} - className="!pr-20" + className={twMerge(obscure && '!pr-20')} suffixIcon={ - + obscure ? ( + + ) : undefined } />
diff --git a/web/screens/Settings/SettingDetail/SettingDetailItem/index.tsx b/web/screens/Settings/SettingDetail/SettingDetailItem/index.tsx index 7c44095c85..93636a28a4 100644 --- a/web/screens/Settings/SettingDetail/SettingDetailItem/index.tsx +++ b/web/screens/Settings/SettingDetail/SettingDetailItem/index.tsx @@ -1,5 +1,6 @@ import { SettingComponentProps } from '@janhq/core' +import SettingDetailDropdownItem from './SettingDetailDropdownItem' import SettingDetailTextInputItem from './SettingDetailTextInputItem' import SettingDetailToggleItem from './SettingDetailToggleItem' @@ -36,13 +37,23 @@ const SettingDetailItem = ({ componentProps, onValueUpdated }: Props) => { ) } + case 'dropdown': { + return ( + onValueUpdated(data.key, value)} + /> + ) + } + default: return null } }) return ( -
+
{components.map((component, index) => (