feat: implement native multimodal autonomous sensory capabilities

This commit is contained in:
vandazia
2026-03-20 22:00:38 +08:00
parent 214bf66a29
commit 71a88da186
7 changed files with 102 additions and 14 deletions
+22 -4
View File
@@ -21,6 +21,20 @@ class Tool(ABC):
"object": dict,
}
@staticmethod
def _resolve_type(t: Any) -> str | None:
"""Resolve JSON Schema type to a simple string.
JSON Schema allows ``"type": ["string", "null"]`` (union types).
We extract the first non-null type so validation/casting works.
"""
if isinstance(t, list):
for item in t:
if item != "null":
return item
return None
return t
@property
@abstractmethod
def name(self) -> str:
@@ -40,7 +54,7 @@ class Tool(ABC):
pass
@abstractmethod
async def execute(self, **kwargs: Any) -> str:
async def execute(self, **kwargs: Any) -> Any:
"""
Execute the tool with given parameters.
@@ -48,7 +62,7 @@ class Tool(ABC):
**kwargs: Tool-specific parameters.
Returns:
String result of the tool execution.
Result of the tool execution (string or list of content blocks).
"""
pass
@@ -78,7 +92,7 @@ class Tool(ABC):
def _cast_value(self, val: Any, schema: dict[str, Any]) -> Any:
"""Cast a single value according to schema."""
target_type = schema.get("type")
target_type = self._resolve_type(schema.get("type"))
if target_type == "boolean" and isinstance(val, bool):
return val
@@ -131,7 +145,11 @@ class Tool(ABC):
return self._validate(params, {**schema, "type": "object"}, "")
def _validate(self, val: Any, schema: dict[str, Any], path: str) -> list[str]:
t, label = schema.get("type"), path or "parameter"
raw_type = schema.get("type")
nullable = isinstance(raw_type, list) and "null" in raw_type
t, label = self._resolve_type(raw_type), path or "parameter"
if nullable and val is None:
return []
if t == "integer" and (not isinstance(val, int) or isinstance(val, bool)):
return [f"{label} should be integer"]
if t == "number" and (