К задачам

История диалога для LLM-агента

СложнаяАлгоритмы
Лучше работает на десктопе
Двусторонняя очередьLLM-агентыВызовы инструментовУправление состоянием

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

На вход функции приходит поток сообщений. Нужно добавлять их по одному и после каждого добавления чистить историю по двум ограничениям:

  1. Суммарный token count не должен превышать max_tokens.
  2. Количество tool calls не должно превышать max_tool_calls.

Сообщение - это словарь с полями role и content.

  • role бывает system, user, assistant, tool;
  • token count для одного сообщения в этой задаче равен len(str(message["content"]).split());
  • system и user сообщения нельзя удалять при чистке по token limit, но они все равно входят в token count;
  • tool call - это assistant сообщение, у которого content является dict с {"type": "tool_call", ...};
  • tool result - это следующее сообщение с role == "tool"; если удаляется tool call, его result тоже должен исчезнуть;
  • orphan tool result без preceding tool call нужно удалять.

Верните финальную историю после обработки всего потока.

Сигнатура

def manage_conversation_history(
    max_tokens: int,
    max_tool_calls: int,
    messages: list[dict],
) -> list[dict]:

Примеры

Пример 1

Вход:
max_tokens = 6
max_tool_calls = 10
messages = [{"role":"system","content":"fixed policy"},{"role":"user","content":"question stays"},{"role":"assistant","content":"temporary assistant answer with many words"},{"role":"user","content":"another user message"}]
Выход:[{"role":"system","content":"fixed policy"},{"role":"user","content":"question stays"},{"role":"user","content":"another user message"}]

Token pressure удаляет assistant, но сохраняет system/user

Пример 2

Вход:
max_tokens = 100
max_tool_calls = 1
messages = [{"role":"system","content":"sys"},{"role":"assistant","content":{"type":"tool_call","name":"search","arguments":{"q":"one"}}},{"role":"tool","content":"one result"},{"role":"assistant","content":"plain summary"},{"role":"assistant","content":{"type":"tool_call","name":"search","arguments":{"q":"two"}}},{"role":"tool","content":"two result"}]
Выход:[{"role":"system","content":"sys"},{"role":"assistant","content":"plain summary"},{"role":"assistant","content":{"type":"tool_call","name":"search","arguments":{"q":"two"}}},{"role":"tool","content":"two result"}]

max_tool_calls=1 удаляет старую tool-call пару

Пример 3

Вход:
max_tokens = 100
max_tool_calls = 0
messages = [{"role":"assistant","content":{"type":"tool_call","name":"search"}},{"role":"tool","content":"late result"},{"role":"user","content":"final user question"}]
Выход:[{"role":"user","content":"final user question"}]

Orphan tool result не остается после удаления tool call

Код
Python · Ctrl/⌘ + Enter для запуска
Лимит
15:00
Консоль
Нажмите кнопку запуска или Ctrl+Enter
ConversationHistory для LLM-агента — Алгоритмы задача — ML Mentor