Главная / Статьи / Кто пишет код, когда агенты присоединяются к рабочему процессу?

Кто пишет код, когда агенты присоединяются к рабочему процессу?

Помощники по кодированию карт — от автодополнения до стай, а также соответствие уровней радиусу взрыва, тестам и этапам проверки.

2200 слов

Инструменты программирования с ИИ уже не ограничиваются функцией автодополнения. Они включают реактивных партнеров-программистов, агентов для выполнения задач, автономных проектных агентов, управляющих ветками кода, а также экспериментальные системы, в которых несколько агентов взаимно проверяют и исправляют код. Важный вопрос заключается не в том, какой бренд выбрать, а в том, какой уровень соответствует степени риска внесения изменений.

Ранние ассистенты просто заполняли строку под курсором. Современные агенты могут открывать файлы, запускать тесты и создавать запросы на слияние кода. Чем больше масштаб действий агента, тем выше уровень автономии. Соответственно, должна увеличиваться и глубина проверки, использование изолированных сред тестирования, а также четкость поставленных перед ними целей.

Уровень 1 — ИИ-партнеры-программисты

Это реактивные инструменты автодополнения и чата внутри среды разработки. Вы полностью контролируете каждое коммитирование кода. Они наилучшим образом подходят для создания шаблонов, переименования элементов кода и объяснения незнакомого кода. Однако они слабы в рефакторинге нескольких файлов без четких указаний.

# 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()

Уровень 2 — агенты для конкретных задач

Целенаправленные исполнители: «добавить логгинг в этот обработчик», «написать тесты для этого модуля». Они планируют краткие циклы работы с инструментами и прекращают действия, когда проверка цели проходит. Однако для слияния кода всё равно требуется утверждение человека.

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

Уровень 3 — автономные проектные агенты

Инженеры, работающие от начала до конца над определённым проектом: создают структуру, реализуют код, тестируют его и вносят улучшения. Им необходимы чёткие тесты на приемку и изолированная среда. Без тестов они не могут эффективно работать.

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")

Уровень 4 — агентные сети

Совместные сети из нескольких агентов: исследователь, реализатор, рецензент. Мощные, но дорогие. Ошибки в координации становятся новой причиной сбоев.

+----------------+      +-----------------+      +-----------------+      +-----------------+
|     Define     | ---> |     Prompt      | ---> |      Test       | ---> |     Verify      |
|  (Requirements |      | (Context, Specs |      |   (Automated    |      | (Human Approves |
|  & Interfaces) |      |   & Constraints)|      |  Suites & Runs) |      |   Final Diffs)  |
+----------------+      +-----------------+      +-----------------+      +-----------------+

Структура кодирующего агента

Восприятие (инструменты репозитория), планирование (разбиение задач), действие (изменения/команды) и память (записные книжки, контекст PR). Отсутствие хотя бы одного из этих элементов приводит к срыву работы агента.

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
    }]
  }])
}

Выбор уровня

Соотносите уровень сложности с критичностью репозитория, степенью надежности тестов и возможностью обратного внесения изменений. Предпочитайте уровни 1–2 для путей обработки платежей до появления инструментов для оценки. Используйте уровень 3 там, где процессы интеграции строги и среда тестирования не может иметь доступ к конфиденциальной информации продакшена.

# 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

Привычки рабочего процесса, которые сохраняют контроль у людей

Пишите проверки принятия перед запуском агента. Требуйте предоставления различий в проверяемых частях кода. Фиксируйте каждый вызов инструмента. Запрещайте использование неограниченного шелла на чувствительных хостах. Рассматривайте скорость работы агента как показатель риска при увеличении количества дефектов.

Будущее тех, кто пишет код, — это совместная работа с четкими контрольными точками, а не неконтролируемые коммиты в основную ветку. Сохраняйте фикстчеры в рабочем состоянии, измеряйте каждый этап отдельно и не соглашайтесь на выпуск, основываясь только на интуиции, если следующая версия может снова привести к тому же скрытому сбою под новым названием. Сохраняйте фикстчеры в рабочем состоянии, измеряйте каждый этап отдельно и не соглашайтесь на выпуск, основываясь только на интуиции, если следующая версия может снова привести к тому же скрытому сбою под новым названием. Сохраняйте фикстчеры в рабочем состоянии, измеряйте каждый этап отдельно и не соглашайтесь на выпуск, основываясь только на интуиции, если следующая версия может снова привести к тому же скрытому сбою под новым названием. Сохраняйте фикстчеры в рабочем состоянии, измеряйте каждый этап отдельно и не соглашайтесь на выпуск, основываясь только на интуиции, если следующая версия может снова привести к тому же скрытому сбою под новым названием. Сохраняйте фикстчеры в рабочем состоянии, измеряйте каждый этап отдельно и не соглашайтесь на выпуск, основываясь только на интуиции, если следующая версия может снова привести к тому же скрытому сбою под новым названием.

ase может снова ввести тот же самый скрытый режим сбоя под новым названием. Сохраняйте устройства в рабочем состоянии, измеряйте каждый этап отдельно и откажитесь от выпуска, основываясь только на интуиции, если следующая версия может снова ввести тот же самый скрытый режим сбоя под новым названием. Сохраняйте устройства в рабочем состоянии, измеряйте каждый этап отдельно и откажитесь от выпуска, основываясь только на интуиции, если следующая версия может снова ввести тот же самый скрытый режим сбоя под новым названием. Сохраняйте устройства в рабочем состоянии, измеряйте каждый этап отдельно и откажитесь от выпуска, основываясь только на интуиции, если следующая версия может снова ввести тот же самый скрытый режим сбоя под новым названием. Сохраняйте устройства в рабочем состоянии, измеряйте каждый этап отдельно и откажитесь от выпуска, основываясь только на интуиции, если следующая версия может снова ввести тот же самый скрытый режим сбоя под новым названием. Сохраняйте устройства в рабочем состоянии, измеряйте каждый этап отдельно и откажитесь от выпуска, основываясь только на интуиции, если следующая версия может снова ввести тот же самый скрытый режим сбоя.Ода под новым названием. Сохраняйте фиксатуры в рабочем состоянии, измеряйте каждый этап отдельно и не спешите с выпуском, опираясь только на интуицию, если следующая версия может снова привести к той же скрытой неисправности под новым названием. Сохраняйте фиксатуры в рабочем состоянии, измеряйте каждый этап отдельно и не спешите с выпуском, опираясь только на интуицию, если следующая версия может снова привести к той же скрытой неисправности под новым названием. Сохраняйте фиксатуры в рабочем состоянии, измеряйте каждый этап отдельно и не спешите с выпуском, опираясь только на интуицию, если следующая версия может снова привести к той же скрытой неисправности под новым названием. Сохраняйте фиксатуры в рабочем состоянии, измеряйте каждый этап отдельно и не спешите с выпуском, опираясь только на интуицию, если следующая версия может снова привести к той же скрытой неисправности под новым названием. Сохраняйте фиксатуры в рабочем состоянии, измеряйте каждый этап отдельно и не спешите с выпуском, опираясь только на интуицию, если следующая версия может снова привести к той же скрытой неисправности под новым названием. Сохраняйте фиксатуры в рабочем состоянии, меСледите за тем, чтобы все устройства работали нормально, измеряйте каждый этап отдельно и не спешите с выпуском, если следующая версия может снова привести к той же скрытой неисправности под новым названием.Сосредотачивайтесь только на интуиции, когда следующая версия может снова привести к той же скрытой неисправности под новым названием. Сохраняйте устройства в рабочем состоянии, измеряйте каждый этап отдельно и откажитесь от выпуска, основываясь только на интуиции, когда следующая версия может снова привести к той же скрытой неисправности под новым названием. Сохраняйте устройства в рабочем состоянии, измеряйте каждый этап отдельно и откажитесь от выпуска, основываясь только на интуиции, когда следующая версия может снова привести к той же скрытой неисправности под новым названием. Сохраняйте устройства в рабочем состоянии, измеряйте каждый этап отдельно и откажитесь от выпуска, основываясь только на интуиции, когда следующая версия может снова привести к той же скрытой неисправности под новым названием. Сохраняйте устройства в рабочем состоянии, измеряйте каждый этап отдельно и откажитесь от выпуска, основываясь только на интуиции, когда следующая версия может снова привести к той же скрытой неисправности под новым названием. Сохраняйте устройства в рабочем состоянии, измеряйте каждый этап отдельно и откажитесь от выпуска, основываясь только на интуиции, когда следующая версия может снова привести к той же скрытой неисправности под новым названием. Сохраняйте устройства в рабочем состоянии, измеряйте каждый этап отдельно и откажитесь от выпуска, основываясь только на интуиции, когда следующая версия может снова привести к той же скрытой неисправности под новым названием.внедрять ту же самую скрытую проблему под новым названием. Сохраняйте все элементы в рабочем состоянии, измеряйте каждый этап отдельно и откажитесь от выпуска, основываясь только на интуиции, когда следующая версия может снова ввести ту же самую скрытую проблему под новым названием. Сохраняйте все элементы в рабочем состоянии, измеряйте каждый этап отдельно и откажитесь от выпуска, основываясь только на интуиции, когда следующая версия может снова ввести ту же самую скрытую проблему под новым названием. Сохраняйте все элементы в рабочем состоянии, измеряйте каждый этап отдельно и откажитесь от выпуска, основываясь только на интуиции, когда следующая версия может снова ввести ту же самую скрытую проблему под новым названием. Сохраняйте все элементы в рабочем состоянии, измеряйте каждый этап отдельно и откажитесь от выпуска, основываясь только на интуиции, когда следующая версия может снова ввести ту же самую скрытую проблему под новым названием. Сохраняйте все элементы в рабочем состоянии, измеряйте каждый этап отдельно и откажитесь от выпуска, основываясь только на интуиции, когда следующая версия может снова ввести ту же самую скрытую проблему подновое название. Сохраняйте фиксатуры в рабочем состоянии, измеряйте каждый этап отдельно и не спешите с выпуском, основываясь только на интуиции, если в следующей версии может снова возникнуть тот же скрытый сбой под новым названием. Сохраняйте фиксатуры в рабочем состоянии, измеряйте каждый этап отдельно и не спешите с выпуском, основываясь только на интуиции, если в следующей версии может снова возникнуть тот же скрытый сбой под новым названием. Сохраняйте фиксатуры в рабочем состоянии, измеряйте каждый этап отдельно и не спешите с выпуском, основываясь только на интуиции, если в следующей версии может снова возникнуть тот же скрытый сбой под новым названием. Сохраняйте фиксатуры в рабочем состоянии, измеряйте каждый этап отдельно и не спешите с выпуском, основываясь только на интуиции, если в следующей версии может снова возникнуть тот же скрытый сбой под новым названием. Сохраняйте фиксатуры в рабочем состоянии, измеряйте каждый этап отдельно и не спешите с выпуском, основываясь только на интуиции, если в следующей версии может снова возникнуть тот же скрытый сбой под новым названием. Сохраняйте фиксатуры в рабочем состоянии, измеряйте каждый этап отдельноТестируйте каждый этап отдельно и не соглашайтесь на выпуск продукта, основываясь только на предположениях, если в следующей версии может снова возникнуть тот же самый скрытый сбой под новым названием. Сохраняйте устройства в рабочем состоянии, измеряйте каждый этап отдельно и не соглашайтесь на выпуск продукта, основываясь только на предположениях, если в следующей версии может снова возникнуть тот же самый скрытый сбой под новым названием.