sdpy-kit 0.4.4__tar.gz → 0.4.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/PKG-INFO +6 -6
  2. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/README.md +5 -5
  3. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/__init__.py +1 -1
  4. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/docs/marker_kit.py +35 -9
  5. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/.gitignore +0 -0
  6. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/ai/__init__.py +0 -0
  7. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/ai/base_service.py +0 -0
  8. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/ai/chat_service.py +0 -0
  9. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/ai/embedding_service.py +0 -0
  10. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/ai/exceptions.py +0 -0
  11. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/ai/failover.py +0 -0
  12. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/ai/image_service.py +0 -0
  13. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/ai/model_builder.py +0 -0
  14. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/ai/model_client.py +0 -0
  15. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/ai/pool.py +0 -0
  16. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/ai/profiles.py +0 -0
  17. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/ai/rerank_service.py +0 -0
  18. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/ai/runner.py +0 -0
  19. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/ai/types.py +0 -0
  20. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/common_kit.py +0 -0
  21. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/config/__init__.py +0 -0
  22. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/config/kit_config.py +0 -0
  23. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/config/log_config.py +0 -0
  24. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/crawl/__init__.py +0 -0
  25. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/crawl/article_models.py +0 -0
  26. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/crawl/web_article_kit.py +0 -0
  27. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/crawl/wx_article_kit.py +0 -0
  28. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/db/__init__.py +0 -0
  29. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/db/base_db_kit.py +0 -0
  30. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/db/crud.py +0 -0
  31. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/db/engine.py +0 -0
  32. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/db/exceptions.py +0 -0
  33. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/db/models/__init__.py +0 -0
  34. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/db/models/base.py +0 -0
  35. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/db/mysql_kit.py +0 -0
  36. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/db/pg_kit.py +0 -0
  37. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/db/query.py +0 -0
  38. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/db/session.py +0 -0
  39. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/db/sqlite_kit.py +0 -0
  40. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/db/transaction.py +0 -0
  41. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/docs/__init__.py +0 -0
  42. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/docs/anydoc_kit.py +0 -0
  43. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/docs/docx_kit.py +0 -0
  44. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/docs/md2doc_kit.py +0 -0
  45. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/docs/mineru_kit.py +0 -0
  46. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/file_kit.py +0 -0
  47. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/laya_kit.py +0 -0
  48. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/license_kit.py +0 -0
  49. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/kit/redis_kit.py +0 -0
  50. {sdpy_kit-0.4.4 → sdpy_kit-0.4.5}/pyproject.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: sdpy-kit
3
- Version: 0.4.4
3
+ Version: 0.4.5
4
4
  Summary: SDPY Kit——统一数据库访问层(PG/MySQL/SQLite)与 AI/Redis/文件/文档/向量工具集
5
5
  Author-email: Clark <changhongyuan@126.com>
6
6
  License-Expression: MIT
@@ -77,7 +77,7 @@ SDPY 统一工具集(Kit 体系),供 Python 项目开箱即用:
77
77
 
78
78
  - **统一数据库访问层**:PostgreSQL / MySQL / SQLite,三个 Kit API 完全一致,切换数据库只改一行 import;
79
79
  - **AI 多模型服务池**:chat / embedding / rerank / image 四类能力,多厂商候选链 + 故障自动转移;
80
- - **工具集**:Redis / 文件 / 雪花 ID / 文档互转 / Word 模板填充 / MinerU 解析 / Marker 本地解析(md + images) / Laya 类型化决策 / 微信公众号文章抓取存储 / 通用网页文章抓取存储。
80
+ - **工具集**:Redis / 文件 / 雪花 ID / 文档互转 / Word 模板填充 / MinerU 解析 / Marker 本地解析(md + images/) / Laya 类型化决策 / 微信公众号文章抓取存储 / 通用网页文章抓取存储。
81
81
 
82
82
  > 要求 Python 3.13+
83
83
 
@@ -978,8 +978,8 @@ if r.state == "done":
978
978
  ```python
979
979
  from kit.docs.marker_kit import MarkerKit
980
980
 
981
- # 落盘 md + images(推荐):源文件同目录下建同名子目录
982
- md_path = MarkerKit.convert_to_dir("report.pdf") # -> report/report.md + 图片
981
+ # 落盘 md + images/(推荐):源文件同目录下建同名子目录
982
+ md_path = MarkerKit.convert_to_dir("report.pdf") # -> report/report.md + report/images/
983
983
  md_path = MarkerKit.convert_to_dir("report.pdf", "out/doc") # 指定产物目录
984
984
 
985
985
  # 只取 Markdown 文本(图片不落盘)
@@ -1000,11 +1000,11 @@ MarkerKit.shutdown() # 释放模型与推理服务(幂等)
1000
1000
  |------|------|
1001
1001
  | `is_supported(file_path) -> bool` | 扩展名白名单(pdf / 图片 / docx / pptx / xlsx / html / epub) |
1002
1002
  | `convert_to_md(file_path, *, mode=None, force_ocr=None, disable_ocr=None, page_range=None) -> str` | 解析并返回 Markdown 文本(图片不落盘) |
1003
- | `convert_to_dir(src_path, output_dir=None, *, mode=None, force_ocr=None, disable_ocr=None, page_range=None, extract_images=True) -> str` | 解析并落盘 md + images,返回 md 绝对路径 |
1003
+ | `convert_to_dir(src_path, output_dir=None, *, mode=None, force_ocr=None, disable_ocr=None, page_range=None, extract_images=True) -> str` | 解析并落盘 md + `images/`,返回 md 绝对路径 |
1004
1004
  | `convert(src_path, output_dir=None, *, ...) -> MarkerResult` | 安全版:失败封装为 `MarkerResult`,不抛异常 |
1005
1005
  | `shutdown() -> None` | 释放模型与共享推理服务(幂等) |
1006
1006
 
1007
- > 产物:`<output_dir>/<源文件名>.md` + 图片文件(md 内相对路径引用),**不生成** `_meta.json`。
1007
+ > 产物:`<output_dir>/<源文件名>.md` + `<output_dir>/images/`(md 内以 `images/<文件名>` 相对引用;无图片不建空目录),**不生成** `_meta.json`。
1008
1008
  > 结果类型:`MarkerResult`(`success` / `markdown` / `file_path` / `output_dir` / `md_path` / `image_paths` / `page_count` / `error`);异常:`MarkerError`。
1009
1009
  > `mode` 缺省时不写入配置,交由 marker 按设备自动选择;首次使用会下载模型权重(默认走 `MARKER_HF_ENDPOINT` 镜像)。
1010
1010
  > 非 NVIDIA 平台完整 VLM 能力(公式 / 扫描页 OCR)需 llama.cpp 的 `llama-server`,否则用 `disable_ocr=True` 跳过。
@@ -4,7 +4,7 @@ SDPY 统一工具集(Kit 体系),供 Python 项目开箱即用:
4
4
 
5
5
  - **统一数据库访问层**:PostgreSQL / MySQL / SQLite,三个 Kit API 完全一致,切换数据库只改一行 import;
6
6
  - **AI 多模型服务池**:chat / embedding / rerank / image 四类能力,多厂商候选链 + 故障自动转移;
7
- - **工具集**:Redis / 文件 / 雪花 ID / 文档互转 / Word 模板填充 / MinerU 解析 / Marker 本地解析(md + images) / Laya 类型化决策 / 微信公众号文章抓取存储 / 通用网页文章抓取存储。
7
+ - **工具集**:Redis / 文件 / 雪花 ID / 文档互转 / Word 模板填充 / MinerU 解析 / Marker 本地解析(md + images/) / Laya 类型化决策 / 微信公众号文章抓取存储 / 通用网页文章抓取存储。
8
8
 
9
9
  > 要求 Python 3.13+
10
10
 
@@ -905,8 +905,8 @@ if r.state == "done":
905
905
  ```python
906
906
  from kit.docs.marker_kit import MarkerKit
907
907
 
908
- # 落盘 md + images(推荐):源文件同目录下建同名子目录
909
- md_path = MarkerKit.convert_to_dir("report.pdf") # -> report/report.md + 图片
908
+ # 落盘 md + images/(推荐):源文件同目录下建同名子目录
909
+ md_path = MarkerKit.convert_to_dir("report.pdf") # -> report/report.md + report/images/
910
910
  md_path = MarkerKit.convert_to_dir("report.pdf", "out/doc") # 指定产物目录
911
911
 
912
912
  # 只取 Markdown 文本(图片不落盘)
@@ -927,11 +927,11 @@ MarkerKit.shutdown() # 释放模型与推理服务(幂等)
927
927
  |------|------|
928
928
  | `is_supported(file_path) -> bool` | 扩展名白名单(pdf / 图片 / docx / pptx / xlsx / html / epub) |
929
929
  | `convert_to_md(file_path, *, mode=None, force_ocr=None, disable_ocr=None, page_range=None) -> str` | 解析并返回 Markdown 文本(图片不落盘) |
930
- | `convert_to_dir(src_path, output_dir=None, *, mode=None, force_ocr=None, disable_ocr=None, page_range=None, extract_images=True) -> str` | 解析并落盘 md + images,返回 md 绝对路径 |
930
+ | `convert_to_dir(src_path, output_dir=None, *, mode=None, force_ocr=None, disable_ocr=None, page_range=None, extract_images=True) -> str` | 解析并落盘 md + `images/`,返回 md 绝对路径 |
931
931
  | `convert(src_path, output_dir=None, *, ...) -> MarkerResult` | 安全版:失败封装为 `MarkerResult`,不抛异常 |
932
932
  | `shutdown() -> None` | 释放模型与共享推理服务(幂等) |
933
933
 
934
- > 产物:`<output_dir>/<源文件名>.md` + 图片文件(md 内相对路径引用),**不生成** `_meta.json`。
934
+ > 产物:`<output_dir>/<源文件名>.md` + `<output_dir>/images/`(md 内以 `images/<文件名>` 相对引用;无图片不建空目录),**不生成** `_meta.json`。
935
935
  > 结果类型:`MarkerResult`(`success` / `markdown` / `file_path` / `output_dir` / `md_path` / `image_paths` / `page_count` / `error`);异常:`MarkerError`。
936
936
  > `mode` 缺省时不写入配置,交由 marker 按设备自动选择;首次使用会下载模型权重(默认走 `MARKER_HF_ENDPOINT` 镜像)。
937
937
  > 非 NVIDIA 平台完整 VLM 能力(公式 / 扫描页 OCR)需 llama.cpp 的 `llama-server`,否则用 `disable_ocr=True` 跳过。
@@ -23,7 +23,7 @@ Author: Clark Chang
23
23
  数据库访问通过 kit.db 子包提供(基于 SQLModel)。
24
24
  """
25
25
 
26
- __version__ = "0.4.4"
26
+ __version__ = "0.4.5"
27
27
 
28
28
  from kit.db import (
29
29
  MYSQL,
@@ -22,7 +22,7 @@ Author: Clark Chang
22
22
 
23
23
  本模块基于 marker-pdf(Marker v2.x,https://github.com/datalab-to/marker),
24
24
  在本地解析 PDF / 图片 / Office / HTML / EPUB,输出 GitHub-Flavored Markdown
25
- 并提取图片,产物形态对齐 kit.docs.mineru_kit 的「md + images」。
25
+ 并提取图片,产物形态为「md + images/」一层(kit 文档解析类工具的统一契约)。
26
26
 
27
27
  与 kit.docs.anydoc_kit 的分工:
28
28
  - AnyDocKit:轻量文本转换(firecrawl-anydoc),只产出 Markdown 文本;
@@ -125,7 +125,7 @@ class MarkerResult:
125
125
  file_path: 源文件绝对路径
126
126
  output_dir: 产物目录绝对路径;未落盘时为 None
127
127
  md_path: 落盘的 Markdown 文件绝对路径;未落盘时为 None
128
- image_paths: 落盘的图片文件绝对路径元组
128
+ image_paths: 落盘的图片文件绝对路径元组(位于 `<output_dir>/images/`)
129
129
  page_count: 文档页数,未知为 None
130
130
  error: 失败原因描述(异常类型与信息),成功时为 None
131
131
  """
@@ -143,8 +143,8 @@ class MarkerResult:
143
143
  class MarkerKit:
144
144
  """Marker 本地文档解析工具类,将文档转为 Markdown + Images
145
145
 
146
- 支持 PDF、图片、Office(docx/pptx/xlsx)、HTML、EPUB,产物形态对齐
147
- kit.docs.mineru_kit(md + 图片落盘于同一目录,md 以相对路径引用图片)。
146
+ 支持 PDF、图片、Office(docx/pptx/xlsx)、HTML、EPUB,产物形态为
147
+ 「md + images/」一层(md 以 `images/<文件名>` 相对路径引用图片)。
148
148
 
149
149
  使用前安装可选依赖::
150
150
 
@@ -322,7 +322,25 @@ class MarkerKit:
322
322
  return Path(output_dir).resolve()
323
323
 
324
324
  @staticmethod
325
+ def _localize_image_refs(markdown: str, mapping: dict[str, str]) -> str:
326
+ """把 md 中的裸图片文件名引用改写为 `images/` 相对路径
327
+
328
+ Args:
329
+ markdown: marker 输出的 Markdown 原文
330
+ mapping: 原文件名 → 改写后的相对路径(如 `_page_0_Figure_1.jpeg`
331
+ → `images/_page_0_Figure_1.jpeg`)
332
+
333
+ Returns:
334
+ str: 改写后的 Markdown
335
+ """
336
+ for original, rel in mapping.items():
337
+ markdown = markdown.replace(f"]({original})", f"]({rel})")
338
+ markdown = markdown.replace(f'src="{original}"', f'src="{rel}"')
339
+ return markdown
340
+
341
+ @classmethod
325
342
  def _write_outputs(
343
+ cls,
326
344
  src: Path,
327
345
  out_dir: Path,
328
346
  markdown: str,
@@ -332,18 +350,25 @@ class MarkerKit:
332
350
  ) -> tuple[str, tuple[str, ...]]:
333
351
  """落盘 Markdown 与图片,返回 (md 路径, 图片路径元组)
334
352
 
353
+ 产物为 `<out_dir>/<源文件名>.md` + `<out_dir>/images/` 图片目录,
354
+ md 内以 `images/<文件名>` 相对引用;无图片时不创建空 `images/`。
335
355
  图片名取 basename 防路径穿越;统一转 RGB 后再存(RGBA 存 JPEG 会失败)。
336
356
  """
337
357
  out_dir.mkdir(parents=True, exist_ok=True)
338
- md_path = out_dir / f"{src.stem}.md"
339
- md_path.write_text(markdown, encoding="utf-8")
340
-
341
358
  image_paths: list[str] = []
342
359
  if extract_images:
360
+ images_dir = out_dir / "images"
361
+ mapping: dict[str, str] = {}
343
362
  for name, image in images.items():
344
- target = out_dir / Path(name).name
363
+ target = images_dir / Path(name).name
364
+ target.parent.mkdir(parents=True, exist_ok=True)
345
365
  image.convert("RGB").save(target)
366
+ mapping[target.name] = f"images/{target.name}"
346
367
  image_paths.append(str(target))
368
+ markdown = cls._localize_image_refs(markdown, mapping)
369
+
370
+ md_path = out_dir / f"{src.stem}.md"
371
+ md_path.write_text(markdown, encoding="utf-8")
347
372
  return str(md_path), tuple(image_paths)
348
373
 
349
374
  # ------------------------------------------------------------------
@@ -410,7 +435,8 @@ class MarkerKit:
410
435
  ) -> str:
411
436
  """解析文档并将 Markdown + 图片落盘到目录
412
437
 
413
- 产物写入 output_dir:`<源文件名>.md` 与若干图片文件(md 以相对路径引用)。
438
+ 产物写入 output_dir:`<源文件名>.md` 与 `images/` 图片目录(md 内以
439
+ `images/<文件名>` 相对路径引用);无图片时不创建空 `images/`。
414
440
  不生成 marker 默认的 `_meta.json`。
415
441
 
416
442
  Args:
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes