FR ▾
Obtenir une clé API

Notes de réunion LLM API : du transcript au résumé en Python

Pour obtenir des notes de réunion LLM API, vous envoyez le transcript à un endpoint de chat completions avec un prompt système court et lisez la réponse. Les éléments qui déterminent la qualité sont le prompt, une forme de sortie fixe et la gestion des longs enregistrements.

Mis à jour le

Table de réunion isométrique avec des bulles de dialogue se condensant en une carte de liste de contrôle au-dessus

Points clés

  • Un appel de chat completions transforme un transcript en notes ; le mode JSON vous donne une forme fixe.
  • Une fenêtre de 100 000 tokens contient la plupart des transcripts de réunion sans fractionnement.
  • Dites au modèle d'écrire null pour les propriétaires et dates manquants, afin qu'il ne les invente pas.
  • Une clé complète permet 8 requêtes simultanées, suffisant pour traiter une journée de réunions en parallèle.

Le pipeline en quatre étapes

  1. Enregistrez et transcrivez. Utilisez n'importe quel outil de reconnaissance vocale. Cette API ne prend que du texte et n'accepte pas l'audio.
  2. Préparez le texte. Ajoutez un en-tête avec le titre de la réunion, la date et les noms des participants. Les étiquettes de locuteur, si vous les avez, aident beaucoup.
  3. Appelez le modèle. Envoyez le transcript avec un prompt système qui définit les sections que vous souhaitez.
  4. Stockez et partagez le résultat. Enregistrez le JSON, affichez-le en Markdown ou HTML, publiez-le là où l'équipe lit.

L'endpoint est POST /v1/chat/completions sur https://api.whisperapis.com/v1, l'ID du modèle est uncensored, et n'importe quel SDK OpenAI fonctionne après avoir changé l'URL de base et la clé. Si vous devez configurer la reconnaissance vocale d'abord, les docs de démarrage rapide couvrent la partie texte et n'importe quel serveur compatible Whisper peut fournir le transcript.

Obtenez des notes structurées avec le mode JSON

Les résumés libres sont bien pour la lecture, mais un pipeline veut des champs qu'il peut stocker et filtrer. Le mode JSON, activé avec response_format défini sur {"type": "json_object"}, fait retourner au modèle un seul objet JSON. Décrivez les clés dans le prompt système, et dites le mot JSON là-bas, car c'est le prompt qui définit la forme.

import json
from openai import OpenAI

client = OpenAI(base_url="https://api.whisperapis.com/v1", api_key="YOUR_KEY")

SYSTEM = """You write meeting notes from raw transcripts.
Use only what the transcript says. If an owner or a date is not stated, write null.
Reply with a JSON object with the keys: summary (string), decisions (array of strings),
action_items (array of objects with task, owner, due), open_questions (array of strings)."""

transcript = open("standup.txt", encoding="utf-8").read()

resp = client.chat.completions.create(
    model="uncensored",
    messages=[
        {"role": "system", "content": SYSTEM},
        {"role": "user", "content": "Transcript:\n\n" + transcript},
    ],
    response_format={"type": "json_object"},
    temperature=0.2,
)

notes = json.loads(resp.choices[0].message.content)
for item in notes["action_items"]:
    print(item["owner"], "->", item["task"], item["due"])

Deux lignes de ce prompt font la majeure partie du travail. « Utilisez uniquement ce que dit la transcription » empêche le modèle d'ajouter des détails plausibles. « Si un propriétaire ou une date n'est pas indiqué, écrivez null » lui donne un moyen valide de dire qu'il ne sait pas, ce qui est mieux qu'un nom inventé. Une température faible comme 0,2 réduit la variation entre les exécutions, ce que vous souhaitez lorsque la même transcription peut être traitée deux fois.

Analysez toujours de manière défensive. Enveloppez json.loads dans un bloc try, et en cas d'échec réessayez une fois. Les requêtes échouées ne sont pas facturées, et un seul retry corrige la plupart des erreurs de formatage ponctuelles.

Diffusez le résultat à la personne qui attend

Si quelqu'un clique sur un bouton et attend les notes, affichez le texte à mesure qu'il arrive. Définissez stream sur true et l'API envoie des événements envoyés par le serveur ; l'utilisation est incluse à la fin du flux.

from openai import OpenAI

client = OpenAI(base_url="https://api.whisperapis.com/v1", api_key="YOUR_KEY")
transcript = open("standup.txt", encoding="utf-8").read()

stream = client.chat.completions.create(
    model="uncensored",
    messages=[
        {"role": "system", "content": "Write concise meeting notes in Markdown with headings: Summary, Decisions, Actions."},
        {"role": "user", "content": transcript},
    ],
    stream=True,
    temperature=0.3,
)

for chunk in stream:
    if chunk.choices and chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="", flush=True)

Le streaming a un détail opérationnel : une requête en streaming occupe son slot de concurrence jusqu'à la fin du flux. Une clé complète permet 8 en même temps, une clé d'essai 2. Si un onglet de navigateur se ferme et que votre serveur continue de lire, ce slot reste occupé, donc annulez la requête amont lorsque le client se déconnecte.

Pour les tâches par lots que personne ne regarde, sautez le streaming. Une requête simple est plus simple et vous obtenez toute la réponse dans un seul objet.

Longues réunions et la fenêtre 100k

La fenêtre de contexte est de 100 000 tokens, comptant le prompt et la réponse ensemble. Une réunion d'une heure fait environ 9 000 mots, soit environ 12 000 tokens, donc même un atelier toute la journée tient dans une seule requête. Cela élimine la conception habituelle map-and-reduce où vous divisez une transcription, résumez chaque partie puis résumez les résumés. Chaque passe de cette conception perd des détails, et une décision prise à la minute 5 et révisée à la minute 50 est facile à mal rapporter.

Vérifiez toujours la taille avant d'envoyer. Une vérification grossière consiste à diviser le nombre de caractères par quatre pour le texte anglais. Si vous êtes proche de la limite, il y a deux options propres :

  • Divisez aux points de rupture naturels tels que les éléments de l'ordre du jour, résumez chaque partie, et passez les notes partielles à un appel final qui les fusionne.
  • Supprimez le contenu qui n'a pas d'importance, comme les longues périodes de petites conversations avant le début de la réunion.

Le corps de requête maximum est de 8 MB, ce qui n'est pas une limite pratique pour le texte. Les prompts ne sont pas utilisés pour l'entraînement, ce qui est important si les enregistrements incluent des plans internes ou des noms de clients.

Détails du prompt qui changent la sortie

Dites pour qui sont les notes

"Notes pour un ingénieur qui a manqué la réunion" obtient plus de détails que "une mise à jour d'un paragraphe pour l'équipe dirigeante". Écrivez le lecteur dans le prompt système.

Donnez au modèle la liste des participants

La reconnaissance vocale brouille souvent les noms. Une ligne telle que "Participants : Priya Nair (PM), Tom Ortiz (backend), Lena Fischer (design)" permet au modèle de réparer une transcription qui dit "Tom Ortis" et d'attacher les tâches à la bonne personne.

Demandez les décisions et les actions séparément

Une décision est quelque chose sur quoi le groupe est d'accord. Une action est quelque chose qu'une personne fera. Quand les deux vivent dans une seule liste, les lecteurs la sautent. Des clés distinctes rendent la distinction explicite, et le modèle la suit de manière cohérente.

Gardez les choses sensibles dedans

Les vraies réunions contiennent un langage direct, des plaintes contre des personnes nommées, des inquiétudes juridiques et des disputes animées. Le modèle ici est ajusté pour répondre sans refus de contenu pour l'usage adulte légal, donc il résume ce qui a été dit plutôt que de refuser. Vous possédez toujours la sortie, donc révisez les notes avant qu'elles ne soient envoyées aux personnes qui n'étaient pas dans la pièce.

Exécuter une journée entière de réunions

Une équipe qui enregistre six réunions par jour peut les traiter en parallèle. Avec 8 requêtes simultanées, envoyez jusqu'à huit à la fois ; un petit pool de travailleurs avec un sémaphore fait le travail. La limite par minute pour une clé complète est de 300 requêtes, ce qu'un pipeline de réunion n'atteindra pas.

Node fonctionne de la même manière que Python. Voici la version sans streaming :

import OpenAI from "openai";
import { readFileSync } from "node:fs";

const client = new OpenAI({
  baseURL: "https://api.whisperapis.com/v1",
  apiKey: process.env.API_KEY,
});

const transcript = readFileSync("standup.txt", "utf8");

const resp = await client.chat.completions.create({
  model: "uncensored",
  messages: [
    { role: "system", content: "Summarize the meeting in five bullets, then list action items with owners." },
    { role: "user", content: transcript },
  ],
  temperature: 0.2,
});

console.log(resp.choices[0].message.content);

Si vous recevez HTTP 429, lisez le code d'erreur. concurrency signifie trop de requêtes à la fois, donc réduisez la taille du pool. rate_limited signifie trop par minute. Un 429 avec un en-tête Retry-After: 5 signale une surcharge temporaire ; attendez cinq secondes et réessayez.

Vérifier les notes avant de leur faire confiance

Les notes générées sont lues avec assurance même lorsqu'elles sont fausses, alors intégrez quelques vérifications peu coûteuses dans le pipeline au lieu de compter sur un humain pour les remarquer.

  • Vérification des citations. Demandez une courte citation de soutien avec chaque élément d'action, puis recherchez-la dans la transcription. Une citation qui n'apparaît pas est un signe que l'élément a été inventé.
  • Vérification des responsables. Comparez chaque responsable avec votre liste de participants et signalez les noms qui ne sont pas dessus.
  • Vérification vide. Une réunion sans décisions est possible, mais un résultat avec tous les tableaux vides sur une transcription de 40 minutes signifie généralement que l'entrée a été tronquée ou que le mauvais fichier a été utilisé.
  • Vérification de longueur. Des notes plus longues qu'environ un cinquième de la transcription ne sont pas des notes ; serrez le prompt ou définissez max_tokens.

Journalisez l'en-tête de réponse X-Request-Id à côté de chaque résultat enregistré. Quand quelqu'un dit qu'un élément d'action est faux, cet identifiant vous permet de trouver la requête et de la comparer avec la transcription. Garder la transcription originale à côté des notes est peu coûteux et règle la plupart des litiges rapidement.

Coût et premier test

Le prix est de $0,15 par million de tokens d'entrée et de $0,50 par million de tokens de sortie. Une réunion d'une heure avec une transcription de 12 000 tokens et un ensemble de notes de 800 tokens coûte $0,0018 pour l'entrée et $0,0004 pour la sortie, soit $0,0022 au total. À ce taux, $1 couvre environ 454 réunions. Consultez la page de tarification pour les recharges, qui commencent à $20 et peuvent être payées par carte ou crypto.

Pour l'essayer, inscrivez-vous et ouvrez la page clé API. Un essai en un clic de $0,50 est disponible une fois par personne, valable 7 jours, sans carte nécessaire. Exécutez le script Python ci-dessus sur une transcription réelle, lisez le JSON, et ajustez le prompt jusqu'à ce que les éléments d'action correspondent à ce qui s'est passé dans la réunion. Ensuite, bouclez sur le reste.

Questions et réponses

Puis-je envoyer des enregistrements audio directement ?

Non. L'API ne prend que du texte. Transcrivez d'abord l'enregistrement avec un outil de reconnaissance vocale, puis envoyez la transcription.

Comment garantir la cohérence du format de sortie ?

Utilisez le mode JSON avec un prompt système qui nomme chaque clé, et définissez une température faible. Analysez le résultat dans un bloc try et réessayez une fois en cas d'échec.

Quelle est la longueur maximale d'une transcription dans une seule requête ?

La fenêtre de contexte est de 100 000 tokens pour le prompt et la réponse. Cela couvre un atelier d'une journée complète dans la plupart des cas.

Mes transcriptions sont-elles utilisées pour l'entraînement ?

Non, les prompts ne sont pas utilisés pour l'entraînement.

Combien coûte une réunion ?

Une réunion d'une heure avec une transcription de 12 000 tokens et un résumé de 800 tokens coûte environ $0,0022 à raison de $0,15 et $0,50 par million de tokens d'entrée et de sortie.

Votre clé n'est qu'à un formulaire d'ici

Créez un compte, copiez la clé, modifiez l'URL de base. C'est toute la configuration.

Obtenir une clé API