diff --git a/app/(admin)/settings/_components/admin-settings-navigation.tsx b/app/(admin)/settings/_components/admin-settings-navigation.tsx
new file mode 100644
index 000000000..5fc9010c0
--- /dev/null
+++ b/app/(admin)/settings/_components/admin-settings-navigation.tsx
@@ -0,0 +1,91 @@
+"use client";
+
+import Link from "next/link";
+import { TabsList, TabsTrigger } from "@/components/ui/tabs";
+import { ADMIN_SETTINGS_NAV_GROUPS } from "../_lib/settings-navigation";
+import { SettingStatusBadge } from "./setting-status-badge";
+
+export function AdminSettingsNavigation({ activeTab }: { activeTab: string }) {
+ return (
+
+ 配置背景移除API,用于画图标注功能中的抠图处理。支持自部署RMBG、PhotoRoom和AOS云服务。
+ >
+ }
+ expanded={isLocalAiSectionExpanded("rmbg")}
+ id="local-ai-section-rmbg"
+ onToggle={() => toggleLocalAiSection("rmbg")}
+ summary={
+
+ }
+ title="抠图API配置"
+ >
+ {/* 服务提供商选择 */}
+
+
+
+
setRmbgConfig({ ...rmbgConfig, provider: "rmbg" })}
+ >
+
+ {rmbgConfig.provider === "rmbg" && (
+
+ )}
+
+
+
+
+
+ setRmbgConfig({ ...rmbgConfig, provider: "photoroom" })
+ }
+ >
+
+ {rmbgConfig.provider === "photoroom" && (
+
+ )}
+
+
+
+
+
+ setRmbgConfig({ ...rmbgConfig, provider: "aoscdn" })
+ }
+ >
+
+ {rmbgConfig.provider === "aoscdn" && (
+
+ )}
+
+
+
+
+
+
+
+
+ {/* RMBG 配置 */}
+ {rmbgConfig.provider === "rmbg" && (
+ <>
+
+ RMBG-2.0 配置
+
+
+
+
+ setRmbgConfig({ ...rmbgConfig, apiUrl: e.target.value })
+ }
+ placeholder="http://156.225.27.52:8000"
+ value={rmbgConfig.apiUrl}
+ />
+
+ 请输入完整的API地址,例如: http://156.225.27.52:8000
+
+
+
+
+
+ setRmbgConfig({ ...rmbgConfig, apiKey: e.target.value })
+ }
+ placeholder="如果API需要密钥,请在此输入"
+ type="password"
+ value={rmbgConfig.apiKey}
+ />
+
+
+
+ RMBG-2.0 说明
+
+
+
• 需要自行部署RMBG-2.0服务
+
• 系统会自动调用 /rmbg/base64 接口进行抠图处理
+
• 支持的图片格式:JPG, PNG, JPEG等常见格式
+
+
+ >
+ )}
+
+ {/* PhotoRoom 配置 */}
+ {rmbgConfig.provider === "photoroom" && (
+ <>
+
+ PhotoRoom 配置
+
+
+
+
+ setRmbgConfig({
+ ...rmbgConfig,
+ photoroomApiKey: e.target.value,
+ })
+ }
+ placeholder="输入PhotoRoom API密钥"
+ type="password"
+ value={rmbgConfig.photoroomApiKey}
+ />
+
+ 在 PhotoRoom 开发者平台获取API密钥
+
+
+
+
+ PhotoRoom 说明
+
+
+
• 使用 PhotoRoom 云服务进行高清抠图
+
• 支持 HD 高清背景移除,效果更好
+
• API文档:https://www.photoroom.com/api
+
• 按调用次数计费,请注意用量
+
+
+ >
+ )}
+
+ {/* AOS 配置 */}
+ {rmbgConfig.provider === "aoscdn" && (
+ <>
+
+ AOS Segmentation 配置
+
+
+
+
+ setRmbgConfig({
+ ...rmbgConfig,
+ aosApiKey: e.target.value,
+ })
+ }
+ placeholder="输入 AOS X-API-KEY"
+ type="password"
+ value={rmbgConfig.aosApiKey}
+ />
+
+
+
+
+ setRmbgConfig({
+ ...rmbgConfig,
+ aosApiBaseUrl: e.target.value,
+ })
+ }
+ placeholder="https://techsz.aoscdn.com"
+ value={rmbgConfig.aosApiBaseUrl}
+ />
+
+ 默认使用官方地址,可按需替换。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关闭时保持原图尺寸,开启时按主体区域裁剪。
+
+
+
+
+ setRmbgConfig({ ...rmbgConfig, aosCrop: checked })
+ }
+ />
+
+ {rmbgConfig.aosCrop ? "已开启" : "已关闭"}
+
+
+
+
+
+ AOS 说明
+
+
+
• 使用异步任务模式(1秒轮询,最多30秒)
+
• 接口返回链接有效期1小时,系统会自动转存到你的存储桶
+
• 官方限制:图片最大20MB,分辨率最大4096x4096
+
+
+ >
+ )}
+
+
+
+
+ {/* 变清晰API配置 */}
+
+ 配置 Replicate 上的 Qwen-Image-Layered
+ 模型,用于将单张图片拆分为多个可编辑图层并回写到无限画布。
+ >
+ }
+ expanded={isLocalAiSectionExpanded("layer-split")}
+ id="local-ai-section-layer-split"
+ onToggle={() => toggleLocalAiSection("layer-split")}
+ summary={
+
+ }
+ title={
+
+
+ 图层拆分API配置
+
+ }
+ >
+
+
+
+
+ 开启后,用户在无限画布中选中图片可使用“图层拆分”工具。
+
+
+
+
+ setLayerSplitConfig({
+ ...layerSplitConfig,
+ enabled: checked,
+ })
+ }
+ />
+
+ {layerSplitConfig.enabled ? "已开启" : "已关闭"}
+
+
+
+
+
+
+
+
+
+ setLayerSplitConfig({
+ ...layerSplitConfig,
+ replicateApiToken: e.target.value,
+ })
+ }
+ placeholder="r8_xxxxxxxxxxxxx"
+ type="password"
+ value={layerSplitConfig.replicateApiToken}
+ />
+
+
+
+
+
+ setLayerSplitConfig({
+ ...layerSplitConfig,
+ replicateModel: e.target.value,
+ })
+ }
+ placeholder="qwen/qwen-image-layered"
+ value={layerSplitConfig.replicateModel}
+ />
+
+
+
+
+
+
+ setLayerSplitConfig({
+ ...layerSplitConfig,
+ layers: Math.max(
+ 2,
+ Math.min(12, Number(e.target.value) || 4)
+ ),
+ })
+ }
+ type="number"
+ value={layerSplitConfig.layers}
+ />
+
+
+
+
+ setLayerSplitConfig({
+ ...layerSplitConfig,
+ resolution: Math.max(
+ 256,
+ Math.min(1536, Number(e.target.value) || 640)
+ ),
+ })
+ }
+ step={64}
+ type="number"
+ value={layerSplitConfig.resolution}
+ />
+
+
+
+
+ setLayerSplitConfig({
+ ...layerSplitConfig,
+ trueCfgScale: Math.max(
+ 1,
+ Math.min(12, Number(e.target.value) || 4)
+ ),
+ })
+ }
+ step={0.5}
+ type="number"
+ value={layerSplitConfig.trueCfgScale}
+ />
+
+
+
+
+ setLayerSplitConfig({
+ ...layerSplitConfig,
+ numInferenceSteps: Math.max(
+ 1,
+ Math.min(80, Number(e.target.value) || 30)
+ ),
+ })
+ }
+ type="number"
+ value={layerSplitConfig.numInferenceSteps}
+ />
+
+
+
+
+
+
+
+
+ 保持前景/背景透明边缘更稳定
+
+
+
+ setLayerSplitConfig({
+ ...layerSplitConfig,
+ cfgNormalize: checked,
+ })
+ }
+ />
+
+
+
+
+
+
+ 使用英文提示增强兼容性
+
+
+
+ setLayerSplitConfig({
+ ...layerSplitConfig,
+ useEnPrompt: checked,
+ })
+ }
+ />
+
+
+
+
+
+ setLayerSplitConfig({
+ ...layerSplitConfig,
+ timeoutMs: Math.max(
+ 30_000,
+ Math.min(900_000, Number(e.target.value) || 300_000)
+ ),
+ })
+ }
+ step={1000}
+ type="number"
+ value={layerSplitConfig.timeoutMs}
+ />
+
+
+
+
+
+
+
+
+
+ Qwen-Image-Layered 说明
+
+
+
• 用途:将单张图片拆成多个独立图层(RGBA layer)
+
• 平台:Replicate 托管推理,无需自建 GPU 服务器
+
• 默认模型:qwen/qwen-image-layered
+
+ • 使用后会将每个图层转存到你的存储桶,并在无限画布中新增图片节点
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/app/(admin)/settings/_components/local-ai-sections/model3d-sections.tsx b/app/(admin)/settings/_components/local-ai-sections/model3d-sections.tsx
new file mode 100644
index 000000000..754910fa9
--- /dev/null
+++ b/app/(admin)/settings/_components/local-ai-sections/model3d-sections.tsx
@@ -0,0 +1,1054 @@
+"use client";
+
+import {
+ Database,
+ Edit,
+ Loader2,
+ Plus,
+ RefreshCw,
+ Save,
+ Search,
+ Trash2,
+ Upload,
+} from "lucide-react";
+import { Button } from "@/components/ui/button";
+import { Input } from "@/components/ui/input";
+import { Label } from "@/components/ui/label";
+import { Switch } from "@/components/ui/switch";
+import { Textarea } from "@/components/ui/textarea";
+import type { ThreeDModelAliasEntry } from "@/lib/model3d/model-alias-config";
+import { cn, formatBeijingTime } from "@/lib/utils";
+import type {
+ AdminAiProvider,
+ LocalAiModel3dSectionsProps,
+} from "../../_lib/types";
+import {
+ LocalAiGroupHeading,
+ LocalAiSectionShell,
+ LocalAiSectionSummary,
+} from "../local-ai-section-shell";
+
+export function LocalAiModel3dSections({
+ tripo3dConfig,
+ setTripo3dConfig,
+ tripoProviders,
+ filteredTripoProviders,
+ enabledTripoProviderCount,
+ tripoProviderSearch,
+ setTripoProviderSearch,
+ tripoProviderBusyId,
+ worldlabs3dConfig,
+ setWorldlabs3dConfig,
+ worldlabsKeyPoolConfig,
+ setWorldlabsKeyPoolConfig,
+ worldlabsApiKeysDraft,
+ setWorldlabsApiKeysDraft,
+ worldlabsProviders,
+ filteredWorldlabsProviders,
+ enabledWorldlabsProviderCount,
+ worldlabsProviderSearch,
+ setWorldlabsProviderSearch,
+ worldlabsProviderBusyId,
+ threeDModelAliasConfig,
+ setThreeDModelAliasConfig,
+ kittycadCadConfig,
+ setKittycadCadConfig,
+ isTestingKittycadCad,
+ isLocalAiSectionExpanded,
+ toggleLocalAiSection,
+ getProviderDefaultBaseUrl,
+ handleEditTripoPoolProvider,
+ handleToggleTripoPoolProvider,
+ handleDeleteProvider,
+ handleSaveTripo3dConfig,
+ handleAddTripo3dPoolKey,
+ handleImportWorldlabs3dPoolKeys,
+ handleAddWorldlabs3dPoolKey,
+ handleEditWorldlabsPoolProvider,
+ handleToggleWorldlabsPoolProvider,
+ handleSaveWorldlabs3dConfig,
+ handleAddThreeDModelAliasEntry,
+ handleThreeDModelAliasEntryChange,
+ handleRemoveThreeDModelAliasEntry,
+ handleResetThreeDModelAliasConfig,
+ handleSaveThreeDModelAliasConfig,
+ handleTestKittycadCadConfig,
+ handleSaveKittycadCadConfig,
+}: LocalAiModel3dSectionsProps) {
+ return (
+ <>
+
+ 为 AI详情生成 单独配置 Moonshot 官方 Kimi K2.6
+ 模型。保存后会自动绑定到“AI详情生成 - Agent专用模型”。
+ >
+ }
+ expanded={isLocalAiSectionExpanded("moonshot-detail-agent")}
+ id="local-ai-section-moonshot-detail-agent"
+ onToggle={() => toggleLocalAiSection("moonshot-detail-agent")}
+ summary={
+
+ }
+ title={<>Moonshot 官方 Kimi K2.6 配置>}
+ >
+
+
+
+ setMoonshotDetailAgentConfig((prev) => ({
+ ...prev,
+ providerName: e.target.value,
+ }))
+ }
+ placeholder="Moonshot AI (Official)"
+ value={moonshotDetailAgentConfig.providerName}
+ />
+
+
+
+
+
+ setMoonshotDetailAgentConfig((prev) => ({
+ ...prev,
+ baseUrl: e.target.value,
+ }))
+ }
+ placeholder={DETAIL_AGENT_LOCAL_MOONSHOT_BASE_URL}
+ value={moonshotDetailAgentConfig.baseUrl}
+ />
+
+ 根据 Moonshot 官方文档,OpenAI 兼容接口地址为 `
+ {DETAIL_AGENT_LOCAL_MOONSHOT_BASE_URL}`
+
+
+
+
+
+
+ setMoonshotDetailAgentConfig((prev) => ({
+ ...prev,
+ apiKey: e.target.value,
+ }))
+ }
+ placeholder={
+ moonshotDetailAgentConfig.providerId
+ ? "留空则不修改当前 Key"
+ : "请输入 Moonshot 官方 API Key"
+ }
+ type="password"
+ value={moonshotDetailAgentConfig.apiKey}
+ />
+
+
+
+
+
+ setMoonshotDetailAgentConfig((prev) => ({
+ ...prev,
+ modelId: e.target.value,
+ }))
+ }
+ placeholder={DETAIL_AGENT_LOCAL_MOONSHOT_MODEL_ID}
+ value={moonshotDetailAgentConfig.modelId}
+ />
+
+ 已按你提供的 Moonshot 官方文档默认填写
+ `kimi-k2.6`;保存后系统会自动创建/更新对应模型记录。
+
+
+
+
+
+
+ setMoonshotDetailAgentConfig((prev) => ({
+ ...prev,
+ displayName: e.target.value,
+ }))
+ }
+ placeholder={DETAIL_AGENT_LOCAL_MOONSHOT_DISPLAY_NAME}
+ value={moonshotDetailAgentConfig.displayName}
+ />
+
+
+
+
+
+
+ 关闭后仍会保留记录,但不会被 AI详情生成 选作专用 Agent 模型。
+
+
+
+
+ setMoonshotDetailAgentConfig((prev) => ({
+ ...prev,
+ isEnabled: checked,
+ }))
+ }
+ />
+
+ {moonshotDetailAgentConfig.isEnabled ? "已开启" : "已关闭"}
+
+
+
+
+
+
+ • 专用于 AI详情生成 的分镜规划与排版复审,不影响普通 Agent 对话。
+
+
+ • 系统会按多模态 Agent
+ 模型写入:支持视觉、支持结构化规划、支持协议复审。
+
+
• 保存成功后会自动写入“AI详情生成 - Agent专用模型”。
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/app/(admin)/settings/_components/local-ai-sections/runtime-sections.tsx b/app/(admin)/settings/_components/local-ai-sections/runtime-sections.tsx
new file mode 100644
index 000000000..b9da6a47c
--- /dev/null
+++ b/app/(admin)/settings/_components/local-ai-sections/runtime-sections.tsx
@@ -0,0 +1,1425 @@
+"use client";
+
+import {
+ Database,
+ Eye,
+ EyeOff,
+ Image as ImageIcon,
+ Loader2,
+ Paintbrush,
+ Save,
+ Sparkles,
+} from "lucide-react";
+import { Button } from "@/components/ui/button";
+import { Input } from "@/components/ui/input";
+import { Label } from "@/components/ui/label";
+import {
+ Select,
+ SelectContent,
+ SelectItem,
+ SelectTrigger,
+ SelectValue,
+} from "@/components/ui/select";
+import { Switch } from "@/components/ui/switch";
+import { Textarea } from "@/components/ui/textarea";
+import {
+ DEFAULT_CANVAS_IMAGE_BATCH_DISPATCH_INTERVAL_MS,
+ DEFAULT_CANVAS_IMAGE_TASK_CONCURRENCY,
+ MAX_CANVAS_IMAGE_BATCH_DISPATCH_INTERVAL_MS,
+ MAX_CANVAS_IMAGE_TASK_CONCURRENCY,
+ MIN_CANVAS_IMAGE_BATCH_DISPATCH_INTERVAL_MS,
+ MIN_CANVAS_IMAGE_TASK_CONCURRENCY,
+ normalizeCanvasImageTaskQueueConfig,
+} from "@/lib/canvas/image-task-config";
+import type {
+ AdminAiModel,
+ AdminAiProvider,
+ LocalAiRuntimeSectionsProps,
+} from "../../_lib/types";
+import {
+ LocalAiGroupHeading,
+ LocalAiSectionShell,
+ LocalAiSectionSummary,
+} from "../local-ai-section-shell";
+
+export function LocalAiRuntimeSections({
+ thirdPartySqlServerConfig,
+ setThirdPartySqlServerConfig,
+ isThirdPartySqlServerFieldsVisible,
+ setIsThirdPartySqlServerFieldsVisible,
+ isTestingThirdPartySqlServer,
+ realtimeCanvasConfig,
+ setRealtimeCanvasConfig,
+ canvasImageTaskQueueConfig,
+ setCanvasImageTaskQueueConfig,
+ sceneFusionConfig,
+ setSceneFusionConfig,
+ hasThirdPartySqlServerConfiguredValue,
+ modelsData,
+ providersData,
+ isLocalAiSectionExpanded,
+ toggleLocalAiSection,
+ DEFAULT_BFL_BASE_URL,
+ DEFAULT_BFL_REALTIME_MODEL,
+ handleSaveThirdPartySqlServerConfig,
+ handleTestThirdPartySqlServerConfig,
+ handleSaveRealtimeCanvasConfig,
+ handleSaveCanvasImageTaskQueueConfig,
+ handleSaveSceneFusionConfig,
+}: LocalAiRuntimeSectionsProps) {
+ return (
+ <>
+
+ 配置后可供后续业务功能直接访问外部 SQL Server
+ 数据库。当前仅提供配置保存与连通性测试。
+ >
+ }
+ expanded={isLocalAiSectionExpanded("third-party-sqlserver")}
+ id="local-ai-section-third-party-sqlserver"
+ onToggle={() => toggleLocalAiSection("third-party-sqlserver")}
+ summary={
+
+ }
+ title={
+
+
+ 第三方 SQL Server 数据库连接
+
+ }
+ >
+
+
+
+
+ 关闭后保留配置但不作为后续功能默认外部数据源。
+
+
+
+
+ setThirdPartySqlServerConfig((prev) => ({
+ ...prev,
+ enabled: checked,
+ }))
+ }
+ />
+
+ {thirdPartySqlServerConfig.enabled ? "已开启" : "已关闭"}
+
+
+
+
+
+
+
+ 数据库连接信息默认隐藏
+
+
+ {hasThirdPartySqlServerConfiguredValue
+ ? "已保存的主机地址、数据库、账号和密码不会默认显示,只有主动点击后才会回显并允许编辑。"
+ : "当前未展开连接字段。需要新增或编辑配置时,再手动显示连接信息。"}
+
+
+
+
+
+ {isThirdPartySqlServerFieldsVisible ? (
+ <>
+
+
+
+
+
+
+
+ setThirdPartySqlServerConfig((prev) => ({
+ ...prev,
+ password: e.target.value,
+ }))
+ }
+ placeholder="请输入 SQL Server 密码"
+ type="password"
+ value={thirdPartySqlServerConfig.password}
+ />
+
+
+
+
+
+
+
+
+
+ 现代云数据库通常需要开启;传统内网 SQL Server 可关闭。
+
+
+
+ setThirdPartySqlServerConfig((prev) => ({
+ ...prev,
+ encrypt: checked,
+ }))
+ }
+ />
+
+
+
+
+
+ 对自签名证书或传统 SQL Server 更友好。
+
+
+
+ setThirdPartySqlServerConfig((prev) => ({
+ ...prev,
+ trustServerCertificate: checked,
+ }))
+ }
+ />
+
+
+ >
+ ) : (
+
+ {hasThirdPartySqlServerConfiguredValue
+ ? "当前已保存的 SQL Server 连接字段处于隐藏状态。点击上方按钮后才会展示主机、数据库、账号和密码。"
+ : "当前未展示 SQL Server 连接字段。点击上方按钮开始填写连接信息。"}
+
+ )}
+
+
+
• 当前支持 SQL Server 标准 TCP 连接。
+
• 配置会保存到系统设置,供后续外部数据查询/同步功能复用。
+
+ • 测试连接会尝试建立连接并执行基础查询,不会修改外部数据库数据。
+
+
+
+
+
+
+
+
+
+ {/* 实时画布API配置 */}
+
+ 配置实时画布功能的供应商、模型与 API Key。当前已接入 BFL / Replicate
+ / FAL 供应商;FAL 的 WebSocket
+ 真流式实时属于第二阶段,不是这次上线内容。
+ >
+ }
+ expanded={isLocalAiSectionExpanded("realtime-canvas")}
+ id="local-ai-section-realtime-canvas"
+ onToggle={() => toggleLocalAiSection("realtime-canvas")}
+ summary={
+
+ }
+ title={
+
+
+ 实时画布配置
+
+ }
+ >
+
+
+
+
+ 关闭后前端“实时画布”入口仍可显示,但会提示服务未启用。
+
+
+
+
+ setRealtimeCanvasConfig({
+ ...realtimeCanvasConfig,
+ enabled: checked,
+ })
+ }
+ />
+
+ {realtimeCanvasConfig.enabled ? "已开启" : "已关闭"}
+
+
+
+
+
+
+
+
+
+ {realtimeCanvasConfig.providerType === "replicate" ? (
+ <>
+
+
+
+ setRealtimeCanvasConfig({
+ ...realtimeCanvasConfig,
+ replicateApiToken: e.target.value,
+ })
+ }
+ placeholder="r8_xxxxxxxxxxxxx"
+ type="password"
+ value={realtimeCanvasConfig.replicateApiToken}
+ />
+
+
+
+
+
+ setRealtimeCanvasConfig({
+ ...realtimeCanvasConfig,
+ replicateModel: e.target.value,
+ })
+ }
+ placeholder="black-forest-labs/flux-2-klein-4b"
+ value={realtimeCanvasConfig.replicateModel}
+ />
+
+ >
+ ) : realtimeCanvasConfig.providerType === "fal" ? (
+ <>
+
+ 当前 FAL 接入的是“供应商能力接入阶段”,会通过现有
+ `/api/realtime/generate` 服务端链路调用 FAL。 前端直连 FAL
+ WebSocket 的“真流式实时”属于第二阶段,当前尚未启用。
+
+
+
+
+
+ setRealtimeCanvasConfig({
+ ...realtimeCanvasConfig,
+ falApiKey: e.target.value,
+ })
+ }
+ placeholder="FAL_KEY_ID:FAL_KEY_SECRET 或 token"
+ type="password"
+ value={realtimeCanvasConfig.falApiKey}
+ />
+
+
+
+
+
+ setRealtimeCanvasConfig({
+ ...realtimeCanvasConfig,
+ falModel: e.target.value,
+ })
+ }
+ placeholder="fal-ai/your-image-edit-model"
+ value={realtimeCanvasConfig.falModel}
+ />
+
+
+
+
+
+ setRealtimeCanvasConfig({
+ ...realtimeCanvasConfig,
+ falBaseUrl: e.target.value,
+ })
+ }
+ placeholder="https://fal.run"
+ value={realtimeCanvasConfig.falBaseUrl}
+ />
+
+ >
+ ) : (
+ <>
+
+
+
+ setRealtimeCanvasConfig({
+ ...realtimeCanvasConfig,
+ bflApiKey: e.target.value,
+ })
+ }
+ placeholder="bfl_xxxxxxxxxxxxx"
+ type="password"
+ value={realtimeCanvasConfig.bflApiKey}
+ />
+
+
+
+
+
+ setRealtimeCanvasConfig({
+ ...realtimeCanvasConfig,
+ bflBaseUrl: e.target.value,
+ })
+ }
+ placeholder={DEFAULT_BFL_BASE_URL}
+ value={realtimeCanvasConfig.bflBaseUrl}
+ />
+
+
+
+
+
+ setRealtimeCanvasConfig({
+ ...realtimeCanvasConfig,
+ bflModel: e.target.value,
+ })
+ }
+ placeholder={DEFAULT_BFL_REALTIME_MODEL}
+ value={realtimeCanvasConfig.bflModel}
+ />
+
+ >
+ )}
+
+
+
+
+
+
+ 主实时服务失败时自动切换到备用 BFL 服务。
+
+
+
+ setRealtimeCanvasConfig({
+ ...realtimeCanvasConfig,
+ fallbackEnabled: checked,
+ })
+ }
+ />
+
+
+
+
+
+
+
+ {realtimeCanvasConfig.fallbackProviderType === "replicate" ? (
+ <>
+
+
+
+ setRealtimeCanvasConfig({
+ ...realtimeCanvasConfig,
+ fallbackReplicateApiToken: e.target.value,
+ })
+ }
+ placeholder="r8_xxxxxxxxxxxxx"
+ type="password"
+ value={realtimeCanvasConfig.fallbackReplicateApiToken}
+ />
+
+
+
+
+
+ setRealtimeCanvasConfig({
+ ...realtimeCanvasConfig,
+ fallbackReplicateModel: e.target.value,
+ })
+ }
+ placeholder="black-forest-labs/flux-2-klein-4b"
+ value={realtimeCanvasConfig.fallbackReplicateModel}
+ />
+
+ >
+ ) : realtimeCanvasConfig.fallbackProviderType === "fal" ? (
+ <>
+
+ 备用 FAL 目前同样走现有服务端生成链路,不是前端直连 WebSocket
+ 真流式实时。
+
+
+
+
+
+ setRealtimeCanvasConfig({
+ ...realtimeCanvasConfig,
+ fallbackFalApiKey: e.target.value,
+ })
+ }
+ placeholder="FAL_KEY_ID:FAL_KEY_SECRET 或 token"
+ type="password"
+ value={realtimeCanvasConfig.fallbackFalApiKey}
+ />
+
+
+
+
+
+ setRealtimeCanvasConfig({
+ ...realtimeCanvasConfig,
+ fallbackFalModel: e.target.value,
+ })
+ }
+ placeholder="fal-ai/your-image-edit-model"
+ value={realtimeCanvasConfig.fallbackFalModel}
+ />
+
+
+
+
+
+ setRealtimeCanvasConfig({
+ ...realtimeCanvasConfig,
+ fallbackFalBaseUrl: e.target.value,
+ })
+ }
+ placeholder="https://fal.run"
+ value={realtimeCanvasConfig.fallbackFalBaseUrl}
+ />
+
+ >
+ ) : (
+ <>
+
+
+
+ setRealtimeCanvasConfig({
+ ...realtimeCanvasConfig,
+ fallbackBflApiKey: e.target.value,
+ })
+ }
+ placeholder="bfl_xxxxxxxxxxxxx"
+ type="password"
+ value={realtimeCanvasConfig.fallbackBflApiKey}
+ />
+
+
+
+
+
+ setRealtimeCanvasConfig({
+ ...realtimeCanvasConfig,
+ fallbackBflBaseUrl: e.target.value,
+ })
+ }
+ placeholder={DEFAULT_BFL_BASE_URL}
+ value={realtimeCanvasConfig.fallbackBflBaseUrl}
+ />
+
+
+
+
+
+ setRealtimeCanvasConfig({
+ ...realtimeCanvasConfig,
+ fallbackBflModel: e.target.value,
+ })
+ }
+ placeholder={DEFAULT_BFL_REALTIME_MODEL}
+ value={realtimeCanvasConfig.fallbackBflModel}
+ />
+
+ >
+ )}
+
+
+
+
+
+
+
+
+
+ 推荐:BFL 实时草图模型使用 `flux-2-klein-4b`;FAL
+ 需填写支持图像编辑输入的模型 ID。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ setRealtimeCanvasConfig({
+ ...realtimeCanvasConfig,
+ scheduleMu: Number.parseFloat(e.target.value) || 2.3,
+ })
+ }
+ step={0.1}
+ type="number"
+ value={realtimeCanvasConfig.scheduleMu}
+ />
+
+
+
+
+
+
+
+
+
+
+ {/* 全站生图单模型并发 */}
+