Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Modes de permission d’un agent de code

Après cette leçon: Je peux lancer le même agent en modes demande, plan et auto, et dire ce que chacun laisse passer et ce qui demande toujours.

Leçon de 65 min6 commandesLab agent de code IA : utiliser opencode pour expliquer et corriger du code, et vérifier son travail

Un agent, trois niveaux de confiance

Un mode de permission décide ce qu’un agent peut faire sans demander. En mode plan, il ne fait que lire. En mode demande, il demande avant de rien modifier. En mode auto, il travaille seul dans des limites.

Le même agent est sûr à laisser tourner dans un mode et dangereux dans un autre. Le mode se choisit donc à chaque exécution.

À la fin de cette leçon

Remarque

Je peux lancer le même agent en modes demande, plan et auto, et dire ce que chacun laisse passer et ce qui demande toujours.

Mots clés

MotCe que ça veut dire
Modeun réglage qui décide ce qui s’exécute sans demander
Mode planun mode qui ne fait que lire
Risquele mal qu’une action peut faire
Liste autoriséedes commandes approuvées d’avance
Chemin protégéun fichier qui demande toujours une approbation
Approbationle oui ou le non de la personne pour une action

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Un mode est un réglage, pas un prompt

Vous pourriez écrire « ne modifie jamais les fichiers » dans le prompt. Un modèle peut quand même le faire, car un prompt est une demande.

Un mode est du code dans le harnais. Chaque action passe par une fonction avant de s’exécuter. En mode plan, cette fonction refuse une écriture, quoi que dise le modèle. Il ne voit aucun moyen de la contourner.

Les règles se vérifient dans l’ordre

Donnez à chaque action un risque : lecture, écriture, exécution ou destructif. Décidez ensuite par mode, avec des règles dans un ordre fixe. Le mode plan passe en premier, car il refuse plus que les autres.

Ensuite, un chemin protégé ou une action destructive demande toujours. Seulement après, un mode assouplit quelque chose. Une liste autorisée laisse le mode auto lancer des commandes nommées sans demander.

Ce que fait chaque mode de chaque risque

RisquePlanDemandeAuto
LectureAutoriserAutoriserAutoriser
ÉcritureRefuserDemanderAutoriser
ExécutionRefuserDemanderAutoriser si listée
DestructifRefuserDemanderDemander
Chemin protégéRefuserDemanderDemander

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Une erreur courante

Attention

Beaucoup demandent une approbation pour chaque action. Les gens finissent par cliquer oui sans lire. Ne demandez que là où cela compte : chemins protégés, actions destructives et commandes hors de la liste.

Écrire l’assistant du modèle, partie 1

Commande
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const base = process.env.AI_URL || \"http://ai:4000\";' '// Les jetons d’une réponse, ou null si elle n’en donne pas.' 'function compter(donnees, nom) {' '  return donnees.usage && typeof donnees.usage[nom] === \"number\" ? donnees.usage[nom] : null;' '}' > model.js"

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Écrire l’assistant du modèle, partie 2

Commande
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function demander(messages, echantillon, max) {' '  try {' '    const res = await fetch(base + \"/v1/chat/completions\", {' '      method: \"POST\",' '      headers: { \"content-type\": \"application/json\", authorization: \"Bearer lab\" },' '      body: JSON.stringify({ model: \"lab\", messages: messages, max_tokens: max || 100 }),' '      signal: AbortSignal.timeout(30000),' '    });' '    if (res.ok === false) throw new Error(\"statut \" + res.status);' '    const d = await res.json();' '    return { texte: d.choices[0].message.content, entree: compter(d, \"prompt_tokens\"), sortie: compter(d, \"completion_tokens\"), enregistre: false };' '  } catch (erreur) {' '    console.log(\"Échantillon enregistré : aucun modèle n’a répondu (\" + erreur.message + \").\");' '    return { texte: echantillon, entree: null, sortie: null, enregistre: true };' '  }' '}' 'module.exports = { demander };' >> model.js"

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Écrire le vérificateur de modes, partie 1

Commande
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { demander } = require(\"./model\");' 'const AUTORISES = [\"pytest\"];' 'const actions = [' '  { outil: \"lire_fichier\", risque: \"lecture\", cible: \"src/app.py\" },' '  { outil: \"ecrire_fichier\", risque: \"ecriture\", cible: \"src/app.py\" },' '  { outil: \"executer\", risque: \"execution\", cible: \"pytest\" },' '  { outil: \"executer\", risque: \"execution\", cible: \"curl site\" },' '  { outil: \"supprimer_fichier\", risque: \"destructif\", cible: \"src/ancien.py\" },' '  { outil: \"lire_fichier\", risque: \"lecture\", cible: \".env\" },' '];' > modes3.js"

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Écrire le vérificateur de modes, partie 2

Commande
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function protege(c) {' '  return c === \".env\" || c.startsWith(\".env.\") || c.startsWith(\".git/\") || c.toLowerCase().includes(\"secret\");' '}' 'function decider(mode, a) {' '  if (mode === \"plan\") return a.risque === \"lecture\" && protege(a.cible) === false ? \"autoriser\" : \"refuser\";' '  if (protege(a.cible) || a.risque === \"destructif\") return \"demander\";' '  if (mode === \"demande\") return a.risque === \"lecture\" ? \"autoriser\" : \"demander\";' '  if (a.risque === \"execution\") return AUTORISES.includes(a.cible) ? \"autoriser\" : \"demander\";' '  return \"autoriser\";' '}' >> modes3.js"

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Écrire le vérificateur de modes, partie 3

Commande
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' '  for (const a of actions) {' '    const ligne = [\"demande\", \"plan\", \"auto\"].map(function (m) { return m + \":\" + decider(m, a); });' '    console.log(a.outil + \" \" + a.cible + \" -> \" + ligne.join(\" \"));' '  }' '  const q = \"Un agent veut supprimer src/ancien.py. Écrivez une courte phrase qui demande à la personne de l’approuver.\";' '  const reponse = await demander([{ role: \"user\", content: q }], \"L’agent veut supprimer src/ancien.py. Autorisez-vous cette action ?\", 40);' '  console.log(\"question affichée : \" + reponse.texte);' '}' 'main();' >> modes3.js"

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Lancer les actions en trois modes

Commande
docker exec -w /home/node/project agent node modes3.js

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Les décisions n’ont pas besoin du modèle

Les six lignes viennent de la seule fonction de décision, donc elles sont les mêmes pour chaque étudiant. Le Run fait ensuite un court appel, pour formuler la question qu’une personne verrait avant une suppression.

Sans modèle, il affiche un échantillon enregistré pour cette seule ligne.

Une sortie possible

LigneCe qu’elle montre
lire_fichier src/app.py -> demande:autoriser plan:autoriser auto:autoriserUne lecture simple passe partout
ecrire_fichier src/app.py -> demande:demander plan:refuser auto:autoriserSeul auto laisse passer une écriture
executer pytest -> demande:demander plan:refuser auto:autoriserElle est dans la liste autorisée
executer curl site -> demande:demander plan:refuser auto:demanderHors liste : auto demande
supprimer_fichier src/ancien.py -> demande:demander plan:refuser auto:demanderUne suppression demande toujours
lire_fichier .env -> demande:demander plan:refuser auto:demanderUn chemin protégé demande toujours

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

À propos de ce labo et de sa source: Lab agent de code IA : utiliser opencode pour expliquer et corriger du code, et vérifier son travail

Vous enseignez à une classe ? Proposez ce module à vos étudiants avec un guide de l'enseignant, des devoirs corrigés et un laboratoire pour chaque étudiant.