| title | RPG-RAG |
|---|---|
| emoji | 🎲 |
| colorFrom | purple |
| colorTo | blue |
| sdk | gradio |
| sdk_version | 6.9.0 |
| python_version | 3.12 |
| app_file | app.py |
| pinned | false |
Um kit pessoal para organizar lore/campanhas de RPG e usar LLMs locais pra ajudar durante e depois das sessões.
O repositório hoje tem 3 “pilares” principais:
- Session Helper (Tkinter): seleciona uma campanha, transcreve um áudio e gera um resumo via Ollama.
- UI protótipo (PyQt6): um menu básico para futuramente unir geração + pós-sessão.
- PDF reader (PyMuPDF): extrai texto de PDFs e detecta imagens (com placeholder para descrever as imagens).
Status: o projeto está em desenvolvimento e algumas partes ainda são rascunhos (ex.:
src/brain.py,src/get_data.py, geradores emsrc/gen/).
- Campanhas: carrega campanhas em
Data/Campaings/campaings.json. - Transcrição: usa Whisper para transcrever arquivo de áudio (ex.: MP3).
- Resumo: usa um LLM via Ollama pra resumir a sessão.
- Extração de PDF: pega texto e imagens e salva imagens extraídas.
Data/Campaings/: campanhas e sessõesEkalia/: lore/mundo em.txt(obsidian-friendly)Audios/: exemplos de áudio
src/main.py: app Tkinter (Session Helper)main2.py: protótipo PyQt6ears/whisper.py: transcrição e resumopdf_reader/pdf_agent.py: extrator de PDF (texto + imagens)brain.py: experimentos com agentes/LLM (atenção: contém prompts inadequados e não representa o objetivo final)get_data.py: experimento para ler dados e jogar em dataframe (precisa de ajustes)
models/: modelos locais (ex.: qwen)
- Python 3.10+ (recomendado)
- (Opcional) GPU/CUDA para Whisper acelerar — funciona em CPU também.
- Ollama instalado e rodando (para o resumo): https://ollama.com
Crie um ambiente virtual e instale dependências:
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txtAbre uma UI simples para:
- listar campanhas
- selecionar campanha
- escolher um arquivo de áudio
- transcrever e gerar resumo
python src/main.pyObservações
- O arquivo de campanhas precisa existir em
Data/Campaings/campaings.json. - O resumo usa Ollama via LangChain. Ajuste o modelo em
src/ears/whisper.py(variávelLLM_MODEL).
Interface base com navegação de telas.
python src/main2.pyProcessa um PDF e salva imagens encontradas em extracted_images/.
python src/pdf_reader/pdf_agent.pyPor padrão o script tenta ler DH.pdf na raiz. Se não existir, edite test_pdf_path no final do arquivo.
O projeto suporta rodar um LLM local via vLLM como alternativa à API da Groq. Útil pra desenvolvimento offline, custos zero e (futuramente) servir modelos fine-tuned.
vLLM tem requisitos rígidos de torch/CUDA que conflitam com Whisper e
langchain-huggingface no venv principal. A solução padrão é isolar o vLLM
em seu próprio ambiente — o projeto principal só conversa com ele via HTTP.
.venv/ ← venv principal (Whisper, FAISS, embeddings, gradio…)
.venv-vllm/ ← venv isolado, só com vllm + suas deps CUDA
Pré-requisito: GPU NVIDIA com pelo menos 16GB VRAM (testado em RTX 5060 Ti).
uv venv .venv-vllm --python 3.12
uv pip install --python .venv-vllm/bin/python vllm --torch-backend=autoA flag --torch-backend=auto deixa o uv detectar a versão do CUDA pelo
nvidia-smi e baixar o wheel compatível. Em GPUs Blackwell (RTX 50xx) com
driver recente isso é o stack CUDA 13.
python vllm/run_local.pyO script:
- Aponta pro binário em
.venv-vllm/bin/vllm - Configura
LD_LIBRARY_PATHpra encontrar os.sode CUDA do venv isolado - Sobe um servidor OpenAI-compatible em
http://localhost:8000/v1 - Modelo padrão:
Qwen/Qwen2.5-7B-Instruct-AWQ(4-bit, cabe folgado em 16GB)
Primeira execução baixa o modelo (~5GB) em vllm/Models/ (ignorado pelo git).
src/llm/client.py expõe três papéis (Role):
from src.llm.client import get_llm, Role
llm = get_llm(Role.FAST) # → Groq llama-3.1-8b-instant (padrão)
llm = get_llm(Role.CREATIVE) # → Groq llama-3.3-70b-versatile
llm = get_llm(Role.LOCAL) # → vLLM local (Qwen2.5-7B-AWQ)Role.LOCAL usa ChatOpenAI apontando pro endpoint local — não precisa de
nenhum SDK específico do vLLM.
Todas têm default sensato; só sobrescreva no .env se precisar mudar:
| Variável | Default | Para quê |
|---|---|---|
VLLM_BASE_URL |
http://localhost:8000/v1 |
URL do servidor local |
VLLM_MODEL |
Qwen/Qwen2.5-7B-Instruct-AWQ |
Modelo servido pelo vLLM |
VLLM_API_KEY |
EMPTY |
Token (vLLM aceita qualquer string por padrão) |
Com o servidor rodando em outro terminal:
python -m src.llm.client --localDeve imprimir uma resposta do Qwen local. Sem --local, usa Groq (Role.CREATIVE)
— bom pra confirmar que o fallback continua funcionando.
src/brain.pycontém experimentos com agentes e prompts de teste. Use como referência de experimentação, não como “produção”.src/get_data.pytem um bug (tenta imprimircontext['file_path']mas a chave criada éfile name).- Os geradores em
src/gen/estão vazios no momento. src/main.pytem um TODO antigo: “Trocar Tkinter por PySide6”. Hoje há um protótipo em PyQt6 (main2.py).
- Em CPU, o Whisper (principalmente
large) pode demorar bastante. - Você pode trocar o modelo em
src/ears/whisper.py(ex.:base,small,medium,large).
- Garanta que o daemon do Ollama está rodando.
- Garanta que o modelo configurado em
LLM_MODELexiste (ex.:ollama pull deepseek-r1:latest).
Se você quiser, posso adicionar uma licença explícita (MIT/Apache-2.0/etc). Por enquanto, o repositório não declara licença aqui no README.