Проектная лаборатория

Собственный Claude Code

0 / 13этапов пройдено

Этап 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

Разберём части цикла:

  1. Инициализируйте разговор: начальная история уже есть — массив messages с запросом пользователя. Теперь его нужно сохранять между итерациями, поскольку цикл будет добавлять в него новые сообщения:

    [
      { "role": "user", "content": "Summarize the README for me." }
    ]
  2. Запустите цикл: начните с того же запроса к API, который уже реализован: отправьте модели messages и спецификации инструментов. Разница в том, что запрос теперь находится в цикле и может выполняться многократно.

  3. Сохраните ответ ассистента: добавьте любое полученное сообщение модели в массив messages. Если модель хочет использовать инструмент, ответ содержит массив tool_calls:

    {
      "role": "assistant",
      "content": null,
      "tool_calls": [
        {
          "id": "call_abc123",
          "type": "function",
          "function": {
            "name": "Read",
            "arguments": "{\"file_path\": \"README.md\"}"
          }
        }
      ]
    }
  4. Выполните вызовы инструментов: проверьте, запрашивает ли модель инструменты. Если вызовы есть:

    • а. Выполните каждый запрошенный инструмент, но не печатайте его результат в stdout.
    • б. Добавьте каждый результат в массив messages. Каждый результат должен:
      • Содержать поле role со значением "tool".
      • Ссылаться на соответствующий tool_call_id.
      • Содержать результат вызова в поле content.
    {
      "role": "tool",
      "tool_call_id": "call_abc123",
      "content": "# My Project\n\nChemical expiry period: 6 months"
    }
  5. Повторяйте до завершения: продолжайте цикл, пока модель не ответит без запроса инструментов — когда 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 go

2. Откройте папку в IDE

cd ./my-claude-code

Реализуйте требования этапа в созданном проекте.

Запустите из папки проекта

node '/opt/graphlms/tools/project-lab/cli.mjs' submit --stage ff2 --allow-paid-api

Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.

Результат проверки

go / ЛОКАЛЬНО

Подключение к локальной проверке…

Здесь появится результат

Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.

GraphLMS — инженерная лаборатория роста