diff --git a/examples/chatgpt/gpt_actions_library/gpt_action_google_calendar.md b/examples/chatgpt/gpt_actions_library/gpt_action_google_calendar.md new file mode 100644 index 0000000000..786513802a --- /dev/null +++ b/examples/chatgpt/gpt_actions_library/gpt_action_google_calendar.md @@ -0,0 +1,351 @@ +# GPT Action Library: Google Calendar + +## Introduction + +This page provides an instruction & guide for developers building a GPT Action for a specific application. Before you proceed, make sure to first familiarize yourself with the following information: + +- [Introduction to GPT Actions](https://platform.openai.com/docs/actions) +- [Introduction to GPT Actions Library](https://platform.openai.com/docs/actions/actions-library) +- [Example of Building a GPT Action from Scratch](https://platform.openai.com/docs/actions/getting-started) + +This GPT Action provides an overview of how to connect to your **Google Calendar**. It uses OAuth to link to your Google account, enabling you to create, read, update, and delete events within your calendar. + +### Value + Example Business Use Cases + +**Value**: Users can now leverage ChatGPT's natural language capability to connect directly to their Google Calendar. + +**Example Use Cases**: +- You want to create a new event in your calendar. +- You want to search your calendar for events based on a specific criteria. +- You want to delete an event from your calendar. + +***Note:*** This is a good example of an GPT that may be useful to call from other GPTs using the @ function. You can find more information on this feature on our [help site](https://help.openai.com/en/articles/8908924-what-is-the-mentions-feature-for-gpts). + + +## Application Information + +### Application Prerequisites + +Before you get started, ensure you can meet the following pre-requistes. + + - A Google account with Google Calendar access. + - Permissions to access the Google Calendar API and use the Google Cloud Console to configure your OAuth credentials. + +# Google Calendar Configuration Steps + +## Enabling the Google Calendar API + +- Visit [console.cloud.google.com](https://console.cloud.google.com). +- In the project selector, choose the project you’d like to use for this GPT Action. If you don’t have a project yet, click the **Create Project** button. +- When creating a new project, enter a name for it and select the billing account you’d like to associate. In this example, ‘No Organization’ is selected. + +
+ +You now have a Google Cloud Project and are ready to configure the API access to your Google Calendar. + +- In the Quck Access menu, select **APIs & Services** > **Library** +- Search for **Google Calendar API** (not DKIM) and click on it. +- Click on the **Enable** button. + +
+ +## Creating up OAuth Credentials + +The next step is to configure the OAuth credentials to allow your GPT Action to access your Google Calendar. + +Depending on your current configuration you may need to configure your OAuth consent screen. We'll start with that. + +- In the left menu click **Credentials** +- Now click **Configure consent screen** +- If you get the option, choose **Go To New Experience** and click **Get Started** +- Enter your app name and choose your email in the User support email dropdown. +- Choose Internal audience and enter a contact email. +- Agree to the terms and click **Create** + + +
+ +We are now ready to create the OAuth credentials. + +- Click **Create OAuth Credentials** +- Choose **Web Application** +- Enter your application name +- Under Authorizes JavaScript Origins, enter `https://chat.openai.com` & `https://chatgpt.com` +- For now we'll leave the **Authorized redirect URIs** blank. (we'll come back to this later) +- Click **Create** +- Open the credentials page and you'll see your OAuth client ID and client secret on the right of the screen. + + +
+ +## Configuring OAuth Scopes + +Next, configure the scopes (or services) that the OAuth client ID will have access to. In this case, we’ll configure access to the Google Calendar API. + +- In the left menu click **Data Access** +- Click **Add or Remove Scopes** +- In the right panel filter on `https://www.googleapis.com/auth/calendar` +- In the filtered results, choose the first result, the scope should end with `/auth/calendar` +- Click **Update** and then **Save** + + +
+ +# GPT Action Configuration Steps + +We are now ready to configure the GPT Action. First we'll configure the OAuth settings to allow the GPT to authenticate with Google Calendar. + +- In your GPT, create an action. +- Click on the settings gear icon and select **OAuth** +- Enter the **Client ID** and **Client Secret** from the Google Cloud Console. +- Enter the following details: + - Authorization URL: `https://accounts.google.com/o/oauth2/auth` + - Token URL: `https://oauth2.googleapis.com/token` + - Scopes: `https://www.googleapis.com/auth/calendar` +- Leave the Token Exchange Method as default. +- Click **Save** + + +Google Calendar OAuth + +We can now enter the OpenAPI schema for the action. The config below allows reading and creating events. Enter this in the OpenAPI schema field. + +```yaml +openapi: 3.1.0 +info: + title: Google Calendar API + description: This API allows you to read and create events in a user's Google Calendar. + version: 1.0.0 +servers: + - url: https://www.googleapis.com/calendar/v3 + description: Google Calendar API server + +paths: + /calendars/primary/events: + get: + summary: List events from the primary calendar + description: Retrieve a list of events from the user's primary Google Calendar. + operationId: listEvents + tags: + - Calendar + parameters: + - name: timeMin + in: query + description: The lower bound (inclusive) of the events to retrieve, in RFC3339 format. + required: false + schema: + type: string + format: date-time + example: "2024-11-01T00:00:00Z" + - name: timeMax + in: query + description: The upper bound (exclusive) of the events to retrieve, in RFC3339 format. + required: false + schema: + type: string + format: date-time + example: "2024-12-01T00:00:00Z" + - name: maxResults + in: query + description: The maximum number of events to return. + required: false + schema: + type: integer + default: 10 + - name: singleEvents + in: query + description: Whether to expand recurring events into instances. Defaults to `false`. + required: false + schema: + type: boolean + default: true + - name: orderBy + in: query + description: The order of events. Can be "startTime" or "updated". + required: false + schema: + type: string + enum: + - startTime + - updated + default: startTime + responses: + '200': + description: A list of events + content: + application/json: + schema: + type: object + properties: + items: + type: array + items: + type: object + properties: + id: + type: string + description: The event ID + summary: + type: string + description: The event summary (title) + start: + type: object + properties: + dateTime: + type: string + format: date-time + description: The start time of the event + date: + type: string + format: date + description: The start date of the all-day event + end: + type: object + properties: + dateTime: + type: string + format: date-time + description: The end time of the event + date: + type: string + format: date + description: The end date of the all-day event + location: + type: string + description: The location of the event + description: + type: string + description: A description of the event + '401': + description: Unauthorized access due to missing or invalid OAuth token + '400': + description: Bad request, invalid parameters + + post: + summary: Create a new event on the primary calendar + description: Creates a new event on the user's primary Google Calendar. + operationId: createEvent + tags: + - Calendar + requestBody: + description: The event data to create. + required: true + content: + application/json: + schema: + type: object + properties: + summary: + type: string + description: The title of the event + example: "Team Meeting" + location: + type: string + description: The location of the event + example: "Conference Room 1" + description: + type: string + description: A detailed description of the event + example: "Discuss quarterly results" + start: + type: object + properties: + dateTime: + type: string + format: date-time + description: Start time of the event + example: "2024-11-30T09:00:00Z" + timeZone: + type: string + description: Time zone of the event start + example: "UTC" + end: + type: object + properties: + dateTime: + type: string + format: date-time + description: End time of the event + example: "2024-11-30T10:00:00Z" + timeZone: + type: string + description: Time zone of the event end + example: "UTC" + attendees: + type: array + items: + type: object + properties: + email: + type: string + description: The email address of an attendee + example: "attendee@example.com" + required: + - summary + - start + - end + responses: + '201': + description: Event created successfully + content: + application/json: + schema: + type: object + properties: + id: + type: string + description: The ID of the created event + summary: + type: string + description: The event summary (title) + start: + type: object + properties: + dateTime: + type: string + format: date-time + description: The start time of the event + end: + type: object + properties: + dateTime: + type: string + format: date-time + description: The end time of the event + '400': + description: Bad request, invalid event data + '401': + description: Unauthorized access due to missing or invalid OAuth token + '500': + description: Internal server error +``` + +If successful, you'll see the two endpoints appear at the bottom of the configuration screen. + +Google Calendar Action Endpoints + +# Setting callback URL + +Now that we've configured the OAuth settings and set the OpenAPI schema, ChatGPT will generate a callback URL. You’ll need to add this URL to the **Authorized redirect URIs** in the Google Cloud Console. + +Exit the action configuration screen in ChatGPT and scroll to the bottom. There, you'll find the generated callback URL. + +**Note:** If you modify the OAuth settings, a new callback URL will be generated, which will also need to be added to the **Authorized redirect URIs** in the Google Cloud Console." + +Google Calendar Callback URL + +Copy this URL and add it to the **Authorized redirect URIs** in the Google Cloud Console, then click **Save**. + +Google Calendar Callback URL + + +# Testing the Action + +With your action configured, you can now test it in ChatGPT. Start by asking your GPT a test question, for example: `What events do I have today?` If this is the first time you've used the action, you'll be prompted to authorize the action. Click **Sign in with googleapis.com** and follow the prompts to authorize the action. + +Google Calendar Sign In + +Once authorized, you should then see the results from your calendar. + +Google Calendar results + diff --git a/images/google-calendar-action-config.png b/images/google-calendar-action-config.png new file mode 100644 index 0000000000..93f1b12ee3 Binary files /dev/null and b/images/google-calendar-action-config.png differ diff --git a/images/google-calendar-action-endpoints.png b/images/google-calendar-action-endpoints.png new file mode 100644 index 0000000000..d41dce8b86 Binary files /dev/null and b/images/google-calendar-action-endpoints.png differ diff --git a/images/google-calendar-callback-settings.png b/images/google-calendar-callback-settings.png new file mode 100644 index 0000000000..4c240dbedb Binary files /dev/null and b/images/google-calendar-callback-settings.png differ diff --git a/images/google-calendar-callback.png b/images/google-calendar-callback.png new file mode 100644 index 0000000000..c789c155f5 Binary files /dev/null and b/images/google-calendar-callback.png differ diff --git a/images/google-calendar-results.png b/images/google-calendar-results.png new file mode 100644 index 0000000000..f1cc7fa0a6 Binary files /dev/null and b/images/google-calendar-results.png differ diff --git a/images/google-signin.png b/images/google-signin.png new file mode 100644 index 0000000000..dbe20de75a Binary files /dev/null and b/images/google-signin.png differ diff --git a/registry.yaml b/registry.yaml index 9c0e75d2ab..b96cb47e0a 100644 --- a/registry.yaml +++ b/registry.yaml @@ -1728,3 +1728,13 @@ - gpt-actions-library - chatgpt-productivity - chatgpt + +- title: GPT Actions library - Google Calendar + path: examples/chatgpt/gpt_actions_library/gpt_action_google_calendar.md + date: 2024-11-22 + authors: + - lspacagna-oai + tags: + - gpt-actions-library + - chatgpt + - chatgpt-communication