Comment fournir un outil de transcription à un agent IA

Regroupez les deux appels de KolWrite dans un seul outil nommé transcribe_media. Vous trouverez ci-dessous sa définition au format tool-use d’Anthropic et au format function-calling d’OpenAI, la fonction Python qui l’exécute, une boucle d’outils minimale et une courte consigne à ajouter dans AGENTS.md ou CLAUDE.md pour que vos agents de code appellent l’API correctement.

Obtenir une clé API Démarrage rapide Langues prises en charge

Dernière mise à jour: · Markdown

Faut-il seulement définir un outil ?

Si votre agent peut exécuter des commandes shell (Claude Code, Codex CLI, Cursor, Windsurf), il n’a pas besoin de schéma : il lance curl ou Python, et les instructions de agent-instructions.md lui disent comment. Une définition d’outil est destinée aux agents que vous construisez avec une API et une boucle d’outils, ou aux frameworks qui appellent des fonctions.

Définition de l’outil : format tool-use d’Anthropic

{
  "name": "transcribe_media",
  "description": "Transcribe an audio or video file with the KolWrite API. Returns timed text. Use output_format \"json\" for word timestamps and speakers, \"srt\" for subtitles, \"txt\" for plain text. Billed per second of audio.",
  "input_schema": {
    "type": "object",
    "properties": {
      "path_or_url": { "type": "string", "description": "Local file path or a public URL of an audio or video file." },
      "model": { "type": "string", "enum": ["base", "oracle_mini", "oracle", "oracle_pro", "oracle_max"], "description": "Default oracle. base is cheapest for clear audio; translate_to needs an Oracle model." },
      "language": { "type": "string", "description": "Language code such as en, he, ar, es, or auto to detect." },
      "translate_to": { "type": "string", "description": "Language code to translate into (Oracle models only)." },
      "output_format": { "type": "string", "enum": ["json", "txt", "srt"] },
      "word_timestamps": { "type": "boolean", "description": "Word times in json. For srt, false gives one cue per segment." },
      "include_diarization": { "type": "boolean", "description": "Label who is speaking." },
      "num_speakers": { "type": "integer", "minimum": 1 }
    },
    "required": ["path_or_url"]
  }
}

Définition de l’outil : format function-calling d’OpenAI

{
  "type": "function",
  "function": {
    "name": "transcribe_media",
    "description": "Transcribe an audio or video file with the KolWrite API. Returns timed text. Use output_format \"json\" for word timestamps and speakers, \"srt\" for subtitles, \"txt\" for plain text. Billed per second of audio.",
    "parameters": {
      "type": "object",
      "properties": {
        "path_or_url": { "type": "string", "description": "Local file path or a public URL of an audio or video file." },
        "model": { "type": "string", "enum": ["base", "oracle_mini", "oracle", "oracle_pro", "oracle_max"] },
        "language": { "type": "string", "description": "Language code such as en, he, ar, es, or auto to detect." },
        "translate_to": { "type": "string", "description": "Language code to translate into (Oracle models only)." },
        "output_format": { "type": "string", "enum": ["json", "txt", "srt"] },
        "word_timestamps": { "type": "boolean" },
        "include_diarization": { "type": "boolean" },
        "num_speakers": { "type": "integer", "minimum": 1 }
      },
      "required": ["path_or_url"]
    }
  }
}

Le schéma JSON des paramètres est identique dans les deux cas. Le champ enum répertorie uniquement les modèles actuels (core et edge sont d’anciens modèles).

La fonction d’exécution de l’outil

L’exécuteur se charge d’envoyer les fichiers locaux, de lancer la tâche, d’attendre la fin du traitement et de renvoyer une réponse compacte. En JSON, il enregistre le résultat complet dans un fichier et ne renvoie que des lignes numérotées : sur un long enregistrement, la liste détaillée de tous les mots dépasse largement ce dont le modèle a besoin.

kolwrite.py

# kolwrite.py — three small functions around the KolWrite REST API
import os, time, requests

API = "https://app.kolwrite.com"
HEADERS = {"x-api-key": os.environ["KOLWRITE_API_KEY"]}


def upload(path):
    """Upload a local file (up to 100 MiB) and return a URL the API can read."""
    name = os.path.basename(path)
    form = requests.post(f"{API}/upload", headers=HEADERS, json={"filename": name}, timeout=30)
    form.raise_for_status()
    form = form.json()
    with open(path, "rb") as media:
        # No x-api-key on this request: it goes to the storage address.
        sent = requests.post(form["uploadUrl"], data=form["uploadFields"],
                             files={"file": (name, media)}, timeout=600)
    sent.raise_for_status()
    return form["fileUrl"]


def transcribe(audio_url, timeout_s=3600, **options):
    """Start a job, wait for it, return the result: a dict for json, a string for srt and txt."""
    body = {"audio_url": audio_url, "model": "oracle", **options}
    job = requests.post(f"{API}/transcribe", headers=HEADERS, json=body, timeout=30)
    job.raise_for_status()
    job_id = job.json()["jobId"]
    deadline = time.time() + timeout_s
    while time.time() < deadline:
        time.sleep(5)
        reply = requests.get(f"{API}/transcribe/{job_id}", headers=HEADERS, timeout=30)
        reply.raise_for_status()
        reply = reply.json()
        if reply["status"] == "COMPLETED":
            return reply["result"]
        if reply["status"] == "FAILED":
            raise RuntimeError(reply.get("error", "transcription failed"))
    raise TimeoutError(f"job {job_id} did not finish in {timeout_s} seconds")

tool.py

# tool.py — run a transcribe_media call for the model and keep the reply small
import json
from kolwrite import upload, transcribe  # the helper from the video-editing guide


def numbered_line(number, segment):
    who = f'{segment["speaker"]}: ' if segment.get("speaker") else ""
    return f'S{number} [{segment["start"]:.1f}-{segment["end"]:.1f}] {who}{segment["text"]}'


def run_transcribe_media(path_or_url, output_format="json", **options):
    url = path_or_url if path_or_url.startswith(("http://", "https://")) else upload(path_or_url)
    result = transcribe(url, output_format=output_format, **options)
    if output_format != "json":
        return result  # srt and txt are already strings
    # Long recordings: save the full JSON and hand the model numbered lines, not 500 KB of words.
    with open("transcript.json", "w", encoding="utf-8") as out:
        json.dump(result, out, ensure_ascii=False)
    lines = [numbered_line(i, s) for i, s in enumerate(result["segments"])]
    return "Full JSON saved to transcript.json (words[] has word times).\n" + "\n".join(lines)

Exemple de boucle d’exécution minimale (Anthropic Messages API)

# loop.py — Anthropic Messages API tool loop around run_transcribe_media
import anthropic
from tool import run_transcribe_media

client = anthropic.Anthropic()          # reads ANTHROPIC_API_KEY
TOOLS = [...]                           # the transcribe_media definition above
messages = [{"role": "user", "content": "Transcribe interview.mp3 and list the questions asked, with times."}]

while True:
    reply = client.messages.create(model="YOUR_MODEL", max_tokens=2000, tools=TOOLS, messages=messages)
    messages.append({"role": "assistant", "content": reply.content})
    if reply.stop_reason != "tool_use":
        print("".join(block.text for block in reply.content if block.type == "text"))
        break
    results = []
    for block in reply.content:
        if block.type == "tool_use" and block.name == "transcribe_media":
            results.append({"type": "tool_result", "tool_use_id": block.id,
                            "content": run_transcribe_media(**block.input)})
    messages.append({"role": "user", "content": results})

Remplacez YOUR_MODEL par l’identifiant de votre modèle. La boucle continue tant que le modèle demande à appeler un outil. La fonction d’exécution reste la même quel que soit votre framework, du moment qu’il sait appeler une fonction Python.

Consignes pour AGENTS.md et CLAUDE.md

Copiez ce bloc dans le fichier d’instructions lu par votre agent de code. Il saura ainsi, à chaque session, quel endpoint appeler, comment passer la clé d’API et quels formats choisir :

## Transcription
For speech-to-text, subtitles and word timings use the KolWrite API (https://app.kolwrite.com).
Before writing code read https://console.kolwrite.com/agent-instructions.md and /llms-full.txt.
- Key: KOLWRITE_API_KEY in the environment, sent as the x-api-key header. Never print it or commit it.
- POST /transcribe {"audio_url", "model": "oracle", "output_format": "json"}, then poll GET /transcribe/{jobId}.
- Local files: POST /upload first and use fileUrl as audio_url. Extract audio from video with ffmpeg to stay under 100 MiB.
- Subtitles: output_format "srt" with "word_timestamps": false (one cue per segment). Formats are json, txt, srt only.
- Always send "model". Ask me before transcribing anything longer than one hour: it costs money.

Maîtriser les coûts avec un agent

  • La transcription est facturée à la seconde d’audio, à partir de 0,48 US$ de l’heure avec base. La règle ci-dessus oblige l’agent à vous demander confirmation avant de lancer un fichier long.
  • Gardez les résultats en cache : enregistrez le JSON à côté du fichier média pour pouvoir le réutiliser sans payer une deuxième transcription.
  • Prenez le modèle le plus économique pour votre besoin : base si l’audio est clair, oracle pour une qualité de production, ou oracle_mini s’il faut aussi traduire.
  • Un agent ne peut pas s’inscrire tout seul. Une personne doit créer le compte et la clé API, puis la lui passer dans une variable d’environnement.

Questions et réponses

Existe-t-il un SDK ou un serveur MCP pour KolWrite ?

Ni paquet SDK ni serveur MCP ne sont publiés à ce jour. L’API est en HTTPS et JSON ; utilisez la définition d’outil ci-dessus, curl ou Python directement, ou générez un client à partir de openapi.json.

Comment faire transcrire de l’audio par Claude Code ?

Mettez la clé dans KOLWRITE_API_KEY, ajoutez la règle ci-dessus à CLAUDE.md et demandez la transcription. Claude Code appelle l’API REST avec curl ou Python en suivant agent-instructions.md.

Quel modèle un agent doit-il utiliser par défaut ?

Choisissez oracle pour de la production. Si l’audio est clair, base est le moins cher, et oracle_mini est le plus abordable pour traduire. Précisez toujours le paramètre model, sinon l’API utilise l’ancien modèle core par défaut.

L’agent peut-il créer sa propre clé API ?

Non. Il faut qu’une personne s’inscrive sur console.kolwrite.com, achète des crédits et génère la clé. L’agent se contente de la lire dans ses variables d’environnement.