({
form,
formData,
systemInfo,
providers,
typeDef,
useLocalWhisper,
})
| 58 | 'h-8 w-auto min-w-[160px] max-w-[260px] text-xs gap-1'; |
| 59 | |
| 60 | const InlineConfigBar: React.FC<InlineConfigBarProps> = ({ |
| 61 | form, |
| 62 | formData, |
| 63 | systemInfo, |
| 64 | providers, |
| 65 | typeDef, |
| 66 | useLocalWhisper, |
| 67 | }) => { |
| 68 | const { t } = useTranslation('tasks'); |
| 69 | const { t: tHome } = useTranslation('home'); |
| 70 | const { t: tCommon } = useTranslation('common'); |
| 71 | const router = useRouter(); |
| 72 | const { locale } = router.query; |
| 73 | |
| 74 | const setValue = (name: string, value: unknown) => { |
| 75 | form.setValue(name, value); |
| 76 | }; |
| 77 | |
| 78 | // localCli 走"自备模型/命令"路径,无可下载模型,按是否启用 localCli 决定是否进分组下拉。 |
| 79 | // 过渡期沿用 useLocalWhisper 作为 localCli 启用信号(全局字段移除时改用 localCli 已配置判断)。 |
| 80 | const includeLocalCli = useLocalWhisper; |
| 81 | // 就绪 = 跨引擎任一已装模型,或启用了 localCli(自备模型);否则引导去下载。 |
| 82 | const hasModels = hasAnyModelAnyEngine(systemInfo) || includeLocalCli; |
| 83 | |
| 84 | const languageItems = (includeAuto: boolean) => ( |
| 85 | <SelectContent> |
| 86 | {includeAuto && ( |
| 87 | <SelectItem value="auto">{tHome('autoRecognition')}</SelectItem> |
| 88 | )} |
| 89 | {supportedLanguage.map((item) => ( |
| 90 | <SelectItem key={item.value} value={item.value}> |
| 91 | {tCommon(`language.${item.value}`)} |
| 92 | </SelectItem> |
| 93 | ))} |
| 94 | </SelectContent> |
| 95 | ); |
| 96 | |
| 97 | // 已配置的服务商前置并独立分组,未配置的灰色置后:兼顾「可用项触手可及」与「发现性」 |
| 98 | const { configuredProviders, unconfiguredProviders } = React.useMemo(() => { |
| 99 | const configured: Provider[] = []; |
| 100 | const unconfigured: Provider[] = []; |
| 101 | providers.forEach((provider) => { |
| 102 | if (isProviderConfigured(provider as any)) { |
| 103 | configured.push(provider); |
| 104 | } else { |
| 105 | unconfigured.push(provider); |
| 106 | } |
| 107 | }); |
| 108 | return { |
| 109 | configuredProviders: configured, |
| 110 | unconfiguredProviders: unconfigured, |
| 111 | }; |
| 112 | }, [providers]); |
| 113 | |
| 114 | const renderProviderItem = (provider: Provider, configured: boolean) => ( |
| 115 | <SelectItem key={provider.id} value={provider.id} disabled={!configured}> |
| 116 | {tCommon(`provider.${provider.name}`, { defaultValue: provider.name })} |
| 117 | {!configured && t('notConfigured')} |
nothing calls this directly
no test coverage detected