Home / Class/ FakeTracer Class — langchain Architecture

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()}

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