- 更新 backend 平台 API endpoints 及 platform_store - 更新前端 ComputeNodesView、DataProcessCreateView、FineTuneCreateView 等组件 - 更新前端 API 模块(compute、fineTune) - 重构 frontend/dist 构建产物(新 hash) - 新增 docs/2026-07-24-work-plan.md 工作计划文档 Co-Authored-By: Claude <noreply@anthropic.com>
4 lines
74 KiB
JavaScript
4 lines
74 KiB
JavaScript
import{E as ve}from"./index-6OTFNiIi.js";import{d as ee,o as r,c as b,q as e,s as v,n as K,aa as $,g as z,j as L,x as U,w as C,M as G,ad as Z,e as B,A as F,y as N,D as se,t as ze,aL as Oe,P as Te,z as Pe,ag as Rt,aQ as Lt,H as Dt,G as zt,f as ae,aB as Nt,v as At}from"./index-CD29OCdJ.js";import{A as Bt}from"./AppConfirmDialog-BI5Yud_k.js";import{E as Qe,a as He}from"./el-form-item--AdlsBF7.js";import{E as de}from"./index-D0wqu88j.js";import{a as Ke,E as Se}from"./el-checkbox-Pnt9POcY.js";import{E as fe}from"./el-input-number-CUR6qfYr.js";/* empty css */import{_ as te}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{E as we,a as xe}from"./el-select-dn4MhMwo.js";import{E as jt}from"./el-slider-D0ESR8FK.js";import{E as Gt}from"./el-switch-4ONH-tca.js";import"./el-popper-DIiB8Y-M.js";import"./el-tooltip-l0sNRNKZ.js";import"./el-scrollbar-YCRG1835.js";import{E as Jt}from"./el-tag-C4SnL2z_.js";import{E as We}from"./el-pagination-B1UdckVp.js";import{E as Qt}from"./el-upload-swsSyuSG.js";import{E as Ht}from"./el-progress-B102G_mC.js";import{s as Kt,a as Wt,r as Zt,u as Xt,b as Yt,c as Ne,e as en,f as Ae,h as tn,i as nn,j as ln,k as sn,l as Be,m as an,t as on,p as un,n as rn,o as dn,q as cn}from"./dataProcess-CvvVdP7v.js";import{u as pn}from"./models-OcIATFUq.js";import"./castArray-BEiueV6y.js";import"./_baseClone-Blem5BWg.js";import"./raf-DGtHIxe2.js";import"./index-C8FAS7l2.js";import"./index-DpY84JwG.js";import"./omit-9H73Nvwk.js";import"./index-sBiRi5wE.js";import"./index-BpugJXyE.js";import"./vnode-_QM9LlTR.js";import"./index-D1b786GX.js";import"./scroll-D-TPweuo.js";import"./clamp-BfrLWns4.js";import"./toNumber-B6P5MqPp.js";import"./_baseIteratee-CuPmYyG4.js";import"./debounce-BCyqG5kC.js";import"./validator-BQ0LVwAS.js";import"./model-e1J4FzWC.js";const mn={class:"generation-option-row dataset-split-row"},vn={class:"dataset-split-config"},fn={class:"dataset-split-grid"},gn={class:"dataset-split-field"},yn={class:"dataset-split-input"},kn={class:"dataset-split-field"},Sn={class:"dataset-split-input"},wn={class:"dataset-split-field"},xn={class:"dataset-split-input"},_n={key:0,role:"alert"},bn=ee({__name:"DatasetSplitEditor",props:{modelValue:{},ariaLabelPrefix:{default:""}},emits:["update:modelValue"],setup(t,{emit:P}){const k=t,i=P,m=L(()=>{const{train:T,validation:p,test:s}=k.modelValue;return T+p+s});function O(T,p){i("update:modelValue",{...k.modelValue,[T]:Math.min(100,Math.max(0,Number(p)||0))})}function g(T){return`${k.ariaLabelPrefix}${T}比例`}return(T,p)=>{const s=fe;return r(),b("div",mn,[p[9]||(p[9]=e("div",{class:"generation-option-copy"},[e("strong",null,"数据集划分"),e("small",null,"按比例将生成后的问答对随机划分为训练集、验证集和测试集")],-1)),e("div",vn,[e("div",fn,[e("label",gn,[p[4]||(p[4]=e("span",null,"训练集",-1)),e("span",yn,[v(s,{"model-value":t.modelValue.train,min:0,max:100,step:1,precision:0,"controls-position":"right","aria-label":g("训练集"),"onUpdate:modelValue":p[0]||(p[0]=w=>O("train",w))},null,8,["model-value","aria-label"]),p[3]||(p[3]=e("span",null,"%",-1))])]),e("label",kn,[p[6]||(p[6]=e("span",null,"验证集",-1)),e("span",Sn,[v(s,{"model-value":t.modelValue.validation,min:0,max:100,step:1,precision:0,"controls-position":"right","aria-label":g("验证集"),"onUpdate:modelValue":p[1]||(p[1]=w=>O("validation",w))},null,8,["model-value","aria-label"]),p[5]||(p[5]=e("span",null,"%",-1))])]),e("label",wn,[p[8]||(p[8]=e("span",null,"测试集",-1)),e("span",xn,[v(s,{"model-value":t.modelValue.test,min:0,max:100,step:1,precision:0,"controls-position":"right","aria-label":g("测试集"),"onUpdate:modelValue":p[2]||(p[2]=w=>O("test",w))},null,8,["model-value","aria-label"]),p[7]||(p[7]=e("span",null,"%",-1))])])]),e("div",{class:K(["dataset-split-summary",{"is-invalid":m.value!==100}])},[e("span",null,"总计 "+$(m.value)+"%",1),m.value!==100?(r(),b("span",_n," 训练集、验证集和测试集比例总和必须为 100% ")):z("",!0)],2)])])}}}),Ze=te(bn,[["__scopeId","data-v-8ab33ca4"]]),hn={key:0,class:"generation-config-group model-config-group"},$n={class:"model-field"},On={class:"model-option"},Cn={class:"model-field"},Pn={class:"advanced-settings-grid"},Tn={class:"config-field"},In={class:"config-field"},En={class:"unit-input"},Mn={class:"json-mode-row"},Vn={key:0,class:"generation-validation-message",role:"alert"},Un={key:1,class:"generation-config-group quality-config-group"},Fn={class:"quality-switch-row"},qn={key:0,class:"quality-rule-panel"},Rn={key:0,class:"minimum-length-field"},Ln={class:"minimum-length-input"},Dn={key:1,class:"quality-rule-warning",role:"alert"},zn={key:1,class:"generation-validation-message",role:"alert"},Nn=ee({__name:"GenerationOptionsPanel",props:{options:{},models:{},section:{},validationMessage:{}},emits:["update:options"],setup(t,{emit:P}){const k=t,i=P;function m(p,s){i("update:options",{...k.options,[p]:s})}function O(p){const s=p.filter(w=>typeof w=="string");i("update:options",{...k.options,filterLowQuality:s.includes("low_quality"),filterShortContent:s.includes("short_content")})}const g=()=>[k.options.filterLowQuality?"low_quality":"",k.options.filterShortContent?"short_content":""].filter(Boolean);function T(){if(!k.validationMessage)return"";const p=k.validationMessage.includes("数据生成模型");return k.section==="model"?p?k.validationMessage:"":p?"":k.validationMessage}return(p,s)=>{const w=xe,u=we,f=de,o=jt,D=fe,M=Gt,V=Se,d=Ke;return t.section==="model"?(r(),b("div",hn,[e("div",$n,[s[8]||(s[8]=e("div",{class:"field-copy"},[e("strong",null,[U("数据生成模型 "),e("em",null,"*")]),e("small",null,"选择负责生成问答、指令或结构化内容的大模型")],-1)),v(u,{class:"model-select","model-value":t.options.generationModelId,filterable:"",placeholder:"请选择用于生成数据的模型","aria-label":"数据生成模型","onUpdate:modelValue":s[0]||(s[0]=S=>m("generationModelId",S))},{empty:C(()=>[...s[7]||(s[7]=[e("div",{class:"model-empty"},"暂无可用的大模型,请先在模型管理中添加",-1)])]),default:C(()=>[(r(!0),b(G,null,Z(t.models||[],S=>(r(),B(w,{key:S.id,label:S.name,value:S.id},{default:C(()=>[e("div",On,[e("span",null,$(S.name),1),e("small",null,$(S.model_source==="api"?"在线模型":"本地模型"),1)])]),_:2},1032,["label","value"]))),128))]),_:1},8,["model-value"])]),e("div",Cn,[s[9]||(s[9]=e("div",{class:"field-copy"},[e("strong",null,"默认提示语"),e("small",null,"用于约束生成内容的格式、语气和完整性,可按任务需要修改")],-1)),v(f,{class:"prompt-input","model-value":t.options.generationPrompt,type:"textarea",rows:4,maxlength:"500","show-word-limit":"",resize:"vertical",placeholder:"请输入模型生成内容时需要遵循的要求","aria-label":"模型默认提示语","onUpdate:modelValue":s[1]||(s[1]=S=>m("generationPrompt",S))},null,8,["model-value"]),s[10]||(s[10]=e("div",{class:"prompt-variables-hint"},[U(" 提示:可在文本中通过 "),e("code",{textContent:"{{ content }}"}),U(" 引用当前正在处理的数据内容。 ")],-1))]),e("div",Pn,[e("label",Tn,[s[11]||(s[11]=e("span",{class:"config-field-label"},"生成温度 (Temperature)",-1)),v(o,{"model-value":t.options.temperature,min:0,max:1,step:.1,"show-input":"","onUpdate:modelValue":s[2]||(s[2]=S=>m("temperature",Number(S)||0))},null,8,["model-value"]),s[12]||(s[12]=e("small",null,"较低值输出更确定、保守,较高值输出更多样、有创造性",-1))]),e("label",In,[s[14]||(s[14]=e("span",{class:"config-field-label"},"最大输出长度 (Max Tokens)",-1)),e("span",En,[v(D,{"model-value":t.options.maxTokens,min:100,max:8192,step:256,"controls-position":"right","onUpdate:modelValue":s[3]||(s[3]=S=>m("maxTokens",Number(S)||1024))},null,8,["model-value"]),s[13]||(s[13]=e("span",null,"Token",-1))]),s[15]||(s[15]=e("small",null,"限制单次生成的最大内容长度,防止过度发散",-1))])]),e("div",Mn,[s[16]||(s[16]=e("div",{class:"field-copy"},[e("strong",null,"强制 JSON 格式输出"),e("small",null,"要求大模型返回纯 JSON 对象,有助于提高下游结构化提取的稳定性")],-1)),v(M,{"model-value":t.options.jsonMode,"inline-prompt":"","active-text":"开","inactive-text":"关","onUpdate:modelValue":s[4]||(s[4]=S=>m("jsonMode",!!S))},null,8,["model-value"])]),T()?(r(),b("p",Vn,$(T()),1)):z("",!0)])):(r(),b("div",Un,[e("div",Fn,[s[17]||(s[17]=e("div",{class:"config-group-heading"},[e("div",null,[e("h4",null,"质量筛选"),e("p",null,"生成后自动过滤不符合要求的内容,不影响源数据预处理")])],-1)),v(M,{"model-value":t.options.qualityFilterEnabled,"inline-prompt":"","active-text":"开","inactive-text":"关","aria-label":"质量筛选","onUpdate:modelValue":s[5]||(s[5]=S=>m("qualityFilterEnabled",!!S))},null,8,["model-value"])]),t.options.qualityFilterEnabled?(r(),b("div",qn,[v(d,{"model-value":g(),class:"quality-rule-list","onUpdate:modelValue":O},{default:C(()=>[v(V,{value:"low_quality"},{default:C(()=>[...s[18]||(s[18]=[e("span",{class:"rule-copy"},[e("strong",null,"过滤低质量内容"),e("small",null,"按相关性、完整性和可读性过滤明显不合格的生成结果")],-1)])]),_:1}),v(V,{value:"short_content"},{default:C(()=>[...s[19]||(s[19]=[e("span",{class:"rule-copy"},[e("strong",null,"过滤过短内容"),e("small",null,"过滤正文长度低于指定字数的生成结果")],-1)])]),_:1})]),_:1},8,["model-value"]),t.options.filterShortContent?(r(),b("label",Rn,[s[21]||(s[21]=e("span",null,"最少字数",-1)),e("span",Ln,[v(D,{"model-value":t.options.minOutputLength,min:1,max:1e3,step:5,precision:0,"controls-position":"right","aria-label":"生成内容最少字数","onUpdate:modelValue":s[6]||(s[6]=S=>m("minOutputLength",Number(S)||1))},null,8,["model-value"]),s[20]||(s[20]=e("span",null,"字",-1))]),s[22]||(s[22]=e("small",null,"少于该字数的生成结果将被过滤",-1))])):z("",!0),!t.options.filterLowQuality&&!t.options.filterShortContent?(r(),b("p",Dn," 请至少选择一项质量筛选规则 ")):z("",!0)])):z("",!0),T()?(r(),b("p",zn,$(T()),1)):z("",!0)]))}}}),Ie=te(Nn,[["__scopeId","data-v-e0d42ecd"]]),An={class:"form-section structured-options-section"},Bn={class:"preprocess-option-copy"},jn={class:"form-section generation-options-section"},Gn={class:"generation-option-list"},Jn={class:"generation-option-row"},Qn=ee({__name:"StructuredOptionsPanel",props:{options:{},validationAttempted:{type:Boolean},qualityValidationMessage:{}},emits:["update:options"],setup(t,{emit:P}){const k=t,i=P,m=[{value:"clean_invalid",label:"清理无效数据",description:"处理空行、空列和残缺行"},{value:"detect_structure",label:"识别表格结构",description:"识别表头、多级表头和合并单元格"},{value:"deduplicate",label:"重复数据去重",description:"删除完全重复或关键字段重复的数据"},{value:"normalize_format",label:"数据格式标准化",description:"统一编码、空白、字段名和 JSON 序列化格式"},{value:"filter_anomaly",label:"异常数据过滤",description:"过滤乱码、无效内容和异常记录"},{value:"desensitize",label:"敏感信息脱敏",description:"处理姓名、手机号、邮箱等敏感信息"}];function O(p,s){i("update:options",{...k.options,[p]:s})}function g(p){i("update:options",{...k.options,...p})}function T(p){const s=new Set(m.map(u=>u.value)),w=p.filter(u=>typeof u=="string"&&s.has(u));O("preprocessOptions",w)}return(p,s)=>{const w=Se,u=Ke,f=fe;return r(),b(G,null,[e("div",An,[s[2]||(s[2]=e("div",{class:"section-title-row"},[e("div",null,[e("h3",null,"预处理选项"),e("p",null,"选择在生成问答对之前需要执行的数据处理方式")])],-1)),v(u,{"model-value":t.options.preprocessOptions,class:"preprocess-option-grid","onUpdate:modelValue":T},{default:C(()=>[(r(),b(G,null,Z(m,o=>v(w,{key:o.value,value:o.value,class:"preprocess-option"},{default:C(()=>[e("span",Bn,[e("strong",null,$(o.label),1),e("small",null,$(o.description),1)])]),_:2},1032,["value"])),64))]),_:1},8,["model-value"])]),e("div",jn,[s[4]||(s[4]=e("div",{class:"section-title-row"},[e("div",null,[e("h3",null,"生成选项"),e("p",null,"配置每条结构化记录生成问答对的方式和数量")])],-1)),e("div",Gn,[v(Ie,{options:t.options,section:"quality","validation-message":t.validationAttempted?t.qualityValidationMessage:"","onUpdate:options":g},null,8,["options","validation-message"]),e("div",Jn,[s[3]||(s[3]=e("div",{class:"generation-option-copy"},[e("strong",null,"每行生成数量"),e("small",null,"每行结构化数据生成的问答对数量")],-1)),v(f,{"model-value":t.options.qaPairsPerRow,min:1,max:5,step:1,"controls-position":"right","onUpdate:modelValue":s[0]||(s[0]=o=>O("qaPairsPerRow",Number(o)||1))},null,8,["model-value"])]),v(Ze,{"model-value":t.options.datasetSplit,"onUpdate:modelValue":s[1]||(s[1]=o=>O("datasetSplit",o))},null,8,["model-value"])])])],64)}}}),Hn=te(Qn,[["__scopeId","data-v-3b2190d6"]]),Kn={class:"form-section unstructured-options-section"},Wn={class:"preprocess-option-grid"},Zn={class:"form-section chunk-options-section"},Xn={class:"chunk-settings-grid is-basic"},Yn={class:"config-field"},el={class:"config-field"},tl={class:"unit-input"},nl={class:"config-field"},ll={class:"unit-input"},sl={class:"config-field"},al={class:"unit-input"},ol={key:0,class:"config-field"},il={key:0,class:"option-validation-message",role:"alert"},ul={class:"form-section generation-options-section"},rl={class:"generation-option-list"},dl={class:"generation-option-row"},cl=ee({__name:"UnstructuredOptionsPanel",props:{options:{},validationAttempted:{type:Boolean},qualityValidationMessage:{},chunkValidationMessage:{}},emits:["update:options"],setup(t,{expose:P,emit:k}){const i=t,m=k,O=["clean_invalid_content","detect_document_structure","merge_short_content","filter_low_quality","deduplicate_content","preserve_context"],g=[{value:"semantic",label:"自动语义切分"},{value:"heading",label:"按标题和段落"},{value:"fixed",label:"按固定长度"},{value:"custom",label:"自定义分隔符"}],T={chunkSize:{min:200,max:2e3},chunkOverlap:{min:0,max:500},minChunkSize:{min:20,max:500},qaPairsPerChunk:{min:1,max:3}},p=L(()=>O.every(S=>i.options.preprocessOptions.includes(S))),s=L(()=>i.options.preprocessOptions.includes("desensitize")),w=L(()=>i.options.preserveTables&&i.options.preserveCodeBlocks&&i.options.preserveLists);function u(S,n){m("update:options",{...i.options,[S]:n})}function f(S){m("update:options",{...i.options,...S})}function o(S){const n=!!S,_=i.options.preprocessOptions.filter(h=>!O.includes(h));u("preprocessOptions",n?[...O,..._]:_)}function D(S){const n=i.options.preprocessOptions.filter(_=>_!=="desensitize");S&&n.push("desensitize"),u("preprocessOptions",n)}function M(S){const n=!!S;m("update:options",{...i.options,preserveTables:n,preserveCodeBlocks:n,preserveLists:n})}function V(S,n){const _=T[S],h=Number(n),E=Number.isFinite(h)?h:_.min;u(S,Math.min(_.max,Math.max(_.min,E)))}function d(){}return P({revealValidation:d}),(S,n)=>{const _=Se,h=xe,E=we,c=fe,x=de;return r(),b(G,null,[e("div",Kn,[n[10]||(n[10]=e("div",{class:"section-title-row"},[e("div",null,[e("h3",null,"预处理选项"),e("p",null,"默认使用推荐策略,只需决定是否需要脱敏")])],-1)),e("div",Wn,[e("label",{class:K(["preprocess-option",{"is-checked":p.value}])},[v(_,{"model-value":p.value,"onUpdate:modelValue":o},null,8,["model-value"]),n[7]||(n[7]=e("span",{class:"preprocess-option-copy"},[e("strong",null,"智能预处理"),e("small",null,"自动清理、解析、去重及保留上下文")],-1))],2),e("label",{class:K(["preprocess-option",{"is-checked":s.value}])},[v(_,{"model-value":s.value,"onUpdate:modelValue":D},null,8,["model-value"]),n[8]||(n[8]=e("span",{class:"preprocess-option-copy"},[e("strong",null,"敏感信息脱敏"),e("small",null,"处理姓名、手机号等隐私信息")],-1))],2),e("label",{class:K(["preprocess-option",{"is-checked":w.value}])},[v(_,{"model-value":w.value,"onUpdate:modelValue":M},null,8,["model-value"]),n[9]||(n[9]=e("span",{class:"preprocess-option-copy"},[e("strong",null,"保护表格、代码和列表"),e("small",null,"避免切分点破坏特殊内容块的完整性")],-1))],2)])]),e("div",Zn,[n[24]||(n[24]=e("div",{class:"section-title-row"},[e("div",null,[e("h3",null,"切分选项"),e("p",null,"以语义完整为优先,将长文档拆成可独立生成问答的内容块")])],-1)),e("div",Xn,[e("label",Yn,[n[11]||(n[11]=e("span",{class:"config-field-label"},"切分方式",-1)),v(E,{"model-value":t.options.chunkMethod,"aria-label":"切分方式","onUpdate:modelValue":n[0]||(n[0]=y=>u("chunkMethod",y))},{default:C(()=>[(r(),b(G,null,Z(g,y=>v(h,{key:y.value,label:y.label,value:y.value},null,8,["label","value"])),64))]),_:1},8,["model-value"]),n[12]||(n[12]=e("small",null,"推荐使用自动语义切分,在长度限制内优先保留完整句段",-1))]),e("label",el,[n[14]||(n[14]=e("span",{class:"config-field-label"},"切片长度",-1)),e("span",tl,[v(c,{"model-value":t.options.chunkSize,min:200,max:2e3,step:50,precision:0,"controls-position":"right","aria-label":"切片长度","onUpdate:modelValue":n[1]||(n[1]=y=>V("chunkSize",y))},null,8,["model-value"]),n[13]||(n[13]=e("span",null,"Token",-1))]),n[15]||(n[15]=e("small",null,"单个切片的目标上限,默认 800 Token",-1))]),e("label",nl,[n[17]||(n[17]=e("span",{class:"config-field-label"},"重叠长度",-1)),e("span",ll,[v(c,{"model-value":t.options.chunkOverlap,min:0,max:500,step:10,precision:0,"controls-position":"right","aria-label":"重叠长度","onUpdate:modelValue":n[2]||(n[2]=y=>V("chunkOverlap",y))},null,8,["model-value"]),n[16]||(n[16]=e("span",null,"Token",-1))]),n[18]||(n[18]=e("small",null,"在相邻切片中最多重复保留的上下文,默认 100 Token",-1))]),e("label",sl,[n[20]||(n[20]=e("span",{class:"config-field-label"},"最小切片长度",-1)),e("span",al,[v(c,{"model-value":t.options.minChunkSize,min:20,max:500,step:10,precision:0,"controls-position":"right","aria-label":"最小切片长度","onUpdate:modelValue":n[3]||(n[3]=y=>V("minChunkSize",y))},null,8,["model-value"]),n[19]||(n[19]=e("span",null,"Token",-1))]),n[21]||(n[21]=e("small",null,"过短的尾部内容会尽量并入前一个切片",-1))]),t.options.chunkMethod==="custom"?(r(),b("label",ol,[n[22]||(n[22]=e("span",{class:"config-field-label"},"自定义分隔符",-1)),v(x,{"model-value":t.options.customDelimiter,maxlength:"40","show-word-limit":"",placeholder:"例如:--- 或 ###","aria-label":"自定义分隔符","onUpdate:modelValue":n[4]||(n[4]=y=>u("customDelimiter",y))},null,8,["model-value"]),n[23]||(n[23]=e("small",null,"系统会优先在分隔符位置结束当前切片",-1))])):z("",!0)]),n[25]||(n[25]=e("p",{class:"chunk-estimation-note"}," Token 数为轻量估算值,实际长度以训练使用的模型分词器为准。 ",-1)),t.chunkValidationMessage?(r(),b("p",il,$(t.chunkValidationMessage),1)):z("",!0)]),e("div",ul,[n[27]||(n[27]=e("div",{class:"section-title-row"},[e("div",null,[e("h3",null,"生成选项"),e("p",null,"只保留会直接影响输出的核心设置")])],-1)),e("div",rl,[v(Ie,{options:t.options,section:"quality","validation-message":t.validationAttempted?t.qualityValidationMessage:"","onUpdate:options":f},null,8,["options","validation-message"]),e("div",dl,[n[26]||(n[26]=e("div",{class:"generation-option-copy"},[e("strong",null,"每个切片生成数量"),e("small",null,"每个内容切片最多生成 3 个不同角度的问答对")],-1)),v(c,{"model-value":t.options.qaPairsPerChunk,min:1,max:3,step:1,precision:0,"controls-position":"right","aria-label":"每个切片生成数量","onUpdate:modelValue":n[5]||(n[5]=y=>V("qaPairsPerChunk",y))},null,8,["model-value"])]),v(Ze,{"model-value":t.options.datasetSplit,"aria-label-prefix":"非结构化","onUpdate:modelValue":n[6]||(n[6]=y=>u("datasetSplit",y))},null,8,["model-value"])])])],64)}}}),pl=te(cl,[["__scopeId","data-v-1008ff27"]]),ml={class:"task-setup-step"},vl={class:"form-section"},fl={class:"basic-grid"},gl={class:"form-section"},yl={class:"type-options"},kl=ee({__name:"TaskSetupStep",props:{name:{},description:{},processType:{},structuredOptions:{},unstructuredOptions:{}},emits:["update:name","update:description","update:processType","update:structuredOptions","update:unstructuredOptions"],setup(t,{expose:P,emit:k}){const i=t,m=k,O=N(),g=N(),T=N(!1),p=L(()=>({name:i.name,processType:i.processType})),s=L(()=>{const{train:V,validation:d,test:S}=i.structuredOptions.datasetSplit;return V+d+S}),w=L(()=>{const{train:V,validation:d,test:S}=i.unstructuredOptions.datasetSplit;return V+d+S}),u=L(()=>i.processType==="structured"?i.structuredOptions:i.processType==="unstructured"?i.unstructuredOptions:null),f=L(()=>{const V=u.value;return V?V.qualityFilterEnabled&&!V.filterLowQuality&&!V.filterShortContent?"开启质量筛选后,请至少选择一项筛选规则":V.qualityFilterEnabled&&V.filterShortContent&&V.minOutputLength<1?"最少字数必须大于 0":"":""}),o=L(()=>i.unstructuredOptions.chunkOverlap>=i.unstructuredOptions.chunkSize?"重叠长度必须小于切片长度":i.unstructuredOptions.minChunkSize>i.unstructuredOptions.chunkSize?"最小切片长度不能大于切片长度":i.unstructuredOptions.chunkOverlap+i.unstructuredOptions.minChunkSize>i.unstructuredOptions.chunkSize?"重叠长度与最小切片长度之和不能大于切片长度":i.unstructuredOptions.chunkMethod==="custom"&&!i.unstructuredOptions.customDelimiter.trim()?"请输入自定义分隔符":""),D={name:[{required:!0,message:"请输入任务名称",trigger:"blur"},{max:50,message:"任务名称不能超过 50 个字符",trigger:"blur"}],processType:[{required:!0,message:"请选择数据处理类型",trigger:"change"}]};async function M(){var V;if(T.value=!0,!O.value)return!1;try{if(await O.value.validate(),i.processType==="structured"&&s.value!==100)return F.error("结构化数据处理:数据集划分比例总和必须为 100%"),!1;if(i.processType==="unstructured"){if(w.value!==100)return F.error("非结构化数据处理:数据集划分比例总和必须为 100%"),!1;if(o.value)return(V=g.value)==null||V.revealValidation(),F.error(o.value),!1}return f.value?(F.error(f.value),!1):!0}catch{return F.error("请完善标红的必填项"),!1}}return P({validate:M}),(V,d)=>{const S=de,n=He,_=Qe;return r(),b("section",ml,[v(_,{ref_key:"formRef",ref:O,model:p.value,rules:D,"label-position":"top","scroll-to-error":""},{default:C(()=>[e("div",vl,[d[7]||(d[7]=e("h3",null,"基本信息",-1)),e("div",fl,[v(n,{label:"任务名称",prop:"name",required:""},{default:C(()=>[v(S,{"model-value":t.name,maxlength:"50","show-word-limit":"",placeholder:"例如:金融问答清洗任务","onUpdate:modelValue":d[0]||(d[0]=h=>m("update:name",h))},null,8,["model-value"])]),_:1}),v(n,{label:"任务描述(选填)"},{default:C(()=>[v(S,{"model-value":t.description,type:"textarea",rows:3,maxlength:"200","show-word-limit":"",placeholder:"简要说明本次数据处理目标","onUpdate:modelValue":d[1]||(d[1]=h=>m("update:description",h))},null,8,["model-value"])]),_:1})])]),e("div",gl,[d[11]||(d[11]=e("div",{class:"section-title-row"},[e("div",null,[e("h3",null,"处理类型"),e("p",null,"类型会影响下一步支持的数据源格式和后续预览方式")])],-1)),v(n,{prop:"processType",class:"type-form-item"},{default:C(()=>[e("div",yl,[e("button",{type:"button",class:K(["type-option",{"is-active":t.processType==="structured"}]),onClick:d[2]||(d[2]=h=>m("update:processType","structured"))},[...d[8]||(d[8]=[e("span",{class:"type-icon"},[e("i",{class:"fa fa-table"})],-1),e("span",null,[e("strong",null,"结构化数据"),e("small",null,"适用于 CSV、Excel、JSONL 等固定字段数据")],-1),e("i",{class:"fa fa-check-circle selection-mark"},null,-1)])],2),e("button",{type:"button",class:K(["type-option",{"is-active":t.processType==="unstructured"}]),onClick:d[3]||(d[3]=h=>m("update:processType","unstructured"))},[...d[9]||(d[9]=[e("span",{class:"type-icon"},[e("i",{class:"fa fa-file-text-o"})],-1),e("span",null,[e("strong",null,"非结构化数据"),e("small",null,"适用于文档、文本、问答等需要切分的数据")],-1),e("i",{class:"fa fa-check-circle selection-mark"},null,-1)])],2),e("button",{type:"button",class:K(["type-option",{"is-active":t.processType==="external"}]),onClick:d[4]||(d[4]=h=>m("update:processType","external"))},[...d[10]||(d[10]=[e("span",{class:"type-icon"},[e("i",{class:"fa fa-cloud-download"})],-1),e("span",null,[e("strong",null,"外来数据源拉取"),e("small",null,"适用于数据库、API 接口等需远程拉取的外部数据")],-1),e("i",{class:"fa fa-check-circle selection-mark"},null,-1)])],2)])]),_:1})]),t.processType==="structured"?(r(),B(Hn,{key:0,options:t.structuredOptions,"validation-attempted":T.value,"quality-validation-message":f.value,"onUpdate:options":d[5]||(d[5]=h=>m("update:structuredOptions",h))},null,8,["options","validation-attempted","quality-validation-message"])):z("",!0),t.processType==="unstructured"?(r(),B(pl,{key:1,ref_key:"unstructuredOptionsPanelRef",ref:g,options:t.unstructuredOptions,"validation-attempted":T.value,"quality-validation-message":f.value,"chunk-validation-message":o.value,"onUpdate:options":d[6]||(d[6]=h=>m("update:unstructuredOptions",h))},null,8,["options","validation-attempted","quality-validation-message","chunk-validation-message"])):z("",!0)]),_:1},8,["model"])])}}}),Sl=te(kl,[["__scopeId","data-v-2c81dd84"]]),wl={class:"model-selection-step","aria-labelledby":"model-selection-title"},xl={class:"form-section"},_l={class:"model-form-content"},bl=ee({__name:"ModelSelectionStep",props:{options:{},models:{}},emits:["update:options"],setup(t,{expose:P,emit:k}){const i=t,m=k,O=N(!1),g=L(()=>i.options.generationModelId===""?"请选择数据生成模型":"");function T(){return O.value=!0,g.value?(F.error(g.value),!1):!0}return P({validate:T}),(p,s)=>(r(),b("section",wl,[e("div",xl,[s[1]||(s[1]=e("div",{class:"section-title-row"},[e("div",null,[e("h3",{id:"model-selection-title"},"大模型选择"),e("p",null,"选择本次数据生成使用的模型,并设置统一的输出要求")])],-1)),e("div",_l,[v(Ie,{options:t.options,models:t.models,section:"model","validation-message":O.value?g.value:"","onUpdate:options":s[0]||(s[0]=w=>m("update:options",w))},null,8,["options","models","validation-message"])])])]))}}),hl=te(bl,[["__scopeId","data-v-2e85e377"]]),$l={class:"source-upload-step","aria-labelledby":"source-upload-title"},Ol={key:0,class:"form-section external-section"},Cl={class:"external-form"},Pl={class:"external-actions"},Tl={key:0,class:"external-status is-connected",role:"status"},Il={key:0,class:"uploaded-file-list","aria-label":"已拉取数据列表"},El={class:"uploaded-file-list-header"},Ml={class:"uploaded-file-items"},Vl={class:"file-main"},Ul=["title"],Fl={key:1,class:"form-section upload-section"},ql={class:"section-title-row"},Rl={class:"el-upload__tip"},Ll={key:1,class:"uploaded-file-list","aria-label":"已上传文件列表"},Dl={class:"uploaded-file-list-header"},zl={class:"continue-upload"},Nl={class:"uploaded-file-items"},Al={class:"file-main"},Bl=["title"],oe=10,jl=ee({__name:"SourceUploadStep",props:{processType:{},uploadedFiles:{},externalSource:{},externalPulling:{type:Boolean},externalConnected:{type:Boolean}},emits:["update:externalSource","file-change","remove-file","use-sample","test-connection","pull-data"],setup(t,{emit:P}){const k=t,i=P,m=[{value:"postgresql",label:"PostgreSQL"}],O=[{value:"none",label:"免鉴权"},{value:"basic",label:"账号密码"}],g=N(1),T=L(()=>k.processType==="external"),p=L(()=>k.processType==="unstructured"?".txt,.md,.json,.jsonl":".json,.jsonl,.csv,.txt,.md"),s=L(()=>{const f=(g.value-1)*oe;return k.uploadedFiles.slice(f,f+oe)});se(()=>k.uploadedFiles.length,(f,o)=>{const D=Math.max(1,Math.ceil(f/oe));if(f>o){g.value=D;return}g.value=Math.min(g.value,D)}),se(()=>k.processType,()=>{g.value=1});function w(f,o){i("update:externalSource",{...k.externalSource,[f]:o})}function u(f){return f?f>=1024*1024?`${(f/1024/1024).toFixed(1)} MB`:`${(f/1024).toFixed(1)} KB`:"0 KB"}return(f,o)=>{const D=xe,M=we,V=He,d=de,S=fe,n=Qe,_=ve,h=We,E=Qt;return r(),b("section",$l,[T.value?(r(),b("div",Ol,[o[19]||(o[19]=e("div",{class:"section-title-row"},[e("div",null,[e("h3",{id:"source-upload-title"},"数据源配置"),e("p",null,"配置并验证外部数据源,拉取成功后可在下一步预览数据内容")])],-1)),e("div",Cl,[v(n,{"label-position":"top",class:"external-grid"},{default:C(()=>[v(V,{label:"数据源类型"},{default:C(()=>[v(M,{"model-value":t.externalSource.type,placeholder:"请选择数据源类型","aria-label":"数据源类型","onUpdate:modelValue":o[0]||(o[0]=c=>w("type",c))},{default:C(()=>[(r(),b(G,null,Z(m,c=>v(D,{key:c.value,label:c.label,value:c.value},null,8,["label","value"])),64))]),_:1},8,["model-value"])]),_:1}),v(V,{label:"地址 / URL"},{default:C(()=>[v(d,{"model-value":t.externalSource.url,placeholder:"例如:postgresql://db.example.com:5432/my_database","aria-label":"数据源地址或 URL","onUpdate:modelValue":o[1]||(o[1]=c=>w("url",c))},null,8,["model-value"])]),_:1}),v(V,{label:"鉴权方式"},{default:C(()=>[v(M,{"model-value":t.externalSource.authMode,"aria-label":"鉴权方式","onUpdate:modelValue":o[2]||(o[2]=c=>w("authMode",c))},{default:C(()=>[(r(),b(G,null,Z(O,c=>v(D,{key:c.value,label:c.label,value:c.value},null,8,["label","value"])),64))]),_:1},8,["model-value"])]),_:1}),t.externalSource.authMode==="basic"?(r(),B(V,{key:0,label:"账号"},{default:C(()=>[v(d,{"model-value":t.externalSource.username,autocomplete:"username",placeholder:"请输入账号","aria-label":"数据源账号","onUpdate:modelValue":o[3]||(o[3]=c=>w("username",c))},null,8,["model-value"])]),_:1})):z("",!0),t.externalSource.authMode==="basic"?(r(),B(V,{key:1,label:"密码"},{default:C(()=>[v(d,{"model-value":t.externalSource.password,type:"password","show-password":"",autocomplete:"current-password",placeholder:"请输入密码","aria-label":"数据源密码","onUpdate:modelValue":o[4]||(o[4]=c=>w("password",c))},null,8,["model-value"])]),_:1})):z("",!0),v(V,{label:"拉取条数"},{default:C(()=>[v(S,{"model-value":t.externalSource.limit,min:1,max:1e5,step:100,"controls-position":"right","aria-label":"数据拉取条数","onUpdate:modelValue":o[5]||(o[5]=c=>w("limit",Number(c)||0))},null,8,["model-value"])]),_:1}),v(V,{label:"只读查询语句",class:"external-query-field"},{default:C(()=>[v(d,{"model-value":t.externalSource.query,type:"textarea",rows:4,maxlength:"20000","show-word-limit":"",placeholder:"例如:SELECT question, answer FROM qa_data ORDER BY id","aria-label":"外部数据源只读查询语句","onUpdate:modelValue":o[6]||(o[6]=c=>w("query",c))},null,8,["model-value"]),o[12]||(o[12]=e("small",null,"只允许单条 SELECT 或 WITH 查询;后端会拒绝写入、DDL 和多语句。",-1))]),_:1})]),_:1}),e("div",Pl,[v(_,{loading:t.externalPulling&&!t.externalConnected,disabled:t.externalPulling,plain:"",onClick:o[7]||(o[7]=c=>i("test-connection"))},{default:C(()=>[...o[13]||(o[13]=[U(" 测试连接 ",-1)])]),_:1},8,["loading","disabled"]),v(_,{type:"primary",loading:t.externalPulling,disabled:t.externalPulling,onClick:o[8]||(o[8]=c=>i("pull-data"))},{default:C(()=>[...o[14]||(o[14]=[U(" 拉取数据 ",-1)])]),_:1},8,["loading","disabled"]),t.externalConnected?(r(),b("span",Tl,[...o[15]||(o[15]=[e("i",{class:"fa fa-check-circle","aria-hidden":"true"},null,-1),U(" 连接正常 ",-1)])])):z("",!0)]),t.uploadedFiles.length?(r(),b("section",Il,[e("div",El,[e("span",null,"已拉取 "+$(t.uploadedFiles.length)+" 个数据集",1)]),e("div",Ml,[(r(!0),b(G,null,Z(s.value,c=>(r(),b("div",{key:c.uid,class:"uploaded-file"},[o[17]||(o[17]=e("span",{class:"file-icon"},[e("i",{class:"fa fa-cloud-download","aria-hidden":"true"})],-1)),e("div",Vl,[e("strong",{title:c.name},$(c.name),9,Ul),e("span",null,[U($(u(c.size))+" ",1),c.count?(r(),b(G,{key:0},[U(" · "+$(c.count.toLocaleString())+" 条",1)],64)):z("",!0)])]),o[18]||(o[18]=e("span",{class:"file-status"},[e("i",{class:"fa fa-check-circle","aria-hidden":"true"}),U(" 拉取成功")],-1)),v(_,{link:"",type:"danger","aria-label":`删除数据集 ${c.name}`,onClick:x=>i("remove-file",c.uid)},{default:C(()=>[...o[16]||(o[16]=[U(" 删除 ",-1)])]),_:1},8,["aria-label","onClick"])]))),128))]),t.uploadedFiles.length>oe?(r(),B(h,{key:0,"current-page":g.value,"onUpdate:currentPage":o[9]||(o[9]=c=>g.value=c),"page-size":oe,total:t.uploadedFiles.length,"pager-count":5,small:"",background:"",layout:"prev, pager, next",class:"uploaded-file-pagination","aria-label":"已拉取数据分页"},null,8,["current-page","total"])):z("",!0)])):z("",!0)])])):(r(),b("div",Fl,[e("div",ql,[o[21]||(o[21]=e("div",null,[e("h3",{id:"source-upload-title"},"源数据上传"),e("p",null,"上传后可在下一步检查内容和切分效果,支持同时添加多个文件")],-1)),t.uploadedFiles.length===0?(r(),B(_,{key:0,link:"",type:"primary",onClick:o[10]||(o[10]=c=>i("use-sample"))},{default:C(()=>[...o[20]||(o[20]=[U(" 使用示例数据 ",-1)])]),_:1})):z("",!0)]),t.uploadedFiles.length===0?(r(),B(E,{key:0,drag:"",multiple:"",accept:p.value,"auto-upload":!1,"show-file-list":!1,"on-change":c=>i("file-change",c),"aria-label":"选择或拖拽源数据文件"},{tip:C(()=>[e("div",Rl,$(t.processType==="unstructured"?"支持 TXT、Markdown、PDF、Word、JSON、JSONL,单文件不超过 200MB":"支持 JSON、JSONL、CSV、Excel,单文件不超过 200MB"),1)]),default:C(()=>[o[22]||(o[22]=e("i",{class:"fa fa-cloud-upload upload-icon","aria-hidden":"true"},null,-1)),o[23]||(o[23]=e("div",{class:"el-upload__text"},[U("拖拽文件到此处,或"),e("em",null,"点击选择文件")],-1))]),_:1},8,["accept","on-change"])):(r(),b("section",Ll,[e("div",Dl,[e("span",null,"已添加 "+$(t.uploadedFiles.length)+" 个文件",1),e("div",zl,[v(E,{multiple:"",accept:p.value,"auto-upload":!1,"show-file-list":!1,"on-change":c=>i("file-change",c),"aria-label":"继续添加源数据文件"},{default:C(()=>[v(_,{size:"small",type:"primary"},{default:C(()=>[...o[24]||(o[24]=[U("继续上传",-1)])]),_:1})]),_:1},8,["accept","on-change"])])]),e("div",Nl,[(r(!0),b(G,null,Z(s.value,c=>(r(),b("div",{key:c.uid,class:"uploaded-file"},[o[26]||(o[26]=e("span",{class:"file-icon"},[e("i",{class:"fa fa-file-text-o","aria-hidden":"true"})],-1)),e("div",Al,[e("strong",{title:c.name},$(c.name),9,Bl),e("span",null,[U($(u(c.size))+" ",1),c.count?(r(),b(G,{key:0},[U(" · "+$(c.count.toLocaleString())+" 条",1)],64)):z("",!0)])]),o[27]||(o[27]=e("span",{class:"file-status"},[e("i",{class:"fa fa-check-circle","aria-hidden":"true"}),U(" 校验通过")],-1)),v(_,{link:"",type:"danger","aria-label":`删除文件 ${c.name}`,onClick:x=>i("remove-file",c.uid)},{default:C(()=>[...o[25]||(o[25]=[U(" 删除 ",-1)])]),_:1},8,["aria-label","onClick"])]))),128))]),t.uploadedFiles.length>oe?(r(),B(h,{key:0,"current-page":g.value,"onUpdate:currentPage":o[11]||(o[11]=c=>g.value=c),"page-size":oe,total:t.uploadedFiles.length,"pager-count":5,small:"",background:"",layout:"prev, pager, next",class:"uploaded-file-pagination","aria-label":"已上传文件分页"},null,8,["current-page","total"])):z("",!0)]))]))])}}}),Gl=te(jl,[["__scopeId","data-v-28d74091"]]),Jl=["问:如何看待当前的通货膨胀风险?","答:当前通胀水平总体可控,但仍需关注能源价格与供给扰动。","问:美联储下一次议息会议何时召开?","答:会议时间以美联储官方日历为准,市场会重点关注利率路径指引。","问:人民币汇率未来走势如何?","答:人民币汇率取决于中美利差、经济基本面与政策预期。","问:什么是复利?","答:复利是将上一期利息加入本金,再计算下一期利息。"].join(`
|
||
`);function Ql(t){const P=t.split(`
|
||
`);let k=0;return P.map((i,m)=>{const O=k,g=O+i.length;return k=g+(m<P.length-1?1:0),{number:m+1,content:i,start:O,end:g}})}function je(t){var P;return((P=t.match(/[\u3400-\u4dbf\u4e00-\u9fff]|[A-Za-z0-9_]+|[^\s]/gu))==null?void 0:P.length)??0}const Hl={class:"preview-step"},Kl={class:"preview-file-switcher"},Wl={class:"file-switcher-control"},Zl={class:"file-option"},Xl=["title"],Yl={key:0},es={class:"file-switcher-summary"},ts={class:"preview-workspace"},ns={class:"source-pane"},ls={class:"pane-header"},ss=["data-source-start"],as={class:"line-number"},os={class:"line-content"},is={class:"preview-pane"},us={class:"pane-header"},rs={class:"pane-header-actions"},ds={class:"preview-toolbar"},cs={class:"preview-list","aria-label":"预览条目列表"},ps=["onClick","onKeydown"],ms={class:"item-name"},vs={class:"item-source"},fs={class:"item-actions"},gs={key:0,class:"empty-result"},ys={key:1,class:"preview-editor"},ks={class:"editor-heading"},Ss={class:"editor-actions"},me=6,ws=ee({__name:"PreviewCompareStep",props:{sourceText:{},items:{},selectedId:{},processType:{},fileName:{},files:{},selectedFileId:{}},emits:["update:selectedId","update:selectedFileId","update:item-content","restore:item","add:item","remove:item"],setup(t,{emit:P}){const k=t,i=P,m=N(null),O=N(""),g=N(1),T=N(null),p=N(""),s=L(()=>Ql(k.sourceText)),w=L(()=>k.items.find(x=>x.id===k.selectedId)??k.items[0]),u=L(()=>k.items.find(x=>x.id===T.value)),f=L(()=>k.items.filter((x,y)=>!O.value.trim()||x.editedContent.toLowerCase().includes(O.value.trim().toLowerCase())||String(y+1).includes(O.value.trim()))),o=L(()=>{const x=(g.value-1)*me;return f.value.slice(x,x+me)});function D(x,y){const J=w.value;return!J||J.sourceStart==null||J.sourceEnd==null?!1:y>=J.sourceStart&&x<=J.sourceEnd}function M(x){i("update:selectedId",x)}function V(x){M(x.id),T.value=x.id,p.value=x.editedContent}function d(){T.value=null,p.value=""}function S(){u.value&&(i("update:item-content",u.value.id,p.value),d())}function n(){u.value&&(i("restore:item",u.value.id),d())}function _(x){M(x.id),i("remove:item",x.id)}function h(){d()}se(O,()=>{g.value=1,d()}),se(()=>k.selectedFileId,d),se(w,async x=>{var Q,W;if(!x)return;const y=f.value.findIndex(ne=>ne.id===x.id);if(y>=0&&(g.value=Math.floor(y/me)+1),x.sourceStart==null)return;await Te();const J=((Q=m.value)==null?void 0:Q.querySelector(`[data-source-start="${x.sourceStart}"]`))??((W=m.value)==null?void 0:W.querySelector(".source-line.is-highlighted"));J==null||J.scrollIntoView({block:"center",behavior:"smooth"})},{immediate:!0});function E(x){return k.items.findIndex(y=>y.id===x.id)+1}function c(x){return x.sourceStartLine==null||x.sourceEndLine==null?"手动新增,无源文件定位":x.sourceStartLine===x.sourceEndLine?`来源:第 ${x.sourceStartLine} 行`:`来源:第 ${x.sourceStartLine}–${x.sourceEndLine} 行`}return(x,y)=>{const J=xe,Q=we,W=ve,ne=de,X=We;return r(),b("section",Hl,[e("div",Kl,[e("div",Wl,[y[5]||(y[5]=e("span",null,"当前文件",-1)),v(Q,{"model-value":t.selectedFileId,filterable:"",placeholder:"选择文件","aria-label":"选择当前预览文件","onUpdate:modelValue":y[0]||(y[0]=q=>i("update:selectedFileId",q))},{default:C(()=>[(r(!0),b(G,null,Z(t.files,q=>(r(),B(J,{key:q.id,label:q.name,value:q.id},{default:C(()=>[e("div",Zl,[e("strong",{title:q.name},$(q.name),9,Xl),e("span",null,$(q.count.toLocaleString())+" "+$(t.processType==="unstructured"?"个切片":"条记录"),1),q.modifiedCount?(r(),b("em",Yl,$(q.modifiedCount)+" 处已修改",1)):z("",!0)])]),_:2},1032,["label","value"]))),128))]),_:1},8,["model-value"])]),e("span",es,$(t.files.length)+" 个文件 · 当前文件 "+$(t.items.length.toLocaleString())+" "+$(t.processType==="unstructured"?"个切片":"条记录"),1)]),e("div",ts,[e("div",ns,[e("div",ls,[e("div",null,[e("strong",null,"源文件 · "+$(t.fileName),1)])]),e("div",{ref_key:"sourceViewerRef",ref:m,class:"source-viewer",tabindex:"0","aria-label":"源文件内容"},[(r(!0),b(G,null,Z(s.value,q=>(r(),b("div",{key:q.number,class:K(["source-line",{"is-highlighted":D(q.start,q.end)}]),"data-source-start":q.start},[e("span",as,$(q.number),1),e("span",os,$(q.content||" "),1)],10,ss))),128))],512)]),e("div",is,[e("div",us,[e("strong",null,$(t.processType==="unstructured"?"切片内容":"记录内容"),1),e("div",rs,[e("span",null,"共 "+$(t.items.length.toLocaleString())+" 条",1),v(W,{link:"",type:"primary",onClick:y[1]||(y[1]=q=>i("add:item"))},{default:C(()=>[...y[6]||(y[6]=[e("i",{class:"fa fa-plus"},null,-1),U(" 手动新增 ",-1)])]),_:1})])]),u.value?(r(),b("div",ys,[e("div",ks,[e("div",null,[e("strong",null,$(t.processType==="unstructured"?"切片":"记录")+" #"+$(String(E(u.value)).padStart(3,"0"))+" 正文",1),e("small",null,$(c(u.value)),1)])]),v(ne,{modelValue:p.value,"onUpdate:modelValue":y[4]||(y[4]=q=>p.value=q),type:"textarea",rows:7,resize:"none"},null,8,["modelValue"]),e("div",Ss,[u.value.sourceStart!=null?(r(),B(W,{key:0,link:"",onClick:n},{default:C(()=>[...y[10]||(y[10]=[e("i",{class:"fa fa-undo"},null,-1),U(" 恢复原始内容 ",-1)])]),_:1})):z("",!0),e("div",null,[v(W,{onClick:d},{default:C(()=>[...y[11]||(y[11]=[U("取消",-1)])]),_:1}),v(W,{type:"primary",onClick:S},{default:C(()=>[...y[12]||(y[12]=[U("保存修改",-1)])]),_:1})])])])):(r(),b(G,{key:0},[e("div",ds,[v(ne,{modelValue:O.value,"onUpdate:modelValue":y[2]||(y[2]=q=>O.value=q),clearable:"",placeholder:"搜索编号或内容",size:"small"},{prefix:C(()=>[...y[7]||(y[7]=[e("i",{class:"fa fa-search"},null,-1)])]),_:1},8,["modelValue"])]),e("div",cs,[(r(!0),b(G,null,Z(o.value,q=>{var ie;return r(),b("div",{key:q.id,class:K(["preview-item",{"is-active":q.id===((ie=w.value)==null?void 0:ie.id)}]),role:"button",tabindex:"0",onClick:ue=>M(q.id),onKeydown:[ze(ue=>M(q.id),["enter"]),ze(Oe(ue=>M(q.id),["prevent"]),["space"])]},[e("span",ms,$(t.processType==="unstructured"?"切片":"记录")+" #"+$(String(E(q)).padStart(3,"0")),1),e("span",vs,$(c(q)),1),e("span",fs,[v(W,{link:"","aria-label":"编辑切片",title:"编辑",onClick:Oe(ue=>V(q),["stop"])},{default:C(()=>[...y[8]||(y[8]=[e("i",{class:"fa fa-pencil"},null,-1)])]),_:1},8,["onClick"]),v(W,{link:"",type:"danger","aria-label":"删除切片",title:"删除",onClick:Oe(ue=>_(q),["stop"])},{default:C(()=>[...y[9]||(y[9]=[e("i",{class:"fa fa-trash-o"},null,-1)])]),_:1},8,["onClick"])])],42,ps)}),128)),f.value.length?z("",!0):(r(),b("div",gs,"没有符合条件的内容"))]),f.value.length>me?(r(),B(X,{key:0,"current-page":g.value,"onUpdate:currentPage":y[3]||(y[3]=q=>g.value=q),"page-size":me,total:f.value.length,"pager-count":5,small:"",background:"",layout:"prev, pager, next",class:"preview-pagination",onCurrentChange:h},null,8,["current-page","total"])):z("",!0)],64))])])])}}}),xs=te(ws,[["__scopeId","data-v-41691560"]]),_s={class:"generation-step"},bs={class:"generation-layout"},hs={class:"summary-panel"},$s={class:"run-icon"},Os={key:0,class:"fa fa-check"},Cs={key:1,class:"fa fa-exclamation"},Ps={key:2,class:"fa fa-cog fa-spin"},Ts={key:3,class:"fa fa-play"},Is=ee({__name:"GenerationStep",props:{taskName:{},processType:{},fileName:{},previewCount:{},modifiedCount:{},generation:{}},emits:["stop","retry"],setup(t,{emit:P}){const k=P;return(i,m)=>{const O=Ht,g=ve;return r(),b("section",_s,[e("div",bs,[e("div",hs,[m[7]||(m[7]=e("div",{class:"panel-heading"},[e("strong",null,"任务摘要"),e("span",null,"已完成预览确认")],-1)),e("dl",null,[e("div",null,[m[2]||(m[2]=e("dt",null,"任务名称",-1)),e("dd",null,$(t.taskName),1)]),e("div",null,[m[3]||(m[3]=e("dt",null,"数据类型",-1)),e("dd",null,$(t.processType==="unstructured"?"非结构化数据":t.processType==="external"?"外来数据源拉取":"结构化数据"),1)]),e("div",null,[m[4]||(m[4]=e("dt",null,"源文件",-1)),e("dd",null,$(t.fileName),1)]),e("div",null,[m[5]||(m[5]=e("dt",null,"预览条目",-1)),e("dd",null,$(t.previewCount.toLocaleString())+" 条",1)]),e("div",null,[m[6]||(m[6]=e("dt",null,"已修改",-1)),e("dd",null,$(t.modifiedCount.toLocaleString())+" 条",1)])])]),e("div",{class:K(["run-panel",`is-${t.generation.status}`])},[e("div",$s,[t.generation.status==="success"?(r(),b("i",Os)):t.generation.status==="failed"?(r(),b("i",Cs)):t.generation.status==="running"?(r(),b("i",Ps)):(r(),b("i",Ts))]),e("h3",null,$(t.generation.status==="idle"?"准备开始处理":t.generation.status==="running"?"正在生成数据":t.generation.status==="success"?"数据生成完成":"生成已停止"),1),e("p",null,$(t.generation.message),1),t.generation.status!=="idle"?(r(),B(O,{key:0,percentage:t.generation.progress,"stroke-width":10,status:t.generation.status==="success"?"success":void 0},null,8,["percentage","status"])):z("",!0),m[10]||(m[10]=e("div",{class:"run-meta"},[e("span",null,"解析源数据"),e("span",null,"应用预览修改"),e("span",null,"生成标准结果")],-1)),t.generation.status==="running"?(r(),B(g,{key:1,plain:"",type:"warning",onClick:m[0]||(m[0]=T=>k("stop"))},{default:C(()=>[...m[8]||(m[8]=[U(" 停止生成 ",-1)])]),_:1})):z("",!0),t.generation.status==="failed"?(r(),B(g,{key:2,plain:"",type:"primary",onClick:m[1]||(m[1]=T=>k("retry"))},{default:C(()=>[...m[9]||(m[9]=[U(" 重新生成 ",-1)])]),_:1})):z("",!0)],2)])])}}}),Es=te(Is,[["__scopeId","data-v-9912b685"]]),Ms={class:"result-step"},Vs={class:"result-workspace"},Us={class:"result-list-pane"},Fs={class:"pane-header"},qs={class:"result-toolbar"},Rs={class:"result-list"},Ls=["onClick"],Ds={class:"result-index"},zs={class:"result-copy"},Ns={key:0,class:"result-editor-pane"},As={class:"pane-header"},Bs={key:0,class:"modified-label"},js={class:"field-editor"},Gs={class:"field-editor"},Js={class:"field-editor"},Qs={key:0,class:"validation-error"},Hs={key:1,class:"validation-success"},Ks={key:2,class:"quality-flags"},Ws={class:"editor-pagination"},Zs=ee({__name:"ResultEditorStep",props:{items:{},selectedId:{}},emits:["update:selectedId","update:field","restore:item"],setup(t,{emit:P}){const k=t,i=P,m=N(""),O=N(!1),g=L(()=>k.items.find(w=>w.id===k.selectedId)??k.items[0]),T=L(()=>k.items.findIndex(w=>{var u;return w.id===((u=g.value)==null?void 0:u.id)})),p=L(()=>k.items.filter((w,u)=>{const f=m.value.trim().toLowerCase();return(!f||w.instruction.toLowerCase().includes(f)||w.output.toLowerCase().includes(f)||String(u+1).includes(f))&&(!O.value||w.status==="invalid")}));function s(w){if(!k.items.length)return;const u=Math.min(Math.max(T.value+w,0),k.items.length-1);i("update:selectedId",k.items[u].id)}return(w,u)=>{var V;const f=de,o=Se,D=Jt,M=ve;return r(),b("section",Ms,[e("div",Vs,[e("aside",Us,[e("div",Fs,[u[8]||(u[8]=e("strong",null,"生成结果",-1)),e("span",null,"共 "+$(t.items.length)+" 条",1)]),e("div",qs,[v(f,{modelValue:m.value,"onUpdate:modelValue":u[0]||(u[0]=d=>m.value=d),clearable:"",size:"small",placeholder:"搜索结果"},{prefix:C(()=>[...u[9]||(u[9]=[e("i",{class:"fa fa-search"},null,-1)])]),_:1},8,["modelValue"]),v(o,{modelValue:O.value,"onUpdate:modelValue":u[1]||(u[1]=d=>O.value=d)},{default:C(()=>[...u[10]||(u[10]=[U("仅看错误",-1)])]),_:1},8,["modelValue"])]),e("div",Rs,[(r(!0),b(G,null,Z(p.value,d=>{var S;return r(),b("button",{key:d.id,type:"button",class:K(["result-item",{"is-active":d.id===((S=g.value)==null?void 0:S.id)}]),onClick:n=>i("update:selectedId",d.id)},[e("span",Ds,"#"+$(String(t.items.findIndex(n=>n.id===d.id)+1).padStart(3,"0")),1),e("span",zs,[e("strong",null,$(d.instruction||"未填写指令"),1),e("small",null,$(d.output||"未填写输出"),1)]),e("i",{class:K(["fa",d.status==="invalid"?"fa-exclamation-circle is-error":"fa-check-circle is-valid"])},null,2)],10,Ls)}),128))])]),g.value?(r(),b("div",Ns,[e("div",As,[e("div",null,[e("strong",null,"结果 #"+$(String(T.value+1).padStart(3,"0")),1),g.value.status==="modified"?(r(),b("span",Bs,"已修改")):z("",!0),g.value.split?(r(),B(D,{key:1,size:"small",effect:"plain"},{default:C(()=>[U($(g.value.split),1)]),_:1})):z("",!0),g.value.qualityScore!=null?(r(),B(D,{key:2,size:"small",type:g.value.qualityScore>=80?"success":g.value.qualityScore>=60?"warning":"danger"},{default:C(()=>[U("质量 "+$(g.value.qualityScore.toFixed(1)),1)]),_:1},8,["type"])):z("",!0)]),v(M,{link:"",onClick:u[2]||(u[2]=d=>i("restore:item",g.value.id))},{default:C(()=>[...u[11]||(u[11]=[e("i",{class:"fa fa-undo"},null,-1),U(" 恢复生成结果",-1)])]),_:1})]),e("div",js,[u[12]||(u[12]=e("label",null,[U("Instruction "),e("em",null,"必填")],-1)),v(f,{"model-value":g.value.instruction,type:"textarea",rows:3,"onUpdate:modelValue":u[3]||(u[3]=d=>i("update:field",g.value.id,"instruction",d))},null,8,["model-value"])]),e("div",Gs,[u[13]||(u[13]=e("label",null,[U("Input "),e("span",null,"选填")],-1)),v(f,{"model-value":g.value.input,type:"textarea",rows:2,"onUpdate:modelValue":u[4]||(u[4]=d=>i("update:field",g.value.id,"input",d))},null,8,["model-value"])]),e("div",Js,[u[14]||(u[14]=e("label",null,[U("Output "),e("em",null,"必填")],-1)),v(f,{"model-value":g.value.output,type:"textarea",rows:7,"onUpdate:modelValue":u[5]||(u[5]=d=>i("update:field",g.value.id,"output",d))},null,8,["model-value"])]),g.value.error?(r(),b("div",Qs,[u[15]||(u[15]=e("i",{class:"fa fa-exclamation-circle"},null,-1)),U(" "+$(g.value.error),1)])):(r(),b("div",Hs,[...u[16]||(u[16]=[e("i",{class:"fa fa-check-circle"},null,-1),U(" 字段校验通过 ",-1)])])),(V=g.value.qualityFlags)!=null&&V.length?(r(),b("div",Ks,[(r(!0),b(G,null,Z(g.value.qualityFlags,d=>(r(),B(D,{key:d,size:"small",type:"warning",effect:"plain"},{default:C(()=>[U($(d),1)]),_:2},1024))),128))])):z("",!0),e("div",Ws,[v(M,{disabled:T.value<=0,onClick:u[6]||(u[6]=d=>s(-1))},{default:C(()=>[...u[17]||(u[17]=[U("上一条",-1)])]),_:1},8,["disabled"]),e("span",null,$(T.value+1)+" / "+$(t.items.length),1),v(M,{disabled:T.value>=t.items.length-1,onClick:u[7]||(u[7]=d=>s(1))},{default:C(()=>[...u[18]||(u[18]=[U("下一条",-1)])]),_:1},8,["disabled"])])])):z("",!0)])])}}}),Xs=te(Zs,[["__scopeId","data-v-45e06c17"]]),Xe="你是一名专业的数据生成助手。请根据输入内容生成准确、完整、可直接用于模型训练的问答数据。仅输出符合目标格式的内容,答案应事实清晰、语言自然,不要添加分析过程、说明或无关内容。";function Ys(){return{preprocessOptions:["clean_invalid","detect_structure","deduplicate","normalize_format"],semanticEnrichment:!1,qaPairsPerRow:1,datasetSplit:{train:80,validation:10,test:10},generationModelId:"",generationPrompt:Xe,temperature:.7,maxTokens:1024,jsonMode:!1,qualityFilterEnabled:!1,filterLowQuality:!0,filterShortContent:!0,minOutputLength:20}}function ea(){return{preprocessOptions:["clean_invalid_content","detect_document_structure","merge_short_content","filter_low_quality","deduplicate_content","preserve_context"],chunkMethod:"semantic",chunkSize:800,chunkOverlap:100,minChunkSize:100,customDelimiter:"",preserveTables:!0,preserveCodeBlocks:!0,preserveLists:!0,semanticEnrichment:!1,qaPairsPerChunk:1,datasetSplit:{train:80,validation:10,test:10},generationModelId:"",generationPrompt:Xe,temperature:.7,maxTokens:1024,jsonMode:!1,qualityFilterEnabled:!1,filterLowQuality:!0,filterShortContent:!0,minOutputLength:20}}const ke="yg-data-process-create-draft",ta=7;function Ge(t){return{type:typeof t.type=="string"?t.type:"postgresql",url:typeof t.url=="string"?t.url:"",authMode:t.authMode==="basic"?"basic":"none",username:typeof t.username=="string"?t.username:"",limit:Number.isFinite(t.limit)?Number(t.limit):1e3,query:typeof t.query=="string"?t.query:"",fileName:typeof t.fileName=="string"?t.fileName:"external-data.jsonl"}}function na(t){return!!(t&&typeof t=="object")}function la(t){function P(){return{schemaVersion:ta,taskId:t.taskId.value||void 0,currentStepId:t.currentStepId.value,task:{...t.task},processType:t.processType.value,structuredOptions:{...t.structuredOptions.value,preprocessOptions:[...t.structuredOptions.value.preprocessOptions],datasetSplit:{...t.structuredOptions.value.datasetSplit}},unstructuredOptions:{...t.unstructuredOptions.value,preprocessOptions:[...t.unstructuredOptions.value.preprocessOptions],datasetSplit:{...t.unstructuredOptions.value.datasetSplit}},externalSource:Ge(t.externalSource)}}function k(O){try{localStorage.setItem(ke,JSON.stringify(P()))}catch{O&&F.warning("草稿保存失败,请检查浏览器存储空间")}}function i(){t.restoringDraft.value||k(!0)}function m(){var O,g;try{const T=localStorage.getItem(ke);if(!T)return;const p=JSON.parse(T);if(!na(p))return;t.restoringDraft.value=!0,t.goToStep("create"),t.taskId.value=typeof p.taskId=="string"?p.taskId:null,t.task.name=((O=p.task)==null?void 0:O.name)||"",t.task.description=((g=p.task)==null?void 0:g.description)||"",t.processType.value=p.processType==="unstructured"||p.processType==="external"?p.processType:"structured",p.structuredOptions&&(t.structuredOptions.value={...t.structuredOptions.value,...p.structuredOptions,preprocessOptions:Array.isArray(p.structuredOptions.preprocessOptions)?p.structuredOptions.preprocessOptions:t.structuredOptions.value.preprocessOptions,datasetSplit:{...t.structuredOptions.value.datasetSplit,...p.structuredOptions.datasetSplit}}),p.unstructuredOptions&&(t.unstructuredOptions.value={...t.unstructuredOptions.value,...p.unstructuredOptions,preprocessOptions:Array.isArray(p.unstructuredOptions.preprocessOptions)?p.unstructuredOptions.preprocessOptions:t.unstructuredOptions.value.preprocessOptions,datasetSplit:{...t.unstructuredOptions.value.datasetSplit,...p.unstructuredOptions.datasetSplit}}),Object.assign(t.externalSource,Ge(p.externalSource||{}),{password:""}),t.dirty.value=!1,Te(()=>{t.restoringDraft.value=!1,k(!1)}),F.info("已恢复上次的任务配置")}catch{localStorage.removeItem(ke)}}return{draftSnapshot:P,persistDraft:i,restoreDraft:m}}const Je=500,ye=1500;function Ce(t){var P,k;return{id:String(t.id),instruction:t.instruction,input:t.input||"",output:t.output,originalInstruction:t.original_instruction??t.instruction,originalInput:t.original_input??t.input??"",originalOutput:t.original_output??t.output,status:t.status,error:t.error||void 0,split:t.split||void 0,qualityScore:(P=t.quality_score)==null?void 0:P.overall,qualityFlags:((k=t.quality_score)==null?void 0:k.flags)||[],updatedAt:t.updated_at}}function sa(t){const P=N([]),k=N(null),i=Pe({status:"idle",progress:0,message:"确认摘要后即可开始生成,过程中可查看实时进度。"});let m=null,O=0,g=0;function T(){O+=1,m&&clearTimeout(m),m=null}function p(){T(),i.status="idle",i.progress=0,i.message="确认摘要后即可开始生成,过程中可查看实时进度。",P.value=[],k.value=null}function s(n){i.progress=Math.max(0,Math.min(100,Number(n.progress)||0)),i.message=n.message||(n.status==="running"?"后端正在生成标准化结果并进行质量评分。":n.status==="completed"?"数据处理已完成。":n.failure_reason||"任务已停止。")}async function w(n){var c;const _=await Ne(n,{page:1,page_size:Je}),h=[..._.items],E=Math.ceil(_.total/_.page_size);for(let x=2;x<=E;x+=1){const y=await Ne(n,{page:x,page_size:Je});h.push(...y.items)}P.value=h.map(Ce),k.value=((c=P.value[0])==null?void 0:c.id)??null}async function u(n){if(g=0,s(n),n.status==="completed"){const _=t.taskId.value;if(!_)return;await w(_),i.status="success",i.progress=100,i.message=`已完成 ${P.value.length.toLocaleString()} 条数据处理,可进入结果页检查。`,t.dirty.value=!0,F.success("数据处理完成");return}(n.status==="failed"||n.status==="stopped")&&(i.status="failed",i.message=n.failure_reason||n.message||(n.status==="stopped"?"任务已停止,可以重新生成。":"数据处理失败,请检查配置后重试。"))}async function f(n){const _=t.taskId.value;if(!(!_||n!==O||i.status!=="running"))try{const h=await Yt(_);if(n!==O)return;if(g=0,h.status==="running"||h.status==="pending"){s(h),m=setTimeout(()=>void f(n),ye);return}await u(h)}catch(h){if(n!==O)return;if(g+=1,g<=3){i.message=`进度查询暂时失败,正在重试(${g}/3)…`,m=setTimeout(()=>void f(n),ye);return}i.status="failed",i.message=h instanceof Error?h.message:"查询任务进度失败,请重试。"}}async function o(){var h;const n=t.taskId.value;if(!n){F.error("任务尚未创建,请返回上一步重试");return}T();const _=O;i.status="running",g=0,i.progress=0,i.message="正在同步预览修改并启动后端处理,请稍候。";try{await((h=t.beforeGenerate)==null?void 0:h.call(t));const E=await Wt(n);if(_!==O)return;if(E.status==="completed"||E.status==="failed"||E.status==="stopped"){await u(E);return}s(E),m=setTimeout(()=>void f(_),ye)}catch(E){if(_!==O)return;i.status="failed",i.message=E instanceof Error?E.message:"启动数据处理失败,请重试。"}}async function D(){const n=t.taskId.value;if(n){T();try{const _=await Kt(n);s(_)}catch{i.status="running",i.message="停止请求失败,继续查询后端任务状态。";const _=O;m=setTimeout(()=>void f(_),ye);return}i.status="failed",i.message="任务已停止,预览修改仍然保留,可以重新生成。"}}function M(n,_,h){const E=P.value.find(y=>y.id===n);if(!E)return;E[_]=h;const c=E.instruction.trim()&&E.output.trim();E.error=c?void 0:"Instruction 和 Output 不能为空";const x=E.instruction!==E.originalInstruction||E.input!==E.originalInput||E.output!==E.originalOutput;E.status=E.error?"invalid":x?"modified":"valid",t.dirty.value=!0}async function V(n){const _=t.taskId.value,h=P.value.find(x=>x.id===n);if(!_||!h)return;const E=await Zt(_,n),c=P.value.indexOf(h);P.value[c]=Ce(E),t.dirty.value=!0}async function d(){const n=t.taskId.value;if(!n)throw new Error("任务尚未创建");const _=P.value.filter(h=>h.instruction!==h.originalInstruction||h.input!==h.originalInput||h.output!==h.originalOutput);for(const h of _){const E=await Xt(n,h.id,{instruction:h.instruction,input:h.input,output:h.output,expected_updated_at:h.updatedAt}),c=P.value.findIndex(x=>x.id===h.id);c>=0&&(P.value[c]=Ce(E))}}function S(){let n=null;for(const _ of P.value)(!_.instruction.trim()||!_.output.trim()||_.status==="invalid")&&(_.error||(_.error="结果未通过后端质量校验,请修改后重新保存"),_.status="invalid",n??(n=_.id));return n&&(k.value=n),n==null}return{generation:i,results:P,selectedResultId:k,persistResultChanges:d,resetDownstream:p,restoreResult:V,startGeneration:o,stopGeneration:D,stopGenerationTimer:T,updateResultField:M,validateResults:S}}const aa={class:"create-wizard-layout"},oa={class:"wizard-main"},ia={class:"wizard-main-inner"},ua={class:"wizard-steps-container"},ra={class:"custom-wizard-steps"},da=["aria-current"],ca={class:"step-node"},pa={class:"step-icon"},ma={key:0,class:"fa fa-check"},va={key:1},fa={class:"step-text"},ga={class:"step-title"},ya={class:"wizard-content"},ka={class:"wizard-footer"},Sa={class:"footer-left"},wa={class:"footer-right"},xa="backend-pipeline-v1",_a=ee({__name:"DataProcessCreateView",setup(t){const P=At(),k=pn(),{list:i}=Rt(k),m=L(()=>i.value.filter(l=>l.type==="LLM"&&(l.model_source==="api"||l.model_source==="online"||!!l.api_url))),O=N(),g=N(),T=N(),p=[{id:"create",title:"创建任务",desc:"填写任务信息与处理配置"},{id:"model",title:"大模型选择",desc:"选择生成模型并设置输出要求"},{id:"upload",title:"上传文件",desc:"上传或接入待处理的源数据"},{id:"preview",title:"数据预览",desc:"核对源文件与预览内容"},{id:"generate",title:"开始生成",desc:"确认摘要并启动处理"},{id:"results",title:"结果编辑与保存",desc:"检查、修改并保存结果"}],s=N(0),w=L(()=>{var l;return((l=p[s.value])==null?void 0:l.id)??"create"}),u=Pe({name:"",description:""}),f=N(null),o=N("structured"),D=N(Ys()),M=N(ea()),V=L(()=>o.value==="unstructured"?M.value:D.value),d=N([]),S=Pe({type:"postgresql",url:"",authMode:"none",username:"",password:"",limit:1e3,query:"",fileName:"external-data.jsonl"}),n=N(!1),_=N(!1),h=L(()=>d.value.map(l=>l.name).join(", ")),E=N(""),c=N([]),x=N(null),y=N(null),J=N({}),Q=N(!1),W=N(!1);let ne=!1;const{generation:X,results:q,selectedResultId:ie,persistResultChanges:ue,resetDownstream:le,restoreResult:Ye,startGeneration:Ee,stopGeneration:et,stopGenerationTimer:tt,updateResultField:nt,validateResults:Me}=sa({taskId:f,dirty:Q,beforeGenerate:Tt}),lt=L(()=>c.value.filter(l=>l.status!=="original").length),Ve=L(()=>{const l=new Map;for(const a of c.value){const I=l.get(a.sourceFileId)||[];I.push(a),l.set(a.sourceFileId,I)}return l}),Ue=L(()=>d.value.find(l=>String(l.uid)===x.value)),ce=L(()=>Ve.value.get(x.value||"")||[]),st=L(()=>{var l;return((l=Ue.value)==null?void 0:l.content)??""}),at=L(()=>d.value.map(l=>{const a=Ve.value.get(String(l.uid))||[];return{id:String(l.uid),name:l.name,count:a.length,modifiedCount:a.filter(I=>I.status!=="original").length}})),ot=L(()=>w.value==="create"?"继续:选择大模型":w.value==="model"?"继续:上传文件":w.value==="upload"?"继续:数据预览":w.value==="preview"?"确认预览并继续":w.value==="results"?"保存任务":X.status==="running"?"正在生成":X.status==="success"?"查看生成结果":X.status==="failed"?"重新生成":"开始生成"),it=L(()=>w.value==="results"?"fa-check":w.value==="generate"&&X.status!=="success"?"fa-play":"fa-arrow-right"),ut=L(()=>s.value>0?p[s.value-1].title:"");function re(l){const a=p.findIndex(I=>I.id===l);a>=0&&(s.value=a)}function rt(l){if(o.value==="unstructured"){M.value={...M.value,...l};return}D.value={...D.value,...l}}function dt(){const l=o.value==="unstructured"?M.value:D.value,a={preprocess_options:[...l.preprocessOptions],semantic_enrichment:l.semanticEnrichment,dataset_split:{...l.datasetSplit},generation_model_id:l.generationModelId,generation_prompt:l.generationPrompt,temperature:l.temperature,max_tokens:l.maxTokens,json_mode:l.jsonMode,quality_filter_enabled:l.qualityFilterEnabled,filter_low_quality:l.filterLowQuality,filter_short_content:l.filterShortContent,min_output_length:l.minOutputLength};return o.value==="unstructured"?{...a,chunk_method:M.value.chunkMethod,chunk_size:M.value.chunkSize,chunk_overlap:M.value.chunkOverlap,min_chunk_size:M.value.minChunkSize,custom_delimiter:M.value.customDelimiter,preserve_tables:M.value.preserveTables,preserve_code_blocks:M.value.preserveCodeBlocks,preserve_lists:M.value.preserveLists,qa_pairs_per_chunk:M.value.qaPairsPerChunk}:{...a,qa_pairs_per_row:D.value.qaPairsPerRow}}function Fe(){return{name:u.name.trim(),description:u.description.trim(),process_type:o.value,config:dt()}}function qe(){var l;return{type:"postgresql",url:S.url.trim(),auth_mode:S.authMode,username:S.username||void 0,password:S.password||void 0,limit:S.limit,query:((l=S.query)==null?void 0:l.trim())||void 0,file_name:S.fileName||"external-data.jsonl"}}function _e(l){return{id:String(l.id),sourceFileId:String(l.source_file_id),originalContent:l.original_content,editedContent:l.edited_content,sourceStart:l.source_start,sourceEnd:l.source_end,sourceStartLine:l.source_start_line,sourceEndLine:l.source_end_line,tokenCount:l.token_count,status:l.status,updatedAt:l.updated_at}}function ge(l,a=""){return{uid:String(l.id),sourceFileId:String(l.id),name:l.name,size:l.size_bytes,count:l.record_count,content:a,fileFormat:l.file_format,checksumSha256:l.checksum_sha256,status:"ready"}}const{persistDraft:Re,restoreDraft:ct}=la({taskId:f,currentStepId:w,task:u,processType:o,structuredOptions:D,unstructuredOptions:M,externalSource:S,restoringDraft:W,dirty:Q,goToStep:re});function pt(){if(o.value==="structured")return{preprocessOptions:D.value.preprocessOptions};if(o.value==="unstructured"){const{preprocessOptions:l,chunkMethod:a,chunkSize:I,chunkOverlap:A,minChunkSize:R,customDelimiter:j,preserveTables:H,preserveCodeBlocks:Y,preserveLists:pe}=M.value;return{preprocessOptions:l,chunkMethod:a,chunkSize:I,chunkOverlap:A,minChunkSize:R,customDelimiter:a==="custom"?j:"",preserveTables:H,preserveCodeBlocks:Y,preserveLists:pe}}return null}function mt(){if(o.value==="structured"){const{semanticEnrichment:l,qaPairsPerRow:a,datasetSplit:I,generationModelId:A,generationPrompt:R,temperature:j,maxTokens:H,jsonMode:Y,qualityFilterEnabled:pe,filterLowQuality:be,filterShortContent:he,minOutputLength:$e}=D.value;return{semanticEnrichment:l,qaPairsPerRow:a,datasetSplit:I,generationModelId:A,generationPrompt:R,temperature:j,maxTokens:H,jsonMode:Y,qualityFilterEnabled:pe,filterLowQuality:be,filterShortContent:he,minOutputLength:$e}}if(o.value==="unstructured"){const{semanticEnrichment:l,qaPairsPerChunk:a,datasetSplit:I,generationModelId:A,generationPrompt:R,temperature:j,maxTokens:H,jsonMode:Y,qualityFilterEnabled:pe,filterLowQuality:be,filterShortContent:he,minOutputLength:$e}=M.value;return{semanticEnrichment:l,qaPairsPerChunk:a,datasetSplit:I,generationModelId:A,generationPrompt:R,temperature:j,maxTokens:H,jsonMode:Y,qualityFilterEnabled:pe,filterLowQuality:be,filterShortContent:he,minOutputLength:$e}}return null}const vt=L(()=>JSON.stringify(mt()));function ft(){const l=d.value.map(a=>`${a.uid}:${a.name}:${a.size}:${a.checksumSha256||a.count}`).join("|");return`${xa}:${o.value}:${JSON.stringify(pt())}:${l}`}se([()=>u.name,()=>u.description,o,D,M,S],()=>{W.value||(Q.value=!0)},{deep:!0}),se(o,(l,a)=>{W.value||l===a||d.value.length===0||(bt(),F.info("处理类型已变更,请重新上传或拉取匹配的源数据"))}),se(vt,(l,a)=>{W.value||l===a||le()}),se([f,u,o,D,M,S],Re,{deep:!0});function gt(){var l;(l=document.querySelector(".layout-content"))==null||l.scrollTo({top:0,behavior:"smooth"})}se(s,()=>Te(gt));async function Le(l){var j;const a=l.raw;if(!a)return;if(!f.value){F.error("任务尚未创建,请返回模型选择步骤后重试");return}if(a.size>200*1024*1024){F.warning("单文件不能超过 200MB");return}const I=((j=a.name.split(".").pop())==null?void 0:j.toLowerCase())??"";if(!new Set(["txt","md","json","jsonl","csv"]).has(I)){F.error("当前仅支持 TXT、Markdown、JSON、JSONL 和 CSV;不会用示例内容替代无法解析的文件");return}if(d.value.some(H=>H.name===a.name&&H.size===a.size)){F.warning("同名且同大小的文件已经上传");return}let R="";try{R=new TextDecoder("utf-8",{fatal:!0}).decode(await a.arrayBuffer())}catch{F.error("文件不是有效的 UTF-8 文本,请转换编码后重试");return}if(!R.trim()){F.warning("不能上传空文件");return}try{const Y=(await an(f.value,[a])).files[0];if(!Y)throw new Error("后端未返回源文件记录");d.value.push(ge(Y,R)),E.value="",le(),Q.value=!0,F.success(`文件 ${Y.name} 上传成功`)}catch{}}async function yt(){if(!f.value){F.error("任务尚未创建,请返回模型选择步骤后重试");return}const l=new File([Jl],"finance_qa.jsonl",{type:"application/x-ndjson"});await Le({raw:l,name:l.name})}async function kt(){if(f.value)try{const a=(await en(f.value)).source_files||[],I=await Promise.all(a.map(async A=>{try{const R=await Ae(f.value,A.id,{start_line:1,line_count:5e3});return ge(A,R.content)}catch{return ge(A)}}));d.value=I,I.length&&F.success(`已同步 ${I.length} 个已登记源文件`)}catch{F.warning("草稿任务暂时无法从后端同步,请检查服务后重试")}}function St(l){Object.assign(S,l),_.value=!1}async function wt(){if(!f.value){F.error("任务尚未创建,请返回模型选择步骤后重试");return}if(!S.url.trim()){F.warning("请先填写数据源地址");return}n.value=!0;try{const l=await on(f.value,qe());_.value=l.connected,l.connected?F.success(l.message||"数据源连接测试成功"):F.warning(l.message||"数据源连接失败")}catch{_.value=!1}finally{n.value=!1}}async function xt(){var l;if(!f.value){F.error("任务尚未创建,请返回模型选择步骤后重试");return}if(!S.url.trim()){F.warning("请先填写数据源地址");return}if(!((l=S.query)!=null&&l.trim())){F.warning("请先填写只读 SELECT 查询语句");return}n.value=!0;try{const a=await un(f.value,qe()),I=[];for(const A of a.files){const R=await Ae(f.value,A.id,{start_line:1,line_count:5e3});I.push(ge(A,R.content))}d.value.push(...I),_.value=!0,E.value="",le(),Q.value=!0,F.success(`已成功登记 ${I.length} 个外部源文件`)}catch{_.value=!1}finally{n.value=!1}}async function _t(l){const a=d.value.findIndex(I=>I.uid===l);if(!(a<0||!f.value)){try{await rn(f.value,l)}catch{return}d.value.splice(a,1),E.value="",c.value=[],y.value=null,le(),Q.value=!0}}function bt(){d.value=[],E.value="",c.value=[],x.value=null,y.value=null,J.value={},_.value=!1,le()}async function ht(){var a;await((a=O.value)==null?void 0:a.validate())&&re("model")}async function $t(){var a;if(await((a=g.value)==null?void 0:a.validate()))try{const I=f.value?await nn(f.value,Fe()):await ln(Fe());f.value=String(I.id),Q.value=!0,Re(),re("upload")}catch{}}async function Ot(){var a,I;if(!f.value){F.error("任务尚未创建,请返回模型选择步骤后重试");return}if(d.value.length===0){F.warning(o.value==="external"?"请先拉取至少一个数据源":"请上传至少一个源数据文件");return}const l=ft();if(l!==E.value){try{await sn(f.value,{source_file_ids:d.value.map(H=>H.sourceFileId||H.uid)});const A=await Be(f.value,{page:1,page_size:500}),R=[...A.items],j=Math.ceil(A.total/A.page_size);for(let H=2;H<=j;H+=1){const Y=await Be(f.value,{page:H,page_size:500});R.push(...Y.items)}c.value=R.map(_e)}catch{return}if(!c.value.length){F.warning("源文件没有生成可用的预览条目,请检查文件内容和预处理配置");return}x.value=String(((a=d.value[0])==null?void 0:a.uid)??"")||null,y.value=((I=ce.value[0])==null?void 0:I.id)??null,J.value=y.value&&x.value?{[x.value]:y.value}:{},E.value=l,le()}re("preview")}function Ct(l){var a;x.value&&y.value&&(J.value[x.value]=y.value),x.value=l,y.value=J.value[l]||((a=ce.value[0])==null?void 0:a.id)||null}function De(l){y.value=l,x.value&&(J.value[x.value]=l)}function Pt(l,a){const I=c.value.find(A=>A.id===l);I&&(I.editedContent=a,I.tokenCount=je(a),I.status=a===I.originalContent?"original":I.sourceStart==null?"manual":"modified",le(),Q.value=!0)}async function Tt(){if(!f.value)throw new Error("任务尚未创建");const l=c.value.filter(a=>a.status==="modified"||a.status==="manual");for(const a of l){const I=await tn(f.value,a.id,{edited_content:a.editedContent,expected_updated_at:a.updatedAt}),A=c.value.findIndex(R=>R.id===a.id);A>=0&&(c.value[A]=_e(I))}}function It(l){const a=c.value.find(I=>I.id===l);!a||a.sourceStart==null||(a.editedContent=a.originalContent,a.tokenCount=je(a.originalContent),a.status="original",le(),Q.value=!0)}async function Et(){if(!(!x.value||!f.value))try{const l=await dn(f.value,{source_file_id:x.value,edited_content:""}),a=_e(l);c.value.push(a),De(a.id),le(),Q.value=!0}catch{}}async function Mt(l){var A,R;if(!await((A=T.value)==null?void 0:A.open({title:"删除预览内容?",message:"删除只影响本次处理,不会修改源文件。删除后可重新从源文件生成预览。",confirmText:"删除",cancelText:"取消",tone:"danger"})))return;const I=c.value.findIndex(j=>j.id===l);if(!(I<0)&&f.value){try{await cn(f.value,l)}catch{return}c.value.splice(I,1),y.value=((R=ce.value[Math.min(I,ce.value.length-1)])==null?void 0:R.id)??null,x.value&&y.value&&(J.value[x.value]=y.value),le(),Q.value=!0}}async function Vt(){if(w.value==="create"){await ht();return}if(w.value==="model"){await $t();return}if(w.value==="upload"){await Ot();return}if(w.value==="preview"){if(!c.value.length){F.warning("当前没有可生成的预览内容");return}re("generate");return}if(w.value==="generate"){X.status==="success"?re("results"):X.status!=="running"&&await Ee();return}await Ft()}function Ut(){if(X.status==="running"){F.warning("请先停止当前生成任务");return}s.value>0&&(s.value-=1)}async function Ft(){if(!Me()){F.warning("请先修正校验失败的结果");return}try{await ue()}catch{return}if(!Me()){F.warning("仍有结果未通过后端质量校验,请继续修正");return}Q.value=!1,localStorage.removeItem(ke),ne=!0,F.success("数据处理任务已保存"),await P.push("/data-process")}async function qt(){var a;if(!Q.value){ne=!0,P.back();return}await((a=T.value)==null?void 0:a.open({title:"确认离开当前页面?",message:"当前存在未保存修改,离开后这些修改将不会保留。",confirmText:"放弃修改",cancelText:"继续编辑",tone:"danger"}))&&(ne=!0,P.back())}return Lt(async()=>{var a;if(ne||!Q.value)return!0;const l=await((a=T.value)==null?void 0:a.open({title:"确认离开当前页面?",message:"当前存在未保存修改,离开后这些修改将不会保留。",confirmText:"放弃修改",cancelText:"继续编辑",tone:"danger"}));return l&&(ne=!0),!!l}),Dt(()=>{tt()}),zt(async()=>{ct(),await Promise.all([k.load(),kt()])}),(l,a)=>{var A;const I=ve;return r(),b(G,null,[e("div",aa,[e("main",oa,[e("div",ia,[e("div",ua,[e("div",ra,[(r(),b(G,null,Z(p,(R,j)=>(r(),b(G,{key:R.id},[j!==0?(r(),b("div",{key:0,class:K(["step-connector",{"is-active":s.value>=j}])},null,2)):z("",!0),e("div",{class:K(["step-item",{"is-active":s.value===j,"is-completed":s.value>j}]),"aria-current":s.value===j?"step":void 0},[e("div",ca,[e("div",pa,[s.value>j?(r(),b("i",ma)):(r(),b("span",va,$(j+1),1))]),e("div",fa,[e("div",ga,$(R.title),1)])])],10,da)],64))),64))])]),e("div",ya,[w.value==="create"?(r(),B(Sl,{key:0,ref_key:"taskSetupRef",ref:O,name:u.name,"onUpdate:name":a[0]||(a[0]=R=>u.name=R),description:u.description,"onUpdate:description":a[1]||(a[1]=R=>u.description=R),"process-type":o.value,"onUpdate:processType":a[2]||(a[2]=R=>o.value=R),"structured-options":D.value,"onUpdate:structuredOptions":a[3]||(a[3]=R=>D.value=R),"unstructured-options":M.value,"onUpdate:unstructuredOptions":a[4]||(a[4]=R=>M.value=R)},null,8,["name","description","process-type","structured-options","unstructured-options"])):w.value==="model"?(r(),B(hl,{key:1,ref_key:"modelSelectionRef",ref:g,options:V.value,models:m.value,"onUpdate:options":rt},null,8,["options","models"])):w.value==="upload"?(r(),B(Gl,{key:2,"process-type":o.value,"uploaded-files":d.value,"external-source":S,"external-pulling":n.value,"external-connected":_.value,"onUpdate:externalSource":St,onFileChange:Le,onRemoveFile:_t,onUseSample:yt,onTestConnection:wt,onPullData:xt},null,8,["process-type","uploaded-files","external-source","external-pulling","external-connected"])):w.value==="preview"?(r(),B(xs,{key:3,"selected-id":y.value,"selected-file-id":x.value,"source-text":st.value,items:ce.value,"process-type":o.value,"file-name":((A=Ue.value)==null?void 0:A.name)??"",files:at.value,"onUpdate:selectedId":De,"onUpdate:selectedFileId":Ct,"onUpdate:itemContent":Pt,"onRestore:item":It,"onAdd:item":Et,"onRemove:item":Mt},null,8,["selected-id","selected-file-id","source-text","items","process-type","file-name","files"])):w.value==="generate"?(r(),B(Es,{key:4,"task-name":u.name,"process-type":o.value,"file-name":h.value,"preview-count":c.value.length,"modified-count":lt.value,generation:ae(X),onStop:ae(et),onRetry:ae(Ee)},null,8,["task-name","process-type","file-name","preview-count","modified-count","generation","onStop","onRetry"])):w.value==="results"?(r(),B(Xs,{key:5,"selected-id":ae(ie),"onUpdate:selectedId":a[5]||(a[5]=R=>Nt(ie)?ie.value=R:null),items:ae(q),"onUpdate:field":ae(nt),"onRestore:item":ae(Ye)},null,8,["selected-id","items","onUpdate:field","onRestore:item"])):z("",!0)])])]),e("footer",ka,[e("div",Sa,[s.value>0?(r(),B(I,{key:0,onClick:Ut},{default:C(()=>[a[6]||(a[6]=e("i",{class:"fa fa-arrow-left",style:{"margin-right":"6px"}},null,-1)),U(" 返回:"+$(ut.value),1)]),_:1})):(r(),B(I,{key:1,onClick:qt},{default:C(()=>[...a[7]||(a[7]=[U("取消",-1)])]),_:1}))]),a[8]||(a[8]=e("div",{class:"footer-center"},null,-1)),e("div",wa,[v(I,{class:"wizard-primary-action",type:"primary",loading:ae(X).status==="running",disabled:w.value==="generate"&&ae(X).status==="running",onClick:Vt},{default:C(()=>[U($(ot.value)+" ",1),e("i",{class:K(["fa",it.value]),style:{"margin-left":"6px"}},null,2)]),_:1},8,["loading","disabled"])])])]),v(Bt,{ref_key:"confirmDialogRef",ref:T},null,512)],64)}}}),io=te(_a,[["__scopeId","data-v-21c0bbd7"]]);export{io as default};
|