Pourquoi les agents IA ont-ils besoin d'un chemin différent dans votre application ?
Une part croissante des requêtes vers votre application provient d'agents IA: assistants qui récupèrent de la documentation pour un utilisateur, outils de recherche qui lisent des pages produit, workflows autonomes qui appellent votre API. La plupart d'entre eux travaillent à travers des interfaces conçues pour des personnes. Ils téléchargent des pages HTML complètes, analysent les mises en page, suivent une navigation pensée pour une souris, et relancent les requêtes quand une page lourde en scripts ne s'affiche pas comme prévu.
C'est inefficace pour tout le monde. Les agents reçoivent un contenu bruyant et commettent des erreurs. Vos serveurs dépensent des ressources à afficher des pages que personne ne regarde. Et le trafic est difficile à interpréter, parce qu'il ressemble à un navigateur qui se comporte bizarrement. Si vous n'êtes pas encore certain de la part de votre trafic concernée, commencez par comment savoir si le trafic d'un site web provient d'agents IA.
Une meilleure approche consiste à donner aux agents un chemin structuré: du contenu et des actions dans des formats conçus pour les programmes, découvrables à des emplacements standard, avec des limites qui récompensent les clients qui s'identifient correctement. Ce guide montre comment faire cela sans construire une seconde application.
Étape 1: Décidez ce que les agents doivent pouvoir faire
Commencez par l'intention, pas par la technologie. Examinez les routes où vous voyez déjà du trafic d'agents et regroupez-les:
- Lire du contenu: documentation, informations produit, pages tarifaires, articles d'aide, profils publics.
- Interroger des données: recherche, consultation de catalogue, disponibilité, statut.
- Effectuer des actions: créer, mettre à jour ou supprimer quelque chose au nom d'un utilisateur.
La lecture et l'interrogation sont de bons candidats pour un chemin structuré ouvert à tout client qui se comporte correctement. Les actions nécessitent une authentification et une autorisation, quelle que soit la manière dont le client s'identifie, et elles sont couvertes dans le guide sur la protection des actions sensibles.
Étape 2: Proposez des formats adaptés aux machines
Pour les routes de contenu, proposez les mêmes informations sans le chrome de la page. Deux formats couvrent la plupart des besoins:
- Markdown pour le contenu rédigé comme la documentation et les articles, servi avec le type de média
text/markdownenregistré dans RFC 7763. Il conserve les titres, listes, liens et blocs de code, et il est compact. - JSON pour les enregistrements structurés comme les produits, les offres ou le statut.
Utilisez la négociation de contenu pour que l'URL reste la même et que le client demande le format voulu:
import express from "express";
const app = express();
app.get("/docs/:slug", async (req, res) => {
const doc = await loadDoc(req.params.slug);
if (!doc) return res.status(404).end();
res.vary("Accept");
const preferred = req.accepts(["text/html", "text/markdown", "application/json"]);
if (preferred === "text/markdown") {
return res.type("text/markdown; charset=utf-8").send(doc.markdown);
}
if (preferred === "application/json") {
return res.json({ title: doc.title, updatedAt: doc.updatedAt, body: doc.markdown });
}
return res.render("doc", { doc });
});Envoyez un en-tête Vary: Accept (RFC 9110 sur Vary) afin que les caches stockent chaque représentation séparément. Beaucoup d'équipes exposent aussi une URL alternative explicite, par exemple en ajoutant .md à un chemin de documentation, parce que certains clients trouvent cela plus simple que la négociation. Liez-la depuis la page HTML avec <link rel="alternate" type="text/markdown" href="..."> afin qu'elle puisse être découverte. Des liens typés comme celui-ci suivent le modèle Web Linking.
Étape 3: Comment les agents découvrent-ils votre chemin structuré ?
Les agents ne peuvent pas utiliser ce qu'ils ne trouvent pas. Publiez les points d'entrée aux endroits où les clients automatisés regardent déjà:
/llms.txtà la racine du site: un court résumé Markdown de ce que votre site propose, avec des liens vers les pages les plus utiles et leurs versions structurées, conformément à la proposition llms.txt.- Une description d'API comme un document OpenAPI, liée depuis votre documentation développeur et depuis
/llms.txt. - Des liens alternatifs dans les pages HTML pointant vers des versions Markdown ou JSON.
- Un sitemap listant vos URLs de contenu canoniques, au format défini par le protocole Sitemaps.
Un llms.txt minimal:
# Example App
> Example App helps teams plan projects. This file lists the best entry points for automated clients.
## Docs
- [Getting started](https://example.com/docs/getting-started.md): setup in five steps
- [API reference](https://example.com/openapi.json): OpenAPI description of the public API
## Policies
- [Automated access](https://example.com/docs/automated-access.md): limits and how to sign requestsGardez une page qui explique vos règles pour les clients automatisés: quelles routes sont ouvertes, quelles limites s'appliquent, et comment un client peut s'identifier avec des requêtes signées pour recevoir un meilleur traitement. Des règles claires transforment l'approximation en coopération.
Étape 4: Routez selon la classe d'acteur, pas selon la chaîne user agent
Une fois que vous avez des réponses structurées, décidez qui les obtient par défaut. Utilisez la classe d'acteur et sa base plutôt que d'analyser les chaînes user agent au cas par cas. Les opérateurs d'IA publient bien leurs user agents, comme OpenAI et Anthropic le font pour leurs crawlers et fetchers, mais une correspondance de chaîne reste une simple déclaration.
type ActorClass = "human" | "human_ai" | "agent" | "unknown";
type Basis = "verified" | "declared" | "inferred" | "unknown";
function preferStructured(actor: ActorClass, basis: Basis, accept: string): boolean {
if (accept.includes("text/markdown") || accept.includes("application/json")) return true;
return actor === "agent" && (basis === "verified" || basis === "declared");
}Deux principes gardent cela sûr:
- Les demandes explicites gagnent toujours. Si un client demande du Markdown ou du JSON, servez-le, quelle que soit la classe.
- Les valeurs par défaut ne retirent jamais rien. Un visiteur Human ou Unknown reçoit toujours la page complète. Choisir une valeur par défaut structurée pour les agents change le format, pas ce qu'ils sont autorisés à voir.
Étape 5: Quels limites de débit les agents IA devraient-ils recevoir ?
Les limites de débit sont l'endroit où le contexte d'acteur devient le plus visible. Au lieu d'une seule limite pour tout le monde, donnez à chaque combinaison de classe et de base un budget adapté:
| Acteur et base | Routes de lecture | Notes |
|---|---|---|
| Agent, Verified | Limite plus élevée | L'opérateur est identifiable et responsable |
| Agent, Declared ou Inferred | Limite standard | Les déclarations ne sont pas vérifiables |
| Unknown | Limite standard | Ne jamais être punitif par défaut |
| Human ou Human + AI | Limite standard | L'usage interactif atteint rarement les limites |
Bornez la limite avec l'identifiant le plus stable disponible. Pour les agents vérifiés, c'est l'origine de l'opérateur et l'identifiant de clé. Pour les autres, utilisez l'identifiant d'accès ou une clé au niveau réseau.
function limitKey(actor: { actor: ActorClass; basis: Basis; operator?: string }, ip: string, apiKey?: string) {
if (actor.actor === "agent" && actor.basis === "verified" && actor.operator) return `op:${actor.operator}`;
if (apiKey) return `key:${apiKey}`;
return `ip:${ip}`;
}
function limitFor(actor: { actor: ActorClass; basis: Basis }): number {
if (actor.actor === "agent" && actor.basis === "verified") return 600;
return 120;
}Les chiffres sont des espaces réservés. Définissez les vôtres à partir de la base observée. Lorsqu'un client dépasse une limite, renvoyez 429 Too Many Requests avec un en-tête Retry-After et un lien vers votre page d'accès automatisé. Les agents bien conçus ralentissent et la lisent.
Étape 6: Gardez les actions derrière l'autorisation
Un chemin structuré pour la lecture n'est pas un détour autour de votre modèle de sécurité. Toute action qui modifie des données nécessite toujours:
- une authentification avec un identifiant émis par votre application,
- une autorisation pour cette action précise, et
- les vérifications supplémentaires requises par le niveau de risque de la route.
Une signature vérifiée vous dit quel client appelle. Elle ne vous dit pas que ce client peut agir pour un utilisateur donné. Gardez ces questions séparées. Notre article sur ce que prouvent les requêtes signées d'agents IA explique la différence.
Étape 7: Mesurez l'effet
Exécutez d'abord le chemin structuré en mode observation, puis comparez:
- la part des requêtes d'agents qui utilisent des formats structurés,
- le coût serveur et la latence pour le trafic d'agents avant et après,
- les taux d'erreur et de relance pour les clients agents,
- combien de clients automatisés passent de declared à verified une fois que vous publiez vos consignes de signature.
Ces chiffres montrent si le chemin structuré remplit son rôle et où l'étendre ensuite.
Étape 8: Versionnez et documentez le chemin structuré
Traitez le chemin structuré comme une interface publique, car les agents vont construire dessus. Quelques habitudes le rendent fiable:
- Gardez des URLs stables. Si un agent a appris que
/docs/getting-started.mdexiste, cela doit continuer de fonctionner. Quand le contenu change d'emplacement, renvoyez une301vers le nouvel emplacement plutôt qu'une404. - Incluez les heures de mise à jour. Placez un champ
updatedAtdans les réponses JSON et un en-têteLast-Modifiedsur Markdown, afin que les agents puissent mettre en cache de manière sensée et ne rafraîchir que lorsque quelque chose a changé. - Prenez en charge les requêtes conditionnelles. Répondez à
If-None-MatchetIf-Modified-Sinceavec304 Not Modified. Les agents qui sondent votre contenu coûtent bien moins cher lorsqu'ils peuvent revalider au lieu de tout télécharger à nouveau. - Versionnez les changements cassants. Si une forme JSON doit changer, ajoutez un nouveau chemin de version ou un nouveau type de média et conservez l'ancien pendant une période publiée.
- Publiez un changelog pour la page d'accès automatisé. Les opérateurs d'agents bien comportés le lisent, et cela vous donne un endroit pour annoncer de nouvelles routes structurées.
app.get("/api/plans", async (req, res) => {
const plans = await loadPlans();
const etag = `"${plans.version}"`;
res.set("ETag", etag);
res.set("Cache-Control", "public, max-age=300");
if (req.get("if-none-match") === etag) return res.status(304).end();
return res.json({ updatedAt: plans.updatedAt, plans: plans.items });
});Ces pratiques profitent aussi à votre frontend et à vos intégrations partenaires. Un chemin structuré, stable, cacheable et documenté devient rapidement la manière la plus simple pour tout programme de travailler avec votre application.
Pièges courants
- Servir des faits différents aux agents et aux personnes. La version structurée doit contenir les mêmes informations que la page. Un contenu divergent déroute les utilisateurs qui interrogent un assistant sur votre produit.
- Cacher le chemin structuré. S'il n'est pas lié depuis
/llms.txt, vos docs API ou les pages elles-mêmes, les agents continueront à aspirer le HTML. - Récompenser les déclarations. Les limites plus élevées doivent être réservées aux clients vérifiés. Une chaîne user agent copiée ne devrait pas ouvrir un budget plus important.
- Oublier les caches. Sans
Vary: Accept, un cache peut servir du Markdown à un navigateur.
Où Proof of Actor s'insère
Proof of Actor vous donne la classe d'acteur et la base dont vous avez besoin pour router les agents vers du contenu structuré et définir des limites équitables. Il détecte les agents signés, déclarés et inférés, vous aide à comprendre comment ils utilisent vos routes, et laisse la décision de routage dans votre code.
Pour concevoir un chemin structuré pour votre propre application avec notre équipe, demandez un accès anticipé. Pour les scénarios API et MCP en particulier, consultez APIs et MCP Servers, et lisez qui appelle votre serveur MCP ? pour voir comment le contexte d'acteur s'applique aux appels d'outils Model Context Protocol.
Sources
- RFC 9110: HTTP Semantics: négociation de contenu (Section 12),
Vary(Section 12.5.5), requêtes conditionnelles (Section 13) etRetry-After(Section 10.2.3) - RFC 7763: The text/markdown Media Type: servir des représentations Markdown
- RFC 8288: Web Linking: liens typés
alternate - RFC 6585: Additional HTTP Status Codes, Section 4:
429 Too Many Requests - proposition llms.txt: le format de fichier
/llms.txt - OpenAPI Specification: descriptions d'API lisibles par machine
- Sitemaps protocol: format de fichier sitemap
- OpenAI: Overview of OpenAI Crawlers: user agents et plages d'IP publiés par OpenAI
- Anthropic: crawler and fetcher documentation: ClaudeBot, Claude-User et Claude-SearchBot
- Model Context Protocol specification (2026-07-28): la révision actuelle de MCP en novembre 2026