Context Engineering для агентов

Context Engineering для агентов в 2026: step state, tool result compaction, MCP resources/tools, route-aware assembly и long-run pruning.

Context Engineering для агентов в 2026 — это уже не вопрос “какой system prompt дать модели”. Агент живёт по шагам: планирует, вызывает tools, получает результаты, делает следующий шаг, передаёт управление другому агенту или завершает run. Поэтому его контекст надо проектировать как динамический step state, а не как статичный chat history.

Главная практическая проблема здесь проста: каждый tool call производит новые данные, а большинство этих данных не нужно тащить дословно через весь agent loop.

Если чат-боту нужен просто хороший briefing, то агенту нужен рабочий журнал: что уже сделано, какие инструменты сработали, что важно прямо сейчас и что уже можно убрать в архив.

Короткая версия

Для агентных систем почти всегда нужны шесть вещей:

СлойРоль
Goal / instructionsчто агент должен сделать и по каким правилам
Step stateтекущий этап и промежуточные решения
Tool resultsсвежие результаты последнего шага
Compacted historysummary старых шагов
Available tools/resourcesчем агент может пользоваться
Output / handoff contractчто вернуть дальше: финальный ответ, task result или handoff

Что ломает агентов чаще всего

  • все tool results тащатся целиком;
  • старые шаги не compact-ятся;
  • агент не различает current state и archived state;
  • MCP/resources/tools смешаны без приоритетов;
  • handoff не передаёт структурированное состояние.
ПромптAgent step context
Текущий шаг агента:
- goal: сравнить 3 конкурента
- completed: собран pricing по 2 конкурентам
- current tool result: pricing table competitor_3
- archived summary: конкуренты 1 и 2 уже разобраны
- next action: synthesize comparison
Ответ модели

Такой контекст даёт агенту ровно то, что нужно для текущего шага, без полного raw лога всех прошлых вызовов.

1. Агентный контекст растёт по шагам, а не по сообщениям

В агенте контекст увеличивается не только из-за диалога, но и из-за:

  • tool outputs;
  • search results;
  • browser state;
  • file contents;
  • handoffs между агентами;
  • intermediate reasoning artifacts.

Поэтому transcript-first подход почти всегда быстро ломается. Agent CE должен быть step-first.

2. Step State важнее полного tool log

На каждом шаге агенту обычно нужен не весь сырой history, а:

  • текущая цель;
  • какие шаги уже выполнены;
  • какие факты уже подтверждены;
  • какой результат получен последним;
  • что делать дальше.

Это и есть step state. Он обычно намного компактнее полного лога, но намного полезнее для следующего решения.

3. Tool Result Compaction

Один из главных паттернов agent CE: tool result не живёт в контексте в полном виде дольше, чем это реально нужно.

Практически полезно делить tool output на три слоя:

СлойЧто остаётся
Fresh raw resultтолько для текущего immediate step
Extracted factsважные поля и выводы
Archived summaryкороткое описание результата старого шага

Это защищает context window от agent-run bloat.

Без техники
{ "title": "Плохо", "content": "После 6 tool calls агент несёт в контексте 6 полных JSON-ответов, поисковые snippets и длинные logs." }
С техникой
{ "title": "Лучше", "content": "В контексте только current tool result, extracted facts по прошлым шагам и compact summary старых результатов." }

4. MCP как контекстный слой, а не просто transport

MCP полезен для CE не потому, что это “новый протокол”, а потому, что он структурирует внешнюю среду агента:

  • resources дают доступ к статическим или semi-static данным;
  • tools дают действия и live data;
  • prompts/instructions могут приходить как reusable context blocks.

С точки зрения CE это означает: агенту больше не нужно заранее держать всё в prompt. Он может подтягивать нужный ресурс или tool только на текущем шаге.

5. Route-aware agent assembly

Не все шаги агента требуют одинакового контекста.

Примеры:

  • planning step: больше goal, меньше raw tool data;
  • execution step: больше tool results;
  • synthesis step: больше compact summary и extracted facts;
  • handoff step: нужен структурированный transfer packet.

То есть даже внутри одного run context assembly должен меняться по stage.

6. Long-run pruning

Для длинных agent runs без pruning всё ломается очень быстро. Здоровый long-run pattern обычно такой:

  1. последние 1-2 шага живут почти дословно;
  2. средние шаги превращаются в extracted facts;
  3. старые шаги уходят в archived summary;
  4. raw artifacts остаются вне prompt, но доступны по ссылке/resource.

Это особенно важно для:

  • research agents;
  • coding agents;
  • browser/computer-use agents;
  • workflow orchestrators.

7. Handoffs должны переносить state, а не transcript

Когда агент передаёт работу другому агенту, полезнее всего передать:

  • goal;
  • current status;
  • confirmed facts;
  • unresolved questions;
  • next expected action;
  • required tools/resources.

Это лучше, чем просто кидать весь предыдущий transcript другому specialist agent.

8. Context budget for agents

Агентам почти всегда нужен более жёсткий budget control, чем обычным chat-системам, потому что:

  • tool results растут непредсказуемо;
  • step count увеличивается;
  • synthesis steps легко получают слишком много старого state;
  • handoffs добавляют ещё один слой context.

Хороший budget обычно разделяет:

  • instructions;
  • goal/state;
  • current tools;
  • archived summary;
  • output reserve.

9. Что обычно мониторят

Минимум полезных агентных CE-метрик:

10. Healthy agent CE stack

Для большинства агентных систем практичный стек выглядит так:

  1. versioned agent instructions;
  2. explicit tool/resource surface;
  3. step state как основной рабочий слой;
  4. compacted run history;
  5. structured handoff packets;
  6. traces и pruning metrics.

Плюсы

  • Делает agent loops устойчивее и дешевле
  • Снижает context bloat от tool results
  • Улучшает качество handoff между specialist agents
  • Хорошо стыкуется с MCP и trace-first debugging

Минусы

  • Требует отдельной логики step-state и compaction
  • Неправильный pruning может выбросить важный факт
  • Сложнее, чем обычный chat memory
  • Без structured handoff multi-agent система быстро деградирует

Пример step-state packet

from dataclasses import dataclass, field


@dataclass
class AgentState:
    goal: str
    completed_steps: list[str] = field(default_factory=list)
    confirmed_facts: list[str] = field(default_factory=list)
    last_tool_result: dict | None = None
    archived_summary: str = ""
    next_action: str = ""


def build_agent_context(state: AgentState) -> str:
    parts = [f"Goal: {state.goal}"]

    if state.completed_steps:
        parts.append("Completed steps:\n- " + "\n- ".join(state.completed_steps[-5:]))

    if state.confirmed_facts:
        parts.append("Confirmed facts:\n- " + "\n- ".join(state.confirmed_facts[:10]))

    if state.archived_summary:
        parts.append(f"Archived summary:\n{state.archived_summary}")

    if state.last_tool_result:
        parts.append(f"Latest tool result:\n{state.last_tool_result}")

    if state.next_action:
        parts.append(f"Next action: {state.next_action}")

    return "\n\n".join(parts)

Ключевая мысль:

  • агент думает не по полному transcript;
  • он думает по compact state packet;
  • свежий tool result отделён от archived history.
Проверьте себя

1. Что полезнее всего переносить между шагами агента?

2. Почему tool result compaction так важен?

3. Что лучше передавать в handoff между агентами?