8ff68078b7
桌面端「知识库」模块从占位变为可用:入库(切块/embedding/Milvus 监控) +
检索调试台(向量召回,带分数与来源)。
- mcp-go: 新工具 kb_search(返回结构化 JSON [{text,score}]);rag.Hit 加 json 标签
- gateway: POST /api/v1/kb/search → kb_search(结构化命中给检索台)
- desktop: lib/api ingestKb/searchKb;新 KbView(左 入库+监控日志 / 右 检索台命中列表
带 Milvus 来源徽标+分数);App 接 kb 视图;LeftNav 知识库 ready
- 验证: gateway/mcp-go build✓ + e2e PASS + 前端 build✓;真实浏览器——入库3条→监控
'已入库3块';语义查询'存储和搜索向量的组件'→Milvus(0.612)>Neo4j>NATS 排序正确,
全走真实百炼 embedding(控制面下发)+Milvus
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
64 lines
2.2 KiB
TypeScript
64 lines
2.2 KiB
TypeScript
export type ViewKey =
|
|
| "home"
|
|
| "studio"
|
|
| "kb"
|
|
| "report"
|
|
| "runs"
|
|
| "memory"
|
|
| "market"
|
|
| "admin";
|
|
|
|
interface Item {
|
|
key: ViewKey;
|
|
label: string;
|
|
icon: string;
|
|
group?: string;
|
|
ready?: boolean;
|
|
}
|
|
|
|
const ITEMS: Item[] = [
|
|
{ key: "home", label: "工作台", icon: "■" },
|
|
{ key: "studio", label: "编排", icon: "◆", group: "BUILD", ready: true },
|
|
{ key: "kb", label: "知识库", icon: "▣", group: "BUILD", ready: true },
|
|
{ key: "report", label: "报告", icon: "▤", group: "BUILD" },
|
|
{ key: "runs", label: "运行", icon: "▸", group: "RUN" },
|
|
{ key: "memory", label: "记忆", icon: "◇", group: "MANAGE", ready: true },
|
|
{ key: "market", label: "市场", icon: "⌧", group: "MANAGE" },
|
|
{ key: "admin", label: "管理", icon: "⚙", group: "MANAGE" },
|
|
];
|
|
|
|
// 左导航栏:模块切换,分组 BUILD / RUN / MANAGE;未就绪模块灰显(规划中)。
|
|
export function LeftNav({ active, onSelect }: { active: ViewKey; onSelect: (v: ViewKey) => void }) {
|
|
let lastGroup: string | undefined;
|
|
return (
|
|
<nav className="flex w-20 shrink-0 flex-col border-r bg-gray-50 py-2">
|
|
{ITEMS.map((it) => {
|
|
const header = it.group && it.group !== lastGroup ? it.group : null;
|
|
lastGroup = it.group ?? lastGroup;
|
|
return (
|
|
<div key={it.key}>
|
|
{header && (
|
|
<div className="mt-2 px-2 text-[9px] font-semibold tracking-wider text-gray-300">
|
|
{header}
|
|
</div>
|
|
)}
|
|
<button
|
|
onClick={() => onSelect(it.key)}
|
|
className={`flex w-full flex-col items-center gap-0.5 py-2 text-[11px] ${
|
|
active === it.key
|
|
? "bg-violet-50 font-medium text-violet-700"
|
|
: "text-gray-500 hover:bg-gray-100"
|
|
}`}
|
|
title={it.ready === false ? `${it.label}(规划中)` : it.label}
|
|
>
|
|
<span className="text-base leading-none">{it.icon}</span>
|
|
{it.label}
|
|
{it.ready === false && <span className="text-[8px] text-gray-300">规划</span>}
|
|
</button>
|
|
</div>
|
|
);
|
|
})}
|
|
</nav>
|
|
);
|
|
}
|