Домашка: набор разведчика
Домашка
Петля есть — теперь ей нужен мир, по которому ходить. Собираем tools.py: три файловых инструмента в песочнице (фабрика make_tools(root) возвращает словарь для run_agent). Всё детерминированно, всё в temp-папке теста, никакой сети.
Описание задачи
Файл tools.py с функцией make_tools(root) -> dict, где root — путь к песочнице (строка или Path).
Основная функциональность
list_dir(rel)— содержимое папки: имена построчно, отсортированные; у папок суффикс/. Пустая папка —(пусто). Ошибки:ошибка: папки нет,ошибка: это файл.read_file(rel)— текст файла. Ошибки:ошибка: файла нет,ошибка: это папка.search(word)— строки вида<путь>: <строка>для каждого вхождения слова по всем файлам песочницы (пути с/, как в POSIX, — на любой ОС). Ничего не нашлось —ничего не найдено.Все пути — относительные, от корня песочницы;
""— сам корень. Путь, вырывающийся за корень (../x), — ошибкаошибка: путь вне песочницы.
Дополнительные условия
Только стандартная библиотека (
pathlib).Никаких исключений наружу: любая проблема — строка
ошибка: ...(она станет наблюдением агента).
Как проверить себя
test_tools.py, запуск python -m pytest test_tools.py -v:
from tools import make_tools
def make_sandbox(tmp_path):
(tmp_path / "app.py").write_text("def main():\n pass\n", encoding="utf-8")
notes = tmp_path / "notes"
notes.mkdir()
(notes / "todo.txt").write_text("купить кекс\n", encoding="utf-8")
return make_tools(tmp_path)
def test_list_dir_root(tmp_path):
tools = make_sandbox(tmp_path)
assert tools["list_dir"]("") == "app.py\nnotes/"
def test_read_file(tmp_path):
tools = make_sandbox(tmp_path)
assert tools["read_file"]("notes/todo.txt") == "купить кекс\n"
def test_missing_file_is_error_string(tmp_path):
tools = make_sandbox(tmp_path)
assert tools["read_file"]("нет.py").startswith("ошибка")
def test_search_finds_in_subdirs(tmp_path):
tools = make_sandbox(tmp_path)
assert tools["search"]("кекс") == "notes/todo.txt: купить кекс"
def test_search_nothing(tmp_path):
tools = make_sandbox(tmp_path)
assert tools["search"]("пельмень") == "ничего не найдено"
def test_escape_blocked(tmp_path):
tools = make_sandbox(tmp_path)
assert tools["read_file"]("../secret.txt").startswith("ошибка")Пример работы программы
>>> from pathlib import Path
>>> from tools import make_tools
>>> tools = make_tools(Path("devbuddy"))
>>> print(tools["list_dir"](""))
agent/
llm.py
prompts.py
tokens.pyКритерии готовности
Шесть тестов зелёные (запуск на Windows тоже — пути в выдаче с
/).Ни один инструмент не бросает исключений на кривой ввод.
Коммит:
tools.py,test_tools.py.
Петля агента: решить → сделать → посмотреть
5 мин
Домашка: агент с одним инструментом
3 мин
Квиз: Петля агента: решить → сделать → посмотреть
6 мин
Инструменты: руки агента
5 мин
Домашка: набор разведчика
3 мин
Квиз: Инструменты: руки агента
5 мин
Память и контекст: что тащим, что выбрасываем
5 мин
Домашка: сжатие истории
3 мин
Квиз: Память и контекст: что тащим, что выбрасываем
6 мин
Свой цикл против LangChain и LlamaIndex
4 мин
HARD-задача: прятки в репозитории
3 мин
Квиз: Свой цикл против LangChain и LlamaIndex
5 мин
Проект «Разведчик»: агент, который знает ваш репозиторий
3 мин