# Como criar uma API com Functions e ChatGPT

Saiba mais sobre o processo necessário para criar uma API com [Functions](/pt-br/documentacao/produtos/build/applications/functions/) e [ChatGPT](/pt-br/documentacao/produtos/applications/functions/runtime-api/ai-integration/), e tenha a resposta apresentada no [Azion Preview Deployment](/pt-br/documentacao/produtos/applications/functions/runtime-api/preview-deployment/).

Para fazer isso, você precisa ter:

- Registro [na OpenAI](https://chat.openai.com/).
- [Sua OpenAI API key](https://platform.openai.com/account/api-keys).
- [Sua OpenAI organization ID](https://platform.openai.com/account/org-settings).

Para começar a criar sua API, proceda da seguinte forma:

1. Acesse o [Azion Console](/pt-br/documentacao/produtos/guias/como-acessar-o-azion-console/) > **Functions**.
2. Clique em **+ Function**.
3. Escolha um nome para sua função.
4. Na tab **Code**, exclua a função predefinida que está dentro do editor de código.
5. Adicione sua OpenAI API key e organization ID ao código, como um comentário:

```js
    /*
    ChatGPTKey=sk-xxxxxxx
    ChatGPTOrg=org-xxxxxx
    */
```

:::note
O preview apresentará um aviso mencionando a necessidade de ter a função `PreviewProvider` dentro do código. Não se preocupe, esta situação será coberta nos próximos passos.
:::

6. Copie e cole a seguinte `const`:

```js
    const html = `<!DOCTYPE html>
    <body>
      <h1>Hello World</h1>
      <p>This markup was generated by Azion - Functions.</p>
    </body>`
```

7. Escreva o seguinte prompt dentro da função, logo abaixo das credenciais OpenAI que foram coladas na etapa 5:

```js
    // generate an object with 5 properties being 2 of them array of objects
```

8. Selecione o prompt > clique nele com o botão direito do mouse > escolha **ChatGPT: Generate**. Aguarde alguns segundos até carregar.

O resultado esperado será semelhante a:

```js
    let myObject = {
        property_1: 'value_1',
        property_2: 10,
        property_3: true,
        property_4: [{object_1: 'value_1'}, {object_2: 'value_2'}],
        property_5: [{object_3: 'value_3'}, {object_4: 'value_4'}]
    };
```

9. Adicione a função `handleRequest`, contendo um `switch case`, com um método `GET` e um método `POST`:

```js
async function handleRequest(request) {
  switch (request.method) {
    case 'POST':
      return new Response(JSON.stringify(myObject), { // Returning the object generated by ChatGPT
        headers: {
          "content-type": "application/json",// Altering the content-type to application/json
        }
      })
    case 'GET':
      return new Response(html, {
        headers: {
          "content-type": "text/html:charset=UTF-8",
        }
      })
  }
}
```

- O método `POST` retorna um objeto `JSON`, que foi gerado pela opção `ChatGPT: Generate`.
- O método `GET` retorna a `const html` que foi declarada na etapa 6.

10. Copie e cole a função `PreviewProvider`, responsável por simular solicitações:

```js
    function PreviewProvider(args) {
      var request = {
        body: {},
        headers: {},
        method: "GET",
        redirect: "",
      }
      return handleRequest(request)
    }
```

11. Adicione a função `addEventListener`, que aciona todo o processamento da function:

```js
    addEventListener("fetch", event => {
            return event.respondWith(handleRequest(event.request))
          })
```

12. Clique com o botão direito em qualquer lugar dentro do editor de código e selecione **Format document**.

Neste ponto, sua function deve estar semelhante a:

```js

    /*
    ChatGPTKey=sk-xxxxxxx
    ChatGPTOrg=org-xxxxxx
    */
    const html = `<!DOCTYPE html>
    <body>
      <h1>Hello World</h1>
      <p>This markup was generated by Azion - Functions.</p>
    </body>`

    let myObject = {
            property_1: 'value_1',
            property_2: 10,
            property_3: true,
            property_4: [{object_1: 'value_1'}, {object_2: 'value_2'}],
            property_5: [{object_3: 'value_3'}, {object_4: 'value_4'}]
        };

    async function handleRequest(request) {
      switch (request.method) {
        case 'POST':
          return new Response(JSON.stringify(myObject), { // Returning the object generated by ChatGPT
            headers: {
              "content-type": "application/json",// Altering the content-type to application/json
            }
          })
        case 'GET':
          return new Response(html, {
            headers: {
              "content-type": "text/html:charset=UTF-8",
            }
          })
      }
    }

     function PreviewProvider(args) {
      var request = {
        body: {},
        headers: {},
        method: "GET", //or POST
        redirect: "",
      }
      return handleRequest(request)
    }

      addEventListener("fetch", event => {
        return event.respondWith(handleRequest(event.request))
      })
```

Se quiser, você pode alternar o método dentro da função `PreviewProvider` e ter uma visualização em tempo real das respostas no [Azion Preview Deployment](/pt-br/documentacao/produtos/applications/functions/runtime-api/preview-deployment/).

13. Clique no botão **Save**.

Agora, a função está pronta para ser instanciada em uma application. Veja como [instanciar e executar as funções em sua application](/pt-br/documentacao/produtos/build/applications/functions-instances/).

---