Coding Agent: GPT-4.1 + Agents SDK
Строим coding agent с GPT-4.1 через Agents SDK OpenAI: web_search + shell инструменты, ShellExecutor с изолированным workspace, цикл scaffold → обратная связь → итерация.
GPT-4.1 для кодирования
GPT-4.1 — лучшая на сегодня модель OpenAI для написания и редактирования кода. С инструментами apply_patch и shell из Responses API она может работать с целыми кодовыми базами.
from agents import Agent, Runner, WebSearchTool, ShellTool
import os
assert "OPENAI_API_KEY" in os.environ, "Установите OPENAI_API_KEY"
Настройка агента
from pathlib import Path
workspace_dir = Path("coding-agent-workspace").resolve()
workspace_dir.mkdir(exist_ok=True)
coding_agent = Agent(
name="CodingAgent",
model="gpt-4.1",
instructions=(
"You are an expert coding agent. Scaffold apps from user prompts, "
"edit files with apply_patch, and run shell commands in the workspace. "
"Always sandbox commands — never run outside workspace_dir."
),
tools=[
WebSearchTool(),
ShellTool(cwd=str(workspace_dir), require_approval=True),
],
)
ShellExecutor с изоляцией
import asyncio
from agents import ShellCommandRequest, ShellResult
class ShellExecutor:
def __init__(self, workspace: Path, require_approval: bool = True):
self.workspace = workspace
self.require_approval = require_approval
async def __call__(self, req: ShellCommandRequest) -> ShellResult:
if self.require_approval:
print(f"Agent wants to run: {req.command}")
if input("Approve? (y/n): ").strip().lower() != "y":
return ShellResult(stdout="", stderr="Rejected by user", exit_code=1)
proc = await asyncio.create_subprocess_shell(
req.command,
cwd=str(self.workspace),
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE,
)
stdout, stderr = await proc.communicate()
return ShellResult(stdout=stdout.decode(), stderr=stderr.decode(),
exit_code=proc.returncode)
Цикл агента
Agents SDK автоматически управляет циклом: вызов модели → исполнение инструментов → следующий вызов — до получения финального ответа.
Запустите coding agent с инструкцией создать простое Flask-приложение с одним эндпоинтом /health. Убедитесь, что агент использует ShellExecutor в изолированной директории и вы можете одобрить/отклонить каждую команду.
Скопируйте и адаптируйте под свой контекст. Текст в треугольных скобках — то, что нужно заменить.
import asyncio
from pathlib import Path
from agents import Agent, Runner, WebSearchTool
workspace_dir = Path("agent-workspace").resolve()
workspace_dir.mkdir(exist_ok=True)
agent = Agent(
name="DevAgent",
model="gpt-4.1",
instructions="Scaffold a minimal Flask app with /health endpoint in the workspace.",
tools=[WebSearchTool()],
)
async def main():
runner = Runner(agent=agent)
result = await runner.run(
"Create a Flask app with a /health endpoint returning JSON {status: ok}"
)
print(result.final_output)
asyncio.run(main())Запускать shell команды без изолированного workspace — агент может изменить файлы за пределами проекта. Не реализовывать require_approval в продакшене — критический риск безопасности.
Agents SDK сам управляет агентным циклом (tool calls → responses → repeat). require_approval=True в ShellExecutor позволяет контролировать каждую команду во время разработки.
Автоматизация кодогенерации, scaffold новых проектов, итеративная доработка кода через обратную связь пользователя.
Задачи без доступа к файловой системе. Продакшн без полной изоляции (Docker/VM sandbox) — shell без ограничений опасен.