Descrição da tarefa
Adicionar o app Django ia (renomeado do original ai no singular).
A aplicação de IA deve ser auto-suficiente, possuir banco de dados próprio (migrations própria), suas próprias telas no Wagtail, suas próprias APIs, e ser estruturada de forma que possa ser reutilizada em outro projeto sem dependências do restante do ecossistema do scielo-tools.
Âmbito:
| Módulo |
Responsabilidade |
ia/models.py |
Modelos de configuração dos provedores: HuggingFaceModel, OllamaModel, GeminiModel. |
ia/service.py |
Serviço de orquestração de LLM (LLMService). |
ia/providers/ |
Provedores de LLM: gemini.py, local.py (Llama via llama-cpp), ollama.py. |
ia/wagtail_hooks.py |
Telas administrativas (snippets/panels) no Wagtail para gerenciar os modelos de IA e buscar tags/informações do Ollama via AJAX. |
ia/exceptions.py |
Exceções customizadas de domínio (LlamaDisabledError, LlamaModelNotFoundError, etc.). |
ia/utils/ |
Utilitários de manipulação de prompts, blocos, JSON, visão e normalizadores (normalizers.py). |
ia/tasks.py |
Tarefas Celery associadas (ex: download de modelos do HuggingFace). |
ia/templates/ |
Templates personalizados do Wagtail admin para as telas da IA. |
ia/apps.py |
Configuração do Django App (IAConfig). |
Decisões de Design para Reusabilidade (Auto-suficiência):
- Desacoplamento do
core.models e core.forms:
- No repositório de referência, os modelos herdam de
core.models.CommonControlField e usam core.forms.CoreAdminModelForm (que gerenciam campos como creator e updated_by). Como o core/models.py no projeto atual está vazio, a aplicação ia deve implementar sua própria classe base abstrata (ex: IAMetadataModel) e seu próprio WagtailAdminModelForm (ex: IAAdminModelForm em ia/forms.py) para evitar qualquer ImportError e garantir reusabilidade de código.
- Migrations e Isolamento de Banco de Dados:
- O app gerará suas próprias migrações em
ia/migrations/.
- Adicionaremos a possibilidade de configurar o app para usar um banco de dados dedicado via roteador Django (
ia_db / IADatabaseRouter), caso o deploy final exija separação física das tabelas do Wagtail/Django core.
Pré-requisitos (blockers)
| Pré-requisito |
Consumido por |
Notas |
google-generativeai |
ia/providers/gemini.py |
SDK de integração com o Gemini da Google. |
requests |
ia/wagtail_hooks.py |
Requisições HTTP para consultar APIs do Ollama. |
django-celery-results |
ia/tasks.py |
Necessário se for utilizar o download assíncrono de modelos. |
llama-cpp-python (opcional/condicional) |
ia/providers/local.py |
Execução local de GGUF. Deve falhar graciosamente via exceção de import se não estiver instalado. |
Subtarefas
API pública a preservar / expor
Contratos consumidos externamente pelas demais aplicações (como referencia e futuramente manuscripts):
ia.service
LLMService(messages, response_format, ...): classe para instanciar a chamada ao provedor de IA configurado como ativo.
LLMService.run(user_input, response_format=None): executa o prompt/chat e retorna a resposta bruta da IA.
ia.references
mark_reference(reference_text): gerador que retorna as marcações sugeridas pela IA para um texto de citação.
mark_references(reference_block): processa em lote as linhas de referências.
ia.utils.normalizers
stz_norm(value): normalização padrão de strings para geração estável de checksums.
Critérios de aceite
Como testar manualmente
- Subir o ambiente local (
make build && make up).
- Executar as migrações com sucesso.
- Acessar o painel Wagtail do Django local (http://localhost:8009/admin/) e configurar um provedor (ex: Ollama ou Gemini).
- No console Django (
python manage.py shell), testar a geração com um prompt simples:
from ia.service import LLMService
service = LLMService(messages=[{"role": "system", "content": "You are a helpful assistant."}])
print(service.run("Hello, this is a test."))
- Confirmar que a resposta é processada sem depender de tabelas globais do core.
Descrição da tarefa
Adicionar o app Django
ia(renomeado do originalaino singular).A aplicação de IA deve ser auto-suficiente, possuir banco de dados próprio (migrations própria), suas próprias telas no Wagtail, suas próprias APIs, e ser estruturada de forma que possa ser reutilizada em outro projeto sem dependências do restante do ecossistema do
scielo-tools.Âmbito:
ia/models.pyHuggingFaceModel,OllamaModel,GeminiModel.ia/service.pyLLMService).ia/providers/gemini.py,local.py(Llama via llama-cpp),ollama.py.ia/wagtail_hooks.pyia/exceptions.pyLlamaDisabledError,LlamaModelNotFoundError, etc.).ia/utils/normalizers.py).ia/tasks.pyia/templates/ia/apps.pyIAConfig).Decisões de Design para Reusabilidade (Auto-suficiência):
core.modelsecore.forms:core.models.CommonControlFielde usamcore.forms.CoreAdminModelForm(que gerenciam campos comocreatoreupdated_by). Como ocore/models.pyno projeto atual está vazio, a aplicaçãoiadeve implementar sua própria classe base abstrata (ex:IAMetadataModel) e seu próprioWagtailAdminModelForm(ex:IAAdminModelFormemia/forms.py) para evitar qualquerImportErrore garantir reusabilidade de código.ia/migrations/.ia_db/IADatabaseRouter), caso o deploy final exija separação física das tabelas do Wagtail/Django core.Pré-requisitos (blockers)
google-generativeaiia/providers/gemini.pyrequestsia/wagtail_hooks.pydjango-celery-resultsia/tasks.pyllama-cpp-python(opcional/condicional)ia/providers/local.pySubtarefas
ia/na raiz do projetoaiparaia(ex: imports, namespaces, nome da app).ia/forms.pycontendo oIAAdminModelForm(migrado doCoreAdminModelFormdo initial) para registrar quem criou/alterou o registro.ia/models.pypara:IAMetadataModel(com camposcreated,updated,creatoreupdated_by) em vez de herdar docore.models.CommonControlField.IAMetadataModele apontarem paraia.forms.IAAdminModelFormno atributobase_form_class.ia/db_router.pycontendo oIADatabaseRouterpara direcionar opcionalmente leituras, escritas e migrações do appiapara um banco de dados específicoia_db."ia"na listaLOCAL_APPSemconfig/settings/base.py.requirements/base.txt:google-generativeairequestsollama_tagseollama_model_info) no arquivoconfig/urls.pyde forma desacoplada ou através doia/urls.py.API pública a preservar / expor
Contratos consumidos externamente pelas demais aplicações (como
referenciae futuramentemanuscripts):ia.serviceLLMService(messages, response_format, ...): classe para instanciar a chamada ao provedor de IA configurado como ativo.LLMService.run(user_input, response_format=None): executa o prompt/chat e retorna a resposta bruta da IA.ia.referencesmark_reference(reference_text): gerador que retorna as marcações sugeridas pela IA para um texto de citação.mark_references(reference_block): processa em lote as linhas de referências.ia.utils.normalizersstz_norm(value): normalização padrão de strings para geração estável de checksums.Critérios de aceite
python manage.py checkexecuta limpo sem erros de importação ou relacionamentos.core.modelsoucore.formsa partir deia/.iasão executadas e criam as tabelas com sucesso (tabelas prefixadas comia_).iaé totalmente portável para outra instalação Django contendo apenas Wagtail configurado.Como testar manualmente
make build && make up).python manage.py shell), testar a geração com um prompt simples: