npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

cwg-llm-openai

v1.0.1

Published

CWG - LLM - LangChain e OpenAI

Downloads

4

Readme

SCRIPT LLM com RAG (Retrieval-Augmented Generation) e servidor Express

Script montado para executar comandos na LLM do OpenAI e RAG, porém com facilidade de migração, uma vez que foi utilizado o LangChain no processo.

Tecnologias Envolvidas:

LLM:

  • NodeJS
  • Lagchain
  • OpenAI

Servidor:

  • Express

Configuração

Etapa 1 - Criar a Key do OpenAI

Inicialmente, para configurar o projeto é preciso ir o OpenAI, criar uma conta e criar uma chave de acesso ao modelo do OpenAI:

Link: https://platform.openai.com/api-keys

Etapa 2 - Baixar o Projeto

Instale pelo pacote NPM:

npm install carloswgama/cwg-llm-openai

Ou baixe o projeto do GitHub e instale as dependências:

git clone https://github.com/CarlosWGama/llm-express-langchain-openai ./projeto
cd projeto
npm install

Etapa 3 - Setar as variáveis de ambiente

Crie um arquivo .env no seu projeto Nesse arquivo você deve informar:

CWG_LLM_OPENAI_KEY=<sua api key copiada da etapa 1>
CWG_LLM_OPENAI_MODEL=<A versão do modelo que irá usar como 'gpt-4.1-nano', 'gpt-3-turbo'...>
CWG_LLM_OPENAI_EMBEDDING=<modelo do embedding usado para o rag como 'text-embedding-ada-002', 'text-embedding-3-large' ou 'text-embedding-3-small'	>

Exemplo:

CWG_LLM_OPENAI_KEY=sk-proj-Lr8XNcasdas11vHRl9gBQnpSe2-D0pP2kOBy_q7PsoCTasdasdgyfvOTTPKzH30WWGmOzcf_6PNbJ89D8jd8Ja8j2j92d
CWG_LLM_OPENAI_MODEL=gpt-4.1-nano
CWG_LLM_OPENAI_EMBEDDING=text-embedding-ada-002

Fique atendo aos custos dos modelos. Abaixo segue algumas informações dos custoas a cada 1 milhão de tokens:

| Modelo | Preço | Tipo | |--------|--------|--------| | gpt-5 | $1.25| LLM | | gpt-5-mini| $0.25 | LLM | | gpt-5-nano | $0.05 | LLM | | gpt-4.1 | $2.00 | LLM | | gpt-4.1-mini | $0.40 | LLM | | gpt-4.1-nano | $0.10 | LLM | | gpt-3-turbo | $8.00 | LLM | | text-embedding-3-small | $0.02 | Embedding (RAG) | | text-embedding-3-large | $0.13 | Embedding (RAG) | | text-embedding-ada-002 | $0.10 | Embedding (RAG) |

Lista completa dos preços preços

Etapa 4 - Rodando os Scripts

Exemplo de Rodar o Script Diretamente

primeira importe as funções que deseja executar:

const { ask, askFromPrompt, askFromURL, askFromPDF, askFromEmbedding, saveEmbedding } = require('cwg-llm-openai');
Exemplo de um comando básico

Exemplo mais básico do uso da IA sem conhecimento extra passado. Todo conhecimento é o do modelo.

const { ask } = require('cwg-llm-openai');

async function exemplo() {
    const resposta = await ask('Quem é Carlos W. Gama?');
    console.log(resposta);
}
Exemplo passando um contexto (RAG básico)

Esse tipo de cenário é ideal quando você quer adicionar informações ao conhecimento da LLM, que vem de uma base própria sua.

const { askFromPrompt } = require('cwg-llm-openai');

async function exemplo() {
    //Informação tirada de alguma fonte
    context = 'Carlos W. Gama é um programador';
    const resposta = await askFromPrompt('Quem é Carlos W. Gama?', context);
    console.log(resposta);
}
Exemplo passando uma fonte de URL (RAG da Web)

Esse cenário faz com que a informação buscada de uma página web e convertido para uma base de dados vetorial, de forma com a LLM consiga consultar as informações.

Nessa etapa é usado o Embedding do OpenAI, que serve para criar o Retriever. O Embbeding é a representação numérica de seus dados (textos, documentos, etc.) em um formato que o computador consegue entender e comparar. O embedding padrão usado é o text-embedding-ada-002, que possui um custo de $0.10 a cada 1 Milhão de tokens.

const { askFromURL } = require('cwg-llm-openai');

async function exemplo() {
    //Informação tirada de alguma fonte
    url = 'https://carloswgama.com.br';
    const resposta = await askFromURL('Quem é Carlos W. Gama?', url);
    console.log(resposta);
}
Exemplo passando uma fonte de PDF (RAG de documento)

Esse cenário faz com que a informação buscada de um arquivo em PDF. É o cenário ideal de quando você já tem um arquivo pdf com o todo o conhecimento da empresa ou regras de negócios que necessita que a LLM conheça.

Também utiliza o Embedding do OpenAI para criar o retriever da base de dados vetorial.

const { askFromPDF } = require('cwg-llm-openai');

async function exemplo() {
    //Informação tirada de alguma fonte
    caminho_pdf = './src/example/doc.pdf';
    const resposta = await askFromPDF('Quem é Carlos W. Gama?', caminho_pdf);
    console.log(resposta);
}
Exemplo passando uma consulta direto de uma base vetorial

Caso deseje, pode salvar um dado passado em RAG para depois consultá-lo diretamente sem precisa converter novamente o arquivo para uma base númerica. O dado fica salvo no seu computador.

const { askFromURL, askFromPDF, askFromEmbedding } = require('cwg-llm-openai');

async function consulta_salvando() {
    //Informação tirada de alguma fonte
    url = 'https://carloswgama.com.br';
    arquivoRAG = 'nome_indice';
    const resposta = await askFromURL('Quem é Carlos W. Gama?', url, arquivoRAG);
    //const resposta = await askFromPDF('Quem é Carlos W. Gama?', 'documento.pdf', salveRAG);
    console.log(resposta);
}

async function consulta_embedding() {
    //Informação tirada direto de uma base convertida
    arquivoRAG = 'nome_indice';
    const resposta = await askFromEmbedding('Quem é Carlos W. Gama?', arquivoRAG);
    console.log(resposta);
}

Ou caso deseja, pode salvar o arquivo antes para consultá-lo depois

const { askFromURL, askFromPDF, askFromEmbedding } = require('cwg-llm-openai');

async function save() {
    const arquivoRAG = 'nome_indice';
    
    //Exemplo do URL
    const url = 'https://carloswgama.com.br';
    await saveEmbedding(url);

    //Exemplo com PDF
    const documento = 'documento.pdf';
    await saveEmbedding(null, documento);
}

async function consulta_embedding() {
    //Informação tirada direto de uma base convertida
    arquivoRAG = 'nome_indice';
    const resposta = await askFromEmbedding('Quem é Carlos W. Gama?', arquivoRAG);
    console.log(resposta);
}
Exemplo de Rodar o projeto pelo Express

A baixo segue um exemplo de uma implementação rodando pelo ExpressJS. Deixando claro que é necessário ainda implementar regras de segurança como JWT para que não usem sua API sem sua permissão, consumindo seu créditos.

const express = require('express')
const { ask, askFromPrompt, askFromURL, askFromPDF, askFromEmbedding } = require('cwg-llm-openai');

const app = express();
app.use(express.json());


//USO DA API SIMPLES
app.get('/api/simples', async (req, res) => {

    const pergunta = req.body.pergunta
    if (!pergunta) return res.status(400).json({erro: 'Faltando pergunta'})
    
    console.log('Mensagem', req.body.pergunta);
    const resposta = await ask(pergunta);
    // Envia uma resposta de sucesso de volta
    res.status(201).json({ resposta });
});

//USO DA API PASSANDO CONTEXTO
app.get('/api/context', async (req, res) => {

    const pergunta = req.body.pergunta
    if (!pergunta) return res.status(400).json({erro: 'Faltando pergunta'})

    console.log('Mensagem', req.body.pergunta);
    const resposta = await askFromPrompt(pergunta, 'Carlos W. Gama é quem criou esse projeto!');
    // Envia uma resposta de sucesso de volta
    res.status(201).json({ resposta });
});


//USO DA API USANDO RAG COM URL
app.get('/api/url', async (req, res) => {

    const pergunta = req.body.pergunta
    if (!pergunta) return res.status(400).json({erro: 'Faltando pergunta'})

    console.log('Mensagem', req.body.pergunta);
    const resposta = await askFromURL(pergunta, 'https://carloswgama.com.br');
    // Envia uma resposta de sucesso de volta
    res.status(201).json({ resposta });
});


//USO DA API USANDO PDF
app.get('/api/pdf', async (req, res) => {

    const pergunta = req.body.pergunta
    if (!pergunta) return res.status(400).json({erro: 'Faltando pergunta'})
        
    console.log('Mensagem', req.body.pergunta);
    const resposta = await askFromPDF(pergunta, './src/example/doc.pdf', 'caminho_embedding');
    // Envia uma resposta de sucesso de volta
    res.status(201).json({ resposta });
});

//USO DA API USANDO EMBEDDING
app.get('/api/embedding', async (req, res) => {

    const pergunta = req.body.pergunta
    if (!pergunta) return res.status(400).json({erro: 'Faltando pergunta'})

    console.log('Mensagem', req.body.pergunta);
    const resposta = await askFromEmbedding(pergunta, 'caminho_embedding');
    // Envia uma resposta de sucesso de volta
    res.status(201).json({ resposta });
});


app.listen(3000, () => console.log('Servidor Rodando'))