retrieves images correctly
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
from dataclasses import dataclass, field
|
from dataclasses import dataclass, field, is_dataclass
|
||||||
from typing import Type, Any, Optional
|
from typing import Type, Any, Optional
|
||||||
import tyro
|
import tyro
|
||||||
import commentjson
|
import commentjson
|
||||||
@@ -16,6 +16,44 @@ from pydantic import BaseModel, Field, create_model
|
|||||||
from lang_agent.config import InstantiateConfig
|
from lang_agent.config import InstantiateConfig
|
||||||
|
|
||||||
|
|
||||||
|
def _json_default_serializer(obj: Any) -> Any:
|
||||||
|
"""
|
||||||
|
Best-effort fallback serializer for objects that json can't handle.
|
||||||
|
|
||||||
|
This is mainly to support rich MCP return types such as ImageContent.
|
||||||
|
Strategy (in order):
|
||||||
|
- If the object has `model_dump()`, use that (Pydantic v2 style).
|
||||||
|
- Else if it has `dict()`, use that (Pydantic v1 / dataclass-like).
|
||||||
|
- Else if it's a dataclass, convert via `asdict`.
|
||||||
|
- Else fall back to `str(obj)`.
|
||||||
|
"""
|
||||||
|
# Pydantic v2 models
|
||||||
|
if hasattr(obj, "model_dump") and callable(getattr(obj, "model_dump")):
|
||||||
|
try:
|
||||||
|
return obj.model_dump()
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Pydantic v1 or similar
|
||||||
|
if hasattr(obj, "dict") and callable(getattr(obj, "dict")):
|
||||||
|
try:
|
||||||
|
return obj.dict()
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Dataclasses
|
||||||
|
if is_dataclass(obj):
|
||||||
|
from dataclasses import asdict
|
||||||
|
|
||||||
|
try:
|
||||||
|
return asdict(obj)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Fallback: string representation (works for exceptions, custom types, etc.)
|
||||||
|
return str(obj)
|
||||||
|
|
||||||
|
|
||||||
def _format_tool_result(result: Any, tool_call_info: dict | None) -> str | ToolMessage:
|
def _format_tool_result(result: Any, tool_call_info: dict | None) -> str | ToolMessage:
|
||||||
"""
|
"""
|
||||||
Format the tool result to match the expected output format.
|
Format the tool result to match the expected output format.
|
||||||
@@ -24,8 +62,10 @@ def _format_tool_result(result: Any, tool_call_info: dict | None) -> str | ToolM
|
|||||||
|
|
||||||
If tool_call_info is provided (from a ToolCall), returns a ToolMessage.
|
If tool_call_info is provided (from a ToolCall), returns a ToolMessage.
|
||||||
Otherwise, returns the raw content string for direct invocations.
|
Otherwise, returns the raw content string for direct invocations.
|
||||||
|
The JSON serialization is made robust to non-serializable objects
|
||||||
|
(e.g. ImageContent) via `_json_default_serializer`.
|
||||||
"""
|
"""
|
||||||
content = json.dumps(list(result))
|
content = json.dumps(list(result), default=_json_default_serializer, ensure_ascii=False)
|
||||||
if tool_call_info and tool_call_info.get("id"):
|
if tool_call_info and tool_call_info.get("id"):
|
||||||
return ToolMessage(content=content,
|
return ToolMessage(content=content,
|
||||||
name=tool_call_info.get("name"),
|
name=tool_call_info.get("name"),
|
||||||
@@ -307,10 +347,10 @@ if __name__ == "__main__":
|
|||||||
print("-" * 80)
|
print("-" * 80)
|
||||||
|
|
||||||
## Use the self_camera_capture_and_send tool
|
## Use the self_camera_capture_and_send tool
|
||||||
camera_tool = next((t for t in tools if t.name == "self_camera_capture_and_send"), None)
|
camera_tool = next((t for t in tools if t.name == "self_camera_take_photo"), None)
|
||||||
if camera_tool:
|
if camera_tool:
|
||||||
print("\n=== Using self_camera_capture_and_send tool ===")
|
print("\n=== Using self_camera_capture_and_send tool ===")
|
||||||
result = camera_tool.invoke({})
|
result = camera_tool.invoke({"question": ""})
|
||||||
print(f"Result: {result}")
|
print(f"Result: {result}")
|
||||||
|
|
||||||
# Use the self_screen_set_brightness tool
|
# Use the self_screen_set_brightness tool
|
||||||
|
|||||||
Reference in New Issue
Block a user