Source code for pipecat.bus.adapters.tools_schema_adapter
#
# Copyright (c) 2026, Daily
#
# SPDX-License-Identifier: BSD 2-Clause License
#
"""Type adapter for ToolsSchema serialization."""
from typing import Any
from pipecat.adapters.schemas.function_schema import FunctionSchema
from pipecat.adapters.schemas.tools_schema import ToolsSchema
from pipecat.bus.adapters.base import DeserializeFunc, SerializeFunc, TypeAdapter
[docs]
class ToolsSchemaAdapter(TypeAdapter):
"""Serialize and deserialize ``ToolsSchema`` instances for network transport."""
[docs]
def serialize(self, obj: Any, serialize_value: SerializeFunc) -> dict[str, Any]:
"""Serialize a ``ToolsSchema`` to a JSON-compatible dict.
Args:
obj: A ``ToolsSchema`` instance.
serialize_value: Callback to recursively serialize nested values.
Returns:
A dict with a ``standard_tools`` list.
"""
return {"standard_tools": [tool.to_default_dict() for tool in obj.standard_tools]}
[docs]
def deserialize(
self,
data: dict[str, Any],
deserialize_value: DeserializeFunc,
target_type: type | None = None,
) -> Any:
"""Reconstruct a ``ToolsSchema`` from a serialized dict.
Args:
data: A dict produced by ``serialize()``.
deserialize_value: Callback to recursively deserialize nested values.
target_type: Unused. ``ToolsSchema`` is always the target.
Returns:
A new ``ToolsSchema`` instance.
"""
tools = []
for item in data["standard_tools"]:
params = item.get("parameters", {})
tools.append(
FunctionSchema(
name=item["name"],
description=item.get("description", ""),
properties=params.get("properties", {}),
required=params.get("required", []),
)
)
return ToolsSchema(standard_tools=tools)