From 4349c1cd5fbdbbea5e2cceabaad49cabda1aeeb2 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 4 Mar 2026 22:37:08 +0800 Subject: [PATCH] feat(admin): add Tripo3D config in local AI settings --- .../settings/admin-settings-client.tsx | 156 ++++++++++++++++++ 1 file changed, 156 insertions(+) diff --git a/app/(admin)/settings/admin-settings-client.tsx b/app/(admin)/settings/admin-settings-client.tsx index bb9734651..9fee83c49 100644 --- a/app/(admin)/settings/admin-settings-client.tsx +++ b/app/(admin)/settings/admin-settings-client.tsx @@ -778,6 +778,14 @@ export function AdminSettingsClient() { modelId: "", // 首选生图模型ID(多样性模式下优先尝试) }); + const [tripo3dConfig, setTripo3dConfig] = useState({ + providerId: "", + name: "Tripo3D", + baseUrl: getProviderDefaultBaseUrl("tripo-3d"), + apiKey: "", + isEnabled: true, + }); + // 加载抠图API配置 const { data: rmbgConfigData } = useSWR("/api/admin/settings?key=rmbg_api_config", fetcher); useEffect(() => { @@ -969,6 +977,30 @@ export function AdminSettingsClient() { } }, [sceneFusionConfigData]); + useEffect(() => { + const tripoProvider = (providersData?.providers || []).find( + (provider) => provider.type === "tripo-3d" + ); + if (tripoProvider) { + setTripo3dConfig({ + providerId: tripoProvider.id, + name: tripoProvider.name || "Tripo3D", + baseUrl: tripoProvider.baseUrl || getProviderDefaultBaseUrl("tripo-3d"), + apiKey: "", + isEnabled: tripoProvider.isEnabled, + }); + return; + } + + setTripo3dConfig({ + providerId: "", + name: "Tripo3D", + baseUrl: getProviderDefaultBaseUrl("tripo-3d"), + apiKey: "", + isEnabled: true, + }); + }, [providersData?.providers]); + // 导航链接状态 const [navLinkForm, setNavLinkForm] = useState({ id: "", @@ -2209,6 +2241,56 @@ export function AdminSettingsClient() { } }; + const handleSaveTripo3dConfig = async () => { + try { + const trimmedName = tripo3dConfig.name.trim() || "Tripo3D"; + const trimmedBaseUrl = + tripo3dConfig.baseUrl.trim() || getProviderDefaultBaseUrl("tripo-3d"); + const hasProvider = Boolean(tripo3dConfig.providerId); + + if (!hasProvider && !tripo3dConfig.apiKey.trim()) { + toast.error("请填写 Tripo3D API Key"); + return; + } + + const requestData: Record = hasProvider + ? { + id: tripo3dConfig.providerId, + name: trimmedName, + type: "tripo-3d", + baseUrl: trimmedBaseUrl, + isEnabled: tripo3dConfig.isEnabled, + } + : { + name: trimmedName, + type: "tripo-3d", + baseUrl: trimmedBaseUrl, + apiKey: tripo3dConfig.apiKey.trim(), + isEnabled: tripo3dConfig.isEnabled, + }; + + if (hasProvider && tripo3dConfig.apiKey.trim()) { + requestData.apiKey = tripo3dConfig.apiKey.trim(); + } + + const response = await fetch("/api/admin/ai-providers", { + method: hasProvider ? "PUT" : "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(requestData), + }); + + if (!response.ok) { + throw new Error("保存失败"); + } + + toast.success("Tripo3D 配置保存成功"); + setTripo3dConfig((prev) => ({ ...prev, apiKey: "" })); + mutateProviders(); + } catch (error) { + toast.error("保存 Tripo3D 配置失败"); + } + }; + // 快速添加火山引擎视频预设模型 const handleQuickAddVolcanoModels = async (providerId: string) => { if (!confirm("将为此服务商添加4个预设模型:\n- Seedance Pro (全功能)\n- Seedance Pro Fast (快速)\n- Seedance Lite I2V (图生视频)\n- Seedance Lite T2V (文生视频)\n\n继续吗?")) { @@ -7225,6 +7307,80 @@ export function AdminSettingsClient() { {/* 本地AI设置 */} + + + Tripo3D API 配置 + + 配置无限画布 3D 生成功能使用的 Tripo3D 接口,保存后写入数据库 AI 提供商配置。 + + + +
+ + + setTripo3dConfig({ ...tripo3dConfig, name: e.target.value }) + } + placeholder="Tripo3D" + /> +
+
+ + + setTripo3dConfig({ ...tripo3dConfig, baseUrl: e.target.value }) + } + placeholder={getProviderDefaultBaseUrl("tripo-3d")} + /> +
+ 默认:{getProviderDefaultBaseUrl("tripo-3d")} +
+
+
+ + + setTripo3dConfig({ ...tripo3dConfig, apiKey: e.target.value }) + } + placeholder={ + tripo3dConfig.providerId ? "留空则不修改当前 Key" : "请输入 Tripo3D API Key" + } + /> +
+
+
+ +
+ 关闭后 3D 生成接口将不可用 +
+
+
+ + setTripo3dConfig({ ...tripo3dConfig, isEnabled: checked }) + } + /> + + {tripo3dConfig.isEnabled ? "已开启" : "已关闭"} + +
+
+ +
+
+ {/* 抠图API配置 */}