sdpy-kit 0.6.5__tar.gz → 0.6.6__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 (54) hide show
  1. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/PKG-INFO +13 -1
  2. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/README.md +12 -0
  3. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/__init__.py +1 -1
  4. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/.gitignore +0 -0
  5. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/ai/__init__.py +0 -0
  6. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/ai/base_service.py +0 -0
  7. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/ai/chat_service.py +0 -0
  8. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/ai/embedding_service.py +0 -0
  9. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/ai/exceptions.py +0 -0
  10. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/ai/failover.py +0 -0
  11. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/ai/image_service.py +0 -0
  12. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/ai/model_builder.py +0 -0
  13. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/ai/model_client.py +0 -0
  14. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/ai/pool.py +0 -0
  15. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/ai/profiles.py +0 -0
  16. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/ai/rerank_service.py +0 -0
  17. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/ai/runner.py +0 -0
  18. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/ai/types.py +0 -0
  19. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/common_kit.py +0 -0
  20. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/config/__init__.py +0 -0
  21. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/config/kit_config.py +0 -0
  22. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/config/log_config.py +0 -0
  23. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/crawl/__init__.py +0 -0
  24. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/crawl/article_io.py +0 -0
  25. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/crawl/article_models.py +0 -0
  26. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/crawl/deepseek_kit.py +0 -0
  27. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/crawl/web_article_kit.py +0 -0
  28. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/crawl/wx_article_kit.py +0 -0
  29. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/db/__init__.py +0 -0
  30. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/db/audit.py +0 -0
  31. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/db/base_db_kit.py +0 -0
  32. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/db/crud.py +0 -0
  33. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/db/engine.py +0 -0
  34. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/db/exceptions.py +0 -0
  35. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/db/models/__init__.py +0 -0
  36. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/db/models/base.py +0 -0
  37. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/db/mysql_kit.py +0 -0
  38. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/db/pg_kit.py +0 -0
  39. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/db/query.py +0 -0
  40. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/db/session.py +0 -0
  41. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/db/sqlite_kit.py +0 -0
  42. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/db/transaction.py +0 -0
  43. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/docs/__init__.py +0 -0
  44. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/docs/anydoc_kit.py +0 -0
  45. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/docs/docx_kit.py +0 -0
  46. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/docs/marker_kit.py +0 -0
  47. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/docs/md2doc_kit.py +0 -0
  48. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/docs/mineru_kit.py +0 -0
  49. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/docs/rc_docparser_kit.py +0 -0
  50. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/file_kit.py +0 -0
  51. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/laya_kit.py +0 -0
  52. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/license_kit.py +0 -0
  53. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/kit/redis_kit.py +0 -0
  54. {sdpy_kit-0.6.5 → sdpy_kit-0.6.6}/pyproject.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: sdpy-kit
3
- Version: 0.6.5
3
+ Version: 0.6.6
4
4
  Summary: SDPY Kit——统一数据库访问层(PG/MySQL/SQLite)与 AI/Redis/文件/文档/向量工具集
5
5
  Author-email: Clark <changhongyuan@126.com>
6
6
  License-Expression: MIT
@@ -819,6 +819,7 @@ if not body and stream.truncated and stream.reasoning_chars:
819
819
  ```
820
820
 
821
821
  - 推理字段兼容 `delta.reasoning_content`(GLM / DeepSeek / Qwen)与 `delta.reasoning`(sensenova):只计数不产出;
822
+ - 推理字段名是 kit 内部白名单(当前就是上面两种):新 provider 若用别的字段名,`reasoning_chars` 会恒为 0——此时仍可用 `truncated` 判定是否被截断;
822
823
  - 正文为空且(被截断或发生过思考)时 kit 自行打 `WARNING`,含模型与 `max_tokens`;
823
824
  - `truncated` 覆盖 `finish_reason` 为 `length` 或 `max_tokens` 两种口径;
824
825
  - **字符数 ≠ token 数**(实测中文约 2~2.5 字符/token,各家口径不一),不要用 `reasoning_chars` 反推还差多少预算;
@@ -828,6 +829,11 @@ if not body and stream.truncated and stream.reasoning_chars:
828
829
  > 首帧等待语义:每候选 60 秒内**一帧都没有**(含推理帧)才切下一候选;思考阶段的
829
830
  > 推理帧算活动并重置窗口,不会误判健康模型失败、也不会重放整段 prompt。
830
831
 
832
+ > **非流式(`ask` / `complete`)的同款诊断**:provider 在截断时可能完全不返回 `content` 键,
833
+ > 此时 kit 抛 `AIResponseError`,消息里带 `finish_reason` 与推理字符数(不再只报「content
834
+ > 类型异常」,可直接判断是否被思考吃光);正文为空串时返回 `""` 并打 `WARNING`。
835
+ > 返回类型(`str`)与异常类型均未改变。
836
+
831
837
  > 门面仅面向**同步上下文**;若调用点本身在 async 函数内,请直接 `await` 原生异步服务,避免阻塞事件循环线程。
832
838
  > 模块级另有 `kit.ai.runner.reload_config(...)`、`run_sync(coro_factory, *, timeout=120.0)`、`shutdown()`。
833
839
 
@@ -1383,6 +1389,12 @@ AI 功能需要在项目根目录提供 `config/ai_models.json`(chat / embeddi
1383
1389
  | 档案级 | `extra_body` | 厂商专有请求体字段透传(如 GLM/Qwen 关闭思考的 `{"thinking": {"type": "disabled"}}`、`{"reasoning_effort": "low"}`);与服务构造的同名键冲突时**以服务的值为准**,故 `model` / `messages` / `stream` 等保留键不可覆盖;改名类需求(如 OpenAI o 系列的 `max_completion_tokens`)无法用它实现。改文件后需 `reload_config(reload_file=True)` 生效 |
1384
1390
  | 类型级 | `chain_timeout` | 整链预算秒数(与 `default_profile` 同级);门面同步等待上限。未配置时按 `sum(候选 timeout) + 10s` 自适应,也可用环境变量 `KIT_AI_CHAIN_TIMEOUT` 全局覆盖 |
1385
1391
 
1392
+ > **`extra_body` 的用法边界(档案级开关的坑)**:`AI.chat_* / chat_stream` 固定走**当前候选链头**,
1393
+ > 档案级 `extra_body`(如关闭思考)无法按调用点切换。需要「同一模型,长文开思考、短文关思考」
1394
+ > 并存时,在 `ai_models.json` 里**复制一份档案**(同 `model`、多加 `extra_body`),再用
1395
+ > `ModelBuilder.build_chat("<档案名>")` 取独立异步服务;门面上只能 `AI.use("chat", "<档案名>")`
1396
+ > 临时切换(进程级、非并发安全)。
1397
+
1386
1398
  ### 候选链切换语义(两类,勿混淆)
1387
1399
 
1388
1400
  - **跨调用切换**:`AI.use()` 与其它请求产生的失败冷却均只影响**下一次**请求——每次调用的候选计划在开始时定格;
@@ -743,6 +743,7 @@ if not body and stream.truncated and stream.reasoning_chars:
743
743
  ```
744
744
 
745
745
  - 推理字段兼容 `delta.reasoning_content`(GLM / DeepSeek / Qwen)与 `delta.reasoning`(sensenova):只计数不产出;
746
+ - 推理字段名是 kit 内部白名单(当前就是上面两种):新 provider 若用别的字段名,`reasoning_chars` 会恒为 0——此时仍可用 `truncated` 判定是否被截断;
746
747
  - 正文为空且(被截断或发生过思考)时 kit 自行打 `WARNING`,含模型与 `max_tokens`;
747
748
  - `truncated` 覆盖 `finish_reason` 为 `length` 或 `max_tokens` 两种口径;
748
749
  - **字符数 ≠ token 数**(实测中文约 2~2.5 字符/token,各家口径不一),不要用 `reasoning_chars` 反推还差多少预算;
@@ -752,6 +753,11 @@ if not body and stream.truncated and stream.reasoning_chars:
752
753
  > 首帧等待语义:每候选 60 秒内**一帧都没有**(含推理帧)才切下一候选;思考阶段的
753
754
  > 推理帧算活动并重置窗口,不会误判健康模型失败、也不会重放整段 prompt。
754
755
 
756
+ > **非流式(`ask` / `complete`)的同款诊断**:provider 在截断时可能完全不返回 `content` 键,
757
+ > 此时 kit 抛 `AIResponseError`,消息里带 `finish_reason` 与推理字符数(不再只报「content
758
+ > 类型异常」,可直接判断是否被思考吃光);正文为空串时返回 `""` 并打 `WARNING`。
759
+ > 返回类型(`str`)与异常类型均未改变。
760
+
755
761
  > 门面仅面向**同步上下文**;若调用点本身在 async 函数内,请直接 `await` 原生异步服务,避免阻塞事件循环线程。
756
762
  > 模块级另有 `kit.ai.runner.reload_config(...)`、`run_sync(coro_factory, *, timeout=120.0)`、`shutdown()`。
757
763
 
@@ -1307,6 +1313,12 @@ AI 功能需要在项目根目录提供 `config/ai_models.json`(chat / embeddi
1307
1313
  | 档案级 | `extra_body` | 厂商专有请求体字段透传(如 GLM/Qwen 关闭思考的 `{"thinking": {"type": "disabled"}}`、`{"reasoning_effort": "low"}`);与服务构造的同名键冲突时**以服务的值为准**,故 `model` / `messages` / `stream` 等保留键不可覆盖;改名类需求(如 OpenAI o 系列的 `max_completion_tokens`)无法用它实现。改文件后需 `reload_config(reload_file=True)` 生效 |
1308
1314
  | 类型级 | `chain_timeout` | 整链预算秒数(与 `default_profile` 同级);门面同步等待上限。未配置时按 `sum(候选 timeout) + 10s` 自适应,也可用环境变量 `KIT_AI_CHAIN_TIMEOUT` 全局覆盖 |
1309
1315
 
1316
+ > **`extra_body` 的用法边界(档案级开关的坑)**:`AI.chat_* / chat_stream` 固定走**当前候选链头**,
1317
+ > 档案级 `extra_body`(如关闭思考)无法按调用点切换。需要「同一模型,长文开思考、短文关思考」
1318
+ > 并存时,在 `ai_models.json` 里**复制一份档案**(同 `model`、多加 `extra_body`),再用
1319
+ > `ModelBuilder.build_chat("<档案名>")` 取独立异步服务;门面上只能 `AI.use("chat", "<档案名>")`
1320
+ > 临时切换(进程级、非并发安全)。
1321
+
1310
1322
  ### 候选链切换语义(两类,勿混淆)
1311
1323
 
1312
1324
  - **跨调用切换**:`AI.use()` 与其它请求产生的失败冷却均只影响**下一次**请求——每次调用的候选计划在开始时定格;
@@ -23,7 +23,7 @@ Author: Clark Chang
23
23
  数据库访问通过 kit.db 子包提供(基于 SQLModel)。
24
24
  """
25
25
 
26
- __version__ = "0.6.5"
26
+ __version__ = "0.6.6"
27
27
 
28
28
  from kit.db import (
29
29
  MYSQL,
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
File without changes