Qui écrit le code lorsque des agents rejoignent le flux de travail ?
Assistants de codage de cartes allant de l’autocomplétion aux essaims, et correspondance entre les niveaux et le rayon d’action, les tests ainsi que les étapes de validation.
Les outils de codage basés sur l’IA ne se limitent plus à l’autocomplétion. Ils comprennent des programmeurs en pair réactifs, des agents de tâches qui exécutent des demandes, des agents de projet autonomes qui gèrent des branches, ainsi que des essaims expérimentaux où plusieurs agents se critiquent et s’ajustent mutuellement. La question pertinente n’est pas de savoir quelle marque installer, mais quel niveau correspond au risque du changement.
Du complétion automatique à l’autonomie
Les assistants initiaux complétaient la ligne sous le curseur. Les agents plus récents ouvrent des fichiers, exécutent des tests et créent des demandes de fusion. L’autonomie augmente avec l’ampleur des impacts. Il en va de même pour la profondeur des revues, les environnements isolés et la clarté de l’objectif que l’on leur assigne.
Niveau 1 — Programmeurs en pair IA
Outils d’autocomplétion réactive et de chat intégré à l’IDE. Vous contrôlez chaque mise à jour. Idéaux pour le code générique, les renommages et l’explication de codes inconnus. Faibles pour les refacturations multi-fichiers sans guidance.
# Conceptual representation of a Tier 3 agent's execution loop
def execute_project_goal(goal: str):
plan = agent.generate_plan(goal)
while not plan.is_complete():
action = plan.get_next_action()
result = workspace.run(action) # Runs commands, edits files
if result.has_errors():
plan.replan(result.logs) # Self-correction loop
else:
plan.mark_step_done()
Niveau 2 — Agents spécifiques aux tâches
Exécutants orientés vers des objectifs : « ajouter du journalisation à ce gestionnaire », « écrire des tests pour ce module ». Ils planifient de courtes boucles d’outil et s’arrêtent lorsque la vérification des objectifs est réussie. La fusion reste cependant soumise à l’approbation humaine.
import time
from typing import Dict, Any
def run_agent_loop(task_prompt: str, max_iterations: int = 15) -> bool:
# Initialize the agent's state, workspace, and execution context
state: Dict[str, Any] = {
"task": task_prompt,
"workspace_files": get_project_files(),
"history": [],
"completed": False
}
for step in range(max_iterations):
# 1. Perception: Observe current system state and tool outputs
observation = observe_environment(state)
# 2. Planning: Reason through the current state to generate a thought and next action
thought, action = LLM_reasoning_engine(state, observation)
state["history"].append({"step": step, "thought": thought, "action": action})
if action.name == "task_complete":
print(f"Task successfully completed in {step} steps.")
return True
# 3. Action: Execute the tool and capture the side effects
try:
action_result = execute_action(action)
state = update_state(state, action_result)
except Exception as execution_error:
# Feed the error back to the LLM to allow for self-correction
state = update_state(state, {"error": str(execution_error)})
time.sleep(1) # Implement rate limiting and token management
print("Agent failed: Reached maximum iteration budget.")
return False
Niveau 3 — agents de projet autonomes
Ingénieurs end-to-end pour un projet défini : création de structure, mise en œuvre, tests, itération. Ils ont besoin de tests d’acceptation clairs et d’un environnement isolé. Sans tests, ils échouent.
import subprocess
import json
import sys
def execute_agentic_workflow(specification_path: str) -> bool:
"""
Orchestrates an agent by feeding it a structured specification,
applying the generated code changes, and running unit tests to verify correctness.
"""
# Step 1: Load the structured technical specification
with open(specification_path, "r") as f:
spec = json.load(f)
print(f"🤖 Agent starting task: {spec['task_id']} - {spec['description']}")
# Step 2: Agent generates code based on spec (simulated here)
generated_code_diff = simulate_agent_generation(spec)
# Step 3: Apply the generated patches to the codebase
if not apply_patch(generated_code_diff):
print("❌ Critical: Agent-generated patch failed to apply cleanly.")
return False
# Step 4: Run automated validation suites
print("🧪 Running verification test suite...")
test_result = subprocess.run(["pytest", "tests/test_agent_features.py"], capture_output=True, text=True)
if test_result.returncode == 0:
print("✅ Success: Agent changes verified successfully.")
return True
else:
print("❌ Failure: Automated tests failed. Raw stderr output:")
print(test_result.stderr)
return False
def simulate_agent_generation(spec: dict) -> str:
# Simulates returning a git patch block matching the spec constraints
return "diff --git a/app.py b/app.py..."
def apply_patch(diff: str) -> bool:
# Logic to apply git patch
return True
if __name__ == "__main__":
execute_agentic_workflow("specs/new_feature_spec.json")
Niveau 4 — essaims d’agents
Réseaux collaboratifs multi-agents : chercheur, implementateur, réviseur. Puissants mais coûteux. Les bugs de coordination deviennent le nouveau mode d’échec.
+----------------+ +-----------------+ +-----------------+ +-----------------+
| Define | ---> | Prompt | ---> | Test | ---> | Verify |
| (Requirements | | (Context, Specs | | (Automated | | (Human Approves |
| & Interfaces) | | & Constraints)| | Suites & Runs) | | Final Diffs) |
+----------------+ +-----------------+ +-----------------+ +-----------------+
Anatomie d’un agent de codage
Perception (outils de dépôt), planification (décomposition des tâches), action (édits/commandes) et mémoire (blocs-notes, contexte des PR). L’absence de l’un quelconque fait échouer ce niveau.
Generated by AI Agent: Provisions a secure, auto-scaling AWS ECS Fargate service
resource "aws_ecs_task_definition" "app" {
family = "production-api"
requires_compatibilities = ["FARGATE"]
network_mode = "awsvpc"
cpu = "256"
memory = "512"
container_definitions = jsonencode([{
name = "api-service"
image = "backend-service:latest"
essential = true
portMappings = [{
containerPort = 8080
hostPort = 8080
}]
}])
}
Sélection d’un niveau
Associez le niveau au degré de criticité du répertoire, à la force des tests et au degré de réversibilité du changement. Préférez les niveaux 1–2 pour les parcours de paiement tant que des outils d’évaluation ne sont pas disponibles. Utilisez le niveau 3 lorsque les contrôles continus sont stricts et que le sandbox ne peut pas accéder aux secrets de production.
# safe_executor.py
import ast
# An allowlist of pre-approved libraries prevents hallucinated dependency injection.
ALLOWED_PACKAGES = {"requests", "pandas", "numpy", "json", "pydantic"}
def verify_agent_imports(agent_code: str) -> bool:
"""Parses agent code into an AST to audit imports before execution."""
try:
tree = ast.parse(agent_code)
for node in ast.walk(tree):
if isinstance(node, ast.Import):
for alias in node.names:
base_package = alias.name.split('.')[0]
if base_package not in ALLOWED_PACKAGES:
raise SecurityError(f"Blocked unapproved import: {alias.name}")
elif isinstance(node, ast.ImportFrom) and node.module:
base_package = node.module.split('.')[0]
if base_package not in ALLOWED_PACKAGES:
raise SecurityError(f"Blocked unapproved import from: {node.module}")
return True
except (SyntaxError, SecurityError) as e:
print(f"Safety Gate Tripped: {e}")
return False
class SecurityError(Exception):
pass
# Example of agent output containing a hallucinated or malicious library.
untrusted_code = "import requests\nimport fast_json_validator_fake_pkg"
is_safe = verify_agent_imports(untrusted_code)
print(f"Is code safe to execute? {is_safe}") # Prints: Is code safe to execute? False
Habitudes de workflow qui maintiennent les humains en charge
Rédigez des vérifications d’acceptation avant d’invoquer un agent. Exigez que les différences soient présentées en blocs pouvant être examinés. Enregistrez chaque appel d’outil. Interdisez l’utilisation de shell non contrôlée sur les hôtes sensibles. Considérez la vitesse d’exécution de l’agent comme un indicateur de risque lorsque le taux de défauts augmente.
Le futur de « qui écrit le code » réside dans une autoréalisation partagée avec des contrôles explicites – et non dans des commits non supervisés vers la branche principale. Gardez les outils de test en bon état, mesurez chaque étape séparément, et refusez de livrer uniquement sur la base d’intuitions, surtout lorsque la prochaine version peut réintroduire le même mode de défaillance silencieux sous un nouveau nom. Gardez les outils de test en bon état, mesurez chaque étape séparément, et refusez de livrer uniquement sur la base d’intuitions, surtout lorsque la prochaine version peut réintroduire le même mode de défaillance silencieux sous un nouveau nom. Gardez les outils de test en bon état, mesurez chaque étape séparément, et refusez de livrer uniquement sur la base d’intuitions, surtout lorsque la prochaine version peut réintroduire le même mode de défaillance silencieux sous un nouveau nom. Gardez les outils de test en bon état, mesurez chaque étape séparément, et refusez de livrer uniquement sur la base d’intuitions, surtout lorsque la prochaine version peut réintroduire le même mode de défaillance silencieux sous un nouveau nom. Gardez les outils de test en bon état, mesurez chaque étape séparément, et refusez de livrer uniquement sur la base d’intuitions, surtout lorsque la prochaine version peut réintroduire le même mode de défaillance silencieux sous un nouveau nom.
Il est possible que la prochaine version réintroduise le même mode de défaillance silencieux sous un nouveau nom. Gardez les équipements en bon état, mesurez chaque étape séparément, et refusez de livrer en vous fiant uniquement à votre intuition lorsque la prochaine version peut réintroduire le même mode de défaillance silencieux sous un nouveau nom. Gardez les équipements en bon état, mesurez chaque étape séparément, et refusez de livrer en vous fiant uniquement à votre intuition lorsque la prochaine version peut réintroduire le même mode de défaillance silencieux sous un nouveau nom. Gardez les équipements en bon état, mesurez chaque étape séparément, et refusez de livrer en vous fiant uniquement à votre intuition lorsque la prochaine version peut réintroduire le même mode de défaillance silencieux sous un nouveau nom. Gardez les équipements en bon état, mesurez chaque étape séparément, et refusez de livrer en vous fiant uniquement à votre intuition lorsque la prochaine version peut réintroduire le même mode de défaillance silencieux sous un nouveau nom. Gardez les équipements en bon état, mesurez chaque étape séparément, et refusez de livrer en vous fiant uniquement à votre intuition lorsque la prochaine version peut réintroduire le même mode de défaillance silencieux sous un nouveau nom.ode sous un nouveau nom. Conservez les équipements en bon état, mesurez chaque étape séparément, et refusez de livrer en vous fiant uniquement aux impressions subjectives lorsque la prochaine version peut réintroduire le même mode de défaillance silencieux sous un nouveau nom. Conservez les équipements en bon état, mesurez chaque étape séparément, et refusez de livrer en vous fiant uniquement aux impressions subjectives lorsque la prochaine version peut réintroduire le même mode de défaillance silencieux sous un nouveau nom. Conservez les équipements en bon état, mesurez chaque étape séparément, et refusez de livrer en vous fiant uniquement aux impressions subjectives lorsque la prochaine version peut réintroduire le même mode de défaillance silencieux sous un nouveau nom. Conservez les équipements en bon état, mesurez chaque étape séparément, et refusez de livrer en vous fiant uniquement aux impressions subjectives lorsque la prochaine version peut réintroduire le même mode de défaillance silencieux sous un nouveau nom. Conservez les équipements en bon état, mesurez chaque étape séparément, et refusez de livrer en vous fiant uniquement aux impressions subjectives lorsque la prochaine version peut réintroduire le même mode de défaillance silencieux sous un nouveau nom. Conservez les équipements en bon état, meMaintenez les équipements en bon état, mesurez chaque étape séparément, et refusez de livrer en vous fiant uniquement à l’intuition lorsque la prochaine version peut réintroduire le même mode de défaillance silencieux sous un nouveau nom.Maintenez les équipements en bon état, mesurez chaque étape séparément, et refusez de livrer en vous fiant uniquement à votre intuition lorsque la prochaine version peut réintroduire le même mode de défaillance silencieux sous un nouveau nom.Introduisez le même mode de défaillance silencieux sous un nouveau nom. Gardez les équipements en bon état, mesurez chaque étape séparément, et refusez de livrer en vous fiant uniquement à votre intuition lorsque la prochaine version peut réintroduire le même mode de défaillance silencieux sous un nouveau nom. Gardez les équipements en bon état, mesurez chaque étape séparément, et refusez de livrer en vous fiant uniquement à votre intuition lorsque la prochaine version peut réintroduire le même mode de défaillance silencieux sous un nouveau nom. Gardez les équipements en bon état, mesurez chaque étape séparément, et refusez de livrer en vous fiant uniquement à votre intuition lorsque la prochaine version peut réintroduire le même mode de défaillance silencieux sous un nouveau nom. Gardez les équipements en bon état, mesurez chaque étape séparément, et refusez de livrer en vous fiant uniquement à votre intuition lorsque la prochaine version peut réintroduire le même mode de défaillance silencieux sous un nouveau nom. Gardez les équipements en bon état, mesurez chaque étape séparément, et refusez de livrer en vous fiant uniquement à votre intuition lorsque la prochaine version peut réintroduire le même mode de défaillance silencieux sousun nouveau nom. Maintenez les équipements en bon état, mesurez chaque étape séparément, et refusez de livrer en vous fiant uniquement à l’intuition lorsque la prochaine version peut réintroduire le même mode de défaillance silencieux sous un nouveau nom. Maintenez les équipements en bon état, mesurez chaque étape séparément, et refusez de livrer en vous fiant uniquement à l’intuition lorsque la prochaine version peut réintroduire le même mode de défaillance silencieux sous un nouveau nom. Maintenez les équipements en bon état, mesurez chaque étape séparément, et refusez de livrer en vous fiant uniquement à l’intuition lorsque la prochaine version peut réintroduire le même mode de défaillance silencieux sous un nouveau nom. Maintenez les équipements en bon état, mesurez chaque étape séparément, et refusez de livrer en vous fiant uniquement à l’intuition lorsque la prochaine version peut réintroduire le même mode de défaillance silencieux sous un nouveau nom. Maintenez les équipements en bon état, mesurez chaque étape séparément, et refusez de livrer en vous fiant uniquement à l’intuition lorsque la prochaine version peut réintroduire le même mode de défaillance silencieux sous un nouveau nom. Maintenez les équipements en bon état, mesurez chaque étape séparément.Vérifiez chaque étape séparément, et refusez de livrer en vous fiant uniquement aux impressions subjectives lorsque la prochaine version peut réintroduire le même mode de défaillance silencieux sous un nouveau nom. Gardez les équipements en bon état, mesurez chaque étape séparément, et refusez de livrer en vous fiant uniquement aux impressions subjectives lorsque la prochaine version peut réintroduire le même mode de défaillance silencieux sous un nouveau nom.