On the last few PRs I have noticed two problems: 1. `ruff format` fails even though it seems OK on our local machines (sometimes, not always) 2. Nate's and Sam's machines kept flip-flopping a specific piece of formatting back and forth, indicating a subtle difference of config hiding somewhere 3. This was reproducible by running `ruff format` in the terminal, followed by `make check`. The former would edit files, and then `make check` would edit them back! This PR addresses both issues, and further standardizes our editor & linter configs to be super stable. Specifically: 1. The main fix for the above, the pre-commit hook was pinned to a super old version of ruff. This resulted in subtle differences in behavior between our machines, and on CI. 2. Moved ruff settings from `pyproject.toml` to `.ruff.toml` pyproject files in subdirectories (e.g. `toolkits/**`) were overriding the main pyproject file and erasing the custom ruff config we set at the root. This meant that our ruff config was applied to `arcade` but not to any of the other packages. By moving the config to `.ruff.toml` at the root, all projects will inherit the same ruff linting & formatting config. 4. Un-ignored the `.vscode/` directory so that we can share vscode/cursor workspace settings. This is valuable for standardizing settings like the default formatter (ruff) and default test framework (pytest). However, it's important that going forward we _only_ commit things here that should apply across all of our machines. 5. To avoid any conflict between prettier and ruff, prettier now explicitly ignores *.py files 6. Finally, `ruff format` and `make check` agree. A number of files are newly auto-formatted.
58 lines
2 KiB
Python
58 lines
2 KiB
Python
import time # Import time for polling delays
|
|
|
|
from google.oauth2.credentials import Credentials
|
|
from langchain_google_community import GmailToolkit
|
|
from langchain_google_community.gmail.utils import (
|
|
build_resource_service,
|
|
)
|
|
from langchain_openai import ChatOpenAI
|
|
from langgraph.prebuilt import create_react_agent
|
|
|
|
# Step 1: Install required packages
|
|
# Run the following in your terminal:
|
|
# %pip install -qU langchain-google-community[gmail]
|
|
# %pip install -qU langchain-openai
|
|
# %pip install -qU langgraph
|
|
from arcade.client import Arcade, AuthProvider
|
|
|
|
client = Arcade()
|
|
|
|
# Start the authorization process for the tool "ListEmails"
|
|
auth_response = client.auth.authorize(
|
|
provider=AuthProvider.google,
|
|
scopes=["https://www.googleapis.com/auth/gmail.readonly"],
|
|
user_id="sam@arcade-ai.com",
|
|
)
|
|
|
|
# If authorization is not completed, prompt the user and poll for status
|
|
if auth_response.status != "completed":
|
|
print("Please complete the authorization challenge in your browser before continuing:")
|
|
print(auth_response.auth_url)
|
|
input("Press Enter to continue...")
|
|
|
|
# Poll for authorization status using the auth polling method
|
|
while auth_response.status != "completed":
|
|
# Wait before polling again to avoid spamming the server
|
|
time.sleep(4)
|
|
auth_response = client.auth.status(auth_response)
|
|
|
|
# Authorization is completed; proceed with obtaining credentials
|
|
creds = Credentials(auth_response.context.token)
|
|
api_resource = build_resource_service(credentials=creds)
|
|
toolkit = GmailToolkit(api_resource=api_resource)
|
|
|
|
# Step 4: Get available tools
|
|
tools = toolkit.get_tools()
|
|
|
|
# Step 5: Initialize the LLM and create an agent
|
|
llm = ChatOpenAI(model="gpt-4o")
|
|
agent_executor = create_react_agent(llm, tools)
|
|
|
|
# Step 6: Draft an email using the agent
|
|
example_query = "Read my latest emails to me and summarize them."
|
|
events = agent_executor.stream(
|
|
{"messages": [("user", example_query)]},
|
|
stream_mode="values",
|
|
)
|
|
for event in events:
|
|
event["messages"][-1].pretty_print()
|