Skip to content

feat(hooks): add BeforeReduceContextEvent and AfterReduceContextEvent hook events#2063

Open
Zelys-DFKH wants to merge 1 commit intostrands-agents:mainfrom
Zelys-DFKH:feat/reduce-context-hook-events
Open

feat(hooks): add BeforeReduceContextEvent and AfterReduceContextEvent hook events#2063
Zelys-DFKH wants to merge 1 commit intostrands-agents:mainfrom
Zelys-DFKH:feat/reduce-context-hook-events

Conversation

@Zelys-DFKH
Copy link
Copy Markdown

Description

When the agent handles a context window overflow it calls `reduce_context()`
synchronously, but there is no hook event around this operation. Observability
plugins and dashboards have no way to detect when context compaction happens
or how long it takes.

This change adds two new hook events that fire around the `reduce_context()`
call in `_execute_event_loop_cycle()`:

  • `BeforeReduceContextEvent` fires immediately before `reduce_context()` and
    carries the `ContextWindowOverflowException` as its `exception` attribute,
    giving subscribers access to the overflow message for logging.
  • `AfterReduceContextEvent` fires immediately after `reduce_context()` returns
    successfully. It uses reverse callback ordering, matching the cleanup
    pattern already used by `AfterToolCallEvent` and `AfterModelCallEvent`.

Both events are exported from `strands.hooks` alongside the existing events.

Example usage:

```python
from strands import Agent
from strands.hooks import BeforeReduceContextEvent, AfterReduceContextEvent

def on_before(event: BeforeReduceContextEvent) -> None:
print(f"Context reduction starting: {event.exception}")

def on_after(event: AfterReduceContextEvent) -> None:
print("Context reduction complete")

agent = Agent(...)
agent.add_hook(on_before, BeforeReduceContextEvent)
agent.add_hook(on_after, AfterReduceContextEvent)
```

Related Issues

Fixes #2048

Documentation PR

N/A

Type of Change

New feature

Testing

  • Added `test_stream_async_fires_before_and_after_reduce_context_hook_events`
    verifying both events fire in the correct order and that `BeforeReduceContextEvent`
    carries the original exception
  • All 425 existing agent and hook tests pass
  • I ran `hatch run prepare`

Checklist

  • I have read the CONTRIBUTING document
  • I have added any necessary tests that prove my fix is effective or my feature works
  • I have updated the documentation accordingly
  • I have added an appropriate example to the documentation to outline the feature, or no new docs are needed
  • My changes generate no new warnings
  • Any dependent changes have been merged and published

By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.

Fires BeforeReduceContextEvent before reduce_context() and
AfterReduceContextEvent after it returns, giving observability plugins
a way to detect and measure context compaction without polling or
inspecting internals.

Closes strands-agents#2048
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEATURE] Expose ConversationManager's reduce_context() as Hook Event

1 participant