mirror of
https://github.com/hwchase17/langchain.git
synced 2025-08-31 02:11:09 +00:00
standard-tests: Fix ToolsIntegrationTests to correctly handle "content_and_artifact" tools (#29391)
**Description:**
The response from `tool.invoke()` is always a ToolMessage, with content
and artifact fields, not a tuple.
The tuple is converted to a ToolMessage here
b6ae7ca91d/libs/core/langchain_core/tools/base.py (L726)
**Issue:**
Currently `ToolsIntegrationTests` requires `invoke()` to return a tuple
and so standard tests fail for "content_and_artifact" tools. This fixes
that to check the returned ToolMessage.
This PR also adds a test that now passes.
This commit is contained in:
parent
f849305a56
commit
22aa5e07ed
@ -29,15 +29,10 @@ class ToolsIntegrationTests(ToolsTests):
|
||||
)
|
||||
result = tool.invoke(tool_call)
|
||||
|
||||
if tool.response_format == "content":
|
||||
tool_message = result
|
||||
elif tool.response_format == "content_and_artifact":
|
||||
# should be (content, artifact)
|
||||
assert isinstance(result, tuple)
|
||||
assert len(result) == 2
|
||||
tool_message, artifact = result
|
||||
|
||||
assert artifact # artifact can be anything, but shouldn't be none
|
||||
tool_message = result
|
||||
if tool.response_format == "content_and_artifact":
|
||||
# artifact can be anything, except none
|
||||
assert tool_message.artifact is not None
|
||||
|
||||
# check content is a valid ToolMessage content
|
||||
assert isinstance(tool_message.content, (str, list))
|
||||
@ -59,15 +54,10 @@ class ToolsIntegrationTests(ToolsTests):
|
||||
)
|
||||
result = await tool.ainvoke(tool_call)
|
||||
|
||||
if tool.response_format == "content":
|
||||
tool_message = result
|
||||
elif tool.response_format == "content_and_artifact":
|
||||
# should be (content, artifact)
|
||||
assert isinstance(result, tuple)
|
||||
assert len(result) == 2
|
||||
tool_message, artifact = result
|
||||
|
||||
assert artifact # artifact can be anything, but shouldn't be none
|
||||
tool_message = result
|
||||
if tool.response_format == "content_and_artifact":
|
||||
# artifact can be anything, except none
|
||||
assert tool_message.artifact is not None
|
||||
|
||||
# check content is a valid ToolMessage content
|
||||
assert isinstance(tool_message.content, (str, list))
|
||||
|
@ -1,4 +1,4 @@
|
||||
from typing import Type
|
||||
from typing import Literal, Type
|
||||
|
||||
from langchain_core.tools import BaseTool
|
||||
|
||||
@ -16,6 +16,17 @@ class ParrotMultiplyTool(BaseTool): # type: ignore
|
||||
return a * b + 80
|
||||
|
||||
|
||||
class ParrotMultiplyArtifactTool(BaseTool): # type: ignore
|
||||
name: str = "ParrotMultiplyArtifactTool"
|
||||
description: str = (
|
||||
"Multiply two numbers like a parrot. Parrots always add eighty for their matey."
|
||||
)
|
||||
response_format: Literal["content_and_artifact"] = "content_and_artifact"
|
||||
|
||||
def _run(self, a: int, b: int) -> tuple[int, str]:
|
||||
return a * b + 80, "parrot artifact"
|
||||
|
||||
|
||||
class TestParrotMultiplyToolUnit(ToolsUnitTests):
|
||||
@property
|
||||
def tool_constructor(self) -> Type[ParrotMultiplyTool]:
|
||||
@ -60,3 +71,26 @@ class TestParrotMultiplyToolIntegration(ToolsIntegrationTests):
|
||||
have {"name", "id", "args"} keys.
|
||||
"""
|
||||
return {"a": 2, "b": 3}
|
||||
|
||||
|
||||
class TestParrotMultiplyArtifactToolIntegration(ToolsIntegrationTests):
|
||||
@property
|
||||
def tool_constructor(self) -> Type[ParrotMultiplyArtifactTool]:
|
||||
return ParrotMultiplyArtifactTool
|
||||
|
||||
@property
|
||||
def tool_constructor_params(self) -> dict:
|
||||
# if your tool constructor instead required initialization arguments like
|
||||
# `def __init__(self, some_arg: int):`, you would return those here
|
||||
# as a dictionary, e.g.: `return {'some_arg': 42}`
|
||||
return {}
|
||||
|
||||
@property
|
||||
def tool_invoke_params_example(self) -> dict:
|
||||
"""
|
||||
Returns a dictionary representing the "args" of an example tool call.
|
||||
|
||||
This should NOT be a ToolCall dict - i.e. it should not
|
||||
have {"name", "id", "args"} keys.
|
||||
"""
|
||||
return {"a": 2, "b": 3}
|
||||
|
Loading…
Reference in New Issue
Block a user