Задача. REST API и сборка контекста для LLM

Задача: Необходимо разработать сервис для LLM-чата. Перед отправкой запроса в модель нужно собрать список сообщений так, чтобы уложиться в лимит токенов. Реализуйте endpoint POST /prepare-context.

Нужно написать FastAPI-приложение с одним endpoint, который принимает системный промпт, историю сообщений и лимиты, а возвращает готовый список сообщений для LLM.

Входные данные

{
  "system_prompt": "Ты HR-консультант.",
  "messages": [
    {"role": "user", "content": "Привет"},
    {"role": "assistant", "content": "Здравствуйте!"},
    {"role": "user", "content": "Что такое ИПР?"}
  ],
  "max_tokens": 1000,
  "reserve_for_answer": 200
}

Выходные данные

{
  "messages": [
    {"role": "system", "content": "Ты HR-консультант."},
    {"role": "assistant", "content": "Здравствуйте!"},
    {"role": "user", "content": "Что такое ИПР?"}
  ],
  "total_tokens": 850,
  "dropped_count": 1
}

Правила алгоритма:

  1. Системный промпт сохраняется всегда.
  2. Бюджет для истории = max_tokens - reserve_for_answer - токены(system_prompt).
  3. Идём от новых сообщений к старым.
  4. Порядок сообщений в ответе должен быть исходным.
  5. Если даже системный промпт не влезает — вернуть ошибку 400.
  6. Если последнее сообщение само не влезает — можно его обрезать или вернуть ошибку.

Токенизация

Можно использовать tiktoken, либо для простоты len(text.split()).

Требования