DEV Community

LeoJulieta
LeoJulieta

Posted on

Versione leis dos EUA com Git, CI/CD e IA em minutos

Versionando o US Code com Git, CI/CD e IA: Guia Prático para Advogados, Devs e Jornalistas

Introdução

Você sabia que pode acompanhar cada alteração nas leis dos EUA como se fosse um projeto de software?

Com Git, GitHub Actions e modelos de linguagem, é possível ter um repositório sempre atualizado do US Code, receber alertas em tempo real e gerar resumos automáticos em segundos.

Neste tutorial passo‑a‑passo você vai criar o seu próprio repositório versionado, montar um pipeline de integração contínua e usar LLMs para analisar o texto legal. Tudo pronto para ser usado hoje.


1. Preparando o ambiente

Ferramenta Por que usar Instalação rápida
Git Controle de versões, diffs linha a linha apt-get install git (Linux) ou baixe em git-scm.com
GitHub CLI Automatiza criação de repositórios e actions brew install gh (macOS)
Node.js (v18+) Executa scripts de download e parsing nvm install 18
Python 3.11 Processamento de XML/JSON e chamadas à API de IA pyenv install 3.11
OpenAI / Anthropic API key Gera resumos e detecta conflitos Crie a chave em platform.openai.com ou console.anthropic.com

1.1 Crie o repositório no GitHub

gh repo create us-code-versionado --public --description "US Code versionado com Git e IA"
git clone https://github.com/SEU_USUARIO/us-code-versionado.git
cd us-code-versionado
Enter fullscreen mode Exit fullscreen mode

1.2 Estrutura de pastas

us-code-versionado/
├─ data/          # XML/JSON bruto do govinfo
├─ scripts/       # scripts de download, parsing e IA
├─ docs/          # resumos e relatórios gerados
└─ .github/
   └─ workflows/
      └─ ci.yml   # pipeline CI/CD
Enter fullscreen mode Exit fullscreen mode

2. Baixando o US Code

O portal govinfo.gov oferece arquivos ZIP contendo o código completo em XML. Use o script abaixo (salve como scripts/download.sh):

#!/usr/bin/env bash
set -e
VERSION=2024
URL="https://www.govinfo.gov/content/pkg/USCODE-${VERSION}/xml/USCODE-${VERSION}.zip"
wget -O uscode.zip "$URL"
unzip -o uscode.zip -d data/
git add data/
git commit -m "Importação inicial do US Code ${VERSION}"
git push origin main
Enter fullscreen mode Exit fullscreen mode

Execute uma vez para popular o repositório:

chmod +x scripts/download.sh
./scripts/download.sh
Enter fullscreen mode Exit fullscreen mode

3. Configurando o pipeline CI/CD

Crie o arquivo .github/workflows/ci.yml:

name: Atualiza US Code e gera insights

on:
  schedule:
    - cron: '0 3 * * 0'   # todo domingo às 03:00 UTC
  workflow_dispatch:

jobs:
  update-code:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Instalar dependências
        run: |
          sudo apt-get update && sudo apt-get install -y unzip wget git
          python -m pip install --upgrade pip
          pip install lxml openai
      - name: Baixar versão mais recente
        run: ./scripts/download.sh
      - name: Detectar mudanças
        id: diff
        run: |
          git diff --quiet HEAD^ HEAD && echo "changed=false" >> $GITHUB_OUTPUT || echo "changed=true" >> $GITHUB_OUTPUT
      - name: Gerar resumo com IA
        if: steps.diff.outputs.changed == 'true'
        env:
          OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
        run: |
          python scripts/generate_summary.py data/ docs/summary_$(date +%Y%m%d).md
      - name: Commit e push
        if: steps.diff.outputs.changed == 'true'
        run: |
          git config user.name "github-actions"
          git config user.email "actions@github.com"
          git add docs/
          git commit -m "Resumo automático $(date +%Y-%m-%d)"
          git push
      - name: Notificar no Slack
        if: steps.diff.outputs.changed == 'true'
        uses: slackapi/slack-github-action@v1.23.0
        with:
          channel-id: ${{ secrets.SLACK_CHANNEL }}
          slack-message: "🗂️ US Code atualizado e resumo publicado em `docs/`."
        env:
          SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
Enter fullscreen mode Exit fullscreen mode

Dica: Salve as chaves OPENAI_API_KEY, SLACK_BOT_TOKEN e SLACK_CHANNEL como secrets no repositório (Settings → Secrets → Actions).


4. Integração de LLMs para análise jurídica

4.1 Script de resumo (scripts/generate_summary.py)

import os, json, glob, openai
from lxml import etree

openai.api_key = os.getenv("OPENAI_API_KEY")

def load_sections(path):
    sections = []
    for file in glob.glob(f"{path}/**/*.xml", recursive=True):
        tree = etree.parse(file)
        for sec in tree.xpath("//section"):
            title = sec.findtext("title") or "Sem título"
            text = " ".join(sec.itertext())
            sections.append({"title": title, "text": text})
    return sections

def summarize(sections):
    prompt = (
        "Você é um assistente jurídico. Resuma em até 3 frases cada seção abaixo, "
        "destacando alterações recentes e possíveis conflitos com outras partes do código.\n\n"
    )
    for s in sections[:5]:  # limita a 5 seções por chamada (custo)
        prompt += f"### {s['title']}\n{s['text'][:1500]}\n\n"
    response = openai.ChatCompletion.create(
        model="gpt-4o-mini",
        messages=[{"role": "user", "content": prompt}],
        temperature=0.2,
    )
    return response.choices[0].message.content

if __name__ == "__main__":
    data_path = "data"
    out_dir = "docs"
    secs = load_sections(data_path)
    resumo = summarize(secs)
    out_file = os.path.join(out_dir, f"summary_{os.getenv('GITHUB_RUN_NUMBER', 'local')}.md")
    with open(out_file, "w", encoding="utf-8") as f:
        f.write(resumo)
    print(f"Resumo salvo em {out_file}")
Enter fullscreen mode Exit fullscreen mode

4.2 Detectando conflitos semânticos

A mesma abordagem pode ser adaptada para comparar duas seções distintas. Basta enviar ao modelo um prompt como:

Compare a seção 18 U.S.C. § 922 (controle de armas) com a seção 42 U.S.C. § 2000d (direitos civis). Existem contradições ou sobreposições?
Enter fullscreen mode Exit fullscreen mode

O retorno pode ser armazenado em docs/conflicts_*.md e versionado automaticamente.


5. Checklist de compliance

  • [ ] Chaves de API armazenadas como secrets (não em código).
  • [ ] Logs de chamadas à IA são mantidos em logs/ para auditoria.
  • [ ] Política de retenção: mantenha apenas os últimos 12 meses de commits de dados brutos (data/).
  • [ ] Revisão humana: antes de publicar qualquer resumo legal, um advogado deve validar o conteúdo.
  • [ ] Licença: adicione LICENSE (MIT ou Apache 2.0) para deixar claro o uso permitido dos dados.

6. Perguntas frequentes (FAQ)

Pergunta Resposta curta
O US Code é de domínio público? Sim. O governo dos EUA disponibiliza o texto em XML/JSON sem restrições de copyright.
Posso usar o repositório para fins comerciais? Desde que respeite a licença do código (public domain) e as políticas de uso da API de IA.
Como rastrear quem alterou uma seção? O Git registra o autor do commit. Use git blame path/to/file.xml para ver linha a linha.
E se a API do OpenAI mudar de preço? O pipeline pode ser configurado para usar modelos locais (e.g., Llama‑2) instalados em runners auto‑hospedados.
O que fazer se detectar um conflito legal? Abra um issue no GitHub, marque a equipe jurídica e anexe o relatório gerado.

7. Próximos passos

  1. **

Herramienta mencionada: Groq Cloud

Top comments (0)