From b8c6ebf647852ef44f4e1dcdb76a4a5689bcd42c Mon Sep 17 00:00:00 2001 From: Leonid Ganeline Date: Tue, 2 Jan 2024 14:56:38 -0800 Subject: [PATCH] refactor `utils` (#15432) The `langchain` [still holds several artifacts](https://api.python.langchain.com/en/latest/langchain_api_reference.html#module-langchain.utils) that belongs to `community`. If they moved then `langchain.utils` namespace would be removed completely. - moved `ernie_functions` artifacts to `community` --- .../langchain_community/utils/__init__.py | 3 + .../utils/ernie_functions.py | 51 +++++++++++++++ .../langchain/utils/ernie_functions.py | 64 ++++--------------- 3 files changed, 67 insertions(+), 51 deletions(-) create mode 100644 libs/community/langchain_community/utils/ernie_functions.py diff --git a/libs/community/langchain_community/utils/__init__.py b/libs/community/langchain_community/utils/__init__.py index e69de29bb2..de1316ff4e 100644 --- a/libs/community/langchain_community/utils/__init__.py +++ b/libs/community/langchain_community/utils/__init__.py @@ -0,0 +1,3 @@ +""" +**Utility functions** for LangChain. +""" diff --git a/libs/community/langchain_community/utils/ernie_functions.py b/libs/community/langchain_community/utils/ernie_functions.py new file mode 100644 index 0000000000..7fa3580bce --- /dev/null +++ b/libs/community/langchain_community/utils/ernie_functions.py @@ -0,0 +1,51 @@ +from typing import Literal, Optional, Type, TypedDict + +from langchain_core.pydantic_v1 import BaseModel +from langchain_core.utils.json_schema import dereference_refs + + +class FunctionDescription(TypedDict): + """Representation of a callable function to the Ernie API.""" + + name: str + """The name of the function.""" + description: str + """A description of the function.""" + parameters: dict + """The parameters of the function.""" + + +class ToolDescription(TypedDict): + """Representation of a callable function to the Ernie API.""" + + type: Literal["function"] + function: FunctionDescription + + +def convert_pydantic_to_ernie_function( + model: Type[BaseModel], + *, + name: Optional[str] = None, + description: Optional[str] = None, +) -> FunctionDescription: + """Converts a Pydantic model to a function description for the Ernie API.""" + schema = dereference_refs(model.schema()) + schema.pop("definitions", None) + return { + "name": name or schema["title"], + "description": description or schema["description"], + "parameters": schema, + } + + +def convert_pydantic_to_ernie_tool( + model: Type[BaseModel], + *, + name: Optional[str] = None, + description: Optional[str] = None, +) -> ToolDescription: + """Converts a Pydantic model to a function description for the Ernie API.""" + function = convert_pydantic_to_ernie_function( + model, name=name, description=description + ) + return {"type": "function", "function": function} diff --git a/libs/langchain/langchain/utils/ernie_functions.py b/libs/langchain/langchain/utils/ernie_functions.py index 080df2ade2..e71152a5bf 100644 --- a/libs/langchain/langchain/utils/ernie_functions.py +++ b/libs/langchain/langchain/utils/ernie_functions.py @@ -1,51 +1,13 @@ -from typing import Literal, Optional, Type, TypedDict - -from langchain.pydantic_v1 import BaseModel -from langchain.utils.json_schema import dereference_refs - - -class FunctionDescription(TypedDict): - """Representation of a callable function to the Ernie API.""" - - name: str - """The name of the function.""" - description: str - """A description of the function.""" - parameters: dict - """The parameters of the function.""" - - -class ToolDescription(TypedDict): - """Representation of a callable function to the Ernie API.""" - - type: Literal["function"] - function: FunctionDescription - - -def convert_pydantic_to_ernie_function( - model: Type[BaseModel], - *, - name: Optional[str] = None, - description: Optional[str] = None, -) -> FunctionDescription: - """Converts a Pydantic model to a function description for the Ernie API.""" - schema = dereference_refs(model.schema()) - schema.pop("definitions", None) - return { - "name": name or schema["title"], - "description": description or schema["description"], - "parameters": schema, - } - - -def convert_pydantic_to_ernie_tool( - model: Type[BaseModel], - *, - name: Optional[str] = None, - description: Optional[str] = None, -) -> ToolDescription: - """Converts a Pydantic model to a function description for the Ernie API.""" - function = convert_pydantic_to_ernie_function( - model, name=name, description=description - ) - return {"type": "function", "function": function} +from langchain_community.utils.ernie_functions import ( + FunctionDescription, + ToolDescription, + convert_pydantic_to_ernie_function, + convert_pydantic_to_ernie_tool, +) + +__all__ = [ + "FunctionDescription", + "ToolDescription", + "convert_pydantic_to_ernie_function", + "convert_pydantic_to_ernie_tool", +]