Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

enhancement: Update Cortex page with better description & UX #4416

Merged
merged 4 commits into from
Jan 8, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 27 additions & 4 deletions core/src/types/setting/settingComponent.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -38,3 +55,9 @@ export type SliderComponentProps = {
export type CheckboxComponentProps = {
value: boolean
}

export type DropdownComponentProps = {
value: string
type?: InputType
options?: DropdownOption[]
}
Original file line number Diff line number Diff line change
@@ -1,37 +1,41 @@
[
{
"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
}
},
{
"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
Expand All @@ -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
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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(
'<a',
"<a class='text-[hsla(var(--app-link))]' target='_blank'"
)
},
},
})

const SettingDetailDropdownItem: React.FC<Props> = ({
settingProps,
onValueChanged,
}) => {
const { value, options } =
settingProps.controllerProps as DropdownComponentProps

const description = marked.parse(settingProps.description ?? '', {
async: false,
})

return (
<div className="flex w-full justify-between py-6">
<div className="flex flex-1 flex-col space-y-1">
<h1 className="font-semibold">{settingProps.title}</h1>
{
<div
dangerouslySetInnerHTML={{ __html: description }}
className="font-medium leading-relaxed text-[hsla(var(--text-secondary))]"
/>
}
</div>
<Select value={value} onValueChange={onValueChanged} options={options} />
</div>
)
}

export default SettingDetailDropdownItem
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import {
FolderOpenIcon,
} from 'lucide-react'
import { Marked, Renderer } from 'marked'
import { twMerge } from 'tailwind-merge'

type Props = {
settingProps: SettingComponentProps
Expand Down Expand Up @@ -83,21 +84,28 @@ const SettingDetailTextInputItem = ({
className="font-medium leading-relaxed text-[hsla(var(--text-secondary))]"
/>
</div>
<div className="w-full flex-shrink-0 pr-1 sm:w-1/2">
<div
className={twMerge(
'w-full flex-shrink-0 pr-1 sm:w-1/2',
type === 'number' && 'sm:w-22 w-24'
)}
>
<Input
placeholder={placeholder}
type={obscure ? 'password' : 'text'}
textAlign={textAlign}
value={value}
onChange={(e) => onValueChanged?.(e.target.value)}
className="!pr-20"
className={twMerge(obscure && '!pr-20')}
suffixIcon={
<InputExtraActions
actions={inputActions ?? []}
onAction={onAction}
copied={copied}
obscure={obscure}
/>
obscure ? (
<InputExtraActions
actions={inputActions ?? []}
onAction={onAction}
copied={copied}
obscure={obscure}
/>
) : undefined
}
/>
</div>
Expand Down
13 changes: 12 additions & 1 deletion web/screens/Settings/SettingDetail/SettingDetailItem/index.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { SettingComponentProps } from '@janhq/core'

import SettingDetailDropdownItem from './SettingDetailDropdownItem'
import SettingDetailTextInputItem from './SettingDetailTextInputItem'
import SettingDetailToggleItem from './SettingDetailToggleItem'

Expand Down Expand Up @@ -36,13 +37,23 @@ const SettingDetailItem = ({ componentProps, onValueUpdated }: Props) => {
)
}

case 'dropdown': {
return (
<SettingDetailDropdownItem
key={data.key}
settingProps={data}
onValueChanged={(value) => onValueUpdated(data.key, value)}
/>
)
}

default:
return null
}
})

return (
<div className="flex w-full flex-col">
<div className="flex h-full w-full flex-col overflow-y-auto">
{components.map((component, index) => (
<div
className={`mx-4 ${index === components.length - 1 ? '' : 'border-b border-[hsla(var(--app-border))]'}`}
Expand Down
Loading