> ## Documentation Index
> Fetch the complete documentation index at: https://docs.fanifyai.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Job

> Les jobs sont des concepts dans Fanify pouvant être illustré comme une tâche longue ou processus qui s'exécute en arrière plan.

# Spécificités

* Chaque job a un identifiant unique (ex: #378)
* Conçu pour fonctionner sans intervention humaine.
* Resistant à l'intérruption: Reprise du travail après redémarrage imprévu
* Enregistrés en base de données, pour la resillience ou l'analyse de données
* Asynchrone
* Execution parallèle possible
* Planification d'éxécution possible
* Logique et fonctionnement interne propre à chaque type
* Démarrable avec des paramètres spécifique au type.
* Peuvent être nativement lié à une entitée (utilisateur, etc..)

# Utilisation

Les jobs héritent tous de `JobBase` et couvrent des besoins métier variés.

| Job                       | Description                                                                                                  |
| ------------------------- | ------------------------------------------------------------------------------------------------------------ |
| `AutoReplyJob`            | Répond automatiquement à une conversation utilisateur.                                                       |
| `ExtractUserInfoJob`      | Enrichit périodiquement les données utilisateur (mémoires, scores) à partir de l'historique de conversation. |
| `GetMediaAlt`             | Génère un contenu alternatif textuel pour les médias d'un message.                                           |
| `CharacterSelfieJob`      | Génère un selfie d'un personnage via un workflow automatisé.                                                 |
| `CharacterWizardPackJob`  | Génère le pack complet du personnage lors de sa création                                                     |
| `CharacterSwapAIOJob`     | Remplace le personnage d'une vidéo par un autre.                                                             |
| `MediaReencodingJob`      | Réencode un média individuel (transcodage, redimensionnement, optimisation).                                 |
| `BatchMediaReencodingJob` | Réencodage batch manuel des médias de la galerie avec filtres et reprise.                                    |
| `MLBatchProcessingJob`    | Traitement ML batch des médias non enrichis (embeddings, détection, reconnaissance).                         |
| `SyncAiModelsJob`         | Synchronise les modèles IA.                                                                                  |
| `EnrichAiCallCostsJob`    | Enrichit les appels IA avec les coûts réels récupérés auprès des providers.                                  |
| `WipeDatabaseJob`         | Effectue la maintenance périodique de la base de données (purge, nettoyage, suppression).                    |

# Progression

Chaque job encourage l'implémentation d'étapes pour découper le travail. Chaque type de job à un nombre fixe d'étapes. Lorsque le travail évolue, l'étape actuelle est incrémentée. Ce mécanisme permet dans le cas d'une reprise de reprendre le travail là ou il a été arrêté.

De plus, ce mécanisme permet d'afficher en temps réel la progression, souvent accompagné d'un texte descriptif.

# Cycle de vie

Chaque job possède un statut défini par l'énumération `JobStatus`.

| Statut      | Description                                             |
| ----------- | ------------------------------------------------------- |
| `Offline`   | Job inactif, en attente d'exécution.                    |
| `Pending`   | Job programmé pour exécution future.                    |
| `Awaiting`  | Job en attente d'une condition ou intervention externe. |
| `Running`   | Job en cours d'exécution.                               |
| `Completed` | Job exécuté avec succès.                                |
| `Paused`    | Exécution temporairement suspendue.                     |
| `Failed`    | Job échoué lors de l'exécution.                         |
| `Cancelled` | Job annulé avant ou pendant l'exécution.                |

Lors de la création d'un Job, si celui-ci est planifié pour éxécution futur, il est enregistré en base de données et l'orchestrateur vérifiera périodiquement sa date d'execution planifiée.
Si le nouveau job n'a pas de planification, il est directement démarrer par l'orchestrateur de Job, et chargé en RAM pour éxécution. Durant toute son éxécution (statut Running ou Awaiting) il vit en mémoire vive et consomme des ressources. Dès lors que le job n'est plus actif (Terminé, Arrété ou annulé) ce dernier est dechargé de la RAM et enregistré en base de données. Certaines métadonnées soécifique au type peuvent être nettoyé avant archivage en base de données.

Au cours de son éxécution, le job peut changer lui même d'étape et de statut. Généralement, lors de ces changements, le texte descriptif de l'étape actuelle change également.

Le status Awaiting peut dans certains type de job être bypassé afin d'accélérer ou ignorer une étape. Cela est faisable dans l'interface, généralement depuis un badge de job > bouton "**...**" > **Skip waiting**.
Attention, malgré le contournement ponctuelle d'une attente, le job peut enchainner avec d'autres étapes nécéssitant eux aussi une attente. Dans ce cas le contournement devra être renouvellé si nécessaire.

Certains jobs peuvent utiliser un indicateur d'attention, quand le job nécessite une intervention humaine. Dans ce cas les opérateurs ayant activés la notification générique NeedAttention seront notifiés.

# Interface

La liste des jobs peut être affichée dans l'onglet **Admin** > **Jobs**.

L'affichage respecte les conventions de liste d'entitées et bénéficie donc de toutes ces fonctionalités, y compris l'affichage en temps réel.

La page de détail d'un job permet d'afficher toutes les informations d'un job en temps réel ainsi que certainnes métadonnées propre au type du job si pris en charge.

Cette page de détail de job peut être affiché de plusieurs façon comme:

* La liste des jobs das tous les cas
* Dans un badge de job > bouton rond "**...**" > **Afficher** depuis la page d'un **chat** pour les types de jobs pris en charge.

# Planification
