FakeTracer Class — langchain Architecture
Architecture documentation for the FakeTracer class in test_runnable.py from the langchain codebase.
Entity Profile
Dependency Diagram
graph TD 1c72b396_ff94_2618_42c3_843ec828f717["FakeTracer"] 0f6b3261_31fa_c34e_ca33_cb141bdf78ff["BaseTracer"] 1c72b396_ff94_2618_42c3_843ec828f717 -->|extends| 0f6b3261_31fa_c34e_ca33_cb141bdf78ff abb7c122_ee7b_4c8f_ffaa_3d3d63c4fab7["BaseMessage"] 1c72b396_ff94_2618_42c3_843ec828f717 -->|extends| abb7c122_ee7b_4c8f_ffaa_3d3d63c4fab7 2bdc4d81_5592_3e8d_1079_4eb50790f1d0["ChatGeneration"] 1c72b396_ff94_2618_42c3_843ec828f717 -->|extends| 2bdc4d81_5592_3e8d_1079_4eb50790f1d0 be2a68ad_6ac6_f078_3bbc_62ebfc7db505["LLMResult"] 1c72b396_ff94_2618_42c3_843ec828f717 -->|extends| be2a68ad_6ac6_f078_3bbc_62ebfc7db505 26df6ad8_0189_51d0_c3c1_6c3248893ff5["test_runnable.py"] 1c72b396_ff94_2618_42c3_843ec828f717 -->|defined in| 26df6ad8_0189_51d0_c3c1_6c3248893ff5 dd7e0445_a2c0_481c_9bd9_8c8abadfc25a["__init__()"] 1c72b396_ff94_2618_42c3_843ec828f717 -->|method| dd7e0445_a2c0_481c_9bd9_8c8abadfc25a d5b7b6c0_f6b6_2489_1752_29e8d4da7b57["_replace_uuid()"] 1c72b396_ff94_2618_42c3_843ec828f717 -->|method| d5b7b6c0_f6b6_2489_1752_29e8d4da7b57 07f9dcf9_f8c2_f4d9_fb48_0b6a09055b88["_replace_message_id()"] 1c72b396_ff94_2618_42c3_843ec828f717 -->|method| 07f9dcf9_f8c2_f4d9_fb48_0b6a09055b88 2edec481_9714_8233_fe69_21ac5be56870["_copy_run()"] 1c72b396_ff94_2618_42c3_843ec828f717 -->|method| 2edec481_9714_8233_fe69_21ac5be56870 07bf4724_e010_ed55_b883_d074a448c2b8["_persist_run()"] 1c72b396_ff94_2618_42c3_843ec828f717 -->|method| 07bf4724_e010_ed55_b883_d074a448c2b8 7e35ef39_76e4_058a_5abf_bdf57330a923["flattened_runs()"] 1c72b396_ff94_2618_42c3_843ec828f717 -->|method| 7e35ef39_76e4_058a_5abf_bdf57330a923 8687e1ce_52dc_9159_8f32_e8e69e257df8["run_ids()"] 1c72b396_ff94_2618_42c3_843ec828f717 -->|method| 8687e1ce_52dc_9159_8f32_e8e69e257df8
Relationship Graph
Source Code
libs/core/tests/unit_tests/runnables/test_runnable.py lines 101–182
class FakeTracer(BaseTracer):
"""Fake tracer that records LangChain execution.
It replaces run IDs with deterministic UUIDs for snapshotting.
"""
def __init__(self) -> None:
"""Initialize the tracer."""
super().__init__()
self.runs: list[Run] = []
self.uuids_map: dict[UUID, UUID] = {}
self.uuids_generator = (
UUID(f"00000000-0000-4000-8000-{i:012}", version=4) for i in range(10000)
)
def _replace_uuid(self, uuid: UUID) -> UUID:
if uuid not in self.uuids_map:
self.uuids_map[uuid] = next(self.uuids_generator)
return self.uuids_map[uuid]
def _replace_message_id(self, maybe_message: Any) -> Any:
if isinstance(maybe_message, BaseMessage):
maybe_message.id = str(next(self.uuids_generator))
if isinstance(maybe_message, ChatGeneration):
maybe_message.message.id = str(next(self.uuids_generator))
if isinstance(maybe_message, LLMResult):
for i, gen_list in enumerate(maybe_message.generations):
for j, gen in enumerate(gen_list):
maybe_message.generations[i][j] = self._replace_message_id(gen)
if isinstance(maybe_message, dict):
for k, v in maybe_message.items():
maybe_message[k] = self._replace_message_id(v)
if isinstance(maybe_message, list):
for i, v in enumerate(maybe_message):
maybe_message[i] = self._replace_message_id(v)
return maybe_message
def _copy_run(self, run: Run) -> Run:
if run.dotted_order:
levels = run.dotted_order.split(".")
processed_levels = []
for level in levels:
timestamp, run_id = level.split("Z")
new_run_id = self._replace_uuid(UUID(run_id))
processed_level = f"{timestamp}Z{new_run_id}"
processed_levels.append(processed_level)
new_dotted_order = ".".join(processed_levels)
else:
new_dotted_order = None
update_dict = {
"id": self._replace_uuid(run.id),
"parent_run_id": (
self.uuids_map[run.parent_run_id] if run.parent_run_id else None
),
"child_runs": [self._copy_run(child) for child in run.child_runs],
"trace_id": self._replace_uuid(run.trace_id) if run.trace_id else None,
"dotted_order": new_dotted_order,
"inputs": self._replace_message_id(run.inputs),
"outputs": self._replace_message_id(run.outputs),
}
return pydantic_copy(run, update=update_dict)
def _persist_run(self, run: Run) -> None:
"""Persist a run."""
self.runs.append(self._copy_run(run))
def flattened_runs(self) -> list[Run]:
q = [*self.runs]
result = []
while q:
parent = q.pop()
result.append(parent)
if parent.child_runs:
q.extend(parent.child_runs)
return result
@property
def run_ids(self) -> list[uuid.UUID | None]:
runs = self.flattened_runs()
uuids_map = {v: k for k, v in self.uuids_map.items()}
Source
Frequently Asked Questions
What is the FakeTracer class?
FakeTracer is a class in the langchain codebase, defined in libs/core/tests/unit_tests/runnables/test_runnable.py.
Where is FakeTracer defined?
FakeTracer is defined in libs/core/tests/unit_tests/runnables/test_runnable.py at line 101.
What does FakeTracer extend?
FakeTracer extends BaseTracer, BaseMessage, ChatGeneration, LLMResult.
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free