Utilizando IA para geração de casos de uso

Veja neste artigo como utilizar o GPT-3 para criação dos seus Use Cases

Utilizando IA para geração de casos de uso

Introdução

Dando continuidade à série de artigos sobre o HerbsJS e OpenAI, hoje vamos aprofundar em uma nova feature do HerbsJS utilizando o GPT-3 para criação de Use Case.

Caso tenha interesse em ler os artigos anteriores desta série, segue link de cada um deles abaixo:

Aproveitando, segue link de um curso grátis que demonstro como dar os primeiros passos com o HerbsJS: JavaScript, Testes, Documentação e Clean Architecture.

Parte prática

O HerbsJS conta com o Herbs Assist, assistente A. I. que, utilizando como base o OpenAI Codex, te ajuda a criar usecases e specs, simplificando assim, muito do seu trabalho, pois basta prover as informações do que você precisa e o Herbs Assist cria para você.

Para usar o Herbs Assist, existem duas condições:

  • Ter o Herbs Cli instalado globalmente em sua máquina (o passo a passo para instalação você encontra clicando aqui);
  • As chaves organizacional e pessoal do OpenAI Codex (clique aqui para gerar sua chave pessoal e aqui para saber como obter a organizacional);

Avançando para parte prática, crie um novo projeto utilizando o herbs-cli. Para este artigo, eu chamarei de herbs-assist-demo, mas você pode escolher um nome de sua preferência.

Resultado no terminal após a criação de um novo projeto utilizando o herbs-cli:

Para que possamos ver como a IA pode nos auxiliar na criação dos nossos Use Cases, eu criei uma entidade chamada Customer com as seguintes propriedades: id, name, email, username e password.

const { entity, id, field } = require('@herbsjs/herbs')
const { herbarium } = require('@herbsjs/herbarium')

const Customer =
    entity('Customer', {
        id: id(String),
        name: field(String, { validation: { presence: true, length: { minimum: 4, maximum: 10 } } }),
        email: field(String, { validation: { email: true } }),
        username: field(String),
        password: field(String),
    })

module.exports =
    herbarium.entities
        .add(Customer, 'Customer')
        .entity

Execute o comando herbs update para criação dos arquivos relacionados à entidade Customer.

Até aqui, não vimos nada novo correto? Apenas o fluxo básico do HerbsJS que eu demonstrei nos artigos anteriores.

Agora, imagine o seguinte cenário: chegou uma nova demanda na qual nós precisamos criar uma area logada para os nossos clientes.

Para isso, utilizaremos o Herbs Assist.

Conforme passado na parte introdutória deste artigo, o Herbs Assist é a nova feature do HerbsJS, que nos permite utilizar IA (inteligência artificial) na nossa camada de infra.

Ele ainda está na sua versão beta, mas conforme você aprenderá neste artigo, ele já está bem sólido para ser utilizado no dia a dia.

Para que possamos utilizá-lo, será necessário ter um cadastro no site openai, mas caso não possua, o processo de criação é bem simples.

Com a conta criada, o próximo passo será a configuração das seguintes envs no nosso ambiente: HERBS_OPENAI_ORG_ID e HERBS_OPENAI_API_KEY.

Abra a url openai no seu navegador, em seguida, clique em Settings e copie o valor do campo OrganizationID.  Esse valor será da env HERBS_OPENAI_ORG_ID.

Agora, clique no nome da sua organização no canto superior direito, depois clique em View API Keys, em seguida, crie uma nova chave de acesso. Esse será o valor da env: HERBS_OPENAI_API_KEY.

Caso tenha dúvida no momento de configurar as suas envs, segue print demonstrando como você pode configurar cada uma delas:

Agora que você já configurou seu Herbs Assist, vamos criar um novo use case para autenticar um cliente através do seu username e a sua senha.

O nosso primeiro passo será abrir um terminal no nosso computador, navegar até o nosso projeto e digitar nele o comando herbs assist. A seguir você tem o retorno deste comando no meu terminal:

Esse comando deve retornar algumas das funcionalidades que estão nesta Herbs Assist.

Selecione a opção número 1 no seu terminal para criação de Use Case, em seguida, digite um contexto para criação dele Ex.: Authenticate customer by username and password.

O próximo passo será selecionar  qual entidade você deseja utilizar para criação do seu Use Case. Para o nosso exemplo, eu utilizarei a entidade Customer.

Após selecionar a sua entidade, o chatgpt-3 que esta por trás do Herbs assit, vai criar um novo cenário BDD para criação do seu Use Case.

Caso esse seja o seu primeiro contato com BDD, ele é uma sigla que significa Behavior Driven Development, ou Desenvolvimento Guiado por Comportamento. Ele é uma abordagem para o desenvolvimento de software que se concentra nas necessidades e expectativas dos usuários finais.

Agora, caso você queria acessar o arquivo criado com o seu cenário BDD, basta clicar no seguinte link no seu terminal:

A seguir você tem o arquivo criado para o meu exemplo:

Nessa etapa a IA esta sugerindo que  para um cliente estar autenticado, ele precisa ter o username e o password válidos.

Nessa etapa você pode alterar o BDD para adicionar algum outro cenário antes da criação do seu Use Case. Para o nosso cenário eu deixarei com a sugestão da IA.

Agora selecione no seu terminal a opção continue, para que ele crie o seu arquivo de teste:

Abra este arquivo de teste e verifique se ele esta contemplando todos testes que você deseja para o seu Use Caso. Caso ele esteja OK, selecione continue novamente para criação do seu Use Case.

A seguir você tem o Use Case que a IA criou para o meu cenário de autenticação de um cliente através do seu username e sua senha:

const { usecase, step, Ok, Err, request } = require('@herbsjs/herbs')
const { herbarium } = require('@herbsjs/herbarium')
const Customer = require('../../entities/customer')
const CustomerRepository = require('../../../infra/data/repositories/customerRepository')

const dependency = { CustomerRepository }

const authenticateCustomerByUsernameAndPassword = injection =>
    usecase('Authenticate a Customer by Username and Password', {
        // Input/Request metadata and validation 
        request: {
            username: String,
            password: String
        },

        // Output/Response metadata
        response: Customer,

        //Authorization with Audit
        // authorize: (user) => (user.canAuthenticateCustomerByUsernameAndPassword ? Ok() : Err()),
        authorize: () => Ok(),

        setup: ctx => (ctx.di = Object.assign({}, dependency, injection)),

        'Find the Customer': step(async ctx => {
            const username = ctx.req.username
            const password = ctx.req.password
            const repo = new ctx.di.CustomerRepository(injection)
            const [customer] = await repo.findByUsernameAndPassword(username, password)
            if (!customer) return Err.notFound({
                message: `Customer entity not found by Username: ${username} and Password: ${password}`,
                payload: { entity: 'Customer', username, password }
            })
            // ctx.ret is the return value of a use case
            return Ok(ctx.ret = customer)
        })
    })

module.exports =
    herbarium.usecases
        .add(authenticateCustomerByUsernameAndPassword, 'AuthenticateCustomerByUsernameAndPassword')
        .metadata({ group: 'Customer', operation: herbarium.crud.read, entity: Customer })
        .usecase

Bem simples né?

Caso queira ver um vídeo explicativo de como realizar a configuração do Herbs Assist e a criação de um outro Use Case utilizando um conexto de promoção de um Customer a cliente VIP, veja o vídeo abaixo:

Por hoje é só, espero que tenham gostado e até um próximo artigo ;)