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.
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/PKG-INFO +1 -1
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/__init__.py +1 -1
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/agent/loop.py +15 -6
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/agent/mcp.py +3 -1
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/agent/skill.py +6 -1
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/.gitignore +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/README.md +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/__init__.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/_internal/__init__.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/_internal/failover.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/_internal/pool.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/_internal/rerank_transport.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/_internal/retry_after.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/_internal/sdk_client.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/_internal/service_base.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/_internal/types.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/agent/__init__.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/agent/approval.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/agent/errors.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/agent/registry.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/agent/session.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/agent/types.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/chat_service.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/decision/__init__.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/decision/decima.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/decision/laya.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/embedding_service.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/exceptions.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/image_service.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/messages.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/model_builder.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/model_client.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/profiles.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/rerank_service.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/ai/runner.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/common_kit.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/config/__init__.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/config/kit_config.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/config/log_config.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/crawl/__init__.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/crawl/article_io.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/crawl/article_models.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/crawl/deepseek_kit.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/crawl/web_article_kit.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/crawl/wx_article_kit.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/db/__init__.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/db/audit.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/db/base_db_kit.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/db/crud.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/db/engine.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/db/exceptions.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/db/models/__init__.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/db/models/base.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/db/mysql_kit.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/db/pg_kit.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/db/query.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/db/session.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/db/sqlite_kit.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/db/transaction.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/docs/__init__.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/docs/anydoc_kit.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/docs/docx_kit.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/docs/marker_kit.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/docs/md2doc_kit.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/docs/mineru_kit.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/docs/rc_docparser_kit.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/file_kit.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/license_kit.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/kit/redis_kit.py +0 -0
- {sdpy_kit-0.8.0 → sdpy_kit-0.8.1}/pyproject.toml +0 -0
|
@@ -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
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|