Backend da plataforma Animus, uma aplicacao de analise de precedentes juridicos que transforma peticoes iniciais em insumos objetivos para advogados e juizes. Este servico foi desenvolvido em Python com FastAPI, com foco em regras de negocio desacopladas, arquitetura em camadas e integracoes robustas para autenticacao, processamento com IA, armazenamento de analises e notificacoes assincronas.
O Animus Server sustenta os principais fluxos do produto:
- Auth e identidade: cadastro, login, gestao de perfil e recuperacao de senha.
- Intake juridico: upload de peticoes em PDF ou DOCX para extracao, resumacao e analise de precedentes com IA.
- Analise de precedentes: classificacao de aplicabilidade, sintese explicativa e apoio a decisao processual.
- Storage e historico: persistencia, organizacao, consulta e exportacao de analises anteriores.
- Notificacoes assicronas: eventos de conclusao de analise e outros fluxos desacoplados.
O projeto utiliza uma stack moderna para API, persistencia, processamento e mensageria:
- Linguagem: Python 3.13+
- Framework HTTP: FastAPI
- Servidor ASGI: Uvicorn
- ORM e Persistencia: SQLAlchemy + PostgreSQL
- Migracoes: Alembic
- Jobs/Eventos: Inngest
- IA e orquestracao: Agno
- Validacao e configuracao: Pydantic + pydantic-settings
- Autenticacao e seguranca: PyJWT + pwdlib
- Tooling: uv, Poe the Poet, Ruff, BasedPyright, Pytest
O projeto segue uma arquitetura em camadas inspirada em Clean Architecture e Hexagonal Architecture (Ports and Adapters).
- Core (
src/animus/core/): entidades, DTOs, erros de dominio, interfaces e use cases. - Rest (
src/animus/rest/): controllers HTTP e middlewares de request. - Routers (
src/animus/routers/): composicao e registro de rotas por contexto. - Pipes (
src/animus/pipes/): providers de dependencia paraDepends(...). - Validation (
src/animus/validation/): schemas e conversao request/response. - Database (
src/animus/database/): models, mappers e repositorios SQLAlchemy. - Providers (
src/animus/providers/): adaptadores externos e servicos de infraestrutura. - PubSub (
src/animus/pubsub/): orquestracao assincrona por eventos com Inngest. - AI (
src/animus/ai/): integracoes e orquestracao dos fluxos de inteligencia artificial.
Para detalhes tecnicos, consulte a Documentacao de Arquitetura.
src/animus/
βββ app.py
βββ ai/
βββ constants/
βββ core/
βββ database/
βββ pipes/
βββ providers/
βββ pubsub/
βββ rest/
βββ routers/
βββ validation/- Python 3.13+
- uv
- PostgreSQL local ou acessivel via
DATABASE_URL - Node.js/npm apenas se voce for executar o ambiente local do Inngest
-
Clone o repositorio:
git clone <url-do-repositorio> cd animus-server
-
Configure as variaveis de ambiente:
cp .env.example .env
Preencha os valores necessarios no arquivo
.env. Consulte a secaoVariaveis de Ambienteabaixo para o detalhamento completo de cada chave. -
Instale as dependencias do projeto:
uv sync
O
uv synccria/atualiza automaticamente o ambiente virtual local em.venv. Se quiser ativar manualmente no shell:source .venv/bin/activate -
Prepare o banco de dados:
Crie a base configurada em
DATABASE_URLe depois aplique as migracoes:uv run poe db:upgrade
-
Execute a API em desenvolvimento:
uv run poe dev
-
(Opcional) Execute o ambiente local de eventos:
uv run poe pubsub
-
(Opcional) Popule dados de desenvolvimento:
uv run poe db:seed
Para subir os servicos locais (PostgreSQL, Redis, Qdrant, Inngest e emulador de GCS):
docker compose up -dPara derrubar os servicos:
docker compose down- Obrigatorias para o fluxo principal local:
MODE,DATABASE_URL,JWT_SECRET_KEY,REDIS_URL,QDRANT_URL,GCS_BUCKET_NAME,GCS_EMULATOR_HOST. - Recomendadas para testar IA/end-to-end:
OPENAI_API_KEYe/ouGEMINI_API_KEY,INNGEST_SIGNING_KEY,RESEND_API_KEY,RESEND_SENDER_EMAIL.
- Em
prod, nao useGCS_EMULATOR_HOST; use bucket real no GCS. - Mantenha segredos (
*_KEY,*_SECRET, credenciais e URLs com auth) em gerenciador de segredos.
O repositorio possui um workflow de CD dedicado para publicar a imagem Docker no Google Artifact Registry e atualizar o servico no Google Cloud Run.
- Push em
main: publica imagem destaginge faz deploy no Cloud Run. - Push em
production: publica imagem deprode faz deploy no Cloud Run. - O CD so roda quando o workflow
Continuous Integrationtermina com sucesso para o mesmo push.
main:stagingstaging-<sha-curto>
production:prodprod-<sha-curto>latest
main: faz deploy da imagemstaging-<sha-curto>no servico configurado parastaging.production: faz deploy da imagemprod-<sha-curto>no servico configurado paraproduction.- O deploy usa uma tag imutavel por commit para garantir rastreabilidade da revisao publicada.
Configure estas variaveis em Settings > Secrets and variables > Actions ou nos Environments correspondentes:
GCP_PROJECT_ID: ID do projeto GCP.GCP_ARTIFACT_REGISTRY_REGION: regiao do Artifact Registry, ex.southamerica-east1.GCP_ARTIFACT_REGISTRY_REPOSITORY: nome do repositorio Docker no Artifact Registry.GCP_CLOUD_RUN_REGION: regiao do servico Cloud Run, ex.southamerica-east1.GCP_CLOUD_RUN_SERVICE: nome do servico Cloud Run que recebera o deploy.GCP_WORKLOAD_IDENTITY_PROVIDER: resource name completo do provider, ex.projects/123456789/locations/global/workloadIdentityPools/github/providers/animus-server.GCP_SERVICE_ACCOUNT_EMAIL: email da service account usada pelo GitHub Actions.IMAGE_NAME: opcional; nome da imagem. Padrao:animus-server.
Use Workload Identity Federation em vez de chave JSON fixa.
- Habilite as APIs do Artifact Registry e Cloud Run no projeto.
- Crie um repositorio Docker no Artifact Registry.
- Crie uma service account para o GitHub Actions.
- Conceda a essa service account ao menos
roles/artifactregistry.writer. - Conceda tambem
roles/run.adminpara atualizar o Cloud Run. - Conceda
roles/iam.serviceAccountUserna service account de runtime usada pelo Cloud Run, quando aplicavel. - Crie um
Workload Identity Poolpara GitHub Actions. - Crie um
OIDC Providercom issuerhttps://token.actions.githubusercontent.com. - Restrinja o provider ao owner/repositorio corretos.
- Permita que o repositorio GitHub impersonifique a service account com
roles/iam.workloadIdentityUser.
southamerica-east1-docker.pkg.dev/<project-id>/<repository>/animus-server:staging
southamerica-east1-docker.pkg.dev/<project-id>/<repository>/animus-server:prod
-
HOST- O que e: host onde a API vai escutar localmente.
- Como obter: defina manualmente (
127.0.0.1para desenvolvimento local).
-
PORT- O que e: porta HTTP da API.
- Como obter: defina manualmente (
8080no ambiente local).
-
ANIMUS_SERVER_URL- O que e: URL publica/base da API usada em fluxos que precisam de callback/link absoluto.
- Como obter: local
http://localhost:8080; em cloud, use a URL publica do servico.
-
MODE- O que e: modo de execucao (
dev,stg,prod). - Como obter: defina conforme ambiente de deploy.
- O que e: modo de execucao (
-
POSTGRES_DB,POSTGRES_USER,POSTGRES_PASSWORD- O que e: dados auxiliares para ambiente local de banco.
- Como obter: defina manualmente para o banco local (ou os valores do seu container/servico PostgreSQL).
-
DATABASE_URL- O que e: string de conexao principal do PostgreSQL.
- Como obter: no formato
postgresql://<user>:<password>@<host>:<port>/<db>.- Local: use os valores do seu Postgres local.
- Gerenciado (ex.: Supabase): copie a connection string no painel do provider.
-
GCS_BUCKET_NAME- O que e: nome do bucket usado para arquivos.
- Como obter:
- Local (emulador): defina um nome fixo, ex.
animus. - Producao: crie bucket no Google Cloud Storage e use o nome exato.
- Local (emulador): defina um nome fixo, ex.
-
GCS_EMULATOR_HOST- O que e: endpoint do emulador de storage.
- Como obter: em dev local, use algo como
http://localhost:4443.- Importante: essa variavel so deve ser usada com
MODE=dev.
- Importante: essa variavel so deve ser usada com
-
GEMINI_API_KEY- O que e: chave da API Gemini (Google AI Studio).
- Como obter: gere em Google AI Studio e copie para o
.env.
-
OPENAI_API_KEY- O que e: chave da API OpenAI.
- Como obter: gere no painel da OpenAI e copie para o
.env.
-
GOOGLE_CLIENT_ID- O que e: client id OAuth usado no login com Google.
- Como obter: crie credencial OAuth 2.0 no Google Cloud Console (tipo Web application) e copie o Client ID.
-
PANGEA_SERVICE_URL- O que e: URL base do servico Pangea consumido pelo backend.
- Como obter: usar a URL oficial do ambiente alvo; em geral manter
https://pangeabnp.pdpj.jus.br.
-
QDRANT_URL- O que e: endpoint HTTP do Qdrant.
- Como obter:
- Local:
http://localhost:6333. - Cloud: copie a URL/endpoint do cluster Qdrant.
- Local:
-
INNGEST_DEV- O que e: flag para modo de desenvolvimento do Inngest.
- Como obter: use
1localmente; em ambientes nao-dev normalmente remova/ajuste conforme configuracao do Inngest.
-
INNGEST_SIGNING_KEY- O que e: chave de assinatura/validacao de eventos Inngest.
- Como obter: copie no dashboard/projeto do Inngest (environment keys).
-
JWT_SECRET_KEY- O que e: segredo usado para assinar tokens JWT.
- Como obter: gere uma string aleatoria forte (ex.: 32+ bytes) e armazene em cofre de segredos.
-
JWT_ALGORITHM- O que e: algoritmo de assinatura JWT.
- Como obter: definir manualmente (
HS256padrao do projeto).
-
JWT_ACCESS_TOKEN_EXPIRATION_SECONDS- O que e: expiracao do access token em segundos.
- Como obter: definir manualmente (ex.:
3600).
-
JWT_REFRESH_TOKEN_EXPIRATION_SECONDS- O que e: expiracao do refresh token em segundos.
- Como obter: definir manualmente (ex.:
86400).
-
REDIS_URL- O que e: URL de conexao ao Redis.
- Como obter:
- Local:
redis://localhost:6379/0. - Gerenciado (ex.: Upstash): copie endpoint e credenciais no painel do provider.
- Local:
-
EMAIL_VERIFICATION_OTP_TTL_SECONDS- O que e: tempo de vida do OTP de verificacao de email (em segundos).
- Como obter: definir manualmente entre 60 e 86400 (padrao recomendado:
3600).
-
RESEND_API_KEY- O que e: chave da API Resend para envio de emails.
- Como obter: gere no dashboard da Resend.
-
RESEND_SENDER_EMAIL- O que e: remetente dos emails transacionais.
- Como obter: use um endereco de dominio verificado na Resend.
Com base na documentacao funcional, os modulos centrais do produto sao:
- Auth: identidade do usuario, login com email/senha ou Google, perfil e recuperacao de senha.
- Intake: recebimento da peticao inicial, extracao de informacoes e busca de precedentes juridicos relevantes.
- Storage: historico, organizacao em pastas, nomeacao e exportacao das analises.
- Notification: comunicacao assincrona quando uma analise e concluida ou um relatorio e gerado.
O sistema e uma ferramenta de apoio a decisao. A interpretacao final e a escolha do precedente continuam sob responsabilidade do usuario.
Os principais documentos do projeto estao em documentation/:
Execute os comandos abaixo para validar o projeto:
uv run poe test
uv run poe typecheck
uv run poe codecheckEste projeto esta licenciado sob a licenca MIT.