Descrição da tarefa
Eu, como administrador de implantação do SciELO Tools, gostaria que a aplicação de IA (ia) pudesse ser instalada e ativada opcionalmente, para que instalações que usam apenas validação SPS, gestão de XML e Wagtail não carreguem dependências pesadas de LLM, migrações do app ia nem menus administrativos de IA.
Hoje o app ia está sempre em LOCAL_APPS, as URLs admin/ia/ estão sempre registradas e google-generativeai / huggingface_hub estão em requirements/base.txt, obrigando todas as instalações a incluir IA mesmo quando não será usada.
A solução deve combinar dois níveis independentes:
- Instalação opcional (dependências) — ficheiros
requirements separados para o perfil com IA.
- Ativação opcional (runtime Django/Wagtail) — variável
IA_ENABLED controlando INSTALLED_APPS, URLs, router de banco e integrações futuras.
O toggle existente LLAMA_ENABLED permanece responsável apenas pelo provider local (GGUF via llama-cpp-python), não pelo app inteiro.
Fora do âmbito desta tarefa:
- Publicar o app
ia como pacote pip independente (scielo-ia).
- Integrar
xml_manager ou outros apps com chamadas a ia.references (preparar o padrão apps.is_installed("ia"), mas não implementar fluxos editoriais).
- Alterar comportamento dos providers Gemini, Ollama ou HuggingFace quando IA estiver ativa.
Estado atual (ponto de partida)
| Elemento |
Comportamento atual |
config/settings/base.py |
"ia" fixo em LOCAL_APPS; LLAMA_MODEL_DIR sempre definido |
config/urls.py |
path("admin/ia/", include("ia.urls")) sempre presente |
requirements/base.txt |
google-generativeai e huggingface_hub no core |
LLAMA_ENABLED |
Desliga só o provider local em ia/providers/local.py |
llama-cpp-python |
Não listado em requirements; import lazy com exceção de domínio |
| Outros apps |
Sem import direto de ia (acoplamento ainda baixo) |
Decisões de design
1. Ativação em runtime — IA_ENABLED
Introduzir IA_ENABLED = env.bool("IA_ENABLED", default=False) em config/settings/base.py (ou perfil local.py com default True apenas em dev, se a equipa preferir).
Quando IA_ENABLED for False:
"ia" não entra em LOCAL_APPS / INSTALLED_APPS.
DATABASE_ROUTERS não inclui ia.db_router.IADatabaseRouter.
LLAMA_MODEL_DIR só é definido se IA estiver ativa.
config/urls.py não registra admin/ia/.
- Hooks Wagtail de
ia/wagtail_hooks.py não são carregados (descoberta automática só com app instalado).
- Tarefas Celery de
ia/tasks.py não são autodescobertas.
Quando IA_ENABLED for True:
- Comportamento equivalente ao atual (app completo, migrações, admin, URLs).
Padrão para consumo futuro por outros apps:
from django.apps import apps
if apps.is_installed("ia"):
from ia.references import mark_reference
Preferir apps.is_installed("ia") em vez de checar só IA_ENABLED, para refletir o que o Django realmente carregou.
2. Dependências — ficheiros requirements separados
| Ficheiro |
Conteúdo |
requirements/base.txt |
Remover google-generativeai e huggingface_hub |
requirements/ia.txt |
google-generativeai, huggingface_hub |
requirements/ia-local.txt |
llama-cpp-python (opcional; pesado e dependente de SO/toolchain) |
requirements/local-ia.txt |
-r local.txt + -r ia.txt |
requirements/production-ia.txt |
-r production.txt + -r ia.txt |
requests permanece em base.txt (já usado por packtools e Ollama).
3. Perfis de instalação documentados
| Perfil |
IA_ENABLED |
Requirements |
Uso típico |
| core |
false |
local.txt / production.txt |
Validação SPS, XML, Wagtail sem LLM |
| ia |
true |
local-ia.txt / production-ia.txt |
Marcação assistida, providers configurados |
| ia + local GGUF |
true + LLAMA_ENABLED=true |
perfil ia + ia-local.txt |
Inferência local com GGUF |
4. Testes e CI
- Marcador pytest
ia para testes que exigem app e dependências de IA.
- Job CI core:
IA_ENABLED=false, pytest excluindo ia/.
- Job CI ia:
IA_ENABLED=true, pip install -r requirements/ia.txt, pytest ia/tests.
Subtarefas
Critérios de aceite
Como testar manualmente
Perfil core (sem IA)
pip install -r requirements/local.txt
- Garantir
IA_ENABLED=false (ou ausente) no ambiente.
python manage.py check
python manage.py migrate
- Acessar
/admin/ e confirmar ausência de IA Models.
- Confirmar que
python -c "import google.generativeai" falha (deps não instaladas).
Perfil ia
pip install -r requirements/local-ia.txt
IA_ENABLED=true python manage.py migrate
IA_ENABLED=true python manage.py check
- Acessar
/admin/ e configurar um provider (ex.: Ollama em http://localhost:11434).
- No shell:
from ia.service import LLMService — import sem erro.
- Opcional:
pip install -r requirements/ia-local.txt, ativar modelo HuggingFace e validar provider local com LLAMA_ENABLED=true.
Regressão
- Com IA ativa, repetir fluxos do PR
docs/pr/2026-07-02-adicionar-app-ia.md (download HF, fetch Ollama, pytest ia/tests).
Referências
Descrição da tarefa
Eu, como administrador de implantação do SciELO Tools, gostaria que a aplicação de IA (
ia) pudesse ser instalada e ativada opcionalmente, para que instalações que usam apenas validação SPS, gestão de XML e Wagtail não carreguem dependências pesadas de LLM, migrações do appianem menus administrativos de IA.Hoje o app
iaestá sempre emLOCAL_APPS, as URLsadmin/ia/estão sempre registradas egoogle-generativeai/huggingface_hubestão emrequirements/base.txt, obrigando todas as instalações a incluir IA mesmo quando não será usada.A solução deve combinar dois níveis independentes:
requirementsseparados para o perfil com IA.IA_ENABLEDcontrolandoINSTALLED_APPS, URLs, router de banco e integrações futuras.O toggle existente
LLAMA_ENABLEDpermanece responsável apenas pelo provider local (GGUF viallama-cpp-python), não pelo app inteiro.Fora do âmbito desta tarefa:
iacomo pacote pip independente (scielo-ia).xml_managerou outros apps com chamadas aia.references(preparar o padrãoapps.is_installed("ia"), mas não implementar fluxos editoriais).Estado atual (ponto de partida)
config/settings/base.py"ia"fixo emLOCAL_APPS;LLAMA_MODEL_DIRsempre definidoconfig/urls.pypath("admin/ia/", include("ia.urls"))sempre presenterequirements/base.txtgoogle-generativeaiehuggingface_hubno coreLLAMA_ENABLEDia/providers/local.pyllama-cpp-pythonia(acoplamento ainda baixo)Decisões de design
1. Ativação em runtime —
IA_ENABLEDIntroduzir
IA_ENABLED = env.bool("IA_ENABLED", default=False)emconfig/settings/base.py(ou perfillocal.pycom defaultTrueapenas em dev, se a equipa preferir).Quando
IA_ENABLEDforFalse:"ia"não entra emLOCAL_APPS/INSTALLED_APPS.DATABASE_ROUTERSnão incluiia.db_router.IADatabaseRouter.LLAMA_MODEL_DIRsó é definido se IA estiver ativa.config/urls.pynão registraadmin/ia/.ia/wagtail_hooks.pynão são carregados (descoberta automática só com app instalado).ia/tasks.pynão são autodescobertas.Quando
IA_ENABLEDforTrue:Padrão para consumo futuro por outros apps:
Preferir
apps.is_installed("ia")em vez de checar sóIA_ENABLED, para refletir o que o Django realmente carregou.2. Dependências — ficheiros
requirementsseparadosrequirements/base.txtgoogle-generativeaiehuggingface_hubrequirements/ia.txtgoogle-generativeai,huggingface_hubrequirements/ia-local.txtllama-cpp-python(opcional; pesado e dependente de SO/toolchain)requirements/local-ia.txt-r local.txt+-r ia.txtrequirements/production-ia.txt-r production.txt+-r ia.txtrequestspermanece embase.txt(já usado por packtools e Ollama).3. Perfis de instalação documentados
IA_ENABLEDfalselocal.txt/production.txttruelocal-ia.txt/production-ia.txttrue+LLAMA_ENABLED=trueia-local.txt4. Testes e CI
iapara testes que exigem app e dependências de IA.IA_ENABLED=false,pytestexcluindoia/.IA_ENABLED=true,pip install -r requirements/ia.txt,pytest ia/tests.Subtarefas
google-generativeaiehuggingface_hubderequirements/base.txt.requirements/ia.txtcom dependências de IA (Gemini + HuggingFace hub).requirements/ia-local.txtcomllama-cpp-python(documentar requisitos de compilação).requirements/local-ia.txterequirements/production-ia.txtagregando os ficheiros acima.IA_ENABLEDemconfig/settings/base.pycom defaultFalse.LOCAL_APPScondicionalmente ("ia"só seIA_ENABLED).DATABASE_ROUTERScondicionalmente (IADatabaseRoutersó seIA_ENABLED).LLAMA_MODEL_DIRapenas quandoIA_ENABLEDforTrue.path("admin/ia/", ...)emconfig/urls.pyaIA_ENABLED.ia/tasks.pyparahuggingface_hub(evitar falha se módulo importado com deps ausentes em cenários de teste).iaempytest.ini(oupyproject.tomlse existir).Makefilecom alvos opcionais (install-ia,migrate-iaou equivalente).docs/(comandospip installe variáveis de ambiente)..env.example(se existir) comIA_ENABLED,LLAMA_ENABLEDe notas sobre requirements.setup.cfg/ cobertura para refletir queiaé opcional no perfil core (sem obrigar cobertura deiano job core).Critérios de aceite
IA_ENABLED=falseepip install -r requirements/local.txt,python manage.py checkpassa sem erros e semiaemINSTALLED_APPS.IA_ENABLED=false,/admin/não exibe grupo ou entradas deIA Models.IA_ENABLED=false,python manage.py migratenão aplica migrações do appia.IA_ENABLED=true,pip install -r requirements/local-ia.txte migrações, o admin Wagtail de IA funciona como hoje (Gemini, Ollama, HuggingFace).google-generativeaiehuggingface_hubnão estão emrequirements/base.txt.llama-cpp-pythonnão está emrequirements/ia.txt(permanece em ficheiro à parte).LLAMA_ENABLED=falsecom IA ativa continua a impedir uso do provider local sem desativar Gemini/Ollama.Como testar manualmente
Perfil core (sem IA)
pip install -r requirements/local.txtIA_ENABLED=false(ou ausente) no ambiente.python manage.py checkpython manage.py migrate/admin/e confirmar ausência deIA Models.python -c "import google.generativeai"falha (deps não instaladas).Perfil ia
pip install -r requirements/local-ia.txtIA_ENABLED=true python manage.py migrateIA_ENABLED=true python manage.py check/admin/e configurar um provider (ex.: Ollama emhttp://localhost:11434).from ia.service import LLMService— import sem erro.pip install -r requirements/ia-local.txt, ativar modelo HuggingFace e validar provider local comLLAMA_ENABLED=true.Regressão
docs/pr/2026-07-02-adicionar-app-ia.md(download HF, fetch Ollama, pytestia/tests).Referências