sdpy-kit 0.1.3__tar.gz → 0.1.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 (42) hide show
  1. {sdpy_kit-0.1.3 → sdpy_kit-0.1.5}/PKG-INFO +51 -15
  2. {sdpy_kit-0.1.3 → sdpy_kit-0.1.5}/README.md +16 -1
  3. {sdpy_kit-0.1.3 → sdpy_kit-0.1.5}/kit/__init__.py +1 -1
  4. {sdpy_kit-0.1.3 → sdpy_kit-0.1.5}/kit/ai/base_service.py +1 -1
  5. {sdpy_kit-0.1.3 → sdpy_kit-0.1.5}/kit/ai/chat_service.py +4 -1
  6. {sdpy_kit-0.1.3 → sdpy_kit-0.1.5}/kit/ai/embedding_service.py +2 -1
  7. {sdpy_kit-0.1.3 → sdpy_kit-0.1.5}/kit/ai/model_client.py +4 -1
  8. {sdpy_kit-0.1.3 → sdpy_kit-0.1.5}/kit/db/sqlite_kit.py +6 -1
  9. {sdpy_kit-0.1.3 → sdpy_kit-0.1.5}/kit/doc_kit.py +9 -6
  10. {sdpy_kit-0.1.3 → sdpy_kit-0.1.5}/kit/mineru_kit.py +6 -1
  11. {sdpy_kit-0.1.3 → sdpy_kit-0.1.5}/pyproject.toml +41 -8
  12. {sdpy_kit-0.1.3 → sdpy_kit-0.1.5}/.gitignore +0 -0
  13. {sdpy_kit-0.1.3 → sdpy_kit-0.1.5}/kit/ai/__init__.py +0 -0
  14. {sdpy_kit-0.1.3 → sdpy_kit-0.1.5}/kit/ai/exceptions.py +0 -0
  15. {sdpy_kit-0.1.3 → sdpy_kit-0.1.5}/kit/ai/failover.py +0 -0
  16. {sdpy_kit-0.1.3 → sdpy_kit-0.1.5}/kit/ai/image_service.py +0 -0
  17. {sdpy_kit-0.1.3 → sdpy_kit-0.1.5}/kit/ai/model_builder.py +0 -0
  18. {sdpy_kit-0.1.3 → sdpy_kit-0.1.5}/kit/ai/pool.py +0 -0
  19. {sdpy_kit-0.1.3 → sdpy_kit-0.1.5}/kit/ai/profiles.py +0 -0
  20. {sdpy_kit-0.1.3 → sdpy_kit-0.1.5}/kit/ai/rerank_service.py +0 -0
  21. {sdpy_kit-0.1.3 → sdpy_kit-0.1.5}/kit/ai/runner.py +0 -0
  22. {sdpy_kit-0.1.3 → sdpy_kit-0.1.5}/kit/ai/types.py +0 -0
  23. {sdpy_kit-0.1.3 → sdpy_kit-0.1.5}/kit/common_kit.py +0 -0
  24. {sdpy_kit-0.1.3 → sdpy_kit-0.1.5}/kit/config/__init__.py +0 -0
  25. {sdpy_kit-0.1.3 → sdpy_kit-0.1.5}/kit/config/kit_config.py +0 -0
  26. {sdpy_kit-0.1.3 → sdpy_kit-0.1.5}/kit/config/log_config.py +0 -0
  27. {sdpy_kit-0.1.3 → sdpy_kit-0.1.5}/kit/db/__init__.py +0 -0
  28. {sdpy_kit-0.1.3 → sdpy_kit-0.1.5}/kit/db/base_db_kit.py +0 -0
  29. {sdpy_kit-0.1.3 → sdpy_kit-0.1.5}/kit/db/crud.py +0 -0
  30. {sdpy_kit-0.1.3 → sdpy_kit-0.1.5}/kit/db/engine.py +0 -0
  31. {sdpy_kit-0.1.3 → sdpy_kit-0.1.5}/kit/db/exceptions.py +0 -0
  32. {sdpy_kit-0.1.3 → sdpy_kit-0.1.5}/kit/db/models/__init__.py +0 -0
  33. {sdpy_kit-0.1.3 → sdpy_kit-0.1.5}/kit/db/models/base.py +0 -0
  34. {sdpy_kit-0.1.3 → sdpy_kit-0.1.5}/kit/db/mysql_kit.py +0 -0
  35. {sdpy_kit-0.1.3 → sdpy_kit-0.1.5}/kit/db/pg_kit.py +0 -0
  36. {sdpy_kit-0.1.3 → sdpy_kit-0.1.5}/kit/db/query.py +0 -0
  37. {sdpy_kit-0.1.3 → sdpy_kit-0.1.5}/kit/db/session.py +0 -0
  38. {sdpy_kit-0.1.3 → sdpy_kit-0.1.5}/kit/db/transaction.py +0 -0
  39. {sdpy_kit-0.1.3 → sdpy_kit-0.1.5}/kit/file_kit.py +0 -0
  40. {sdpy_kit-0.1.3 → sdpy_kit-0.1.5}/kit/mcp_kit.py +0 -0
  41. {sdpy_kit-0.1.3 → sdpy_kit-0.1.5}/kit/redis_kit.py +0 -0
  42. {sdpy_kit-0.1.3 → sdpy_kit-0.1.5}/kit/zvec_kit.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: sdpy-kit
3
- Version: 0.1.3
3
+ Version: 0.1.5
4
4
  Summary: SDPY Kit——统一数据库访问层(PG/MySQL/SQLite)与 AI/MCP/Redis/文件/文档/向量工具集
5
5
  Author-email: Clark <changhongyuan@126.com>
6
6
  License-Expression: MIT
@@ -17,23 +17,44 @@ Classifier: Topic :: Database
17
17
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
18
18
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
19
19
  Requires-Python: >=3.13
20
- Requires-Dist: fastmcp>=4.0.3
21
- Requires-Dist: firecrawl-anydoc>=0.2.4
22
- Requires-Dist: httpx>=0.28.1
23
- Requires-Dist: markdown-it-py>=3.0
24
- Requires-Dist: numpy>=2.0
25
- Requires-Dist: pimd[pdfa]>=2.2.5
26
- Requires-Dist: psycopg2-binary>=2.9.12
27
20
  Requires-Dist: pydantic-settings>=2.0
28
21
  Requires-Dist: pydantic>=2.0
29
- Requires-Dist: pymysql>=1.2.0
30
- Requires-Dist: python-dotenv>=1.2.3
31
- Requires-Dist: redis>=5.0.0
32
- Requires-Dist: requests>=2.34.0
33
22
  Requires-Dist: sqlalchemy~=2.0.51
34
- Requires-Dist: sqliteai-vector>=1.0.0
35
23
  Requires-Dist: sqlmodel>=0.0.39
36
- Requires-Dist: zvec>=0.6.0
24
+ Provides-Extra: ai
25
+ Requires-Dist: httpx>=0.28.1; extra == 'ai'
26
+ Provides-Extra: all
27
+ Requires-Dist: fastmcp>=4.0.3; extra == 'all'
28
+ Requires-Dist: firecrawl-anydoc>=0.2.4; extra == 'all'
29
+ Requires-Dist: httpx>=0.28.1; extra == 'all'
30
+ Requires-Dist: markdown-it-py>=3.0; extra == 'all'
31
+ Requires-Dist: numpy>=2.0; extra == 'all'
32
+ Requires-Dist: pimd[pdfa]>=2.2.5; extra == 'all'
33
+ Requires-Dist: psycopg2-binary>=2.9.12; extra == 'all'
34
+ Requires-Dist: pymysql>=1.2.0; extra == 'all'
35
+ Requires-Dist: redis>=5.0.0; extra == 'all'
36
+ Requires-Dist: requests>=2.34.0; extra == 'all'
37
+ Requires-Dist: sqliteai-vector>=1.0.0; extra == 'all'
38
+ Requires-Dist: zvec>=0.6.0; extra == 'all'
39
+ Provides-Extra: doc
40
+ Requires-Dist: firecrawl-anydoc>=0.2.4; extra == 'doc'
41
+ Requires-Dist: markdown-it-py>=3.0; extra == 'doc'
42
+ Requires-Dist: pimd[pdfa]>=2.2.5; extra == 'doc'
43
+ Provides-Extra: mcp
44
+ Requires-Dist: fastmcp>=4.0.3; extra == 'mcp'
45
+ Provides-Extra: mineru
46
+ Requires-Dist: requests>=2.34.0; extra == 'mineru'
47
+ Provides-Extra: mysql
48
+ Requires-Dist: pymysql>=1.2.0; extra == 'mysql'
49
+ Provides-Extra: pg
50
+ Requires-Dist: psycopg2-binary>=2.9.12; extra == 'pg'
51
+ Provides-Extra: redis
52
+ Requires-Dist: redis>=5.0.0; extra == 'redis'
53
+ Provides-Extra: vec
54
+ Requires-Dist: numpy>=2.0; extra == 'vec'
55
+ Requires-Dist: sqliteai-vector>=1.0.0; extra == 'vec'
56
+ Provides-Extra: zvec
57
+ Requires-Dist: zvec>=0.6.0; extra == 'zvec'
37
58
  Description-Content-Type: text/markdown
38
59
 
39
60
  # sdpy-kit
@@ -45,11 +66,26 @@ SDPY 统一工具集(Kit 体系),供 Python 项目开箱即用:统一数
45
66
  ## 安装
46
67
 
47
68
  ```bash
48
- pip install sdpy-kit
69
+ pip install sdpy-kit # 基础版:config/log + kit.db 核心(SQLite 常规操作零额外依赖)
49
70
  # 或
50
71
  uv add sdpy-kit
51
72
  ```
52
73
 
74
+ 可选能力按 extras 按需安装(均为延迟导入,不装不影响基础使用,缺依赖时报错会提示安装命令):
75
+
76
+ | extra | 能力 | 安装 |
77
+ |-------|------|------|
78
+ | `pg` | PgKit(PostgreSQL 驱动) | `pip install "sdpy-kit[pg]"` |
79
+ | `mysql` | MySqlKit(MySQL 驱动) | `pip install "sdpy-kit[mysql]"` |
80
+ | `vec` | SQLiteKit 向量方法(numpy / sqliteai-vector,SQLite 向量扩展) | `pip install "sdpy-kit[vec]"` |
81
+ | `zvec` | ZvecKit(zvec,阿里独立向量库,与 `vec` 完全独立) | `pip install "sdpy-kit[zvec]"` |
82
+ | `redis` | RedisKit | `pip install "sdpy-kit[redis]"` |
83
+ | `mcp` | McpKit(fastmcp) | `pip install "sdpy-kit[mcp]"` |
84
+ | `ai` | AI 服务池(httpx) | `pip install "sdpy-kit[ai]"` |
85
+ | `doc` | DocKit 文档转换 | `pip install "sdpy-kit[doc]"` |
86
+ | `mineru` | MineruKit 解析 API | `pip install "sdpy-kit[mineru]"` |
87
+ | `all` | 全部能力 | `pip install "sdpy-kit[all]"` |
88
+
53
89
  ## 配置(.env)
54
90
 
55
91
  kit 通过 pydantic-settings 读取项目根目录 `.env`(默认值见下,均可省略):
@@ -7,11 +7,26 @@ SDPY 统一工具集(Kit 体系),供 Python 项目开箱即用:统一数
7
7
  ## 安装
8
8
 
9
9
  ```bash
10
- pip install sdpy-kit
10
+ pip install sdpy-kit # 基础版:config/log + kit.db 核心(SQLite 常规操作零额外依赖)
11
11
  # 或
12
12
  uv add sdpy-kit
13
13
  ```
14
14
 
15
+ 可选能力按 extras 按需安装(均为延迟导入,不装不影响基础使用,缺依赖时报错会提示安装命令):
16
+
17
+ | extra | 能力 | 安装 |
18
+ |-------|------|------|
19
+ | `pg` | PgKit(PostgreSQL 驱动) | `pip install "sdpy-kit[pg]"` |
20
+ | `mysql` | MySqlKit(MySQL 驱动) | `pip install "sdpy-kit[mysql]"` |
21
+ | `vec` | SQLiteKit 向量方法(numpy / sqliteai-vector,SQLite 向量扩展) | `pip install "sdpy-kit[vec]"` |
22
+ | `zvec` | ZvecKit(zvec,阿里独立向量库,与 `vec` 完全独立) | `pip install "sdpy-kit[zvec]"` |
23
+ | `redis` | RedisKit | `pip install "sdpy-kit[redis]"` |
24
+ | `mcp` | McpKit(fastmcp) | `pip install "sdpy-kit[mcp]"` |
25
+ | `ai` | AI 服务池(httpx) | `pip install "sdpy-kit[ai]"` |
26
+ | `doc` | DocKit 文档转换 | `pip install "sdpy-kit[doc]"` |
27
+ | `mineru` | MineruKit 解析 API | `pip install "sdpy-kit[mineru]"` |
28
+ | `all` | 全部能力 | `pip install "sdpy-kit[all]"` |
29
+
15
30
  ## 配置(.env)
16
31
 
17
32
  kit 通过 pydantic-settings 读取项目根目录 `.env`(默认值见下,均可省略):
@@ -23,7 +23,7 @@ Author: Clark Chang
23
23
  数据库访问通过 kit.db 子包提供(基于 SQLModel)。
24
24
  """
25
25
 
26
- __version__ = "0.1.3"
26
+ __version__ = "0.1.5"
27
27
 
28
28
  from kit.db import (
29
29
  MYSQL,
@@ -127,7 +127,7 @@ class BaseAIService[RequestT, ResponseT](ABC):
127
127
  data = await self._client.post_json(payload)
128
128
  result = self._parse_response(data)
129
129
  except AIError as exc:
130
- logger.info(
130
+ logger.error(
131
131
  f"********** {desc} ********** "
132
132
  f"耗时 {time.perf_counter() - start:.1f}秒(失败:{exc})"
133
133
  )
@@ -116,6 +116,7 @@ class ChatService(BaseAIService[ChatRequest, str]):
116
116
  logger.info(f"请求参数: {params}")
117
117
  start = time.perf_counter()
118
118
  note = ""
119
+ failed = False
119
120
  try:
120
121
  async for parsed in self._client.stream_json(payload):
121
122
  if parsed is None:
@@ -130,12 +131,14 @@ class ChatService(BaseAIService[ChatRequest, str]):
130
131
  yield delta
131
132
  except AIError as exc:
132
133
  note = f"(失败:{exc})"
134
+ failed = True
133
135
  raise
134
136
  except BaseException: # noqa: BLE001 - 中断路径(提前 break/取消)也需收尾日志
135
137
  note = "(中断)"
136
138
  raise
137
139
  finally:
138
- logger.info(
140
+ log = logger.error if failed else logger.info
141
+ log(
139
142
  f"********** {desc} ********** "
140
143
  f"耗时 {time.perf_counter() - start:.1f}秒{note}"
141
144
  )
@@ -146,7 +146,8 @@ class EmbeddingService(BaseAIService[EmbeddingRequest, list[list[float]]]):
146
146
 
147
147
  return [vec for vec in results if vec is not None]
148
148
  finally:
149
- logger.info(
149
+ log = logger.error if failures else logger.info
150
+ log(
150
151
  f"********** {desc} ********** "
151
152
  f"耗时 {time.perf_counter() - start:.1f}秒{note}"
152
153
  )
@@ -23,7 +23,10 @@ import random
23
23
  from collections.abc import AsyncIterator
24
24
  from typing import Final
25
25
 
26
- import httpx
26
+ try:
27
+ import httpx
28
+ except ImportError as e:
29
+ raise ImportError("kit.ai 需要可选依赖,请安装:pip install sdpy-kit[ai]") from e
27
30
 
28
31
  from kit.ai.exceptions import (
29
32
  AIRequestError,
@@ -41,7 +41,6 @@ from __future__ import annotations
41
41
  rows = SQLiteKit.search_vectors("images", [0.1, 0.2, ...], top_k=5)
42
42
  """
43
43
 
44
- import numpy as np
45
44
  from sqlalchemy import text
46
45
 
47
46
  from kit.config.log_config import get_default_logger
@@ -219,6 +218,9 @@ class SQLiteKit(BaseDbKit):
219
218
  raise ValueError("extra_data 长度必须与 vectors 一致")
220
219
 
221
220
  engine = get_engine(cls.DB_TYPE)
221
+ # numpy 仅向量方法需要(vec extra),延迟导入保持基础安装可用
222
+ import numpy as np
223
+
222
224
  with engine.connect() as conn:
223
225
  for i, vec in enumerate(vectors):
224
226
  vec_bytes = np.array(vec, dtype=np.float32).tobytes()
@@ -274,6 +276,9 @@ class SQLiteKit(BaseDbKit):
274
276
  按距离升序排列的结果列表,每项为 {"id": int, "distance": float, ...额外列}
275
277
  """
276
278
  engine = get_engine(cls.DB_TYPE)
279
+ # numpy 仅向量方法需要(vec extra),延迟导入保持基础安装可用
280
+ import numpy as np
281
+
277
282
  query_bytes = np.array(query_vector, dtype=np.float32).tobytes()
278
283
 
279
284
  with engine.connect() as conn:
@@ -41,12 +41,15 @@ import zipfile
41
41
  from dataclasses import dataclass
42
42
  from pathlib import Path
43
43
 
44
- import anydoc
45
- from fpdf import FPDF
46
- from markdown_it import MarkdownIt
47
- from markdown_it.token import Token
48
- from pimd import PiMD
49
- from pimd.exceptions import ConversionError
44
+ try:
45
+ import anydoc
46
+ from fpdf import FPDF
47
+ from markdown_it import MarkdownIt
48
+ from markdown_it.token import Token
49
+ from pimd import PiMD
50
+ from pimd.exceptions import ConversionError
51
+ except ImportError as e:
52
+ raise ImportError("doc_kit 需要可选依赖,请安装:pip install sdpy-kit[doc]") from e
50
53
 
51
54
  from kit.config.log_config import get_default_logger
52
55
 
@@ -45,7 +45,12 @@ from dataclasses import dataclass
45
45
  from pathlib import Path
46
46
  from typing import Any
47
47
 
48
- import requests
48
+ try:
49
+ import requests
50
+ except ImportError as e:
51
+ raise ImportError(
52
+ "mineru_kit 需要可选依赖,请安装:pip install sdpy-kit[mineru]"
53
+ ) from e
49
54
 
50
55
  from kit.config.kit_config import get_settings
51
56
  from kit.config.log_config import get_default_logger
@@ -28,27 +28,60 @@ classifiers = [
28
28
  "Topic :: Scientific/Engineering :: Artificial Intelligence",
29
29
  "Topic :: Software Development :: Libraries :: Python Modules",
30
30
  ]
31
+ # base + extras 须与主工程 pyproject.toml 的 dependencies 保持一致(双向锚定),
32
+ # publish.py --check-only 会自动校验,主工程缺失即报错。
31
33
  dependencies = [
32
34
  "pydantic>=2.0",
33
35
  "pydantic-settings>=2.0",
34
- "numpy>=2.0",
35
36
  "sqlalchemy~=2.0.51",
36
37
  "sqlmodel>=0.0.39",
37
- "pymysql>=1.2.0",
38
- "psycopg2-binary>=2.9.12",
39
- "redis>=5.0.0",
40
- "zvec>=0.6.0",
38
+ ]
39
+ dynamic = ["version"]
40
+
41
+ # 关键节点:可选能力全部按 extras 拆分(0.1.4)。各可选依赖仅在对应 Kit/模块
42
+ # 被实际使用时才需安装,且均为延迟导入——不装 extras 时 import kit 与基础 Kit
43
+ # 全部可用,报错信息会提示安装命令:
44
+ # pg → pg_kit(psycopg2)
45
+ # mysql → mysql_kit(pymysql)
46
+ # vec → SQLiteKit 向量方法(numpy/sqliteai-vector,SQLite 向量扩展,业务按需)
47
+ # zvec → zvec_kit(zvec,阿里独立向量库,与 SQLite 向量扩展完全独立)
48
+ # redis → redis_kit
49
+ # mcp → mcp_kit(fastmcp)
50
+ # ai → kit/ai 服务池(httpx)
51
+ # doc → doc_kit(firecrawl-anydoc/pimd/markdown-it-py,fpdf2 由 pimd[pdfa] 带入)
52
+ # mineru → mineru_kit(requests)
53
+ # 基础版 = config/log + kit.db 核心,SQLite 常规操作用标准库 sqlite3,零额外依赖。
54
+ [project.optional-dependencies]
55
+ pg = ["psycopg2-binary>=2.9.12"]
56
+ mysql = ["pymysql>=1.2.0"]
57
+ vec = [
58
+ "numpy>=2.0",
41
59
  "sqliteai-vector>=1.0.0",
60
+ ]
61
+ zvec = ["zvec>=0.6.0"]
62
+ redis = ["redis>=5.0.0"]
63
+ mcp = ["fastmcp>=4.0.3"]
64
+ ai = ["httpx>=0.28.1"]
65
+ doc = [
42
66
  "firecrawl-anydoc>=0.2.4",
43
67
  "pimd[pdfa]>=2.2.5",
44
68
  "markdown-it-py>=3.0",
69
+ ]
70
+ mineru = ["requests>=2.34.0"]
71
+ all = [
72
+ "psycopg2-binary>=2.9.12",
73
+ "pymysql>=1.2.0",
74
+ "numpy>=2.0",
75
+ "sqliteai-vector>=1.0.0",
76
+ "zvec>=0.6.0",
77
+ "redis>=5.0.0",
45
78
  "fastmcp>=4.0.3",
46
79
  "httpx>=0.28.1",
80
+ "firecrawl-anydoc>=0.2.4",
81
+ "pimd[pdfa]>=2.2.5",
82
+ "markdown-it-py>=3.0",
47
83
  "requests>=2.34.0",
48
- "python-dotenv>=1.2.3",
49
84
  ]
50
- dynamic = ["version"]
51
-
52
85
  [tool.hatch.version]
53
86
  path = "kit/__init__.py"
54
87
 
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