Skip to content

Track hooks in a HookRegistry, rather than in globals#213

Merged
msullivan merged 1 commit into
mainfrom
hook-registry
Jul 10, 2026
Merged

Track hooks in a HookRegistry, rather than in globals#213
msullivan merged 1 commit into
mainfrom
hook-registry

Conversation

@msullivan

Copy link
Copy Markdown
Contributor

Storing it in globals is a smell in general, and I found a specific
case where it can cause problems: when using vercel workflow, we
sometimes have the same workflow running on two threads at the same
time, and they will have the same hook names.

The current HookRegistry is tracked in a contextvar. By default
Agent.run will use the current registry and will create a fresh
registry if one does not exist. It can also take a hook_registry to
use as an argument.

This means that subagents by default will inherit the parent's hook
context. I could go either way on this?

I also dropped the runtime tracking of hooks, since the cleanup will
happen when the HookRegistry gets torn down.
That is a bit of a change for subagents, though not a big one.
hook_impl deregisters the hook on exceptions now, though, and not just
success.

Everything that signals hooks gains an optional registry argument.

This does require changes in some client code, if the hook signalling
isn't from inside the agent.run.

Storing it in globals is a smell in general, and I found a specific
case where it can cause problems: when using vercel workflow, we
sometimes have the same workflow running on two threads at the same
time, and they will have the same hook names.

The current HookRegistry is tracked in a contextvar. By default
`Agent.run` will use the current registry and will create a fresh
registry if one does not exist. It can also take a hook_registry to
use as an argument.

This means that subagents by default will inherit the parent's hook
context. I could go either way on this?

I also dropped the runtime tracking of hooks, since the cleanup will
happen when the HookRegistry gets torn down.
That is a bit of a change for subagents, though not a big one.
hook_impl deregisters the hook on exceptions now, though, and not just
success.

Everything that signals hooks gains an optional `registry` argument.

This does require changes in some client code, if the hook signalling
isn't from inside the `agent.run`.
@msullivan
msullivan requested a review from anbuzin July 10, 2026 21:07
@vercel

vercel Bot commented Jul 10, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
ai-python Ready Ready Preview, Comment Jul 10, 2026 9:09pm

@msullivan
msullivan merged commit faafcc0 into main Jul 10, 2026
7 checks passed
@msullivan
msullivan deleted the hook-registry branch July 10, 2026 22:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants