From 2cece5d50033650ac1fcc387bc29fba5793d59f7 Mon Sep 17 00:00:00 2001 From: gladstone-openai <149190645+gladstone-openai@users.noreply.github.com> Date: Wed, 14 Aug 2024 08:24:46 -0700 Subject: [PATCH] Gladstone's Snowflake Direct GPT Action Library cookbook (#1374) Co-authored-by: pap --- authors.yaml | 4 + .../gpt_action_snowflake_direct.ipynb | 422 ++++++++++++++++++ images/chatgpt/snowflake_direct_oauth.png | Bin 0 -> 38713 bytes registry.yaml | 9 + 4 files changed, 435 insertions(+) create mode 100644 examples/chatgpt/gpt_actions_library/gpt_action_snowflake_direct.ipynb create mode 100644 images/chatgpt/snowflake_direct_oauth.png diff --git a/authors.yaml b/authors.yaml index 720beb07..78eed86f 100644 --- a/authors.yaml +++ b/authors.yaml @@ -156,3 +156,7 @@ lxing-oai: name: "Luke Xing" website: "https://www.linkedin.com/in/lukexing/" avatar: "https://avatars.githubusercontent.com/u/176698727" + +gladstone-openai: + name: "Kevin Gladstone" + avatar: "https://avatars.githubusercontent.com/u/149190645" diff --git a/examples/chatgpt/gpt_actions_library/gpt_action_snowflake_direct.ipynb b/examples/chatgpt/gpt_actions_library/gpt_action_snowflake_direct.ipynb new file mode 100644 index 00000000..49e39ebc --- /dev/null +++ b/examples/chatgpt/gpt_actions_library/gpt_action_snowflake_direct.ipynb @@ -0,0 +1,422 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# GPT Actions - Snowflake direct\n", + "## Introduction" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:\n", + "\n", + "\n", + "\n", + "* [Introduction to GPT Actions](https://platform.openai.com/docs/actions)\n", + "* [Introduction to GPT Actions Library](https://platform.openai.com/docs/actions/actions-library)\n", + "* [Example of Building a GPT Action from Scratch](https://platform.openai.com/docs/actions/getting-started)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This particular GPT Action provides an overview of how to connect to a Snowflake Data Warehouse. This Action takes a user’s question, scans the relevant tables to gather the data schema, then writes a SQL query to answer the user’s question.\n", + "\n", + "Note: This cookbook return back a [ResultSet SQL statement](https://docs.snowflake.com/en/developer-guide/sql-api/handling-responses#getting-the-data-from-the-results), rather than the full result that is not limited by GPT Actions application/json payload limit. For production and advanced use-case, a middleware is required to return back a CSV file. You can follow instructions in the [GPT Actions - Snowflake Middleware cookbook](../gpt_action_snowflake_middleware) to implement this flow instead." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Value + Example Business Use Cases" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "Value: Users can now leverage ChatGPT's natural language capability to connect directly to Snowflake’s Data Warehouse..\n", + "\n", + "Example Use Cases:\n", + "\n", + "\n", + "\n", + "* Data scientists can connect to tables and run data analyses using ChatGPT's Data Analysis\n", + "* Citizen data users can ask basic questions of their transactional data\n", + "* Users gain more visibility into their data & potential anomalies" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Application Information" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Application Key Links" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "Check out these links from the application before you get started:\n", + "\n", + "* Application Website: [https://app.snowflake.com/](https://app.snowflake.com/)\n", + "* Application API Documentation: [https://docs.snowflake.com/en/developer-guide/sql-api/intro](https://docs.snowflake.com/en/developer-guide/sql-api/intro)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Application Prerequisites" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Before you get started, make sure you go through the following steps in your application environment:\n", + "\n", + "* Provision a Snowflake Data Warehouse\n", + "* Ensure that the user authenticating into Snowflake via ChatGPT has access to the database, schemas, and tables with the necessary role" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ChatGPT Steps" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "### Custom GPT Instructions\n", + "\n", + "Once you've created a Custom GPT, copy the text below in the Instructions panel. Have questions? Check out [Getting Started Example](https://platform.openai.com/docs/actions/getting-started) to see how this step works in more detail." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "**Context**: You are an expert at writing Snowflake SQL queries. A user is going to ask you a question. \n", + "\n", + "**Instructions**:\n", + "1. No matter the user's question, start by running `runQuery` operation using this query: \"SELECT column_name, table_name, data_type, comment FROM `{database}.INFORMATION_SCHEMA.COLUMNS`\" \n", + "-- Assume warehouse = \"\", database = \"\", unless the user provides different values \n", + "2. Convert the user's question into a SQL statement that leverages the step above and run the `runQuery` operation on that SQL statement to confirm the query works. Add a limit of 100 rows\n", + "3. Now remove the limit of 100 rows and return back the query for the user to see\n", + "4. Use the role when querying Snowflake\n", + "5. Run each step in sequence. Explain what you are doing in a few sentences, run the action, and then explain what you learned. This will help the user understand the reason behind your workflow. \n", + "\n", + "**Additional Notes**: If the user says \"Let's get started\", explain that the user can provide a project or dataset, along with a question they want answered. If the user has no ideas, suggest that we have a sample flights dataset they can query - ask if they want you to query that" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "### OpenAPI Schema\n", + "\n", + "Once you've created a Custom GPT, copy the text below in the Actions panel. Have questions? Check out [Getting Started Example](https://platform.openai.com/docs/actions/getting-started) to see how this step works in more detail." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "vscode": { + "languageId": "yaml" + } + }, + "outputs": [], + "source": [ + "openapi: 3.1.0\n", + "info:\n", + " title: Snowflake Statements API\n", + " version: 1.0.0\n", + " description: API for executing statements in Snowflake with specific warehouse and role settings.\n", + "servers:\n", + " - url: 'https://...snowflakecomputing.com/api/v2'\n", + "\n", + "\n", + "paths:\n", + " /statements:\n", + " post:\n", + " summary: Execute a SQL statement in Snowflake\n", + " description: This endpoint allows users to execute a SQL statement in Snowflake, specifying the warehouse and roles to use.\n", + " operationId: runQuery\n", + " tags:\n", + " - Statements\n", + " requestBody:\n", + " required: true\n", + " content:\n", + " application/json:\n", + " schema:\n", + " type: object\n", + " properties:\n", + " warehouse:\n", + " type: string\n", + " description: The name of the Snowflake warehouse to use for the statement execution.\n", + " role:\n", + " type: string\n", + " description: The Snowflake role to assume for the statement execution.\n", + " statement:\n", + " type: string\n", + " description: The SQL statement to execute.\n", + " required:\n", + " - warehouse\n", + " - role\n", + " - statement\n", + " responses:\n", + " '200':\n", + " description: Successful execution of the SQL statement.\n", + " content:\n", + " application/json:\n", + " schema:\n", + " type: object\n", + " properties:\n", + " status:\n", + " type: string\n", + " data:\n", + " type: object\n", + " additionalProperties: true\n", + " '400':\n", + " description: Bad request, e.g., invalid SQL statement or missing parameters.\n", + " '401':\n", + " description: Authentication error, invalid API credentials.\n", + " '500':\n", + " description: Internal server error." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Authentication Instructions" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Below are instructions on setting up authentication with this 3rd party application. Have questions? Check out [Getting Started Example](https://platform.openai.com/docs/actions/getting-started) to see how this step works in more detail." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Pre-Action Steps" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Before you set up authentication in ChatGPT, please take the following steps in the application." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* Review the Snowflake OAuth Overview: [https://docs.snowflake.com/en/user-guide/oauth-snowflake-overview](https://docs.snowflake.com/en/user-guide/oauth-snowflake-overview)\n", + "* Go to the Snowflake Worksheets\n", + "* Create new OAuth credentials through a [Security Integration](https://docs.snowflake.com/en/sql-reference/sql/create-security-integration-oauth-snowflake) - you will need a new one for each OAuth app/custom GPT since Snowflake Redirect URIs are 1-1 mapped to Security Integrations\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "vscode": { + "languageId": "yaml" + } + }, + "outputs": [], + "source": [ + "CREATE SECURITY INTEGRATION CHATGPT_INTEGRATION\n", + " TYPE = OAUTH\n", + " ENABLED = TRUE\n", + " OAUTH_CLIENT = CUSTOM\n", + " OAUTH_CLIENT_TYPE = 'CONFIDENTIAL'\n", + " OAUTH_REDIRECT_URI = 'https://oauth.pstmn.io/v1/callback' --- // this is a temporary value while testing your integration. You will replace this with the value your GPT provides\n", + " OAUTH_ISSUE_REFRESH_TOKENS = TRUE\n", + " OAUTH_REFRESH_TOKEN_VALIDITY = 7776000;" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "* Retrieve your OAuth Client ID, Auth URL, and Token URL\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "vscode": { + "languageId": "yaml" + } + }, + "outputs": [], + "source": [ + "DESCRIBE SECURITY INTEGRATION CHATGPT_INTEGRATION;" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "You’ll find the required information in these 3 columns:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "* Retrieve your OAuth Client Secret\n", + "\n", + "You’ll find the Client Secret in OAUTH_CLIENT_SECRET.\n", + "\n", + "You’re now set to test your action in Postman. Once you get a successful API response there, you can proceed with your GPT Action." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### In ChatGPT" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In ChatGPT, click on \"Authentication\" and choose \"OAuth\". Enter in the information below.\n", + "\n", + "* Client ID: use Client ID from steps above\n", + "* Client Secret: use Client Secret from steps above\n", + "* Authorization URL: use Authorization Endpoint from steps above\n", + "* Token URL: use Token Endpoint from steps above\n", + "* Scope: <empty>*\n", + "* Token: Default (POST)\n", + "\n", + "*Snowflake scopes pass the role, but you’ll notice the action itself also specifies the role as a parameter in runQuery, so the Scope is unnecessary. You may elect to pass roles in the scope instead of the action parameters if it makes more sense for your GPT." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Post-Action Steps" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "Once you've set up authentication in ChatGPT, follow the steps below in the application to finalize the Action.\n", + "\n", + "* Copy the callback URL from the GPT Action\n", + "* Update the Redirect URI in your Security Integration to the callback URL provided in ChatGPT.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "vscode": { + "languageId": "yaml" + } + }, + "outputs": [], + "source": [ + "ALTER SECURITY INTEGRATION CHATGPT_INTEGRATION_DEV SET OAUTH_REDIRECT_URI='https://chat.openai.com/aip//oauth/callback';" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### FAQ & Troubleshooting" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "* _Callback URL Error:_ If you get a callback URL error in ChatGPT, pay close attention to the Post-Action Steps above. You need to add the callback URL directly into your Security Integration for the action to authenticate correctly\n", + "* _Schema calls the wrong warehouse or database:_ If ChatGPT calls the wrong warehouse or database, consider updating your instructions to make it more explicit either (a) which warehouse / database should be called or (b) to require the user provide those exact details before it runs the query\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "_Are there integrations that you’d like us to prioritize? Are there errors in our integrations? File a PR or issue in our github, and we’ll take a look._\n" + ] + } + ], + "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.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/images/chatgpt/snowflake_direct_oauth.png b/images/chatgpt/snowflake_direct_oauth.png new file mode 100644 index 0000000000000000000000000000000000000000..cc67142899091881031c3aeb4649c8e6197f6b1b GIT binary patch literal 38713 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 literal 0 HcmV?d00001 diff --git a/registry.yaml b/registry.yaml index 8ff8f3d2..f69e56f3 100644 --- a/registry.yaml +++ b/registry.yaml @@ -1541,3 +1541,12 @@ tags: - gpt-actions-library - chatgpt + +- title: GPT Actions library - Snowflake Direct + path: examples/chatgpt/gpt_actions_library/gpt_action_snowflake_direct.ipynb + date: 2024-08-13 + authors: + - gladstone-openai + tags: + - gpt-actions-library + - chatgpt