From c68be4eb2b9b764102a8546946abcbacafeca409 Mon Sep 17 00:00:00 2001 From: Harrison Chase Date: Tue, 19 Sep 2023 12:05:39 -0700 Subject: [PATCH] tool rendering (#10786) --- libs/langchain/langchain/tools/render.py | 33 +++++++++++++++ .../tests/unit_tests/tools/test_render.py | 42 +++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 libs/langchain/langchain/tools/render.py create mode 100644 libs/langchain/tests/unit_tests/tools/test_render.py diff --git a/libs/langchain/langchain/tools/render.py b/libs/langchain/langchain/tools/render.py new file mode 100644 index 0000000000..e057489450 --- /dev/null +++ b/libs/langchain/langchain/tools/render.py @@ -0,0 +1,33 @@ +from typing import List + +from langchain.tools.base import BaseTool + + +def render_text_description(tools: List[BaseTool]) -> str: + """Render the tool name and description in plain text. + + Output will be in the format of: + + ``` + 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: + + ``` + 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/langchain/tests/unit_tests/tools/test_render.py b/libs/langchain/tests/unit_tests/tools/test_render.py new file mode 100644 index 0000000000..0d7eab6204 --- /dev/null +++ b/libs/langchain/tests/unit_tests/tools/test_render.py @@ -0,0 +1,42 @@ +from typing import List + +import pytest + +from langchain.tools.base import BaseTool, tool +from langchain.tools.render import ( + render_text_description, + render_text_description_and_args, +) + + +@tool +def search(query: str) -> str: + """Lookup things online.""" + return "foo" + + +@tool +def calculator(expression: str) -> str: + """Do math.""" + return "bar" + + +@pytest.fixture +def tools() -> List[BaseTool]: + return [search, calculator] # type: ignore + + +def test_render_text_description(tools: List[BaseTool]) -> None: + tool_string = render_text_description(tools) + expected_string = """search: search(query: str) -> str - Lookup things online. +calculator: calculator(expression: str) -> str - Do math.""" + assert tool_string == expected_string + + +def test_render_text_description_and_args(tools: List[BaseTool]) -> None: + tool_string = render_text_description_and_args(tools) + expected_string = """search: search(query: str) -> str - Lookup things online., \ +args: {'query': {'title': 'Query', 'type': 'string'}} +calculator: calculator(expression: str) -> str - Do math., \ +args: {'expression': {'title': 'Expression', 'type': 'string'}}""" + assert tool_string == expected_string