Хто пише код, коли агенти приєднуються до робочого процесу?
Асистенти кодування карт від автодоповнення до скупчень, а також відповідність рівнів радіусу ураження, тестам та етапам перевірки.
Інструменти програмування на основі ШІ вже не обмежуються функцією автодоповнення. Вони включають реактивних партнерів-програмістів, агентів для виконання завдань, автономних агентів проєктів, які керують гілками коду, та експериментальні системи, де кілька агентів взаємно перевіряють та виправляють один одного. Важливе питання полягає не в тому, який бренд встановити, а в тому, який рівень підходить до ризиків змін.
Ранні асистенти доповнювали рядок під курсором. Сучасніші агенти відкривають файли, запускають тести та створюють заявки на об’єднання коду. Рівень автономності зростає разом із масштабом впливу. Так само мають зростати глибина перевірки, можливості ізоляції та чіткість поставлених цілей.
Інструменти реактивного автодоповнення та чату в інтерфейсі розробки. Ви контролюєте кожну зміну. Найкраще підходять для стандартних шаблонів, перейменування елементів та пояснення незнайомого коду. Слабкі у багатофайлових оптимізаціях без керівництва.
# 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()
Екзекутори, орієнтовані на досягнення цілей: «додайте журналювання до цього обробника», «напишіть тести для цього модуля». Вони планують короткі цикли роботи з інструментами та зупиняються, коли перевірка цілей проходить успішно. Проте для об’єднання коду все одно потрібна людська перевірка.
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 може знову ввести той самий прихований режим несправності під новою назвою. Зберігайте пристрої у справному стані, вимірюйте кожен етап окремо та не поспішайте з випуском, якщо наступна версія може знову ввести той самий прихований режим несправності під новою назвою. Зберігайте пристрої у справному стані, вимірюйте кожен етап окремо та не поспішайте з випуском, якщо наступна версія може знову ввести той самий прихований режим несправності під новою назвою. Зберігайте пристрої у справному стані, вимірюйте кожен етап окремо та не поспішайте з випуском, якщо наступна версія може знову ввести той самий прихований режим несправності під новою назвою. Зберігайте пристрої у справному стані, вимірюйте кожен етап окремо та не поспішайте з випуском, якщо наступна версія може знову ввести той самий прихований режим несправності під новою назвою. Зберігайте пристрої у справному стані, вимірюйте кожен етап окремо та не поспішайте з випуском, якщо наступна версія може знову ввести той самий прихований режим несправності під новою назвою.ода під новою назвою. Зберігайте пристрої у справному стані, вимірюйте кожен етап окремо та не поспішайте з випуском, спираючись лише на інтуїцію, адже наступна версія може знову ввести той самий непомітний режим несправності під новою назвою. Зберігайте пристрої у справному стані, вимірюйте кожен етап окремо та не поспішайте з випуском, спираючись лише на інтуїцію, адже наступна версія може знову ввести той самий непомітний режим несправності під новою назвою. Зберігайте пристрої у справному стані, вимірюйте кожен етап окремо та не поспішайте з випуском, спираючись лише на інтуїцію, адже наступна версія може знову ввести той самий непомітний режим несправності під новою назвою. Зберігайте пристрої у справному стані, вимірюйте кожен етап окремо та не поспішайте з випуском, спираючись лише на інтуїцію, адже наступна версія може знову ввести той самий непомітний режим несправності під новою назвою. Зберігайте пристрої у справному стані, вимірюйте кожен етап окремо та не поспішайте з випуском, спираючись лише на інтуїцію, адже наступна версія може знову ввести той самий непомітний режим несправності під новою назвою. Зберігайте пристрої у справному стані, менеПеревіряйте кожну стадію окремо та відмовляйтесь від релізу, спираючись лише на інтуїцію, якщо наступна версія може знову ввести той самий непомітний режим несправності під новою назвою.Залишайте пристрої у справному стані, вимірюйте кожен етап окремо та відмовляйтеся від випуску продукту, спираючись лише на інтуїцію, адже наступна версія може знову ввести той самий прихований режим несправності під новою назвою.Введіть ту саму приховану проблему під новою назвою. Зберігайте фіксатури у стані „зеленому“, вимірюйте кожну стадію окремо та відмовляйтесь від релізу, спираючись лише на інтуїцію, адже наступна версія може знову ввести ту саму приховану проблему під новою назвою. Зберігайте фіксатури у стані „зеленому“, вимірюйте кожну стадію окремо та відмовляйтесь від релізу, спираючись лише на інтуїцію, адже наступна версія може знову ввести ту саму приховану проблему під новою назвою. Зберігайте фіксатури у стані „зеленому“, вимірюйте кожну стадію окремо та відмовляйтесь від релізу, спираючись лише на інтуїцію, адже наступна версія може знову ввести ту саму приховану проблему під новою назвою. Зберігайте фіксатури у стані „зеленому“, вимірюйте кожну стадію окремо та відмовляйтесь від релізу, спираючись лише на інтуїцію, адже наступна версія може знову ввести ту саму приховану проблему під новою назвою. Зберігайте фіксатури у стані „зеленому“, вимірюйте кожну стадію окремо та відмовляйтесь від релізу, спираючись лише на інтуїцію, адже наступна версія може знову ввести ту саму приховану проблему піднову назву. Зберігайте пристрої у справному стані, вимірюйте кожен етап окремо та не поспішайте з випуском, спираючись лише на інтуїцію, адже наступна версія може знову ввести той самий непомітний режим несправності під новою назвою. Зберігайте пристрої у справному стані, вимірюйте кожен етап окремо та не поспішайте з випуском, спираючись лише на інтуїцію, адже наступна версія може знову ввести той самий непомітний режим несправності під новою назвою. Зберігайте пристрої у справному стані, вимірюйте кожен етап окремо та не поспішайте з випуском, спираючись лише на інтуїцію, адже наступна версія може знову ввести той самий непомітний режим несправності під новою назвою. Зберігайте пристрої у справному стані, вимірюйте кожен етап окремо та не поспішайте з випуском, спираючись лише на інтуїцію, адже наступна версія може знову ввести той самий непомітний режим несправності під новою назвою. Зберігайте пристрої у справному стані, вимірюйте кожен етап окремо та не поспішайте з випуском, спираючись лише на інтуїцію, адже наступна версія може знову ввести той самий непомітний режим несправності під новою назвою. Зберігайте пристрої у справному стані, вимірюйте кожен етап окремоТримайте пристрої у робочому стані, вимірюйте кожну стадію окремо та не поспішайте з випуском, якщо наступна версія може знову викликати ту саму приховану проблему під новою назвою.