From d98c0bd3f68178256acfd638daa36a4565c4ffb4 Mon Sep 17 00:00:00 2001 From: kingbri <8082010+kingbri1@users.noreply.github.com> Date: Fri, 14 Mar 2025 15:06:03 -0400 Subject: [PATCH] API: Add tools class Was mistakenly not added in PR 302. Signed-off-by: kingbri <8082010+kingbri1@users.noreply.github.com> --- endpoints/OAI/utils/tools.py | 46 ++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 endpoints/OAI/utils/tools.py diff --git a/endpoints/OAI/utils/tools.py b/endpoints/OAI/utils/tools.py new file mode 100644 index 0000000..7e399a8 --- /dev/null +++ b/endpoints/OAI/utils/tools.py @@ -0,0 +1,46 @@ +import json +from loguru import logger +from typing import List + +from endpoints.OAI.types.tools import ToolCall + + +class ToolCallProcessor: + @staticmethod + def from_json(tool_calls_str: str) -> List[ToolCall]: + """Postprocess tool call JSON to a parseable class""" + + tool_calls = json.loads(tool_calls_str) + for tool_call in tool_calls: + tool_call["function"]["arguments"] = json.dumps( + tool_call["function"]["arguments"] + ) + + return [ToolCall(**tool_call) for tool_call in tool_calls] + + @staticmethod + def to_json(tool_calls: List[ToolCall]) -> str: + """ + Convert ToolCall objects to JSON string representation. + + Args: + tool_calls (List[ToolCall]): List of ToolCall objects to convert + + Returns: + str: JSON representation of the tool calls + """ + + if not tool_calls: + return "" + + # Don't use list comprehension here + # as that will fail rather than warn + dumped_tool_calls = [] + for tool_call_obj in tool_calls: + try: + dumped_tool_calls.append(tool_call_obj.model_dump()) + except (json.JSONDecodeError, AttributeError) as e: + logger.warning(f"Error processing tool call: {e}") + + # Serialize the dumped array + return json.dumps(dumped_tool_calls, indent=2)