mirror of
https://github.com/hwchase17/langchain.git
synced 2025-09-08 22:42:05 +00:00
community: Add you.com tool, add async to retriever, add async testing, add You tool doc (#18032)
- **Description:** finishes adding the you.com functionality including: - add async functions to utility and retriever - add the You.com Tool - add async testing for utility, retriever, and tool - add a tool integration notebook page - **Dependencies:** any dependencies required for this change - **Twitter handle:** @scottnath
This commit is contained in:
@@ -1,3 +1,6 @@
|
||||
from unittest.mock import AsyncMock, patch
|
||||
|
||||
import pytest
|
||||
import responses
|
||||
|
||||
from langchain_community.retrievers.you import YouRetriever
|
||||
@@ -70,3 +73,39 @@ class TestYouRetriever:
|
||||
results = you_wrapper.results(query)
|
||||
expected_result = NEWS_RESPONSE_PARSED
|
||||
assert results == expected_result
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_aget_relevant_documents(self) -> None:
|
||||
instance = YouRetriever(ydc_api_key="test_api_key")
|
||||
|
||||
# Mock response object to simulate aiohttp response
|
||||
mock_response = AsyncMock()
|
||||
mock_response.__aenter__.return_value = (
|
||||
mock_response # Make the context manager return itself
|
||||
)
|
||||
mock_response.__aexit__.return_value = None # No value needed for exit
|
||||
mock_response.status = 200
|
||||
mock_response.json = AsyncMock(return_value=MOCK_RESPONSE_RAW)
|
||||
|
||||
# Patch the aiohttp.ClientSession object
|
||||
with patch("aiohttp.ClientSession.get", return_value=mock_response):
|
||||
results = await instance.aget_relevant_documents("test query")
|
||||
assert results == MOCK_PARSED_OUTPUT
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_ainvoke(self) -> None:
|
||||
instance = YouRetriever(ydc_api_key="test_api_key")
|
||||
|
||||
# Mock response object to simulate aiohttp response
|
||||
mock_response = AsyncMock()
|
||||
mock_response.__aenter__.return_value = (
|
||||
mock_response # Make the context manager return itself
|
||||
)
|
||||
mock_response.__aexit__.return_value = None # No value needed for exit
|
||||
mock_response.status = 200
|
||||
mock_response.json = AsyncMock(return_value=MOCK_RESPONSE_RAW)
|
||||
|
||||
# Patch the aiohttp.ClientSession object
|
||||
with patch("aiohttp.ClientSession.get", return_value=mock_response):
|
||||
results = await instance.ainvoke("test query")
|
||||
assert results == MOCK_PARSED_OUTPUT
|
||||
|
@@ -122,6 +122,7 @@ EXPECTED_ALL = [
|
||||
"WolframAlphaQueryRun",
|
||||
"WriteFileTool",
|
||||
"YahooFinanceNewsTool",
|
||||
"YouSearchTool",
|
||||
"YouTubeSearchTool",
|
||||
"ZapierNLAListActions",
|
||||
"ZapierNLARunAction",
|
||||
|
@@ -124,6 +124,7 @@ _EXPECTED = [
|
||||
"WolframAlphaQueryRun",
|
||||
"WriteFileTool",
|
||||
"YahooFinanceNewsTool",
|
||||
"YouSearchTool",
|
||||
"YouTubeSearchTool",
|
||||
"ZapierNLAListActions",
|
||||
"ZapierNLARunAction",
|
||||
|
87
libs/community/tests/unit_tests/tools/test_you.py
Normal file
87
libs/community/tests/unit_tests/tools/test_you.py
Normal file
@@ -0,0 +1,87 @@
|
||||
from unittest.mock import AsyncMock, patch
|
||||
|
||||
import pytest
|
||||
import responses
|
||||
|
||||
from langchain_community.tools.you import YouSearchTool
|
||||
from langchain_community.utilities.you import YouSearchAPIWrapper
|
||||
|
||||
from ..utilities.test_you import (
|
||||
LIMITED_PARSED_OUTPUT,
|
||||
MOCK_PARSED_OUTPUT,
|
||||
MOCK_RESPONSE_RAW,
|
||||
NEWS_RESPONSE_PARSED,
|
||||
NEWS_RESPONSE_RAW,
|
||||
TEST_ENDPOINT,
|
||||
)
|
||||
|
||||
|
||||
class TestYouSearchTool:
|
||||
@responses.activate
|
||||
def test_invoke(self) -> None:
|
||||
responses.add(
|
||||
responses.GET, f"{TEST_ENDPOINT}/search", json=MOCK_RESPONSE_RAW, status=200
|
||||
)
|
||||
query = "Test query text"
|
||||
you_tool = YouSearchTool(api_wrapper=YouSearchAPIWrapper(ydc_api_key="test"))
|
||||
results = you_tool.invoke(query)
|
||||
expected_result = MOCK_PARSED_OUTPUT
|
||||
assert results == expected_result
|
||||
|
||||
@responses.activate
|
||||
def test_invoke_max_docs(self) -> None:
|
||||
responses.add(
|
||||
responses.GET, f"{TEST_ENDPOINT}/search", json=MOCK_RESPONSE_RAW, status=200
|
||||
)
|
||||
query = "Test query text"
|
||||
you_tool = YouSearchTool(
|
||||
api_wrapper=YouSearchAPIWrapper(ydc_api_key="test", k=2)
|
||||
)
|
||||
results = you_tool.invoke(query)
|
||||
expected_result = [MOCK_PARSED_OUTPUT[0], MOCK_PARSED_OUTPUT[1]]
|
||||
assert results == expected_result
|
||||
|
||||
@responses.activate
|
||||
def test_invoke_limit_snippets(self) -> None:
|
||||
responses.add(
|
||||
responses.GET, f"{TEST_ENDPOINT}/search", json=MOCK_RESPONSE_RAW, status=200
|
||||
)
|
||||
query = "Test query text"
|
||||
you_tool = YouSearchTool(
|
||||
api_wrapper=YouSearchAPIWrapper(ydc_api_key="test", n_snippets_per_hit=1)
|
||||
)
|
||||
results = you_tool.invoke(query)
|
||||
expected_result = LIMITED_PARSED_OUTPUT
|
||||
assert results == expected_result
|
||||
|
||||
@responses.activate
|
||||
def test_invoke_news(self) -> None:
|
||||
responses.add(
|
||||
responses.GET, f"{TEST_ENDPOINT}/news", json=NEWS_RESPONSE_RAW, status=200
|
||||
)
|
||||
|
||||
query = "Test news text"
|
||||
you_tool = YouSearchTool(
|
||||
api_wrapper=YouSearchAPIWrapper(ydc_api_key="test", endpoint_type="news")
|
||||
)
|
||||
results = you_tool.invoke(query)
|
||||
expected_result = NEWS_RESPONSE_PARSED
|
||||
assert results == expected_result
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_ainvoke(self) -> None:
|
||||
you_tool = YouSearchTool(api_wrapper=YouSearchAPIWrapper(ydc_api_key="test"))
|
||||
|
||||
# Mock response object to simulate aiohttp response
|
||||
mock_response = AsyncMock()
|
||||
mock_response.__aenter__.return_value = (
|
||||
mock_response # Make the context manager return itself
|
||||
)
|
||||
mock_response.__aexit__.return_value = None # No value needed for exit
|
||||
mock_response.status = 200
|
||||
mock_response.json = AsyncMock(return_value=MOCK_RESPONSE_RAW)
|
||||
|
||||
# Patch the aiohttp.ClientSession object
|
||||
with patch("aiohttp.ClientSession.get", return_value=mock_response):
|
||||
results = await you_tool.ainvoke("test query")
|
||||
assert results == MOCK_PARSED_OUTPUT
|
@@ -1,5 +1,7 @@
|
||||
from typing import Any, Dict, List, Optional, Union
|
||||
from unittest.mock import AsyncMock, patch
|
||||
|
||||
import pytest
|
||||
import responses
|
||||
from langchain_core.documents import Document
|
||||
|
||||
@@ -187,4 +189,58 @@ def test_results_news() -> None:
|
||||
assert raw_results == expected_result
|
||||
|
||||
|
||||
# @todo test async methods
|
||||
@pytest.mark.asyncio
|
||||
async def test_raw_results_async() -> None:
|
||||
instance = YouSearchAPIWrapper(ydc_api_key="test_api_key")
|
||||
|
||||
# Mock response object to simulate aiohttp response
|
||||
mock_response = AsyncMock()
|
||||
mock_response.__aenter__.return_value = (
|
||||
mock_response # Make the context manager return itself
|
||||
)
|
||||
mock_response.__aexit__.return_value = None # No value needed for exit
|
||||
mock_response.status = 200
|
||||
mock_response.json = AsyncMock(return_value=MOCK_RESPONSE_RAW)
|
||||
|
||||
# Patch the aiohttp.ClientSession object
|
||||
with patch("aiohttp.ClientSession.get", return_value=mock_response):
|
||||
results = await instance.raw_results_async("test query")
|
||||
assert results == MOCK_RESPONSE_RAW
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_results_async() -> None:
|
||||
instance = YouSearchAPIWrapper(ydc_api_key="test_api_key")
|
||||
|
||||
# Mock response object to simulate aiohttp response
|
||||
mock_response = AsyncMock()
|
||||
mock_response.__aenter__.return_value = (
|
||||
mock_response # Make the context manager return itself
|
||||
)
|
||||
mock_response.__aexit__.return_value = None # No value needed for exit
|
||||
mock_response.status = 200
|
||||
mock_response.json = AsyncMock(return_value=MOCK_RESPONSE_RAW)
|
||||
|
||||
# Patch the aiohttp.ClientSession object
|
||||
with patch("aiohttp.ClientSession.get", return_value=mock_response):
|
||||
results = await instance.results_async("test query")
|
||||
assert results == MOCK_PARSED_OUTPUT
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_results_news_async() -> None:
|
||||
instance = YouSearchAPIWrapper(endpoint_type="news", ydc_api_key="test_api_key")
|
||||
|
||||
# Mock response object to simulate aiohttp response
|
||||
mock_response = AsyncMock()
|
||||
mock_response.__aenter__.return_value = (
|
||||
mock_response # Make the context manager return itself
|
||||
)
|
||||
mock_response.__aexit__.return_value = None # No value needed for exit
|
||||
mock_response.status = 200
|
||||
mock_response.json = AsyncMock(return_value=NEWS_RESPONSE_RAW)
|
||||
|
||||
# Patch the aiohttp.ClientSession object
|
||||
with patch("aiohttp.ClientSession.get", return_value=mock_response):
|
||||
results = await instance.results_async("test query")
|
||||
assert results == NEWS_RESPONSE_PARSED
|
||||
|
Reference in New Issue
Block a user