mirror of
https://github.com/HKUDS/nanobot.git
synced 2026-05-02 07:45:54 +00:00
refactor(hook): add reraise flag to AgentHook and remove _LoopHookChain
Add reraise parameter to AgentHook so hooks can opt out of exception swallowing in CompositeHook._for_each_hook_safe. _LoopHook sets reraise=True to let its exceptions propagate. _LoopHookChain is removed and replaced with CompositeHook([loop_hook] + extra_hooks). Signed-off-by: Lingao Meng <menglingao@xiaomi.com>
This commit is contained in:
parent
142cb46956
commit
d88be08bfd
@ -29,6 +29,9 @@ class AgentHookContext:
|
|||||||
class AgentHook:
|
class AgentHook:
|
||||||
"""Minimal lifecycle surface for shared runner customization."""
|
"""Minimal lifecycle surface for shared runner customization."""
|
||||||
|
|
||||||
|
def __init__(self, reraise: bool = False) -> None:
|
||||||
|
self._reraise = reraise
|
||||||
|
|
||||||
def wants_streaming(self) -> bool:
|
def wants_streaming(self) -> bool:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@ -69,6 +72,10 @@ class CompositeHook(AgentHook):
|
|||||||
|
|
||||||
async def _for_each_hook_safe(self, method_name: str, *args: Any, **kwargs: Any) -> None:
|
async def _for_each_hook_safe(self, method_name: str, *args: Any, **kwargs: Any) -> None:
|
||||||
for h in self._hooks:
|
for h in self._hooks:
|
||||||
|
if h._reraise:
|
||||||
|
await getattr(h, method_name)(*args, **kwargs)
|
||||||
|
continue
|
||||||
|
|
||||||
try:
|
try:
|
||||||
await getattr(h, method_name)(*args, **kwargs)
|
await getattr(h, method_name)(*args, **kwargs)
|
||||||
except Exception:
|
except Exception:
|
||||||
|
|||||||
@ -54,6 +54,7 @@ class _LoopHook(AgentHook):
|
|||||||
chat_id: str = "direct",
|
chat_id: str = "direct",
|
||||||
message_id: str | None = None,
|
message_id: str | None = None,
|
||||||
) -> None:
|
) -> None:
|
||||||
|
super().__init__(reraise=True)
|
||||||
self._loop = agent_loop
|
self._loop = agent_loop
|
||||||
self._on_progress = on_progress
|
self._on_progress = on_progress
|
||||||
self._on_stream = on_stream
|
self._on_stream = on_stream
|
||||||
@ -108,44 +109,6 @@ class _LoopHook(AgentHook):
|
|||||||
def finalize_content(self, context: AgentHookContext, content: str | None) -> str | None:
|
def finalize_content(self, context: AgentHookContext, content: str | None) -> str | None:
|
||||||
return self._loop._strip_think(content)
|
return self._loop._strip_think(content)
|
||||||
|
|
||||||
|
|
||||||
class _LoopHookChain(AgentHook):
|
|
||||||
"""Run the core hook before extra hooks."""
|
|
||||||
|
|
||||||
__slots__ = ("_primary", "_extras")
|
|
||||||
|
|
||||||
def __init__(self, primary: AgentHook, extra_hooks: list[AgentHook]) -> None:
|
|
||||||
self._primary = primary
|
|
||||||
self._extras = CompositeHook(extra_hooks)
|
|
||||||
|
|
||||||
def wants_streaming(self) -> bool:
|
|
||||||
return self._primary.wants_streaming() or self._extras.wants_streaming()
|
|
||||||
|
|
||||||
async def before_iteration(self, context: AgentHookContext) -> None:
|
|
||||||
await self._primary.before_iteration(context)
|
|
||||||
await self._extras.before_iteration(context)
|
|
||||||
|
|
||||||
async def on_stream(self, context: AgentHookContext, delta: str) -> None:
|
|
||||||
await self._primary.on_stream(context, delta)
|
|
||||||
await self._extras.on_stream(context, delta)
|
|
||||||
|
|
||||||
async def on_stream_end(self, context: AgentHookContext, *, resuming: bool) -> None:
|
|
||||||
await self._primary.on_stream_end(context, resuming=resuming)
|
|
||||||
await self._extras.on_stream_end(context, resuming=resuming)
|
|
||||||
|
|
||||||
async def before_execute_tools(self, context: AgentHookContext) -> None:
|
|
||||||
await self._primary.before_execute_tools(context)
|
|
||||||
await self._extras.before_execute_tools(context)
|
|
||||||
|
|
||||||
async def after_iteration(self, context: AgentHookContext) -> None:
|
|
||||||
await self._primary.after_iteration(context)
|
|
||||||
await self._extras.after_iteration(context)
|
|
||||||
|
|
||||||
def finalize_content(self, context: AgentHookContext, content: str | None) -> str | None:
|
|
||||||
content = self._primary.finalize_content(context, content)
|
|
||||||
return self._extras.finalize_content(context, content)
|
|
||||||
|
|
||||||
|
|
||||||
class AgentLoop:
|
class AgentLoop:
|
||||||
"""
|
"""
|
||||||
The agent loop is the core processing engine.
|
The agent loop is the core processing engine.
|
||||||
@ -359,7 +322,7 @@ class AgentLoop:
|
|||||||
message_id=message_id,
|
message_id=message_id,
|
||||||
)
|
)
|
||||||
hook: AgentHook = (
|
hook: AgentHook = (
|
||||||
_LoopHookChain(loop_hook, self._extra_hooks)
|
CompositeHook([loop_hook] + self._extra_hooks)
|
||||||
if self._extra_hooks
|
if self._extra_hooks
|
||||||
else loop_hook
|
else loop_hook
|
||||||
)
|
)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user