Zapier - Add better error messaging for 401 responses (#6840)

Description: When a 401 response is given back by Zapier, hint to the
end user why that may have occurred

- If an API Key was initialized with the wrapper, ask them to check
their API Key value
- if an access token was initialized with the wrapper, ask them to check
their access token or verify that it doesn't need to be refreshed.

Tag maintainer: @dev2049
This commit is contained in:
Robert Lewis 2023-06-27 16:35:42 -07:00 committed by GitHub
parent b24472eae3
commit 74848aafea
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 83 additions and 3 deletions

View File

@ -322,7 +322,7 @@ class SearxSearchWrapper(BaseModel):
str: The result of the query. str: The result of the query.
Raises: Raises:
ValueError: If an error occured with the query. ValueError: If an error occurred with the query.
Example: Example:

View File

@ -127,8 +127,22 @@ class ZapierNLAWrapper(BaseModel):
https://nla.zapier.com/docs/using-the-api#ai-guessing) https://nla.zapier.com/docs/using-the-api#ai-guessing)
""" """
session = self._get_session() session = self._get_session()
try:
response = session.get(self.zapier_nla_api_base + "exposed/") response = session.get(self.zapier_nla_api_base + "exposed/")
response.raise_for_status() response.raise_for_status()
except requests.HTTPError as http_err:
if response.status_code == 401:
if self.zapier_nla_oauth_access_token:
raise requests.HTTPError(
f"An unauthorized response occurred. Check that your "
f"access token is correct and doesn't need to be "
f"refreshed. Err: {http_err}"
)
raise requests.HTTPError(
f"An unauthorized response occurred. Check that your api "
f"key is correct. Err: {http_err}"
)
raise http_err
return response.json()["results"] return response.json()["results"]
def run( def run(

View File

@ -1,5 +1,8 @@
"""Test building the Zapier tool, not running it.""" """Test building the Zapier tool, not running it."""
from unittest.mock import MagicMock, patch
import pytest import pytest
import requests
from langchain.tools.zapier.prompt import BASE_ZAPIER_TOOL_PROMPT from langchain.tools.zapier.prompt import BASE_ZAPIER_TOOL_PROMPT
from langchain.tools.zapier.tool import ZapierNLARunAction from langchain.tools.zapier.tool import ZapierNLARunAction
@ -66,3 +69,66 @@ def test_wrapper_api_key_initialization() -> None:
def test_wrapper_access_token_initialization() -> None: def test_wrapper_access_token_initialization() -> None:
"""Test Wrapper initializes with an API Key.""" """Test Wrapper initializes with an API Key."""
ZapierNLAWrapper(zapier_nla_oauth_access_token="test") ZapierNLAWrapper(zapier_nla_oauth_access_token="test")
def test_list_raises_401_invalid_api_key() -> None:
"""Test that a valid error is raised when the API Key is invalid."""
mock_response = MagicMock()
mock_response.status_code = 401
mock_response.raise_for_status.side_effect = requests.HTTPError(
"401 Client Error: Unauthorized for url: https://nla.zapier.com/api/v1/exposed/"
)
mock_session = MagicMock()
mock_session.get.return_value = mock_response
with patch("requests.Session", return_value=mock_session):
wrapper = ZapierNLAWrapper(zapier_nla_api_key="test")
with pytest.raises(requests.HTTPError) as err:
wrapper.list()
assert str(err.value).startswith(
"An unauthorized response occurred. Check that your api key is correct. "
"Err:"
)
def test_list_raises_401_invalid_access_token() -> None:
"""Test that a valid error is raised when the API Key is invalid."""
mock_response = MagicMock()
mock_response.status_code = 401
mock_response.raise_for_status.side_effect = requests.HTTPError(
"401 Client Error: Unauthorized for url: https://nla.zapier.com/api/v1/exposed/"
)
mock_session = MagicMock()
mock_session.get.return_value = mock_response
with patch("requests.Session", return_value=mock_session):
wrapper = ZapierNLAWrapper(zapier_nla_oauth_access_token="test")
with pytest.raises(requests.HTTPError) as err:
wrapper.list()
assert str(err.value).startswith(
"An unauthorized response occurred. Check that your access token is "
"correct and doesn't need to be refreshed. Err:"
)
def test_list_raises_other_error() -> None:
"""Test that a valid error is raised when an unknown HTTP Error occurs."""
mock_response = MagicMock()
mock_response.status_code = 404
mock_response.raise_for_status.side_effect = requests.HTTPError(
"404 Client Error: Not found for url"
)
mock_session = MagicMock()
mock_session.get.return_value = mock_response
with patch("requests.Session", return_value=mock_session):
wrapper = ZapierNLAWrapper(zapier_nla_oauth_access_token="test")
with pytest.raises(requests.HTTPError) as err:
wrapper.list()
assert str(err.value) == "404 Client Error: Not found for url"