feat: recommended label llamacpp setting (#6052)

* feat: recommended label llamacpp

* chore: remove log
This commit is contained in:
Faisal Amir 2025-08-05 13:55:33 +07:00 committed by Ramon Perez
parent 8e4c696583
commit 318f6f504f
6 changed files with 55 additions and 6 deletions

View File

@ -132,6 +132,12 @@ export abstract class BaseExtension implements ExtensionType {
setting.controllerProps.options = setting.controllerProps.options?.length setting.controllerProps.options = setting.controllerProps.options?.length
? setting.controllerProps.options ? setting.controllerProps.options
: oldSettings.find((e: any) => e.key === setting.key)?.controllerProps?.options : oldSettings.find((e: any) => e.key === setting.key)?.controllerProps?.options
if ('recommended' in setting.controllerProps) {
const oldRecommended = oldSettings.find((e: any) => e.key === setting.key)?.controllerProps?.recommended
if (oldRecommended !== undefined && oldRecommended !== "") {
setting.controllerProps.recommended = oldRecommended
}
}
}) })
} }
localStorage.setItem(this.name, JSON.stringify(settings)) localStorage.setItem(this.name, JSON.stringify(settings))

View File

@ -60,4 +60,5 @@ export type DropdownComponentProps = {
value: string value: string
type?: InputType type?: InputType
options?: DropdownOption[] options?: DropdownOption[]
recommended?: string
} }

View File

@ -6,9 +6,11 @@
"controllerType": "dropdown", "controllerType": "dropdown",
"controllerProps": { "controllerProps": {
"value": "none", "value": "none",
"options": [] "options": [],
"recommended": ""
} }
}, },
{ {
"key": "auto_update_engine", "key": "auto_update_engine",
"title": "Auto update engine", "title": "Auto update engine",

View File

@ -297,6 +297,12 @@ export default class llamacpp_extension extends AIEngine {
return { value: key, name: key } return { value: key, name: key }
}) })
// Set the recommended backend based on bestAvailableBackendString
if (bestAvailableBackendString) {
backendSetting.controllerProps.recommended =
bestAvailableBackendString
}
const savedBackendSetting = await this.getSetting<string>( const savedBackendSetting = await this.getSetting<string>(
'version_backend', 'version_backend',
originalDefaultBackendValue originalDefaultBackendValue
@ -1298,7 +1304,8 @@ export default class llamacpp_extension extends AIEngine {
args.push('--cache-type-k', cfg.cache_type_k) args.push('--cache-type-k', cfg.cache_type_k)
if ( if (
cfg.flash_attn && cfg.flash_attn &&
(cfg.cache_type_v != 'f16' && cfg.cache_type_v != 'f32') cfg.cache_type_v != 'f16' &&
cfg.cache_type_v != 'f32'
) { ) {
args.push('--cache-type-v', cfg.cache_type_v) args.push('--cache-type-v', cfg.cache_type_v)
} }

View File

@ -5,30 +5,61 @@ import {
DropdownMenuTrigger, DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu' } from '@/components/ui/dropdown-menu'
import {
Tooltip,
TooltipTrigger,
TooltipContent,
} from '@/components/ui/tooltip'
import { IconStarFilled } from '@tabler/icons-react'
import { cn } from '@/lib/utils'
// Dropdown component // Dropdown component
type DropdownControlProps = { type DropdownControlProps = {
value: string value: string
options?: Array<{ value: number | string; name: string }> options?: Array<{ value: number | string; name: string }>
recommended?: string
onChange: (value: number | string) => void onChange: (value: number | string) => void
} }
export function DropdownControl({ export function DropdownControl({
value, value,
options = [], options = [],
recommended,
onChange, onChange,
}: DropdownControlProps) { }: DropdownControlProps) {
const isSelected =
options.find((option) => option.value === value)?.name || value
return ( return (
<DropdownMenu> <DropdownMenu>
<DropdownMenuTrigger className="bg-main-view-fg/5 hover:bg-main-view-fg/8 px-2 py-1 rounded font-medium cursor-pointer"> <DropdownMenuTrigger className="bg-main-view-fg/5 hover:bg-main-view-fg/8 px-3 py-1 rounded-sm font-medium cursor-pointer">
{options.find((option) => option.value === value)?.name || value} {isSelected}
</DropdownMenuTrigger> </DropdownMenuTrigger>
<DropdownMenuContent align="end"> <DropdownMenuContent align="end" className="max-h-70">
{options.map((option, optionIndex) => ( {options.map((option, optionIndex) => (
<DropdownMenuItem <DropdownMenuItem
key={optionIndex} key={optionIndex}
onClick={() => onChange(option.value)} onClick={() => onChange(option.value)}
className={cn(
'flex items-center justify-between my-1',
isSelected === option.name
? 'bg-main-view-fg/6 hover:bg-main-view-fg/6'
: ''
)}
> >
{option.name} <span>{option.name}</span>
{recommended === option.value && (
<Tooltip>
<TooltipTrigger asChild>
<div className="cursor-pointer">
<IconStarFilled className="text-accent" />
</div>
</TooltipTrigger>
<TooltipContent side="top" sideOffset={8} className="z-50">
Recommended
</TooltipContent>
</Tooltip>
)}
</DropdownMenuItem> </DropdownMenuItem>
))} ))}
</DropdownMenuContent> </DropdownMenuContent>

View File

@ -28,6 +28,7 @@ type DynamicControllerProps = {
min?: number min?: number
max?: number max?: number
step?: number step?: number
recommended?: string
} }
onChange: (value: string | boolean | number) => void onChange: (value: string | boolean | number) => void
} }
@ -65,6 +66,7 @@ export function DynamicControllerSetting({
<DropdownControl <DropdownControl
value={controllerProps.value as string} value={controllerProps.value as string}
options={controllerProps.options} options={controllerProps.options}
recommended={controllerProps.recommended}
onChange={(newValue) => onChange(newValue)} onChange={(newValue) => onChange(newValue)}
/> />
) )