fix:前端修改洋洋在信我最后一次
This commit is contained in:
@@ -22,7 +22,16 @@ import {
|
||||
Select,
|
||||
} from "@/components/admin/ui";
|
||||
import { adminApi, errMessage } from "@/lib/admin-api";
|
||||
import { buildKnowledgeForm, knowledgeApi, type KnowledgeDocument, type UploadPreview } from "@/lib/knowledge-api";
|
||||
import {
|
||||
buildKnowledgeForm,
|
||||
collectionLabel,
|
||||
DEFAULT_KNOWLEDGE_COLLECTION,
|
||||
KNOWLEDGE_COLLECTIONS,
|
||||
knowledgeApi,
|
||||
knowledgeErrorHint,
|
||||
type KnowledgeDocument,
|
||||
type UploadPreview,
|
||||
} from "@/lib/knowledge-api";
|
||||
import { isAdmin } from "@/lib/roles";
|
||||
|
||||
/** 切分策略,与后端 KnowledgeUploadService 支持的策略保持一致。 */
|
||||
@@ -38,6 +47,7 @@ export default function KnowledgePage() {
|
||||
|
||||
const [file, setFile] = useState<File | null>(null);
|
||||
const [title, setTitle] = useState("");
|
||||
const [collection, setCollection] = useState<string>(DEFAULT_KNOWLEDGE_COLLECTION);
|
||||
const [strategy, setStrategy] = useState("default");
|
||||
const [chunkSize, setChunkSize] = useState("");
|
||||
const [chunkOverlap, setChunkOverlap] = useState("");
|
||||
@@ -96,6 +106,7 @@ export default function KnowledgePage() {
|
||||
try {
|
||||
const result = await knowledgeApi.preview(
|
||||
buildKnowledgeForm(file, {
|
||||
collection_name: collection,
|
||||
strategy,
|
||||
chunk_size: chunkSize ? Number(chunkSize) : null,
|
||||
chunk_overlap: chunkOverlap ? Number(chunkOverlap) : null,
|
||||
@@ -104,7 +115,7 @@ export default function KnowledgePage() {
|
||||
setPreview(result);
|
||||
if (!title) setTitle(file.name);
|
||||
} catch (err) {
|
||||
setError(errMessage(err, "预览失败,请检查文件格式"));
|
||||
setError(knowledgeErrorHint(errMessage(err, "预览失败,请检查文件格式")));
|
||||
} finally {
|
||||
setUploading(false);
|
||||
}
|
||||
@@ -112,6 +123,11 @@ export default function KnowledgePage() {
|
||||
|
||||
const runConfirm = async () => {
|
||||
if (!file || uploading) return;
|
||||
// 集合是后端白名单校验的必填项,缺了会直接 400「知识库集合不在允许范围内」
|
||||
if (!collection) {
|
||||
setError("请先选择知识库集合");
|
||||
return;
|
||||
}
|
||||
setUploading(true);
|
||||
setError(null);
|
||||
setNotice(null);
|
||||
@@ -120,16 +136,17 @@ export default function KnowledgePage() {
|
||||
buildKnowledgeForm(file, {
|
||||
title: title || file.name,
|
||||
doc_id: preview?.doc_id ? String(preview.doc_id) : undefined,
|
||||
collection_name: collection,
|
||||
strategy,
|
||||
chunk_size: chunkSize ? Number(chunkSize) : null,
|
||||
chunk_overlap: chunkOverlap ? Number(chunkOverlap) : null,
|
||||
})
|
||||
);
|
||||
setNotice(`《${title || file.name}》已入库`);
|
||||
setNotice(`《${title || file.name}》已入库到「${collectionLabel(collection)}」`);
|
||||
resetUpload();
|
||||
await load();
|
||||
} catch (err) {
|
||||
setError(errMessage(err, "入库失败,请稍后重试"));
|
||||
setError(knowledgeErrorHint(errMessage(err, "入库失败,请稍后重试")));
|
||||
} finally {
|
||||
setUploading(false);
|
||||
}
|
||||
@@ -211,7 +228,7 @@ export default function KnowledgePage() {
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div className="grid gap-3 sm:grid-cols-3">
|
||||
<div className="grid gap-3 sm:grid-cols-2 xl:grid-cols-4">
|
||||
<label className="space-y-1.5">
|
||||
<span className="text-xs text-slate-500">标题</span>
|
||||
<TextInput
|
||||
@@ -220,6 +237,25 @@ export default function KnowledgePage() {
|
||||
placeholder="用于检索展示的标题"
|
||||
/>
|
||||
</label>
|
||||
<label className="space-y-1.5">
|
||||
<span className="text-xs text-slate-500">
|
||||
知识库集合 <span className="text-rose-500">*</span>
|
||||
</span>
|
||||
<Select
|
||||
value={collection}
|
||||
onChange={(event) => setCollection(event.target.value)}
|
||||
>
|
||||
{KNOWLEDGE_COLLECTIONS.map((item) => (
|
||||
<option key={item.value} value={item.value}>
|
||||
{item.label}({item.value})
|
||||
</option>
|
||||
))}
|
||||
</Select>
|
||||
<span className="block text-[11px] leading-4 text-slate-400">
|
||||
{KNOWLEDGE_COLLECTIONS.find((item) => item.value === collection)
|
||||
?.description ?? "决定文档写入哪个向量集合,入库后不可修改"}
|
||||
</span>
|
||||
</label>
|
||||
<label className="space-y-1.5">
|
||||
<span className="text-xs text-slate-500">切分策略</span>
|
||||
<Select
|
||||
@@ -284,6 +320,7 @@ export default function KnowledgePage() {
|
||||
{preview && (
|
||||
<div className="rounded-lg border border-slate-200 bg-slate-50 p-4">
|
||||
<div className="mb-2 flex flex-wrap items-center gap-2 text-xs text-slate-500">
|
||||
<Badge tone="info">{collectionLabel(collection)}</Badge>
|
||||
<Badge tone="info">{preview.strategy || strategy}</Badge>
|
||||
{preview.chunk_size != null && <span>分片 {preview.chunk_size}</span>}
|
||||
{preview.chunk_overlap != null && <span>重叠 {preview.chunk_overlap}</span>}
|
||||
@@ -338,7 +375,11 @@ export default function KnowledgePage() {
|
||||
{item.title ?? item.filename ?? docId}
|
||||
</p>
|
||||
<p className="mt-0.5 flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-slate-400">
|
||||
{item.collection_name && <span>{item.collection_name}</span>}
|
||||
{item.collection_name && (
|
||||
<span className="rounded bg-slate-100 px-1.5 py-0.5 text-slate-500">
|
||||
{collectionLabel(item.collection_name)}
|
||||
</span>
|
||||
)}
|
||||
{item.chunk_count != null && <span>{item.chunk_count} 段</span>}
|
||||
{item.create_time && <span>{item.create_time}</span>}
|
||||
<span className="font-mono">{docId}</span>
|
||||
|
||||
Reference in New Issue
Block a user