From bcda5d001aba388e426ba16985f7cd962568deeb Mon Sep 17 00:00:00 2001 From: DCCONSTRUCTIONS Date: Sun, 23 Aug 2026 20:29:14 +0300 Subject: [PATCH] defer optional telemetry dependencies in perception graph --- src/k1link/perception/graph.py | 19 ++++++++++++------- tests/test_perception_graph.py | 19 +++++++++++++++++++ 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/src/k1link/perception/graph.py b/src/k1link/perception/graph.py index 7cc1c24..c2401e3 100644 --- a/src/k1link/perception/graph.py +++ b/src/k1link/perception/graph.py @@ -8,14 +8,15 @@ from contextlib import AbstractContextManager from dataclasses import dataclass, replace from queue import Empty, Full, Queue from threading import Event, Lock, Thread -from typing import TypeVar, cast +from typing import TYPE_CHECKING, TypeVar, cast -from k1link.compute.pipeline_telemetry import ( - PipelineStageOutcome, - PipelineTelemetryEmitter, - PipelineTelemetryIdentity, - PipelineTelemetrySink, -) +if TYPE_CHECKING: + from k1link.compute.pipeline_telemetry import ( + PipelineStageOutcome, + PipelineTelemetryEmitter, + PipelineTelemetryIdentity, + PipelineTelemetrySink, + ) from .baseline import BASELINE_PROFILE_ID, BASELINE_SOURCE_ID from .contracts import ( @@ -763,6 +764,8 @@ class ReferencePerceptionGraphV1: def _run_emitter(self) -> PipelineTelemetryEmitter | None: if self.telemetry_identity is None or self.telemetry_sink is None: return None + from k1link.compute.pipeline_telemetry import PipelineTelemetryEmitter + return PipelineTelemetryEmitter( identity=self.telemetry_identity, sink=self.telemetry_sink, @@ -772,6 +775,8 @@ class ReferencePerceptionGraphV1: def _frame_emitter(self, packet: SourcePacket) -> PipelineTelemetryEmitter | None: if self.telemetry_identity is None or self.telemetry_sink is None: return None + from k1link.compute.pipeline_telemetry import PipelineTelemetryEmitter + identity = replace( self.telemetry_identity, request_id=packet.envelope.frame_id, diff --git a/tests/test_perception_graph.py b/tests/test_perception_graph.py index 71bc76a..48521ee 100644 --- a/tests/test_perception_graph.py +++ b/tests/test_perception_graph.py @@ -1,6 +1,8 @@ from __future__ import annotations import json +import subprocess +import sys import threading from collections.abc import Iterator from dataclasses import replace @@ -62,6 +64,23 @@ from k1link.perception.recorded_source import ( ) +def test_graph_import_does_not_initialize_legacy_compute_dependencies() -> None: + result = subprocess.run( + [ + sys.executable, + "-c", + ( + "import sys; import k1link.perception.graph; " + "assert 'k1link.compute' not in sys.modules" + ), + ], + check=False, + capture_output=True, + text=True, + ) + assert result.returncode == 0, result.stderr + + def _status(available: bool = True) -> ModalityStatus: return ModalityStatus( available=available,