From d90101ea705172befd8e5acb26acda628fbcbb83 Mon Sep 17 00:00:00 2001 From: Nate Barbettini Date: Fri, 16 Aug 2024 17:13:44 -0700 Subject: [PATCH] Fix authorized tools (#14) A few quick fixes while testing the gmail tool with the real Engine: - Renamed `tool.requirements.auth` to `authorization` -- Engine already used `authorization` - Fixed the credentials initializer in the gmail tool --- arcade/arcade/core/catalog.py | 2 +- arcade/arcade/core/schema.py | 2 +- arcade/tests/tool/test_create_tool_definition.py | 2 +- schemas/preview/tool_definition.schema.jsonc | 7 ++++--- toolkits/gmail/arcade_gmail/tools/gmail.py | 3 ++- 5 files changed, 9 insertions(+), 7 deletions(-) diff --git a/arcade/arcade/core/catalog.py b/arcade/arcade/core/catalog.py index 9431da11..37f3858a 100644 --- a/arcade/arcade/core/catalog.py +++ b/arcade/arcade/core/catalog.py @@ -193,7 +193,7 @@ class ToolCatalog(BaseModel): inputs=create_input_definition(tool), output=create_output_definition(tool), requirements=ToolRequirements( - auth=auth_requirement, + authorization=auth_requirement, ), ) diff --git a/arcade/arcade/core/schema.py b/arcade/arcade/core/schema.py index 538cc0da..259c9863 100644 --- a/arcade/arcade/core/schema.py +++ b/arcade/arcade/core/schema.py @@ -81,7 +81,7 @@ class ToolAuthRequirement(BaseModel): class ToolRequirements(BaseModel): """The requirements for a tool to run.""" - auth: Union[ToolAuthRequirement, None] = None + authorization: Union[ToolAuthRequirement, None] = None """The authorization requirements for the tool, if any.""" diff --git a/arcade/tests/tool/test_create_tool_definition.py b/arcade/tests/tool/test_create_tool_definition.py index 18441225..8d44d650 100644 --- a/arcade/tests/tool/test_create_tool_definition.py +++ b/arcade/tests/tool/test_create_tool_definition.py @@ -198,7 +198,7 @@ def func_with_complex_return() -> list[dict[str, str]]: func_with_auth_requirement, { "requirements": ToolRequirements( - auth=ToolAuthRequirement( + authorization=ToolAuthRequirement( oauth2=OAuth2Requirement( authority="https://example.com/oauth2/auth", scope=["scope1", "scope2"], diff --git a/schemas/preview/tool_definition.schema.jsonc b/schemas/preview/tool_definition.schema.jsonc index 79d51ace..8d2bc6d9 100644 --- a/schemas/preview/tool_definition.schema.jsonc +++ b/schemas/preview/tool_definition.schema.jsonc @@ -124,7 +124,7 @@ "oauth2": { "type": "object", "properties": { - "url": { + "authority": { "type": "string", "format": "uri" }, @@ -135,7 +135,7 @@ } } }, - "required": ["url"], + "required": ["authority"], "additionalProperties": false } }, @@ -144,7 +144,8 @@ } ] } - } + }, + "additionalProperties": false } }, "required": ["name", "version", "inputs", "output"], diff --git a/toolkits/gmail/arcade_gmail/tools/gmail.py b/toolkits/gmail/arcade_gmail/tools/gmail.py index 93bb1062..a71a4ff5 100644 --- a/toolkits/gmail/arcade_gmail/tools/gmail.py +++ b/toolkits/gmail/arcade_gmail/tools/gmail.py @@ -4,6 +4,7 @@ from typing import Annotated from bs4 import BeautifulSoup from googleapiclient.discovery import build +from google.oauth2.credentials import Credentials from arcade.core.schema import ToolContext from arcade.sdk import tool @@ -23,7 +24,7 @@ async def get_emails( """Read emails from a Gmail account and extract plain text content, removing any HTML.""" # Call the Gmail API - service = build("gmail", "v1", credentials=context.authorization.token) + service = build("gmail", "v1", credentials=Credentials(context.authorization.token)) # Request a list of all the messages result = service.users().messages().list(userId="me").execute()