sdpy-kit 0.8.0__tar.gz → 0.8.1__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 (70) hide show
  1. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/PKG-INFO +1 -1
  2. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/__init__.py +1 -1
  3. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/agent/loop.py +15 -6
  4. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/agent/mcp.py +3 -1
  5. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/agent/skill.py +6 -1
  6. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/.gitignore +0 -0
  7. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/README.md +0 -0
  8. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/__init__.py +0 -0
  9. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/_internal/__init__.py +0 -0
  10. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/_internal/failover.py +0 -0
  11. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/_internal/pool.py +0 -0
  12. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/_internal/rerank_transport.py +0 -0
  13. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/_internal/retry_after.py +0 -0
  14. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/_internal/sdk_client.py +0 -0
  15. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/_internal/service_base.py +0 -0
  16. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/_internal/types.py +0 -0
  17. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/agent/__init__.py +0 -0
  18. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/agent/approval.py +0 -0
  19. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/agent/errors.py +0 -0
  20. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/agent/registry.py +0 -0
  21. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/agent/session.py +0 -0
  22. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/agent/types.py +0 -0
  23. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/chat_service.py +0 -0
  24. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/decision/__init__.py +0 -0
  25. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/decision/decima.py +0 -0
  26. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/decision/laya.py +0 -0
  27. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/embedding_service.py +0 -0
  28. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/exceptions.py +0 -0
  29. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/image_service.py +0 -0
  30. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/messages.py +0 -0
  31. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/model_builder.py +0 -0
  32. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/model_client.py +0 -0
  33. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/profiles.py +0 -0
  34. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/rerank_service.py +0 -0
  35. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/runner.py +0 -0
  36. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/common_kit.py +0 -0
  37. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/config/__init__.py +0 -0
  38. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/config/kit_config.py +0 -0
  39. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/config/log_config.py +0 -0
  40. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/crawl/__init__.py +0 -0
  41. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/crawl/article_io.py +0 -0
  42. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/crawl/article_models.py +0 -0
  43. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/crawl/deepseek_kit.py +0 -0
  44. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/crawl/web_article_kit.py +0 -0
  45. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/crawl/wx_article_kit.py +0 -0
  46. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/db/__init__.py +0 -0
  47. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/db/audit.py +0 -0
  48. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/db/base_db_kit.py +0 -0
  49. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/db/crud.py +0 -0
  50. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/db/engine.py +0 -0
  51. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/db/exceptions.py +0 -0
  52. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/db/models/__init__.py +0 -0
  53. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/db/models/base.py +0 -0
  54. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/db/mysql_kit.py +0 -0
  55. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/db/pg_kit.py +0 -0
  56. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/db/query.py +0 -0
  57. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/db/session.py +0 -0
  58. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/db/sqlite_kit.py +0 -0
  59. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/db/transaction.py +0 -0
  60. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/docs/__init__.py +0 -0
  61. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/docs/anydoc_kit.py +0 -0
  62. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/docs/docx_kit.py +0 -0
  63. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/docs/marker_kit.py +0 -0
  64. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/docs/md2doc_kit.py +0 -0
  65. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/docs/mineru_kit.py +0 -0
  66. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/docs/rc_docparser_kit.py +0 -0
  67. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/file_kit.py +0 -0
  68. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/license_kit.py +0 -0
  69. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/redis_kit.py +0 -0
  70. {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/pyproject.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: sdpy-kit
3
- Version: 0.8.0
3
+ Version: 0.8.1
4
4
  Summary: SDPY Kit——统一数据库访问层(PG/MySQL/SQLite)与 AI/Redis/文件/文档/向量工具集
5
5
  Author-email: Clark <changhongyuan@126.com>
6
6
  License-Expression: MIT
@@ -23,7 +23,7 @@ Author: Clark Chang
23
23
  数据库访问通过 kit.db 子包提供(基于 SQLModel)。
24
24
  """
25
25
 
26
- __version__ = "0.8.0"
26
+ __version__ = "0.8.1"
27
27
 
28
28
  from kit.db import (
29
29
  MYSQL,
@@ -121,11 +121,13 @@ class Agent:
121
121
  raise ValueError("tool_timeout 必须 > 0")
122
122
  if max_tool_result_chars < 1:
123
123
  raise ValueError("max_tool_result_chars 必须 >= 1")
124
- self._tools: ToolRegistry = tools or ToolRegistry()
124
+ self._tools: ToolRegistry = tools if tools is not None else ToolRegistry()
125
125
  self._skills: SkillRegistry | None = skills
126
126
  self._servers: tuple[McpServerConfig, ...] = tuple(servers)
127
127
  self._system_prompt: str | None = system_prompt or None
128
- self._approval: ApprovalHook = approval or DefaultApproval()
128
+ self._approval: ApprovalHook = (
129
+ approval if approval is not None else DefaultApproval()
130
+ )
129
131
  self._max_turns: int = max_turns
130
132
  self._timeout: float = timeout
131
133
  self._tool_timeout: float = tool_timeout
@@ -133,7 +135,11 @@ class Agent:
133
135
  self._chat: ChatLike | None = chat
134
136
  self._chat_factory: Callable[[str], ChatLike] | None = chat_factory
135
137
  self._model: str | None = model
136
- self._session: Session = session or Session(self._compose_system_prompt())
138
+ self._session: Session = (
139
+ session
140
+ if session is not None
141
+ else Session(self._compose_system_prompt())
142
+ )
137
143
 
138
144
  self._merged: ToolRegistry | None = None
139
145
  self._mcp: list[Any] = []
@@ -302,10 +308,10 @@ class Agent:
302
308
  stop_reason="completed",
303
309
  )
304
310
 
305
- self._append_assistant(prepared, sink, reply)
306
311
  if turn >= self._max_turns:
307
312
  # 最后一轮不再执行工具:没有余量回灌结果,避免无意义副作用
308
313
  raise MaxTurnsExceeded(self._max_turns, turn)
314
+ self._append_assistant(prepared, sink, reply)
309
315
  for call in reply.tool_calls:
310
316
  try:
311
317
  record = await self._dispatch_tool_call(call, deadline, turn)
@@ -409,7 +415,7 @@ class Agent:
409
415
  prepared = self._validate_messages(messages)
410
416
  sink: Session | None = None
411
417
  else:
412
- target = session or self._session
418
+ target = session if session is not None else self._session
413
419
  prepared = self._validate_messages(target.messages())
414
420
  sink = target
415
421
  index = self._skills.index_block() if self._skills is not None else ""
@@ -524,7 +530,10 @@ class Agent:
524
530
  profile = getattr(source, "last_profile", None)
525
531
  if not isinstance(profile, str) or not profile:
526
532
  return
527
- self._locked_chat = self._build_locked_chat(profile)
533
+ try:
534
+ self._locked_chat = self._build_locked_chat(profile)
535
+ except AIError as exc:
536
+ raise AgentModelError(f"锁定档案 {profile!r} 失败: {exc}") from exc
528
537
  logger.info(f"工具循环已锁定档案: {profile}")
529
538
 
530
539
  def _build_locked_chat(self, profile: str) -> ChatLike:
@@ -162,9 +162,11 @@ class McpConnection:
162
162
  """
163
163
  if self._stack is not None:
164
164
  return
165
- client = self._client if self._client is not None else self._build_client()
166
165
  stack = AsyncExitStack()
167
166
  try:
167
+ client = (
168
+ self._client if self._client is not None else self._build_client()
169
+ )
168
170
  async with asyncio.timeout(self._config.connect_timeout):
169
171
  await stack.enter_async_context(client)
170
172
  self._tools = list(await client.list_tools())
@@ -355,7 +355,12 @@ def _parse_script(
355
355
  f"{skill_file} 的脚本 {name!r} 缺少合法 args"
356
356
  "(必须是 type=object 的 JSON Schema)"
357
357
  )
358
- _resolve_within(root, path)
358
+ try:
359
+ _resolve_within(root, path)
360
+ except ToolExecutionError as exc:
361
+ raise SkillValidationError(
362
+ f"{skill_file} 的脚本 {name!r} 路径非法: {exc}"
363
+ ) from exc
359
364
  description = item.get("description", "")
360
365
  if not isinstance(description, str):
361
366
  description = str(description)
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