解析管线

文档解析管线时间线 .kb-pipeline:折叠摘要行(状态徽章 + 标题 + N chunks + 耗时 + 步数)+ 步骤 ol + 失败错误区(阶段定位 + 原因),run.progress 可选细粒度进度条。六态状态机(unstart/queued/running/cancel/done/fail);running / fail 自动展开、用户展开过则不再被自动态覆盖(与 ai-reasoning 同契约),重渲染保留折叠态。失败重跑粒度 = 单文档(无死路):icen:kb-pipeline-rerun { documentId };折叠派 icen:kb-pipeline-toggle { el, open }。

三态各一张卡:done(折叠)/ running(自动展开 + 进度条)/ fail(自动展开 + 错误区)——点摘要行折叠,点「重跑」派事件

事件日志:等待交互

<p class="demo-label" style="margin:0 0 8px">三态各一张卡:done(折叠)/ running(自动展开 + 进度条)/ fail(自动展开 + 错误区)——点摘要行折叠,点「重跑」派事件</p><div id="demo-kb-pipeline"></div><p class="demo-label" id="demo-kb-pipeline-log" style="margin-top:8px">事件日志:等待交互</p>

安装

bun add @icen.ai/ui

一行引入该组件(CSS 与 behavior 自动带上,无需关心内部 CSS 文件名):

import { initKbPipeline } from '@icen.ai/ui/kit/kb-pipeline';initKbPipeline();

也可以用脚手架直接打印引入行:

bunx --bun @icen.ai/ui add kb-pipeline

Astro 项目注意:kit 入口里的 CSS import 在页面 <script> 里会被 Astro 的 client bundle 摇掉——请改在布局 frontmatter 里引 CSS(import '@icen.ai/ui/components/kb-ingest.css';),JS 行为仍可走 kit。Vite SPA / webpack 项目无此问题。

用法

import { renderKbPipeline, initKbPipeline } from '@icen.ai/ui/kit/kb-pipeline';initKbPipeline();   // 委托折叠 + 单文档重跑(root 缺省 document,后续插入的卡一并接管) renderKbPipeline(el, {  documentId: 'doc-vendor-32',  title: '供应商准入手册 v3.2.pdf',  status: 'fail',                          // unstart | queued | running | cancel | done | fail  progress: 62,                            // 可选细粒度进度条(0–100)  steps: [    { key: 'upload', label: '上传',   status: 'done',   detail: '8.2 MB', elapsedMs: 420 },    { key: 'parse',  label: '解析',   status: 'done',   detail: '26 页 · 2 表', elapsedMs: 3100 },    { key: 'table',  label: '表格识别', status: 'fail',  detail: 'sheet「指标口径」', elapsedMs: 1800 },    { key: 'chunk',  label: '切片',   status: 'unstart' },  ],  chunkCount: 48,  elapsedMs: 12620,  error: { stage: '表格识别', message: '合并单元格跨页断裂:B14 外键引用为空' },});// 数组输入渲染纵向列表(外层 .kb-pipeline-list);空数组给空态「暂无解析任务」// running / fail 折叠初值自动展开;用户操作过(按 data-document-id 记忆)则重渲染不覆盖// 事件:icen:kb-pipeline-toggle { el, open } / icen:kb-pipeline-rerun { documentId }