Автор: редакция
Если поместить ИИ-прокси (API-шлюз / агрегатор) на карту программной инженерии, он окажется прокси-сервером прикладного уровня (L7) с парсером на основе конечного автомата и планировщиком контекста.
Требования изменились, когда на смену однострочному автодополнению в IDE пришли терминальные агенты вроде Claude Code CLI и OpenAI Codex CLI, а вместе с ними — разработка на основе спецификаций (specification-driven development). Оставим в стороне общие метрики шлюзов, такие как стабильность сети и поведение под высокой параллельной нагрузкой. Для генерации кода главный вопрос в другом: ломает ли прокси синтаксис, прерывает ли конечный автомат агента, теряет ли зависимости в длинном контексте и не вырезает ли протокол оптимизации, который отправил клиент для программирования.
Ответить на этот вопрос помогают четыре инженерных параметра.
1. Целостность синтаксиса и экранирования
Сгенерированный код чувствителен к символам и форматированию. Это не обычная проза: в нём есть отступы, переводы строк, экранирование и вложенные JSON или XML.
1. Экранирование без потерь
- Почему ломается: SSE-фрагмент с кодом содержит
\n,\t,\", регулярное выражение\\dили JSON-строку. Если прокси снимает экранирование или перекодирует текст при сборке фрагментов, многобайтовый символ UTF-8 может разрезаться, и клиент получит код, который не проходит разбор. - Как проверить: запросите код с экстремальным экранированием: тяжёлое регулярное выражение, Python со вложенными JSON-строками и C++ с указателями и макросами.
- Критерий прохождения: запишите поток от прокси в файл и разберите его локальным линтером (
eslint,flake8) или AST-парсером (Babel или Tree-sitter). Доля успешного разбора AST должна составлять 100%.
2. Пробелы и отступы
- Почему ломается: в Python и YAML отступы задают область видимости.
\nвместо\r\nменяет diff в Git. - Как проверить: отправьте рефакторинг глубоко вложенной логики, например функции на Python внутри 8 уровней циклов.
- Критерий прохождения: пробелы и табуляции в выводе прокси должны побайтово совпадать с выводом вышестоящего API, на 100%. Прокси не должен «украшать» или сжимать пробельные символы.
2. Вызовы инструментов и структурированный вывод
Агент для программирования выдаёт не только Markdown. Он вызывает инструменты, например read_file, edit_file и run_terminal_command.
1. Точное соблюдение JSON-схемы
- Почему ломается: локальная правка — это структурированный JSON с полями вроде
path,old_strиnew_str. Если прокси нарушает сериализацию или теряет вложенное поле, агент не может разобрать ответ и падает. - Как проверить: запустите агентную задачу, которая правит несколько файлов сразу, например рефакторинг интерфейса в 5 файлах TypeScript, и перехватите тело пересланного вызова инструмента.
- Критерий прохождения: пересланный объект вызова инструмента должен совпадать с тем, что вернул вышестоящий официальный API. Никаких пропавших полей, смены типов вроде string на number и преждевременно оборванного JSON.
2. Состояние в многоходовом диалоге
- Почему ломается: на сложный баг часто уходит 10–30 ходов: прочитать файл, попробовать правку, запустить тесты, прочитать ошибку, снова править. Прокси должен пересылать
tool_useвrole: "assistant"иtool_resultвrole: "user"по всей цепочке. - Как проверить: запустите настоящую отладку силами агента длиной более 10 ходов.
- Критерий прохождения: на ходе N прокси по-прежнему пересылает все ID вызовов инструментов и узлы состояния из предыдущих N−1 ходов. История и состояние не должны теряться или перемешиваться.
3. Длинный контекст кода и кэширование промптов
Контекст средней или крупной кодовой базы часто занимает 100–200 тыс. токенов.
1. Сквозная передача cache-control
- Почему ломается: спецификация архитектуры и общий базовый код не меняются. Агент помечает их
cache_control, чтобы сервис модели мог переиспользовать KV-кэш. Если прокси вырезает эту метку, правка одной строки снова запускает prefill сотен тысяч токенов. - Как проверить: многократно отправьте инженерный контекст на 100 тыс. токенов с
cache_control. - Критерий прохождения:
- В запросе: тело, уходящее к вышестоящему API, по-прежнему содержит
cache_control. - В ответе:
usageвозвращаетcache_read_input_tokens.
2. Иголка в кодовой базе
- Почему ломается: ради экономии прокси может обрезать промпт с помощью RAG, сжать его или подменить модель на меньшую, и модель начинает хуже видеть репозиторий.
- Как проверить: в репозитории на 150 тыс. токенов спрячьте определение интерфейса в начале файла A, а место вызова — в конце файла B, заполните середину посторонним кодом и спросите, как изменить интерфейс.
- Критерий прохождения: сравните правку через прокси с прямым вызовом официального API. Если из-за урезанного контекста прокси упускает переменную или тип из другого файла, контекст повреждён.
4. Полный вывод и защита инструкций
Типичный сбой выглядит так: модуль на 500 строк обрывается на 300-й.
1. Предел максимального вывода
- Почему ломается: рефакторинг одного файла может потребовать 4, 8 или даже 16 тыс. токенов кода в одном ответе. Маленький буфер прокси или короткий таймаут режет файл пополам.
- Как проверить: запросите один длинный модуль без воды, например парсер с сотнями перечислений и преобразований.
- Критерий прохождения: прокси должен выдерживать максимальный
max_tokensмодели. Итоговыйfinish_reasonдолжен быть"stop"или"length". Преждевременный EOF — это провал.
2. Целостность системного промпта
- Почему ломается: агент для программирования задаёт в системном промпте строгие правила, например строгий режим TypeScript или JSDoc для каждой функции. Некоторые прокси вставляют собственный глобальный промпт или обрезают системный.
- Как проверить: отправьте системный промпт с характерным ограничением на стиль кода и запросите код.
- Критерий прохождения: код соблюдает это ограничение, а перехват трафика показывает, что системный промпт не изменён ни на один байт.
Чек-лист
| Параметр | Что проверять | Критерий прохождения |
|---|---|---|
| Символы и синтаксис | Экранирование, отступы, переводы строк | Локальный разбор AST / линтером проходит успешно, совпадение 100% |
| Цепочка инструментов агента | Структура вызовов инструментов и состояние в многоходовом диалоге | Ноль ошибок разбора JSON и цепочка состояний инструментов от 10 ходов |
| Контекст и кэш | Передача кэша промптов и реальный контекст | cache_control не вырезается, а кодовая база на 150 тыс. токенов сохраняет межфайловые зависимости |
| Полнота генерации | Предел длинного вывода и защита системного промпта | От 8 тыс. токенов непрерывного кода и побайтово неизменный системный промпт |



