"use client"; import { useState } from "react"; import { useRouter } from "next/navigation"; import { Boxes, ChevronLeft, Loader2, MessageSquareText, Rocket, Terminal, Workflow, } from "lucide-react"; import { ListPageLayout, ListPageSection, } from "@/components/layout/list-page-layout"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { SelectionOptionCard, selectionOptionGridClassName, } from "@/components/ui/selection-option-card"; import { assistantsApi, type AssistantType as ApiAssistantType, type AssistantUpsert, type KnowledgeRetrievalConfig, } from "@/lib/api"; import { defaultTurnConfig } from "@/lib/turn-config"; type BuildMethod = "提示词" | "工作流" | "智能体平台" | "OpenCode"; const typeFromBuildMethod: Record< Exclude, ApiAssistantType > = { 提示词: "prompt", 工作流: "workflow", OpenCode: "opencode", }; type AssistantTypeOption = { type: BuildMethod; label: string; description: string; icon: React.ReactNode; /** 提示词、工作流、智能体平台已落地;OpenCode 暂时显示即将上线 */ available: boolean; }; const assistantTypeOptions: AssistantTypeOption[] = [ { type: "提示词", label: "使用提示词构建", description: "通过提示词、模型与语音快速搭建对话助手,适合大多数场景。", icon: , available: true, }, { type: "工作流", label: "使用工作流构建", description: "用可视化编排串联多个节点,适合多步骤、带分支的复杂流程。", icon: , available: true, }, { type: "智能体平台", label: "从智能体平台创建", description: "接入 Dify、FastGPT 等智能体平台,复用平台中的提示词、知识库和工作流配置。", icon: , available: true, }, { type: "OpenCode", label: "使用 OpenCode 构建", description: "对接 OpenCode 服务,通过提示词驱动代码助手并支持实时语音对话。", icon: , available: false, }, ]; function defaultKnowledgeRetrievalConfig(): KnowledgeRetrievalConfig { return { mode: "automatic", topN: 5, scoreThreshold: 0, }; } function baseUpsert(over: Partial): AssistantUpsert { return { name: "", type: "prompt", runtimeMode: "pipeline", greeting: "", enableInterrupt: true, turnConfig: defaultTurnConfig(), startup: { executionMode: "sequential", openingMode: "interruptible", entryMode: "wait_user", actions: [], openingMessage: null, }, visionEnabled: false, visionModelResourceId: null, visionPromptMode: "runtime", visionPrompt: "", modelResourceIds: {}, knowledgeBaseId: null, knowledgeRetrievalConfig: defaultKnowledgeRetrievalConfig(), toolIds: [], prompt: "", dynamicVariableDefinitions: {}, analysisConfig: { enabled: false, modelResourceId: "", fields: [], }, apiUrl: "", apiKey: "", appId: "", graph: {}, ...over, }; } export function CreateAssistantPage() { const router = useRouter(); const [draftName, setDraftName] = useState(""); const [draftType, setDraftType] = useState(null); const [creating, setCreating] = useState(false); const [createError, setCreateError] = useState(null); async function handleCreate() { if (!draftName.trim() || !draftType || creating) { return; } setCreating(true); setCreateError(null); try { const assistantType: ApiAssistantType = draftType === "智能体平台" ? "dify" : typeFromBuildMethod[draftType]; const created = await assistantsApi.create( baseUpsert({ name: draftName.trim(), type: assistantType, }), ); router.push(`/assistants/${created.id}`); } catch (error) { setCreateError(error instanceof Error ? error.message : "创建失败"); setCreating(false); } } return ( router.push("/assistants")} > 返回列表 } >
构建方式
{assistantTypeOptions.map((option) => ( setDraftType(option.type)} unselectedTrailing={ !option.available ? ( 即将上线 ) : undefined } /> ))}
{createError && ( {createError} )}
); }