HARD-задача: смета агента
Домашка
Финальная задача модуля — для тех, кто хочет довести экономику до инженерного инструмента. Вы напишете budget.py: выборщик модели под ограничение качества и контекста с минимальной месячной стоимостью. А потом — исследовательская часть: замените учебные модели на настоящие, с ценами, которые вы сами возьмёте с официальных страниц провайдеров. Получится документ, который вы положите в README своего devbuddy.
Первая часть проверяется тестами; вторая — ваша совесть и ссылки на источники.
Часть 1. Выборщик (код)
Файл budget.py. Учебный набор моделей:
MODELS = {
"модель-a": {"price_in": 1.0, "price_out": 4.0, "context": 32_000, "quality": 2},
"модель-b": {"price_in": 0.10, "price_out": 0.50, "context": 128_000, "quality": 3},
"модель-c": {"price_in": 10.0, "price_out": 50.0, "context": 200_000, "quality": 5},
}Функции:
monthly_total(model: dict, prs_per_day: int, avg_in: int, avg_out: int, days: int = 22) -> float— месячная стоимость: число прогонов × стоимость одного прогона,round(..., 2).pick_model(models: dict, min_quality: int, avg_in: int, avg_out: int, prs_per_day: int = 20) -> str— имя самой дешёвой по месячной стоимости модели среди тех, что (а) имеютquality >= min_qualityи (б) влезают в контекст:avg_in + avg_out <= context. Если подходящих моделей нет —ValueError.
Тесты test_budget.py:
import pytest
from budget import MODELS, monthly_total, pick_model
def test_monthly_total_b():
assert monthly_total(MODELS["модель-b"], 20, 6000, 1000) == 0.48
def test_monthly_total_single():
assert monthly_total(MODELS["модель-c"], 1, 6000, 1000, days=1) == 0.11
def test_pick_prefers_cheap_with_quality():
# подходят b (quality 3) и c (quality 5); b дешевле
assert pick_model(MODELS, min_quality=3, avg_in=6000, avg_out=1000) == "модель-b"
def test_quality_gate():
# только c проходит по качеству
assert pick_model(MODELS, min_quality=4, avg_in=6000, avg_out=1000) == "модель-c"
def test_context_gate():
# a не влезает (120k > 32k), c дорогая — побеждает b
assert pick_model(MODELS, min_quality=1, avg_in=100_000, avg_out=20_000) == "модель-b"
def test_nothing_fits():
with pytest.raises(ValueError):
pick_model(MODELS, min_quality=6, avg_in=1000, avg_out=1000)Часть 2. Настоящие модели (исследование)
Кодовая часть говорит «как выбрать»; эта — «из чего». Сделайте в комментариях budget.py (или в отдельном BUDGET.md):
Возьмите три настоящие модели из разных ярусов — хотя бы две от разных вендоров. Цены выпишите с официальных страниц провайдеров (пример для OpenAI: developers.openai.com/api/docs/pricing; для остальных — их страницы цен). Рядом с каждой цифрой — источник и дата.
Прикиньте свой сценарий: сколько токенов вход/выход на один прогон вашего будущего ревьюера, сколько PR в день. Честно — «на глаз из токен-калькулятора».
Посчитайте
pick_modelна реальном наборе для трёх порогов качества (низкий/средний/высокий). Запишите вывод: какая модель и при каком условии.
Требования к этой части: каждая цифра — со ссылкой на источник и датой; никаких «по ощущениям дешевле». Если какую-то цену найти не удалось — так и напишите, не выдумывайте.
Критерии готовности
Шесть тестов зелёные.
В исследовательской части — три реальные модели, цены с источниками и датами, ваш сценарий и вердикт
pick_model.budget.pyзакоммичен рядом с остальным модулем.
Как устроены LLM: токены, контекст, цена
10 мин
Домашка: токен-калькулятор
4 мин
Квиз: Как устроены LLM: токены, контекст, цена
8 мин
Промпты как код: шаблоны и переменные
8 мин
Домашка: промпт ревьюера
3 мин
Квиз: Промпты как код: шаблоны и переменные
7 мин
Структурированный вывод: JSON вместо прозы
6 мин
Домашка: парсер ревью
3 мин
Квиз: Структурированный вывод: JSON вместо прозы
7 мин
Выбор модели: GPT, Claude, открытые
7 мин
Домашка: бенчмарк вслепую
4 мин
Квиз: Выбор модели: GPT, Claude, открытые
7 мин
HARD-задача: смета агента
3 мин
Локальная модель: Ollama по-настоящему
8 мин
Квиз: Локальная модель: Ollama по-настоящему
6 мин