mirror of
https://github.com/hwchase17/langchain.git
synced 2025-07-04 20:28:10 +00:00
Allow callback handlers to opt into being run inline (#6424)
This is useful eg for callback handlers that use context vars (like open telemetry) See https://github.com/hwchase17/langchain/pull/6095
This commit is contained in:
parent
a9108c1809
commit
74ac6fb6b9
@ -194,6 +194,8 @@ class BaseCallbackHandler(
|
|||||||
|
|
||||||
raise_error: bool = False
|
raise_error: bool = False
|
||||||
|
|
||||||
|
run_inline: bool = False
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def ignore_llm(self) -> bool:
|
def ignore_llm(self) -> bool:
|
||||||
"""Whether to ignore LLM callbacks."""
|
"""Whether to ignore LLM callbacks."""
|
||||||
|
@ -224,9 +224,12 @@ async def _ahandle_event_for_handler(
|
|||||||
if asyncio.iscoroutinefunction(event):
|
if asyncio.iscoroutinefunction(event):
|
||||||
await event(*args, **kwargs)
|
await event(*args, **kwargs)
|
||||||
else:
|
else:
|
||||||
await asyncio.get_event_loop().run_in_executor(
|
if handler.run_inline:
|
||||||
None, functools.partial(event, *args, **kwargs)
|
event(*args, **kwargs)
|
||||||
)
|
else:
|
||||||
|
await asyncio.get_event_loop().run_in_executor(
|
||||||
|
None, functools.partial(event, *args, **kwargs)
|
||||||
|
)
|
||||||
except NotImplementedError as e:
|
except NotImplementedError as e:
|
||||||
if event_name == "on_chat_model_start":
|
if event_name == "on_chat_model_start":
|
||||||
message_strings = [get_buffer_string(m) for m in args[1]]
|
message_strings = [get_buffer_string(m) for m in args[1]]
|
||||||
@ -259,12 +262,17 @@ async def _ahandle_event(
|
|||||||
**kwargs: Any,
|
**kwargs: Any,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Generic event handler for AsyncCallbackManager."""
|
"""Generic event handler for AsyncCallbackManager."""
|
||||||
|
for handler in [h for h in handlers if h.run_inline]:
|
||||||
|
await _ahandle_event_for_handler(
|
||||||
|
handler, event_name, ignore_condition_name, *args, **kwargs
|
||||||
|
)
|
||||||
await asyncio.gather(
|
await asyncio.gather(
|
||||||
*(
|
*(
|
||||||
_ahandle_event_for_handler(
|
_ahandle_event_for_handler(
|
||||||
handler, event_name, ignore_condition_name, *args, **kwargs
|
handler, event_name, ignore_condition_name, *args, **kwargs
|
||||||
)
|
)
|
||||||
for handler in handlers
|
for handler in handlers
|
||||||
|
if not handler.run_inline
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user