WorkBuddy 资料库 → IMA 知识库 批量迁移
把一批 workbuddy.cn/space/d/<nodeId> 链接(可以是文件夹)里的全部内容,原样搬进指定的 IMA 知识库。
何时使用
- 用户给出若干
/space/d/...链接 + 目标知识库名,要求"传到 IMA / 同步到 IMA / 入库"。 - 链接第一条常是文件夹节点,此时加
--expand一次性搬整夹,不要让用户再逐条列。
前置:拿到知识库 ID
ima-mcp 不支持创建/改名/删除知识库,库必须先在 ima 客户端建好。
mcp__ima-mcp__search_knowledge_base按名字搜 → 取knowledge_base_id;mcp__ima-mcp__get_addable_knowledge_base_list确认该库可写。
已知库 ID:大智学情分析知识库 7508886923774288;天一的工作写作知识库 7482244088228955;人工智能知识库 7437810533404434;中原古韵知识库 7440381595641598。
流程
第一步:本地准备(一条命令)
python scripts/migrate.py --workdir <工作目录> --node <节点ID> [--node <ID> ...] [--expand]
它会自动完成:判定节点类型 → doc 导出 XML 并转 Markdown → drive 下载原件 → 统一 ASCII 命名 → 产出 manifest.json。
manifest.json 每项含 key / ext / path / title / size / content_type,后续全部按它走。
依赖 library 技能的三个上游脚本:{library}/space_api.py、{library}/doc/get_doc_reviews.py、{library}/drive/get_download_link.py。
这些脚本在 WorkBuddy 安装目录内,安装目录会变(如 2026-10 曾从 D:\腾讯应用宝文件管理\WorkBuddy 迁到 D:\WB\WorkBuddy)。脚本内置自动探测常见安装根,无需改代码;特殊情况用环境变量 WB_LIBRARY_PATH 显式指定,找不到时会打印修复命令而不是静默失败。
第二步:create_media(批量 5 个一组)
按 manifest 逐项调 mcp__ima-mcp__create_media:
file_name:用 title(中文,不带扩展名)file_ext:md/pdf/png...file_size:必须取磁盘实际字节数(manifest 里的size,已由os.path.getsize得出)content_type:必须按扩展名精确填(md→text/markdown,pdf→application/pdf,png→image/png),禁用application/octet-stream
返回 media_id(要记下来)和 cos_credential(整段存成 cred/fNN.json)。
第三步:COS v5 签名上传
python C:/Users/LENOVO/.workbuddy/scripts/ima_cos_upload.py \
--cred cred/f01.json --file files/f01.md --content-type text/markdown
打印 UPLOAD_OK 即成功。凭证用完即删。
第四步:add_knowledge
按 media_id 逐项 mcp__ima-mcp__add_knowledge,duplicate_name_strategy 用 DUPLICATE_NAME_STRATEGY_SAVE。
第五步:复核
mcp__ima-mcp__get_knowledge_list(不要加 MEDIA_TYPE_FILTER_OUT_TYPE 过滤,加了会返回空列表),确认 media_state=2 且 parse_progress=100。入库瞬间显示"解析中"属正常,服务端自动完成。
第六步:清理
中间产物目录用回收站方式清理,不要 rmtree:
python C:/Users/LENOVO/.workbuddy/scripts/recycle.py <目录>
硬约束与已知坑
file_size不是字符数。Windows 写文件默认 CRLF,比 UTF-8 字节数多出约"行数"个字节;填错会导致上传校验失败。- doc 导出是 XML 组件格式,必须经
xml2md.convert()转 Markdown 再入库,否则库里全是标签。转换规则:表格→GFM、代码块原样、引用按行>、编号列表顺序化、修订痕迹丢弃ar="delete"、保留ar="insert"(所以入库的是终稿而非首版)。导出文本末尾的KS_元信息行要剔除。 - drive 文件走短时效下载链接,取到后立刻下载,不转码、原汁原味。
- ima-mcp 没有删除知识的接口(只有 create/add/get/search)。知识条目只能用户在 ima 客户端手删。
DUPLICATE_NAME_STRATEGY_REPLACE不是去重手段:语义是"删同名旧条 + 插新条",total_size恒不变;只命中完全同名条目,名称稍异(括号 vs 下划线)就完全不生效。- 同一内容同时有 MD 与 PDF 两版时不算重复、一律保留(天一双库调用约定):MD 供 AI 检索引用,PDF 供打印分发。不要出具"删 MD 还是删 PDF"的取舍建议。WorkBuddy space 原始节点是唯一真源,永不删除。
- 删除目录别用
shutil.rmtree,会被沙箱SAFE_DELETE_BULK_REJECTED(约 50 文件/轮次)拦截。走recycle.py(SHFileOperationW+FOF_ALLOWUNDO)。该 API 删脚本自身时返回 rc=2 但已生效,须回读目录确认,不能只看返回码。 - WorkBuddy 换安装目录会让上游依赖失效(症状:三个
*py路径全部"缺失")。修复靠自动探测,排查顺序:① 实跑migrate.py看打印的 library 目录;② 全盘找space_api.py的最新位置;③ 仍不行再设WB_LIBRARY_PATH。 - 运行自检脚本时加
PYTHONDONTWRITEBYTECODE=1,否则import会在scripts/下生成__pycache__,发布前必须清掉。
验证记录
2026-10-02 以「学情分析」文件夹(15 个子节点:11 doc + 3 pdf + 1 png)实测通过,15/15 入库成功;改造后的通用脚本复现结果与首次手工入库字节数逐项一致。