{"id":33319457,"url":"https://github.com/eugaelgomes/dev-ai-server","last_synced_at":"2026-04-08T16:31:23.040Z","repository":{"id":324606459,"uuid":"1096881236","full_name":"eugaelgomes/dev-ai-server","owner":"eugaelgomes","description":"API Gateway de IA para consultas com Perplexity AI e Google Gemini, construído com Node.js e Express.js. A API tem foco em guard rails (validação de conteúdo) para garantir mantenimento nos temas sobre tecnologia, desenvolvimento de software, programação e ciência de dados. Com sessões com contexto em banco PostgreSQL.","archived":false,"fork":false,"pushed_at":"2025-11-16T21:03:46.000Z","size":168,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-11-16T23:10:58.264Z","etag":null,"topics":["backend","express","gemini-ai","guardrails","nodejs","perplexity-ai","postgresql","vercel"],"latest_commit_sha":null,"homepage":"https://share.apidog.com/fcc159fb-ffe2-4fac-9f93-983263024c35","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/eugaelgomes.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-11-15T05:37:29.000Z","updated_at":"2025-11-16T21:03:49.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/eugaelgomes/dev-ai-server","commit_stats":null,"previous_names":["eugaelgomes/dev-ai-server"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/eugaelgomes/dev-ai-server","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eugaelgomes%2Fdev-ai-server","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eugaelgomes%2Fdev-ai-server/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eugaelgomes%2Fdev-ai-server/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eugaelgomes%2Fdev-ai-server/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/eugaelgomes","download_url":"https://codeload.github.com/eugaelgomes/dev-ai-server/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eugaelgomes%2Fdev-ai-server/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31564818,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-08T14:31:17.711Z","status":"ssl_error","status_checked_at":"2026-04-08T14:31:17.202Z","response_time":54,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["backend","express","gemini-ai","guardrails","nodejs","perplexity-ai","postgresql","vercel"],"created_at":"2025-11-19T20:01:13.223Z","updated_at":"2026-04-08T16:31:23.033Z","avatar_url":"https://github.com/eugaelgomes.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Dev AI Server - DevAI\n\n![1763326937757](image/README/1763326937757.png)\n\n**API Gateway** de **IA** para consultas com **Perplexity AI** e **Google Gemini**, construído com **Node.js** e **Express.js**. A **API** tem foco em **guard rails** (validação de conteúdo) para garantir mantenimento nos temas sobre **tecnologia**, **desenvolvimento de software**, **programação** e **ciência de dados**. Implementa **sessões com contexto** e utiliza **PostgreSQL** para persistência.\n\n![NodeJS](https://img.shields.io/badge/node.js-6DA55F?style=for-the-badge\u0026logo=node.js\u0026logoColor=white) ![Nodemon](https://img.shields.io/badge/NODEMON-%23323330.svg?style=for-the-badge\u0026logo=nodemon\u0026logoColor=%BBDEAD) ![Express.js](https://img.shields.io/badge/express.js-%23404d59.svg?style=for-the-badge\u0026logo=express\u0026logoColor=%2361DAFB) ![JavaScript](https://img.shields.io/badge/javascript-%23323330.svg?style=for-the-badge\u0026logo=javascript\u0026logoColor=%23F7DF1E) ![Postgres](https://img.shields.io/badge/postgres-%23316192.svg?style=for-the-badge\u0026logo=postgresql\u0026logoColor=white) ![Google Gemini](https://img.shields.io/badge/google%20gemini-8E75B2?style=for-the-badge\u0026logo=google%20gemini\u0026logoColor=white) ![Perplexity](https://img.shields.io/badge/perplexity-000000?style=for-the-badge\u0026logo=perplexity\u0026logoColor=088F8F) ![Vercel](https://img.shields.io/badge/vercel-%23000000.svg?style=for-the-badge\u0026logo=vercel\u0026logoColor=white)\n\n## Links Rápidos\n\nSeja bonzinho e não consuma muitos tokens (8 requisições, no máximo) :)\n\n- API em produção (Apidog): [https://share.apidog.com/fcc159fb-ffe2-4fac-9f93-983263024c35](https://share.apidog.com/fcc159fb-ffe2-4fac-9f93-983263024c35)\n- Endpoint público (POST):[ https://dev-ai.gaelgomes.dev/api/search](https://dev-ai.gaelgomes.dev/api/search)\n\n# 🛤️ Estrutura do GuardRails\n\nO guard rails funciona como um filtro inteligente em três camadas, garantindo que apenas perguntas relevantes cheguem a LLM. O filtro é base código, onde há um dicionários de termos cognatos e/ou relacionados a tecologia (base_subjetcs). Além disso há os off_topics, no qual a função principal é barrar todo e qualquer conteúdo que fuja do escopo de desenvolvimento, análise de dados, infra, suporte tech e relacionados...\n\n**1. Normalização de Texto**\n\n- Remove acentos e caracteres especiais\n- Converte tudo para minúsculas\n- Substitui números por letras similares (ex: \"c0d3\" vira \"code\")\n- Expande keywords com variações (singular/plural, stems)\n\nIsso significa que não adianta escrever \"pr0gr4m4ç@0\" tentando enganar o sistema — ele ainda vai entender.\n\n**2. Validação de Tamanho**\n\nLimite de 2000 caracteres por mensagem. Isso evita abuso de tokens e mantém as conversas focadas - como é um protótipo e a intenção incial é economizar tokens essa verificação é válida.\n\n**3. Detecção de Padrões Suspeitos**\n\nBloqueia tentativas de:\n\n- Repetição excessiva de caracteres\n- Prompt injection (\"ignore previous instructions\", \"you are now...\")\n- Comandos de sistema maliciosos\n\n**4. Validação de Relevância**\n\nDicionários expandidos de palavras-chave para cada assunto:\n\n- **codigo/devops/cloud**: Git, Docker, CI/CD, testes, arquitetura, segurança aplicada, UI/UX técnico...\n- **programacao**: Linguagens, frameworks, algoritmos, estruturas de dados, paradigmas...\n- **dados**: Bancos de dados, ML/AI, analytics, ETL, visualização, feature engineering...\n\n**5. Bloqueio de Assuntos Off Topics**\nL\nista de termos claramente fora de escopo (culinária, esportes, política, moda, relações humanas, natureza, etc.).\n\n### Pontos fortes\n\n- Normalização de texto, dicionários de termos e padrões de conteúdo permitido, proteção contra injeções, especialização por assunto ou multi assunto, off topics com termos e temas bloqueados.\n\n### Limitações\n\nFalsos positivos - perguntas genéricas/sem termos tech podem ser bloquadas, dependência de key words, manutenção manual de dicionário, sem sentido semântico da frase, rigizes de regras em off topics.\n\n# 💻 Estrutura do Projeto\n\n### Constants.js — Config padrão das LLMs\n\nO `constants.js` define:\n\n**Provedores e modelos válidos:**\n\n- Perplexity: sonar, sonar-pro, sonar-reasoning, sonar-reasoning-pro, sonar-deep-research\n- Gemini: gemini-2.5-flash\n\n**Assuntos especializados:**\n\n- `codigo`: Desenvolvimento de software, versionamento, debugging, arquitetura\n- `programacao`: Paradigmas, lógica, estruturas de dados, padrões\n- `dados`: ETL, modelagem, bancos de dados, estatística, visualização\n- `devops`: Infraestrutura, CI/CD, containers, cloud, monitoramento\n\n**Configurações de sessão:**\n\n- Máximo de 20 mensagens por sessão\n- Timeout de 30 minutos\n\nFunção `getCombinedContext()` que permite combinar múltiplos assuntos no mesmo array de assuntos `[\"codigo\", \"programacao\",...]`.\n\n## System Agents — A personalidade da IA\n\nProvedores `gemini.js` e `perplexity.js` exportam uma função `getSystemMessage()` que definem **como** a IA deve se comportar - ou passa, ou bloqueia.\n\n**Regras de escopo rígidas:**\n\n- Responde APENAS sobre os assuntos escolhidos\n- Se fugir do tema, responde com uma mensagem padrão educada mas firme\n- Não aceita perguntas de outros assuntos, mesmo que técnicos\n\n**Estilo de resposta definido:**\n\n- **Objetivo**: Vai direto ao ponto, sem enrolação\n- **Assertivo**: Usa linguagem confiante, evita \"talvez\", \"pode ser\"\n- **Didático**: Explica do simples ao complexo\n- **Estruturado**: Resposta direta → explicação → exemplo → dicas\n\n**Formato markdown:**\n\n- Código em blocos\n- Listas e bullet points\n- Conciso mas completo\n\nSe o `guardrails` permitir algum tema bloqueado a LLM tem instrução para analisar e barrar.\n\n### Estrutura de diretórios\n\n```\ndev-ai-server/\n├── src/\n│   ├── app.js                      # Express config\n│   ├── index.js                    # Entry point\n│   ├── middlewares/\n│   │   ├── error-handler.js        # Erros globais\n│   │   ├── rate-limit.js           # Limitação de requisições\n│   │   └── validator.js            # Validação de requests\n│   ├── routes/\n│   │   ├── home.routes.js          # Rota inicial\n│   │   ├── index.routes.js         # Agregador de rotas\n│   │   ├── search.routes.js        # Rota principal de busca\n│   │   └── session.routes.js       # Gerenciamento de sessões\n│   ├── services/\n│   │   ├── db/\n│   │   │   ├── db.js               # Conexão PostgreSQL\n│   │   │   ├── message.service.js  # Serviço de mensagens\n│   │   │   └── session.service.js  # Serviço de sessões\n│   │   └── ai-models/\n│   │       ├── constants.js        # Configurações dos modelos, contextos e provedores\n│   │       ├── gemini.js           # Agent Google Gemini\n│   │       └── perplexity.js       # Agent Perplexity AI\n│   └── utils/\n│       ├── guard-rails.js          # Sistema de validação\n│       ├── message-context.js      # Contexto de conversas\n│       └── guardrails-library/\n│           ├── base-subject.js     # Dicionário de termos tech\n│           └── off-topic.js        # Lista de bloqueio\n├── eslint.config.js\n├── package.json\n└── README.md\n```\n\n\u003cbr\u003e\n\n# 🪛 Instruções de uso\n\n- Node.js 20+\n- PostgreSQL\n- Chaves de API:\n  - Perplexity AI API Key\n  - Google Gemini API Key\n\n## 🔧 Instalação\n\n```bash\n# Clone o repositório\ngit clone https://github.com/eugaelgomes/dev-ai-server.git\ncd ai-server\n\n# Instale as dependências\nnpm install\n\n# Configure as variáveis de ambiente\ncp .env.example .env\n# Edite o arquivo .env com suas chaves de API\n```\n\n## Configuração\n\nEdite o arquivo `.env` com suas credenciais e porta desejada:\n\n```env\nDATABASE_NAME=detabase_name\nDATABASE_HOST_URL=debase_host\nDATABASE_SERVICE_PORT=detabase_port\nDATABASE_USERNAME=detabase_usaername\nDATABASE_PASSWORD=detabase_password\n\nPERPLEXITY_API_KEY=sua_chave_perplexity\nGEMINI_API_KEY=sua_chave_gemini\n\nPORT=8080\nNODE_ENV=development\n```\n\n## Execução\n\n```bash\n# Desenvolvimento (hot reload)\nnpm run dev\n\n# Produção\nnpm start\n```\n\n## 👾 API - Exemplos e rotas\n\n- Local: `POST http://localhost:8080/search`\n- Produção(my domain, in this case): `POST https://dev-ai.gaelgomes.dev/api/search`\n\n### Requisição\n\nBody (JSON):\n\n```json\n{\n  \"message\": \"Como fazer um loop em JavaScript?\",\n  \"subject\": \"programacao\",\n  \"provider\": \"gemini\",\n  \"model\": \"gemini-2.0-flash\",\n  \"sessionId\": \"session_123\"\n}\n```\n\nParâmetros:\n\n| Campo       | Tipo   | Obrigatório | Descrição                                                  |\n| ----------- | ------ | ----------- | ---------------------------------------------------------- |\n| `message`   | string | Sim         | Mensagem/pergunta do usuário                               |\n| `subject`   | string | Sim         | Assunto:`codigo`, `programacao` , `dados` ou todos juntos. |\n| `provider`  | string | Não         | Provedor:`perplexity` ou `gemini`.                         |\n| `model`     | string | Não         | Modelo do provedor                                         |\n| `sessionId` | string | Não         | ID de sessão para manter contexto (não precisa no 1° req)  |\n\nModelos suportados:\n\nPerplexity\n\n- `sonar` (padrão)\n- `sonar-pro`\n- `sonar-reasoning`\n- `sonar-reasoning-pro`\n- `sonar-deep-research`\n\nGemini\n\n- `gemini-2.0-flash` - (somente esse funciona)\n\nExemplo de resposta:\n\n```json\n{\n  \"sessionId\": \"session_123\",\n  \"subject\": \"programacao\",\n  \"provider\": \"gemini\",\n  \"message\": \"Como fazer um loop em JavaScript?\",\n  \"model\": \"gemini-2.0-flash\",\n  \"content\": \"Para fazer um loop em JavaScript...\",\n  \"citations\": [],\n  \"messageCount\": 2\n}\n```\n\n## Exemplos\n\nProdução (Apidog recomendado para testar):\n\n```bash\ncurl -X POST https://dev-ai.gaelgomes.dev/api/search \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"message\": \"What is a REST API?\",\n    \"subject\": \"codigo\",\n    \"provider\": \"perplexity\",\n    \"model\": \"sonar-pro\"\n  }'\n```\n\nLocal\n\n```bash\ncurl -X POST http://localhost:8080/api/search \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"message\": \"Explique recursão em Python\",\n    \"subject\": \"programacao\",\n    \"provider\": \"gemini\",\n    \"model\": \"gemini-2.0-flash\"\n  }'\n```\n\n## Links\n\n- Repositório: [https://github.com/eugaelgomes/dev-ai-server](\u003c[https://github.com/eugaelgomes/](https://github.com/eugaelgomes/dev-ai-server)dev-ai-server\u003e)\n- Documentação/Testes (Apidog): [https://share.apidog.com/fcc159fb-ffe2-4fac-9f93-983263024c35](https://share.apidog.com/fcc159fb-ffe2-4fac-9f93-983263024c35)\n- API pública: [https://dev-ai.gaelgomes.dev/api/search](https://dev-ai.gaelgomes.dev/api/search)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feugaelgomes%2Fdev-ai-server","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feugaelgomes%2Fdev-ai-server","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feugaelgomes%2Fdev-ai-server/lists"}