From 035a9c96092d193219ec2fac7dcfbb152f692b20 Mon Sep 17 00:00:00 2001 From: Eugene Yurtsev Date: Thu, 6 Jun 2024 16:14:28 -0400 Subject: [PATCH] core[minor]: Add parent_ids to astream_events API (#22563) Include a list of parent ids for each event in astream events. --- libs/core/langchain_core/runnables/base.py | 8 +- libs/core/langchain_core/runnables/schema.py | 18 +- .../langchain_core/tracers/event_stream.py | 155 ++++++++--- .../runnables/test_runnable_events_v1.py | 135 +++++++++ .../runnables/test_runnable_events_v2.py | 258 +++++++++++++++++- 5 files changed, 530 insertions(+), 44 deletions(-) diff --git a/libs/core/langchain_core/runnables/base.py b/libs/core/langchain_core/runnables/base.py index cac9608dd9..21bf63a284 100644 --- a/libs/core/langchain_core/runnables/base.py +++ b/libs/core/langchain_core/runnables/base.py @@ -959,6 +959,11 @@ class Runnable(Generic[Input, Output], ABC): the runnable that emitted the event. A child runnable that gets invoked as part of the execution of a parent runnable is assigned its own unique ID. + - ``parent_ids``: **List[str]** - The IDs of the parent runnables that + generated the event. The root runnable will have an empty list. + The order of the parent IDs is from the root to the immediate parent. + Only available for v2 version of the API. The v1 version of the API + will return an empty list. - ``tags``: **Optional[List[str]]** - The tags of the runnable that generated the event. - ``metadata``: **Optional[Dict[str, Any]]** - The metadata of the runnable @@ -1051,7 +1056,8 @@ class Runnable(Generic[Input, Output], ABC): event async for event in chain.astream_events("hello", version="v2") ] - # will produce the following events (run_id has been omitted for brevity): + # will produce the following events (run_id, and parent_ids + # has been omitted for brevity): [ { "data": {"input": "hello"}, diff --git a/libs/core/langchain_core/runnables/schema.py b/libs/core/langchain_core/runnables/schema.py index db4ad13a34..63b0a4311c 100644 --- a/libs/core/langchain_core/runnables/schema.py +++ b/libs/core/langchain_core/runnables/schema.py @@ -1,7 +1,7 @@ """Module contains typedefs that are used with runnables.""" from __future__ import annotations -from typing import Any, Dict, List +from typing import Any, Dict, List, Sequence from typing_extensions import NotRequired, TypedDict @@ -54,7 +54,8 @@ class StreamEvent(TypedDict): events = [event async for event in chain.astream_events("hello")] - # will produce the following events (run_id has been omitted for brevity): + # will produce the following events + # (where some fields have been omitted for brevity): [ { "data": {"input": "hello"}, @@ -131,3 +132,16 @@ class StreamEvent(TypedDict): The contents of the event data depend on the event type. """ + + parent_ids: Sequence[str] + """A list of the parent IDs associated with this event. + + Root Events will have an empty list. + + For example, if a Runnable A calls Runnable B, then the event generated by Runnable + B will have Runnable A's ID in the parent_ids field. + + The order of the parent IDs is from the root parent to the immediate parent. + + Only supported as of v2 of the astream events API. v1 will return an empty list. + """ diff --git a/libs/core/langchain_core/tracers/event_stream.py b/libs/core/langchain_core/tracers/event_stream.py index ee591d46a1..f519debaa1 100644 --- a/libs/core/langchain_core/tracers/event_stream.py +++ b/libs/core/langchain_core/tracers/event_stream.py @@ -54,6 +54,7 @@ class RunInfo(TypedDict): metadata: Dict[str, Any] run_type: str inputs: NotRequired[Any] + parent_run_id: Optional[UUID] def _assign_name(name: Optional[str], serialized: Dict[str, Any]) -> str: @@ -87,7 +88,16 @@ class _AstreamEventsCallbackHandler(AsyncCallbackHandler, _StreamingCallbackHand """Initialize the tracer.""" super().__init__(*args, **kwargs) # Map of run ID to run info. + # the entry corresponding to a given run id is cleaned + # up when each corresponding run ends. self.run_map: Dict[UUID, RunInfo] = {} + # The callback event that corresponds to the end of a parent run + # may be invoked BEFORE the callback event that corresponds to the end + # of a child run, which results in clean up of run_map. + # So we keep track of the mapping between children and parent run IDs + # in a separate container. This container is GCed when the tracer is GCed. + self.parent_map: Dict[UUID, Optional[UUID]] = {} + self.is_tapped: Dict[UUID, Any] = {} # Filter which events will be sent over the queue. @@ -105,6 +115,17 @@ class _AstreamEventsCallbackHandler(AsyncCallbackHandler, _StreamingCallbackHand self.send_stream = memory_stream.get_send_stream() self.receive_stream = memory_stream.get_receive_stream() + def _get_parent_ids(self, run_id: UUID) -> List[str]: + """Get the parent IDs of a run (non-recursively) cast to strings.""" + parent_ids = [] + parent_id = self.parent_map[run_id] + + while parent_id is not None: + parent_ids.append(str(parent_id)) + parent_id = self.parent_map[parent_id] + + return parent_ids + def _send(self, event: StreamEvent, event_type: str) -> None: """Send an event to the stream.""" if self.root_event_filter.include_event(event, event_type): @@ -140,6 +161,7 @@ class _AstreamEventsCallbackHandler(AsyncCallbackHandler, _StreamingCallbackHand "tags": run_info["tags"], "metadata": run_info["metadata"], "data": {}, + "parent_ids": self._get_parent_ids(run_id), } self._send({**event, "data": {"chunk": first}}, run_info["run_type"]) yield cast(T, first) @@ -181,6 +203,7 @@ class _AstreamEventsCallbackHandler(AsyncCallbackHandler, _StreamingCallbackHand "tags": run_info["tags"], "metadata": run_info["metadata"], "data": {}, + "parent_ids": self._get_parent_ids(run_id), } self._send({**event, "data": {"chunk": first}}, run_info["run_type"]) yield cast(T, first) @@ -198,6 +221,35 @@ class _AstreamEventsCallbackHandler(AsyncCallbackHandler, _StreamingCallbackHand for chunk in output: yield chunk + def _write_run_start_info( + self, + run_id: UUID, + *, + tags: Optional[List[str]], + metadata: Optional[Dict[str, Any]], + parent_run_id: Optional[UUID], + name_: str, + run_type: str, + **kwargs: Any, + ) -> None: + """Update the run info.""" + info: RunInfo = { + "tags": tags or [], + "metadata": metadata or {}, + "name": name_, + "run_type": run_type, + "parent_run_id": parent_run_id, + } + + if "inputs" in kwargs: + # Handle inputs in a special case to allow inputs to be an + # optionally provided and distinguish between missing value + # vs. None value. + info["inputs"] = kwargs["inputs"] + + self.run_map[run_id] = info + self.parent_map[run_id] = parent_run_id + async def on_chat_model_start( self, serialized: Dict[str, Any], @@ -213,13 +265,16 @@ class _AstreamEventsCallbackHandler(AsyncCallbackHandler, _StreamingCallbackHand """Start a trace for an LLM run.""" name_ = _assign_name(name, serialized) run_type = "chat_model" - self.run_map[run_id] = { - "tags": tags or [], - "metadata": metadata or {}, - "name": name_, - "run_type": run_type, - "inputs": {"messages": messages}, - } + + self._write_run_start_info( + run_id, + tags=tags, + metadata=metadata, + parent_run_id=parent_run_id, + name_=name_, + run_type=run_type, + inputs={"messages": messages}, + ) self._send( { @@ -231,6 +286,7 @@ class _AstreamEventsCallbackHandler(AsyncCallbackHandler, _StreamingCallbackHand "tags": tags or [], "run_id": str(run_id), "metadata": metadata or {}, + "parent_ids": self._get_parent_ids(run_id), }, run_type, ) @@ -250,13 +306,16 @@ class _AstreamEventsCallbackHandler(AsyncCallbackHandler, _StreamingCallbackHand """Start a trace for an LLM run.""" name_ = _assign_name(name, serialized) run_type = "llm" - self.run_map[run_id] = { - "tags": tags or [], - "metadata": metadata or {}, - "name": name_, - "run_type": run_type, - "inputs": {"prompts": prompts}, - } + + self._write_run_start_info( + run_id, + tags=tags, + metadata=metadata, + parent_run_id=parent_run_id, + name_=name_, + run_type=run_type, + inputs={"prompts": prompts}, + ) self._send( { @@ -270,6 +329,7 @@ class _AstreamEventsCallbackHandler(AsyncCallbackHandler, _StreamingCallbackHand "tags": tags or [], "run_id": str(run_id), "metadata": metadata or {}, + "parent_ids": self._get_parent_ids(run_id), }, run_type, ) @@ -285,7 +345,6 @@ class _AstreamEventsCallbackHandler(AsyncCallbackHandler, _StreamingCallbackHand ) -> None: """Run on new LLM token. Only available when streaming is enabled.""" run_info = self.run_map.get(run_id) - chunk_: Union[GenerationChunk, BaseMessageChunk] if run_info is None: @@ -319,6 +378,7 @@ class _AstreamEventsCallbackHandler(AsyncCallbackHandler, _StreamingCallbackHand "name": run_info["name"], "tags": run_info["tags"], "metadata": run_info["metadata"], + "parent_ids": self._get_parent_ids(run_id), }, run_info["run_type"], ) @@ -371,6 +431,7 @@ class _AstreamEventsCallbackHandler(AsyncCallbackHandler, _StreamingCallbackHand "name": run_info["name"], "tags": run_info["tags"], "metadata": run_info["metadata"], + "parent_ids": self._get_parent_ids(run_id), }, run_info["run_type"], ) @@ -391,12 +452,6 @@ class _AstreamEventsCallbackHandler(AsyncCallbackHandler, _StreamingCallbackHand """Start a trace for a chain run.""" name_ = _assign_name(name, serialized) run_type_ = run_type or "chain" - run_info: RunInfo = { - "tags": tags or [], - "metadata": metadata or {}, - "name": name_, - "run_type": run_type_, - } data: EventData = {} @@ -404,9 +459,17 @@ class _AstreamEventsCallbackHandler(AsyncCallbackHandler, _StreamingCallbackHand # cases. if inputs != {"input": ""}: data["input"] = inputs - run_info["inputs"] = inputs - - self.run_map[run_id] = run_info + kwargs["inputs"] = inputs + + self._write_run_start_info( + run_id, + tags=tags, + metadata=metadata, + parent_run_id=parent_run_id, + name_=name_, + run_type=run_type_, + **kwargs, + ) self._send( { @@ -416,6 +479,7 @@ class _AstreamEventsCallbackHandler(AsyncCallbackHandler, _StreamingCallbackHand "tags": tags or [], "run_id": str(run_id), "metadata": metadata or {}, + "parent_ids": self._get_parent_ids(run_id), }, run_type_, ) @@ -449,6 +513,7 @@ class _AstreamEventsCallbackHandler(AsyncCallbackHandler, _StreamingCallbackHand "name": run_info["name"], "tags": run_info["tags"], "metadata": run_info["metadata"], + "parent_ids": self._get_parent_ids(run_id), }, run_type, ) @@ -468,13 +533,16 @@ class _AstreamEventsCallbackHandler(AsyncCallbackHandler, _StreamingCallbackHand ) -> None: """Start a trace for a tool run.""" name_ = _assign_name(name, serialized) - self.run_map[run_id] = { - "tags": tags or [], - "metadata": metadata or {}, - "name": name_, - "run_type": "tool", - "inputs": inputs, - } + + self._write_run_start_info( + run_id, + tags=tags, + metadata=metadata, + parent_run_id=parent_run_id, + name_=name_, + run_type="tool", + inputs=inputs, + ) self._send( { @@ -486,6 +554,7 @@ class _AstreamEventsCallbackHandler(AsyncCallbackHandler, _StreamingCallbackHand "tags": tags or [], "run_id": str(run_id), "metadata": metadata or {}, + "parent_ids": self._get_parent_ids(run_id), }, "tool", ) @@ -511,6 +580,7 @@ class _AstreamEventsCallbackHandler(AsyncCallbackHandler, _StreamingCallbackHand "name": run_info["name"], "tags": run_info["tags"], "metadata": run_info["metadata"], + "parent_ids": self._get_parent_ids(run_id), }, "tool", ) @@ -530,13 +600,16 @@ class _AstreamEventsCallbackHandler(AsyncCallbackHandler, _StreamingCallbackHand """Run when Retriever starts running.""" name_ = _assign_name(name, serialized) run_type = "retriever" - self.run_map[run_id] = { - "tags": tags or [], - "metadata": metadata or {}, - "name": name_, - "run_type": run_type, - "inputs": {"query": query}, - } + + self._write_run_start_info( + run_id, + tags=tags, + metadata=metadata, + parent_run_id=parent_run_id, + name_=name_, + run_type=run_type, + inputs={"query": query}, + ) self._send( { @@ -550,6 +623,7 @@ class _AstreamEventsCallbackHandler(AsyncCallbackHandler, _StreamingCallbackHand "tags": tags or [], "run_id": str(run_id), "metadata": metadata or {}, + "parent_ids": self._get_parent_ids(run_id), }, run_type, ) @@ -571,6 +645,7 @@ class _AstreamEventsCallbackHandler(AsyncCallbackHandler, _StreamingCallbackHand "name": run_info["name"], "tags": run_info["tags"], "metadata": run_info["metadata"], + "parent_ids": self._get_parent_ids(run_id), }, run_info["run_type"], ) @@ -660,6 +735,7 @@ async def _astream_events_implementation_v1( data={ "input": input, }, + parent_ids=[], # Not supported in v1 ) if _root_event_filter.include_event(event, state["type"]): @@ -722,6 +798,7 @@ async def _astream_events_implementation_v1( tags=log_entry["tags"], metadata=log_entry["metadata"], data=data, + parent_ids=[], # Not supported in v1 ) # Finally, we take care of the streaming output from the root chain @@ -747,6 +824,7 @@ async def _astream_events_implementation_v1( metadata=root_metadata, name=root_name, data=data, + parent_ids=[], # Not supported in v1 ) if _root_event_filter.include_event(event, state["type"]): yield event @@ -763,6 +841,7 @@ async def _astream_events_implementation_v1( data={ "output": state["final_output"], }, + parent_ids=[], # Not supported in v1 ) if _root_event_filter.include_event(event, state["type"]): yield event diff --git a/libs/core/tests/unit_tests/runnables/test_runnable_events_v1.py b/libs/core/tests/unit_tests/runnables/test_runnable_events_v1.py index 26d0825d54..c448abb61f 100644 --- a/libs/core/tests/unit_tests/runnables/test_runnable_events_v1.py +++ b/libs/core/tests/unit_tests/runnables/test_runnable_events_v1.py @@ -34,6 +34,10 @@ from tests.unit_tests.stubs import AnyStr def _with_nulled_run_id(events: Sequence[StreamEvent]) -> List[StreamEvent]: """Removes the run ids from events.""" + for event in events: + assert "parent_ids" in event, "Parent ids should be present in the event." + assert event["parent_ids"] == [], "Parent ids should be empty." + return cast(List[StreamEvent], [{**event, "run_id": ""} for event in events]) @@ -70,6 +74,7 @@ async def test_event_stream_with_simple_function_tool() -> None: { "event": "on_chain_start", "run_id": "", + "parent_ids": [], "name": "RunnableSequence", "tags": [], "metadata": {}, @@ -79,6 +84,7 @@ async def test_event_stream_with_simple_function_tool() -> None: "event": "on_chain_start", "name": "foo", "run_id": "", + "parent_ids": [], "tags": ["seq:step:1"], "metadata": {}, "data": {}, @@ -87,6 +93,7 @@ async def test_event_stream_with_simple_function_tool() -> None: "event": "on_chain_stream", "name": "foo", "run_id": "", + "parent_ids": [], "tags": ["seq:step:1"], "metadata": {}, "data": {"chunk": {"x": 5}}, @@ -95,6 +102,7 @@ async def test_event_stream_with_simple_function_tool() -> None: "event": "on_chain_end", "name": "foo", "run_id": "", + "parent_ids": [], "tags": ["seq:step:1"], "metadata": {}, "data": {"input": {}, "output": {"x": 5}}, @@ -103,6 +111,7 @@ async def test_event_stream_with_simple_function_tool() -> None: "event": "on_tool_start", "name": "get_docs", "run_id": "", + "parent_ids": [], "tags": ["seq:step:2"], "metadata": {}, "data": {"input": {"x": 5}}, @@ -111,6 +120,7 @@ async def test_event_stream_with_simple_function_tool() -> None: "event": "on_tool_end", "name": "get_docs", "run_id": "", + "parent_ids": [], "tags": ["seq:step:2"], "metadata": {}, "data": {"input": {"x": 5}, "output": [Document(page_content="hello")]}, @@ -118,6 +128,7 @@ async def test_event_stream_with_simple_function_tool() -> None: { "event": "on_chain_stream", "run_id": "", + "parent_ids": [], "tags": [], "metadata": {}, "name": "RunnableSequence", @@ -127,6 +138,7 @@ async def test_event_stream_with_simple_function_tool() -> None: "event": "on_chain_end", "name": "RunnableSequence", "run_id": "", + "parent_ids": [], "tags": [], "metadata": {}, "data": {"output": [Document(page_content="hello")]}, @@ -151,6 +163,7 @@ async def test_event_stream_with_single_lambda() -> None: "metadata": {}, "name": "reverse", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -159,6 +172,7 @@ async def test_event_stream_with_single_lambda() -> None: "metadata": {}, "name": "reverse", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -167,6 +181,7 @@ async def test_event_stream_with_single_lambda() -> None: "metadata": {}, "name": "reverse", "run_id": "", + "parent_ids": [], "tags": [], }, ] @@ -192,6 +207,7 @@ async def test_event_stream_with_triple_lambda() -> None: "metadata": {}, "name": "RunnableSequence", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -200,6 +216,7 @@ async def test_event_stream_with_triple_lambda() -> None: "metadata": {}, "name": "1", "run_id": "", + "parent_ids": [], "tags": ["seq:step:1"], }, { @@ -208,6 +225,7 @@ async def test_event_stream_with_triple_lambda() -> None: "metadata": {}, "name": "1", "run_id": "", + "parent_ids": [], "tags": ["seq:step:1"], }, { @@ -216,6 +234,7 @@ async def test_event_stream_with_triple_lambda() -> None: "metadata": {}, "name": "2", "run_id": "", + "parent_ids": [], "tags": ["seq:step:2"], }, { @@ -224,6 +243,7 @@ async def test_event_stream_with_triple_lambda() -> None: "metadata": {}, "name": "1", "run_id": "", + "parent_ids": [], "tags": ["seq:step:1"], }, { @@ -232,6 +252,7 @@ async def test_event_stream_with_triple_lambda() -> None: "metadata": {}, "name": "2", "run_id": "", + "parent_ids": [], "tags": ["seq:step:2"], }, { @@ -240,6 +261,7 @@ async def test_event_stream_with_triple_lambda() -> None: "metadata": {}, "name": "3", "run_id": "", + "parent_ids": [], "tags": ["seq:step:3"], }, { @@ -248,6 +270,7 @@ async def test_event_stream_with_triple_lambda() -> None: "metadata": {}, "name": "2", "run_id": "", + "parent_ids": [], "tags": ["seq:step:2"], }, { @@ -256,6 +279,7 @@ async def test_event_stream_with_triple_lambda() -> None: "metadata": {}, "name": "3", "run_id": "", + "parent_ids": [], "tags": ["seq:step:3"], }, { @@ -264,6 +288,7 @@ async def test_event_stream_with_triple_lambda() -> None: "metadata": {}, "name": "RunnableSequence", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -272,6 +297,7 @@ async def test_event_stream_with_triple_lambda() -> None: "metadata": {}, "name": "3", "run_id": "", + "parent_ids": [], "tags": ["seq:step:3"], }, { @@ -280,6 +306,7 @@ async def test_event_stream_with_triple_lambda() -> None: "metadata": {}, "name": "RunnableSequence", "run_id": "", + "parent_ids": [], "tags": [], }, ] @@ -309,6 +336,7 @@ async def test_event_stream_with_triple_lambda_test_filtering() -> None: "metadata": {}, "name": "1", "run_id": "", + "parent_ids": [], "tags": ["seq:step:1"], }, { @@ -317,6 +345,7 @@ async def test_event_stream_with_triple_lambda_test_filtering() -> None: "metadata": {}, "name": "1", "run_id": "", + "parent_ids": [], "tags": ["seq:step:1"], }, { @@ -325,6 +354,7 @@ async def test_event_stream_with_triple_lambda_test_filtering() -> None: "metadata": {}, "name": "1", "run_id": "", + "parent_ids": [], "tags": ["seq:step:1"], }, ] @@ -341,6 +371,7 @@ async def test_event_stream_with_triple_lambda_test_filtering() -> None: "metadata": {}, "name": "3", "run_id": "", + "parent_ids": [], "tags": ["my_tag", "seq:step:3"], }, { @@ -349,6 +380,7 @@ async def test_event_stream_with_triple_lambda_test_filtering() -> None: "metadata": {}, "name": "3", "run_id": "", + "parent_ids": [], "tags": ["my_tag", "seq:step:3"], }, { @@ -357,6 +389,7 @@ async def test_event_stream_with_triple_lambda_test_filtering() -> None: "metadata": {}, "name": "3", "run_id": "", + "parent_ids": [], "tags": ["my_tag", "seq:step:3"], }, ] @@ -376,6 +409,7 @@ async def test_event_stream_with_lambdas_from_lambda() -> None: "metadata": {}, "name": "my_lambda", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -384,6 +418,7 @@ async def test_event_stream_with_lambdas_from_lambda() -> None: "metadata": {}, "name": "my_lambda", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -392,6 +427,7 @@ async def test_event_stream_with_lambdas_from_lambda() -> None: "metadata": {}, "name": "my_lambda", "run_id": "", + "parent_ids": [], "tags": [], }, ] @@ -420,6 +456,7 @@ async def test_astream_events_from_model() -> None: "metadata": {"a": "b"}, "name": "my_model", "run_id": "", + "parent_ids": [], "tags": ["my_model"], }, { @@ -428,6 +465,7 @@ async def test_astream_events_from_model() -> None: "metadata": {"a": "b"}, "name": "my_model", "run_id": "", + "parent_ids": [], "tags": ["my_model"], }, { @@ -436,6 +474,7 @@ async def test_astream_events_from_model() -> None: "metadata": {"a": "b"}, "name": "my_model", "run_id": "", + "parent_ids": [], "tags": ["my_model"], }, { @@ -444,6 +483,7 @@ async def test_astream_events_from_model() -> None: "metadata": {"a": "b"}, "name": "my_model", "run_id": "", + "parent_ids": [], "tags": ["my_model"], }, { @@ -452,6 +492,7 @@ async def test_astream_events_from_model() -> None: "metadata": {"a": "b"}, "name": "my_model", "run_id": "", + "parent_ids": [], "tags": ["my_model"], }, ] @@ -471,6 +512,7 @@ async def test_astream_events_from_model() -> None: "metadata": {}, "name": "i_dont_stream", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -479,6 +521,7 @@ async def test_astream_events_from_model() -> None: "metadata": {"a": "b", "ls_model_type": "chat", "ls_stop": ""}, "name": "my_model", "run_id": "", + "parent_ids": [], "tags": ["my_model"], }, { @@ -487,6 +530,7 @@ async def test_astream_events_from_model() -> None: "metadata": {"a": "b", "ls_model_type": "chat", "ls_stop": ""}, "name": "my_model", "run_id": "", + "parent_ids": [], "tags": ["my_model"], }, { @@ -495,6 +539,7 @@ async def test_astream_events_from_model() -> None: "metadata": {"a": "b", "ls_model_type": "chat", "ls_stop": ""}, "name": "my_model", "run_id": "", + "parent_ids": [], "tags": ["my_model"], }, { @@ -503,6 +548,7 @@ async def test_astream_events_from_model() -> None: "metadata": {"a": "b", "ls_model_type": "chat", "ls_stop": ""}, "name": "my_model", "run_id": "", + "parent_ids": [], "tags": ["my_model"], }, { @@ -529,6 +575,7 @@ async def test_astream_events_from_model() -> None: "metadata": {"a": "b", "ls_model_type": "chat", "ls_stop": ""}, "name": "my_model", "run_id": "", + "parent_ids": [], "tags": ["my_model"], }, { @@ -537,6 +584,7 @@ async def test_astream_events_from_model() -> None: "metadata": {}, "name": "i_dont_stream", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -545,6 +593,7 @@ async def test_astream_events_from_model() -> None: "metadata": {}, "name": "i_dont_stream", "run_id": "", + "parent_ids": [], "tags": [], }, ] @@ -564,6 +613,7 @@ async def test_astream_events_from_model() -> None: "metadata": {}, "name": "ai_dont_stream", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -572,6 +622,7 @@ async def test_astream_events_from_model() -> None: "metadata": {"a": "b", "ls_model_type": "chat", "ls_stop": ""}, "name": "my_model", "run_id": "", + "parent_ids": [], "tags": ["my_model"], }, { @@ -580,6 +631,7 @@ async def test_astream_events_from_model() -> None: "metadata": {"a": "b", "ls_model_type": "chat", "ls_stop": ""}, "name": "my_model", "run_id": "", + "parent_ids": [], "tags": ["my_model"], }, { @@ -588,6 +640,7 @@ async def test_astream_events_from_model() -> None: "metadata": {"a": "b", "ls_model_type": "chat", "ls_stop": ""}, "name": "my_model", "run_id": "", + "parent_ids": [], "tags": ["my_model"], }, { @@ -596,6 +649,7 @@ async def test_astream_events_from_model() -> None: "metadata": {"a": "b", "ls_model_type": "chat", "ls_stop": ""}, "name": "my_model", "run_id": "", + "parent_ids": [], "tags": ["my_model"], }, { @@ -622,6 +676,7 @@ async def test_astream_events_from_model() -> None: "metadata": {"a": "b", "ls_model_type": "chat", "ls_stop": ""}, "name": "my_model", "run_id": "", + "parent_ids": [], "tags": ["my_model"], }, { @@ -630,6 +685,7 @@ async def test_astream_events_from_model() -> None: "metadata": {}, "name": "ai_dont_stream", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -638,6 +694,7 @@ async def test_astream_events_from_model() -> None: "metadata": {}, "name": "ai_dont_stream", "run_id": "", + "parent_ids": [], "tags": [], }, ] @@ -686,6 +743,7 @@ async def test_event_stream_with_simple_chain() -> None: "metadata": {"foo": "bar"}, "name": "my_chain", "run_id": "", + "parent_ids": [], "tags": ["my_chain"], }, { @@ -694,6 +752,7 @@ async def test_event_stream_with_simple_chain() -> None: "metadata": {"foo": "bar"}, "name": "my_template", "run_id": "", + "parent_ids": [], "tags": ["my_chain", "my_template", "seq:step:1"], }, { @@ -710,6 +769,7 @@ async def test_event_stream_with_simple_chain() -> None: "metadata": {"foo": "bar"}, "name": "my_template", "run_id": "", + "parent_ids": [], "tags": ["my_chain", "my_template", "seq:step:1"], }, { @@ -732,6 +792,7 @@ async def test_event_stream_with_simple_chain() -> None: }, "name": "my_model", "run_id": "", + "parent_ids": [], "tags": ["my_chain", "my_model", "seq:step:2"], }, { @@ -745,6 +806,7 @@ async def test_event_stream_with_simple_chain() -> None: }, "name": "my_model", "run_id": "", + "parent_ids": [], "tags": ["my_chain", "my_model", "seq:step:2"], }, { @@ -753,6 +815,7 @@ async def test_event_stream_with_simple_chain() -> None: "metadata": {"foo": "bar"}, "name": "my_chain", "run_id": "", + "parent_ids": [], "tags": ["my_chain"], }, { @@ -766,6 +829,7 @@ async def test_event_stream_with_simple_chain() -> None: }, "name": "my_model", "run_id": "", + "parent_ids": [], "tags": ["my_chain", "my_model", "seq:step:2"], }, { @@ -774,6 +838,7 @@ async def test_event_stream_with_simple_chain() -> None: "metadata": {"foo": "bar"}, "name": "my_chain", "run_id": "", + "parent_ids": [], "tags": ["my_chain"], }, { @@ -787,6 +852,7 @@ async def test_event_stream_with_simple_chain() -> None: }, "name": "my_model", "run_id": "", + "parent_ids": [], "tags": ["my_chain", "my_model", "seq:step:2"], }, { @@ -795,6 +861,7 @@ async def test_event_stream_with_simple_chain() -> None: "metadata": {"foo": "bar"}, "name": "my_chain", "run_id": "", + "parent_ids": [], "tags": ["my_chain"], }, { @@ -833,6 +900,7 @@ async def test_event_stream_with_simple_chain() -> None: }, "name": "my_model", "run_id": "", + "parent_ids": [], "tags": ["my_chain", "my_model", "seq:step:2"], }, { @@ -841,6 +909,7 @@ async def test_event_stream_with_simple_chain() -> None: "metadata": {"foo": "bar"}, "name": "my_chain", "run_id": "", + "parent_ids": [], "tags": ["my_chain"], }, ] @@ -879,6 +948,7 @@ async def test_event_streaming_with_tools() -> None: "metadata": {}, "name": "parameterless", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -887,6 +957,7 @@ async def test_event_streaming_with_tools() -> None: "metadata": {}, "name": "parameterless", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -895,6 +966,7 @@ async def test_event_streaming_with_tools() -> None: "metadata": {}, "name": "parameterless", "run_id": "", + "parent_ids": [], "tags": [], }, ] @@ -907,6 +979,7 @@ async def test_event_streaming_with_tools() -> None: "metadata": {}, "name": "with_callbacks", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -915,6 +988,7 @@ async def test_event_streaming_with_tools() -> None: "metadata": {}, "name": "with_callbacks", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -923,6 +997,7 @@ async def test_event_streaming_with_tools() -> None: "metadata": {}, "name": "with_callbacks", "run_id": "", + "parent_ids": [], "tags": [], }, ] @@ -936,6 +1011,7 @@ async def test_event_streaming_with_tools() -> None: "metadata": {}, "name": "with_parameters", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -944,6 +1020,7 @@ async def test_event_streaming_with_tools() -> None: "metadata": {}, "name": "with_parameters", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -952,6 +1029,7 @@ async def test_event_streaming_with_tools() -> None: "metadata": {}, "name": "with_parameters", "run_id": "", + "parent_ids": [], "tags": [], }, ] @@ -966,6 +1044,7 @@ async def test_event_streaming_with_tools() -> None: "metadata": {}, "name": "with_parameters_and_callbacks", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -974,6 +1053,7 @@ async def test_event_streaming_with_tools() -> None: "metadata": {}, "name": "with_parameters_and_callbacks", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -982,6 +1062,7 @@ async def test_event_streaming_with_tools() -> None: "metadata": {}, "name": "with_parameters_and_callbacks", "run_id": "", + "parent_ids": [], "tags": [], }, ] @@ -1022,6 +1103,7 @@ async def test_event_stream_with_retriever() -> None: "metadata": {}, "name": "HardCodedRetriever", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1035,6 +1117,7 @@ async def test_event_stream_with_retriever() -> None: "metadata": {}, "name": "HardCodedRetriever", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1048,6 +1131,7 @@ async def test_event_stream_with_retriever() -> None: "metadata": {}, "name": "HardCodedRetriever", "run_id": "", + "parent_ids": [], "tags": [], }, ] @@ -1081,6 +1165,7 @@ async def test_event_stream_with_retriever_and_formatter() -> None: "metadata": {}, "name": "RunnableSequence", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1089,6 +1174,7 @@ async def test_event_stream_with_retriever_and_formatter() -> None: "metadata": {}, "name": "Retriever", "run_id": "", + "parent_ids": [], "tags": ["seq:step:1"], }, { @@ -1107,6 +1193,7 @@ async def test_event_stream_with_retriever_and_formatter() -> None: "metadata": {}, "name": "Retriever", "run_id": "", + "parent_ids": [], "tags": ["seq:step:1"], }, { @@ -1115,6 +1202,7 @@ async def test_event_stream_with_retriever_and_formatter() -> None: "metadata": {}, "name": "format_docs", "run_id": "", + "parent_ids": [], "tags": ["seq:step:2"], }, { @@ -1123,6 +1211,7 @@ async def test_event_stream_with_retriever_and_formatter() -> None: "metadata": {}, "name": "format_docs", "run_id": "", + "parent_ids": [], "tags": ["seq:step:2"], }, { @@ -1131,6 +1220,7 @@ async def test_event_stream_with_retriever_and_formatter() -> None: "metadata": {}, "name": "RunnableSequence", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1145,6 +1235,7 @@ async def test_event_stream_with_retriever_and_formatter() -> None: "metadata": {}, "name": "format_docs", "run_id": "", + "parent_ids": [], "tags": ["seq:step:2"], }, { @@ -1153,6 +1244,7 @@ async def test_event_stream_with_retriever_and_formatter() -> None: "metadata": {}, "name": "RunnableSequence", "run_id": "", + "parent_ids": [], "tags": [], }, ] @@ -1184,6 +1276,7 @@ async def test_event_stream_on_chain_with_tool() -> None: "metadata": {}, "name": "RunnableSequence", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1192,6 +1285,7 @@ async def test_event_stream_on_chain_with_tool() -> None: "metadata": {}, "name": "concat", "run_id": "", + "parent_ids": [], "tags": ["seq:step:1"], }, { @@ -1200,6 +1294,7 @@ async def test_event_stream_on_chain_with_tool() -> None: "metadata": {}, "name": "concat", "run_id": "", + "parent_ids": [], "tags": ["seq:step:1"], }, { @@ -1208,6 +1303,7 @@ async def test_event_stream_on_chain_with_tool() -> None: "metadata": {}, "name": "reverse", "run_id": "", + "parent_ids": [], "tags": ["seq:step:2"], }, { @@ -1216,6 +1312,7 @@ async def test_event_stream_on_chain_with_tool() -> None: "metadata": {}, "name": "reverse", "run_id": "", + "parent_ids": [], "tags": ["seq:step:2"], }, { @@ -1224,6 +1321,7 @@ async def test_event_stream_on_chain_with_tool() -> None: "metadata": {}, "name": "RunnableSequence", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1232,6 +1330,7 @@ async def test_event_stream_on_chain_with_tool() -> None: "metadata": {}, "name": "reverse", "run_id": "", + "parent_ids": [], "tags": ["seq:step:2"], }, { @@ -1240,6 +1339,7 @@ async def test_event_stream_on_chain_with_tool() -> None: "metadata": {}, "name": "RunnableSequence", "run_id": "", + "parent_ids": [], "tags": [], }, ] @@ -1278,6 +1378,7 @@ async def test_chain_ordering() -> None: "metadata": {}, "name": "RunnableSequence", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1286,6 +1387,7 @@ async def test_chain_ordering() -> None: "metadata": {}, "name": "foo", "run_id": "", + "parent_ids": [], "tags": ["seq:step:1"], }, { @@ -1294,6 +1396,7 @@ async def test_chain_ordering() -> None: "metadata": {}, "name": "foo", "run_id": "", + "parent_ids": [], "tags": ["seq:step:1"], }, { @@ -1302,6 +1405,7 @@ async def test_chain_ordering() -> None: "metadata": {}, "name": "foo", "run_id": "", + "parent_ids": [], "tags": ["seq:step:1"], }, { @@ -1310,6 +1414,7 @@ async def test_chain_ordering() -> None: "metadata": {}, "name": "bar", "run_id": "", + "parent_ids": [], "tags": ["seq:step:2"], }, { @@ -1318,6 +1423,7 @@ async def test_chain_ordering() -> None: "metadata": {}, "name": "bar", "run_id": "", + "parent_ids": [], "tags": ["seq:step:2"], }, { @@ -1326,6 +1432,7 @@ async def test_chain_ordering() -> None: "metadata": {}, "name": "RunnableSequence", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1334,6 +1441,7 @@ async def test_chain_ordering() -> None: "metadata": {}, "name": "bar", "run_id": "", + "parent_ids": [], "tags": ["seq:step:2"], }, { @@ -1342,6 +1450,7 @@ async def test_chain_ordering() -> None: "metadata": {}, "name": "RunnableSequence", "run_id": "", + "parent_ids": [], "tags": [], }, ] @@ -1382,6 +1491,7 @@ async def test_event_stream_with_retry() -> None: "metadata": {}, "name": "RunnableSequence", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1390,6 +1500,7 @@ async def test_event_stream_with_retry() -> None: "metadata": {}, "name": "success", "run_id": "", + "parent_ids": [], "tags": ["seq:step:1"], }, { @@ -1398,6 +1509,7 @@ async def test_event_stream_with_retry() -> None: "metadata": {}, "name": "success", "run_id": "", + "parent_ids": [], "tags": ["seq:step:1"], }, { @@ -1406,6 +1518,7 @@ async def test_event_stream_with_retry() -> None: "metadata": {}, "name": "fail", "run_id": "", + "parent_ids": [], "tags": ["seq:step:2"], }, { @@ -1414,6 +1527,7 @@ async def test_event_stream_with_retry() -> None: "metadata": {}, "name": "success", "run_id": "", + "parent_ids": [], "tags": ["seq:step:1"], }, { @@ -1422,6 +1536,7 @@ async def test_event_stream_with_retry() -> None: "metadata": {}, "name": "fail", "run_id": "", + "parent_ids": [], "tags": ["seq:step:2"], }, ] @@ -1445,6 +1560,7 @@ async def test_with_llm() -> None: "metadata": {}, "name": "RunnableSequence", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1453,6 +1569,7 @@ async def test_with_llm() -> None: "metadata": {}, "name": "my_template", "run_id": "", + "parent_ids": [], "tags": ["my_template", "seq:step:1"], }, { @@ -1469,6 +1586,7 @@ async def test_with_llm() -> None: "metadata": {}, "name": "my_template", "run_id": "", + "parent_ids": [], "tags": ["my_template", "seq:step:1"], }, { @@ -1479,6 +1597,7 @@ async def test_with_llm() -> None: "metadata": {}, "name": "FakeStreamingListLLM", "run_id": "", + "parent_ids": [], "tags": ["seq:step:2"], }, { @@ -1498,6 +1617,7 @@ async def test_with_llm() -> None: "metadata": {}, "name": "FakeStreamingListLLM", "run_id": "", + "parent_ids": [], "tags": ["seq:step:2"], }, { @@ -1506,6 +1626,7 @@ async def test_with_llm() -> None: "metadata": {}, "name": "RunnableSequence", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1514,6 +1635,7 @@ async def test_with_llm() -> None: "metadata": {}, "name": "RunnableSequence", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1522,6 +1644,7 @@ async def test_with_llm() -> None: "metadata": {}, "name": "RunnableSequence", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1530,6 +1653,7 @@ async def test_with_llm() -> None: "metadata": {}, "name": "RunnableSequence", "run_id": "", + "parent_ids": [], "tags": [], }, ] @@ -1572,6 +1696,7 @@ async def test_events_astream_config() -> None: "metadata": {}, "name": "RunnableConfigurableFields", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1580,6 +1705,7 @@ async def test_events_astream_config() -> None: "metadata": {}, "name": "RunnableConfigurableFields", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1588,6 +1714,7 @@ async def test_events_astream_config() -> None: "metadata": {}, "name": "RunnableConfigurableFields", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1596,6 +1723,7 @@ async def test_events_astream_config() -> None: "metadata": {}, "name": "RunnableConfigurableFields", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1604,6 +1732,7 @@ async def test_events_astream_config() -> None: "metadata": {}, "name": "RunnableConfigurableFields", "run_id": "", + "parent_ids": [], "tags": [], }, ] @@ -1688,6 +1817,7 @@ EXPECTED_EVENTS = [ "metadata": {}, "name": "add_one_proxy", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1696,6 +1826,7 @@ EXPECTED_EVENTS = [ "metadata": {}, "name": "add_one", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1704,6 +1835,7 @@ EXPECTED_EVENTS = [ "metadata": {}, "name": "add_one", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1712,6 +1844,7 @@ EXPECTED_EVENTS = [ "metadata": {}, "name": "add_one", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1720,6 +1853,7 @@ EXPECTED_EVENTS = [ "metadata": {}, "name": "add_one_proxy", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1728,6 +1862,7 @@ EXPECTED_EVENTS = [ "metadata": {}, "name": "add_one_proxy", "run_id": "", + "parent_ids": [], "tags": [], }, ] diff --git a/libs/core/tests/unit_tests/runnables/test_runnable_events_v2.py b/libs/core/tests/unit_tests/runnables/test_runnable_events_v2.py index d03bd195c4..6c7357ff1b 100644 --- a/libs/core/tests/unit_tests/runnables/test_runnable_events_v2.py +++ b/libs/core/tests/unit_tests/runnables/test_runnable_events_v2.py @@ -1,5 +1,6 @@ """Module that contains tests for runnable.astream_events API.""" import sys +import uuid from itertools import cycle from typing import ( Any, @@ -49,7 +50,20 @@ from tests.unit_tests.stubs import AnyStr def _with_nulled_run_id(events: Sequence[StreamEvent]) -> List[StreamEvent]: """Removes the run ids from events.""" - return cast(List[StreamEvent], [{**event, "run_id": ""} for event in events]) + for event in events: + assert "run_id" in event, f"Event {event} does not have a run_id." + assert "parent_ids" in event, f"Event {event} does not have parent_ids." + assert isinstance( + event["run_id"], str + ), f"Event {event} run_id is not a string." + assert isinstance( + event["parent_ids"], list + ), f"Event {event} parent_ids is not a list." + + return cast( + List[StreamEvent], + [{**event, "run_id": "", "parent_ids": []} for event in events], + ) async def _as_async_iterator(iterable: List) -> AsyncIterator: @@ -58,10 +72,16 @@ async def _as_async_iterator(iterable: List) -> AsyncIterator: yield item -async def _collect_events(events: AsyncIterator[StreamEvent]) -> List[StreamEvent]: +async def _collect_events( + events: AsyncIterator[StreamEvent], with_nulled_ids: bool = True +) -> List[StreamEvent]: """Collect the events and remove the run ids.""" materialized_events = [event async for event in events] - events_ = _with_nulled_run_id(materialized_events) + + if with_nulled_ids: + events_ = _with_nulled_run_id(materialized_events) + else: + events_ = materialized_events for event in events_: event["tags"] = sorted(event["tags"]) return events_ @@ -85,6 +105,7 @@ async def test_event_stream_with_simple_function_tool() -> None: { "event": "on_chain_start", "run_id": "", + "parent_ids": [], "name": "RunnableSequence", "tags": [], "metadata": {}, @@ -94,6 +115,7 @@ async def test_event_stream_with_simple_function_tool() -> None: "event": "on_chain_start", "name": "foo", "run_id": "", + "parent_ids": [], "tags": ["seq:step:1"], "metadata": {}, "data": {}, @@ -102,6 +124,7 @@ async def test_event_stream_with_simple_function_tool() -> None: "event": "on_chain_stream", "name": "foo", "run_id": "", + "parent_ids": [], "tags": ["seq:step:1"], "metadata": {}, "data": {"chunk": {"x": 5}}, @@ -110,6 +133,7 @@ async def test_event_stream_with_simple_function_tool() -> None: "event": "on_chain_end", "name": "foo", "run_id": "", + "parent_ids": [], "tags": ["seq:step:1"], "metadata": {}, "data": {"input": {}, "output": {"x": 5}}, @@ -118,6 +142,7 @@ async def test_event_stream_with_simple_function_tool() -> None: "event": "on_tool_start", "name": "get_docs", "run_id": "", + "parent_ids": [], "tags": ["seq:step:2"], "metadata": {}, "data": {"input": {"x": 5}}, @@ -126,6 +151,7 @@ async def test_event_stream_with_simple_function_tool() -> None: "event": "on_tool_end", "name": "get_docs", "run_id": "", + "parent_ids": [], "tags": ["seq:step:2"], "metadata": {}, "data": {"input": {"x": 5}, "output": [Document(page_content="hello")]}, @@ -133,6 +159,7 @@ async def test_event_stream_with_simple_function_tool() -> None: { "event": "on_chain_stream", "run_id": "", + "parent_ids": [], "tags": [], "metadata": {}, "name": "RunnableSequence", @@ -142,6 +169,7 @@ async def test_event_stream_with_simple_function_tool() -> None: "event": "on_chain_end", "name": "RunnableSequence", "run_id": "", + "parent_ids": [], "tags": [], "metadata": {}, "data": {"output": [Document(page_content="hello")]}, @@ -166,6 +194,7 @@ async def test_event_stream_with_single_lambda() -> None: "metadata": {}, "name": "reverse", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -174,6 +203,7 @@ async def test_event_stream_with_single_lambda() -> None: "metadata": {}, "name": "reverse", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -182,6 +212,7 @@ async def test_event_stream_with_single_lambda() -> None: "metadata": {}, "name": "reverse", "run_id": "", + "parent_ids": [], "tags": [], }, ] @@ -207,6 +238,7 @@ async def test_event_stream_with_triple_lambda() -> None: "metadata": {}, "name": "RunnableSequence", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -215,6 +247,7 @@ async def test_event_stream_with_triple_lambda() -> None: "metadata": {}, "name": "1", "run_id": "", + "parent_ids": [], "tags": ["seq:step:1"], }, { @@ -223,6 +256,7 @@ async def test_event_stream_with_triple_lambda() -> None: "metadata": {}, "name": "1", "run_id": "", + "parent_ids": [], "tags": ["seq:step:1"], }, { @@ -231,6 +265,7 @@ async def test_event_stream_with_triple_lambda() -> None: "metadata": {}, "name": "2", "run_id": "", + "parent_ids": [], "tags": ["seq:step:2"], }, { @@ -239,6 +274,7 @@ async def test_event_stream_with_triple_lambda() -> None: "metadata": {}, "name": "1", "run_id": "", + "parent_ids": [], "tags": ["seq:step:1"], }, { @@ -247,6 +283,7 @@ async def test_event_stream_with_triple_lambda() -> None: "metadata": {}, "name": "2", "run_id": "", + "parent_ids": [], "tags": ["seq:step:2"], }, { @@ -255,6 +292,7 @@ async def test_event_stream_with_triple_lambda() -> None: "metadata": {}, "name": "3", "run_id": "", + "parent_ids": [], "tags": ["seq:step:3"], }, { @@ -263,6 +301,7 @@ async def test_event_stream_with_triple_lambda() -> None: "metadata": {}, "name": "2", "run_id": "", + "parent_ids": [], "tags": ["seq:step:2"], }, { @@ -271,6 +310,7 @@ async def test_event_stream_with_triple_lambda() -> None: "metadata": {}, "name": "3", "run_id": "", + "parent_ids": [], "tags": ["seq:step:3"], }, { @@ -279,6 +319,7 @@ async def test_event_stream_with_triple_lambda() -> None: "metadata": {}, "name": "RunnableSequence", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -287,6 +328,7 @@ async def test_event_stream_with_triple_lambda() -> None: "metadata": {}, "name": "3", "run_id": "", + "parent_ids": [], "tags": ["seq:step:3"], }, { @@ -295,6 +337,7 @@ async def test_event_stream_with_triple_lambda() -> None: "metadata": {}, "name": "RunnableSequence", "run_id": "", + "parent_ids": [], "tags": [], }, ] @@ -324,6 +367,7 @@ async def test_event_stream_with_triple_lambda_test_filtering() -> None: "metadata": {}, "name": "1", "run_id": "", + "parent_ids": [], "tags": ["seq:step:1"], }, { @@ -332,6 +376,7 @@ async def test_event_stream_with_triple_lambda_test_filtering() -> None: "metadata": {}, "name": "1", "run_id": "", + "parent_ids": [], "tags": ["seq:step:1"], }, { @@ -340,6 +385,7 @@ async def test_event_stream_with_triple_lambda_test_filtering() -> None: "metadata": {}, "name": "1", "run_id": "", + "parent_ids": [], "tags": ["seq:step:1"], }, ] @@ -356,6 +402,7 @@ async def test_event_stream_with_triple_lambda_test_filtering() -> None: "metadata": {}, "name": "3", "run_id": "", + "parent_ids": [], "tags": ["my_tag", "seq:step:3"], }, { @@ -364,6 +411,7 @@ async def test_event_stream_with_triple_lambda_test_filtering() -> None: "metadata": {}, "name": "3", "run_id": "", + "parent_ids": [], "tags": ["my_tag", "seq:step:3"], }, { @@ -372,6 +420,7 @@ async def test_event_stream_with_triple_lambda_test_filtering() -> None: "metadata": {}, "name": "3", "run_id": "", + "parent_ids": [], "tags": ["my_tag", "seq:step:3"], }, ] @@ -391,6 +440,7 @@ async def test_event_stream_with_lambdas_from_lambda() -> None: "metadata": {}, "name": "my_lambda", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -399,6 +449,7 @@ async def test_event_stream_with_lambdas_from_lambda() -> None: "metadata": {}, "name": "my_lambda", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -407,6 +458,7 @@ async def test_event_stream_with_lambdas_from_lambda() -> None: "metadata": {}, "name": "my_lambda", "run_id": "", + "parent_ids": [], "tags": [], }, ] @@ -435,6 +487,7 @@ async def test_astream_events_from_model() -> None: "metadata": {"a": "b", "ls_model_type": "chat", "ls_stop": ""}, "name": "my_model", "run_id": "", + "parent_ids": [], "tags": ["my_model"], }, { @@ -443,6 +496,7 @@ async def test_astream_events_from_model() -> None: "metadata": {"a": "b", "ls_model_type": "chat", "ls_stop": ""}, "name": "my_model", "run_id": "", + "parent_ids": [], "tags": ["my_model"], }, { @@ -451,6 +505,7 @@ async def test_astream_events_from_model() -> None: "metadata": {"a": "b", "ls_model_type": "chat", "ls_stop": ""}, "name": "my_model", "run_id": "", + "parent_ids": [], "tags": ["my_model"], }, { @@ -459,6 +514,7 @@ async def test_astream_events_from_model() -> None: "metadata": {"a": "b", "ls_model_type": "chat", "ls_stop": ""}, "name": "my_model", "run_id": "", + "parent_ids": [], "tags": ["my_model"], }, { @@ -469,6 +525,7 @@ async def test_astream_events_from_model() -> None: "metadata": {"a": "b", "ls_model_type": "chat", "ls_stop": ""}, "name": "my_model", "run_id": "", + "parent_ids": [], "tags": ["my_model"], }, ] @@ -505,6 +562,7 @@ async def test_astream_with_model_in_chain() -> None: "metadata": {}, "name": "i_dont_stream", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -513,6 +571,7 @@ async def test_astream_with_model_in_chain() -> None: "metadata": {"a": "b", "ls_model_type": "chat", "ls_stop": ""}, "name": "my_model", "run_id": "", + "parent_ids": [], "tags": ["my_model"], }, { @@ -521,6 +580,7 @@ async def test_astream_with_model_in_chain() -> None: "metadata": {"a": "b", "ls_model_type": "chat", "ls_stop": ""}, "name": "my_model", "run_id": "", + "parent_ids": [], "tags": ["my_model"], }, { @@ -529,6 +589,7 @@ async def test_astream_with_model_in_chain() -> None: "metadata": {"a": "b", "ls_model_type": "chat", "ls_stop": ""}, "name": "my_model", "run_id": "", + "parent_ids": [], "tags": ["my_model"], }, { @@ -537,6 +598,7 @@ async def test_astream_with_model_in_chain() -> None: "metadata": {"a": "b", "ls_model_type": "chat", "ls_stop": ""}, "name": "my_model", "run_id": "", + "parent_ids": [], "tags": ["my_model"], }, { @@ -548,6 +610,7 @@ async def test_astream_with_model_in_chain() -> None: "metadata": {"a": "b", "ls_model_type": "chat", "ls_stop": ""}, "name": "my_model", "run_id": "", + "parent_ids": [], "tags": ["my_model"], }, { @@ -556,6 +619,7 @@ async def test_astream_with_model_in_chain() -> None: "metadata": {}, "name": "i_dont_stream", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -564,6 +628,7 @@ async def test_astream_with_model_in_chain() -> None: "metadata": {}, "name": "i_dont_stream", "run_id": "", + "parent_ids": [], "tags": [], }, ] @@ -583,6 +648,7 @@ async def test_astream_with_model_in_chain() -> None: "metadata": {}, "name": "ai_dont_stream", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -591,6 +657,7 @@ async def test_astream_with_model_in_chain() -> None: "metadata": {"a": "b", "ls_model_type": "chat", "ls_stop": ""}, "name": "my_model", "run_id": "", + "parent_ids": [], "tags": ["my_model"], }, { @@ -599,6 +666,7 @@ async def test_astream_with_model_in_chain() -> None: "metadata": {"a": "b", "ls_model_type": "chat", "ls_stop": ""}, "name": "my_model", "run_id": "", + "parent_ids": [], "tags": ["my_model"], }, { @@ -607,6 +675,7 @@ async def test_astream_with_model_in_chain() -> None: "metadata": {"a": "b", "ls_model_type": "chat", "ls_stop": ""}, "name": "my_model", "run_id": "", + "parent_ids": [], "tags": ["my_model"], }, { @@ -615,6 +684,7 @@ async def test_astream_with_model_in_chain() -> None: "metadata": {"a": "b", "ls_model_type": "chat", "ls_stop": ""}, "name": "my_model", "run_id": "", + "parent_ids": [], "tags": ["my_model"], }, { @@ -626,6 +696,7 @@ async def test_astream_with_model_in_chain() -> None: "metadata": {"a": "b", "ls_model_type": "chat", "ls_stop": ""}, "name": "my_model", "run_id": "", + "parent_ids": [], "tags": ["my_model"], }, { @@ -634,6 +705,7 @@ async def test_astream_with_model_in_chain() -> None: "metadata": {}, "name": "ai_dont_stream", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -642,6 +714,7 @@ async def test_astream_with_model_in_chain() -> None: "metadata": {}, "name": "ai_dont_stream", "run_id": "", + "parent_ids": [], "tags": [], }, ] @@ -690,6 +763,7 @@ async def test_event_stream_with_simple_chain() -> None: "metadata": {"foo": "bar"}, "name": "my_chain", "run_id": "", + "parent_ids": [], "tags": ["my_chain"], }, { @@ -698,6 +772,7 @@ async def test_event_stream_with_simple_chain() -> None: "metadata": {"foo": "bar"}, "name": "my_template", "run_id": "", + "parent_ids": [], "tags": ["my_chain", "my_template", "seq:step:1"], }, { @@ -714,6 +789,7 @@ async def test_event_stream_with_simple_chain() -> None: "metadata": {"foo": "bar"}, "name": "my_template", "run_id": "", + "parent_ids": [], "tags": ["my_chain", "my_template", "seq:step:1"], }, { @@ -736,6 +812,7 @@ async def test_event_stream_with_simple_chain() -> None: }, "name": "my_model", "run_id": "", + "parent_ids": [], "tags": ["my_chain", "my_model", "seq:step:2"], }, { @@ -749,6 +826,7 @@ async def test_event_stream_with_simple_chain() -> None: }, "name": "my_model", "run_id": "", + "parent_ids": [], "tags": ["my_chain", "my_model", "seq:step:2"], }, { @@ -757,6 +835,7 @@ async def test_event_stream_with_simple_chain() -> None: "metadata": {"foo": "bar"}, "name": "my_chain", "run_id": "", + "parent_ids": [], "tags": ["my_chain"], }, { @@ -770,6 +849,7 @@ async def test_event_stream_with_simple_chain() -> None: }, "name": "my_model", "run_id": "", + "parent_ids": [], "tags": ["my_chain", "my_model", "seq:step:2"], }, { @@ -778,6 +858,7 @@ async def test_event_stream_with_simple_chain() -> None: "metadata": {"foo": "bar"}, "name": "my_chain", "run_id": "", + "parent_ids": [], "tags": ["my_chain"], }, { @@ -791,6 +872,7 @@ async def test_event_stream_with_simple_chain() -> None: }, "name": "my_model", "run_id": "", + "parent_ids": [], "tags": ["my_chain", "my_model", "seq:step:2"], }, { @@ -799,6 +881,7 @@ async def test_event_stream_with_simple_chain() -> None: "metadata": {"foo": "bar"}, "name": "my_chain", "run_id": "", + "parent_ids": [], "tags": ["my_chain"], }, { @@ -822,6 +905,7 @@ async def test_event_stream_with_simple_chain() -> None: }, "name": "my_model", "run_id": "", + "parent_ids": [], "tags": ["my_chain", "my_model", "seq:step:2"], }, { @@ -830,6 +914,7 @@ async def test_event_stream_with_simple_chain() -> None: "metadata": {"foo": "bar"}, "name": "my_chain", "run_id": "", + "parent_ids": [], "tags": ["my_chain"], }, ] @@ -868,6 +953,7 @@ async def test_event_streaming_with_tools() -> None: "metadata": {}, "name": "parameterless", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -876,6 +962,7 @@ async def test_event_streaming_with_tools() -> None: "metadata": {}, "name": "parameterless", "run_id": "", + "parent_ids": [], "tags": [], }, ] @@ -887,6 +974,7 @@ async def test_event_streaming_with_tools() -> None: "metadata": {}, "name": "with_callbacks", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -895,6 +983,7 @@ async def test_event_streaming_with_tools() -> None: "metadata": {}, "name": "with_callbacks", "run_id": "", + "parent_ids": [], "tags": [], }, ] @@ -908,6 +997,7 @@ async def test_event_streaming_with_tools() -> None: "metadata": {}, "name": "with_parameters", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -916,6 +1006,7 @@ async def test_event_streaming_with_tools() -> None: "metadata": {}, "name": "with_parameters", "run_id": "", + "parent_ids": [], "tags": [], }, ] @@ -930,6 +1021,7 @@ async def test_event_streaming_with_tools() -> None: "metadata": {}, "name": "with_parameters_and_callbacks", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -938,6 +1030,7 @@ async def test_event_streaming_with_tools() -> None: "metadata": {}, "name": "with_parameters_and_callbacks", "run_id": "", + "parent_ids": [], "tags": [], }, ] @@ -978,6 +1071,7 @@ async def test_event_stream_with_retriever() -> None: "metadata": {}, "name": "HardCodedRetriever", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -991,6 +1085,7 @@ async def test_event_stream_with_retriever() -> None: "metadata": {}, "name": "HardCodedRetriever", "run_id": "", + "parent_ids": [], "tags": [], }, ] @@ -1024,6 +1119,7 @@ async def test_event_stream_with_retriever_and_formatter() -> None: "metadata": {}, "name": "RunnableSequence", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1032,6 +1128,7 @@ async def test_event_stream_with_retriever_and_formatter() -> None: "metadata": {}, "name": "HardCodedRetriever", "run_id": "", + "parent_ids": [], "tags": ["seq:step:1"], }, { @@ -1046,6 +1143,7 @@ async def test_event_stream_with_retriever_and_formatter() -> None: "metadata": {}, "name": "HardCodedRetriever", "run_id": "", + "parent_ids": [], "tags": ["seq:step:1"], }, { @@ -1054,6 +1152,7 @@ async def test_event_stream_with_retriever_and_formatter() -> None: "metadata": {}, "name": "format_docs", "run_id": "", + "parent_ids": [], "tags": ["seq:step:2"], }, { @@ -1062,6 +1161,7 @@ async def test_event_stream_with_retriever_and_formatter() -> None: "metadata": {}, "name": "format_docs", "run_id": "", + "parent_ids": [], "tags": ["seq:step:2"], }, { @@ -1070,6 +1170,7 @@ async def test_event_stream_with_retriever_and_formatter() -> None: "metadata": {}, "name": "RunnableSequence", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1084,6 +1185,7 @@ async def test_event_stream_with_retriever_and_formatter() -> None: "metadata": {}, "name": "format_docs", "run_id": "", + "parent_ids": [], "tags": ["seq:step:2"], }, { @@ -1092,6 +1194,7 @@ async def test_event_stream_with_retriever_and_formatter() -> None: "metadata": {}, "name": "RunnableSequence", "run_id": "", + "parent_ids": [], "tags": [], }, ] @@ -1123,6 +1226,7 @@ async def test_event_stream_on_chain_with_tool() -> None: "metadata": {}, "name": "RunnableSequence", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1131,6 +1235,7 @@ async def test_event_stream_on_chain_with_tool() -> None: "metadata": {}, "name": "concat", "run_id": "", + "parent_ids": [], "tags": ["seq:step:1"], }, { @@ -1139,6 +1244,7 @@ async def test_event_stream_on_chain_with_tool() -> None: "metadata": {}, "name": "concat", "run_id": "", + "parent_ids": [], "tags": ["seq:step:1"], }, { @@ -1147,6 +1253,7 @@ async def test_event_stream_on_chain_with_tool() -> None: "metadata": {}, "name": "reverse", "run_id": "", + "parent_ids": [], "tags": ["seq:step:2"], }, { @@ -1155,6 +1262,7 @@ async def test_event_stream_on_chain_with_tool() -> None: "metadata": {}, "name": "reverse", "run_id": "", + "parent_ids": [], "tags": ["seq:step:2"], }, { @@ -1163,6 +1271,7 @@ async def test_event_stream_on_chain_with_tool() -> None: "metadata": {}, "name": "RunnableSequence", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1171,6 +1280,7 @@ async def test_event_stream_on_chain_with_tool() -> None: "metadata": {}, "name": "reverse", "run_id": "", + "parent_ids": [], "tags": ["seq:step:2"], }, { @@ -1179,6 +1289,7 @@ async def test_event_stream_on_chain_with_tool() -> None: "metadata": {}, "name": "RunnableSequence", "run_id": "", + "parent_ids": [], "tags": [], }, ] @@ -1217,6 +1328,7 @@ async def test_chain_ordering() -> None: "metadata": {}, "name": "RunnableSequence", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1225,6 +1337,7 @@ async def test_chain_ordering() -> None: "metadata": {}, "name": "foo", "run_id": "", + "parent_ids": [], "tags": ["seq:step:1"], }, { @@ -1233,6 +1346,7 @@ async def test_chain_ordering() -> None: "metadata": {}, "name": "foo", "run_id": "", + "parent_ids": [], "tags": ["seq:step:1"], }, { @@ -1241,6 +1355,7 @@ async def test_chain_ordering() -> None: "metadata": {}, "name": "foo", "run_id": "", + "parent_ids": [], "tags": ["seq:step:1"], }, { @@ -1249,6 +1364,7 @@ async def test_chain_ordering() -> None: "metadata": {}, "name": "bar", "run_id": "", + "parent_ids": [], "tags": ["seq:step:2"], }, { @@ -1257,6 +1373,7 @@ async def test_chain_ordering() -> None: "metadata": {}, "name": "bar", "run_id": "", + "parent_ids": [], "tags": ["seq:step:2"], }, { @@ -1265,6 +1382,7 @@ async def test_chain_ordering() -> None: "metadata": {}, "name": "RunnableSequence", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1273,6 +1391,7 @@ async def test_chain_ordering() -> None: "metadata": {}, "name": "bar", "run_id": "", + "parent_ids": [], "tags": ["seq:step:2"], }, { @@ -1281,6 +1400,7 @@ async def test_chain_ordering() -> None: "metadata": {}, "name": "RunnableSequence", "run_id": "", + "parent_ids": [], "tags": [], }, ] @@ -1321,6 +1441,7 @@ async def test_event_stream_with_retry() -> None: "metadata": {}, "name": "RunnableSequence", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1329,6 +1450,7 @@ async def test_event_stream_with_retry() -> None: "metadata": {}, "name": "success", "run_id": "", + "parent_ids": [], "tags": ["seq:step:1"], }, { @@ -1337,6 +1459,7 @@ async def test_event_stream_with_retry() -> None: "metadata": {}, "name": "success", "run_id": "", + "parent_ids": [], "tags": ["seq:step:1"], }, { @@ -1345,6 +1468,7 @@ async def test_event_stream_with_retry() -> None: "metadata": {}, "name": "fail", "run_id": "", + "parent_ids": [], "tags": ["seq:step:2"], }, { @@ -1353,6 +1477,7 @@ async def test_event_stream_with_retry() -> None: "metadata": {}, "name": "success", "run_id": "", + "parent_ids": [], "tags": ["seq:step:1"], }, ] @@ -1376,6 +1501,7 @@ async def test_with_llm() -> None: "metadata": {}, "name": "RunnableSequence", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1384,6 +1510,7 @@ async def test_with_llm() -> None: "metadata": {}, "name": "my_template", "run_id": "", + "parent_ids": [], "tags": ["my_template", "seq:step:1"], }, { @@ -1400,6 +1527,7 @@ async def test_with_llm() -> None: "metadata": {}, "name": "my_template", "run_id": "", + "parent_ids": [], "tags": ["my_template", "seq:step:1"], }, { @@ -1410,6 +1538,7 @@ async def test_with_llm() -> None: "metadata": {}, "name": "FakeStreamingListLLM", "run_id": "", + "parent_ids": [], "tags": ["seq:step:2"], }, { @@ -1428,6 +1557,7 @@ async def test_with_llm() -> None: "metadata": {}, "name": "FakeStreamingListLLM", "run_id": "", + "parent_ids": [], "tags": ["seq:step:2"], }, { @@ -1436,6 +1566,7 @@ async def test_with_llm() -> None: "metadata": {}, "name": "RunnableSequence", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1444,6 +1575,7 @@ async def test_with_llm() -> None: "metadata": {}, "name": "RunnableSequence", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1452,6 +1584,7 @@ async def test_with_llm() -> None: "metadata": {}, "name": "RunnableSequence", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1460,6 +1593,7 @@ async def test_with_llm() -> None: "metadata": {}, "name": "RunnableSequence", "run_id": "", + "parent_ids": [], "tags": [], }, ] @@ -1502,6 +1636,7 @@ async def test_events_astream_config() -> None: "metadata": {"ls_model_type": "chat"}, "name": "GenericFakeChatModel", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1510,6 +1645,7 @@ async def test_events_astream_config() -> None: "metadata": {"ls_model_type": "chat"}, "name": "GenericFakeChatModel", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1518,6 +1654,7 @@ async def test_events_astream_config() -> None: "metadata": {"ls_model_type": "chat"}, "name": "GenericFakeChatModel", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1526,6 +1663,7 @@ async def test_events_astream_config() -> None: "metadata": {"ls_model_type": "chat"}, "name": "GenericFakeChatModel", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1536,6 +1674,7 @@ async def test_events_astream_config() -> None: "metadata": {"ls_model_type": "chat"}, "name": "GenericFakeChatModel", "run_id": "", + "parent_ids": [], "tags": [], }, ] @@ -1620,6 +1759,7 @@ EXPECTED_EVENTS = [ "metadata": {}, "name": "add_one_proxy", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1628,6 +1768,7 @@ EXPECTED_EVENTS = [ "metadata": {}, "name": "add_one", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1636,6 +1777,7 @@ EXPECTED_EVENTS = [ "metadata": {}, "name": "add_one", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1644,6 +1786,7 @@ EXPECTED_EVENTS = [ "metadata": {}, "name": "add_one", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1652,6 +1795,7 @@ EXPECTED_EVENTS = [ "metadata": {}, "name": "add_one_proxy", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1660,6 +1804,7 @@ EXPECTED_EVENTS = [ "metadata": {}, "name": "add_one_proxy", "run_id": "", + "parent_ids": [], "tags": [], }, ] @@ -1796,6 +1941,7 @@ async def test_astream_events_from_custom_runnable() -> None: "metadata": {}, "name": "StreamingRunnable", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1804,6 +1950,7 @@ async def test_astream_events_from_custom_runnable() -> None: "metadata": {}, "name": "StreamingRunnable", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1812,6 +1959,7 @@ async def test_astream_events_from_custom_runnable() -> None: "metadata": {}, "name": "StreamingRunnable", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1820,6 +1968,7 @@ async def test_astream_events_from_custom_runnable() -> None: "metadata": {}, "name": "StreamingRunnable", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1828,6 +1977,105 @@ async def test_astream_events_from_custom_runnable() -> None: "metadata": {}, "name": "StreamingRunnable", "run_id": "", + "parent_ids": [], + "tags": [], + }, + ] + + +async def test_parent_run_id_assignment() -> None: + """Test assignment of parent run id.""" + + # Type ignores in the code below need to be investigated. + # Looks like a typing issue when using RunnableLambda as a decorator + # with async functions. + @RunnableLambda # type: ignore + async def grandchild(x: str) -> str: + return x + + @RunnableLambda # type: ignore + async def child(x: str, config: RunnableConfig) -> str: + config["run_id"] = uuid.UUID(int=9) + return await grandchild.ainvoke(x, config) # type: ignore + + @RunnableLambda # type: ignore + async def parent(x: str, config: RunnableConfig) -> str: + config["run_id"] = uuid.UUID(int=8) + return await child.ainvoke(x, config) # type: ignore + + bond = uuid.UUID(int=7) + events = await _collect_events( + parent.astream_events("hello", {"run_id": bond}, version="v2"), + with_nulled_ids=False, + ) + assert events == [ + { + "data": {"input": "hello"}, + "event": "on_chain_start", + "metadata": {}, + "name": "parent", + "parent_ids": [], + "run_id": "00000000-0000-0000-0000-000000000007", + "tags": [], + }, + { + "data": {"input": "hello"}, + "event": "on_chain_start", + "metadata": {}, + "name": "child", + "parent_ids": ["00000000-0000-0000-0000-000000000007"], + "run_id": "00000000-0000-0000-0000-000000000008", + "tags": [], + }, + { + "data": {"input": "hello"}, + "event": "on_chain_start", + "metadata": {}, + "name": "grandchild", + "parent_ids": [ + "00000000-0000-0000-0000-000000000008", + "00000000-0000-0000-0000-000000000007", + ], + "run_id": "00000000-0000-0000-0000-000000000009", + "tags": [], + }, + { + "data": {"input": "hello", "output": "hello"}, + "event": "on_chain_end", + "metadata": {}, + "name": "grandchild", + "parent_ids": [ + "00000000-0000-0000-0000-000000000008", + "00000000-0000-0000-0000-000000000007", + ], + "run_id": "00000000-0000-0000-0000-000000000009", + "tags": [], + }, + { + "data": {"input": "hello", "output": "hello"}, + "event": "on_chain_end", + "metadata": {}, + "name": "child", + "parent_ids": ["00000000-0000-0000-0000-000000000007"], + "run_id": "00000000-0000-0000-0000-000000000008", + "tags": [], + }, + { + "data": {"chunk": "hello"}, + "event": "on_chain_stream", + "metadata": {}, + "name": "parent", + "parent_ids": [], + "run_id": "00000000-0000-0000-0000-000000000007", + "tags": [], + }, + { + "data": {"output": "hello"}, + "event": "on_chain_end", + "metadata": {}, + "name": "parent", + "parent_ids": [], + "run_id": "00000000-0000-0000-0000-000000000007", "tags": [], }, ] @@ -1849,6 +2097,7 @@ async def test_runnable_generator() -> None: "metadata": {}, "name": "generator", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1857,6 +2106,7 @@ async def test_runnable_generator() -> None: "metadata": {}, "name": "generator", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1865,6 +2115,7 @@ async def test_runnable_generator() -> None: "metadata": {}, "name": "generator", "run_id": "", + "parent_ids": [], "tags": [], }, { @@ -1873,6 +2124,7 @@ async def test_runnable_generator() -> None: "metadata": {}, "name": "generator", "run_id": "", + "parent_ids": [], "tags": [], }, ]