feat: add category-specific hints to provider form

- Add dynamic hint text based on provider category (official, opensource, aggregator, third-party, custom)
- Display hints in ProviderPresetSelector below preset buttons
- Rename "Chinese official" to "Opensource official" for better clarity
- Add i18n keys for all category hints in both zh and en locales
- Remove redundant hint boxes from ClaudeFormFields and CodexFormFields

This improves user guidance by showing contextual hints that explain
what fields are required for each provider category.
This commit is contained in:
Jason
2025-10-19 12:24:47 +08:00
parent 57661817d3
commit a0cb29d3b2
5 changed files with 48 additions and 6 deletions

View File

@@ -456,6 +456,7 @@ export function ProviderForm({
categoryKeys={categoryKeys} categoryKeys={categoryKeys}
presetCategoryLabels={presetCategoryLabels} presetCategoryLabels={presetCategoryLabels}
onPresetChange={handlePresetChange} onPresetChange={handlePresetChange}
category={category}
/> />
)} )}

View File

@@ -2,6 +2,7 @@ import { useTranslation } from "react-i18next";
import { FormLabel } from "@/components/ui/form"; import { FormLabel } from "@/components/ui/form";
import type { ProviderPreset } from "@/config/providerPresets"; import type { ProviderPreset } from "@/config/providerPresets";
import type { CodexProviderPreset } from "@/config/codexProviderPresets"; import type { CodexProviderPreset } from "@/config/codexProviderPresets";
import type { ProviderCategory } from "@/types";
type PresetEntry = { type PresetEntry = {
id: string; id: string;
@@ -14,6 +15,7 @@ interface ProviderPresetSelectorProps {
categoryKeys: string[]; categoryKeys: string[];
presetCategoryLabels: Record<string, string>; presetCategoryLabels: Record<string, string>;
onPresetChange: (value: string) => void; onPresetChange: (value: string) => void;
category?: ProviderCategory; // 新增:当前选中的分类
} }
export function ProviderPresetSelector({ export function ProviderPresetSelector({
@@ -22,9 +24,40 @@ export function ProviderPresetSelector({
categoryKeys, categoryKeys,
presetCategoryLabels, presetCategoryLabels,
onPresetChange, onPresetChange,
category,
}: ProviderPresetSelectorProps) { }: ProviderPresetSelectorProps) {
const { t } = useTranslation(); const { t } = useTranslation();
// 根据分类获取提示文字
const getCategoryHint = () => {
switch (category) {
case "official":
return t("providerForm.officialHint", {
defaultValue: "💡 官方供应商使用浏览器登录,无需配置 API Key",
});
case "cn_official":
return t("providerForm.cnOfficialApiKeyHint", {
defaultValue: "💡 国产官方供应商只需填写 API Key请求地址已预设",
});
case "aggregator":
return t("providerForm.aggregatorApiKeyHint", {
defaultValue: "💡 聚合服务供应商只需填写 API Key 即可使用",
});
case "third_party":
return t("providerForm.thirdPartyApiKeyHint", {
defaultValue: "💡 第三方供应商需要填写 API Key 和请求地址",
});
case "custom":
return t("providerForm.customApiKeyHint", {
defaultValue: "💡 自定义配置需手动填写所有必要字段",
});
default:
return t("providerPreset.hint", {
defaultValue: "选择预设后可继续调整下方字段。",
});
}
};
return ( return (
<div className="space-y-3"> <div className="space-y-3">
<FormLabel> <FormLabel>
@@ -71,9 +104,7 @@ export function ProviderPresetSelector({
})} })}
</div> </div>
<p className="text-xs text-muted-foreground"> <p className="text-xs text-muted-foreground">
{t("providerPreset.helper", { {getCategoryHint()}
defaultValue: "选择预设后可继续调整下方字段。",
})}
</p> </p>
</div> </div>
); );

View File

@@ -211,6 +211,11 @@
"codexApiKeyAutoFill": "Just fill in here, auth.json below will be auto-filled", "codexApiKeyAutoFill": "Just fill in here, auth.json below will be auto-filled",
"kimiApiKeyHint": "Fill in to get model list", "kimiApiKeyHint": "Fill in to get model list",
"apiKeyAutoFill": "Just fill in here, config below will be auto-filled", "apiKeyAutoFill": "Just fill in here, config below will be auto-filled",
"cnOfficialApiKeyHint": "💡 Opensource official providers only need API Key, endpoint is preset",
"aggregatorApiKeyHint": "💡 Aggregator providers only need API Key to use",
"thirdPartyApiKeyHint": "💡 Third-party providers require both API Key and endpoint",
"customApiKeyHint": "💡 Custom configuration requires manually filling all necessary fields",
"officialHint": "💡 Official provider uses browser login, no API Key needed",
"getApiKey": "Get API Key", "getApiKey": "Get API Key",
"parameterConfig": "Parameter Config - {{name}} *", "parameterConfig": "Parameter Config - {{name}} *",
"mainModel": "Main Model (optional)", "mainModel": "Main Model (optional)",
@@ -236,7 +241,7 @@
"smallModelPlaceholder": "claude-3-5-haiku-20241022", "smallModelPlaceholder": "claude-3-5-haiku-20241022",
"modelHelper": "Optional: Specify default Claude model to use, leave blank to use system default.", "modelHelper": "Optional: Specify default Claude model to use, leave blank to use system default.",
"categoryOfficial": "Official", "categoryOfficial": "Official",
"categoryCnOfficial": "China Official", "categoryCnOfficial": "Opensource Official",
"categoryAggregation": "Aggregation", "categoryAggregation": "Aggregation",
"categoryThirdParty": "Third Party" "categoryThirdParty": "Third Party"
}, },

View File

@@ -211,6 +211,11 @@
"codexApiKeyAutoFill": "只需要填这里,下方 auth.json 会自动填充", "codexApiKeyAutoFill": "只需要填这里,下方 auth.json 会自动填充",
"kimiApiKeyHint": "填写后可获取模型列表", "kimiApiKeyHint": "填写后可获取模型列表",
"apiKeyAutoFill": "只需要填这里,下方配置会自动填充", "apiKeyAutoFill": "只需要填这里,下方配置会自动填充",
"cnOfficialApiKeyHint": "💡 开源官方供应商只需填写 API Key请求地址已预设",
"aggregatorApiKeyHint": "💡 聚合服务供应商只需填写 API Key 即可使用",
"thirdPartyApiKeyHint": "💡 第三方供应商需要填写 API Key 和请求地址",
"customApiKeyHint": "💡 自定义配置需手动填写所有必要字段",
"officialHint": "💡 官方供应商使用浏览器登录,无需配置 API Key",
"getApiKey": "获取 API Key", "getApiKey": "获取 API Key",
"parameterConfig": "参数配置 - {{name}} *", "parameterConfig": "参数配置 - {{name}} *",
"mainModel": "主模型 (可选)", "mainModel": "主模型 (可选)",
@@ -236,7 +241,7 @@
"smallModelPlaceholder": "claude-3-5-haiku-20241022", "smallModelPlaceholder": "claude-3-5-haiku-20241022",
"modelHelper": "可选:指定默认使用的 Claude 模型,留空则使用系统默认。", "modelHelper": "可选:指定默认使用的 Claude 模型,留空则使用系统默认。",
"categoryOfficial": "官方", "categoryOfficial": "官方",
"categoryCnOfficial": "国内官方", "categoryCnOfficial": "开源官方",
"categoryAggregation": "聚合服务", "categoryAggregation": "聚合服务",
"categoryThirdParty": "第三方" "categoryThirdParty": "第三方"
}, },

View File

@@ -1,6 +1,6 @@
export type ProviderCategory = export type ProviderCategory =
| "official" // 官方 | "official" // 官方
| "cn_official" // 国产官方 | "cn_official" // 开源官方(原"国产官方"
| "aggregator" // 聚合网站 | "aggregator" // 聚合网站
| "third_party" // 第三方供应商 | "third_party" // 第三方供应商
| "custom"; // 自定义 | "custom"; // 自定义