mirror of
https://github.com/supabase/supabase.git
synced 2026-10-11 12:25:05 +03:00
113 lines
3.4 KiB
Plaintext
113 lines
3.4 KiB
Plaintext
---
|
|
id: 'examples-openai'
|
|
title: 'Generating OpenAI GPT3 completions'
|
|
description: 'Generate GPT text completions using OpenAI and Supabase Edge Functions.'
|
|
subtitle: 'Generate GPT text completions using OpenAI and Supabase Edge Functions.'
|
|
video: 'https://www.youtube-nocookie.com/v/29p8kIqyU_Y'
|
|
tocVideo: '29p8kIqyU_Y'
|
|
---
|
|
|
|
OpenAI provides a [completions API](https://platform.openai.com/docs/api-reference/completions) that allows you to use their generative GPT models in your own applications.
|
|
|
|
OpenAI's API is intended to be used from the server-side. Supabase offers Edge Functions to make it easy to interact with third party APIs like OpenAI.
|
|
|
|
## Setup Supabase project
|
|
|
|
If you haven't already, [install the Supabase CLI](/docs/guides/cli) and initialize your project:
|
|
|
|
```shell
|
|
supabase init
|
|
```
|
|
|
|
## Create edge function
|
|
|
|
Scaffold a new edge function called `openai` by running:
|
|
|
|
```shell
|
|
supabase functions new openai
|
|
```
|
|
|
|
A new edge function will now exist under `./supabase/functions/openai/index.ts`.
|
|
|
|
We'll design the function to take your user's query (via POST request) and forward it to OpenAI's API.
|
|
|
|
```ts index.ts
|
|
import OpenAI from 'https://deno.land/x/openai@v4.24.0/mod.ts'
|
|
|
|
Deno.serve(async (req) => {
|
|
const { query } = await req.json()
|
|
const apiKey = Deno.env.get('OPENAI_API_KEY')
|
|
const openai = new OpenAI({
|
|
apiKey: apiKey,
|
|
})
|
|
|
|
// Documentation here: https://github.com/openai/openai-node
|
|
const chatCompletion = await openai.chat.completions.create({
|
|
messages: [{ role: 'user', content: query }],
|
|
// Choose model from here: https://platform.openai.com/docs/models
|
|
model: 'gpt-3.5-turbo',
|
|
stream: false,
|
|
})
|
|
|
|
const reply = chatCompletion.choices[0].message.content
|
|
|
|
return new Response(reply, {
|
|
headers: { 'Content-Type': 'text/plain' },
|
|
})
|
|
})
|
|
```
|
|
|
|
Note that we are setting `stream` to `false` which will wait until the entire response is complete before returning. If you wish to stream GPT's response word-by-word back to your client, set `stream` to `true`.
|
|
|
|
## Create OpenAI key
|
|
|
|
You may have noticed we were passing `OPENAI_API_KEY` in the Authorization header to OpenAI. To generate this key, go to https://platform.openai.com/account/api-keys and create a new secret key.
|
|
|
|
After getting the key, copy it into a new file called `.env.local` in your `./supabase` folder:
|
|
|
|
```
|
|
OPENAI_API_KEY=your-key-here
|
|
```
|
|
|
|
## Run locally
|
|
|
|
Serve the edge function locally by running:
|
|
|
|
```bash
|
|
supabase functions serve --env-file ./supabase/.env.local --no-verify-jwt
|
|
```
|
|
|
|
Notice how we are passing in the `.env.local` file.
|
|
|
|
Use cURL or Postman to make a POST request to http://localhost:54321/functions/v1/openai.
|
|
|
|
```bash
|
|
curl -i --location --request POST http://localhost:54321/functions/v1/openai \
|
|
--header 'Content-Type: application/json' \
|
|
--data '{"query":"What is Supabase?"}'
|
|
```
|
|
|
|
You should see a GPT response come back from OpenAI!
|
|
|
|
## Deploy
|
|
|
|
Deploy your function to the cloud by running:
|
|
|
|
```bash
|
|
supabase functions deploy --no-verify-jwt openai
|
|
supabase secrets set --env-file ./supabase/.env.local
|
|
```
|
|
|
|
## Go deeper
|
|
|
|
If you're interesting in learning how to use this to build your own ChatGPT, read [the blog post](/blog/chatgpt-supabase-docs) and check out the video:
|
|
|
|
<div class="video-container">
|
|
<iframe
|
|
src="https://www.youtube-nocookie.com/embed/Yhtjd7yGGGA"
|
|
frameBorder="1"
|
|
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
|
|
allowFullScreen
|
|
></iframe>
|
|
</div>
|