{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Gmail Toolkit\n", "\n", "This notebook walks through connecting a LangChain email to the Gmail API.\n", "\n", "To use this toolkit, you will need to set up your credentials explained in the [Gmail API docs](https://developers.google.com/gmail/api/quickstart/python#authorize_credentials_for_a_desktop_application). Once you've downloaded the `credentials.json` file, you can start using the Gmail API. Once this is done, we'll install the required libraries." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "!pip install --upgrade google-api-python-client > /dev/null\n", "!pip install --upgrade google-auth-oauthlib > /dev/null\n", "!pip install --upgrade google-auth-httplib2 > /dev/null\n", "!pip install beautifulsoup4 > /dev/null # This is optional but is useful for parsing HTML messages" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Create the Toolkit\n", "\n", "By default the toolkit reads the local `credentials.json` file. You can also manually provide a `Credentials` object." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "tags": [] }, "outputs": [], "source": [ "from langchain.agents.agent_toolkits import GmailToolkit\n", "\n", "toolkit = GmailToolkit()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Customizing Authentication\n", "\n", "Behind the scenes, a `googleapi` resource is created using the following methods. \n", "you can manually build a `googleapi` resource for more auth control. " ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "tags": [] }, "outputs": [], "source": [ "from langchain.tools.gmail.utils import build_resource_service, get_gmail_credentials\n", "\n", "# Can review scopes here https://developers.google.com/gmail/api/auth/scopes\n", "# For instance, readonly scope is 'https://www.googleapis.com/auth/gmail.readonly'\n", "credentials = get_gmail_credentials(\n", " token_file=\"token.json\",\n", " scopes=[\"https://mail.google.com/\"],\n", " client_secrets_file=\"credentials.json\",\n", ")\n", "api_resource = build_resource_service(credentials=credentials)\n", "toolkit = GmailToolkit(api_resource=api_resource)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "[GmailCreateDraft(name='create_gmail_draft', description='Use this tool to create a draft email with the provided message fields.', args_schema=, return_direct=False, verbose=False, callbacks=None, callback_manager=None, api_resource=),\n", " GmailSendMessage(name='send_gmail_message', description='Use this tool to send email messages. The input is the message, recipents', args_schema=None, return_direct=False, verbose=False, callbacks=None, callback_manager=None, api_resource=),\n", " GmailSearch(name='search_gmail', description=('Use this tool to search for email messages or threads. The input must be a valid Gmail query. The output is a JSON list of the requested resource.',), args_schema=, return_direct=False, verbose=False, callbacks=None, callback_manager=None, api_resource=),\n", " GmailGetMessage(name='get_gmail_message', description='Use this tool to fetch an email by message ID. Returns the thread ID, snipet, body, subject, and sender.', args_schema=, return_direct=False, verbose=False, callbacks=None, callback_manager=None, api_resource=),\n", " GmailGetThread(name='get_gmail_thread', description=('Use this tool to search for email messages. The input must be a valid Gmail query. The output is a JSON list of messages.',), args_schema=, return_direct=False, verbose=False, callbacks=None, callback_manager=None, api_resource=)]" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tools = toolkit.get_tools()\n", "tools" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Use within an Agent" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "tags": [] }, "outputs": [], "source": [ "from langchain import OpenAI\n", "from langchain.agents import initialize_agent, AgentType" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "tags": [] }, "outputs": [], "source": [ "llm = OpenAI(temperature=0)\n", "agent = initialize_agent(\n", " tools=toolkit.get_tools(),\n", " llm=llm,\n", " agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,\n", ")" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "tags": [] }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "WARNING:root:Failed to load default session, using empty session: 0\n", "WARNING:root:Failed to persist run: {\"detail\":\"Not Found\"}\n" ] }, { "data": { "text/plain": [ "'I have created a draft email for you to edit. The draft Id is r5681294731961864018.'" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "agent.run(\n", " \"Create a gmail draft for me to edit of a letter from the perspective of a sentient parrot\"\n", " \" who is looking to collaborate on some research with her\"\n", " \" estranged friend, a cat. Under no circumstances may you send the message, however.\"\n", ")" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "tags": [] }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "WARNING:root:Failed to load default session, using empty session: 0\n", "WARNING:root:Failed to persist run: {\"detail\":\"Not Found\"}\n" ] }, { "data": { "text/plain": [ "\"The latest email in your drafts is from hopefulparrot@gmail.com with the subject 'Collaboration Opportunity'. The body of the email reads: 'Dear [Friend], I hope this letter finds you well. I am writing to you in the hopes of rekindling our friendship and to discuss the possibility of collaborating on some research together. I know that we have had our differences in the past, but I believe that we can put them aside and work together for the greater good. I look forward to hearing from you. Sincerely, [Parrot]'\"" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "agent.run(\"Could you search in my drafts for the latest email?\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.2" } }, "nbformat": 4, "nbformat_minor": 4 }