s01
Цикл агента
Инструменты и выполнениеBash is All You Need
84 LOC1 инструментовSingle-tool agent loop
The minimal agent kernel is a while loop + one tool
[ s01 ] s02 > s03 > s04 > s05 > s06 | s07 > s08 > s09 > s10 > s11 > s12
"Один цикл и Bash — всё, что нужно" -- один инструмент + один цикл = агент.
Проблема
Языковая модель может рассуждать о коде, но она не может касаться реального мира — не может читать файлы, запускать тесты или проверять ошибки. Без цикла каждый вызов инструмента требует от вас вручную копировать-вставлять результаты обратно. Вы становитесь циклом.
Решение
+--------+ +-------+ +---------+
| User | ---> | LLM | ---> | Tool |
| prompt | | | | execute |
+--------+ +---+---+ +----+----+
^ |
| tool_result |
+----------------+
(loop until stop_reason != "tool_use")
Одно условие выхода управляет всем потоком. Цикл выполняется, пока модель не перестанет вызывать инструменты.
Как Это Работает
- Запрос пользователя становится первым сообщением.
messages.append({"role": "user", "content": query})
- Отправляем сообщения + определения инструментов LLM.
response = client.messages.create(
model=MODEL, system=SYSTEM, messages=messages,
tools=TOOLS, max_tokens=8000,
)
- Добавляем ответ ассистента. Проверяем
stop_reason— если модель не вызвала инструмент, мы закончили.
messages.append({"role": "assistant", "content": response.content})
if response.stop_reason != "tool_use":
return
- Выполняем каждый вызов инструмента, собираем результаты, добавляем как сообщение пользователя. Возвращаемся к шагу 2.
results = []
for block in response.content:
if block.type == "tool_use":
output = run_bash(block.input["command"])
results.append({
"type": "tool_result",
"tool_use_id": block.id,
"content": output,
})
messages.append({"role": "user", "content": results})
Собранный в одну функцию:
def agent_loop(query):
messages = [{"role": "user", "content": query}]
while True:
response = client.messages.create(
model=MODEL, system=SYSTEM, messages=messages,
tools=TOOLS, max_tokens=8000,
)
messages.append({"role": "assistant", "content": response.content})
if response.stop_reason != "tool_use":
return
results = []
for block in response.content:
if block.type == "tool_use":
output = run_bash(block.input["command"])
results.append({
"type": "tool_result",
"tool_use_id": block.id,
"content": output,
})
messages.append({"role": "user", "content": results})
Это весь агент менее чем за 30 строк. Всё остальное в этом курсе надстраивается — без изменения цикла.
Что Изменилось
| Компонент | До | После |
|---|---|---|
| Цикл агента | (нет) | while True + stop_reason |
| Инструменты | (нет) | bash (один инструмент) |
| Сообщения | (нет) | Накапливающийся список |
| Поток управления | (нет) | stop_reason != "tool_use" |
Попробуйте
python agents/s01_agent_loop.py
Создайте файл hello.py, который печатает "Hello, World!"Перечислите все Python-файлы в этом каталогеКакая текущая ветка git?Создайте каталог test_output и запишите в него 3 файла
