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

# Créer des pull requests après chaque appel

export const UseCaseHero = ({title, description, prompt, category, features, devinUrl, agent, intent, playbookId, type}) => {
  const encodedPrompt = encodeURIComponent(prompt || '');
  const tag = 'docs-use-case-gallery';
  const utm = 'utm_source=docs&utm_medium=use-case-gallery&utm_campaign=hero-cta';
  const agentParams = (agent ? '&agent=' + agent : '') + (intent ? '&intent=' + intent : '') + (playbookId ? '&playbookId=' + playbookId : '');
  const devinHref = type === 'schedule' ? 'https://app.devin.ai/settings/schedules/create?' + utm + agentParams + (prompt ? '&prompt=' + encodedPrompt : '') : type === 'review' ? 'https://app.devin.ai/review?' + utm : agent === 'ada' ? 'https://app.devin.ai/search?' + utm + '&noSubmit=true' + (prompt ? '&prompt=' + encodedPrompt : '') : devinUrl ? devinUrl.includes('?') ? devinUrl + '&' + utm + agentParams : devinUrl + '?' + utm + agentParams : prompt ? 'https://app.devin.ai/?tags=' + tag + '&' + utm + agentParams + '&prompt=' + encodedPrompt : 'https://app.devin.ai/?' + utm + agentParams;
  const buttonLabel = type === 'schedule' ? 'Schedule in Devin ↗' : type === 'review' ? 'Set Up Devin Review ↗' : agent === 'advanced' ? 'Try in Devin ↗' : agent === 'dana' ? 'Try in Dana ↗' : agent === 'ada' ? 'Try in Ask Devin ↗' : 'Try in Devin ↗';
  const featureList = features ? features.split(',').map(f => f.trim()) : [];
  return <div className="uc-hero">
      <div className="uc-hero-inner">
        <div className="uc-hero-left">
          <h1 className="uc-hero-title">{title}</h1>
          <p className="uc-hero-desc">{description}</p>
          <div>
            <a href={devinHref} target="_blank" rel="noopener noreferrer" className="try-in-devin-btn">
              {buttonLabel}
            </a>
          </div>
        </div>
        <div className="uc-hero-meta">
          <div className="uc-meta-item">
            <span className="uc-meta-label">Author</span>
            <span className="uc-meta-value">Cognition</span>
          </div>
          <div className="uc-meta-item">
            <span className="uc-meta-label">Category</span>
            <span className="uc-meta-value">{category}</span>
          </div>
          {featureList.length > 0 && <div className="uc-meta-item">
              <span className="uc-meta-label">Features</span>
              <span className="uc-meta-value">{featureList.join(', ')}</span>
            </div>}
        </div>
      </div>
    </div>;
};

export const PromptBlock = ({children, type, agent, intent, playbookId}) => {
  var utm = 'utm_source=docs&utm_medium=use-case-gallery&utm_campaign=prompt-block';
  var tag = 'docs-use-case-gallery';
  var agentParams = (agent ? '&agent=' + agent : '') + (intent ? '&intent=' + intent : '') + (playbookId ? '&playbookId=' + playbookId : '');
  var label = type === 'schedule' ? 'Schedule in Devin' : type === 'playbook' ? 'Create Playbook' : type === 'knowledge' ? 'Add to Knowledge' : agent === 'advanced' ? 'Try in Devin' : agent === 'dana' ? 'Try in Dana' : agent === 'ada' ? 'Try in Ask Devin' : 'Try in Devin';
  var buildUrl = function (text) {
    var encoded = encodeURIComponent(text);
    if (type === 'schedule') return 'https://app.devin.ai/settings/schedules/create?' + utm + agentParams + '&prompt=' + encoded;
    if (type === 'playbook') return 'https://app.devin.ai/settings/playbooks/create?' + utm + '&body=' + encoded;
    if (type === 'knowledge') return 'https://app.devin.ai/knowledge?' + utm + '&body=' + encoded;
    if (agent === 'ada') return 'https://app.devin.ai/search?' + utm + '&noSubmit=true&prompt=' + encoded;
    return 'https://app.devin.ai/?tags=' + tag + '&' + utm + agentParams + '&prompt=' + encoded;
  };
  const ref = React.useRef(null);
  const [href, setHref] = React.useState('#');
  React.useEffect(() => {
    if (!ref.current) return;
    var codeEl = ref.current.querySelector('pre code');
    if (codeEl) {
      var text = codeEl.textContent.trim();
      if (text) setHref(buildUrl(text));
    }
    var header = ref.current.querySelector('[data-component-part="code-block-header"]');
    if (header && !header.querySelector('.prompt-block-devin-link')) {
      var link = document.createElement('a');
      link.href = href;
      link.target = '_blank';
      link.rel = 'noopener noreferrer';
      link.className = 'prompt-block-devin-link';
      link.style.cssText = 'display:inline-flex;align-items:center;gap:6px;text-decoration:none;color:#fff;font-size:11px;font-weight:500;padding:4px 10px;border-radius:6px;white-space:nowrap;background:#317CFF;transition:background 0.2s;margin-left:8px;';
      link.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg> ' + label;
      link.onmouseenter = function () {
        link.style.background = '#2968D9';
      };
      link.onmouseleave = function () {
        link.style.background = '#317CFF';
      };
      header.appendChild(link);
    }
    var existingLink = ref.current.querySelector('.prompt-block-devin-link');
    if (existingLink && href !== '#') existingLink.href = href;
  });
  return <div className="prompt-block" ref={ref}>{children}</div>;
};

<UseCaseHero title="Créer des PR après chaque appel" description="Une planification horaire de Devin interroge périodiquement Granola pour repérer de nouvelles réunions, extrait les tâches d’ingénierie des transcriptions et lance des sessions enfant pour rédiger des PR." prompt="Configurez une planification horaire de Devin qui interroge périodiquement Granola pour repérer de nouvelles réunions via le serveur MCP Granola. Pour chaque réunion dont la transcription est prête, extrayez les tâches d’ingénierie et lancez des sessions enfant de Devin pour ouvrir des demandes de fusion (PR). Utilisez une note de Knowledge pour consigner les réunions déjà traitées." category="Automatisations" features="Planifications, MCP, Playbooks, Avancé" type="schedule" agent="devin" />

<div className="uc-detail-wrapper">
  <Tip>Vous préférez ne pas effectuer cette configuration manuellement ? Collez un lien vers cette page dans une session Devin et demandez-lui de tout configurer pour vous.</Tip>

  Granola enregistre vos réunions et les transforme en notes, résumés et transcriptions. Une fois le Granola MCP connecté, Devin peut exploiter ces comptes rendus de réunion comme le ferait un coéquipier : lire ce qui a été discuté, identifier les actions concrètes à mener côté ingénierie et démarrer le travail.

  Exécutez ceci selon une planification horaire pour que les tâches démarrent dès que vous raccrochez. L'ensemble du cycle s'exécute dans votre instance Devin, en s'appuyant sur une planification, le Granola MCP, Knowledge et des sessions enfants.

  ```
  Session planifiée Devin (toutes les heures)
    → Lister les réunions Granola récentes via MCP
    → Pour chaque nouvelle réunion (de la plus ancienne à la plus récente) :
        → Récupérer les métadonnées, notes, résumé IA et transcription
        → Identifier les tâches d'ingénierie issues de la discussion
        → Démarrer des sessions enfants Devin pour les tâches concrètes
        → Consigner la réunion traitée dans Knowledge
  ```

  <Steps>
    <Step title="Connecter le MCP de Granola">
      Devin a besoin d’accéder à vos réunions Granola pour lire les transcriptions et les notes.

      1. Accédez à **Settings > Connections > serveurs MCP** et recherchez **Granola**
      2. Cliquez sur **Enable** et authentifiez-vous — cela donne à Devin un accès en lecture à vos réunions, transcriptions et notes
      3. Cliquez sur **Test listing tools** pour vérifier que la connexion fonctionne

      Une fois la connexion établie, Devin peut appeler `list_meetings`, `get_meetings` et `get_meeting_transcript` pour récupérer les données des réunions au cours d’une session. Pour en savoir plus, consultez la page sur la [configuration des serveurs MCP](/fr/work-with-devin/mcp).
    </Step>

    <Step title="Créer une note de Knowledge « processed-meetings »">
      Devin utilise une seule note [Knowledge](/fr/product-guides/knowledge) pour consigner les réunions déjà traitées. Cela évite les traitements en double lors des exécutions horaires.

      Accédez à **Settings > Knowledge** et créez une nouvelle note :

      * **Nom** : `Granola Post-call Processor Meeting Log`
      * **Déclencheur** : `Lors de l’exécution de la session planifiée du processeur post-appel Granola, utilisez cette note pour suivre les réunions déjà traitées.`
      * **Corps** :

      ```json Granola Post-call Processor Meeting Log theme={null}
      {
        "last_processed_meeting_id": null,
        "last_processed_meeting_time": null,
        "last_processed_title": null,
        "updated_at": null
      }
      ```

      La session planifiée consigne dans cette note chaque réunion traitée avec succès, pour que la prochaine exécution reprenne là où la précédente s’est arrêtée.
    </Step>

    <Step title="Rédiger le playbook de l’opérateur post-appel">
      Créez un [playbook](/fr/product-guides/creating-playbooks) qui indique à Devin comment traiter chaque réunion. Accédez à [**Settings > Playbooks**](https://app.devin.ai/settings/playbooks/create?utm_source=docs\&utm_medium=use-case-gallery) et créez un nouveau playbook :

      <PromptBlock type="playbook">
        ```txt Post-call Operator theme={null}
        Transformez une réunion Granola terminée en travail d’ingénierie concret.
        Lisez la transcription, identifiez chaque tâche de développement exploitable et lancez
        des sessions enfants Devin pour rédiger des PR. Privilégiez résolument l’action —
        si quelque chose peut devenir une PR, lancez-la.

        Pour chaque réunion :
        1. Lisez la transcription, le résumé IA et toutes les notes privées
        2. Identifiez chaque tâche d’ingénierie mentionnée ou sous-entendue :
           - Correctifs de bugs évoqués
           - Demandes de fonctionnalités avec assez de détails pour être spécifiées
           - Refactorisations ou améliorations validées
           - Tâches de recherche/investigation
           - Mises à jour de la documentation
           - Modifications d’infrastructure ou DevOps
        3. Pour chaque tâche, rédigez une spécification concrète :
           - Dans quel(s) dépôt(s) travailler
           - Ce que la modification doit accomplir
           - Critères d’acceptation
           - Contexte clé issu de la réunion (citez avec parcimonie)
        4. Démarrez une session enfant Devin pour chaque tâche suffisamment concrète pour
           aboutir à une PR. Incluez la spécification complète comme prompt.
        5. Pour les tâches trop vagues pour donner lieu à une PR, listez-les comme actions recommandées
           en précisant le contexte manquant.
        6. Renvoyez un résumé structuré des sessions démarrées et des
           recommandations.

        Ne démarrez pas de sessions pour des idées vagues. Si une tâche nécessite
        des clarifications, listez-la plutôt comme recommandation.
        ```
      </PromptBlock>

      Notez l’ID du playbook après l’enregistrement — vous vous y référerez dans le prompt de planification.
    </Step>

    <Step title="Créer une planification horaire">
      Accédez à [**Settings > Schedules**](/fr/product-guides/scheduled-sessions) et cliquez sur **Créer une planification**.

      * **Nom** : `Granola post-call processor`
      * **Fréquence** : Toutes les heures (`0 * * * *`)
      * **Agent** : Devin — cela permet à Devin de lancer des sessions enfant pour chaque tâche, afin que les correctifs s’exécutent en parallèle
      * **Canal Slack** (facultatif) : Sélectionnez un canal pour que votre équipe soit informée lorsque les réunions sont traitées et que des PR sont ouvertes
      * **Prompt** :

      <PromptBlock type="schedule" agent="devin">
        ```txt Granola post-call processor theme={null}
        Exécutez le processeur post-appel de Granola.

        Utilisez le serveur MCP Granola et la note de Knowledge intitulée
        "Granola Post-call Processor Meeting Log".

        1. Consultez le journal des réunions pour trouver l’ID/l’heure de la dernière réunion traitée.
        2. Listez les réunions Granola des dernières 24 heures.
        3. Sélectionnez les réunions plus récentes que la dernière réunion du journal. Triez-les de la plus ancienne à la plus récente.
        4. Pour chaque réunion :
           a. Récupérez les métadonnées, les notes privées et le résumé IA via MCP
           b. Récupérez la transcription complète via MCP
           c. Si la transcription n’est pas disponible, ARRÊTEZ le traitement du lot
              ici — ne passez pas à la suite. La prochaine exécution réessaiera.
           d. Exécutez le playbook Post-call Operator pour cette réunion
           e. Démarrez des sessions enfant Devin pour les tâches d’ingénierie concrètes
           f. Consignez cette réunion traitée dans la note de Knowledge
        5. Publiez un résumé sur Slack : réunions traitées, sessions démarrées,
           et réunions ignorées en raison de transcriptions manquantes.

        S’il n’y a aucune nouvelle réunion depuis la dernière réunion du journal, quittez discrètement.
        ```
      </PromptBlock>

      Définissez **bypass approval** sur `true` si vous souhaitez un fonctionnement entièrement autonome — aucune approbation manuelle n’est nécessaire pour les outils MCP, les mises à jour de Knowledge ou la création de sessions enfant.
    </Step>

    <Step title="Résultat d’une exécution typique">
      Chaque heure, Devin traite les nouvelles réunions et ouvre des pull requests (PR) ciblées. Voici un exemple de résultat de session réelle :

      ```
      1 nouvelle réunion Granola traitée depuis la dernière entrée du journal de réunions :

      Réunion : « Backend API planning » (2026-04-29 14:00)

      Sessions enfants lancées (3) :
      1. Correction de la requête N+1 dans l'endpoint /api/invoices
         Repo: acme/api-server
         PR : Chargement anticipé des lignes de facture pour corriger le timeout
         Session: https://app.devin.ai/sessions/abc123

      2. Ajout d'une limitation de débit sur les endpoints webhook
         Repo: acme/api-server
         PR : Limites de débit par clé sur /webhooks/*
         Session: https://app.devin.ai/sessions/def456

      3. Mise à jour de la documentation API pour les nouveaux endpoints Billing
         Repo: acme/docs
         PR : Ajout de la documentation de référence des endpoints Billing
         Session: https://app.devin.ai/sessions/ghi789

      Actions recommandées (1) :
      - Examiner le flux de renouvellement de l'auth token — mentionné comme « parfois
        instable », mais aucune erreur ni repo spécifique identifié. Nécessite davantage de
        contexte de la part de l'équipe.

      Journal de réunions Knowledge mis à jour : « Backend API planning » (2026-04-29).
      ```

      Chaque session enfant s’exécute de manière indépendante et ouvre sa propre pull request (PR), avec le contexte de la réunion directement intégré à la description.
    </Step>

    <Step title="Affinez et itérez">
      Après quelques jours d’exécution, faites le point sur ce qui fonctionne et ajustez si nécessaire :

      **Gérer les retards de transcription.** La planification s’arrête lorsqu’elle arrive sur une réunion dont la transcription n’est pas encore prête — cela évite de passer à côté de réunions dont le traitement a pris du retard. Si vous constatez que les transcriptions sont régulièrement lentes, augmentez l’intervalle de planification ou ajoutez un délai tampon au prompt.

      **Définir le périmètre par type de réunion.** Toutes les réunions ne débouchent pas sur du travail d’ingénierie. Ajoutez des filtres au prompt pour ignorer certains types de réunion :

      <PromptBlock agent="advanced">
        ```txt Filtrer les réunions par type theme={null}
        Mettez à jour le prompt de planification : ignorez les réunions dont le titre contient
        "1:1", "standup" ou "social". Ne traitez que les réunions qui sont
        susceptibles de contenir des discussions d’ingénierie — sessions de planification,
        triage de bugs, revues de conception et appels clients.
        ```
      </PromptBlock>

      **Tirer des enseignements des résultats.** Après quelques semaines, demandez à Devin d’analyser quelles sessions enfants ont abouti à des PR fusionnées et lesquelles ont été fermées sans fusion. Utilisez ce retour pour affiner les critères d’extraction des tâches du playbook :

      <PromptBlock agent="advanced">
        ```txt Analyser les suites des appels et mettre à jour le playbook theme={null}
        Examinez toutes les sessions enfants lancées par le processeur post-appel
        Granola au cours des 2 dernières semaines. Pour chaque session, vérifiez si
        la PR a été fusionnée ou fermée.

        Identifiez les schémas récurrents — quels types de tâches produisent systématiquement
        des PR fusionnables, lesquels sont trop vagues, et où le playbook
        a besoin de plus de contexte. Ensuite, proposez des mises à jour du playbook
        Post-call Operator à partir de ces enseignements.
        ```
      </PromptBlock>
    </Step>
  </Steps>
</div>
