Проектная лаборатория
Собственный Claude Code
Этап 03 · Основные этапы
Выполнение инструмента чтения
Русский перевод заданий CodeCrafters. Примеры подготовлены для Go. Выбор языка меняет команды и результаты, но не текст задания.
На этом этапе вы добавите обнаружение вызовов инструментов и выполнение вызова Read.
Вызовы инструментов
Если LLM решает воспользоваться инструментом, ответное сообщение содержит массив tool_calls.
Пример ответа:
{
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": null,
"tool_calls": [
{
"id": "call_abc123",
"type": "function",
"function": {
"name": "Read",
"arguments": "{\"file_path\": \"/path/to/file.txt\"}"
}
}
]
},
"finish_reason": "tool_calls"
}
]
}Основные поля, которые нужно обработать:
choices: список сгенерированных ответов. В этой задаче в нём всегда будет ровно один вариант.tool_calls: массив запрошенных вызовов инструментов.id: уникальный идентификатор вызова.type: тип вызова (для инструментов всегда"function").function: сведения о функции:name: имя вызываемой функции (например,"Read").arguments: JSON-строка с параметрами функции.
На этом этапе вы выполните один вызов инструмента Read.
Выполнение инструмента Read
Обнаружив массив tool_calls в ответе:
- Извлеките вызов: возьмите сообщение из первого варианта ответа, затем первый вызов из массива
tool_calls. - Прочитайте имя функции: определите по нему, какой инструмент нужно выполнить.
- Разберите аргументы: распарсите JSON-строку аргументов, чтобы получить параметры.
- Выполните инструмент: программа должна выполнить запрошенное действие. Для
Readиспользуйте библиотеку работы с файловой системой вашего языка и прочитайте файл по указанномуfile_path. - Выведите результат: напечатайте результат выполнения инструмента. Для
Readвыведите исходное содержимое файла прямо в stdout — без подписей и форматирования.
На предыдущих этапах вы сразу печатали содержимое сообщения в stdout. Теперь ответ модели может содержать вызовы инструментов, поэтому печатайте содержимое сообщения только тогда, когда в ответе нет массива tool_calls.
Проверки
Тестирующая система создаст файл (например, apple.py) и запустит программу так:
$ ./your_program.sh -p "What is the content of apple.py? Print exact file contents without backticks."
<file contents>Она проверит, что:
- При запросе вызова
Readвывод в точности совпадает с содержимым файла. - Если LLM не запрашивает инструмент, вывод содержит её текстовый ответ.
- Программа завершается с кодом
0.
Примечания
- На следующих этапах вы будете отправлять результат инструмента обратно модели, а не печатать его. Это станет частью «цикла агента», на котором построен Claude Code.
- На этом этапе достаточно вывести результат первого вызова инструмента. Обработку нескольких вызовов добавим позже.
- Полное описание структуры ответа см. в спецификации OpenRouter API.
Для проверки этого проекта нужен ключ 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 md6 --allow-paid-apiЗапускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.
Результат проверки
go / ЛОКАЛЬНОПодключение к локальной проверке…
Здесь появится результат
Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.