Домашка: набор разведчика

Домашка

Петля есть — теперь ей нужен мир, по которому ходить. Собираем 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:

python
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("ошибка")

Пример работы программы

python
>>> 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.

  • theory icon

    Петля агента: решить → сделать → посмотреть

    5 мин

  • homework icon

    Домашка: агент с одним инструментом

    3 мин

  • quiz icon

    Квиз: Петля агента: решить → сделать → посмотреть

    6 мин

  • theory icon

    Инструменты: руки агента

    5 мин

  • homework icon

    Домашка: набор разведчика

    3 мин

  • quiz icon

    Квиз: Инструменты: руки агента

    5 мин

  • theory icon

    Память и контекст: что тащим, что выбрасываем

    5 мин

  • homework icon

    Домашка: сжатие истории

    3 мин

  • quiz icon

    Квиз: Память и контекст: что тащим, что выбрасываем

    6 мин

  • theory icon

    Свой цикл против LangChain и LlamaIndex

    4 мин

  • homework icon

    HARD-задача: прятки в репозитории

    3 мин

  • quiz icon

    Квиз: Свой цикл против LangChain и LlamaIndex

    5 мин

  • project icon

    Проект «Разведчик»: агент, который знает ваш репозиторий

    3 мин

🎯
Тренажёр собеседованияЗакрепите знания перед интервью