Integrar una nueva capa compartida de utilidades, modelos de dominio y servicios de IA dentro de MarkAPI, para soportar el procesamiento asistido por LLaMA/Gemini, centralizar componentes reutilizables en core, modernizar la configuración base del proyecto y adaptar el módulo reference al nuevo flujo de inferencia y procesamiento.
-
La configuración base del proyecto en config/settings/base.py debe:
- definir
LLAMA_MODEL_DIR apuntando a ROOT_DIR / "model_ai/download";
- registrar la app
model_ai en LOCAL_APPS;
- actualizar
WAGTAIL_SITE_NAME a SciELO XML Tools;
- definir
LLAMA_ENABLED = env.bool("LLAMA_ENABLED", default=True);
- conservar
MODEL_LLAMA = "llama-3.2-3b-instruct-q4_k_m.gguf";
- definir
DATA_UPLOAD_MAX_NUMBER_FIELDS = 10000.
-
El enrutamiento en config/urls.py debe:
- incluir
config.api_router en api/v1/;
- mantener
admin/autocomplete/ dentro de i18n_patterns;
- reemplazar el include específico anterior de
mix_citation por el enrutador unificado.
-
Deben eliminarse artefactos heredados de la configuración antigua de LLaMA:
compose/local/django/Dockerfile.llama;
llama.local.yml;
llama3/generic_llama.py.
-
Debe migrarse la inicialización del paquete antiguo llama3 al nuevo paquete model_ai, incluyendo el nuevo model_ai/__init__.py.
-
requirements/base.txt debe incorporar las dependencias necesarias para el nuevo flujo:
langid;
google-generativeai;
python-docx;
huggingface_hub;
llama-cpp-python.
-
Debe existir core/choices.py con constantes centralizadas de dominio:
LANGUAGE;
ROLE;
MONTHS;
LICENSE_TYPES;
GENDER_CHOICES.
-
Los textos traducibles en ROLE, MONTHS, LICENSE_TYPES y GENDER_CHOICES deben estar envueltos con gettext_lazy.
-
Debe existir core/utils/utils.py con utilidades reutilizables:
language_iso(code);
RetryableError;
NonRetryableError;
fetch_data(url, ...);
_get_user(request, username=None, user_id=None).
-
fetch_data(url, ...) debe:
- usar reintentos automáticos con backoff exponencial;
- reintentar errores de red y HTTP 5xx;
- no reintentar errores HTTP 4xx;
- registrar errores de red en logs.
-
core/models.py debe incorporar modelos y mixins compartidos reutilizables:
Gender;
Language;
TextWithLang;
TextLanguageMixin;
RichTextWithLanguage;
FlexibleDate;
License;
LicenseStatement;
FileWithLang;
LanguageFallbackManager.
-
Debe existir la migración core/migrations/0001_initial.py para los modelos concretos de core.
-
Los modelos abstractos de core no deben generar tablas propias.
-
Debe existir la app model_ai con los siguientes componentes:
apps.py;
exceptions.py;
llama.py;
messages.py;
models.py;
tasks.py;
wagtail_hooks.py;
migrations/0001_initial.py;
migrations/0002_alter_llamamodel_download_status.py.
-
model_ai/models.py debe definir el modelo LlamaModel con:
name_model;
name_file;
hf_token;
download_status;
api_url;
api_key_gemini;
- validación para permitir una sola instancia;
- widgets enmascarados para credenciales;
- integración con
CoreAdminModelForm.
-
model_ai/models.py debe definir DownloadStatus como IntegerChoices con estados:
NO_MODEL;
DOWNLOADING;
DOWNLOADED;
ERROR.
-
model_ai/tasks.py debe implementar la descarga del modelo desde Hugging Face, actualizar download_status y persistir el resultado.
-
model_ai/llama.py debe exponer un servicio de inferencia reutilizable que:
- inicialice y reutilice una instancia cacheada de LLaMA;
- valide si LLaMA está habilitado;
- valide la existencia de un modelo configurado;
- valide la existencia física del archivo del modelo;
- permita ejecución en modo
chat y prompt;
- soporte uso de Gemini cuando haya
api_key_gemini;
- reutilice mensajes y formatos desde
model_ai/messages.py.
-
model_ai/messages.py debe contener prompts y formatos de salida JSON para extracción de:
- DOI y sección;
- títulos;
- autores;
- afiliaciones;
- referencias;
- y primer bloque de metadatos.
-
model_ai/wagtail_hooks.py debe registrar la administración de LlamaModel en Wagtail y permitir disparar la descarga del modelo desde el admin.
-
reference/api/v1/views.py debe dejar de importar get_reference desde reference.tasks y usar reference.data_utils.
-
reference/api/v1/views.py y reference/models.py deben adoptar ReferenceStatus en lugar de valores enteros hardcodeados.
-
reference/config.py debe:
- serializar ejemplos de respuesta como JSON válido;
- incorporar
full_text en los ejemplos;
- ampliar tipos soportados, incluyendo
confproc;
- ajustar campos como
source, location, fpage, lpage y otros equivalentes.
-
Debe existir reference/config_gemini.py para configurar prompts y soporte de Gemini en el procesamiento de referencias.
-
Debe existir reference/data_utils.py como reemplazo de reference/tasks.py.
-
reference/marker.py debe dejar de depender de llama3.generic_llama y usar la nueva implementación en model_ai.llama.
-
reference/wagtail_hooks.py debe ajustarse al nuevo flujo de snippets y a la integración con tareas/modelos de IA.
-
Las migraciones de reference deben quedar actualizadas:
0001_initial.py;
0002_alter_elementcitation_score.py;
0003_elementcitation_marked_xml.py.
-
Los catálogos de traducción deben actualizarse en:
locale/en/LC_MESSAGES/django.po;
locale/es/LC_MESSAGES/django.po;
locale/pt_BR/LC_MESSAGES/django.po;
para incluir las nuevas cadenas introducidas por core y model_ai.
-
Todos los archivos nuevos o modificados deben finalizar con salto de línea (\n) cuando corresponda.
Descripción de funcionalidad
Integrar una nueva capa compartida de utilidades, modelos de dominio y servicios de IA dentro de MarkAPI, para soportar el procesamiento asistido por LLaMA/Gemini, centralizar componentes reutilizables en
core, modernizar la configuración base del proyecto y adaptar el móduloreferenceal nuevo flujo de inferencia y procesamiento.Criterios de aceptación
La configuración base del proyecto en
config/settings/base.pydebe:LLAMA_MODEL_DIRapuntando aROOT_DIR / "model_ai/download";model_aienLOCAL_APPS;WAGTAIL_SITE_NAMEaSciELO XML Tools;LLAMA_ENABLED = env.bool("LLAMA_ENABLED", default=True);MODEL_LLAMA = "llama-3.2-3b-instruct-q4_k_m.gguf";DATA_UPLOAD_MAX_NUMBER_FIELDS = 10000.El enrutamiento en
config/urls.pydebe:config.api_routerenapi/v1/;admin/autocomplete/dentro dei18n_patterns;mix_citationpor el enrutador unificado.Deben eliminarse artefactos heredados de la configuración antigua de LLaMA:
compose/local/django/Dockerfile.llama;llama.local.yml;llama3/generic_llama.py.Debe migrarse la inicialización del paquete antiguo
llama3al nuevo paquetemodel_ai, incluyendo el nuevomodel_ai/__init__.py.requirements/base.txtdebe incorporar las dependencias necesarias para el nuevo flujo:langid;google-generativeai;python-docx;huggingface_hub;llama-cpp-python.Debe existir
core/choices.pycon constantes centralizadas de dominio:LANGUAGE;ROLE;MONTHS;LICENSE_TYPES;GENDER_CHOICES.Los textos traducibles en
ROLE,MONTHS,LICENSE_TYPESyGENDER_CHOICESdeben estar envueltos congettext_lazy.Debe existir
core/utils/utils.pycon utilidades reutilizables:language_iso(code);RetryableError;NonRetryableError;fetch_data(url, ...);_get_user(request, username=None, user_id=None).fetch_data(url, ...)debe:core/models.pydebe incorporar modelos y mixins compartidos reutilizables:Gender;Language;TextWithLang;TextLanguageMixin;RichTextWithLanguage;FlexibleDate;License;LicenseStatement;FileWithLang;LanguageFallbackManager.Debe existir la migración
core/migrations/0001_initial.pypara los modelos concretos decore.Los modelos abstractos de
coreno deben generar tablas propias.Debe existir la app
model_aicon los siguientes componentes:apps.py;exceptions.py;llama.py;messages.py;models.py;tasks.py;wagtail_hooks.py;migrations/0001_initial.py;migrations/0002_alter_llamamodel_download_status.py.model_ai/models.pydebe definir el modeloLlamaModelcon:name_model;name_file;hf_token;download_status;api_url;api_key_gemini;CoreAdminModelForm.model_ai/models.pydebe definirDownloadStatuscomoIntegerChoicescon estados:NO_MODEL;DOWNLOADING;DOWNLOADED;ERROR.model_ai/tasks.pydebe implementar la descarga del modelo desde Hugging Face, actualizardownload_statusy persistir el resultado.model_ai/llama.pydebe exponer un servicio de inferencia reutilizable que:chatyprompt;api_key_gemini;model_ai/messages.py.model_ai/messages.pydebe contener prompts y formatos de salida JSON para extracción de:model_ai/wagtail_hooks.pydebe registrar la administración deLlamaModelen Wagtail y permitir disparar la descarga del modelo desde el admin.reference/api/v1/views.pydebe dejar de importarget_referencedesdereference.tasksy usarreference.data_utils.reference/api/v1/views.pyyreference/models.pydeben adoptarReferenceStatusen lugar de valores enteros hardcodeados.reference/config.pydebe:full_texten los ejemplos;confproc;source,location,fpage,lpagey otros equivalentes.Debe existir
reference/config_gemini.pypara configurar prompts y soporte de Gemini en el procesamiento de referencias.Debe existir
reference/data_utils.pycomo reemplazo dereference/tasks.py.reference/marker.pydebe dejar de depender dellama3.generic_llamay usar la nueva implementación enmodel_ai.llama.reference/wagtail_hooks.pydebe ajustarse al nuevo flujo de snippets y a la integración con tareas/modelos de IA.Las migraciones de
referencedeben quedar actualizadas:0001_initial.py;0002_alter_elementcitation_score.py;0003_elementcitation_marked_xml.py.Los catálogos de traducción deben actualizarse en:
locale/en/LC_MESSAGES/django.po;locale/es/LC_MESSAGES/django.po;locale/pt_BR/LC_MESSAGES/django.po;para incluir las nuevas cadenas introducidas por
coreymodel_ai.Todos los archivos nuevos o modificados deben finalizar con salto de línea (
\n) cuando corresponda.Anexos
Archivos modificados o agregados en este alcance:
Configuración e infraestructura:
config/settings/base.pyconfig/urls.pylocal.ymlrequirements/base.txtcompose/local/django/Dockerfile.llamallama.local.ymlDominio compartido:
core/choices.pycore/models.pycore/utils/utils.pycore/migrations/0001_initial.pyNueva app de IA:
model_ai/__init__.pymodel_ai/apps.pymodel_ai/exceptions.pymodel_ai/llama.pymodel_ai/messages.pymodel_ai/models.pymodel_ai/tasks.pymodel_ai/wagtail_hooks.pymodel_ai/migrations/0001_initial.pymodel_ai/migrations/0002_alter_llamamodel_download_status.pymodel_ai/migrations/__init__.pyRefactor de referencias:
reference/api/v1/views.pyreference/config.pyreference/config_gemini.pyreference/data_utils.pyreference/marker.pyreference/models.pyreference/wagtail_hooks.pyreference/migrations/0001_initial.pyreference/migrations/0002_alter_elementcitation_score.pyreference/migrations/0003_elementcitation_marked_xml.pyLimpieza de implementación anterior:
llama3/generic_llama.pyInternacionalización:
locale/en/LC_MESSAGES/django.polocale/es/LC_MESSAGES/django.polocale/pt_BR/LC_MESSAGES/django.poReferencias