Assistente juridico local para pesquisa de jurisprudencia STF/STJ, com suporte a:
- busca hibrida (semantica + lexical),
- rerank juridico,
- geracao de resposta com citacoes,
- TTS,
- indexacao de documentos do usuario em "Meu Acervo".
flowchart LR
U[Usuario] --> FE[Frontend<br/>http://127.0.0.1:5500]
FE --> API[Backend FastAPI<br/>http://127.0.0.1:8000]
API --> RAG[rag/query.py]
RAG --> LDB[(lancedb_store)]
RAG --> GEM[Gemini API]
API --> TTS[TTS Provider<br/>legacy_google ou gemini_native]
API --> ACV[Meu Acervo<br/>indexacao e busca]
flowchart LR
Q[Consulta] --> E[Embeddings]
E --> H[Busca hibrida]
H --> R[Rerank]
R --> G[Geracao]
G --> V[Validacao]
V --> A[Resposta com fontes]
- Usuario final (recomendado): executa
Ratio.exea partir da pastadist\Ratio\. - Desenvolvimento: roda backend/frontend manualmente com Python.
Download do pacote Windows: https://drive.google.com/file/d/1mQ6wwpNA2J_iRd7rfBscR062MWijR02-/view?usp=sharing
Versao da landing page em producao (ratiojuris.me): v2026.03.05 (deploy em 05/03/2026). Atualizacoes locais mais recentes podem ainda nao estar publicadas.
- API backend (
backend/) - Frontend web (
frontend/) - Motor de busca e ranking (
rag/query.py) - Scripts de inicializacao/encerramento para Windows
- Testes e CI
- Pipelines de scraping bruto STF/STJ
- Datasets brutos muito grandes (
data/) - Logs de execucao e arquivos temporarios locais
- Python 3.10+
- Chave Gemini (
GEMINI_API_KEY) - Internet para primeira carga de modelos locais (reranker)
Instalacao:
py -m pip install -r requirements.txt- Windows 10/11
- Pasta
dist\Ratio\completa (nao apenas o.exe) - Chave Gemini configurada no onboarding ou via
.env
Use o script:
build_windows_exe.bat
O script prioriza Python 3.12 (via py -3.12) e usa py como fallback.
Ao final, o executavel fica em:
dist\Ratio\Ratio.exe
No computador final, o usuario nao precisa de Python instalado.
O build inclui lancedb_store em dist\Ratio\ e gera backup preventivo de banco em build\database_backups\ quando aplicavel.
- Compactar e enviar a pasta inteira
dist\Ratio\. - Manter estrutura interna intacta (
_internal,lancedb_store,logs). - Usuario final executa apenas
Ratio.exe.
- Extraia o ZIP para uma pasta local, por exemplo
C:\Ratio. - Execute
Ratio.exe. - Aguarde abrir no navegador
http://127.0.0.1:5500. - No modal inicial, informe a chave Gemini.
- Rode uma consulta de teste.
| Sintoma | Causa comum | Acao |
|---|---|---|
Failed to fetch no frontend |
backend local nao iniciou | rodar Ratio.exe via terminal e verificar erros |
http://127.0.0.1:8000/health nao abre |
porta 8000 bloqueada/ocupada ou backend caiu | checar firewall/antivirus/processo em 8000 |
travado em Loading reranker model... no primeiro uso |
download/carga inicial do modelo local | aguardar; nas proximas consultas tende a ser bem mais rapido |
- Copie
.env.examplepara.env. - Configure no minimo:
GEMINI_API_KEY=...
O endpoint /api/tts suporta dois provedores:
gemini_native(padrao): caminho Gemini nativo.legacy_google: Google Cloud Text-to-Speech (texttospeech.googleapis.com) como rollback.
Perfil padrao atual:
TTS_PROVIDER=gemini_native
GEMINI_TTS_MODEL=gemini-2.5-pro-preview-tts
GEMINI_TTS_VOICE=charon
GEMINI_TTS_MAX_CHARS=5000
GEMINI_TTS_STREAM_MAX_CHARS=1200
GEMINI_TTS_REQUEST_TIMEOUT_MS=45000
GEMINI_TTS_REQUEST_RETRY_ATTEMPTS=0
GEMINI_TTS_MODEL_MAX_ATTEMPTS=1
TTS_LANGUAGE_CODE=pt-BR
Observacoes:
- perfil Gemini segue voz
charone segmentacao por SSML ate5000chars por bloco. - chave usada:
GEMINI_API_KEY.
Opcional (rollback legado):
TTS_PROVIDER=legacy_google
GOOGLE_TTS_VOICE_NAME=pt-BR-Neural2-B
GOOGLE_TTS_MAX_CHARS=5000
GOOGLE_TTS_REQUEST_TIMEOUT_MS=45000
- Gere sua chave no Google AI Studio: https://aistudio.google.com/apikey.
- Clique em Create API key e copie a chave.
- No projeto, preencha
GEMINI_API_KEYno arquivo.env. - Verifique limites ativos da conta:
- Se precisar aumentar limites:
Fonte oficial: https://ai.google.dev/gemini-api/docs/pricing
Valores podem mudar. Sempre confirme na tabela oficial.
| Modelo | Cota gratuita | Preco de entrada (1M tokens) | Preco de saida (1M tokens) |
|---|---|---|---|
gemini-3.1-pro-preview |
Nao | US$ 2.00 (<=200k) / US$ 4.00 (>200k) | US$ 12.00 (<=200k) / US$ 18.00 (>200k) |
gemini-2.5-flash |
Sim | US$ 0.30 (<=200k) / US$ 0.60 (>200k) | US$ 2.50 (<=200k) / US$ 3.50 (>200k) |
gemini-embedding-001 |
Sim | US$ 0.15 | N/A |
Notas:
- Limites RPM/TPM/RPD dependem do modelo e tier da conta.
- O Ratio usa embeddings e geracao; monitore consumo antes de lotes grandes.
Para consultas reais, o app precisa de indice LanceDB preconstruido.
Caminho esperado na raiz do projeto/pacote:
lancedb_store/
jurisprudencia.lance/
Sem essa pasta, /api/query nao retorna resultados.
Snapshot medido em 2026-02-24 sobre lancedb_store/jurisprudencia.
| Componente | Tamanho (GB) | Tamanho (GiB) |
|---|---|---|
data/ (SQLite e ativos locais) |
14.905 GB | 13.882 GiB |
lancedb_store/ (indice vetorial + tabelas) |
8.559 GB | 7.971 GiB |
| Total local | 23.464 GB | 21.853 GiB |
- Documentos indexados: 471,366
texto_integralnao vazio: 471,303- Volume total
texto_integral: 2,507,247,355 caracteres - Volume total
texto_busca: 1,738,788,368 caracteres
Cenario A (A4 juridico, 2.500 caracteres/pagina):
- 1,002,899 paginas
- 3,343 livros (300 paginas/livro)
Cenario B (layout mais denso, 2.100 caracteres/pagina):
- 1,193,928 paginas
- 3,980 livros (300 paginas/livro)
| Tipo | Documentos | Caracteres | Paginas (2.500 chars/pag) | Livros (300 pag) |
|---|---|---|---|---|
monocratica |
229,703 | 2,310,119,288 | 924,048 | 3,081 |
acordao |
223,077 | 180,007,985 | 72,004 | 241 |
informativo |
16,300 | 14,894,148 | 5,958 | 20 |
sumula |
736 | 871,622 | 349 | 2 |
tema_repetitivo_stj |
689 | 674,568 | 270 | 1 |
sumula_stj |
641 | 251,481 | 101 | 1 |
monocratica_sv |
112 | 388,580 | 156 | 1 |
sumula_vinculante |
63 | 0 | 0 | 0 |
acordao_sv |
45 | 39,683 | 16 | 1 |
Reranker local padrao:
BAAI/bge-reranker-v2-m3
Ele pode ser baixado/carregado no primeiro uso. Para preaquecer manualmente:
py -c "from sentence_transformers import CrossEncoder; CrossEncoder('BAAI/bge-reranker-v2-m3')"Menu de controle:
controle_jurisai_web.bat
Iniciar:
iniciar_jurisai_web.bat
Desligar:
desligar_jurisai_web.bat
Status:
status_jurisai_web.bat
Backend:
py -m uvicorn backend.main:app --host 127.0.0.1 --port 8000 --reloadFrontend:
py -m http.server 5500 --directory frontendAbra http://127.0.0.1:5500.
Health check:
curl http://127.0.0.1:8000/health- Baixe o ZIP e extraia a pasta.
- Instale dependencias (
py -m pip install -r requirements.txt) se estiver em modo desenvolvimento. - Inicie com
controle_jurisai_web.bat(opcao 1) ouiniciar_jurisai_web.bat. - No primeiro acesso, configure a chave Gemini no onboarding.
- Ajuste modelos/pesos e clique em Salvar ajustes.
- Faça as consultas.
- Para encerrar, use
controle_jurisai_web.bat(opcao 2) oudesligar_jurisai_web.bat.
No painel Meu Acervo, existe o bloco Atualizacao da base oficial (STF/STJ) com o botao:
Pesquisar e atualizar jurisprudencia
Esse processo:
- Busca apenas novos registros de 2026 em diante.
- Usa cursor da ultima verificacao concluida para consultar somente o que ainda nao entrou no banco local.
- Roda em segundo plano (com acompanhamento por status no painel).
- Aplica deduplicacao antes do upsert (nao duplica itens ja existentes no banco vetorial).
- No STJ, aplica tratamento de qualidade antes da insercao:
- limpeza local de OCR/quebras;
- reparo condicional com Gemini (
gemini-3-flash-preview) para campos suspeitos/quebrados.
- Exibe no final o resumo de "atualizado ate" (STF e STJ), alem da data/hora da ultima verificacao.
Endpoints da API usados na UI:
POST /api/juris-update/startGET /api/juris-update/jobs/{job_id}GET /api/juris-update/last
Observacao importante:
- Na etapa STF, pode abrir uma janela Chromium para validacao do portal de jurisprudencia.
- No build Windows, o Chromium do Playwright pode ser empacotado junto ao app para nao depender do Chrome instalado na maquina do usuario.
Configuracoes opcionais do reparo STJ:
JURIS_UPDATE_STJ_REPAIR_WITH_GEMINI=1
JURIS_UPDATE_STJ_REPAIR_MODEL=gemini-3-flash-preview
JURIS_UPDATE_STJ_REPAIR_MIN_CONFIDENCE=0.62
JURIS_UPDATE_STJ_REPAIR_MAX_RECORDS_PER_PDF=24
JURIS_UPDATE_STRICT_COMPLETENESS=1
JURIS_UPDATE_EMBED_FALLBACK_ON_QUOTA=1JURIS_UPDATE_STRICT_COMPLETENESS=1: se detectar lacunas esperadas (ex.: edicoes STJ sem registro), o job falha em vez de marcar sucesso.JURIS_UPDATE_EMBED_FALLBACK_ON_QUOTA=1: se a cota de embedding Gemini estourar, usa embedding hash local para nao deixar documentos de fora.
Daqui em diante, qualquer mudanca que precise chegar aos usuarios deve ser pensada a partir do mesmo caminho que eles usam no produto:
- o app em producao;
- o botao/fluxo de atualizacao no frontend;
- o mecanismo de delta-update do release.
Regra operacional:
- se a mudanca nao puder ser entregue pelo fluxo de atualizacao do frontend, ela nao deve ser considerada pronta para release aos usuarios;
- nao assumir rebuild local de
Ratio.execomo solucao para rollout normal; - o que funciona localmente para desenvolvimento precisa ser validado tambem no formato consumido por quem ja instalou o app;
- mudancas em
lancedb_store/ou outros artefatos de runtime so podem ir para release quando o manifesto de atualizacao incluir esses arquivos, ou quando a release for marcada explicitamente como exigindo instalacao completa.
Em outras palavras: o padrao para distribuicao incremental e atualizar pelo frontend. Build completo/instalador fica como excecao, nao como caminho principal.
Manual detalhado para publicacao no site:
docs/ERROS_COMUNS_SITE.md
| Codigo | Significado | Acao recomendada |
|---|---|---|
missing_api_key |
Chave Gemini ausente | Configurar chave no modal inicial ou .env |
invalid_api_key |
Chave invalida | Gerar nova chave no AI Studio e colar novamente |
api_key_not_active |
API/chave sem permissao ativa | Ativar Gemini API no projeto Google Cloud vinculado |
quota_exhausted |
Cota gratuita/paga esgotada | Aguardar reset da cota ou ajustar billing/limites |
rate_limited |
Excesso de requisicoes por minuto | Reduzir frequencia/paralelismo |
model_unavailable |
Modelo indisponivel para a conta | Trocar modelo nas configuracoes |
upstream_unavailable |
Instabilidade temporaria do provedor | Tentar novamente em instantes |
Principais arquivos de runtime:
logs/runtime/acervo_backend.loglogs/runtime/tts_backend.loglogs/runtime/meu_acervo_manifest.json
Arquivos de build:
build/Ratio/warn-Ratio.txtbuild/Ratio/xref-Ratio.html
Suite completa:
py -m pytestSuite principal do contrato/API/frontend:
py -m pytest -q tests/test_api_contract.py tests/test_frontend_sidebar_saved.py tests/test_packaging_support.pySuite focada na atualizacao automatica STF/STJ:
py -m pytest -q tests/test_juris_update_metadata.py- Nao versione
.envou chaves de API. - Consulte tambem:
CONTRIBUTING.mdCODE_OF_CONDUCT.mdSECURITY.mdLICENSE
Se o Ratio for util no seu fluxo de pesquisa, seu apoio ajuda a manter e evoluir a plataforma.
- GitHub Sponsors: https://github.com/sponsors/carlosvictorodrigues
- Instagram:
@carlosvictorodrigues - E-mail:
contato@ratiojuris.me - PIX (copia e cola):
00020126920014BR.GOV.BCB.PIX013607cdc77f-cd4b-44b8-a910-a254f58642f40230Apoie o Ratio - Jurisprudencia5204000053039865802BR5925Carlos Victor de Oliveira6009SAO PAULO621405102qCvdJp89F6304E670
O QR Code de apoio tambem esta na interface (modal "Sobre o Ratio", aba "Autor").
O Ratio e um assistente de pesquisa. Nao substitui consultoria juridica formal. Sempre valide fontes primarias antes de decidir estrategicamente.