Проектная лаборатория
Собственный Claude Code
Этап 04 · Основные этапы
Реализация цикла агента
Русский перевод заданий CodeCrafters. Примеры подготовлены для Go. Выбор языка меняет команды и результаты, но не текст задания.
На этом этапе вы реализуете цикл агента.
Цикл агента
Пока программа выполняет одно взаимодействие: отправляет запрос в LLM, получает ответ, при необходимости вызывает один инструмент и завершается.
Это подходит для простых задач, но недостаточно для многошаговых, например «прочитай файл и исправь ошибки».
Теперь реализуйте цикл агента, который повторно отправляет сообщения модели и обрабатывает нужные вызовы инструментов, пока не получит итоговый результат.
Структура в псевдокоде:
messages = [{ role: "user", content: prompt }]
loop:
response = call_api(messages)
append response message to messages
if response has no tool_calls:
print response.content
exit
for each tool_call in response.tool_calls:
result = execute_tool(tool_call)
append {
role: "tool",
tool_call_id: tool_call.id,
content: result
} to messagesРазберём части цикла:
-
Инициализируйте разговор: начальная история уже есть — массив
messagesс запросом пользователя. Теперь его нужно сохранять между итерациями, поскольку цикл будет добавлять в него новые сообщения:[ { "role": "user", "content": "Summarize the README for me." } ] -
Запустите цикл: начните с того же запроса к API, который уже реализован: отправьте модели
messagesи спецификации инструментов. Разница в том, что запрос теперь находится в цикле и может выполняться многократно. -
Сохраните ответ ассистента: добавьте любое полученное сообщение модели в массив
messages. Если модель хочет использовать инструмент, ответ содержит массивtool_calls:{ "role": "assistant", "content": null, "tool_calls": [ { "id": "call_abc123", "type": "function", "function": { "name": "Read", "arguments": "{\"file_path\": \"README.md\"}" } } ] } -
Выполните вызовы инструментов: проверьте, запрашивает ли модель инструменты. Если вызовы есть:
- а. Выполните каждый запрошенный инструмент, но не печатайте его результат в stdout.
- б. Добавьте каждый результат в массив
messages. Каждый результат должен:- Содержать поле
roleсо значением"tool". - Ссылаться на соответствующий
tool_call_id. - Содержать результат вызова в поле
content.
- Содержать поле
{ "role": "tool", "tool_call_id": "call_abc123", "content": "# My Project\n\nChemical expiry period: 6 months" } -
Повторяйте до завершения: продолжайте цикл, пока модель не ответит без запроса инструментов — когда
tool_callsотсутствует или пуст. Тогда выведитеcontentитогового сообщения в stdout и завершите программу.
Проверки
Тестирующая система создаст проект Python со следующими файлами:
README.md;- два Python-файла со случайными именами в
app/.
Затем она запустит программу так:
$ ./your_program.sh -p "Use README.md to determine the chemical expiry period in months. Number only."
<expiry period in months>Она проверит, что:
- Выведен правильный срок годности.
- Программа завершается с кодом
0.
Примечания
- Не печатайте исходное содержимое файла при выполнении инструмента Read. Это отличается от поведения на этапе «Выполнение инструмента чтения».
- Промежуточную отладочную информацию можно выводить в stderr. Печатайте в stdout только готовый итоговый результат.
- В качестве сигнала завершения цикла также можно использовать
finish_reason: "stop"из первого варианта ответа.
Для проверки этого проекта нужен ключ OpenRouter в переменной CODECRAFTERS_SECRET_OPENROUTER_API_KEY. Запросы к модели могут быть платными. Ключ задаётся только в вашем терминале и не отправляется в GraphLMS.
Проверка в вашей IDE
Нужны Node.js, Git, Go 1.24+ для тестеров и инструменты выбранного языка. Тестеры загружаются и запускаются локально; отдельным проектам нужны дополнительные системные зависимости.
Настройка проекта и IDE
1. Создайте проект один раз
node '/opt/graphlms/tools/project-lab/cli.mjs' init claude-code ./my-claude-code --language go2. Откройте папку в IDE
cd ./my-claude-codeРеализуйте требования этапа в созданном проекте.
Запустите из папки проекта
node '/opt/graphlms/tools/project-lab/cli.mjs' submit --stage ff2 --allow-paid-apiЗапускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.
Результат проверки
go / ЛОКАЛЬНОПодключение к локальной проверке…
Здесь появится результат
Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.