acquisition-runtime-boundary.md 12 KB

Acquisition Demo Runtime Boundary

本文整理当前 acquisition demo 在 acquisition/ 目录以外真实使用的输入、输出、配置和外部接口。调查时间:2026-06-30。

当前状态

  • 已尝试关闭历史 SubAgent 019f1683-1368-7b20-8d07-8ce7532ab34e,工具返回 not found,当前没有可管理的活跃 SubAgent。
  • 当前前端服务入口是 creation_knowledge.api:app,本地通常跑在 http://localhost:8126/app/#/
  • 当前 demo 主链路不是旧的“找帖子”页面,而是“创作 query 正交 demo”:
    • query 生成:scripts/build_creation_demo.py
    • 真实采集:scripts/run_creation_search.py
    • AI 补判:scripts/classify_creation_items.py
    • API + 静态托管:creation_knowledge/api.py + acquisition/web_api.py
    • 前端:acquisition/web/app/src/App.jsxCreationDemo.jsxCreationQueryDetail.jsx

目录外真实依赖

core/

acquisition 依赖 core 作为共享底座:

  • core/config.py
    • 读取 .env 或系统环境变量。
    • 组装 Settings,供搜索、详情、OSS、模型判断、静态目录使用。
  • core/prompts.py
    • 从项目根 prompts/<name>.txt 读取 prompt。
  • core/llm.py
    • 走 OpenRouter /chat/completions,用于旧 query 生成/部分 query 过滤。
  • core/models.py
    • Post / Card 数据模型,被 crawler/detail parse 使用。
  • core/embedding.py
    • 走火山 Ark embedding。当前 acquisition demo 主链路不直接用,旧/解构链路和 scope 工具可能用。
  • core/db.py
    • PostgreSQL/Greenplum 连接工具。当前 demo 主链路主要用 SQLite;旧/正式入库链路会用。

creation_knowledge/

当前 acquisition demo 借用了 creation_knowledge 的服务壳和媒体下载工具:

  • creation_knowledge/api.py
    • FastAPI app。
    • 挂载 /appacquisition/web/app/dist
    • 挂载 /dataSettings.data_dir,默认 data
    • 挂载 /framesSettings.frames_dir,默认 runtime/frames
    • include acquisition.web_api.router
  • creation_knowledge/integrations/video_extract.py
    • acquisition.creation_search 只复用 _default_download 下载图片/媒体。
    • 旧视频解构链路会使用更多 video extract 逻辑。

scripts/

当前 demo 的主要操作入口在 scripts/,不在 acquisition/ 内:

  • scripts/build_creation_demo.py
    • scope_trees/trees_index.json
    • acquisition.query_filter.filter_queries
    • data/queries/creation_demo.json
  • scripts/run_creation_search.py
    • data/queries/creation_demo.json
    • data/app.dbcreation_* 表。
    • 下载小红书/公众号图片到 data/media/...
    • 抖音视频调用 OSS 上传接口,保存 CDN URL 到 SQLite。
  • scripts/classify_creation_items.py
    • data/app.db 读取未判断/失败的 item。
    • acquisition.classify 使用 Qwen / Ark / OpenRouter。
    • creation_item_classifications

旧链路仍存在但不是当前 demo 主路径:

  • scripts/decompose.py
    • 创作知识提取-skill/extraction/phase1-frame.mdphase2-scope.md
    • prompts/gate_admit.txtgate_refute.txtgate_tiebreak.txt 等。
    • 输出 outputs/web/frameworks*.jsonweb/payloads*.json 等旧/后续解构产物。
  • scripts/run_search.py
    • 旧“找帖子”链路,写 data/search_results.jsondata/search/...

Prompt 与 Skill

当前 demo 直接使用的 prompt

  • acquisition/query_filter.txt
    • query 机械正交后做 valid/relevant 过滤。
    • scripts/build_creation_demo.py 间接调用。
    • 前端 /api/filter-prompt 会原样展示。
  • prompts/classify_imgtext.txt
    • 小红书、微信公众号图文判断“是不是创作知识”。
    • acquisition.classify.classify_imgtext 读取。
    • 前端 /api/judge-prompts 会展示。
  • prompts/classify_video.txt
    • 抖音视频判断“是不是创作知识”。
    • acquisition.classify.classify_video 读取。
    • 当前列表里的 x/10创作知识 暂不把抖音计入分母。

旧/解构链路使用的 prompt

  • prompts/extract.txt
  • prompts/extract_video.txt
  • prompts/gate_admit.txt
  • prompts/gate_refute.txt
  • prompts/gate_tiebreak.txt
  • prompts/gate_how_*
  • prompts/gate_why_refute.txt
  • prompts/normalize_scope.txt
  • prompts/query_gen.txt
  • prompts/form_query_gen.txt

创作知识提取 skill

创作知识提取-skill/ 当前不是 acquisition demo 主链路的直接运行依赖。它仍然是后续“真实解构/组装 payload”的方法论来源:

  • scripts/decompose.py 直接读取:
    • 创作知识提取-skill/extraction/phase1-frame.md
    • 创作知识提取-skill/extraction/phase2-scope.md
  • skill 内还包含 schema、taxonomy、lint/ingest/scope-link 工具。

数据输入与输出

Query 输入

  • scope_trees/trees_index.json
    • scripts/build_creation_demo.py 读取。
    • 生成 query 的实质/形式/作用/感受/意图树输入。
  • scope_trees/trees.json
    • 当前 demo 主路径不直接读。
  • scope_trees/trees_embeddings.npy
    • 当前 demo 主路径不直接读;scope/embedding 工具可能用。

Query 输出

  • data/queries/creation_demo.json
    • 当前前端首页直接 fetch:/data/queries/creation_demo.json
    • scripts/run_creation_search.py 默认读取它,作为 430 query 输入。
    • 当前大小约 140KB。

SQLite

  • data/app.db
    • 当前 demo 的结构化结果库。
    • SQLite,当前约 52MB。
    • 当前主表:
    • creation_search_runs
    • creation_search_jobs
    • creation_search_items
    • creation_item_classifications
    • 旧表目前为空:
    • queries
    • search_results
    • post_class

当前调查时行数:

  • creation_search_runs: 3
  • creation_search_jobs: 1302
  • creation_search_items: 6009
  • creation_item_classifications: 4290
  • queries: 0
  • search_results: 0
  • post_class: 0

creation_search_items 存标题、正文、原帖 URL、本地图片 URL、OSS 视频 CDN URL、raw JSON 等;不是巨大 JSON 文件。

媒体输出

  • data/media/xiaohongshu/<query_hash>/<content_id>/image_*.webp|jpg|png
  • data/media/weixin/<query_hash>/<article_hash>/image_*.webp|jpg|png|gif
  • 抖音视频不落本地,写 OSS CDN URL 到 SQLite creation_search_items.video_url

当前体量:

  • data/media: 约 5.4GB
  • data/app.db: 约 52MB
  • data/queries: 约 140KB
  • data/ 总计:约 5.5GB

Runtime 输出

  • runtime/logs/...
    • 全量采集、分类、web 服务日志。
  • runtime/frames
    • 旧/视频帧链路使用;FastAPI 会挂载为 /frames

.env 配置

配置读取优先级是:真实环境变量 > CK_ENV_FILE 指定文件 > 默认 .env > 代码默认值。

当前 demo 主链路实际会读取这些 key:

基础

  • CK_ENV_FILE
  • CK_DATA_DIR
  • CK_FRAMES_DIR
  • CK_MAX_CARDS

Aiddit 爬虫接口(小红书 / 微信公众号等)

  • AIDDIT_CRAWLER_BASE_URL
  • AIDDIT_CRAWLER_TIMEOUT_SECONDS

票圈 TV 抖音独立后端

  • PIAOQUANTV_DOUYIN_BASE_URL
  • PIAOQUANTV_DOUYIN_ACCOUNT_ID
  • PIAOQUANTV_DOUYIN_COOKIE_BATCH
  • CK_DOUYIN_RATIO

OSS 转存

  • CRAWLER_OSS_UPLOAD_URL
  • CRAWLER_OSS_UPLOAD_TIMEOUT_SECONDS

OpenRouter / Gemini

  • OPENROUTER_BASE_URL
  • OPENROUTER_API_KEY
  • OPENROUTER_MODEL
  • OPENROUTER_TIMEOUT_SECONDS

阿里云百炼 / Qwen

  • ALIYUN_BAILIAN_API_KEY
  • ALIYUN_BAILIAN_BASE_URL
  • ALIYUN_BAILIAN_MODEL

Ark / 豆包 / 火山

  • ARK_API_KEY
  • ARK_CHAT_URL
  • ARK_CHAT_MODEL
  • ARK_EMBEDDING_EP
  • ARK_EMBEDDING_URL
  • ARK_EMBEDDING_DIM

分类限流

  • CLASSIFY_PROVIDER
  • CLASSIFY_MODEL
  • CLASSIFY_PROVIDER_MIN_INTERVAL_SECONDS
  • CLASSIFY_QWEN_MIN_INTERVAL_SECONDS
  • CLASSIFY_ARK_MIN_INTERVAL_SECONDS
  • CLASSIFY_429_BACKOFF_SECONDS
  • CLASSIFY_QWEN_429_BACKOFF_SECONDS
  • CLASSIFY_ARK_429_BACKOFF_SECONDS

Query 过滤

  • QUERY_FILTER_PROVIDER

PG / 后续正式入库

当前 acquisition demo 主要用 SQLite,但 Settings 仍要求/读取 PG 配置:

  • OPEN_AIGC_PG_HOST
  • OPEN_AIGC_PG_PORT
  • OPEN_AIGC_PG_USER
  • OPEN_AIGC_PG_PASSWORD
  • OPEN_AIGC_PG_DB_NAME
  • CK_PG_SCHEMA

外部接口

小红书

  • 搜索:POST {AIDDIT_CRAWLER_BASE_URL}/crawler/xiao_hong_shu/keyword
  • 详情:POST {AIDDIT_CRAWLER_BASE_URL}/crawler/xiao_hong_shu/detail

当前 demo:

  • 搜索前 10 条。
  • 逐条拉详情。
  • 下载图文图片到本地 data/media/xiaohongshu/...

微信公众号

  • 搜索:POST {AIDDIT_CRAWLER_BASE_URL}/crawler/wei_xin/keyword
  • 详情:POST {AIDDIT_CRAWLER_BASE_URL}/crawler/wei_xin/detail

当前 demo:

  • 搜索前 10 条。
  • 逐条拉详情。
  • 下载图文图片到本地 data/media/weixin/...

抖音

  • 搜索:POST {PIAOQUANTV_DOUYIN_BASE_URL}/crawler/dou_yin/keyword
  • 详情:POST {PIAOQUANTV_DOUYIN_BASE_URL}/crawler/dou_yin/detail

当前 demo:

  • 请求体带 account_idcookie_batch
  • 搜索前 10 条。
  • 逐条拉详情。
  • 第一个 video_url 调 OSS 转存。
  • 本地不保存抖音视频文件。

OSS 转存

  • POST {CRAWLER_OSS_UPLOAD_URL}
  • 当前默认:http://crawler-upload-v2.aiddit.com/crawler/oss/upload_stream
  • 请求体:
    • src_url
    • src_type: imagevideo
  • 返回 oss_object.cdn_url

当前 demo 只强制用于抖音视频。文档 docs/oss-media-transfer.md 记录过:小红书图片、公众号图片、抖音视频都实测可转存;文字正文不能直接用该接口存,需要另做 JSON/HTML/Markdown 文件上传接口。

多模态模型

  • OpenRouter:{OPENROUTER_BASE_URL}/chat/completions
  • Qwen/DashScope:{ALIYUN_BAILIAN_BASE_URL}/chat/completions
  • Ark/豆包:默认 https://ark.cn-beijing.volces.com/api/v3/chat/completions

当前 demo 判断逻辑:

  • classify_imgtext: 标题 + 正文前 1500 字 + 本地图片 base64 data URL。
  • classify_video: HTTP(S) CDN video URL 直接传模型;本地 mp4 是兼容 fallback。
  • Qwen / Ark / OpenRouter 按 provider 选择和可用密钥兜底。
  • provider 级 limiter 和 429 backoff 在单进程内生效。

前端依赖

前端不是独立后端,它由 FastAPI 静态托管:

  • 构建源:acquisition/web/app
  • 构建产物:acquisition/web/app/dist
  • 入口:/app
  • 路由:
    • #/:Query Demo
    • #/query/<encoded-query>:单 query 详情

前端直接请求:

  • /data/queries/creation_demo.json
  • /api/creation-search/summary
  • /api/creation-search/query?query=...
  • /api/filter-prompt
  • /api/judge-prompts
  • /data/media/...

正式开发迁移建议

如果另起正式目录,不建议把当前 5.5GB data/ 直接复制为默认输入输出。建议拆成四类可配置路径:

  1. QUERY_SOURCE_PATH

    • 当前对应 data/queries/creation_demo.json
    • 正式版可以换成数据库表、对象存储 JSON、或正式 query 生成服务。
  2. RESULT_DB_PATH

    • 当前固定在 acquisition.store.DB_PATH = data/app.db
    • 正式版应改成 env 可配置,例如 CK_SQLITE_PATH 或直接切 PG。
  3. MEDIA_ROOT

    • 当前由 CK_DATA_DIR 控制,默认 data
    • 当前媒体实际写死在 ROOT / data / media/... 的代码也需要改成使用 settings.data_dir,否则迁目录会漏。
  4. PROMPT_ROOT

    • 当前 core/prompts.py 固定读项目根 prompts/
    • 正式版建议显式配置 prompt 目录或把 prompt 版本入库。

优先改造点:

  • acquisition.store.DB_PATH 改成可配置,不再硬绑定 data/app.db
  • acquisition.creation_search._process_xhs/_process_weixin 的本地媒体目录改成 settings.data_dir
  • load_creation_queries 默认路径改为参数/环境配置。
  • core.prompts.PROMPTS_DIR 改成可配置,或在启动时固定 prompt snapshot。
  • 把 crawler/OSS/model provider 封装成正式 adapter,避免 .env key 分散。
  • 将旧链路 scripts/run_search.py、旧表 queries/search_results/post_class 与当前 creation_* demo 数据模型分离归档。