Домашка: первый запрос к модели

Домашка

Каждый агент на этом курсе начинается одинаково: код зовёт модель и получает ответ. Сегодня вы сделаете этот первый шаг — и заодно заложите правило, которое выручит все следующие модули: настоящий «мозг» и фальшивый должны быть взаимозаменяемыми. Тогда тесты будут летать без сети и ключей, а боевая подмена — занимать одну строку.

Описание задачи

Создайте репозиторий devbuddy (обычный git-репозиторий), подготовьте в нём venv и пакеты из урока. Затем три файла:

Основная функциональность

  • fake_llm.py — класс FakeLLM с тем же интерфейсом, что у LLMClient: конструктор принимает строку answer, метод ask(prompt) возвращает её, игнорируя промпт.

  • hello.py — функция make_llm(): если переменная окружения LLM_API_KEY непустая, возвращает LLMClient, иначе — FakeLLM с заготовкой (фейковый ответ: задайте LLM_API_KEY). Функция main() получает модель через make_llm(), спрашивает «Ответь одним словом: работает?» и печатает Ответ модели: <текст>.

  • llm.py — ваш LLMClient из урока (он почти готов, возможно, захотите убрать проверку на LLM_MODEL — оставьте, она полезная).

Дополнительные условия

  • Ключ встречается только в переменных окружения — ни в одном файле репозитория его быть не должно.

  • Оба класса (FakeLLM и LLMClient) имеют метод ask(prompt: str) -> str — это и есть их «взаимозаменяемость».

Как проверить себя

Положите рядом файл test_hello.py и запустите python -m pytest test_hello.py -v (в окружении, где не задан LLM_API_KEY):

python
# test_hello.py
from fake_llm import FakeLLM
from hello import make_llm


def test_fake_without_key(monkeypatch):
    monkeypatch.delenv("LLM_API_KEY", raising=False)
    assert isinstance(make_llm(), FakeLLM)


def test_fake_returns_preset_answer():
    fake = FakeLLM("заготовка")
    assert fake.ask("любой промпт") == "заготовка"


def test_main_prints_prefix(monkeypatch, capsys):
    monkeypatch.delenv("LLM_API_KEY", raising=False)
    from hello import main
    main()
    out = capsys.readouterr().out
    assert out.startswith("Ответ модели:")

Все три теста зелёные — домашка готова. Тесты проверяют ровно то, что написано в требованиях: подмена работает, заглушка отвечает заготовкой, вывод имеет нужный префикс.

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

Без ключа:

java
$ python hello.py
Ответ модели: (фейковый ответ: задайте LLM_API_KEY)

С настроенной моделью (переменные из урока):

java
$ python hello.py
Ответ модели: Да

Критерии готовности

  • python -m pytest test_hello.py -v — три зелёных теста.

  • python hello.py печатает ответ: фейковый без ключа, настоящий — с настроенным окружением.

  • Ключа нет ни в одном файле (проверьте себя git grep -i api_key после первого коммита).

  • Коммит в devbuddy: к концу курса их будет пара десятков.

  • theory icon

    Что такое AI-агент: скрипт, который сам выбирает следующий шаг

    6 мин

  • theory icon

    Путь курса: от первого запроса к LLM до бота в GitHub Actions

    5 мин

  • theory icon

    Окружение: Python, VS Code и «мозг» для агента

    8 мин

  • homework icon

    Домашка: первый запрос к модели

    4 мин

  • quiz icon

    Квиз: Окружение: Python, VS Code и „мозг“ для агента

    6 мин

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