Нужно реализовать упрощенный менеджер истории диалога для LLM-агента.
На вход функции приходит поток сообщений. Нужно добавлять их по одному и после каждого добавления чистить историю по двум ограничениям:
max_tokens.max_tool_calls.Сообщение - это словарь с полями role и content.
role бывает system, user, assistant, tool;len(str(message["content"]).split());system и user сообщения нельзя удалять при чистке по token limit, но они все равно входят в token count;assistant сообщение, у которого content является dict с {"type": "tool_call", ...};role == "tool"; если удаляется tool call, его result тоже должен исчезнуть;Верните финальную историю после обработки всего потока.
def manage_conversation_history(
max_tokens: int,
max_tool_calls: int,
messages: list[dict],
) -> list[dict]:max_tokens = 6max_tool_calls = 10messages = [{"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
max_tokens = 100max_tool_calls = 1messages = [{"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 пару
max_tokens = 100max_tool_calls = 0messages = [{"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