diff --git a/src/agentkit/skills/base.py b/src/agentkit/skills/base.py index 88b7d2b..8b7a838 100644 --- a/src/agentkit/skills/base.py +++ b/src/agentkit/skills/base.py @@ -4,7 +4,6 @@ from __future__ import annotations import logging from dataclasses import dataclass, field -from typing import Any from agentkit.core.config_driven import AgentConfig from agentkit.core.exceptions import ConfigValidationError @@ -66,27 +65,27 @@ class SkillConfig(AgentConfig): task_mode: str = "llm_generate", supported_tasks: list[str] | None = None, max_concurrency: int = 1, - input_schema: dict[str, Any] | None = None, - output_schema: dict[str, Any] | None = None, + input_schema: dict[str, object] | None = None, + output_schema: dict[str, object] | None = None, prompt: dict[str, str] | None = None, - llm: dict[str, Any] | None = None, + llm: dict[str, object] | None = None, tools: list[str] | None = None, - memory: dict[str, Any] | None = None, + memory: dict[str, object] | None = None, custom_handler: str | None = None, # v2 新增字段 - intent: dict[str, Any] | None = None, - quality_gate: dict[str, Any] | None = None, + intent: dict[str, object] | None = None, + quality_gate: dict[str, object] | None = None, execution_mode: str = "react", max_steps: int = 5, - evolution: dict[str, Any] | None = None, + evolution: dict[str, object] | None = None, # v3 新增字段:SKILL.md 支持 skill_md_path: str | None = None, disclosure_level: int = 1, # 默认全量加载,向后兼容;0=概要模式需显式指定 # v4 新增字段:依赖声明、能力标签 - dependencies: list[dict[str, Any] | DependencyDecl] | None = None, - capabilities: list[str | dict[str, Any] | CapabilityTag] | None = None, + dependencies: list[dict[str, object] | DependencyDecl] | None = None, + capabilities: list[str | dict[str, object] | CapabilityTag] | None = None, # v5 新增字段:对齐守卫 - alignment: dict[str, Any] | None = None, + alignment: dict[str, object] | None = None, # v6 新增字段:ReWOO fallback 策略(YAML 可配置) fallback_strategies: list[str] | None = None, # v7 新增字段:激活前置条件 + 来源标记(SkillHarness preconditions / provenance) @@ -163,7 +162,7 @@ class SkillConfig(AgentConfig): @staticmethod def _parse_dependencies( - raw: list[dict[str, Any] | DependencyDecl], + raw: list[dict[str, object] | DependencyDecl], ) -> list[DependencyDecl]: """解析依赖声明列表,支持 dict 或 DependencyDecl 实例""" result: list[DependencyDecl] = [] @@ -178,7 +177,7 @@ class SkillConfig(AgentConfig): @staticmethod def _parse_capabilities( - raw: list[str | dict[str, Any] | CapabilityTag], + raw: list[str | dict[str, object] | CapabilityTag], ) -> list[CapabilityTag]: """解析能力标签列表,支持 str / dict / CapabilityTag 实例""" result: list[CapabilityTag] = [] @@ -194,7 +193,7 @@ class SkillConfig(AgentConfig): return result @classmethod - def from_dict(cls, data: dict[str, Any]) -> "SkillConfig": + def from_dict(cls, data: dict[str, object]) -> "SkillConfig": """从字典创建配置""" return cls( name=data["name"], @@ -241,7 +240,7 @@ class SkillConfig(AgentConfig): ) return cls.from_dict(data) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> dict[str, object]: """序列化为字典,包含 v2 字段""" d = super().to_dict() d["intent"] = { diff --git a/src/agentkit/skills/geo_pipeline.py b/src/agentkit/skills/geo_pipeline.py index d13dd1e..950c7d2 100644 --- a/src/agentkit/skills/geo_pipeline.py +++ b/src/agentkit/skills/geo_pipeline.py @@ -10,7 +10,6 @@ import asyncio import logging import uuid from dataclasses import dataclass, field -from typing import Any from agentkit.core.protocol import TaskMessage from agentkit.core.shared_workspace import SharedWorkspace @@ -42,7 +41,7 @@ class PipelineStepResult: step_name: str skill: str status: str # "success", "failed", "skipped" - output: dict[str, Any] | None = None + output: dict[str, object] | None = None error: str | None = None duration_ms: float = 0 @@ -54,7 +53,7 @@ class PipelineResult: pipeline_name: str execution_id: str steps: list[PipelineStepResult] - final_output: dict[str, Any] | None + final_output: dict[str, object] | None success: bool total_duration_ms: float @@ -79,7 +78,7 @@ class GEOPipeline: name: str, steps: list[PipelineStep], skill_registry: SkillRegistry | None = None, - agent_pool: Any = None, + agent_pool: object = None, workspace: SharedWorkspace | None = None, ): self.name = name @@ -92,9 +91,9 @@ class GEOPipeline: @classmethod def from_config( cls, - config: dict[str, Any], + config: dict[str, object], skill_registry: SkillRegistry | None = None, - agent_pool: Any = None, + agent_pool: object = None, workspace: SharedWorkspace | None = None, ) -> GEOPipeline: """从 YAML 配置创建 Pipeline @@ -136,7 +135,7 @@ class GEOPipeline: workspace=workspace, ) - async def execute(self, input_data: dict[str, Any]) -> PipelineResult: + async def execute(self, input_data: dict[str, object]) -> PipelineResult: """执行 Pipeline Args: @@ -150,7 +149,7 @@ class GEOPipeline: start_time = time.monotonic() execution_id = str(uuid.uuid4())[:8] step_results: list[PipelineStepResult] = [] - step_outputs: dict[str, dict[str, Any]] = {} + step_outputs: dict[str, dict[str, object]] = {} # Store initial input in workspace await self._workspace.write( @@ -227,8 +226,8 @@ class GEOPipeline: async def _execute_step( self, step: PipelineStep, - input_data: dict[str, Any], - step_outputs: dict[str, dict[str, Any]], + input_data: dict[str, object], + step_outputs: dict[str, dict[str, object]], execution_id: str, saga: SagaOrchestrator, ) -> PipelineStepResult: @@ -294,8 +293,8 @@ class GEOPipeline: ) async def _execute_skill( - self, skill_name: str, input_data: dict[str, Any] - ) -> dict[str, Any]: + self, skill_name: str, input_data: dict[str, object] + ) -> dict[str, object]: """执行 Skill""" if self._agent_pool: agent = self._agent_pool.get_agent(skill_name) @@ -361,9 +360,9 @@ class GEOPipeline: def _map_input( self, step: PipelineStep, - input_data: dict[str, Any], - step_outputs: dict[str, dict[str, Any]], - ) -> dict[str, Any]: + input_data: dict[str, object], + step_outputs: dict[str, dict[str, object]], + ) -> dict[str, object]: """根据 input_mapping 构建步骤输入 映射格式: {"target_key": "source_path"} @@ -379,7 +378,7 @@ class GEOPipeline: merged.update(step_outputs[dep]) return merged - mapped: dict[str, Any] = {} + mapped: dict[str, object] = {} for target_key, source_path in step.input_mapping.items(): value = self._resolve_mapping_path(source_path, input_data, step_outputs) if value is not None: @@ -390,9 +389,9 @@ class GEOPipeline: @staticmethod def _resolve_mapping_path( path: str, - input_data: dict[str, Any], - step_outputs: dict[str, dict[str, Any]], - ) -> Any: + input_data: dict[str, object], + step_outputs: dict[str, dict[str, object]], + ) -> object: """解析映射路径""" if path.startswith("$.input."): key = path[len("$.input."):] @@ -416,7 +415,7 @@ class GEOPipeline: return None def _evaluate_condition( - self, condition: str, input_data: dict[str, Any], step_outputs: dict[str, Any] + self, condition: str, input_data: dict[str, object], step_outputs: dict[str, object] ) -> bool: """评估条件表达式""" import re @@ -435,9 +434,9 @@ class GEOPipeline: def _build_final_output( self, - step_outputs: dict[str, dict[str, Any]], - input_data: dict[str, Any], - ) -> dict[str, Any]: + step_outputs: dict[str, dict[str, object]], + input_data: dict[str, object], + ) -> dict[str, object]: """构建最终输出""" final = {"input": input_data} for step_name, output in step_outputs.items(): diff --git a/src/agentkit/skills/pipeline.py b/src/agentkit/skills/pipeline.py index d5b7972..a7d2985 100644 --- a/src/agentkit/skills/pipeline.py +++ b/src/agentkit/skills/pipeline.py @@ -8,9 +8,8 @@ import logging import re -from typing import Any, Callable, Coroutine +from typing import Callable, Coroutine -from agentkit.skills.base import Skill, SkillConfig from agentkit.skills.registry import SkillRegistry logger = logging.getLogger(__name__) @@ -28,7 +27,7 @@ class SkillPipeline: def __init__( self, name: str, - steps: list[dict[str, Any]], + steps: list[dict[str, object]], skill_registry: SkillRegistry | None = None, ): """ @@ -43,9 +42,9 @@ class SkillPipeline: async def execute( self, - input_data: dict[str, Any], + input_data: dict[str, object], agent_factory: Callable[..., Coroutine] | None = None, - ) -> dict[str, Any]: + ) -> dict[str, object]: """顺序执行 Pipeline 中所有步骤 Args: @@ -57,8 +56,8 @@ class SkillPipeline: 包含 pipeline 名称、各步骤结果和最终输出的字典 """ success = True - current_input: dict[str, Any] = input_data - results: list[dict[str, Any]] = [] + current_input: dict[str, object] = input_data + results: list[dict[str, object]] = [] for i, step_def in enumerate(self._steps): skill_name = step_def["skill_name"] @@ -112,9 +111,9 @@ class SkillPipeline: async def _execute_skill( self, skill_name: str, - input_data: dict[str, Any], + input_data: dict[str, object], agent_factory: Callable[..., Coroutine] | None = None, - ) -> dict[str, Any]: + ) -> dict[str, object]: """执行单个 Skill 优先使用 agent_factory,其次通过 SkillRegistry 查找 Skill 并创建 Agent 执行。 @@ -152,8 +151,8 @@ class SkillPipeline: def _evaluate_condition( self, condition: str, - current_input: dict[str, Any], - results: list[dict[str, Any]], + current_input: dict[str, object], + results: list[dict[str, object]], ) -> bool: """评估简单条件表达式 @@ -180,10 +179,10 @@ class SkillPipeline: return False @staticmethod - def _resolve_path(path: str, data: dict[str, Any]) -> Any: + def _resolve_path(path: str, data: dict[str, object]) -> object: """解析点号路径,如 'output.score'""" parts = path.split(".") - obj: Any = data + obj: object = data for part in parts: if isinstance(obj, dict): obj = obj.get(part) @@ -193,15 +192,15 @@ class SkillPipeline: def _map_input( self, - current_input: dict[str, Any], + current_input: dict[str, object], mapping: dict[str, str], - results: list[dict[str, Any]], - ) -> dict[str, Any]: + results: list[dict[str, object]], + ) -> dict[str, object]: """根据映射规则将上一步输出映射到当前步骤输入 mapping 格式: {"target_key": "source.path"} """ - mapped: dict[str, Any] = {} + mapped: dict[str, object] = {} for target_key, source_path in mapping.items(): value = self._resolve_path(source_path, current_input) if value is not None: diff --git a/src/agentkit/skills/registry.py b/src/agentkit/skills/registry.py index 10aaf28..ef6b9a9 100644 --- a/src/agentkit/skills/registry.py +++ b/src/agentkit/skills/registry.py @@ -7,7 +7,7 @@ from typing import TYPE_CHECKING from agentkit.core.exceptions import SkillNotFoundError from agentkit.skills.base import Skill, SkillConfig -from agentkit.skills.schema import DependencyDecl, HealthCheckResult +from agentkit.skills.schema import HealthCheckResult if TYPE_CHECKING: from agentkit.skills.pipeline import SkillPipeline diff --git a/src/agentkit/skills/schema.py b/src/agentkit/skills/schema.py index 4b8ccb8..a6e3b73 100644 --- a/src/agentkit/skills/schema.py +++ b/src/agentkit/skills/schema.py @@ -8,7 +8,6 @@ from __future__ import annotations import logging from dataclasses import dataclass, field -from typing import Any logger = logging.getLogger(__name__) @@ -67,13 +66,13 @@ class SkillSpec: description: str = "" capabilities: list[CapabilityTag] = field(default_factory=list) dependencies: list[DependencyDecl] = field(default_factory=list) - input_schema: dict[str, Any] | None = None - output_schema: dict[str, Any] | None = None - quality_gate: dict[str, Any] | None = None - metadata: dict[str, Any] = field(default_factory=dict) + input_schema: dict[str, object] | None = None + output_schema: dict[str, object] | None = None + quality_gate: dict[str, object] | None = None + metadata: dict[str, object] = field(default_factory=dict) @classmethod - def from_dict(cls, data: dict[str, Any]) -> SkillSpec: + def from_dict(cls, data: dict[str, object]) -> SkillSpec: """从字典创建 SkillSpec""" capabilities = [ CapabilityTag(**cap) if isinstance(cap, dict) else cap @@ -95,9 +94,9 @@ class SkillSpec: metadata=data.get("metadata", {}), ) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> dict[str, object]: """序列化为字典""" - d: dict[str, Any] = { + d: dict[str, object] = { "name": self.name, "version": self.version, "description": self.description, @@ -165,7 +164,7 @@ class HealthCheckResult: version_mismatches: list[str] = field(default_factory=list) warnings: list[str] = field(default_factory=list) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> dict[str, object]: return { "skill_name": self.skill_name, "skill_version": self.skill_version, diff --git a/src/agentkit/skills/skill_detail.py b/src/agentkit/skills/skill_detail.py index f2882be..00b9c38 100644 --- a/src/agentkit/skills/skill_detail.py +++ b/src/agentkit/skills/skill_detail.py @@ -12,7 +12,6 @@ constraints/output_format),从本地 SkillRegistry 检索。 from __future__ import annotations import logging -from typing import Any from agentkit.chat.skill_routing import collect_prompt_parts, format_preconditions_block from agentkit.core.exceptions import SkillNotFoundError @@ -36,7 +35,7 @@ class SkillDetailTool(Tool): def __init__( self, - skill_registry: Any, + skill_registry: object, name: str = "skill_detail", description: str = ( "Load full instructions for a registered skill by name or keyword. " @@ -44,8 +43,8 @@ class SkillDetailTool(Tool): "and you need the complete instructions to execute the skill. " "Returns the skill's identity, context, instructions, constraints, and output format." ), - input_schema: dict[str, Any] | None = None, - output_schema: dict[str, Any] | None = None, + input_schema: dict[str, object] | None = None, + output_schema: dict[str, object] | None = None, version: str = "1.0.0", tags: list[str] | None = None, ): @@ -97,7 +96,7 @@ class SkillDetailTool(Tool): pass # 非精确匹配,降级到关键词搜索 # 关键词搜索:匹配 skill 名称和描述 - matches: list[Any] = [] + matches: list[object] = [] query_lower = query.lower() for skill in self._registry.list_skills(): name = skill.name.lower() @@ -117,7 +116,7 @@ class SkillDetailTool(Tool): return self._format_skill_full(matches[0]) @staticmethod - def _format_skill_full(skill: Any) -> dict[str, Any]: + def _format_skill_full(skill: object) -> dict[str, object]: """格式化 skill 的完整 instructions 供 LLM 使用。""" config = skill.config prompt_parts = collect_prompt_parts(config, with_headers=True) diff --git a/src/agentkit/skills/skill_md.py b/src/agentkit/skills/skill_md.py index c8d9c3d..bd6c49f 100644 --- a/src/agentkit/skills/skill_md.py +++ b/src/agentkit/skills/skill_md.py @@ -8,7 +8,6 @@ import logging import re -from typing import Any import yaml @@ -27,7 +26,7 @@ class SkillMdParser: """ @staticmethod - def parse(file_path: str) -> tuple[dict[str, Any], dict[str, str], str]: + def parse(file_path: str) -> tuple[dict[str, object], dict[str, str], str]: """解析 SKILL.md 文件 Note: Only H1 headings (# ) are treated as section delimiters. @@ -48,7 +47,7 @@ class SkillMdParser: content = f.read() # 提取 YAML frontmatter(--- 标记之间) - frontmatter: dict[str, Any] = {} + frontmatter: dict[str, object] = {} body = content if content.startswith("---"): parts = content.split("---", 2) @@ -81,7 +80,7 @@ class SkillMdParser: @staticmethod def to_skill_config( - frontmatter: dict[str, Any], + frontmatter: dict[str, object], sections: dict[str, str], file_path: str, disclosure_level: int = 1, @@ -99,7 +98,7 @@ class SkillMdParser: """ # 构建 IntentConfig intent_data = frontmatter.get("intent") or {} - intent_config_data: dict[str, Any] = { + intent_config_data: dict[str, object] = { "keywords": intent_data.get("keywords", []), "description": intent_data.get("description", ""), "examples": intent_data.get("examples", []), @@ -107,7 +106,7 @@ class SkillMdParser: # 构建 QualityGateConfig qg_data = frontmatter.get("quality_gate") or {} - quality_gate_config_data: dict[str, Any] = { + quality_gate_config_data: dict[str, object] = { "required_fields": qg_data.get("required_fields", []), "min_word_count": qg_data.get("min_word_count", 0), "max_retries": qg_data.get("max_retries", 0), diff --git a/src/agentkit/tools/advance_phase.py b/src/agentkit/tools/advance_phase.py index b750d3f..a1c0cdc 100644 --- a/src/agentkit/tools/advance_phase.py +++ b/src/agentkit/tools/advance_phase.py @@ -7,7 +7,7 @@ The LLM calls this tool to signal "I'm done planning, move to building". from __future__ import annotations import logging -from typing import TYPE_CHECKING, Any +from typing import TYPE_CHECKING from agentkit.tools.base import Tool @@ -55,7 +55,7 @@ class AdvancePhaseTool(Tool): ) self._engine = engine - async def execute(self, **kwargs) -> dict[str, Any]: + async def execute(self, **kwargs) -> dict[str, object]: # Capture previous phase before transition (engine is single-threaded per request). previous = self._engine.current_phase new_phase = self._engine.advance_phase() diff --git a/src/agentkit/tools/agent_tool.py b/src/agentkit/tools/agent_tool.py index bacf7e0..eec544f 100644 --- a/src/agentkit/tools/agent_tool.py +++ b/src/agentkit/tools/agent_tool.py @@ -1,7 +1,5 @@ """AgentTool - 将 Agent 包装为 Tool""" -from typing import Any - from agentkit.tools.base import Tool @@ -36,7 +34,7 @@ class AgentTool(Tool): self.timeout_seconds = timeout_seconds self._dispatcher = None - def set_dispatcher(self, dispatcher: Any) -> "AgentTool": + def set_dispatcher(self, dispatcher: object) -> "AgentTool": """注入 Dispatcher""" self._dispatcher = dispatcher return self diff --git a/src/agentkit/tools/ask_human.py b/src/agentkit/tools/ask_human.py index 0fc9a9b..34e6a88 100644 --- a/src/agentkit/tools/ask_human.py +++ b/src/agentkit/tools/ask_human.py @@ -10,7 +10,6 @@ from __future__ import annotations import asyncio import logging import uuid -from typing import Any from agentkit.tools.base import Tool @@ -42,12 +41,12 @@ class AskHumanTool(Tool): # request_id -> asyncio.Future self._pending_replies: dict[str, asyncio.Future] | None = None # Callback to push question to client - self._ask_callback: Any = None + self._ask_callback: object = None def configure( self, pending_replies: dict[str, asyncio.Future] | None = None, - ask_callback: Any = None, + ask_callback: object = None, ) -> None: """Configure the tool with WebSocket communication channels. @@ -61,7 +60,7 @@ class AskHumanTool(Tool): self._ask_callback = ask_callback @property - def parameters(self) -> dict[str, Any]: + def parameters(self) -> dict[str, object]: return { "type": "object", "properties": { @@ -78,7 +77,7 @@ class AskHumanTool(Tool): "required": ["question"], } - async def execute(self, **kwargs: Any) -> dict: + async def execute(self, **kwargs: object) -> dict: """Ask the user a question and wait for their reply. Args: diff --git a/src/agentkit/tools/baidu_search.py b/src/agentkit/tools/baidu_search.py index e3f76da..0f24de3 100644 --- a/src/agentkit/tools/baidu_search.py +++ b/src/agentkit/tools/baidu_search.py @@ -7,7 +7,6 @@ import json import logging import urllib.parse -from typing import Any import httpx @@ -30,8 +29,8 @@ class BaiduSearchTool(Tool): self, name: str = "baidu_search", description: str = "执行百度搜索,返回搜索结果列表", - input_schema: dict[str, Any] | None = None, - output_schema: dict[str, Any] | None = None, + input_schema: dict[str, object] | None = None, + output_schema: dict[str, object] | None = None, version: str = "1.0.0", tags: list[str] | None = None, api_key: str | None = None, @@ -49,7 +48,7 @@ class BaiduSearchTool(Tool): self._api_url = api_url @staticmethod - def _default_input_schema() -> dict[str, Any]: + def _default_input_schema() -> dict[str, object]: return { "type": "object", "properties": { @@ -67,7 +66,7 @@ class BaiduSearchTool(Tool): } @staticmethod - def _default_output_schema() -> dict[str, Any]: + def _default_output_schema() -> dict[str, object]: return { "type": "object", "properties": { diff --git a/src/agentkit/tools/base.py b/src/agentkit/tools/base.py index c54913e..65441e9 100644 --- a/src/agentkit/tools/base.py +++ b/src/agentkit/tools/base.py @@ -2,7 +2,6 @@ import time from abc import ABC, abstractmethod -from typing import Any import jsonschema @@ -23,7 +22,7 @@ class ToolValidationError(Exception): message: str, *, error_code: str = "schema_mismatch", - details: dict[str, Any] | None = None, + details: dict[str, object] | None = None, ) -> None: super().__init__(message) self.error_code = error_code @@ -40,8 +39,8 @@ class Tool(ABC): self, name: str, description: str, - input_schema: dict[str, Any] | None = None, - output_schema: dict[str, Any] | None = None, + input_schema: dict[str, object] | None = None, + output_schema: dict[str, object] | None = None, version: str = "1.0.0", tags: list[str] | None = None, ): @@ -99,7 +98,7 @@ class Tool(ABC): finally: _span_cm.__exit__(None, None, None) - def _validate_input(self, kwargs: dict[str, Any]) -> None: + def _validate_input(self, kwargs: dict[str, object]) -> None: """校验 kwargs 是否符合 self.input_schema。 - input_schema=None → 跳过(向后兼容,旧工具无 schema) diff --git a/src/agentkit/tools/bitable_tool.py b/src/agentkit/tools/bitable_tool.py index b8d44cb..4015107 100644 --- a/src/agentkit/tools/bitable_tool.py +++ b/src/agentkit/tools/bitable_tool.py @@ -16,7 +16,6 @@ from __future__ import annotations import asyncio import logging -from typing import Any import httpx @@ -140,7 +139,7 @@ class BitableTool(Tool): if self._client is not None and not self._client.is_closed: await self._client.aclose() - async def execute(self, **kwargs) -> dict[str, Any]: + async def execute(self, **kwargs) -> dict[str, object]: action = kwargs.get("action") handlers = { "create_table": self._create_table, @@ -169,7 +168,7 @@ class BitableTool(Tool): # create_table # ------------------------------------------------------------------ - async def _create_table(self, **kwargs) -> dict[str, Any]: + async def _create_table(self, **kwargs) -> dict[str, object]: table_name = kwargs.get("table_name") if not table_name: return {"success": False, "error": "Missing required field: table_name"} @@ -186,7 +185,7 @@ class BitableTool(Tool): # import_excel # ------------------------------------------------------------------ - async def _import_excel(self, **kwargs) -> dict[str, Any]: + async def _import_excel(self, **kwargs) -> dict[str, object]: file_path = kwargs.get("file_path") file_url = kwargs.get("file_url") if not file_path and not file_url: @@ -201,13 +200,13 @@ class BitableTool(Tool): if not sheets: return {"success": False, "error": "Excel file has no sheets with data"} - results: list[dict[str, Any]] = [] + results: list[dict[str, object]] = [] for sheet in sheets: result = await self._import_sheet(sheet) results.append(result) return {"success": True, "sheets": results} - async def _import_sheet(self, sheet: ParsedSheet) -> dict[str, Any]: + async def _import_sheet(self, sheet: ParsedSheet) -> dict[str, object]: """Create a bitable table from a parsed sheet and upsert all rows.""" client = await self._get_client() @@ -253,13 +252,13 @@ class BitableTool(Tool): } async def _batch_create_records( - self, table_id: str, records: list[dict[str, Any]] - ) -> dict[str, Any]: + self, table_id: str, records: list[dict[str, object]] + ) -> dict[str, object]: """Create records in batches via POST /tables/{id}/records.""" client = await self._get_client() total = len(records) successful = 0 - errors: list[dict[str, Any]] = [] + errors: list[dict[str, object]] = [] for start in range(0, total, BATCH_SIZE): batch = records[start : start + BATCH_SIZE] @@ -292,7 +291,7 @@ class BitableTool(Tool): # import_database # ------------------------------------------------------------------ - async def _import_database(self, **kwargs) -> dict[str, Any]: + async def _import_database(self, **kwargs) -> dict[str, object]: conn_str = kwargs.get("connection_string") table_names = kwargs.get("table_names") if not conn_str: @@ -300,7 +299,7 @@ class BitableTool(Tool): if not table_names: return {"success": False, "error": "Missing required field: table_names"} - results: list[dict[str, Any]] = [] + results: list[dict[str, object]] = [] for src_table in table_names: try: # Offload sync DB reflection to thread pool (P2 #21-23). @@ -313,7 +312,7 @@ class BitableTool(Tool): results.append({"table_name": src_table, "success": False, "error": str(e)}) return {"success": True, "tables": results} - async def _import_reflected_table(self, reflected: dict[str, Any]) -> dict[str, Any]: + async def _import_reflected_table(self, reflected: dict[str, object]) -> dict[str, object]: """Create a bitable table from reflected DB data and upsert rows.""" client = await self._get_client() table_name = reflected["table_name"] @@ -376,7 +375,7 @@ class BitableTool(Tool): # collect_api # ------------------------------------------------------------------ - async def _collect_api(self, **kwargs) -> dict[str, Any]: + async def _collect_api(self, **kwargs) -> dict[str, object]: table_id = kwargs.get("table_id") records = kwargs.get("records") field_mapping = kwargs.get("field_mapping") @@ -403,7 +402,7 @@ class BitableTool(Tool): # upsert_records # ------------------------------------------------------------------ - async def _upsert_records(self, **kwargs) -> dict[str, Any]: + async def _upsert_records(self, **kwargs) -> dict[str, object]: table_id = kwargs.get("table_id") records = kwargs.get("records") pk_field_id = kwargs.get("primary_key_field_id") @@ -421,13 +420,13 @@ class BitableTool(Tool): return {"success": True, **result} async def _batch_upsert( - self, table_id: str, records: list[dict[str, Any]], pk_field_id: str - ) -> dict[str, Any]: + self, table_id: str, records: list[dict[str, object]], pk_field_id: str + ) -> dict[str, object]: """Upsert records in batches of BATCH_SIZE via POST /tables/{id}/upsert.""" client = await self._get_client() total = len(records) successful = 0 - errors: list[dict[str, Any]] = [] + errors: list[dict[str, object]] = [] for start in range(0, total, BATCH_SIZE): batch = records[start : start + BATCH_SIZE] @@ -464,13 +463,13 @@ class BitableTool(Tool): # query_records # ------------------------------------------------------------------ - async def _query_records(self, **kwargs) -> dict[str, Any]: + async def _query_records(self, **kwargs) -> dict[str, object]: table_id = kwargs.get("table_id") if not table_id: return {"success": False, "error": "Missing required field: table_id"} client = await self._get_client() - params: dict[str, Any] = {} + params: dict[str, object] = {} if kwargs.get("cursor"): params["cursor"] = kwargs["cursor"] if kwargs.get("limit"): diff --git a/src/agentkit/tools/builtin.py b/src/agentkit/tools/builtin.py index 44cf1a6..0a86718 100644 --- a/src/agentkit/tools/builtin.py +++ b/src/agentkit/tools/builtin.py @@ -3,7 +3,7 @@ from __future__ import annotations import logging -from typing import TYPE_CHECKING, Any +from typing import TYPE_CHECKING from agentkit.tools.base import Tool @@ -24,8 +24,8 @@ class RunTestsTool(Tool): self, name: str = "run_tests", description: str = "Run project tests to verify code changes. Executes pytest and linting commands.", - input_schema: dict[str, Any] | None = None, - output_schema: dict[str, Any] | None = None, + input_schema: dict[str, object] | None = None, + output_schema: dict[str, object] | None = None, version: str = "1.0.0", tags: list[str] | None = None, working_dir: str | None = None, @@ -45,7 +45,7 @@ class RunTestsTool(Tool): self._max_retries = max_retries @staticmethod - def _default_input_schema() -> dict[str, Any]: + def _default_input_schema() -> dict[str, object]: return { "type": "object", "properties": { @@ -112,8 +112,8 @@ class ToolSearchTool(Tool): "Returns full descriptions (name, description, parameters) of matching tools. " "Use this when you need details about a tool that was only listed by name." ), - input_schema: dict[str, Any] | None = None, - output_schema: dict[str, Any] | None = None, + input_schema: dict[str, object] | None = None, + output_schema: dict[str, object] | None = None, version: str = "1.0.0", tags: list[str] | None = None, top_k: int = 5, @@ -176,7 +176,7 @@ class ToolSearchTool(Tool): } @staticmethod - def _format_tool_full(tool: Tool) -> dict[str, Any]: + def _format_tool_full(tool: Tool) -> dict[str, object]: """Format a tool's full description for the LLM.""" return { "name": tool.name, diff --git a/src/agentkit/tools/calendar_tool.py b/src/agentkit/tools/calendar_tool.py index 75a36c7..dcd0f9f 100644 --- a/src/agentkit/tools/calendar_tool.py +++ b/src/agentkit/tools/calendar_tool.py @@ -13,7 +13,6 @@ from __future__ import annotations import re from datetime import datetime, timedelta -from typing import Any from agentkit.calendar.models import ReminderRule from agentkit.calendar.service import CalendarService @@ -321,14 +320,14 @@ class CalendarTool(Tool): """ self._default_user_id = user_id - def _resolve_user_id(self, kwargs: dict[str, Any]) -> str | None: + def _resolve_user_id(self, kwargs: dict[str, object]) -> str | None: """Resolve user_id: prefer caller-provided, fall back to default.""" provided = kwargs.get("user_id") if provided and isinstance(provided, str) and provided.strip(): return provided return self._default_user_id - async def execute(self, **kwargs) -> dict[str, Any]: + async def execute(self, **kwargs) -> dict[str, object]: action = kwargs.get("action") if action == "create_event": @@ -345,7 +344,7 @@ class CalendarTool(Tool): # create_event # ------------------------------------------------------------------ - async def _create_event(self, **kwargs) -> dict[str, Any]: + async def _create_event(self, **kwargs) -> dict[str, object]: user_id = self._resolve_user_id(kwargs) title = kwargs.get("title") start_time = kwargs.get("start_time") @@ -494,7 +493,7 @@ class CalendarTool(Tool): # query_events # ------------------------------------------------------------------ - async def _query_events(self, **kwargs) -> dict[str, Any]: + async def _query_events(self, **kwargs) -> dict[str, object]: user_id = self._resolve_user_id(kwargs) if not user_id: return {"success": False, "error": "Missing required field: user_id"} @@ -519,7 +518,7 @@ class CalendarTool(Tool): # update_event # ------------------------------------------------------------------ - async def _update_event(self, **kwargs) -> dict[str, Any]: + async def _update_event(self, **kwargs) -> dict[str, object]: event_id = kwargs.get("event_id") user_id = self._resolve_user_id(kwargs) if not event_id: @@ -536,7 +535,7 @@ class CalendarTool(Tool): # Build fields dict from updatable params (only those explicitly provided) updatable = ["title", "description", "location", "is_all_day"] - fields: dict[str, Any] = {} + fields: dict[str, object] = {} for key in updatable: if key in kwargs and kwargs[key] is not None: fields[key] = kwargs[key] @@ -565,7 +564,7 @@ class CalendarTool(Tool): # delete_event # ------------------------------------------------------------------ - async def _delete_event(self, **kwargs) -> dict[str, Any]: + async def _delete_event(self, **kwargs) -> dict[str, object]: event_id = kwargs.get("event_id") user_id = self._resolve_user_id(kwargs) if not event_id: diff --git a/src/agentkit/tools/composition.py b/src/agentkit/tools/composition.py index a0a9e10..2ad7104 100644 --- a/src/agentkit/tools/composition.py +++ b/src/agentkit/tools/composition.py @@ -9,7 +9,6 @@ import asyncio import json import logging -from typing import Any from agentkit.tools.base import Tool @@ -137,7 +136,7 @@ class DynamicSelector(Tool): description: str, tools: list[Tool], mode: str = "keyword", - llm_client: Any = None, + llm_client: object = None, version: str = "1.0.0", tags: list[str] | None = None, ): diff --git a/src/agentkit/tools/computer_use.py b/src/agentkit/tools/computer_use.py index cacfc6c..5a7d28e 100644 --- a/src/agentkit/tools/computer_use.py +++ b/src/agentkit/tools/computer_use.py @@ -10,7 +10,7 @@ from __future__ import annotations import asyncio import base64 import logging -from typing import Any, Callable, Awaitable +from typing import Callable, Awaitable import httpx @@ -62,8 +62,8 @@ class ComputerUseTool(Tool): self, name: str = "computer_use", description: str = "Anthropic Computer Use API 集成,支持截屏识别和 UI 操作", - input_schema: dict[str, Any] | None = None, - output_schema: dict[str, Any] | None = None, + input_schema: dict[str, object] | None = None, + output_schema: dict[str, object] | None = None, version: str = "1.0.0", tags: list[str] | None = None, api_key: str | None = None, @@ -71,7 +71,7 @@ class ComputerUseTool(Tool): api_base_url: str = _ANTHROPIC_COMPUTER_USE_URL, session_factory: type[ComputerUseSession] | None = None, recorder: ComputerUseRecorder | None = None, - fallback_callback: Callable[[str, dict[str, Any]], Awaitable[dict[str, Any]]] | None = None, + fallback_callback: Callable[[str, dict[str, object]], Awaitable[dict[str, object]]] | None = None, max_retries: int = 1, request_timeout: float = 30.0, ): @@ -112,7 +112,7 @@ class ComputerUseTool(Tool): await self._http_client.aclose() @staticmethod - def _default_input_schema() -> dict[str, Any]: + def _default_input_schema() -> dict[str, object]: return { "type": "object", "properties": { @@ -177,7 +177,7 @@ class ComputerUseTool(Tool): } @staticmethod - def _default_output_schema() -> dict[str, Any]: + def _default_output_schema() -> dict[str, object]: return { "type": "object", "properties": { @@ -254,7 +254,7 @@ class ComputerUseTool(Tool): self, session: ComputerUseSession, action: str, - params: dict[str, Any], + params: dict[str, object], ) -> ActionResult: """带降级链的操作执行 @@ -318,14 +318,14 @@ class ComputerUseTool(Tool): self, session: ComputerUseSession, action: str, - params: dict[str, Any], + params: dict[str, object], ) -> ActionResult: """调用 Anthropic Computer Use API 通过 Anthropic Messages API 发送 computer_use_tool 请求。 """ # 构造 computer_use 工具调用参数 - tool_input: dict[str, Any] = {"action": action} + tool_input: dict[str, object] = {"action": action} if action == "click": tool_input["coordinate"] = [params.get("x", 0), params.get("y", 0)] elif action == "type": @@ -354,7 +354,7 @@ class ComputerUseTool(Tool): screenshot_b64 = screenshot_result.screenshot_base64 # 构造 API 请求 - content_blocks: list[dict[str, Any]] = [] + content_blocks: list[dict[str, object]] = [] if screenshot_b64: content_blocks.append({ "type": "image", @@ -437,7 +437,7 @@ class ComputerUseTool(Tool): metadata={"api_response": data}, ) - def _validate_params(self, action: str, kwargs: dict[str, Any]) -> str | None: + def _validate_params(self, action: str, kwargs: dict[str, object]) -> str | None: """验证操作参数 Returns: @@ -459,9 +459,9 @@ class ComputerUseTool(Tool): return f"drag 操作需要 {', '.join(missing)} 参数" return None - def _format_result(self, result: ActionResult, session_id: str) -> dict[str, Any]: + def _format_result(self, result: ActionResult, session_id: str) -> dict[str, object]: """格式化操作结果""" - formatted: dict[str, Any] = { + formatted: dict[str, object] = { "success": result.success, "action": result.action, "output": result.output, @@ -482,9 +482,9 @@ class ComputerUseTool(Tool): action: str, error: str, fallback: str = "", - ) -> dict[str, Any]: + ) -> dict[str, object]: """构造错误结果""" - result: dict[str, Any] = { + result: dict[str, object] = { "success": False, "action": action, "error": error, diff --git a/src/agentkit/tools/computer_use_recorder.py b/src/agentkit/tools/computer_use_recorder.py index 7b567c1..7215dc4 100644 --- a/src/agentkit/tools/computer_use_recorder.py +++ b/src/agentkit/tools/computer_use_recorder.py @@ -11,7 +11,6 @@ import logging import time from dataclasses import asdict, dataclass, field from pathlib import Path -from typing import Any from agentkit.tools.computer_use_session import ComputerUseSession, ActionResult @@ -27,17 +26,17 @@ class ActionRecord: timestamp: float action: str - params: dict[str, Any] = field(default_factory=dict) + params: dict[str, object] = field(default_factory=dict) success: bool = False output: str = "" error: str = "" screenshot_path: str = "" - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> dict[str, object]: return asdict(self) @classmethod - def from_dict(cls, data: dict[str, Any]) -> ActionRecord: + def from_dict(cls, data: dict[str, object]) -> ActionRecord: return cls(**data) @@ -69,7 +68,7 @@ class ComputerUseRecorder: def record( self, action: str, - params: dict[str, Any], + params: dict[str, object], result: ActionResult, screenshot_path: str = "", ) -> ActionRecord: @@ -220,7 +219,7 @@ class ComputerUseRecorder: """失败操作数""" return sum(1 for r in self._records if not r.success) - def summary(self) -> dict[str, Any]: + def summary(self) -> dict[str, object]: """生成录制摘要""" return { "total_actions": self.total_actions, diff --git a/src/agentkit/tools/document_tool.py b/src/agentkit/tools/document_tool.py index 06b1807..5756cc9 100644 --- a/src/agentkit/tools/document_tool.py +++ b/src/agentkit/tools/document_tool.py @@ -7,7 +7,6 @@ handle documents via function calling. U6 implements "create"; U9 adds "read". from __future__ import annotations from pathlib import Path -from typing import Any from agentkit.documents.service import DocumentService from agentkit.memory.document_loader import DocumentLoader @@ -81,7 +80,7 @@ class DocumentTool(Tool): self._service = service self._loader = loader or DocumentLoader() - async def execute(self, **kwargs) -> dict[str, Any]: + async def execute(self, **kwargs) -> dict[str, object]: action = kwargs.get("action", "create") if action == "read": @@ -90,7 +89,7 @@ class DocumentTool(Tool): return await self._execute_create(**kwargs) return {"success": False, "error": f"Unknown action: {action!r} (use 'create' or 'read')"} - async def _execute_create(self, **kwargs) -> dict[str, Any]: + async def _execute_create(self, **kwargs) -> dict[str, object]: format_key = kwargs.get("format", "") content = kwargs.get("content", "") conversation_id = kwargs.get("conversation_id", "") @@ -129,7 +128,7 @@ class DocumentTool(Tool): except Exception as e: return {"success": False, "error": f"Document creation failed: {e}"} - async def _execute_read(self, **kwargs) -> dict[str, Any]: + async def _execute_read(self, **kwargs) -> dict[str, object]: file_path = kwargs.get("filename") or kwargs.get("content") if not file_path: return {"success": False, "error": "filename (file path) is required for read"} diff --git a/src/agentkit/tools/file_read.py b/src/agentkit/tools/file_read.py index 1f70c96..ddf15c9 100644 --- a/src/agentkit/tools/file_read.py +++ b/src/agentkit/tools/file_read.py @@ -12,7 +12,6 @@ from __future__ import annotations import logging from pathlib import Path -from typing import Any from agentkit.tools.base import Tool from agentkit.tools.symbol_extractor import ( @@ -40,8 +39,8 @@ class ReadFileTool(Tool): self, name: str = "read_file", description: str | None = None, - input_schema: dict[str, Any] | None = None, - output_schema: dict[str, Any] | None = None, + input_schema: dict[str, object] | None = None, + output_schema: dict[str, object] | None = None, version: str = "1.0.0", tags: list[str] | None = None, ): @@ -63,7 +62,7 @@ class ReadFileTool(Tool): ) @staticmethod - def _default_input_schema() -> dict[str, Any]: + def _default_input_schema() -> dict[str, object]: return { "type": "object", "properties": { @@ -95,7 +94,7 @@ class ReadFileTool(Tool): } @staticmethod - def _default_output_schema() -> dict[str, Any]: + def _default_output_schema() -> dict[str, object]: return { "type": "object", "properties": { @@ -115,7 +114,7 @@ class ReadFileTool(Tool): }, } - async def execute(self, **kwargs) -> dict[str, Any]: + async def execute(self, **kwargs) -> dict[str, object]: raw_path = kwargs.get("path") if not raw_path: return self._error("`path` is required") @@ -235,8 +234,8 @@ class ReadFileTool(Tool): @staticmethod def _error( message: str, *, path: str | None = None, detail: str | None = None - ) -> dict[str, Any]: - result: dict[str, Any] = { + ) -> dict[str, object]: + result: dict[str, object] = { "content": "", "is_error": True, "error": message, diff --git a/src/agentkit/tools/function_tool.py b/src/agentkit/tools/function_tool.py index c1086d9..de4f2a7 100644 --- a/src/agentkit/tools/function_tool.py +++ b/src/agentkit/tools/function_tool.py @@ -1,7 +1,7 @@ """FunctionTool - 将普通 Python 函数包装为 Tool""" import inspect -from typing import Any, Callable, Awaitable +from typing import Callable, Awaitable from agentkit.tools.base import Tool @@ -17,8 +17,8 @@ class FunctionTool(Tool): name: str, description: str, func: Callable[..., Awaitable[dict]] | Callable[..., dict], - input_schema: dict[str, Any] | None = None, - output_schema: dict[str, Any] | None = None, + input_schema: dict[str, object] | None = None, + output_schema: dict[str, object] | None = None, version: str = "1.0.0", tags: list[str] | None = None, ): diff --git a/src/agentkit/tools/headroom_retrieve.py b/src/agentkit/tools/headroom_retrieve.py index 71c6bd3..7b4add5 100644 --- a/src/agentkit/tools/headroom_retrieve.py +++ b/src/agentkit/tools/headroom_retrieve.py @@ -6,7 +6,6 @@ """ import logging -from typing import Any from agentkit.tools.base import Tool @@ -20,7 +19,7 @@ class HeadroomRetrieveTool(Tool): 压缩内容中包含 标记,LLM 可使用该哈希值检索。 """ - def __init__(self, compressor: Any): + def __init__(self, compressor: object): super().__init__( name="headroom_retrieve", description=( diff --git a/src/agentkit/tools/mcp_tool.py b/src/agentkit/tools/mcp_tool.py index 67622d9..82a50b0 100644 --- a/src/agentkit/tools/mcp_tool.py +++ b/src/agentkit/tools/mcp_tool.py @@ -2,7 +2,6 @@ import json import logging -from typing import Any from agentkit.tools.base import Tool @@ -20,9 +19,9 @@ class MCPTool(Tool): self, name: str, description: str, - client: Any, - input_schema: dict[str, Any] | None = None, - output_schema: dict[str, Any] | None = None, + client: object, + input_schema: dict[str, object] | None = None, + output_schema: dict[str, object] | None = None, version: str = "1.0.0", tags: list[str] | None = None, ): diff --git a/src/agentkit/tools/memory_tool.py b/src/agentkit/tools/memory_tool.py index da69ee0..bc119e1 100644 --- a/src/agentkit/tools/memory_tool.py +++ b/src/agentkit/tools/memory_tool.py @@ -14,7 +14,6 @@ from __future__ import annotations import re from datetime import datetime, timezone -from typing import Any from agentkit.memory.profile import MemoryFile, MemoryStore from agentkit.tools.base import Tool @@ -75,7 +74,7 @@ class MemoryTool(Tool): ) self._store = memory_store - async def execute(self, **kwargs) -> dict[str, Any]: + async def execute(self, **kwargs) -> dict[str, object]: action = kwargs.get("action", "") file_key = kwargs.get("file", "") @@ -150,7 +149,7 @@ class MemoryTool(Tool): async def _update_soul( self, mf: MemoryFile, section: str, content: str, reason: str - ) -> dict[str, Any]: + ) -> dict[str, object]: """执行 SOUL 动态更新,带版本追踪和更新历史. 采用原子写入策略:先在内存中构建完整内容,再一次性写入文件, diff --git a/src/agentkit/tools/output_parser.py b/src/agentkit/tools/output_parser.py index b371712..cd0369e 100644 --- a/src/agentkit/tools/output_parser.py +++ b/src/agentkit/tools/output_parser.py @@ -8,7 +8,6 @@ from __future__ import annotations import re from dataclasses import dataclass, field from enum import Enum -from typing import Any class ErrorType(Enum): @@ -49,7 +48,7 @@ class ParsedOutput: raw_output: str = "" suggestions: list[str] = field(default_factory=list) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> dict[str, object]: return { "exit_code": self.exit_code, "is_error": self.is_error, diff --git a/src/agentkit/tools/registry.py b/src/agentkit/tools/registry.py index bc0369f..3955bbd 100644 --- a/src/agentkit/tools/registry.py +++ b/src/agentkit/tools/registry.py @@ -1,7 +1,6 @@ """ToolRegistry - 工具注册中心""" import logging -from typing import Any from agentkit.core.exceptions import ToolNotFoundError from agentkit.tools.base import Tool diff --git a/src/agentkit/tools/schema_tools.py b/src/agentkit/tools/schema_tools.py index 451f132..52895be 100644 --- a/src/agentkit/tools/schema_tools.py +++ b/src/agentkit/tools/schema_tools.py @@ -6,7 +6,6 @@ SchemaGenerateTool: 生成 Schema.org JSON-LD 标记 import json import logging -from typing import Any import httpx @@ -47,8 +46,8 @@ class SchemaExtractTool(Tool): self, name: str = "schema_extract", description: str = "从网页 HTML 中提取结构化数据(JSON-LD、Microdata、RDFa 等)", - input_schema: dict[str, Any] | None = None, - output_schema: dict[str, Any] | None = None, + input_schema: dict[str, object] | None = None, + output_schema: dict[str, object] | None = None, version: str = "1.0.0", tags: list[str] | None = None, ): @@ -62,7 +61,7 @@ class SchemaExtractTool(Tool): ) @staticmethod - def _default_input_schema() -> dict[str, Any]: + def _default_input_schema() -> dict[str, object]: return { "type": "object", "properties": { @@ -81,7 +80,7 @@ class SchemaExtractTool(Tool): } @staticmethod - def _default_output_schema() -> dict[str, Any]: + def _default_output_schema() -> dict[str, object]: return { "type": "object", "properties": { @@ -164,7 +163,7 @@ class SchemaExtractTool(Tool): ) # 整理结果 - schemas: list[dict[str, Any]] = [] + schemas: list[dict[str, object]] = [] for fmt in formats: items = data.get(fmt, []) if items: @@ -206,8 +205,8 @@ class SchemaGenerateTool(Tool): self, name: str = "schema_generate", description: str = "生成 Schema.org JSON-LD 结构化数据标记", - input_schema: dict[str, Any] | None = None, - output_schema: dict[str, Any] | None = None, + input_schema: dict[str, object] | None = None, + output_schema: dict[str, object] | None = None, version: str = "1.0.0", tags: list[str] | None = None, ): @@ -221,7 +220,7 @@ class SchemaGenerateTool(Tool): ) @staticmethod - def _default_input_schema() -> dict[str, Any]: + def _default_input_schema() -> dict[str, object]: return { "type": "object", "properties": { @@ -238,7 +237,7 @@ class SchemaGenerateTool(Tool): } @staticmethod - def _default_output_schema() -> dict[str, Any]: + def _default_output_schema() -> dict[str, object]: return { "type": "object", "properties": { @@ -249,16 +248,16 @@ class SchemaGenerateTool(Tool): }, } - def _generate_manual(self, schema_type: str, properties: dict[str, Any]) -> str: + def _generate_manual(self, schema_type: str, properties: dict[str, object]) -> str: """手动构建 JSON-LD(无需外部依赖)""" - jsonld_obj: dict[str, Any] = { + jsonld_obj: dict[str, object] = { "@context": "https://schema.org", "@type": schema_type, } jsonld_obj.update(properties) return json.dumps(jsonld_obj, ensure_ascii=False, indent=2) - def _generate_with_schemaorg(self, schema_type: str, properties: dict[str, Any]) -> str | None: + def _generate_with_schemaorg(self, schema_type: str, properties: dict[str, object]) -> str | None: """使用 pydantic-schemaorg 生成 JSON-LD(带验证)""" if not _PYDANTIC_SCHEMAORG_AVAILABLE: return None @@ -278,7 +277,7 @@ class SchemaGenerateTool(Tool): else: return None - jsonld_obj: dict[str, Any] = { + jsonld_obj: dict[str, object] = { "@context": "https://schema.org", "@type": schema_type, } diff --git a/src/agentkit/tools/search.py b/src/agentkit/tools/search.py index 30c4140..bf73769 100644 --- a/src/agentkit/tools/search.py +++ b/src/agentkit/tools/search.py @@ -12,7 +12,6 @@ from __future__ import annotations import math import re from collections import Counter -from typing import Any from agentkit.tools.base import Tool @@ -92,7 +91,7 @@ class ToolSearchIndex: """Convert a tool's searchable metadata into a single text document.""" parts: list[str] = [str(tool.name), str(tool.description)] - schema: dict[str, Any] | None = tool.input_schema + schema: dict[str, object] | None = tool.input_schema if schema: props = schema.get("properties", {}) for pname, pinfo in props.items(): diff --git a/src/agentkit/tools/shell.py b/src/agentkit/tools/shell.py index c2a3aaf..5833965 100644 --- a/src/agentkit/tools/shell.py +++ b/src/agentkit/tools/shell.py @@ -14,7 +14,7 @@ import shlex import time import uuid from collections import deque -from typing import Any, Callable, Awaitable +from typing import Callable, Awaitable from agentkit.tools.base import Tool from agentkit.tools.output_parser import OutputParser, ParsedOutput @@ -232,8 +232,8 @@ class ShellTool(Tool): self, name: str = "shell", description: str = "执行 Shell 命令,支持会话模式保持跨命令状态", - input_schema: dict[str, Any] | None = None, - output_schema: dict[str, Any] | None = None, + input_schema: dict[str, object] | None = None, + output_schema: dict[str, object] | None = None, version: str = "1.0.0", tags: list[str] | None = None, confirm_callback: Callable[[str], Awaitable[bool]] | None = None, @@ -253,10 +253,10 @@ class ShellTool(Tool): self._confirm_callback = confirm_callback self._default_timeout = default_timeout self._max_output_length = max_output_length - self._audit_log: deque[dict[str, Any]] = deque(maxlen=10000) + self._audit_log: deque[dict[str, object]] = deque(maxlen=10000) @staticmethod - def _default_input_schema() -> dict[str, Any]: + def _default_input_schema() -> dict[str, object]: return { "type": "object", "properties": { @@ -287,7 +287,7 @@ class ShellTool(Tool): } @staticmethod - def _default_output_schema() -> dict[str, Any]: + def _default_output_schema() -> dict[str, object]: return { "type": "object", "properties": { @@ -613,6 +613,6 @@ class ShellTool(Tool): return self._session_manager @property - def audit_log(self) -> list[dict[str, Any]]: + def audit_log(self) -> list[dict[str, object]]: """获取审计日志(副本)""" return list(self._audit_log) diff --git a/src/agentkit/tools/skill_install.py b/src/agentkit/tools/skill_install.py index dfce86a..f8f5e63 100644 --- a/src/agentkit/tools/skill_install.py +++ b/src/agentkit/tools/skill_install.py @@ -4,7 +4,7 @@ import asyncio import logging import os import re -from typing import Any, Callable, Awaitable +from typing import Callable, Awaitable from agentkit.tools.base import Tool @@ -34,8 +34,8 @@ class SkillInstallTool(Tool): "重要:安装前应先用 skill_search 工具搜索确认技能名称和来源(source)。" "如果用户只提供了模糊名称,先用 skill_search 搜索,再根据搜索结果安装。" ), - input_schema: dict[str, Any] | None = None, - output_schema: dict[str, Any] | None = None, + input_schema: dict[str, object] | None = None, + output_schema: dict[str, object] | None = None, version: str = "1.0.0", tags: list[str] | None = None, confirm_callback: Callable[[str], Awaitable[bool]] | None = None, diff --git a/src/agentkit/tools/skill_search.py b/src/agentkit/tools/skill_search.py index 7a95b1b..5830723 100644 --- a/src/agentkit/tools/skill_search.py +++ b/src/agentkit/tools/skill_search.py @@ -2,7 +2,6 @@ import asyncio import logging -from typing import Any from agentkit.tools.base import Tool @@ -27,8 +26,8 @@ class SkillSearchTool(Tool): "搜索可用的 Agent 技能包。在安装技能之前,应先使用此工具搜索确认技能名称和来源。" "返回匹配的技能列表,包含名称、描述和安装来源。" ), - input_schema: dict[str, Any] | None = None, - output_schema: dict[str, Any] | None = None, + input_schema: dict[str, object] | None = None, + output_schema: dict[str, object] | None = None, version: str = "1.0.0", tags: list[str] | None = None, ): diff --git a/src/agentkit/tools/terminal_session.py b/src/agentkit/tools/terminal_session.py index b065877..674ab46 100644 --- a/src/agentkit/tools/terminal_session.py +++ b/src/agentkit/tools/terminal_session.py @@ -14,7 +14,6 @@ import shlex import time from collections import deque from dataclasses import dataclass, field -from typing import Any from agentkit.tools.output_parser import OutputParser, ParsedOutput diff --git a/src/agentkit/tools/web_crawl.py b/src/agentkit/tools/web_crawl.py index aa466b7..91e80bb 100644 --- a/src/agentkit/tools/web_crawl.py +++ b/src/agentkit/tools/web_crawl.py @@ -1,7 +1,6 @@ """WebCrawlTool - 基于 Crawl4AI 的网页抓取工具,支持优雅降级""" import logging -from typing import Any from agentkit.tools.base import Tool @@ -31,8 +30,8 @@ class WebCrawlTool(Tool): self, name: str = "web_crawl", description: str = "抓取网页内容,支持 Markdown/HTML 输出和 CSS 选择器提取", - input_schema: dict[str, Any] | None = None, - output_schema: dict[str, Any] | None = None, + input_schema: dict[str, object] | None = None, + output_schema: dict[str, object] | None = None, version: str = "1.0.0", tags: list[str] | None = None, ): @@ -46,7 +45,7 @@ class WebCrawlTool(Tool): ) @staticmethod - def _default_input_schema() -> dict[str, Any]: + def _default_input_schema() -> dict[str, object]: return { "type": "object", "properties": { @@ -74,7 +73,7 @@ class WebCrawlTool(Tool): } @staticmethod - def _default_output_schema() -> dict[str, Any]: + def _default_output_schema() -> dict[str, object]: return { "type": "object", "properties": { @@ -142,7 +141,7 @@ class WebCrawlTool(Tool): status_code = result.status_code if hasattr(result, "status_code") else 200 - response: dict[str, Any] = { + response: dict[str, object] = { "content": content, "status_code": status_code, "links": links, diff --git a/src/agentkit/tools/web_search.py b/src/agentkit/tools/web_search.py index 0c059d8..c665031 100644 --- a/src/agentkit/tools/web_search.py +++ b/src/agentkit/tools/web_search.py @@ -10,7 +10,6 @@ import json import logging import re import urllib.parse -from typing import Any import httpx @@ -32,8 +31,8 @@ class WebSearchTool(Tool): self, name: str = "web_search", description: str = "搜索互联网信息。返回搜索结果列表,包含标题、链接和摘要。", - input_schema: dict[str, Any] | None = None, - output_schema: dict[str, Any] | None = None, + input_schema: dict[str, object] | None = None, + output_schema: dict[str, object] | None = None, version: str = "1.0.0", tags: list[str] | None = None, tavily_api_key: str | None = None, @@ -53,7 +52,7 @@ class WebSearchTool(Tool): self._default_max_results = default_max_results @staticmethod - def _default_input_schema() -> dict[str, Any]: + def _default_input_schema() -> dict[str, object]: return { "type": "object", "properties": { @@ -71,7 +70,7 @@ class WebSearchTool(Tool): } @staticmethod - def _default_output_schema() -> dict[str, Any]: + def _default_output_schema() -> dict[str, object]: return { "type": "object", "properties": {