Spaces:
Runtime error
Runtime error
import copy | |
import json | |
from typing import Any, List, Type | |
from langchain_core.exceptions import OutputParserException | |
from langchain_core.output_parsers import ( | |
BaseGenerationOutputParser, | |
) | |
from langchain_core.outputs import ChatGeneration, Generation | |
from langchain_core.pydantic_v1 import BaseModel | |
class JsonOutputToolsParser(BaseGenerationOutputParser[Any]): | |
"""Parse tools from OpenAI response.""" | |
def parse_result(self, result: List[Generation], *, partial: bool = False) -> Any: | |
generation = result[0] | |
if not isinstance(generation, ChatGeneration): | |
raise OutputParserException( | |
"This output parser can only be used with a chat generation." | |
) | |
message = generation.message | |
try: | |
tool_calls = copy.deepcopy(message.additional_kwargs["tool_calls"]) | |
except KeyError: | |
return [] | |
final_tools = [] | |
for tool_call in tool_calls: | |
if "function" not in tool_call: | |
pass | |
function_args = tool_call["function"]["arguments"] | |
final_tools.append( | |
{ | |
"type": tool_call["function"]["name"], | |
"args": json.loads(function_args), | |
} | |
) | |
return final_tools | |
class JsonOutputKeyToolsParser(JsonOutputToolsParser): | |
"""Parse tools from OpenAI response.""" | |
key_name: str | |
"""The type of tools to return.""" | |
def parse_result(self, result: List[Generation], *, partial: bool = False) -> Any: | |
results = super().parse_result(result) | |
return [res["args"] for res in results if results["type"] == self.key_name] | |
class PydanticToolsParser(JsonOutputToolsParser): | |
"""Parse tools from OpenAI response.""" | |
tools: List[Type[BaseModel]] | |
def parse_result(self, result: List[Generation], *, partial: bool = False) -> Any: | |
results = super().parse_result(result) | |
name_dict = {tool.__name__: tool for tool in self.tools} | |
return [name_dict[res["type"]](**res["args"]) for res in results] | |