Skip to content

[scielo-tools-18] Adicionar app ia#25

Open
gitnnolabs wants to merge 1 commit into
scieloorg:mainfrom
gitnnolabs:feature/scielo-tools-18
Open

[scielo-tools-18] Adicionar app ia#25
gitnnolabs wants to merge 1 commit into
scieloorg:mainfrom
gitnnolabs:feature/scielo-tools-18

Conversation

@gitnnolabs

@gitnnolabs gitnnolabs commented Jul 2, 2026

Copy link
Copy Markdown
Collaborator

O que esse PR faz?

Adiciona o app Django ia de forma autônoma e reusável, com modelos de configuração de provedores (Gemini, Ollama, HuggingFace), serviço de orquestração LLM, tarefas de download, exceções de domínio, utilitários e integração com Wagtail Admin. Mantém o grupo IA Models no menu de Settings do Wagtail para preservar o comportamento padrão de navegação do admin. Também expõe IA Models no menu principal, sem ocultar entradas padrão já existentes no admin. Remove o filtro global de menu em core/wagtail_hooks.py que mantinha apenas sps_package_validation, restaurando a navegação padrão completa do Wagtail.

Onde a revisão poderia começar?

ia/models.py, ia/wagtail_hooks.py, ia/service.py, config/settings/base.py, config/urls.py.

Como este poderia ser testado manualmente?

  1. Instalar dependências: pip install -r requirements/local.txt.
  2. Executar migrações: python manage.py migrate.
  3. Validar projeto: python manage.py check.
  4. Acessar /admin/ e confirmar o grupo IA Models em Settings com snippets HuggingFace, Ollama e Gemini.
  5. Baixar modelo Hugging Face:
    1. Abrir Settings > IA Models > HuggingFace.
    2. Criar registro com:
      • Model name: hugging-quants/Llama-3.2-3B-Instruct-Q4_K_M-GGUF
      • Model file: llama-3.2-3b-instruct-q4_k_m.gguf
      • HuggingFace token: token pessoal de leitura
    3. Salvar e confirmar início do download (status Downloading no admin).
    4. Aguardar status Downloaded.
  6. Testar integração Ollama:
    1. Garantir serviço local do Ollama ativo.
    2. Abrir Settings > IA Models > Ollama.
    3. Informar URL http://localhost:11434.
    4. Clicar em Fetch models, selecionar um modelo e validar preenchimento de context_limit.
  7. No shell Django, executar from ia.service import LLMService para validar import.
  8. Opcional: configurar modelo Gemini em Settings > IA Models > Gemini para validar seleção de provider por prioridade.

Como este poderia ser testado automaticamente?

  1. Executar pytest ia/tests.
  2. Validar que os testes cobrem:
    • unicidade de modelo ativo por provider em ia.models;
    • seleção de provider no LLMService;
    • endpoints AJAX de Ollama em admin/ia/;
    • comportamento de IAAdminModelForm.save_all para criação e atualização;
    • decisões do IADatabaseRouter com e sem ia_db;
    • fluxo de mark_reference e mark_references com sucesso e erro inesperado.

Algum cenário de contexto que queira dar?

O app foi estruturado para funcionar sem dependências de core.models e core.forms, permitindo reuso em outros projetos Django/Wagtail. Foi incluído IADatabaseRouter para cenários com banco dedicado ia_db.

Screenshots

N/A

Quais são tickets relevantes?

N/A

Referências

@gitnnolabs gitnnolabs requested a review from Rossi-Luciano July 2, 2026 10:28
@gitnnolabs gitnnolabs self-assigned this Jul 2, 2026
@gitnnolabs gitnnolabs added the enhancement New feature or request label Jul 2, 2026
@gitnnolabs

Copy link
Copy Markdown
Collaborator Author

Rodando os teste unitários:

make test 
Image

Rodando o check:

make django_bash
python manage.py check
Image

Garantir que não tenha chamadas de core.models ou core.forms na pasta ia:

Image Image

Telas em ambiente de desenvolvimento:

Image Image Image Image

Migrações executadas com sucesso:

make django_bash 
python manage.py migrate
python manage.py showmigrations ia
Image

@pitangainnovare pitangainnovare left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • Sugiro que algumas alterações de arquitetura sejam feitas, se houver tempo. Por exemplo:
    • Em lugar de ter prompts hardcoded, poderia haver um modelo Django/Wagtail para registrarmos e associar isso aos campos/grupos de dados
      • PromptField
        • prompt (o prompt em si)
        • language (o idioma do prompt)
        • target field (o campo alvo, por exemplo, title, author name, etc).
        • target group (back, body, end)
  • Sugiro também que o uso de um modelo de IA seja configurável globalmente ou por documento ou por grupo ou por campo
    • Podemos querer usar para um mesmo DOCX o modelo mais poderoso para obter metadados, o mais simples para obter os títulos das seções, etc.

Comment thread instruções.txt
@@ -0,0 +1,34 @@
Preciso criar uma sequencia de issue no github como tarefa.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sugiro remover este arquivo do PR, pois é uma instrução específica para LLM gerar código ou ajustar o repositório.

Comment thread ia/prompts/back.py
@@ -0,0 +1,26 @@
MESSAGES = [

@pitangainnovare pitangainnovare Jul 3, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sugiro ter no lugar deste arquivo (back.py) um modelo Django para administrar prompts por:

  • Idioma
  • Campo
  • Grupo (front, body, back)

Comment thread ia/prompts/text.py
@@ -0,0 +1,113 @@
import json

@pitangainnovare pitangainnovare Jul 3, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sugiro ter no lugar deste arquivo (front.py) um modelo Django para administrar prompts por:

  • Idioma
  • Campo
  • Grupo (front, body, back)

Comment thread ia/prompts/vision.py
@@ -0,0 +1,62 @@
VISION_TASKS = [

@pitangainnovare pitangainnovare Jul 3, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sugiro ter no lugar deste arquivo (vision.py) um modelo Django para administrar prompts por:

  • Idioma
  • Campo
  • Grupo (front, body, back)

Comment thread ia/utils/text.py
logger = logging.getLogger(__name__)


def extract_text_from_docx(docx_path, limit_chars=30000):

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Isso é um utilitário que recebe um .DOCX e entrega todos os conteúdos textuais (w:t). Usa etree exclusivamente a partir de word/document.xml, que é o principal arquivo onde há coisas de conteúdo do Word.

É preciso avaliar se é a melhor estratégia ou se falta algum campo que não estamos enxergando (texto dentro de caixas de texto, texto em rodapé, etc). Se quiser extrair também cabeçalho, rodapé, notas e comentários, aí precisa ler outros arquivos do .docx, não só word/document.xml.

Seria interessante ter testes unitários para isso (que avaliam a extração de textos desses campos)

Comment thread ia/wagtail_hooks.py
logger = logging.getLogger(__name__)


def ollama_tags(request):

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tem mais cara de view (poderia estar em views.py)

Comment thread config/settings/base.py
ROOT_DIR = Path(__file__).resolve(strict=True).parent.parent.parent
# core/
APPS_DIR = ROOT_DIR / "core"
LLAMA_MODEL_DIR = ROOT_DIR / "ia/download"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sugiro que o diretório de modelos seja ia/models/*

Comment thread ia/providers/__init__.py
@@ -0,0 +1,8 @@
JSON_INSTRUCTION = (

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Aqui tem uma espécie de prompt. Sugiro que seja removido (em favor de um modelo no banco que guarde prompts, campo alvo, formato de resposta, etc).

Comment thread ia/providers/local.py
logger = logging.getLogger(__name__)


class LocalProvider:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pelo que entendi, esse aqui é o modelo HuggingFace, certo? Talvez precisemos ajustar os nomes

  • Gemini
  • Ollama
  • HuggingFace (apesar de que isso aqui é uma plataforma).

E de certo modo, Ollama tbm é local, por isso, LocalProvider pode não ser o termo correto aqui.

Comment thread ia/utils/blocks.py
@@ -0,0 +1,63 @@
from ia.utils.normalizers import stz_language

@pitangainnovare pitangainnovare Jul 3, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sobre esse arquivo blocks.py, olhando apenas o código, não fica clara a utilidade disso. Lembro que em alguma versão, nós tinhamos blocos de texto no Wagtail:

  • Parágrafo
  • Parágrafo com Idioma
  • etc.

Mas talvez isso deva ser um modelo (com que achava que fosse vendo a aplicação funcionar).

@pitangainnovare pitangainnovare self-assigned this Jul 3, 2026
@gitnnolabs

Copy link
Copy Markdown
Collaborator Author

@pitangainnovare grato, vou analisar os comentários.

@pitangainnovare pitangainnovare removed their assignment Jul 5, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants