diff --git a/libs/community/langchain_community/tools/convert_to_openai.py b/libs/community/langchain_community/tools/convert_to_openai.py index ff1193fd410..c17dac4cecb 100644 --- a/libs/community/langchain_community/tools/convert_to_openai.py +++ b/libs/community/langchain_community/tools/convert_to_openai.py @@ -1,4 +1,38 @@ -from langchain_community.tools.render import format_tool_to_openai_function +from langchain_core.tools import BaseTool -# For backwards compatibility -__all__ = ["format_tool_to_openai_function"] +from langchain_community.utils.openai_functions import ( + FunctionDescription, + ToolDescription, + convert_pydantic_to_openai_function, +) + + +def format_tool_to_openai_function(tool: BaseTool) -> FunctionDescription: + """Format tool into the OpenAI function API.""" + if tool.args_schema: + return convert_pydantic_to_openai_function( + tool.args_schema, name=tool.name, description=tool.description + ) + else: + return { + "name": tool.name, + "description": tool.description, + "parameters": { + # This is a hack to get around the fact that some tools + # do not expose an args_schema, and expect an argument + # which is a string. + # And Open AI does not support an array type for the + # parameters. + "properties": { + "__arg1": {"title": "__arg1", "type": "string"}, + }, + "required": ["__arg1"], + "type": "object", + }, + } + + +def format_tool_to_openai_tool(tool: BaseTool) -> ToolDescription: + """Format tool into the OpenAI function API.""" + function = format_tool_to_openai_function(tool) + return {"type": "function", "function": function} diff --git a/libs/community/langchain_community/tools/render.py b/libs/community/langchain_community/tools/render.py index 7a5c3b1ed47..668c643c679 100644 --- a/libs/community/langchain_community/tools/render.py +++ b/libs/community/langchain_community/tools/render.py @@ -4,8 +4,6 @@ Depending on the LLM you are using and the prompting strategy you are using, you may want Tools to be rendered in a different way. This module contains various ways to render tools. """ -from typing import List - from langchain_core.tools import BaseTool from langchain_community.utils.openai_functions import ( @@ -15,37 +13,6 @@ from langchain_community.utils.openai_functions import ( ) -def render_text_description(tools: List[BaseTool]) -> str: - """Render the tool name and description in plain text. - - Output will be in the format of: - - .. code-block:: markdown - - search: This tool is used for search - calculator: This tool is used for math - """ - return "\n".join([f"{tool.name}: {tool.description}" for tool in tools]) - - -def render_text_description_and_args(tools: List[BaseTool]) -> str: - """Render the tool name, description, and args in plain text. - - Output will be in the format of: - - .. code-block:: markdown - - search: This tool is used for search, args: {"query": {"type": "string"}} - calculator: This tool is used for math, \ -args: {"expression": {"type": "string"}} - """ - tool_strings = [] - for tool in tools: - args_schema = str(tool.args) - tool_strings.append(f"{tool.name}: {tool.description}, args: {args_schema}") - return "\n".join(tool_strings) - - def format_tool_to_openai_function(tool: BaseTool) -> FunctionDescription: """Format tool into the OpenAI function API.""" if tool.args_schema: diff --git a/libs/community/poetry.lock b/libs/community/poetry.lock index f26128bd604..160e328cffa 100644 --- a/libs/community/poetry.lock +++ b/libs/community/poetry.lock @@ -3421,7 +3421,7 @@ files = [ [[package]] name = "langchain-core" -version = "0.0.13" +version = "0.1.0" description = "Building applications with LLMs through composability" optional = false python-versions = ">=3.8.1,<4.0" @@ -8485,4 +8485,4 @@ extended-testing = ["aiosqlite", "aleph-alpha-client", "anthropic", "arxiv", "as [metadata] lock-version = "2.0" python-versions = ">=3.8.1,<4.0" -content-hash = "a77af01e299fdeb0849f20f2ae8a49030bd38993ff603f464c1c1f6a170d1d9b" +content-hash = "e3bacf389a13d283c4dd29e3a673e1863826b4e98785c666fefc10cf714c2f6f" diff --git a/libs/community/pyproject.toml b/libs/community/pyproject.toml index 76cbeab5fa2..f05d6580af2 100644 --- a/libs/community/pyproject.toml +++ b/libs/community/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "langchain-community" -version = "0.0.1" +version = "0.0.2" description = "Community contributed LangChain integrations." authors = [] license = "MIT" @@ -9,7 +9,7 @@ repository = "https://github.com/langchain-ai/langchain" [tool.poetry.dependencies] python = ">=3.8.1,<4.0" -langchain-core = ">=0.0.13,<0.1" +langchain-core = "^0.1" SQLAlchemy = ">=1.4,<3" requests = "^2" PyYAML = ">=5.3" diff --git a/libs/langchain/langchain/tools/render.py b/libs/langchain/langchain/tools/render.py index aeecfe79547..2b77b70df20 100644 --- a/libs/langchain/langchain/tools/render.py +++ b/libs/langchain/langchain/tools/render.py @@ -1,13 +1,52 @@ -from langchain_community.tools.render import ( +"""Different methods for rendering Tools to be passed to LLMs. + +Depending on the LLM you are using and the prompting strategy you are using, +you may want Tools to be rendered in a different way. +This module contains various ways to render tools. +""" +from typing import List + +# For backwards compatibility +from langchain_community.tools.convert_to_openai import ( format_tool_to_openai_function, format_tool_to_openai_tool, - render_text_description, - render_text_description_and_args, ) +from langchain_core.tools import BaseTool __all__ = [ "render_text_description", "render_text_description_and_args", - "format_tool_to_openai_function", "format_tool_to_openai_tool", + "format_tool_to_openai_function", ] + + +def render_text_description(tools: List[BaseTool]) -> str: + """Render the tool name and description in plain text. + + Output will be in the format of: + + .. code-block:: markdown + + search: This tool is used for search + calculator: This tool is used for math + """ + return "\n".join([f"{tool.name}: {tool.description}" for tool in tools]) + + +def render_text_description_and_args(tools: List[BaseTool]) -> str: + """Render the tool name, description, and args in plain text. + + Output will be in the format of: + + .. code-block:: markdown + + search: This tool is used for search, args: {"query": {"type": "string"}} + calculator: This tool is used for math, \ +args: {"expression": {"type": "string"}} + """ + tool_strings = [] + for tool in tools: + args_schema = str(tool.args) + tool_strings.append(f"{tool.name}: {tool.description}, args: {args_schema}") + return "\n".join(tool_strings) diff --git a/libs/community/tests/unit_tests/tools/test_render.py b/libs/langchain/tests/unit_tests/tools/test_render.py similarity index 96% rename from libs/community/tests/unit_tests/tools/test_render.py rename to libs/langchain/tests/unit_tests/tools/test_render.py index 798f31b92da..e7bea150951 100644 --- a/libs/community/tests/unit_tests/tools/test_render.py +++ b/libs/langchain/tests/unit_tests/tools/test_render.py @@ -3,7 +3,7 @@ from typing import List import pytest from langchain_core.tools import BaseTool, tool -from langchain_community.tools.render import ( +from langchain.tools.render import ( render_text_description, render_text_description_and_args, )