Kaynağa Gözat

重构:拆出共享基座 core/ 与「找帖子」阶段 acquisition/

把跨阶段复用的底座(config/models/jsonio/prompts/embedding/db/llm)收进 core/,
把第一阶段的外部抓取(crawler/oss)移到 acquisition/,creation_knowledge 专注第二
阶段「读懂+解构」。全量更新 import 路径(creation_knowledge / scripts / tests / skill)。
search 暂留到下一提交随真实搜索一起改。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
SamLee 3 hafta önce
ebeveyn
işleme
5138055158

+ 1 - 0
acquisition/__init__.py

@@ -0,0 +1 @@
+"""Stage 1 采集:query 生成 + 找帖子(搜索/取数) + OSS 媒体转存。"""

+ 2 - 2
creation_knowledge/integrations/crawler.py → acquisition/crawler.py

@@ -15,8 +15,8 @@ from urllib.parse import urljoin
 
 import httpx
 
-from creation_knowledge.config import Settings
-from creation_knowledge.models import Card, Post
+from core.config import Settings
+from core.models import Card, Post
 
 RATE_LIMIT_SECONDS = 15.0
 

+ 1 - 1
creation_knowledge/integrations/oss.py → acquisition/oss.py

@@ -13,7 +13,7 @@ from typing import Any, Callable, Optional
 
 import httpx
 
-from creation_knowledge.config import Settings
+from core.config import Settings
 
 
 class OssError(RuntimeError):

+ 1 - 0
core/__init__.py

@@ -0,0 +1 @@
+"""共享底座:config / models / jsonio / prompts / embedding / llm / db。被采集(acquisition)与解构(creation_knowledge)两阶段共同 import。"""

+ 0 - 0
creation_knowledge/config.py → core/config.py


+ 1 - 1
creation_knowledge/integrations/db.py → core/db.py

@@ -10,7 +10,7 @@ from typing import Any
 import psycopg2
 import psycopg2.extras
 
-from creation_knowledge.config import PgConfig
+from core.config import PgConfig
 
 
 def connect(cfg: PgConfig, schema: str | None = None) -> Any:

+ 1 - 1
creation_knowledge/embedding.py → core/embedding.py

@@ -16,7 +16,7 @@ from pathlib import Path
 
 import httpx
 
-from creation_knowledge.config import env_value, load_env_file
+from core.config import env_value, load_env_file
 
 _DEFAULT_URL = "https://ark.cn-beijing.volces.com/api/v3/embeddings/multimodal"
 

+ 0 - 0
creation_knowledge/jsonio.py → core/jsonio.py


+ 2 - 2
creation_knowledge/integrations/llm.py → core/llm.py

@@ -8,8 +8,8 @@ from typing import Any, Callable, Optional
 
 import httpx
 
-from creation_knowledge.config import Settings
-from creation_knowledge.jsonio import extract_json_object
+from core.config import Settings
+from core.jsonio import extract_json_object
 
 
 class LLMError(RuntimeError):

+ 0 - 0
creation_knowledge/models.py → core/models.py


+ 0 - 0
creation_knowledge/prompts.py → core/prompts.py


+ 5 - 5
creation_knowledge/__init__.py

@@ -1,9 +1,9 @@
-"""创作知识 · 基建
+"""创作知识 · Stage 2 解构
 
-提供:多平台取数(integrations.crawler)、媒体落盘(media)、多模态读取
-(integrations.extractor / video_extract / video_frames)、PG 连接(integrations.db)、
-LLM 客户端(integrations.llm)、火山 embedding(embedding)、web 静态服务(api)
-分类树 dump/embed/定位 见 scripts/。知识提取本身由外部 skill 完成
+读懂(媒体→文字,integrations.extractor / video_extract / video_frames)、媒体落盘(media)、
+web 静态服务(api)。闸/拆颗/作用域/组装的编排在 scripts/decompose.py。
+共享底座(config/models/llm/embedding…)在 core/;找帖子(搜索/取数/OSS)在 acquisition/
+知识提取方法论真源是 创作知识提取-skill/
 """
 
 __version__ = "0.1.0"

+ 1 - 1
creation_knowledge/integrations/__init__.py

@@ -1 +1 @@
-"""外部 IO 客户端:crawler / extractor / llm / db。"""
+"""读懂用的多模态 LLM 客户端:extractor(图)/ video_extract(视频)/ video_frames(抽帧)。"""

+ 4 - 4
creation_knowledge/integrations/extractor.py

@@ -14,10 +14,10 @@ import httpx
 
 import logging
 
-from creation_knowledge.config import load_env_file
-from creation_knowledge.jsonio import extract_json_object, to_bool
-from creation_knowledge.models import Card, CardExtract, ExtractedContent, Post
-from creation_knowledge.prompts import load_prompt
+from core.config import load_env_file
+from core.jsonio import extract_json_object, to_bool
+from core.models import Card, CardExtract, ExtractedContent, Post
+from core.prompts import load_prompt
 
 logger = logging.getLogger(__name__)
 

+ 4 - 4
creation_knowledge/integrations/video_extract.py

@@ -18,10 +18,10 @@ from typing import Any, Callable, Optional
 
 import httpx
 
-from creation_knowledge.config import Settings
-from creation_knowledge.jsonio import extract_json_object
-from creation_knowledge.models import Card, CardExtract, ExtractedContent, Post
-from creation_knowledge.prompts import load_prompt
+from core.config import Settings
+from core.jsonio import extract_json_object
+from core.models import Card, CardExtract, ExtractedContent, Post
+from core.prompts import load_prompt
 
 logger = logging.getLogger(__name__)
 

+ 1 - 1
creation_knowledge/integrations/video_frames.py

@@ -19,7 +19,7 @@ from typing import Callable, Optional
 
 import httpx
 
-from creation_knowledge.models import Card
+from core.models import Card
 
 logger = logging.getLogger(__name__)
 

+ 1 - 1
creation_knowledge/media.py

@@ -12,7 +12,7 @@ from pathlib import Path
 from typing import Callable
 
 from creation_knowledge.integrations.video_extract import _default_download
-from creation_knowledge.models import Post
+from core.models import Post
 
 logger = logging.getLogger(__name__)
 

+ 6 - 6
scripts/decompose.py

@@ -17,14 +17,14 @@ import sys
 import time
 from pathlib import Path
 
-from creation_knowledge.config import Settings
+from core.config import Settings
 from creation_knowledge.integrations import video_extract
-from creation_knowledge.integrations.crawler import fetch_post_detail, parse_detail_response
+from acquisition.crawler import fetch_post_detail, parse_detail_response
 from creation_knowledge.integrations.extractor import GeminiExtractor
-from creation_knowledge.integrations.llm import chat_json
-from creation_knowledge.integrations.oss import to_oss, upload_stream
-from creation_knowledge.integrations.search import search_keyword
-from creation_knowledge.prompts import load_prompt
+from core.llm import chat_json
+from acquisition.oss import to_oss, upload_stream
+from acquisition.search import search_keyword
+from core.prompts import load_prompt
 from scripts.scope_link import ScopeLinker
 
 ROOT = Path(__file__).resolve().parent.parent

+ 2 - 2
scripts/dump_trees.py

@@ -13,8 +13,8 @@ import sys
 from collections import Counter
 from pathlib import Path
 
-from creation_knowledge.config import PgConfig
-from creation_knowledge.integrations.db import fetch_all
+from core.config import PgConfig
+from core.db import fetch_all
 
 OUT = Path("scope_trees")
 

+ 1 - 1
scripts/embed_trees.py

@@ -12,7 +12,7 @@ from pathlib import Path
 
 import numpy as np
 
-from creation_knowledge.embedding import ArkEmbedConfig, embed_text
+from core.embedding import ArkEmbedConfig, embed_text
 
 OUT = Path("scope_trees")
 

+ 1 - 1
scripts/scope_link.py

@@ -16,7 +16,7 @@ from pathlib import Path
 
 import numpy as np
 
-from creation_knowledge.embedding import ArkEmbedConfig, embed_text
+from core.embedding import ArkEmbedConfig, embed_text
 
 OUT = Path("scope_trees")
 

+ 1 - 1
scripts/smoke_extract.py

@@ -13,7 +13,7 @@ import json
 import sys
 from pathlib import Path
 
-from creation_knowledge.integrations.crawler import parse_detail_response
+from acquisition.crawler import parse_detail_response
 from creation_knowledge.integrations.extractor import GeminiExtractor
 
 FIXTURES = Path(__file__).resolve().parent.parent / "tests" / "fixtures"

+ 1 - 1
tests/test_crawler.py

@@ -6,7 +6,7 @@ from pathlib import Path
 
 import pytest
 
-from creation_knowledge.integrations.crawler import (
+from acquisition.crawler import (
     PLATFORMS,
     detect_platform_and_id,
     parse_content_id,

+ 1 - 1
tests/test_decompose_helpers.py

@@ -2,7 +2,7 @@
 from __future__ import annotations
 
 import scripts.decompose as d
-from creation_knowledge.config import PgConfig, Settings
+from core.config import PgConfig, Settings
 
 
 def _settings() -> Settings:

+ 1 - 1
tests/test_extractor.py

@@ -7,7 +7,7 @@ from __future__ import annotations
 import json
 
 from creation_knowledge.integrations.extractor import GeminiExtractor
-from creation_knowledge.models import Post
+from core.models import Post
 
 
 class _FakeResp:

+ 1 - 1
tests/test_media.py

@@ -2,7 +2,7 @@
 from __future__ import annotations
 
 from creation_knowledge import media
-from creation_knowledge.models import Card, Post
+from core.models import Card, Post
 
 PNG = b"\x89PNG\r\n\x1a\n" + b"fakepng"
 JPG = b"\xff\xd8\xff\xe0" + b"fakejpg"

+ 2 - 2
tests/test_oss.py

@@ -4,8 +4,8 @@ from __future__ import annotations
 import httpx
 import pytest
 
-from creation_knowledge.config import PgConfig, Settings
-from creation_knowledge.integrations.oss import (
+from core.config import PgConfig, Settings
+from acquisition.oss import (
     OssError, parse_oss_response, to_oss, upload_stream,
 )
 

+ 2 - 2
tests/test_video_extract.py

@@ -3,9 +3,9 @@ from __future__ import annotations
 
 import json
 
-from creation_knowledge.config import PgConfig, Settings
+from core.config import PgConfig, Settings
 from creation_knowledge.integrations.video_extract import extract_video
-from creation_knowledge.models import Post
+from core.models import Post
 
 SEGMENTS = json.dumps({
     "video_title": "AI视频教程", "overall": "教 AI 出片",

+ 1 - 1
tests/test_video_frames.py

@@ -25,7 +25,7 @@ FF = _ffmpeg()
 @pytest.mark.skipif(not FF, reason="ffmpeg 不可用")
 def test_extract_frames_from_generated_clip(tmp_path):
     from creation_knowledge.integrations.video_frames import extract_frames
-    from creation_knowledge.models import Card
+    from core.models import Card
 
     clip = tmp_path / "clip.mp4"
     subprocess.run(

+ 1 - 1
创作知识提取-skill/tools/scope-link.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python3
 """作用域定位 CLI —— 候选值 → 5 棵树本地向量缓存余弦最近邻 top-K。
 
-复用基建:scripts.scope_link.ScopeLinker(+ creation_knowledge.embedding + scope_trees/)。
+复用基建:scripts.scope_link.ScopeLinker(+ core.embedding + scope_trees/)。
 从仓库根目录跑(自动 chdir);需 .env 里的 ARK_* 与本地 scope_trees/(先跑 dump_trees+embed_trees)。
 
 用法: