Skip to main content

Traducteur de Markdown AI-Powered

🌍 Français | English | Español | 中文 | Deutsch | 日本語 | 한국어 | العربية | हिन्दी | Italiano | Nederlands | Polski | Português | Română | Svenska

📊 Qualité du code

Quality Gate Status Security Rating Reliability Rating Maintainability Rating

Coverage Vulnerabilities Bugs Code Smells

Duplicated Lines (%) Technical Debt Lines of Code

Codacy Badge CodeFactor

Traduit des fichiers Markdown d'une langue à une autre en préservant la structure : blocs de code, code en ligne, URL, ancres, tableaux et front matter. Onze façons d'appeler un modèle — cinq API, quatre abonnements sans facturation à l'usage, deux routeurs — et une mesure publiée de ce que chaque modèle préserve réellement.

En bref

  • Onze chemins de provider : API OpenAI, Mistral, Claude, Gemini et Grok ; abonnements ChatGPT (Codex), Grok, Google (Antigravity) et Claude (Claude Code) sans facturation à l'usage ; routeurs OpenCode (open source, gratuit ou local) et OpenRouter (plus de 400 modèles).
  • Rien de faux à cause d'un jeton perdu : blocs de code, code en ligne, URL, ancres et citations sont remplacés par des jetons avant l'appel et vérifiés au retour. S'il en manque un, le fichier n'est pas écrit.
  • Documents longs : segmentation selon la fenêtre du modèle.
  • Mode --news : citations anglaises protégées et drapeaux gérés par langue, pour les articles de veille.
  • Mode --eco : modèles rapides et moins chers.
  • Note de traduction optionnelle, en haut, en bas ou aux deux.

Installation

pip install ai-powered-markdown-translator     # ou : pipx install ai-powered-markdown-translator
aipmt --help                                   # ou : python -m aipmt --help

Python 3.10 ou plus récent. Pour installer depuis le dépôt, voir Contribuer.

Configuration

Les clés sont lues à trois endroits, du plus prioritaire au moindre ; chacun ne comble que ce que le précédent laisse vide.

Où Pour quoi
1 Variables d'environnement CI, conteneurs, dérogation ponctuelle
2 .env du répertoire courant (ou d'un parent) une clé propre à un projet
3 ~/.config/aipmt/.env installé une fois, vaut partout
mkdir -p ~/.config/aipmt
cat > ~/.config/aipmt/.env <<'EOF'
OPENAI_API_KEY=votre-clé-api-openai
XAI_API_KEY=votre-clé-api-xai
MISTRAL_API_KEY=votre-clé-api-mistral
ANTHROPIC_API_KEY=votre-clé-api-anthropic
GOOGLE_API_KEY=votre-clé-api-google
OPENROUTER_API_KEY=votre-clé-api-openrouter
EOF
chmod 600 ~/.config/aipmt/.env

GEMINI_API_KEY est accepté à la place de GOOGLE_API_KEY. Le fichier utilisateur suit XDG_CONFIG_HOME (chemin absolu seulement) et %APPDATA% sous Windows. Sans clé, la commande énumère les trois emplacements.

Le .env d'un projet ne peut ni rediriger les appels ni choisir le programme exécuté. Il fournit des clés, jamais une destination ni un binaire : toute variable en _BASE_URL, _API_BASE, _ENDPOINT ou _BIN (CODEX_BIN, GROK_BIN, OPENCODE_BIN, AGY_BIN), GROK_HOME, les proxies (HTTP_PROXY, HTTPS_PROXY, ALL_PROXY), les magasins de certificats (SSL_CERT_FILE, SSL_CERT_DIR, REQUESTS_CA_BUNDLE, CURL_CA_BUNDLE) et XDG_CONFIG_HOME / APPDATA y sont ignorés, avec un avertissement. Un dépôt cloné ne doit pas pouvoir détourner votre clé, ni vous faire lancer son propre programme à la première traduction. Ce fichier est aussi lu sans interpolation : NOM=${OPENAI_API_KEY} n'y recopie pas la clé. Posez ces variables dans l'environnement ou dans ~/.config/aipmt/.env.

Variables optionnelles : XAI_BASE_URL (défaut https://api.x.ai/v1), CLAUDE_TIMEOUT (secondes par appel, défaut 900), CODEX_BIN, CODEX_TIMEOUT (défaut 600), GROK_BIN, GROK_HOME (défaut ~/.grok), GROK_TIMEOUT (défaut 900), GROK_TRANSLATE_SANDBOX, AGY_BIN, AGY_TIMEOUT (défaut 900), OPENCODE_BIN, OPENCODE_TIMEOUT (défaut 600), OPENROUTER_BASE_URL (https:// exigé), OPENROUTER_TIMEOUT (défaut 900), OPENROUTER_PREFLIGHT_TIMEOUT (défaut 30). Chacune est détaillée dans la section de son provider.

Premiers pas

# un fichier
aipmt --file document.md --target_dir out/ --source_lang fr --target_lang en

# un répertoire
aipmt --source_dir content/fr --target_dir content/en --source_lang fr --target_lang en

# un autre provider
aipmt --use_gemini --file document.md --target_dir out/ --target_lang ja

document.md traduit en espagnol donne document-es.md dans --target_dir ; avec --include_model, document-es-gpt-5.6-terra.md. L'extension devient toujours .md — article.mdx donne article-en.md — sauf avec --keep_filename, qui conserve le nom d'origine. Une traduction déjà présente est sautée sans --force.

Codes de sortie : 0 si tout a abouti ou a été sauté, 1 s'il reste un fichier en échec (liste sur la sortie d'erreur), 2 si la configuration est en cause. Un fichier en échec n'est jamais écrit, même si l'écriture elle-même échoue : le contenu est écrit à côté puis renommé. Relancer suffit.

Quel modèle choisir

Mesuré sur deux documents réels, traduits dans les quatorze mêmes langues par chaque modèle. Le chiffre est le nombre de langues, sur quatorze, où la traduction est écrite et où rien ne diffère de la source.

Modèle Comment y accéder Article de veille dense Ce README Ce qui diffère, et sur combien de langues
Gemini 3.8 Flash abonnement Google (Antigravity) ✅ 14/14 ✅ 14/14 rien, sur aucun des deux documents
Gemini 3.7 Flash clé API Google ✅ 14/14 ⚠️ 13/14 1 langue sur 14 : un mot en gras de plus (ja)
Gemini 3.7 Flash abonnement Google (Antigravity) ✅ 14/14 ⚠️ 13/14 1 langue sur 14 : un mot en gras de moins (ko)
GPT-5.6 Sol abonnement ChatGPT, ou clé OpenAI ✅ 14/14 ⚠️ 12/14 2 langues sur 14 : un mot en gras de moins (ar, ja)
GLM-5.2 clé OpenRouter ✅ 14/14 ⚠️ 11/14 3 langues sur 14 : un mot en gras de moins (hi, ja, ko)
Claude Sonnet 5 abonnement Claude (Claude Code) ⚠️ 13/14 ⚠️ 13/14 1 langue sur 14 sur l'article : un mot en gras de plus (zh) ; 1 sur ce README : une ligne de tableau collée à la précédente, masquée à l'affichage (ar)
Claude Haiku 4.5 abonnement Claude (Claude Code) ⚠️ 11/14 ✅ 14/14 3 langues sur l'article : un titre de section passé au niveau 1 (en, pl, ro) ; sur ce README, rien pour le comparateur, mais les liens internes doublés en anglais
Claude Sonnet 5 clé API Anthropic ⚠️ 11/14 ⚠️ 12/14 3 langues sur l'article : un bloc de code apparu (es, de, hi) ; 2 sur ce README : un lien sans son balisage (sv), un mot en gras (zh)
Qwen 3.7 Flash clé OpenRouter ❌ 8/14 ⚠️ 10/14 1 langue refusée sur l'article, 5 autres s'écartent ; sur ce README, une quarantaine de mots mis en code (ar)
Grok 4.6 abonnement Grok ❌ 8/14 non noté 5 langues refusées sur 14, faute de codes en ligne et d'URL rendus ; le néerlandais diverge sur tout
GPT-OSS 20B modèle local (Ollama) ❌ 7/14 non remesuré 4 langues refusées sur 14 : le modèle y laissait des passages en français, la garde les a arrêtés
MiMo v2.5 (gratuit) OpenCode Zen, sans compte ❌ 11/14 non remesuré 1 langue refusée ; une section perdue en polonais
Mistral Large clé API Mistral ❌ 5/14 ❌ 1/14 une section entière disparaît : 1 langue sur l'article (hi), 3 sur ce README (ar, hi, ko) — et 3 langues refusées sur l'article
DeepSeek V4 Flash clé OpenRouter ❌ 3/14 non remesuré 10 langues refusées sur 14 ; 37 minutes par langue
Claude Opus 5.5 abonnement Claude (Claude Code) ❌ 0/14 ✅ 14/14 l'article refusé dans les 14 langues par les garde-fous d'Opus, à cause d'une brève de biologie ; rien sur ce README
Ce que dit le symbole
✅ les quatorze langues traduites, et rien ne diffère de la source
⚠️ les quatorze langues traduites ; ce qui diffère est du balisage — un mot en gras, un code, un lien qui perd ses crochets. Aucun texte, aucune URL, aucun bloc de code, aucune section ne manque
❌ au moins une langue n'a pas pu être traduite — le fichier est refusé, pas écrit — ou du contenu manque dans un fichier écrit

Ce qu'il faut en retenir :

  • Une traduction refusée n'est pas une traduction abîmée. Quand un jeton manque au retour, le fichier n'est pas écrit et la langue compte comme refusée. C'est ce qui arrive à Grok sur l'article : quatre codes en ligne et trois URL perdus dès le premier segment, sur les cinq écritures non latines.
  • Un modèle peut refuser tout un document pour une seule phrase. Opus 5.5 traduit ce README sans un écart, mais aucun article de veille : ses garde-fous arrêtent la réponse sur une brève de biologie. Le fichier n'est pas écrit, et aipmt dit pourquoi.
  • Ce filet ne couvre pas les titres, les tableaux, le front matter ni le texte. Un modèle qui supprime une section rend un fichier que l'outil écrit sans broncher — c'est le cas de Mistral. Ces éléments ne sont pas remplaçables par un jeton, et les gardes actuelles ne les contrôlent pas ; scripts/compare_structure.py détecte une section perdue, mais après coup.
  • Grok n'a pas de note sur ce README : sa session CLI a expiré après douze langues, dont onze sans écart. Une campagne interrompue ne se note pas.
  • La densité du document compte plus que la langue. Grok tient sur des README ordinaires et décroche sur un article chargé de liens, y compris en néerlandais.

Dates et documents : la colonne « Ce README » a été mesurée le 9 septembre 2026 sur une révision figée de ce fichier (785 lignes, 285 codes en ligne, 89 lignes de tableau), retouchée depuis — sauf les lignes Antigravity et Claude Code, mesurées le 26 septembre sur la révision publiée avec la 1.14.0, plus courte (600 lignes, 257 codes en ligne, 85 lignes de tableau). La colonne « Article de veille dense » vient de la campagne des 4 et 5 septembre sur un article de 589 lignes, sauf la ligne Grok, remesurée le 9 septembre sur une autre édition de la même veille, et les lignes Antigravity et Claude Code, mesurées le 26 septembre sur le même article. Les tableaux complets, les durées et le protocole sont dans Mesures détaillées.

Toutes les options

Option Description
--file Fichier Markdown unique à traduire (alternative à --source_dir)
--source_dir Répertoire source contenant les fichiers Markdown (défaut: content/posts)
--target_dir Répertoire de sortie pour les fichiers traduits (défaut: traductions_en)
--source_lang Langue source (défaut: fr)
--target_lang Langue cible (défaut: en)
--model Modèle spécifique à utiliser
--eco Utiliser les modèles économiques
--use_mistral Utiliser l'API Mistral AI
--use_claude Utiliser l'API Claude
--use_gemini Utiliser l'API Gemini
--use_grok Utiliser l'API xAI (Grok) — nécessite XAI_API_KEY
--use_codex Utiliser le CLI Codex sur le quota de l'abonnement ChatGPT
--use_grok_cli Utiliser le CLI Grok sur le quota de l'abonnement Grok
--use_antigravity Utiliser le CLI Antigravity (agy) sur le quota de l'abonnement Google AI Pro ou Ultra
--use_claude_code Utiliser le CLI Claude Code (claude -p) sur le quota de l'abonnement Claude Pro ou Max
--use_opencode Utiliser OpenCode (open source) vers le fournisseur configuré dans OpenCode ; exige --model provider/modèle
--use_openrouter Utiliser OpenRouter — nécessite OPENROUTER_API_KEY et --model fournisseur/modèle
--force Forcer la re-traduction
--keep_filename Conserver le nom de fichier original
--news Mode actualités : protège les citations EN, gère les drapeaux par langue
--add_translation_note Ajouter une note de traduction
--note_position Position de la note : top, bottom (défaut), ou both
--note_format Format de la note : legacy (défaut, paragraphe gras) ou marker
--include_model Inclure le nom du modèle dans le fichier de sortie
--reasoning_effort Effort de raisonnement GPT-5.x : none/low/medium/high/xhigh

Les neuf flags --use_* sont mutuellement exclusifs : en combiner deux est refusé.

Providers

Par API : OpenAI, Mistral, Claude, Gemini, Grok

aipmt --source_dir content/fr --target_dir content/en --target_lang en             # OpenAI, défaut
aipmt --use_mistral --source_dir content/fr --target_dir content/es --target_lang es
aipmt --use_claude  --source_dir content/fr --target_dir content/de --target_lang de
aipmt --use_gemini  --source_dir content/fr --target_dir content/ja --target_lang ja
aipmt --use_grok    --source_dir content/fr --target_dir content/pt --target_lang pt

--eco bascule sur le palier économique de chaque fournisseur.

Provider Qualité (défaut) Économique (--eco)
OpenAI gpt-5.6-terra gpt-5.6-luna
Claude claude-sonnet-5 claude-haiku-4-5
Mistral mistral-large-latest mistral-small-latest
Gemini gemini-3.7-flash gemini-3.1-flash-lite
Codex gpt-5.6-sol (aussi terra et luna par --model) gpt-5.6-luna
Grok API grok-4.6 grok-4.3
Grok CLI grok-4.6 grok-4.5
Antigravity gemini-3.8-flash-medium gemini-3.7-flash-low
Claude Code sonnet, effort low idem — --eco sans effet
OpenCode --model provider/modèle obligatoire idem — --eco sans effet
OpenRouter --model fournisseur/modèle obligatoire idem — --eco sans effet

Sur l'abonnement ChatGPT : --use_codex

Pilote le CLI Codex officiel : la traduction est décomptée du quota de l'abonnement ChatGPT, sans clé API ni facturation à l'usage.

pip install openai-codex-cli-bin   # package officiel OpenAI (~250 Mo), ou : npm install -g @openai/codex
codex login
aipmt --use_codex --eco --file README.md --target_dir . --target_lang it
  • Le binaire est cherché dans CODEX_BIN, puis le PATH, puis le package openai-codex-cli-bin. ~/.codex/auth.json n'est jamais lu.
  • OPENAI_API_KEY et CODEX_API_KEY sont retirées de l'environnement du sous-processus : une clé présente ne fait jamais basculer vers l'API.
  • Chaque segment coûte au moins un « message » de la fenêtre de 5 heures — deux si sa validation échoue et qu'il est retenté. OpenAI annonce, à titre d'estimation, 250-2 000 messages/5 h pour gpt-5.6-luna (--eco) et 10-100 pour gpt-5.6-sol sur un plan Plus.
  • --model gpt-5.6-terra et --model gpt-5.6-luna passent aussi par l'abonnement. Un modèle auquel le compte n'a pas droit rend un 400 « model is not supported when using Codex with a ChatGPT account ».
  • Plus lent qu'une API, et l'écart grandit avec le document : sur ce README, 6 min 46 s par langue en médiane avec gpt-5.6-sol, contre 36 s pour gemini-3.7-flash.
  • Refusé en CI (CI ou GITHUB_ACTIONS défini) : l'abonnement s'authentifie par un fichier de session personnel, qui n'a rien à faire sur un runner partagé.
  • Variables : CODEX_BIN, CODEX_TIMEOUT (secondes par segment, défaut 600).

Sur l'abonnement Grok : --use_grok_cli

Même principe avec le CLI officiel Grok Build, sur l'abonnement SuperGrok ou X Premium+.

curl -fsSL https://x.ai/cli/install.sh | bash
grok login                                      # ou : grok login --device-code
aipmt --use_grok_cli --eco --file README.md --target_dir . --target_lang pl
  • Confinement plus faible que Codex. Le sandbox OS de Grok ne s'applique pas sur beaucoup de postes Linux récents (AppArmor, sockets de runtime conteneur), et un profil qui ne peut pas s'appliquer démarre non confiné en silence. Le script ne demande donc aucun profil par défaut, l'annonce, et s'appuie sur les règles --deny du CLI, dont le catch-all * — la seule couche qui refuse de démarrer plutôt que de retirer la protection sans le dire. GROK_TRANSLATE_SANDBOX=read-only exige le sandbox OS, et le démarrage échoue si la machine ne peut pas l'honorer.
  • Le quota est hebdomadaire, partagé avec Chat, Imagine et Voice, et aucune commande ne permet de le lire : un lot peut entamer l'usage conversationnel sans signal.
  • Variables : GROK_BIN, GROK_HOME (répertoire du CLI, défaut ~/.grok), GROK_TIMEOUT (défaut 900), GROK_TRANSLATE_SANDBOX.

Sur l'abonnement Google : --use_antigravity

Même principe avec agy, le CLI officiel d'Antigravity : pour qui paie Google AI Pro ou Ultra, la traduction est décomptée du quota de l'abonnement au lieu d'être facturée au token. C'est le seul chemin vers ce quota : Gemini CLI ne sert plus ces comptes depuis le 18 juin 2026 (annonce), et le SDK d'Antigravity n'accepte qu'une clé API ou un projet Google Cloud.

# agy 1.2.11 ou plus récent : https://antigravity.google/docs/cli/install/
agy                                  # une fois : se connecter avec le compte de l'abonnement
aipmt --use_antigravity --file README.md --target_dir . --target_lang en
agy -p /usage --output-format json   # quota restant, sans en consommer
  • Aucune voie payante ne reste ouverte. agy ne reçoit de votre environnement qu'une liste fermée de variables — PATH, langue et fuseau, terminal, identité, proxies et certificats, bus de session — et aucune clé : plusieurs de ses variables font basculer un appel sans rien afficher (mesuré : l'une envoie le document à une passerelle tierce, une autre à un projet Google Cloud facturé), et une liste de refus en oubliait à chaque relecture. Avant tout segment, agy -p /config, qui ne coûte aucun quota, doit montrer les crédits IA payants désactivés, sans clé API ni projet Google Cloud — un réglage absent vaut refus —, sinon rien n'est traduit ; le journal de chaque appel doit ensuite attester l'abonnement (authMethod=consumer), sinon la réponse est refusée.
  • Confinement. Chaque appel tourne dans un répertoire personnel privé et jetable, avec un agent de traduction sans outil : vos réglages, règles, plugins, serveurs MCP et hooks d'agy n'y entrent pas, rien ne s'ajoute à votre historique, et la connexion reste dans le trousseau, qu'aipmt ne lit jamais. Un agent introuvable fait retomber agy, en silence, sur son agent de codage et ses outils : une ligne entière du journal doit confirmer le bon agent — un document qui cite ce message ne la remplace pas —, sinon refus.
  • Plateformes : Linux, dans une session qui a un trousseau (bus de session D-Bus, Secret Service) ; macOS est accepté, sans y avoir été mesuré. Refusé sous Windows, où agy ne lit pas les variables qui isolent chaque appel, et sous Linux sans bus de session — session SSH, conteneur, serveur : agy y range son jeton dans un fichier de ~/.gemini, que l'isolation masque. Le refus vient avant tout lancement, avec sa cause, au lieu d'une minute d'attente d'un code de connexion.
  • Modèles : ceux d'agy models. Les Gemini portent l'effort dans leur nom (gemini-3.8-flash-medium…) : un nom sans suffixe est refusé avant l'appel, et --reasoning_effort est sans effet. Par défaut gemini-3.8-flash-medium, et gemini-3.7-flash-low en --eco ; les campagnes qui les ont fixés sont décrites dans Mesures détaillées. Claude et GPT-OSS ont leur propre quota, bien plus petit : environ 1 % de la fenêtre de 5 heures par appel mesuré, contre 0,05 % en Flash.
  • Quota : par groupe, une fenêtre de 5 heures et une hebdomadaire, au prorata du coût en tokens. Mesuré sur le compte de l'auteur : environ 16 points de la fenêtre de 5 heures par million de caractères source en gemini-3.8-flash-medium, 14 en gemini-3.7-flash-medium et 7 à 8 à l'effort bas — un README de 40 000 caractères coûte donc un peu plus d'un demi-point. La limite hebdomadaire, elle, dépend du palier. La relance suit ce qu'agy déclare réessayable ; à défaut, une fenêtre épuisée n'est jamais relancée : elle fait échouer chaque fichier jusqu'à la réinitialisation qu'affiche /usage.
  • Plus lent que l'API : sur l'article dense des mesures, 3 min 59 s par langue en médiane en gemini-3.8-flash-medium et 3 min 14 s en gemini-3.7-flash-medium, contre 1 min 18 s pour Gemini 3.7 Flash par l'API.
  • Interruption : Ctrl-C, ou un terminal fermé, arrêtent agy avec la commande au lieu de le laisser finir son tour sur votre quota ; il en va de même pour Codex, Grok CLI et OpenCode. Sous nohup, la traduction continue.
  • Refusé en CI (CI ou GITHUB_ACTIONS défini) : la connexion vit dans un trousseau personnel. Sur un runner, --use_gemini avec GOOGLE_API_KEY.
  • Variables : AGY_BIN (sinon le PATH, puis ~/.local/bin/agy), AGY_TIMEOUT (secondes par segment, démarrage compris, défaut 900).

Conditions d'utilisation : c'est votre compte qui est engagé. Les conditions d'Antigravity (section 6) et sa FAQ interdisent d'accéder au service par un logiciel tiers à l'aide de la connexion Antigravity — Claude Code, OpenClaw et OpenCode y sont cités —, sous peine de suspension du compte. aipmt ne lit ni ne réutilise le jeton : il lance le binaire officiel dans le mode headless que Google documente pour les scripts et la CI. Un membre de Google a jugé « standard » de lancer agy -p depuis un script local pour son propre travail (forum officiel, 25 septembre 2026, réponse non contractuelle) ; aucun texte ne tranche le cas d'un outil distribué comme celui-ci.

Documents publics seulement. Selon la section 5 des mêmes conditions, les échanges — prompts, réponses, métadonnées — peuvent servir à améliorer les produits et l'apprentissage automatique de Google et être relus par des humains, abonnement payant compris. Le retrait passe par le réglage enableTelemetry, à l'effet non documenté, qu'aipmt ne pose pas ; vos réglages d'agy ne suivent pas dans son isolement. N'y faites passer rien de confidentiel.

Sur l'abonnement Claude : --use_claude_code

Même principe avec claude, le CLI officiel de Claude Code, en mode -p : pour qui paie Claude Pro ou Max, la traduction est décomptée du quota de l'abonnement au lieu d'être facturée au token. À ne pas confondre avec --use_claude, l'API d'Anthropic, facturée à l'usage.

claude                                   # une fois : /login avec le compte de l'abonnement
aipmt --use_claude_code --file README.md --target_dir . --target_lang en
  • Aucune voie payante ne reste ouverte, et chaque appel le prouve. Claude Code ne reçoit de votre environnement qu'une liste fermée de variables — ni clé API, ni jeton, ni fournisseur cloud, ni marqueur de la session Claude Code d'où aipmt serait lancé. Avant le premier segment, claude auth status doit montrer la connexion d'abonnement, sans clé Console, et /usage, qui ne coûte aucun quota, doit l'attester ; chaque appel l'atteste à son tour dans son événement d'initialisation, sinon la réponse est refusée.
  • Désactivez l'« extra usage » (claude.ai, Paramètres → Utilisation) pour que le zéro euro tienne : activé, il prend le relais d'une fenêtre épuisée et facture sans afficher d'erreur. aipmt arrête la traduction dès que le relevé de quota d'un appel le signale, mais cet appel-là est déjà compté.
  • Quota partagé avec vos sessions Claude Code. Chaque appel rapporte l'utilisation des fenêtres de 5 heures et de la semaine ; au-delà de 80 % (AIPMT_CLAUDE_MAX_UTILIZATION), aucun segment de plus n'est lancé, pour ne pas épuiser ce qui sert à votre travail.
  • Confinement. Chaque appel tourne sans outil, dans un répertoire privé et jetable, en mode sans personnalisation : ni vos CLAUDE.md, ni vos plugins, hooks, serveurs MCP ou réglages ne sont chargés, et rien n'est gardé de la session. Les pièces jointes sont coupées : un @chemin dans votre document reste du texte et n'ouvre aucun fichier (mesuré).
  • Modèles : sonnet par défaut, à l'effort low, et en --eco aussi : --eco ne change rien sur ce chemin. Mesurés sur les mêmes documents, haiku est deux fois plus lent — il raisonne sans qu'on puisse l'en empêcher — pour un coût à peine inférieur, et opus refuse des contenus de biologie (point suivant). Tous deux restent accessibles par --model ; ces alias suivent le dernier modèle de leur famille. fable et les variantes [1m] sont refusés, parce qu'ils passent en crédits payants. --reasoning_effort règle l'effort, dont une traduction ne tire rien : le raisonnement mesuré est nul ou presque.
  • Opus refuse certains contenus de biologie. Ses garde-fous sont plus stricts que ceux de Sonnet, et le message d'erreur d'Anthropic prévient qu'ils « can sometimes flag biology-research-adjacent work ». Mesuré : une brève de veille sur 279 molécules générées a fait refuser l'article dans les quatorze langues. Rien n'est écrit : aipmt refuse la réponse coupée, nomme les garde-fous et conseille --model sonnet.
  • Refusé en CI (CI ou GITHUB_ACTIONS défini) et sous Windows (non mesuré).
  • Variables : AIPMT_CLAUDE_BIN (sinon le PATH, puis ~/.local/bin/claude), AIPMT_CLAUDE_TIMEOUT (secondes par segment, défaut 900), AIPMT_CLAUDE_MAX_UTILIZATION (défaut 0.8), CLAUDE_CONFIG_DIR (le compte de Claude Code, jamais pris d'un .env de projet) ; répertoires de travail sous XDG_CACHE_HOME/aipmt/claude-code (défaut ~/.cache).

Conditions d'utilisation : c'est votre compte qui est engagé. La page légale de Claude Code n'empêche pas « an end user from signing in to the unmodified Claude Code binary with their own Claude subscription » : c'est ce que fait aipmt, qui lance le binaire officiel et ne lit jamais le jeton. Mais Anthropic « does not permit third-party developers […] to route requests through Free, Pro, or Max plan credentials on behalf of their users », préfère la clé API pour les outils tiers, « including open-source projects », et se réserve de décompter leur usage sur les crédits payants (aide Claude). Aucun texte ne tranche le cas d'un outil distribué qui lance le binaire.

Données : sur les comptes Free, Pro et Max, l'entraînement des modèles s'applique aussi à Claude Code quand le réglage de confidentialité l'autorise (page données). aipmt ne garde aucune transcription locale (--no-session-persistence). N'y faites passer rien de confidentiel.

Vers le fournisseur de son choix : --use_opencode

OpenCode est un agent de code open source (MIT) qui route vers les fournisseurs configurés en son sein : clé API, abonnement, passerelle OpenCode Zen (modèles gratuits, sans compte) ou modèle local. Deux voies ont été mesurées de bout en bout ici, Zen et Ollama.

curl -fsSL https://opencode.ai/install | bash   # ou : npm install -g opencode-ai
opencode models                                 # les modèles, au format provider/modèle
opencode auth login                             # facultatif : brancher un fournisseur

# gratuit, sans compte ni clé — données utilisables pour l'entraînement
aipmt --use_opencode --model opencode/mimo-v2.5-free --file README.md --target_dir . --target_lang en
# local, hors ligne
aipmt --use_opencode --model ollama/qwen2.5:7b --file README.md --target_dir . --target_lang de
# sur un abonnement déjà payé
aipmt --use_opencode --model github-copilot/gpt-5 --file README.md --target_dir . --target_lang ja

--model est obligatoire : sans lui, OpenCode retomberait sur un modèle gratuit dont les échanges peuvent servir à l'entraînement, et ce choix ne se fait pas à votre place.

Confinement à chaque appel :

  • une configuration inline, prioritaire sur la vôtre, définit un agent aipmt dont tous les outils sont refusés (permission: { "*": "deny" }), partage de session désactivé, --pure, jamais --auto ;
  • répertoire de travail jetable et vide, OPENCODE_DISABLE_PROJECT_CONFIG et OPENCODE_DISABLE_CLAUDE_CODE posés — sans eux, OpenCode injecte dans le prompt l'AGENTS.md du répertoire courant et ~/.claude/CLAUDE.md. Le ~/.config/opencode/AGENTS.md global reste injecté, OpenCode ne permet pas de l'écarter ;
  • contrat de sortie : code retour 0, aucun événement error, aucun appel d'outil, dernier pas en stop, texte non vide, et l'agent aipmt effectivement chargé — un --agent inconnu ne fait pas échouer OpenCode, il retombe en silence sur l'agent de codage ;
  • aucune clé d'aipmt n'est transmise, sauf OPENCODE_API_KEY, la clé d'OpenCode lui-même. Les fournisseurs se configurent dans OpenCode, pas dans le .env d'aipmt.

À savoir :

  • Les modèles gratuits de Zen sont changeants, aux limites non documentées, et leurs échanges peuvent servir à l'entraînement : pour une documentation publique, pas pour un contenu privé.
  • Un modèle local doit offrir au moins 16 k tokens de contexte, les segments faisant jusqu'à 16 000 caractères. Ollama en configure souvent 4 096 : passer par un Modelfile avec PARAMETER num_ctx 32768.
  • --eco est sans effet ; --reasoning_effort est transmis tel quel comme --variant d'OpenCode.
  • OpenCode journalise chaque session dans ~/.local/share/opencode/.
  • Variables : OPENCODE_BIN (sinon le PATH, puis ~/.opencode/bin/opencode), OPENCODE_TIMEOUT (secondes par segment, défaut 600). OPENCODE_CONFIG passe tel quel à OpenCode.

Exemple d'un modèle local via Ollama, dans ~/.config/opencode/opencode.json :

ollama pull gpt-oss:20b
printf 'FROM gpt-oss:20b\nPARAMETER num_ctx 32768\n' > gpt-oss-20b-32k.Modelfile
ollama create gpt-oss-20b-32k -f gpt-oss-20b-32k.Modelfile
{
  "$schema": "https://opencode.ai/config.json",
  "provider": {
    "ollama": {
      "npm": "@ai-sdk/openai-compatible",
      "name": "Ollama (local)",
      "options": { "baseURL": "http://127.0.0.1:11434/v1" },
      "models": {
        "gpt-oss-20b-32k": {
          "name": "gpt-oss 20B (32k, sans réflexion)",
          "limit": { "context": 32768, "output": 8192 },
          "options": { "reasoningEffort": "none" }
        }
      }
    }
  }
}

reasoningEffort: "none" coupe la réflexion qu'Ollama active par défaut sur ces modèles, et qu'un Modelfile ne peut pas désactiver. Mesuré sur une phrase de six mots : 919 tokens de réflexion et 68 secondes sans l'option, 9 tokens avec.

Vers plus de 400 modèles : --use_openrouter

OpenRouter est un routeur facturé à l'usage, sur un crédit unique, devant des modèles hébergés par des tiers — dont les modèles chinois ouverts qu'aucun autre provider n'expose ici.

aipmt --use_openrouter --model z-ai/glm-5.2 --file README.md --target_dir . --target_lang en

--model est obligatoire. Un préflight, exécuté avant toute facturation, règle deux particularités du routage :

  • Un même modèle est servi par des dizaines d'hébergeurs aux plafonds différents — sur z-ai/glm-5.3-flash, 23 hébergeurs dont un plafonné à 2 048 tokens de sortie. Le préflight lit /api/v1/models/{modèle}/endpoints, écarte les hébergeurs sous 8 000 tokens de sortie ou au statut dégradé, et épingle les autres avec allow_fallbacks: false.
  • Le raisonnement est facturé au tarif de sortie — 107 tokens contre 2 sur une réponse « OK » de z-ai/glm-5.2. Il est coupé par défaut ; les modèles qui l'imposent reçoivent le plus bas effort qu'ils acceptent, le défaut du catalogue pouvant saturer la sortie avant la fin de la traduction. --reasoning_effort reste prioritaire.
→ OpenRouter : 30 hébergeur(s) épinglé(s) sur 33, contexte 1048576 tokens,
  sortie plafonnée à 32768, raisonnement coupé
  • La fenêtre de contexte vient du catalogue. Un modèle sous 16 400 tokens est refusé avant tout appel : 8 400 pour le prompt et le segment, 8 000 de sortie au minimum.
  • Un slug absent du catalogue, un catalogue injoignable ou l'absence d'hébergeur tenant le plafond arrêtent la commande.
  • finish_reason=length avec une sortie vide est un budget consommé par le raisonnement, pas une troncature : le message le distingue.
  • --eco est sans effet.
  • Variables : OPENROUTER_API_KEY (https://openrouter.ai/keys), OPENROUTER_BASE_URL (défaut https://openrouter.ai/api/v1, https:// exigé), OPENROUTER_TIMEOUT (défaut 900), OPENROUTER_PREFLIGHT_TIMEOUT (défaut 30).

Note de traduction

--add_translation_note ajoute une note, en bottom (défaut), top (après le front matter) ou both (--note_position), au format legacy (paragraphe en gras, défaut) ou marker (--note_format). Le format marker est une définition de référence Markdown invisible, [ai-translation-note-<placement>]: <> "v=1 source=… target=… model=… date=…", suivie d'une citation en gras : lisible sur GitHub, exploitable au build par un plugin remark.

aipmt --file article.mdx --target_lang en --add_translation_note --note_format marker --note_position top

Mesures détaillées

Toutes les mesures sont des traductions réellement exécutées avec aipmt, vers quatorze langues : en, es, de, it, pt, nl, pl, sv, ro, ja, ko, zh, ar, hi. Écrites compte les fichiers que les gardes ont laissé passer ; Sans écart ceux où scripts/compare_structure.py ne relève rien — même nombre de sections, de sous-titres, de liens, d'URL distinctes, de blocs de code, de codes en ligne, de lignes de tableau, de blocs de citation et de mots en gras.

« Sans écart » veut dire « rien de détecté », pas « identique » : le comparateur compte des éléments sans lire leur contenu. Il ne signale ni un titre de niveau 4 supprimé, ni le texte d'un code en ligne remplacé, ni un drapeau échangé, ni un lien interne rendu avec une parenthèse de trop, [texte]((#ancre)), qui ne mène plus nulle part — et il ne juge pas la langue.

Article de veille dense, mode --news

Une édition de la veille IA de jls42.org : 589 lignes, 140 liens, 21 sections, 3 citations anglaises protégées. Campagne des 4 et 5 septembre 2026.

Modèle Accès Écrites Sans écart Médiane/langue
gemini-3.7-flash API Google 14/14 ✅ 14/14 1 min 18 s
gemini-3.8-flash-medium (--use_antigravity) abonnement Google 14/14 ✅ 14/14 3 min 59 s
gemini-3.7-flash-medium (--use_antigravity) abonnement Google 14/14 ✅ 14/14 3 min 14 s
gpt-5.6-sol (--use_codex) abonnement ChatGPT 14/14 ✅ 14/14 11 min 28 s
z-ai/glm-5.2 OpenRouter 14/14 ✅ 14/14 5 min 37 s
qwen/qwen3.8-flash OpenRouter 14/14 ✅ 14/14 26 min 23 s
sonnet (--use_claude_code) abonnement Claude 14/14 ⚠️ 13/14 6 min 49 s
claude-sonnet-5 API Anthropic 14/14 ⚠️ 11/14 6 min 31 s
haiku (--use_claude_code) abonnement Claude 14/14 ⚠️ 11/14 15 min 54 s
opencode/mimo-v2.5-free OpenCode Zen 13/14 ❌ 11/14 9 min 27 s
qwen/qwen3.7-flash OpenRouter 13/14 ❌ 8/14 10 min 09 s
ollama/gpt-oss-20b-32k local 10/14 ❌ 7/14 12 min 39 s
mistral-large-latest API Mistral 11/14 ❌ 5/14 5 min 32 s
deepseek/deepseek-v4-flash-0731 OpenRouter 4/14 ❌ 3/14 37 min 27 s
grok-4.6 (--use_grok_cli) abonnement Grok 1/14 ❌ 1/14 23 min 11 s
opus (--use_claude_code) abonnement Claude 0/14 ❌ 0/14 —

Grok a été remesuré le 9 septembre sur une autre édition de la même veille (356 lignes) : 9 langues écrites sur 14, 8 sans écart. C'est ce chiffre qui figure dans le tableau de tête. Trois campagnes interrompues ne sont pas notées : qwen3.5-27b (9 langues) et kimi-k2.6 (4) faute de crédit, z-ai/glm-5.3-flash dont les deux échecs venaient d'un réglage de raisonnement que le provider corrige depuis. Les lignes OpenRouter ont été mesurées aux réglages par défaut du routeur, avant --use_openrouter ; z-ai/glm-5.2, remesuré avec le provider livré, rend le même 14/14. Les chiffres ont été recalculés le 10 septembre avec le comparateur actuel : qwen3.8-flash et qwen3.7-flash gagnent chacun une langue par rapport à la première publication, les autres sont inchangés.

Les lignes --use_antigravity ont été mesurées le 26 septembre sur le même article, quatre traductions en parallèle : gemini-3.7-flash-medium le matin, gemini-3.8-flash-medium l'après-midi. En anglais, chacun a retiré lui-même les trois lignes de traduction française sous les citations, sans inventer de drapeau, et les citations anglaises sont intactes : le nettoyage de repli n'a rien eu à faire. En --eco (gemini-3.7-flash-low), sur quatre langues seulement (en, ja, ar, hi) : 4 écrites sur 4, toutes sans écart, 1 min 52 s de médiane. Contre-épreuve le même jour sur une édition plus récente de la veille, celle du 25 septembre (438 lignes, 2 citations anglaises), traduite hors du blog par gemini-3.7-flash-medium : 14 écrites sur 14, toutes sans écart, 87 à 128 s par langue.

Les lignes --use_claude_code ont été mesurées le 26 septembre sur le même article, quatre traductions en parallèle, à l'effort low. Avec sonnet, les citations anglaises sont intactes dans les quatorze langues et, en anglais, le modèle a retiré lui-même les lignes de traduction française, sans inventer de drapeau. opus n'a écrit aucune langue : dans chacune, ses garde-fous ont arrêté la réponse au dernier segment, à cause d'une brève sur 279 molécules générées pour un site de liaison. Envoyée seule, cette brève est refusée au titre de la catégorie « bio » ; sonnet l'a traduite partout. haiku écrit les quatorze langues ; dans trois (en, pl, ro), un titre de section passe du niveau 2 au niveau 1. Il raisonne sans qu'on puisse l'en empêcher — 61 % de ses tokens de sortie —, d'où plus du double du temps de sonnet.

README de ce projet, Markdown standard

Révision figée le 9 septembre 2026 : 785 lignes, 285 codes en ligne, 40 clôtures de blocs, 89 lignes de tableau. Quatre traductions en parallèle.

Modèle Écrites Sans écart Médiane/langue Ce qui diffère
gemini-3.8-flash-medium (--use_antigravity) 14/14 ✅ 14/14 1 min 43 s rien
opus (--use_claude_code) 14/14 ✅ 14/14 1 min 48 s rien
haiku (--use_claude_code) 14/14 ✅ 14/14 4 min 02 s rien pour le comparateur ; liens internes doublés (en)
gemini-3.7-flash 14/14 ⚠️ 13/14 36 s un mot en gras (ja)
gemini-3.7-flash-medium (--use_antigravity) 14/14 ⚠️ 13/14 1 min 22 s un mot en gras (ko)
sonnet (--use_claude_code) 14/14 ⚠️ 13/14 2 min 20 s une ligne de tableau collée à la précédente (ar)
claude-sonnet-5 14/14 ⚠️ 12/14 2 min 56 s un lien (sv), un mot en gras (zh)
gpt-5.6-sol (--use_codex) 14/14 ⚠️ 12/14 6 min 46 s un mot en gras (ar, ja)
z-ai/glm-5.2 (OpenRouter) 14/14 ⚠️ 11/14 2 min 34 s un mot en gras (hi, ja, ko)
qwen/qwen3.7-flash 14/14 ⚠️ 10/14 2 min 17 s 40 codes en ligne ajoutés en arabe ; gras (hi, ja, ko)
mistral-large-latest 14/14 ❌ 1/14 2 min 44 s une section perdue (ar, hi, ko) ; blocs de code ajoutés (ja, ko, ro, zh)

Deux campagnes interrompues ne sont pas notées : Grok, session CLI expirée après douze langues (onze sans écart), et qwen3.8-flash, HTTP 429 de son hébergeur après deux. opencode/mimo-v2.5-free et ollama/gpt-oss-20b-32k n'ont pas été remesurés sur cette révision ; sur celle des 4 et 5 septembre, plus courte de 277 lignes, ils écrivaient chacun 9 traductions sur 14, dont 7 et 1 sans écart.

Les lignes --use_antigravity et --use_claude_code n'ont pas été mesurées sur la révision figée, mais le 26 septembre sur celle publiée avec la 1.14.0 : 600 lignes, 257 codes en ligne, 30 clôtures de blocs, 85 lignes de tableau. Plus courte de 185 lignes, elle ne se compare pas terme à terme aux autres lignes ; ces lignes-là, elles, se comparent entre elles. Sur les liens internes, que le comparateur ne contrôle pas, gemini-3.8-flash-medium les a gardés intacts dans les quatorze langues, gemini-3.7-flash-medium les a cassés en italien ; sonnet et opus les ont gardés intacts partout, haiku les a doublés en anglais.

Quatre README de projets connus

FastAPI, Ollama, tldr-pages et Vue.js, pris tels quels sur GitHub — des documents plus faciles que les deux précédents. La campagne visait les modèles en difficulté ; Gemini y sert de point de comparaison.

Modèle Périmètre Écrites Sans écart
gemini-3.7-flash 4 projets × 14 langues 56/56 ✅ 55/56
opencode/mimo-v2.5-free 4 projets × 14 langues 55/56 ❌ 47/56
grok-4.6 (abonnement) 4 projets × ar, hi, ja, zh 16/16 ❌ 14/16
ollama/gpt-oss-20b-32k 4 projets × ar, hi, ja, zh 15/16 ❌ 9/16

Ce que ces mesures ne sont pas

  • Pas un classement exhaustif : OpenRouter seul propose plus de quatre cents modèles, une quinzaine a été mesurée.
  • Des durées indicatives : de trois à six traductions en parallèle selon les campagnes, et le débit d'un fournisseur varie dans la journée.
  • Des observations datées : les modèles changent sous le même nom, et vos documents ne sont pas les nôtres.

Pour refaire la mesure sur vos documents, sur une copie figée du fichier :

aipmt --file reference.md --target_dir out/ --source_lang fr --target_lang ja --use_gemini --force
aipmt --file veille.mdx   --target_dir out/ --source_lang fr --target_lang ja --use_gemini --news --force
python scripts/compare_structure.py reference.md out/reference-ja.md
# « structure identique », ou la liste des écarts — sortie 0 si identique, 1 sinon

Contribuer

git clone https://github.com/jls42/ai-powered-markdown-translator.git
cd ai-powered-markdown-translator
python3 -m venv venv && source venv/bin/activate
pip install -r requirements.txt   # les dépendances, lock entièrement épinglé
pip install -e .                  # le paquet lui-même, en mode éditable

Les deux lignes sont nécessaires : sans pip install -e ., python -m aipmt répond No module named aipmt.

Outillage qualité, optionnel mais recommandé :

pipx install pre-commit               # hors venv — absent des requirements
pip install -r requirements-dev.txt   # detect-secrets, pip-audit, mypy, lizard
pre-commit install                    # hooks rapides à chaque commit
pre-commit install --hook-type pre-push  # mypy, SAST, pip-audit, tests avant chaque push

Les 28 traductions du dépôt (README et CHANGELOG, quatorze langues) se régénèrent avec ./regen_translations.sh --force — Codex et gpt-5.6-sol sur l'abonnement ChatGPT par défaut, quatre en parallèle. REGEN_PROVIDER et REGEN_MODEL changent le chemin : antigravity reste sur un abonnement, celui de Google, et passe sans dérogation ; une API facturée (openai, gemini, grok, openrouter) est refusée sans REGEN_ALLOW_PAID_API=1 ; REGEN_JOB_TIMEOUT plafonne chaque job (600 s, 1 800 s sur Codex et Antigravity). Le détail de l'outillage est dans CLAUDE.md.

Projets utilisant ce script

  • jls42.org — blog personnel publié en 15 langues. Sa veille IA quotidienne est traduite chaque jour par cet outil, et sert de document de référence aux mesures ci-dessus.

Auteur

Julien LE SAUX Email : contact@jls42.org

Licence

GNU GENERAL PUBLIC LICENSE Version 3. Voir LICENSE.

Avertissement

Ce programme est distribué sans aucune garantie, dans les termes des sections 15 et 16 de la GPL v3 : fourni « en l'état », sans garantie de qualité marchande ni d'adéquation à un usage particulier, et son auteur ne peut être tenu responsable d'un dommage résultant de son utilisation. Le texte de la licence prime sur ce résumé.

  • Relisez avant de publier. Les protections couvrent les blocs de code, le code en ligne, les URL, les ancres et les citations du mode --news — ni les titres, ni les tableaux, ni le front matter, ni le sens de vos phrases.
  • Vos documents partent chez le fournisseur choisi, sous ses conditions d'utilisation et sa politique de données. Certains modèles gratuits peuvent réutiliser vos échanges pour l'entraînement, et les conditions d'Antigravity permettent à Google de les réutiliser et de les faire relire par des humains, abonnement payant compris ; un modèle local est la seule voie qui ne fasse sortir aucune donnée de votre machine.
  • Les appels d'API vous sont facturés. Ce programme ne plafonne pas la dépense : un document long, une reprise après échec ou un modèle qui raisonne beaucoup coûtent davantage.
  • Les mesures publiées sont des observations datées, pas des garanties.

Les noms de produits et de sociétés cités appartiennent à leurs détenteurs respectifs. Ce projet n'est affilié à aucun d'entre eux.

Metadata

Release files for ai-powered-markdown-translator 1.16.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ai-powered-markdown-translator 1.16.0
File Size Uploaded Provenance
ai_powered_markdown_translator-1.16.0.tar.gz 302.6 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for ai-powered-markdown-translator 1.16.0
File Interpreter ABI Platform
ai_powered_markdown_translator-1.16.0-py3-none-any.whl Python 3 none any Details

Total release size: 456.9 kB

Release files / ai_powered_markdown_translator-1.16.0.tar.gz

Download URL ai_powered_markdown_translator-1.16.0.tar.gz
Size 302.6 kB
Tags Source
SHA-256 checksum
How to use checksums
0a3d3d9a598a03a65330b3b77cb2117eed5d7425083e754209479cf879c79548
BLAKE2b-256 checksum
How to use checksums
49dd1b80a923c8f88adbcf64b8627b5a3885ac5ff3b8039c52799770eb1b9ab7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 26, 2026.

Transparency log

Release files / ai_powered_markdown_translator-1.16.0-py3-none-any.whl

Download URL ai_powered_markdown_translator-1.16.0-py3-none-any.whl
Size 154.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
0351c0e006ff317641f3dfa2d67dbd2df768a3be8d18cc4c9cfe47213d8b6702
BLAKE2b-256 checksum
How to use checksums
8c3f49f168a535edf17a14e26c98c4d4c6a5ba0c52a0c36e31a9cdc49d037fdd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 26, 2026.

Transparency log

Security for ai-powered-markdown-translator 1.16.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for ai_powered_markdown_translator-1.16.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 26, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page