Files

91 lines
3.8 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- coding: utf-8 -*-
"""
cn-financial-scraper 知识库总结同步入口 v7.7.0
把爬取/汇总的数据按需求总结进知识库(IMA / Dify / Obsidian / 本地),
并支持从知识库反向校对爬取数据。
用法:
python run_knowledge.py --target local --mode overall
python run_knowledge.py --target obsidian --mode target --target-name 贵州茅台 \
--requirement "重点关注处罚与业绩" --output <临时目录> # 测试/预览用
python run_knowledge.py --target ima --mode negative
python run_knowledge.py --verify data/xxx.json --target dify
python run_knowledge.py --search "招商银行 处罚" --target local
"""
import json
import sys
import os
import argparse
from pathlib import Path
SKILL_DIR = Path(__file__).resolve().parent
SCRIPTS_DIR = SKILL_DIR / "scripts"
sys.path.insert(0, str(SCRIPTS_DIR))
sys.dont_write_bytecode = True
os.environ.setdefault("PYTHONDONTWRITEBYTECODE", "1")
def main(argv=None):
from knowledge_sync import (get_adapter, sync_to_knowledge_base,
verify_against_knowledge_base,
summarize_to_notes, KnowledgeBaseError)
ap = argparse.ArgumentParser(description="v7.7.0 知识库总结同步")
ap.add_argument("--target", default="",
help="知识库适配器:local/obsidian/ima/dify(默认读配置)")
ap.add_argument("--mode", default="overall",
choices=["overall", "target", "negative"],
help="总结需求模式")
ap.add_argument("--target-name", default="", help="mode=target 的机构名")
ap.add_argument("--requirement", default="", help="自定义总结需求")
ap.add_argument("--verify", default="", help="校对:爬取结果 JSON 文件")
ap.add_argument("--search", default="", help="检索知识库")
ap.add_argument("--output", default="",
help="总结预览落盘路径(.md),不推送仅预览")
args = ap.parse_args(argv)
try:
if args.search:
ad = get_adapter(args.target or None)
hits = ad.search(args.search, limit=5)
print(json.dumps(hits, ensure_ascii=False, indent=1))
return 0
if args.verify:
data = json.loads(Path(args.verify).read_text(encoding="utf-8"))
items = data if isinstance(data, list) else data.get("articles", [])
report = verify_against_knowledge_base(
items, adapter=get_adapter(args.target or None))
print(json.dumps(report, ensure_ascii=False, indent=1))
return 0
if args.output: # 仅预览:总结为 Markdown 落盘,不推送
notes = summarize_to_notes(mode=args.mode, target=args.target_name,
requirement=args.requirement)
if not notes:
print("无可总结的数据(快照为空)")
return 1
out = Path(args.output)
out.parent.mkdir(parents=True, exist_ok=True)
out.write_text("\n\n---\n\n".join(
n.to_frontmatter_markdown() for n in notes), encoding="utf-8")
print(f"已生成总结预览:{out}({len(notes)} 篇)")
return 0
res = sync_to_knowledge_base(target=args.target or None,
mode=args.mode,
requirement=args.requirement)
print(json.dumps(res, ensure_ascii=False, indent=1))
return 0 if not res.get("failed") else 2
except KnowledgeBaseError as exc:
print(f"❌ 知识库操作失败:{exc}", file=sys.stderr)
return 1
except FileNotFoundError as exc:
print(f"❌ 文件不存在:{exc}", file=sys.stderr)
return 1
if __name__ == "__main__":
sys.exit(main())