> ## 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.

# Réponses automatiques

> Comprendre le fonctionnement du job AutoReply : déclenchement, workflow complet, moteurs de génération, fenêtre de contrôle opérateur et paramètres.

**AutoReply** est le système de réponse automatique de Fanify. C'est le cœur du chatbot : un [job](/fr/advanced/jobs/job) qui s'exécute en arrière-plan sur une conversation, analyse les derniers messages de l'utilisateur, puis génère et envoie une réponse au nom du créateur.

Chaque exécution suit un processus rigoureux : attente du bon moment, application de votre stratégie, génération par des [agents IA](/fr/advanced/agents/agent), fenêtre de contrôle opérateur, puis envoi humanisé.

## Déclenchement

Un job AutoReply démarre dans trois situations :

| Déclencheur          | Description                                                                                                                                                       |
| -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Nouveau message**  | Un utilisateur envoie un message. C'est le cas le plus courant.                                                                                                   |
| **Relance**          | Le système de relance (follow-up) planifie une reprise de contact. L'instruction de relance est injectée dans la génération.                                      |
| **Demande manuelle** | Un opérateur demande explicitement une réponse automatique depuis le chat, avec la possibilité de **forcer une intention** (texte, photo, contenu payant, vocal). |

<Note>
  Une seule réponse automatique peut être en cours par conversation. Si un job AutoReply tourne déjà pour cet utilisateur, aucun nouveau job n'est créé.
</Note>

Le démarrage est soumis à des conditions, vérifiées à la création du job puis revérifiées à son exécution :

* Les services IA et AutoReply sont activés **globalement** : **Admin** > **Chatting Auto** > **Chatting**, interrupteurs `IA Enabled` et `AutoReply Enabled`. Sinon le job s'annule.
* Ils sont activés **individuellement** pour l'utilisateur : page de l'utilisateur > **Settings**, propriétés `Enable AI` et `Enable AutoReply`.
* La conversation n'est pas **suspendue par l'IA** : une [fin ou pause de conversation](#fin-et-pause-de-conversation) bloque tout nouveau job jusqu'à la date de reprise prévue.

## Workflow

Voici le cycle de vie complet d'une réponse automatique :

```mermaid theme={null}
flowchart TD
    A[Nouveau message / Relance / Demande manuelle] --> B[Vérifications initiales]
    B --> C{Le moment est-il opportun ?}
    C -- "L'utilisateur écrit,<br/>interaction trop récente..." --> C2[Attente intelligente]
    C2 --> C
    C -- Oui --> D[Vérification des accomplissements]
    D --> E[Évaluation de la stratégie<br/>+ exécution des actions]
    E --> F[Génération de la réponse<br/>par le moteur choisi]
    F --> G[Messages candidats]
    G --> H[Fenêtre de contrôle opérateur<br/>+ accusé de lecture]
    H --> I[Envoi humanisé<br/>indicateur d'écriture, délais simulés]
    I --> J[Job terminé]
```

<Steps>
  <Step title="Vérifications initiales">
    Le job vérifie que tout est en ordre : utilisateur trouvé, services activés, conversation accessible. Il charge ensuite les [paramètres AutoReply](#paramètres) (globaux ou surchargés pour cet utilisateur) et récupère les derniers messages de la conversation (`BatchMessageCount`, 50 par défaut).
  </Step>

  <Step title="Attente intelligente">
    Le job patiente (statut [`Awaiting`](/fr/advanced/jobs/job#cycle-de-vie)) tant que le moment n'est pas opportun pour répondre :

    * L'utilisateur est **en train d'écrire**.
    * Sa **dernière interaction est trop récente** (paramètre `RecentInteractionDelay`, 20 s par défaut).
    * Des médias reçus n'ont **pas encore de description** (transcription/analyse en cours, voir `AllowMissingAlt`).
    * Un job d'**enrichissement du profil utilisateur** est en cours : ses conclusions (mémoires, scores) doivent être disponibles avant de répondre.

    Ces conditions sont revérifiées toutes les `RetryDelay` secondes. Cette phase évite de couper la parole à l'utilisateur et garantit que l'IA dispose du contexte complet. Elle peut être contournée ponctuellement via **Skip waiting** depuis le [badge du job](#suivi-et-contrôle-en-temps-réel).
  </Step>

  <Step title="Vérification des accomplissements">
    L'[Agent d'accomplissements](/fr/advanced/agents/check-achievements-agent) détecte si l'utilisateur a débloqué de nouveaux **accomplissements** définis dans sa stratégie (ex. « On connaît son prénom »). Les accomplissements détectés sont enregistrés **immédiatement** : une règle qui en dépend matchera dès l'étape suivante, dans la même réponse.
  </Step>

  <Step title="Évaluation de la stratégie">
    Les règles actives de la stratégie assignée à l'utilisateur sont évaluées **par ordre de priorité**. Chaque règle qui matche :

    * **Injecte ses instructions** dans le contexte de génération (contexte, objectifs, règles de conduite).
    * **Exécute ses actions** dans l'ordre : envoi direct de message, modification de variables, changement de stratégie, arrêt ou redémarrage du job, modification de l'intention, etc.

    Points de comportement à connaître :

    * Certaines actions déclenchent une **ré-évaluation** des règles (jusqu'à 10 passes maximum) : une action peut modifier l'état de l'utilisateur, puis les règles sont relues avec ce nouvel état. Une règle déjà exécutée n'est jamais ré-exécutée dans le même job. Les injections retenues sont celles de la **dernière passe**.
    * Les messages envoyés directement par des actions sont **intégrés au contexte** : les agents de génération les voient comme déjà envoyés.
    * Une action peut **interrompre le job** ici (ex. arrêt pour réserver la conversation à un opérateur) : aucune réponse IA n'est alors générée.
  </Step>

  <Step title="Génération de la réponse">
    Le **moteur de génération** sélectionné (voir [section suivante](#les-moteurs-de-génération-frameworks)) produit un ou plusieurs **messages candidats** : textes, photos, vocaux ou liens de paiement. À ce stade, rien n'est encore envoyé à l'utilisateur. Le nombre de bulles est plafonné par `MaxMessagesPerReply`.

    Le moteur peut aussi décider de **ne pas répondre** : voir [Fin et pause de conversation](#fin-et-pause-de-conversation).
  </Step>

  <Step title="Fenêtre de contrôle opérateur">
    Un **accusé de lecture** est envoyé sur le canal de communication (l'utilisateur voit que ses messages ont été lus). Le job attend ensuite la durée configurée (`AutoSendDelay`, 5 s par défaut) avant l'envoi automatique.

    Cette fenêtre laisse le temps à un opérateur de **superviser** : annuler le job depuis son [badge](#suivi-et-contrôle-en-temps-réel) pour reprendre la main, ou utiliser **Skip waiting** pour envoyer immédiatement.
  </Step>

  <Step title="Envoi humanisé">
    Les messages candidats sont envoyés **séquentiellement**, en simulant un comportement humain :

    * **Indicateur d'activité** visible par l'utilisateur, renouvelé en continu : « écrit... » pour un texte, « enregistre un audio... » pour un vocal.
    * **Délai d'écriture simulé** avant chaque message, calculé selon la longueur du contenu et la vitesse de frappe configurée dans la persona du créateur. Pour un vocal, le délai correspond à la **durée réelle de l'audio**.
    * En cas d'indisponibilité temporaire du canal (limitation Telegram dite *flood wait*), le job patiente le délai exigé (avec une marge aléatoire) et réessaie, jusqu'à **5 tentatives par message**. Un message n'est enregistré qu'après envoi réussi : les retries ne produisent **jamais de doublon**.
  </Step>
</Steps>

## Les moteurs de génération (frameworks)

La phase de génération est assurée par un **moteur** interchangeable, aussi appelé **framework**. Un moteur est un assemblage d'[agents IA](https://fr.wikipedia.org/wiki/Agent_intelligent) spécialisés qui collaborent pour produire la réponse. Deux moteurs existent :

| Moteur | Approche                                                                              | Statut         |
| ------ | ------------------------------------------------------------------------------------- | -------------- |
| **V1** | Chaîne d'agents spécialisés, routée par une classification d'intention préalable      | Historique     |
| **V2** | Agent central unique (**ReplyAgent**) équipé d'outils, qui décide lui-même quoi faire | **Par défaut** |

Le moteur se sélectionne via le paramètre `Framework` des paramètres AutoReply, globalement ou par utilisateur.

### Moteur V1

Le moteur V1 commence par **classifier l'intention** du message utilisateur via le [Classificateur d'intention](/fr/advanced/agents/extract-intent-agent) : réponse texte, demande de photo, contenu payant ou vocal. Chaque intention emprunte ensuite un chemin dédié d'agents spécialisés :

```mermaid theme={null}
flowchart TD
    A[Classification de l'intention] -- "Texte" --> C[ThinkingAgent<br/>réflexion et directive]
    C --> V1[ValidationAgent<br/>vérification de la réflexion]
    V1 -- "Correction demandée" --> C
    V1 -- "Directive validée" --> D[RedactionAgent<br/>rédaction des messages]
    A -- "Photo" --> E[Recherche du média adéquat<br/>+ mémoire RAG]
    E --> D
    A -- "Contenu payant" --> F[Sélection du prochain PPV<br/>+ création du paiement]
    F --> D
    A -- "Vocal" --> C2[ThinkingAgent] --> G[Rédacteur vocal<br/>+ synthèse vocale]
    D --> H[Validateur de rédaction<br/>contrôle qualité]
    H -- "Correction demandée" --> D
    H -- "Validé" --> I[Messages candidats]
    G --> I
```

Chaque agent a une mission unique, détaillée sur sa page dédiée :

* Le [ThinkingAgent](/fr/advanced/agents/thinking-agent) réfléchit à la stratégie de réponse et produit une **directive de rédaction**. Sa réflexion est systématiquement vérifiée par le [ValidationAgent](/fr/advanced/agents/validation-agent) (Chain-of-Verification, jusqu'à 3 allers-retours).
* Le [RedactionAgent](/fr/advanced/agents/redaction-agent) transforme la directive en messages naturels, relus par le [Validateur de rédaction](/fr/advanced/agents/redaction-validation-agent) (jusqu'à 3 corrections).
* Pour le vocal, le [Rédacteur vocal](/fr/advanced/agents/vocal-redaction-agent) remplace le RedactionAgent et produit des phrases oralisées, ensuite synthétisées.
* Un [ContextAgent](/fr/advanced/agents/context-agent) de pré-analyse existe en amont du ThinkingAgent, mais il est actuellement désactivé.

<Warning>
  Ce découpage produit des réponses contrôlées mais **multiplie les appels IA** : temps de réponse plus long et coût plus élevé. C'est la raison d'être du moteur V2.
</Warning>

### Moteur V2

Le moteur V2 remplace la chaîne par un **agent central unique**, le [ReplyAgent](/fr/advanced/agents/reply-agent). Plus de classification d'intention préalable : l'agent analyse lui-même la conversation et choisit ses actions grâce à une **palette d'outils**.

```mermaid theme={null}
flowchart TD
    A[Vérification des accomplissements] --> B[Actions de stratégie]
    B --> C[ReplyAgent]
    C -- "Utilise ses outils" --> T["Envoyer un texte / vocal / photo<br/>Chercher un média / dans la mémoire<br/>Créer un lien de paiement<br/>Noter un plan stratégique<br/>Clore ou mettre en pause la conversation"]
    T --> C
    C -- "Réponse terminée" --> D[Validateur de rédaction<br/>contrôle qualité]
    D -- "Correction demandée" --> C
    D -- "Validé" --> E[Messages candidats<br/>tous types confondus]
```

Les avantages de cette approche :

* **Plus rapide et plus économique** : moins d'appels IA successifs, pas d'étape de vérification de réflexion (compensée par un modèle plus performant), outils de recherche parallélisables.
* **Plus cohérent** : un seul « cerveau » décide du texte, des médias et des paiements dans une même réponse.
* **Plus flexible** : l'agent peut combiner librement les types de messages (un texte + une photo + un vocal dans la même réponse).

Les outils, leurs garde-fous (plafond d'itérations, anti-boucle, limite de médias gratuits, continuité d'album) et la configuration complète sont détaillés sur la page [ReplyAgent](/fr/advanced/agents/reply-agent).

<Tip>
  La stratégie peut restreindre dynamiquement les outils du ReplyAgent. Par exemple, une action forçant l'intention « texte » désactive l'envoi de liens de paiement pour cette réponse : l'outil n'est alors plus disponible pour l'agent (voir le paramètre `HardRemoveDisabledTools`).
</Tip>

## Relances

Les [relances](/fr/advanced/chatting/follow-up) (follow-ups) déclenchent un job AutoReply particulier : l'**instruction de relance** remplace ou complète la réflexion. Le comportement dépend de l'option **Thinking** de la relance :

| Option                                 | Moteur V1                                                                                                 | Moteur V2                                                                                           |
| -------------------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- |
| **Avec réflexion** (`Thinking` activé) | Workflow complet, l'instruction est injectée dans le [ThinkingAgent](/fr/advanced/agents/thinking-agent). | Workflow complet, l'instruction est injectée dans le [ReplyAgent](/fr/advanced/agents/reply-agent). |
| **Sans réflexion**                     | L'instruction est transmise telle quelle au [RedactionAgent](/fr/advanced/agents/redaction-agent).        | Identique au V1 : rédaction directe, le ReplyAgent est court-circuité.                              |

Les relances forcent l'intention *texte* et ignorent le paramètre `SkipIfLastMessageFromAI` (le dernier message est par définition celui du créateur). Les [jetons](/fr/advanced/strategy/tokens) de l'instruction (`{{USER_*}}`, `{{CREATORPERSONA_*}}`...) sont résolus avant injection.

## Fin et pause de conversation

Les agents de réflexion ([ThinkingAgent](/fr/advanced/agents/thinking-agent) en V1, [ReplyAgent](/fr/advanced/agents/reply-agent) en V2) partagent deux outils de pilotage, `leave_on_read` et `conversation_pause`, qui leur permettent de décider qu'il ne faut **pas** répondre :

* **Laisser sur « vu »** (`leave_on_read`) : l'échange est arrivé à son terme naturel (objectif atteint, utilisateur hostile, impasse). Le fan est laissé sur « vu », les réponses automatiques sont suspendues, puis une **relance est automatiquement planifiée** à l'heure de contact optimale de l'utilisateur pour reprendre contact naturellement.
* **Pause de conversation** : suspension temporaire jusqu'à une **date de reprise** choisie par l'agent (ex. l'utilisateur part travailler), avec une relance planifiée à cette échéance.

Dans les deux cas, un **message système** documente la décision dans la conversation et le job se termine en succès, sans envoi. Le détail du mécanisme (heure optimale, type de relance planifiée) est décrit sur la page [ThinkingAgent](/fr/advanced/agents/thinking-agent#décisions-de-fin-et-de-pause).

## Suivi et contrôle en temps réel

Chaque exécution est entièrement traçable et pilotable depuis le chat :

* Un **badge de job** apparaît dans la conversation et affiche l'étape en cours en temps réel. Son bouton « **...** » donne accès aux actions de contrôle : **Afficher** (page de détail), **Skip waiting** (contourner une attente en cours), mettre en pause ou annuler le job — voir [Cycle de vie d'un job](/fr/advanced/jobs/job#cycle-de-vie) et [Interface](/fr/advanced/jobs/job#interface).
* Un **message de trace** (visible uniquement des opérateurs) détaille le raisonnement complet : [agents](/fr/advanced/agents/agent) exécutés avec leurs échanges, règles de stratégie déclenchées, actions effectuées, verdicts de validation, plan stratégique retenu pour le prochain tour. Il se met à jour en direct pendant l'exécution.
* La page de détail du job (liste **Admin** > **Jobs** ou badge > **Afficher**) expose la [progression par étapes](/fr/advanced/jobs/job#progression) et tous les **appels IA** effectués, avec leurs durées, tokens et coûts.

<Note>
  **Skip waiting** ne contourne que l'attente **en cours**. Si le job enchaîne sur une nouvelle attente (ex. l'utilisateur se remet à écrire), le contournement doit être renouvelé.
</Note>

## Paramètres

Les paramètres AutoReply se configurent à deux niveaux :

1. **Global** : **Admin** > **Chatting Auto** > **Chatting** > carte **Paramètres AutoReply**. S'applique à tous les utilisateurs.
2. **Par utilisateur** : page de l'utilisateur > **Settings** > carte **AutoReply Settings**. Surcharge la configuration globale pour cet utilisateur uniquement (bouton **Clear override** pour revenir au global).

| Paramètre                 | Défaut    | Description et conséquences                                                                                                                                                                                               |
| ------------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Framework`               | V2        | Moteur de génération : **V1** (chaîne d'agents) ou **V2** (ReplyAgent). Permet de revenir au comportement historique par utilisateur ou globalement.                                                                      |
| `RecentInteractionDelay`  | 20 s      | Durée minimale depuis la dernière interaction de l'utilisateur avant de générer. Trop court : l'IA coupe la parole à un utilisateur qui enchaîne les messages. Trop long : réponses tardives.                             |
| `RetryDelay`              | 10 s      | Intervalle entre deux vérifications pendant les phases d'attente. Influe sur la réactivité du job, pas sur son comportement.                                                                                              |
| `AutoSendDelay`           | 5 s       | Durée de la fenêtre de contrôle opérateur avant envoi automatique. Mettre une valeur haute si vos opérateurs veulent systématiquement relire avant envoi.                                                                 |
| `BatchMessageCount`       | 50        | Nombre de messages récents chargés pour le job. Les agents y puisent ensuite leurs propres fenêtres (typiquement les 15 derniers).                                                                                        |
| `MaxMessagesPerReply`     | 3         | Plafond de **bulles texte** générées par réponse. Les phrases vocales sont plafonnées séparément par `MaxVocalsPerReply` du [Rédacteur vocal](/fr/advanced/agents/vocal-redaction-agent).                                 |
| `SkipIfLastMessageFromAI` | Désactivé | Annule le job si le dernier message de la conversation vient déjà de l'IA. Évite que l'IA monologue ; sans effet sur les [relances](#relances).                                                                           |
| `AllowMissingAlt`         | Activé    | Autorise la génération même si des médias reçus n'ont pas encore de description. Si activé, l'IA peut **inventer** le contenu d'un média qu'elle n'a pas « vu ». Si désactivé, le job [attend](#workflow) la description. |
| `MinIntentScore`          | 20        | **Moteur V1 uniquement.** Score de confiance minimal du [Classificateur d'intention](/fr/advanced/agents/extract-intent-agent), sous lequel le job échoue (`AR-141`) plutôt que de répondre à contresens.                 |

Les paramètres propres à chaque agent (modèles IA, itérations, validation...) se règlent séparément : voir [Agent](/fr/advanced/agents/agent#configuration-individuelle).

## Cas particuliers et diagnostic

<AccordionGroup>
  <Accordion title="Aucun job ne démarre quand un utilisateur écrit">
    Vérifiez dans l'ordre :

    1. `AutoReply Enabled` et `IA Enabled` globaux (**Admin** > **Chatting Auto** > **Chatting**).
    2. `Enable AutoReply` et `Enable AI` sur la fiche de l'utilisateur.
    3. Une **fin ou pause de conversation** est peut-être active : la conversation est suspendue jusqu'à la date de reprise (visible via le dernier message système de la conversation).
    4. Un job AutoReply est peut-être **déjà en cours** pour cette conversation.
  </Accordion>

  <Accordion title="Le job reste longtemps en statut Awaiting">
    C'est le comportement nominal de l'[attente intelligente](#workflow) : utilisateur en train d'écrire, interaction trop récente, description de média manquante ou enrichissement du profil en cours. La cause exacte est affichée dans la description de l'étape du job. Utilisez **Skip waiting** pour passer outre ponctuellement. Si l'attente vient d'une description de média qui n'arrive jamais (job de description échoué), relancez-le ou activez `AllowMissingAlt`.
  </Accordion>

  <Accordion title="Le job s'annule avec « Le dernier message envoyé a déjà été généré par IA »">
    Le paramètre `SkipIfLastMessageFromAI` est activé et l'IA a déjà répondu en dernier. C'est une protection anti-monologue. Les relances ne sont pas concernées.
  </Accordion>

  <Accordion title="L'IA ne répond plus du tout depuis un moment">
    Cause la plus fréquente : **crédits du fournisseur IA épuisés** (`AR-900`, OpenRouter). Rechargez votre solde. Les jobs échoués avec cette référence activent l'indicateur d'attention.
  </Accordion>

  <Accordion title="La réponse a été générée mais jamais envoyée">
    Trois possibilités :

    * Un opérateur a **annulé** le job pendant la fenêtre de contrôle.
    * La **validation critique** a supprimé la réponse (`AR-530`, ex. l'IA admettait être une IA) : voir le code en cause dans la [trace](#suivi-et-contrôle-en-temps-réel).
    * Telegram était indisponible et l'envoi a échoué après 5 tentatives (`AR-182`).
  </Accordion>

  <Accordion title="Une conversation « terminée » a redémarré toute seule">
    C'est voulu : une **fin de conversation** planifie automatiquement une relance à l'heure de contact optimale (voir [Fin et pause de conversation](#fin-et-pause-de-conversation)). Pour stopper définitivement les réponses automatiques d'un utilisateur, désactivez `Enable AutoReply` sur sa fiche.
  </Accordion>

  <Accordion title="Le moteur V2 est sélectionné mais la trace montre les agents V1">
    Le [ReplyAgent](/fr/advanced/agents/reply-agent) est désactivé (`Enable` décoché dans sa configuration) : AutoReply **bascule automatiquement sur le moteur V1**. Réactivez l'agent pour retrouver le V2.
  </Accordion>

  <Accordion title="Les réponses sont envoyées en double ou se chevauchent">
    Normalement impossible : un seul job AutoReply par conversation, les messages envoyés par les actions de stratégie sont intégrés au contexte, et les retries d'envoi ne dupliquent jamais un message déjà parti. Si vous constatez un doublon, vérifiez qu'une relance et un message utilisateur ne se sont pas croisés, et consultez les jobs récents de l'utilisateur dans **Admin** > **Jobs**.
  </Accordion>
</AccordionGroup>

## Référence des erreurs

Quand un job AutoReply échoue ou s'annule, sa description d'étape affiche un message compréhensible suivi d'un **code de référence** au format `AR-xxx`. Communiquez ce code au support pour un diagnostic immédiat. Les plages de codes :

| Plage               | Domaine                                                                                                                                                   |
| ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `AR-1xx`            | Initialisation et préconditions (utilisateur introuvable, conversation vide, paramètres globaux manquants...)                                             |
| `AR-14x`            | Classification de l'intention (moteur V1) : pas de réponse (`AR-140`), score trop bas (`AR-141`), intention inconnue (`AR-142`)                           |
| `AR-16x` / `AR-18x` | Envoi : compte Telegram non lié (`AR-180`), aucune réponse préparée (`AR-181`), indisponibilité Telegram persistante (`AR-182`), échec d'envoi (`AR-183`) |
| `AR-5xx`            | Moteur V2 : validation critique (`AR-530`), plafond d'itérations (`AR-550`), anti-boucle (`AR-551`), arrêt sans réponse (`AR-552`)                        |
| `AR-6xx`            | Moteur V1 : échec de génération texte (`AR-600`), photo (`AR-610`), contenu payant (`AR-620`), vocal (`AR-630`)                                           |
| `AR-900`            | Crédits du fournisseur IA épuisés (OpenRouter) — rechargez votre solde                                                                                    |

Les échecs nécessitant une intervention humaine activent l'**indicateur d'attention** du job, qui notifie les opérateurs abonnés à la notification `NeedAttention` (voir [Cycle de vie d'un job](/fr/advanced/jobs/job#cycle-de-vie)).

## Voir aussi

* [Job](/fr/advanced/jobs/job) — Concepts généraux des jobs : cycle de vie, statuts, progression, interface.
* [Agent](/fr/advanced/agents/agent) — Le fonctionnement des agents IA, leurs modèles et leur configuration.
* [ReplyAgent](/fr/advanced/agents/reply-agent) — L'agent central du moteur V2 en détail.
