AI Lesson & Adaptive Agent
Gere lições e questões com AWS Bedrock, armazene no Firestore e utilize um agente adaptativo para perguntas e respostas.
- lummy-ia
Este projeto é uma API FastAPI para geração de lições e questões com IA (usando AWS Bedrock), armazenamento em Firebase Firestore e gerenciamento de progresso do usuário. O deploy é feito via Docker, com hot-reload para desenvolvimento.
app/
main.py # Inicialização FastAPI e roteamento principal
config/ # Configurações de Bedrock e Firebase
api/ # Rotas HTTP organizadas por domínio
application/ # DTOs, serviços e casos de uso
domain/ # Entidades e interfaces de domínio
infrastructure/ # Integrações (Firestore, Bedrock, autenticação)
constants/ # Prompts e constantes compartilhadas
utils/ # Utilitários de apoio
Dockerfile # Build da aplicação Python
docker-compose.yml # Orquestração da aplicação
requirements.txt # Dependências Python
- Geração de lições e questões via IA (AWS Bedrock)
- Respostas inteligentes com AWS Bedrock para interações do assistente
- Persistência de lições, questões e respostas diretamente no Firebase Firestore
- Sincronização automática das respostas geradas com coleções do Firestore
- API REST para manipulação de usuários, progresso, perguntas e respostas
- Administração de IA com seleção dinâmica de modelos Bedrock e ajustes de temperatura/tokens
- Camada de serviços com padrão Strategy para integrar múltiplos provedores de geração
- Agente adaptativo para seleção de próximas questões
- Monitoramento de saúde da aplicação e da integração com Bedrock
- Hot-reload para desenvolvimento rápido
- Docker e Docker Compose
- (Opcional) Python 3.11+ para rodar localmente sem Docker
- Credenciais válidas da AWS (variáveis de ambiente, perfil local ou AWS SSO) com permissão para chamar
bedrock:InvokeModel - Serviço Firebase configurado com conta de serviço (arquivo JSON) e chaves web para uso no front-end
-
Duplicar
.env.examplepara.enve preencher um dos métodos abaixo:- Variáveis diretas:
AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY, opcionalmenteAWS_SESSION_TOKENeAWS_REGION. - Perfil nomeado: deixe as variáveis acima vazias e informe
AWS_PROFILEcom o nome configurado em~/.aws/credentials.
- Variáveis diretas:
-
Aplicação FastAPI / Docker
- O Compose carrega o arquivo
.env, portanto as variáveis acima ficam disponíveis dentro do container automaticamente. - A aplicação também aceita que
BEDROCK_REGIONsobreponhaAWS_REGIONcaso queira usar uma região específica para o Bedrock.
- O Compose carrega o arquivo
-
Terraform (
/terraform)- Ao usar variáveis de ambiente, execute os comandos no terminal já exportando
AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY(eAWS_SESSION_TOKENse houver). - Se preferir um perfil, garanta que
AWS_PROFILEesteja setado no terminal ou definavar.aws_profileviaterraform.tfvars/linha de comando (por exemplo-var="aws_profile=meu-perfil"). - No Windows + WSL, mantenha as credenciais no mesmo ambiente em que rodará o Terraform (ex.:
~/.aws/credentialsdentro do WSL quando rodarwsl terraform ...).
- Ao usar variáveis de ambiente, execute os comandos no terminal já exportando
- Ajuste os arquivos
app/config/environments/<perfil>.propertiescom os valores definitivos de cada ambiente (ex.:production.properties). - O entrypoint grava o perfil ativo em
/app/runtime-environment; informeprodouhomologcomo primeiro argumento ao subir o contêiner (ex.:docker run imagem prod). - A aplicação lê apenas os
.propertiespara popular a configuração. Não há mais carregamento automático de variáveis de ambiente para essas chaves. - Para adicionar um novo ambiente, crie
app/config/environments/<novo>.propertiese inclua o valor na constante_SUPPORTED_ENVIRONMENTSemapp/config/environment.py.
Passo 1: Clone o repositório.
Passo 2: Faça o build e suba os containers:
docker-compose build --no-cachedocker-compose up(usa automaticamenteproduction.propertiesvia flagproddo entrypoint)
Passo 3: Garanta que a imagem consiga acessar credenciais AWS (perfil configurado no servidor, ~/.aws montado ou IAM role da instância; não há leitura automática de variáveis definidas no contêiner).
Passo 4: Monte o arquivo de credenciais do Firebase no caminho especificado em production.properties (por padrão /run/secrets/firebase-service-account.json).
Passo 5: Acesse a API em: http://localhost:8000/docs (Swagger)
- Crie e ative um ambiente virtual Python 3.11:
python -m venv .venv
.\.venv\Scripts\Activate.ps1- Instale as dependências do projeto (inclui
boto3,pyteste plugins necessários):
pip install -r requirements.txt-
Defina as variáveis de ambiente AWS (
AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY,AWS_REGIONouAWS_PROFILE) e as variáveis do Firebase conforme descrito acima. -
Suba a API com Uvicorn para desenvolvimento rápido:
uvicorn app.main:app --reload --port 8000O projeto já vem configurado com pytest e suporte a testes assíncronos via anyio. Para executar a suíte completa:
python -m pytestObservação: o arquivo
pytest.iniadiciona o diretórioapp/aoPYTHONPATH, portanto execute os testes a partir da raiz do repositório (D:\lummy-ia).
Principais rotas (veja detalhes e exemplos em /docs):
GET /health— Healthcheck da API e da integração com BedrockPOST /generate-lesson— Gera uma lição via IA (Bedrock)POST /generate-questions/by-subject— Cria lição e questões automaticamente a partir de uma matéria (assunto) informadoPOST /generate-questions/{lesson_id}— Gera questões para uma lição via IA (Bedrock)GET /questions/{question_id}— Recupera detalhes completos de uma questãoPUT /questions/{question_id}— Atualiza enunciado, alternativas e resposta corretaDELETE /questions/{question_id}— Remove uma questão e sincroniza com o FirebasePOST /add_question_manual— Adiciona questão manualmenteGET /list_questions— Lista questõesGET /next_question— Próxima questão para o usuárioPOST /answer— Submete resposta do usuárioGET /stats— Estatísticas do usuárioGET /bedrock/settings— Lista o modelo ativo, parâmetros e modelos autorizadosPUT /bedrock/settings— Atualiza dinamicamente modelo, temperatura e limite de tokensPOST /reset_session— Reseta progresso do usuárioGET /user_progress— Progresso detalhado do usuário
-
POST
/generate-questions/by-subject— informesubjecte, opcionalmente,questionCount,difficulty,ageGroup,lessonPromptequestionPrompt. A API gera uma lição estruturada em português, persiste no Firestore e retorna no campolesson, em seguida cria as questões alinhadas à lição e retorna emquestions. -
(Opcional) use o
lesson.idretornado para futuras chamadas pontuais em/generate-questions/{lesson_id}.
Exemplos completos estão incluídos na coleção Postman atualizada em
docs/postman/lummy-ia.postman_collection.json, separados em pastas "AI Lesson & Question Generation".
- Firebase Firestore centraliza lições, questões, respostas e credenciais de autenticação. Configure
FIREBASE_PROJECT_IDcom as credenciais de serviço (FIREBASE_CREDENTIALS_PATHouFIREBASE_CREDENTIALS_JSON). - Sem banco relacional: o projeto não depende mais de MySQL nem exige contêiner adicional para persistência.
- O arquivo
docker/dev/.env.developmentjá incluiClaude 3 Sonnetcomo padrão eClaude 3 Haikucomo alternativa. Ajuste esse JSON para incluir apenas os modelos liberados na sua conta e região Bedrock.
- O Compose de desenvolvimento (
docker/dev/docker-compose.yml) inclui os serviçosprometheusegrafana, ambos na mesma rede da aplicação. - Prometheus lê o arquivo
docker/dev/prometheus/prometheus.ymle coleta métricas do endpoint/metricsexposto pelo FastAPI. - Grafana carrega automaticamente uma fonte de dados Prometheus através de
docker/dev/grafana/provisioning/datasources/prometheus.yml. As credenciais de admin são definidas via secrets emdocker/prod/secrets/. A interface fica disponível em http://localhost:3000. - Suba todo o stack com
docker compose -f docker/dev/docker-compose.yml up. As métricas ficam acessíveis em http://localhost:9090 e os dashboards podem ser criados na instância Grafana. - Para produção, use o workflow GitHub Actions "Deploy Monitoring Stack" que implanta apenas os serviços de monitoramento (Prometheus e Grafana) separadamente da aplicação principal.
- Hot-reload: O código é montado como volume no container, qualquer alteração reinicia a API automaticamente.
- Dependências: Adicione no
requirements.txte reinicie o container. - Logger: Use
from app.logger import loggerpara logs padronizados. - Serviços de IA: Estenda
app/infrastructure/ai/strategies.pypara adicionar novos provedores, registrando-os emget_ai_generation_service()e ativando-os via payloads ou configuração de estratégia. - Debug remoto (VS Code / PyCharm):
- Defina
ENABLE_DEBUGPY=1(e opcionalmenteDEBUGPY_PORT=5678) em.env.developmentou como variável de ambiente antes de subir o Compose. - Suba os containers com
docker-compose up(porta5678será exposta pelo serviçoapp). O container aguardará um debugger conectar antes de iniciar o Uvicorn. - No VS Code, crie uma configuração Python: Attach using debugpy apontando para
localhost:5678(path mapping localD:\lummy-ia→ container/app). Em outras IDEs, use o mesmo host/porta. - Coloque breakpoints normalmente; após o attach, a aplicação continua a execução com hot-reload preservado.
- Defina
- Projeto desenvolvido por IKauedev.
- Baseado em FastAPI, Firestore, AWS Bedrock, Docker.