Use AuthorizationResponse and ToolDefinition (#221)

This commit is contained in:
Eric Gustin 2025-01-23 18:32:00 -08:00 committed by GitHub
parent 66e54d7cde
commit 6fb45c8797
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 15 additions and 15 deletions

View file

@ -7,7 +7,7 @@ from typing import Any, Optional
import typer import typer
from arcadepy import Arcade from arcadepy import Arcade
from arcadepy.types import AuthAuthorizationResponse from arcadepy.types import AuthorizationResponse
from openai import OpenAI, OpenAIError from openai import OpenAI, OpenAIError
from rich.console import Console from rich.console import Console
from rich.markup import escape from rich.markup import escape
@ -269,7 +269,7 @@ def chat(
if tool_authorization and is_authorization_pending(tool_authorization): if tool_authorization and is_authorization_pending(tool_authorization):
chat_result = handle_tool_authorization( chat_result = handle_tool_authorization(
client, client,
AuthAuthorizationResponse.model_validate(tool_authorization), AuthorizationResponse.model_validate(tool_authorization),
history, history,
openai_client, openai_client,
model, model,

View file

@ -12,7 +12,7 @@ from urllib.parse import urlencode, urlparse
import idna import idna
import typer import typer
from arcadepy import NOT_GIVEN, APIConnectionError, APIStatusError, APITimeoutError, Arcade from arcadepy import NOT_GIVEN, APIConnectionError, APIStatusError, APITimeoutError, Arcade
from arcadepy.types import AuthAuthorizationResponse from arcadepy.types import AuthorizationResponse
from openai import OpenAI from openai import OpenAI
from openai.resources.chat.completions import ChatCompletionChunk, Stream from openai.resources.chat.completions import ChatCompletionChunk, Stream
from openai.types.chat.chat_completion import Choice as ChatCompletionChoice from openai.types.chat.chat_completion import Choice as ChatCompletionChoice
@ -404,7 +404,7 @@ def handle_chat_interaction(
def handle_tool_authorization( def handle_tool_authorization(
arcade_client: Arcade, arcade_client: Arcade,
tool_authorization: AuthAuthorizationResponse, tool_authorization: AuthorizationResponse,
history: list[dict[str, Any]], history: list[dict[str, Any]],
openai_client: OpenAI, openai_client: OpenAI,
model: str, model: str,
@ -432,7 +432,7 @@ def handle_tool_authorization(
def wait_for_authorization_completion( def wait_for_authorization_completion(
client: Arcade, tool_authorization: AuthAuthorizationResponse | None client: Arcade, tool_authorization: AuthorizationResponse | None
) -> None: ) -> None:
""" """
Wait for the authorization for a tool call to complete i.e., wait for the user to click on Wait for the authorization for a tool call to complete i.e., wait for the user to click on
@ -441,7 +441,7 @@ def wait_for_authorization_completion(
if tool_authorization is None: if tool_authorization is None:
return return
auth_response = AuthAuthorizationResponse.model_validate(tool_authorization) auth_response = AuthorizationResponse.model_validate(tool_authorization)
while auth_response.status != "completed": while auth_response.status != "completed":
try: try:

View file

@ -21,7 +21,7 @@ rich = "^13.7.1"
Jinja2 = ">=3.1.5,<4.0.0" Jinja2 = ">=3.1.5,<4.0.0"
pyyaml = "^6.0" pyyaml = "^6.0"
openai = "^1.36.0" # TODO: relax to an earlier version that still has what we need openai = "^1.36.0" # TODO: relax to an earlier version that still has what we need
arcadepy = "1.0.0rc1" arcadepy = "^1.0.0"
pyjwt = "^2.8.0" pyjwt = "^2.8.0"
loguru = "^0.7.0" loguru = "^0.7.0"
tqdm = "^4.1.0" tqdm = "^4.1.0"

View file

@ -1,7 +1,7 @@
from typing import Any, Callable from typing import Any, Callable
from arcadepy import NOT_GIVEN, Arcade from arcadepy import NOT_GIVEN, Arcade
from arcadepy.types import ToolGetResponse as ToolDefinition from arcadepy.types import ToolDefinition
from langchain_core.runnables import RunnableConfig from langchain_core.runnables import RunnableConfig
from langchain_core.tools import StructuredTool from langchain_core.tools import StructuredTool
from pydantic import BaseModel, Field, create_model from pydantic import BaseModel, Field, create_model

View file

@ -3,8 +3,8 @@ from collections.abc import Iterator
from typing import Any, Optional from typing import Any, Optional
from arcadepy import Arcade from arcadepy import Arcade
from arcadepy.types import ToolGetResponse as ToolDefinition from arcadepy.types import ToolDefinition
from arcadepy.types.shared import AuthAuthorizationResponse as AuthorizationResponse from arcadepy.types.shared import AuthorizationResponse
from langchain_core.tools import StructuredTool from langchain_core.tools import StructuredTool
from langchain_arcade._utilities import ( from langchain_arcade._utilities import (
@ -188,7 +188,7 @@ class ArcadeToolManager:
# First, gather single tools if the user specifically requested them. # First, gather single tools if the user specifically requested them.
if tools: if tools:
for tool_id in tools: for tool_id in tools:
# ToolsResource.get(...) returns a single ToolGetResponse. # ToolsResource.get(...) returns a single ToolDefinition.
single_tool = self.client.tools.get(name=tool_id) single_tool = self.client.tools.get(name=tool_id)
all_tools.append(single_tool) all_tools.append(single_tool)

View file

@ -10,7 +10,7 @@ license = "MIT"
[tool.poetry.dependencies] [tool.poetry.dependencies]
python = ">=3.10,<3.13" python = ">=3.10,<3.13"
langchain-core = "^0.3.0" langchain-core = "^0.3.0"
arcadepy = "~1.0.0rc1" arcadepy = "^1.0.0"
langgraph = {version = ">=0.2.32,<0.3.0", optional = true} langgraph = {version = ">=0.2.32,<0.3.0", optional = true}
[tool.poetry.extras] [tool.poetry.extras]

View file

@ -2,8 +2,8 @@ from unittest.mock import MagicMock
import pytest import pytest
from arcadepy.pagination import SyncOffsetPage from arcadepy.pagination import SyncOffsetPage
from arcadepy.types import ToolGetResponse as ToolDefinition from arcadepy.types import ToolDefinition
from arcadepy.types.shared import AuthAuthorizationResponse as AuthorizationResponse from arcadepy.types.shared import AuthorizationResponse
from langchain_arcade.manager import ArcadeToolManager from langchain_arcade.manager import ArcadeToolManager
@ -63,7 +63,7 @@ def make_tool():
toolkit = kwargs.pop("toolkit", {"name": raw_toolkit}) toolkit = kwargs.pop("toolkit", {"name": raw_toolkit})
# Provide a default input # Provide a default input
# arcadepy.types.ToolGetResponse expects "input" to be a valid structure (dict). # arcadepy.types.ToolDefinition expects "input" to be a valid structure (dict).
tool_input = kwargs.pop("input", {"parameters": []}) tool_input = kwargs.pop("input", {"parameters": []})
# Convert MagicMock-based requirements (with authorization) to an appropriate dict, # Convert MagicMock-based requirements (with authorization) to an appropriate dict,