From e7e0b705cd14e094425a5f2fe09cf0d7164932d0 Mon Sep 17 00:00:00 2001 From: Juan Sugg Date: Wed, 8 Jul 2026 05:56:16 -0300 Subject: [PATCH] refactor(api): tighten public surface to tier-1 facades Move worker/timeout/retry/lifecycle and backend plumbing runtime modules under ser/_internal/runtime and shrink boundary_policy.toml to genuine facades (24 -> 17 entries). Trim ser.config exports: settings-input types, the backend override type, and DEFAULT_* file name constants go internal. Expose a public RuntimePipeline protocol and RuntimePipelineBuilder in ser.api; keep run_startup_preflight public only in ser.api. Give ser/models an explicit lazy by-export facade surface. Strengthen the boundary contract test with a tier-1 __all__ snapshot, add a make lock-check target, and document ser.api as the sole supported Python entry point. --- README.md | 21 ++++ boundary_policy.toml | 28 ----- docs/architecture-diagram.md | 26 ++--- docs/codebase-architecture.md | 14 +-- docs/refactor-hotspot-checks.md | 26 ++--- docs/subsystem-dependency-map.md | 4 +- ser/_internal/api/diagnostics.py | 2 +- ser/_internal/api/runtime.py | 2 +- .../runtime/accurate_backend_runtime.py | 0 .../runtime/accurate_execution_flow.py | 6 +- .../runtime/accurate_operation_setup.py | 4 +- .../runtime/accurate_process_timeout.py | 0 .../runtime/accurate_public_boundary.py | 110 +++++++++--------- .../runtime/accurate_retry_operation.py | 0 .../runtime/accurate_runtime_support.py | 10 +- .../runtime/accurate_worker_lifecycle.py | 2 +- .../runtime/accurate_worker_operation.py | 6 +- ser/{ => _internal}/runtime/backend_hooks.py | 0 ser/_internal/runtime/fast_public_boundary.py | 2 +- .../runtime/medium_backend_runtime.py | 0 .../runtime/medium_execution_context.py | 10 +- .../runtime/medium_execution_flow.py | 6 +- .../runtime/medium_process_operation.py | 4 +- .../runtime/medium_process_timeout.py | 0 .../runtime/medium_public_boundary.py | 96 +++++++-------- .../runtime/medium_retry_operation.py | 0 .../runtime/medium_retry_policy.py | 4 +- .../runtime/medium_runtime_support.py | 14 ++- .../runtime/medium_worker_lifecycle.py | 2 +- .../runtime/medium_worker_operation.py | 0 ser/{ => _internal}/runtime/policy.py | 0 .../runtime/retry_primitives.py | 0 ser/api.py | 6 +- ser/config.py | 14 --- ser/diagnostics/__init__.py | 2 - ser/diagnostics/service.py | 2 +- ser/domain.py | 2 + ser/models/__init__.py | 28 +++++ ser/runtime/__init__.py | 2 - ser/runtime/pipeline.py | 2 +- tests/suites/integration/api/test_api.py | 2 + .../api/test_config_public_contract.py | 12 +- .../architecture/test_api_import_boundary.py | 88 ++++++++++++++ .../diagnostics/test_diagnostics_service.py | 4 +- .../integration/test_accurate_inference.py | 2 +- .../suites/integration/test_backend_hooks.py | 2 +- .../suites/integration/test_fast_inference.py | 4 +- .../suites/integration/test_license_gates.py | 2 +- .../integration/test_medium_inference.py | 2 +- .../integration/test_runtime_pipeline.py | 2 +- .../unit/runtime/test_medium_retry_policy.py | 4 +- .../unit/runtime/test_retry_primitives.py | 4 +- .../unit/test_accurate_execution_flow.py | 6 +- .../unit/test_accurate_operation_setup.py | 4 +- .../unit/test_accurate_process_timeout.py | 2 +- .../unit/test_accurate_retry_operation.py | 2 +- .../unit/test_accurate_runtime_support.py | 4 +- .../unit/test_accurate_worker_lifecycle.py | 2 +- .../unit/test_accurate_worker_operation.py | 4 +- .../unit/test_medium_execution_context.py | 4 +- .../suites/unit/test_medium_execution_flow.py | 6 +- .../unit/test_medium_process_operation.py | 6 +- .../unit/test_medium_process_timeout.py | 2 +- .../unit/test_medium_retry_operation.py | 2 +- .../unit/test_medium_runtime_support.py | 6 +- .../unit/test_medium_worker_lifecycle.py | 2 +- .../unit/test_medium_worker_operation.py | 4 +- 67 files changed, 372 insertions(+), 269 deletions(-) rename ser/{ => _internal}/runtime/accurate_backend_runtime.py (100%) rename ser/{ => _internal}/runtime/accurate_execution_flow.py (97%) rename ser/{ => _internal}/runtime/accurate_operation_setup.py (95%) rename ser/{ => _internal}/runtime/accurate_process_timeout.py (100%) rename ser/{ => _internal}/runtime/accurate_retry_operation.py (100%) rename ser/{ => _internal}/runtime/accurate_runtime_support.py (94%) rename ser/{ => _internal}/runtime/accurate_worker_lifecycle.py (98%) rename ser/{ => _internal}/runtime/accurate_worker_operation.py (99%) rename ser/{ => _internal}/runtime/backend_hooks.py (100%) rename ser/{ => _internal}/runtime/medium_backend_runtime.py (100%) rename ser/{ => _internal}/runtime/medium_execution_context.py (96%) rename ser/{ => _internal}/runtime/medium_execution_flow.py (95%) rename ser/{ => _internal}/runtime/medium_process_operation.py (94%) rename ser/{ => _internal}/runtime/medium_process_timeout.py (100%) rename ser/{ => _internal}/runtime/medium_retry_operation.py (100%) rename ser/{ => _internal}/runtime/medium_retry_policy.py (94%) rename ser/{ => _internal}/runtime/medium_runtime_support.py (94%) rename ser/{ => _internal}/runtime/medium_worker_lifecycle.py (98%) rename ser/{ => _internal}/runtime/medium_worker_operation.py (100%) rename ser/{ => _internal}/runtime/policy.py (100%) rename ser/{ => _internal}/runtime/retry_primitives.py (100%) diff --git a/README.md b/README.md index 8ca5959..ea94725 100644 --- a/README.md +++ b/README.md @@ -94,6 +94,27 @@ ser --train --profile accurate-research Profile selection during predict is strict: use an artifact trained for the same profile/backend. When running from a source checkout without activating an environment, prefix commands with `uv run`. +## Python API +`ser.api` is the sole supported Python entry point. Everything else — including +modules under public-looking paths that are not exported from `ser`, `ser.api`, +`ser.domain`, `ser.config`, or `ser.utils` — is implementation detail and may +change without notice. + +Minimal inference example: + +```python +import ser.api + +execution = ser.api.infer("sample.wav", profile="fast") +for segment in execution.emotions: + print(segment.emotion, segment.start_seconds, segment.end_seconds) +``` + +Stability promise: symbols exported from `ser.api` (see `ser.api.__all__`), +the domain types re-exported from `ser`/`ser.domain`, the trimmed `ser.config` +surface, and the helpers in `ser.utils` follow semantic versioning from `1.0.0` +onward. Anything not exported there carries no compatibility guarantee. + ## Boundary Checks (Contributors) If your change touches `ser/api.py`, `ser/_internal/api/*`, or `ser/__main__.py`, run: diff --git a/boundary_policy.toml b/boundary_policy.toml index c055f9c..d7abe2f 100644 --- a/boundary_policy.toml +++ b/boundary_policy.toml @@ -44,22 +44,6 @@ reason = "Public representation adapter requiring internal runtime/config suppor path = "ser/runtime/accurate_inference.py" reason = "Accurate profile wrapper over internal runtime owners." -[[public_internal_import]] -path = "ser/runtime/accurate_process_timeout.py" -reason = "Accurate timeout wrapper over internal runtime owners." - -[[public_internal_import]] -path = "ser/runtime/accurate_retry_operation.py" -reason = "Accurate retry wrapper over internal runtime owners." - -[[public_internal_import]] -path = "ser/runtime/accurate_worker_lifecycle.py" -reason = "Accurate worker lifecycle wrapper over internal runtime owners." - -[[public_internal_import]] -path = "ser/runtime/accurate_worker_operation.py" -reason = "Accurate worker operation wrapper over internal runtime owners." - [[public_internal_import]] path = "ser/runtime/fast_inference.py" reason = "Fast profile wrapper over internal runtime owner modules." @@ -68,18 +52,6 @@ reason = "Fast profile wrapper over internal runtime owner modules." path = "ser/runtime/medium_inference.py" reason = "Medium profile wrapper over internal runtime owners." -[[public_internal_import]] -path = "ser/runtime/medium_process_timeout.py" -reason = "Medium timeout wrapper over internal runtime owners." - -[[public_internal_import]] -path = "ser/runtime/medium_worker_lifecycle.py" -reason = "Medium worker lifecycle wrapper over internal runtime owners." - -[[public_internal_import]] -path = "ser/runtime/medium_worker_operation.py" -reason = "Medium worker operation wrapper over internal runtime owners." - [[public_internal_import]] path = "ser/runtime/pipeline.py" reason = "Public runtime orchestration surface over internal workflow owners." diff --git a/docs/architecture-diagram.md b/docs/architecture-diagram.md index f749a50..d35c091 100644 --- a/docs/architecture-diagram.md +++ b/docs/architecture-diagram.md @@ -32,26 +32,26 @@ _internal/api/runtime.py runtime/pipeline.py | +--> runtime/registry.py - +--> runtime/backend_hooks.py + +--> _internal/runtime/backend_hooks.py +--> _internal/runtime/environment_plan.py +--> _internal/runtime/process_env.py | +--> fast_inference.py +--> medium_inference.py - | +--> medium_execution_context.py - | +--> medium_execution_flow.py + | +--> _internal/runtime/medium_execution_context.py + | +--> _internal/runtime/medium_execution_flow.py | +--> medium_execution.py - | +--> medium_worker_operation.py - | +--> medium_worker_lifecycle.py - | +--> medium_runtime_support.py + | +--> _internal/runtime/medium_worker_operation.py + | +--> _internal/runtime/medium_worker_lifecycle.py + | +--> _internal/runtime/medium_runtime_support.py | +--> accurate_inference.py - +--> accurate_execution_flow.py + +--> _internal/runtime/accurate_execution_flow.py +--> accurate_execution.py - +--> accurate_operation_setup.py - +--> accurate_worker_operation.py - +--> accurate_worker_lifecycle.py - +--> accurate_runtime_support.py + +--> _internal/runtime/accurate_operation_setup.py + +--> _internal/runtime/accurate_worker_operation.py + +--> _internal/runtime/accurate_worker_lifecycle.py + +--> _internal/runtime/accurate_runtime_support.py ``` Shared runtime primitives: @@ -59,8 +59,8 @@ Shared runtime primitives: ```text _internal/runtime/worker_lifecycle.py _internal/runtime/retry_scaffold.py -runtime/policy.py -runtime/retry_primitives.py +_internal/runtime/policy.py +_internal/runtime/retry_primitives.py ``` ## Level 3: transcription execution diff --git a/docs/codebase-architecture.md b/docs/codebase-architecture.md index 3d1fe40..e6f9727 100644 --- a/docs/codebase-architecture.md +++ b/docs/codebase-architecture.md @@ -110,10 +110,10 @@ It coordinates: Supporting runtime ownership is split between: -- backend hook construction: [`ser/runtime/backend_hooks.py`](../ser/runtime/backend_hooks.py) +- backend hook construction: [`ser/_internal/runtime/backend_hooks.py`](../ser/_internal/runtime/backend_hooks.py) - capability resolution: [`ser/runtime/registry.py`](../ser/runtime/registry.py) -- retry policy: [`ser/runtime/policy.py`](../ser/runtime/policy.py) -- shared retry/error primitives: [`ser/runtime/retry_primitives.py`](../ser/runtime/retry_primitives.py) +- retry policy: [`ser/_internal/runtime/policy.py`](../ser/_internal/runtime/policy.py) +- shared retry/error primitives: [`ser/_internal/runtime/retry_primitives.py`](../ser/_internal/runtime/retry_primitives.py) - process env planning: [`ser/_internal/runtime/environment_plan.py`](../ser/_internal/runtime/environment_plan.py) - scoped env application: [`ser/_internal/runtime/process_env.py`](../ser/_internal/runtime/process_env.py) @@ -130,10 +130,10 @@ longer monolithic runtime modules. They now delegate heavily into owner modules: - public-boundary orchestration: [`ser/_internal/runtime/accurate_public_boundary.py`](../ser/_internal/runtime/accurate_public_boundary.py), [`ser/_internal/runtime/medium_public_boundary.py`](../ser/_internal/runtime/medium_public_boundary.py) - execution: [`ser/runtime/medium_execution.py`](../ser/runtime/medium_execution.py), [`ser/runtime/accurate_execution.py`](../ser/runtime/accurate_execution.py) -- setup/context: [`ser/runtime/medium_execution_context.py`](../ser/runtime/medium_execution_context.py), [`ser/runtime/accurate_operation_setup.py`](../ser/runtime/accurate_operation_setup.py) -- retry/execution flow: [`ser/runtime/medium_execution_flow.py`](../ser/runtime/medium_execution_flow.py), [`ser/runtime/accurate_execution_flow.py`](../ser/runtime/accurate_execution_flow.py) -- worker lifecycle: [`ser/runtime/medium_worker_lifecycle.py`](../ser/runtime/medium_worker_lifecycle.py), [`ser/runtime/accurate_worker_lifecycle.py`](../ser/runtime/accurate_worker_lifecycle.py) -- runtime support: [`ser/runtime/medium_runtime_support.py`](../ser/runtime/medium_runtime_support.py), [`ser/runtime/accurate_runtime_support.py`](../ser/runtime/accurate_runtime_support.py) +- setup/context: [`ser/_internal/runtime/medium_execution_context.py`](../ser/_internal/runtime/medium_execution_context.py), [`ser/_internal/runtime/accurate_operation_setup.py`](../ser/_internal/runtime/accurate_operation_setup.py) +- retry/execution flow: [`ser/_internal/runtime/medium_execution_flow.py`](../ser/_internal/runtime/medium_execution_flow.py), [`ser/_internal/runtime/accurate_execution_flow.py`](../ser/_internal/runtime/accurate_execution_flow.py) +- worker lifecycle: [`ser/_internal/runtime/medium_worker_lifecycle.py`](../ser/_internal/runtime/medium_worker_lifecycle.py), [`ser/_internal/runtime/accurate_worker_lifecycle.py`](../ser/_internal/runtime/accurate_worker_lifecycle.py) +- runtime support: [`ser/_internal/runtime/medium_runtime_support.py`](../ser/_internal/runtime/medium_runtime_support.py), [`ser/_internal/runtime/accurate_runtime_support.py`](../ser/_internal/runtime/accurate_runtime_support.py) Underneath those, shared internal worker primitives provide the real reusable mechanics: diff --git a/docs/refactor-hotspot-checks.md b/docs/refactor-hotspot-checks.md index b200b7f..e3dfac8 100644 --- a/docs/refactor-hotspot-checks.md +++ b/docs/refactor-hotspot-checks.md @@ -27,22 +27,22 @@ only as a maintenance heuristic and architecture-reference aid. - `ser/runtime/quality_gate_evaluation.py` - `ser/runtime/quality_gate_reporting.py` - `ser/runtime/quality_gate_cli.py` -- `ser/runtime/medium_execution_context.py` -- `ser/runtime/medium_execution_flow.py` -- `ser/runtime/medium_process_operation.py` -- `ser/runtime/medium_retry_operation.py` -- `ser/runtime/retry_primitives.py` -- `ser/runtime/medium_runtime_support.py` -- `ser/runtime/medium_worker_lifecycle.py` -- `ser/runtime/medium_worker_operation.py` +- `ser/_internal/runtime/medium_execution_context.py` +- `ser/_internal/runtime/medium_execution_flow.py` +- `ser/_internal/runtime/medium_process_operation.py` +- `ser/_internal/runtime/medium_retry_operation.py` +- `ser/_internal/runtime/retry_primitives.py` +- `ser/_internal/runtime/medium_runtime_support.py` +- `ser/_internal/runtime/medium_worker_lifecycle.py` +- `ser/_internal/runtime/medium_worker_operation.py` - `ser/runtime/medium_inference.py` - `ser/runtime/medium_execution.py` - `ser/runtime/accurate_execution.py` -- `ser/runtime/accurate_execution_flow.py` -- `ser/runtime/accurate_operation_setup.py` -- `ser/runtime/accurate_runtime_support.py` -- `ser/runtime/accurate_worker_lifecycle.py` -- `ser/runtime/accurate_worker_operation.py` +- `ser/_internal/runtime/accurate_execution_flow.py` +- `ser/_internal/runtime/accurate_operation_setup.py` +- `ser/_internal/runtime/accurate_runtime_support.py` +- `ser/_internal/runtime/accurate_worker_lifecycle.py` +- `ser/_internal/runtime/accurate_worker_operation.py` - `ser/runtime/accurate_inference.py` - `ser/transcript/transcript_extractor.py` diff --git a/docs/subsystem-dependency-map.md b/docs/subsystem-dependency-map.md index bbe066f..8fb4529 100644 --- a/docs/subsystem-dependency-map.md +++ b/docs/subsystem-dependency-map.md @@ -43,7 +43,7 @@ Shared primitives, schemas, utils, external libraries ### Primary nodes - `runtime/pipeline.py` -- `runtime/backend_hooks.py` +- `_internal/runtime/backend_hooks.py` - `runtime/registry.py` - `runtime/*_inference.py` - `_internal/runtime/accurate_public_boundary.py` @@ -210,7 +210,7 @@ Obsolete references: ## Cross-cutting shared primitives - Config schema and bootstrap: `_internal/config/*` -- Runtime worker lifecycle and retries: `_internal/runtime/*`, `runtime/policy.py`, `runtime/retry_primitives.py` +- Runtime worker lifecycle and retries: `_internal/runtime/*`, `_internal/runtime/policy.py`, `_internal/runtime/retry_primitives.py` - Domain contracts: `domain.py`, `runtime/contracts.py`, `runtime/schema.py` - Logging and timing: `utils/logger.py`, `runtime/phase_timing.py` diff --git a/ser/_internal/api/diagnostics.py b/ser/_internal/api/diagnostics.py index 09133e7..1d7525d 100644 --- a/ser/_internal/api/diagnostics.py +++ b/ser/_internal/api/diagnostics.py @@ -85,7 +85,7 @@ def run_startup_preflight( include_transcription_checks: bool, ) -> DiagnosticReport: """Runs one startup preflight diagnostics check suite.""" - from ser.diagnostics.service import run_startup_preflight as _run_startup_preflight + from ser.diagnostics.service import _run_startup_preflight return _run_startup_preflight( settings=settings, diff --git a/ser/_internal/api/runtime.py b/ser/_internal/api/runtime.py index 6beff60..7b5e424 100644 --- a/ser/_internal/api/runtime.py +++ b/ser/_internal/api/runtime.py @@ -242,7 +242,7 @@ def load_profile( settings: AppConfig, ) -> None: """Validates profile availability and dependency capability for execution.""" - from ser.runtime.backend_hooks import build_backend_hooks + from ser._internal.runtime.backend_hooks import build_backend_hooks from ser.runtime.registry import ( ensure_profile_supported, resolve_runtime_capability, diff --git a/ser/runtime/accurate_backend_runtime.py b/ser/_internal/runtime/accurate_backend_runtime.py similarity index 100% rename from ser/runtime/accurate_backend_runtime.py rename to ser/_internal/runtime/accurate_backend_runtime.py diff --git a/ser/runtime/accurate_execution_flow.py b/ser/_internal/runtime/accurate_execution_flow.py similarity index 97% rename from ser/runtime/accurate_execution_flow.py rename to ser/_internal/runtime/accurate_execution_flow.py index 5f73efa..039a7d4 100644 --- a/ser/runtime/accurate_execution_flow.py +++ b/ser/_internal/runtime/accurate_execution_flow.py @@ -7,12 +7,12 @@ from functools import partial from typing import TypeVar -from ser.config import AppConfig -from ser.runtime.accurate_worker_operation import ( +from ser._internal.runtime.accurate_worker_operation import ( AccurateRetryOperationState, PreparedAccurateOperation, ) -from ser.runtime.accurate_worker_operation import _PayloadLike as _AccuratePayloadLike +from ser._internal.runtime.accurate_worker_operation import _PayloadLike as _AccuratePayloadLike +from ser.config import AppConfig _PayloadT = TypeVar("_PayloadT", bound=_AccuratePayloadLike) _LoadedModelT = TypeVar("_LoadedModelT") diff --git a/ser/runtime/accurate_operation_setup.py b/ser/_internal/runtime/accurate_operation_setup.py similarity index 95% rename from ser/runtime/accurate_operation_setup.py rename to ser/_internal/runtime/accurate_operation_setup.py index 1ee12dd..55b494a 100644 --- a/ser/runtime/accurate_operation_setup.py +++ b/ser/_internal/runtime/accurate_operation_setup.py @@ -7,9 +7,9 @@ from numpy.typing import NDArray +from ser._internal.runtime import accurate_worker_operation as accurate_worker_operation_helpers +from ser._internal.runtime.accurate_worker_operation import PreparedAccurateOperation from ser.config import AppConfig, ProfileRuntimeConfig -from ser.runtime import accurate_worker_operation as accurate_worker_operation_helpers -from ser.runtime.accurate_worker_operation import PreparedAccurateOperation _LoadedModelT = TypeVar("_LoadedModelT") _BackendT = TypeVar("_BackendT") diff --git a/ser/runtime/accurate_process_timeout.py b/ser/_internal/runtime/accurate_process_timeout.py similarity index 100% rename from ser/runtime/accurate_process_timeout.py rename to ser/_internal/runtime/accurate_process_timeout.py diff --git a/ser/_internal/runtime/accurate_public_boundary.py b/ser/_internal/runtime/accurate_public_boundary.py index 32708d1..458876d 100644 --- a/ser/_internal/runtime/accurate_public_boundary.py +++ b/ser/_internal/runtime/accurate_public_boundary.py @@ -14,9 +14,65 @@ import numpy as np from numpy.typing import NDArray +from ser._internal.runtime.accurate_backend_runtime import ( + build_backend_for_profile as _build_backend_for_profile_impl, +) +from ser._internal.runtime.accurate_backend_runtime import ( + runtime_config_for_profile as _runtime_config_for_profile_impl, +) +from ser._internal.runtime.accurate_execution_flow import ( + execute_accurate_inference_with_retry as _execute_accurate_inference_with_retry_impl, +) +from ser._internal.runtime.accurate_execution_flow import ( + run_accurate_retryable_operation as _run_accurate_retryable_operation_impl, +) +from ser._internal.runtime.accurate_operation_setup import _PayloadLike as _AccuratePayloadLike +from ser._internal.runtime.accurate_operation_setup import _RequestLike as _AccurateRequestLike +from ser._internal.runtime.accurate_operation_setup import ( + prepare_in_process_operation as _prepare_in_process_operation_orchestration, +) +from ser._internal.runtime.accurate_operation_setup import ( + prepare_process_operation as _prepare_process_operation_orchestration, +) +from ser._internal.runtime.accurate_operation_setup import ( + run_process_operation as _run_process_operation_orchestration, +) +from ser._internal.runtime.accurate_retry_operation import ( + run_accurate_inference_with_retry_policy as _run_accurate_retry_policy_impl, +) +from ser._internal.runtime.accurate_runtime_support import ( + build_cpu_settings_snapshot as _build_cpu_settings_snapshot_impl, +) +from ser._internal.runtime.accurate_runtime_support import ( + build_process_settings_snapshot as _build_process_settings_snapshot_impl, +) +from ser._internal.runtime.accurate_runtime_support import ( + encode_accurate_sequence as _encode_accurate_sequence_impl, +) +from ser._internal.runtime.accurate_runtime_support import ( + prepare_accurate_backend_runtime as _prepare_accurate_backend_runtime_support_impl, +) +from ser._internal.runtime.accurate_worker_operation import ( + AccurateRetryOperationState, + PreparedAccurateOperation, + build_transient_failure_handler, +) +from ser._internal.runtime.accurate_worker_operation import ( + finalize_in_process_setup as _finalize_in_process_setup_impl, +) +from ser._internal.runtime.accurate_worker_operation import ( + prepare_retry_state as _prepare_retry_state_impl, +) +from ser._internal.runtime.accurate_worker_operation import ( + run_inference_operation as _run_inference_operation_impl, +) +from ser._internal.runtime.policy import run_with_retry_policy from ser._internal.runtime.process_timeout import ( run_with_process_timeout as _run_with_process_timeout_impl, ) +from ser._internal.runtime.retry_primitives import ( + jittered_retry_delay_seconds as _jittered_retry_delay_seconds_impl, +) from ser._internal.runtime.single_flight import SingleFlightRegistry from ser._internal.runtime.worker_bindings import ( is_setup_complete_message as _is_setup_complete_message_binding, @@ -56,70 +112,20 @@ from ser.repr import Emotion2VecBackend, FeatureBackend, WhisperBackend from ser.repr.runtime_policy import resolve_feature_runtime_policy from ser.runtime import mps_oom as mps_oom_helpers -from ser.runtime.accurate_backend_runtime import ( - build_backend_for_profile as _build_backend_for_profile_impl, -) -from ser.runtime.accurate_backend_runtime import ( - runtime_config_for_profile as _runtime_config_for_profile_impl, -) from ser.runtime.accurate_execution import LoadedModelLike as _AccurateLoadedModelLike from ser.runtime.accurate_execution import ( run_accurate_inference_once as _run_accurate_inference_once_impl, ) -from ser.runtime.accurate_execution_flow import ( - execute_accurate_inference_with_retry as _execute_accurate_inference_with_retry_impl, -) -from ser.runtime.accurate_execution_flow import ( - run_accurate_retryable_operation as _run_accurate_retryable_operation_impl, -) from ser.runtime.accurate_model_contract import ( ArtifactMetadataCarrier, ) from ser.runtime.accurate_model_contract import ( validate_accurate_loaded_model_runtime_contract as _validate_accurate_loaded_model_runtime_contract_impl, ) -from ser.runtime.accurate_operation_setup import _PayloadLike as _AccuratePayloadLike -from ser.runtime.accurate_operation_setup import _RequestLike as _AccurateRequestLike -from ser.runtime.accurate_operation_setup import ( - prepare_in_process_operation as _prepare_in_process_operation_orchestration, -) -from ser.runtime.accurate_operation_setup import ( - prepare_process_operation as _prepare_process_operation_orchestration, -) -from ser.runtime.accurate_operation_setup import ( - run_process_operation as _run_process_operation_orchestration, -) from ser.runtime.accurate_prediction import ( confidence_and_probabilities as _confidence_and_probabilities_impl, ) from ser.runtime.accurate_prediction import predict_labels as _predict_labels_impl -from ser.runtime.accurate_retry_operation import ( - run_accurate_inference_with_retry_policy as _run_accurate_retry_policy_impl, -) -from ser.runtime.accurate_runtime_support import ( - build_cpu_settings_snapshot as _build_cpu_settings_snapshot_impl, -) -from ser.runtime.accurate_runtime_support import ( - build_process_settings_snapshot as _build_process_settings_snapshot_impl, -) -from ser.runtime.accurate_runtime_support import ( - encode_accurate_sequence as _encode_accurate_sequence_impl, -) -from ser.runtime.accurate_runtime_support import ( - prepare_accurate_backend_runtime as _prepare_accurate_backend_runtime_support_impl, -) -from ser.runtime.accurate_worker_operation import ( - AccurateRetryOperationState, - PreparedAccurateOperation, - build_transient_failure_handler, -) -from ser.runtime.accurate_worker_operation import ( - finalize_in_process_setup as _finalize_in_process_setup_impl, -) -from ser.runtime.accurate_worker_operation import prepare_retry_state as _prepare_retry_state_impl -from ser.runtime.accurate_worker_operation import ( - run_inference_operation as _run_inference_operation_impl, -) from ser.runtime.contracts import InferenceRequest from ser.runtime.phase_contract import PHASE_EMOTION_INFERENCE, PHASE_EMOTION_SETUP from ser.runtime.phase_timing import ( @@ -127,10 +133,6 @@ log_phase_failed, log_phase_started, ) -from ser.runtime.policy import run_with_retry_policy -from ser.runtime.retry_primitives import ( - jittered_retry_delay_seconds as _jittered_retry_delay_seconds_impl, -) from ser.runtime.schema import InferenceResult from ser.utils.audio_utils import read_audio_file diff --git a/ser/runtime/accurate_retry_operation.py b/ser/_internal/runtime/accurate_retry_operation.py similarity index 100% rename from ser/runtime/accurate_retry_operation.py rename to ser/_internal/runtime/accurate_retry_operation.py diff --git a/ser/runtime/accurate_runtime_support.py b/ser/_internal/runtime/accurate_runtime_support.py similarity index 94% rename from ser/runtime/accurate_runtime_support.py rename to ser/_internal/runtime/accurate_runtime_support.py index d2fca09..bf7c52e 100644 --- a/ser/runtime/accurate_runtime_support.py +++ b/ser/_internal/runtime/accurate_runtime_support.py @@ -7,17 +7,17 @@ import numpy as np from numpy.typing import NDArray -from ser.config import AppConfig -from ser.repr import EncodedSequence, FeatureBackend -from ser.runtime.accurate_backend_runtime import ( +from ser._internal.runtime.accurate_backend_runtime import ( prepare_accurate_backend_runtime as _prepare_accurate_backend_runtime_impl, ) -from ser.runtime.accurate_backend_runtime import ( +from ser._internal.runtime.accurate_backend_runtime import ( settings_with_torch_device as _settings_with_torch_device_impl, ) -from ser.runtime.retry_primitives import ( +from ser._internal.runtime.retry_primitives import ( is_optional_dependency_runtime_error as _is_optional_dependency_runtime_error_impl, ) +from ser.config import AppConfig +from ser.repr import EncodedSequence, FeatureBackend def build_process_settings_snapshot(settings: AppConfig) -> AppConfig: diff --git a/ser/runtime/accurate_worker_lifecycle.py b/ser/_internal/runtime/accurate_worker_lifecycle.py similarity index 98% rename from ser/runtime/accurate_worker_lifecycle.py rename to ser/_internal/runtime/accurate_worker_lifecycle.py index bf298e9..896139d 100644 --- a/ser/runtime/accurate_worker_lifecycle.py +++ b/ser/_internal/runtime/accurate_worker_lifecycle.py @@ -8,6 +8,7 @@ from multiprocessing.process import BaseProcess from typing import TypeVar +from ser._internal.runtime import accurate_process_timeout as accurate_process_timeout_helpers from ser._internal.runtime.worker_bindings import ( is_setup_complete_message as _is_setup_complete_message_binding, ) @@ -22,7 +23,6 @@ from ser._internal.runtime.worker_bindings import ( terminate_worker_process as _terminate_worker_process_binding, ) -from ser.runtime import accurate_process_timeout as accurate_process_timeout_helpers _ProcessPayloadT = TypeVar( "_ProcessPayloadT", diff --git a/ser/runtime/accurate_worker_operation.py b/ser/_internal/runtime/accurate_worker_operation.py similarity index 99% rename from ser/runtime/accurate_worker_operation.py rename to ser/_internal/runtime/accurate_worker_operation.py index 79cd7ce..94883f0 100644 --- a/ser/runtime/accurate_worker_operation.py +++ b/ser/_internal/runtime/accurate_worker_operation.py @@ -10,14 +10,14 @@ import numpy as np from numpy.typing import NDArray +from ser._internal.runtime.accurate_retry_operation import ( + run_accurate_retry_operation as _run_accurate_retry_operation_impl, +) from ser._internal.runtime.retry_scaffold import ( finalize_in_process_setup as _finalize_in_process_setup_impl, ) from ser._internal.runtime.retry_scaffold import prepare_retry_state as _prepare_retry_state_impl from ser.config import AppConfig, ProfileRuntimeConfig -from ser.runtime.accurate_retry_operation import ( - run_accurate_retry_operation as _run_accurate_retry_operation_impl, -) class _PayloadLike(Protocol): diff --git a/ser/runtime/backend_hooks.py b/ser/_internal/runtime/backend_hooks.py similarity index 100% rename from ser/runtime/backend_hooks.py rename to ser/_internal/runtime/backend_hooks.py diff --git a/ser/_internal/runtime/fast_public_boundary.py b/ser/_internal/runtime/fast_public_boundary.py index e9cc2e1..5506b59 100644 --- a/ser/_internal/runtime/fast_public_boundary.py +++ b/ser/_internal/runtime/fast_public_boundary.py @@ -10,6 +10,7 @@ from multiprocessing.process import BaseProcess from typing import Literal +from ser._internal.runtime.policy import run_with_retry_policy from ser._internal.runtime.process_timeout import ( run_with_process_timeout as _run_with_process_timeout_impl, ) @@ -52,7 +53,6 @@ log_phase_failed, log_phase_started, ) -from ser.runtime.policy import run_with_retry_policy from ser.runtime.schema import InferenceResult type WorkerPhaseMessage = tuple[Literal["phase"], Literal["setup_complete"]] diff --git a/ser/runtime/medium_backend_runtime.py b/ser/_internal/runtime/medium_backend_runtime.py similarity index 100% rename from ser/runtime/medium_backend_runtime.py rename to ser/_internal/runtime/medium_backend_runtime.py diff --git a/ser/runtime/medium_execution_context.py b/ser/_internal/runtime/medium_execution_context.py similarity index 96% rename from ser/runtime/medium_execution_context.py rename to ser/_internal/runtime/medium_execution_context.py index 25c87bb..50292f2 100644 --- a/ser/runtime/medium_execution_context.py +++ b/ser/_internal/runtime/medium_execution_context.py @@ -7,14 +7,14 @@ from dataclasses import dataclass from typing import Generic, TypeVar -from ser.config import AppConfig, MediumRuntimeConfig -from ser.repr.runtime_policy import FeatureRuntimePolicy -from ser.runtime.contracts import InferenceRequest -from ser.runtime.medium_worker_operation import ( +from ser._internal.runtime.medium_worker_operation import ( MediumRetryOperationState, PreparedMediumOperation, ) -from ser.runtime.medium_worker_operation import _PayloadLike as _MediumPayloadLike +from ser._internal.runtime.medium_worker_operation import _PayloadLike as _MediumPayloadLike +from ser.config import AppConfig, MediumRuntimeConfig +from ser.repr.runtime_policy import FeatureRuntimePolicy +from ser.runtime.contracts import InferenceRequest _PayloadT = TypeVar("_PayloadT", bound=_MediumPayloadLike) _LoadedModelT = TypeVar("_LoadedModelT") diff --git a/ser/runtime/medium_execution_flow.py b/ser/_internal/runtime/medium_execution_flow.py similarity index 95% rename from ser/runtime/medium_execution_flow.py rename to ser/_internal/runtime/medium_execution_flow.py index 65f107f..c4c0ef0 100644 --- a/ser/runtime/medium_execution_flow.py +++ b/ser/_internal/runtime/medium_execution_flow.py @@ -6,11 +6,11 @@ from collections.abc import Callable from typing import TypeVar -from ser.runtime.medium_execution_context import MediumExecutionContext -from ser.runtime.medium_worker_operation import ( +from ser._internal.runtime.medium_execution_context import MediumExecutionContext +from ser._internal.runtime.medium_worker_operation import ( PreparedMediumOperation, ) -from ser.runtime.medium_worker_operation import _PayloadLike as _MediumPayloadLike +from ser._internal.runtime.medium_worker_operation import _PayloadLike as _MediumPayloadLike _PayloadT = TypeVar("_PayloadT", bound=_MediumPayloadLike) _LoadedModelT = TypeVar("_LoadedModelT") diff --git a/ser/runtime/medium_process_operation.py b/ser/_internal/runtime/medium_process_operation.py similarity index 94% rename from ser/runtime/medium_process_operation.py rename to ser/_internal/runtime/medium_process_operation.py index 208a927..63715fc 100644 --- a/ser/runtime/medium_process_operation.py +++ b/ser/_internal/runtime/medium_process_operation.py @@ -8,9 +8,9 @@ import numpy as np from numpy.typing import NDArray +from ser._internal.runtime import medium_worker_operation as medium_worker_operation_helpers +from ser._internal.runtime.medium_worker_operation import PreparedMediumOperation from ser.config import AppConfig, MediumRuntimeConfig -from ser.runtime import medium_worker_operation as medium_worker_operation_helpers -from ser.runtime.medium_worker_operation import PreparedMediumOperation _LoadedModelT = TypeVar("_LoadedModelT") _BackendT = TypeVar("_BackendT") diff --git a/ser/runtime/medium_process_timeout.py b/ser/_internal/runtime/medium_process_timeout.py similarity index 100% rename from ser/runtime/medium_process_timeout.py rename to ser/_internal/runtime/medium_process_timeout.py diff --git a/ser/_internal/runtime/medium_public_boundary.py b/ser/_internal/runtime/medium_public_boundary.py index fd81994..74f050a 100644 --- a/ser/_internal/runtime/medium_public_boundary.py +++ b/ser/_internal/runtime/medium_public_boundary.py @@ -14,6 +14,55 @@ import numpy as np from numpy.typing import NDArray +from ser._internal.runtime import medium_retry_policy as medium_retry_policy_helpers +from ser._internal.runtime import medium_worker_operation as medium_worker_operation_helpers +from ser._internal.runtime.medium_backend_runtime import ( + prepare_medium_backend_runtime as _prepare_medium_backend_runtime_impl, +) +from ser._internal.runtime.medium_backend_runtime import ( + resolve_medium_feature_runtime_policy as _resolve_medium_feature_runtime_policy_impl, +) +from ser._internal.runtime.medium_execution_context import ( + MediumExecutionContext, +) +from ser._internal.runtime.medium_execution_context import ( + prepare_execution_context as _prepare_execution_context_impl, +) +from ser._internal.runtime.medium_execution_flow import ( + execute_medium_inference_with_retry as _execute_medium_inference_with_retry_impl, +) +from ser._internal.runtime.medium_process_operation import _PayloadLike as _MediumPayloadLike +from ser._internal.runtime.medium_process_operation import ( + prepare_process_operation as _prepare_process_operation_impl, +) +from ser._internal.runtime.medium_process_operation import ( + run_process_operation as _run_process_operation_impl, +) +from ser._internal.runtime.medium_retry_operation import ( + run_medium_inference_with_retry_policy as _run_medium_retry_policy_impl, +) +from ser._internal.runtime.medium_runtime_support import ( + LoadedModelLike as _MediumRuntimeLoadedModelLike, +) +from ser._internal.runtime.medium_runtime_support import ( + build_cpu_settings_snapshot as _build_cpu_settings_snapshot_impl, +) +from ser._internal.runtime.medium_runtime_support import ( + build_medium_backend_for_settings as _build_medium_backend_for_settings_impl, +) +from ser._internal.runtime.medium_runtime_support import ( + build_runtime_settings_snapshot as _build_runtime_settings_snapshot_impl, +) +from ser._internal.runtime.medium_runtime_support import ( + encode_medium_sequence as _encode_medium_sequence_impl, +) +from ser._internal.runtime.medium_runtime_support import ( + ensure_medium_loaded_model_compatibility as _ensure_medium_loaded_model_compatibility_impl, +) +from ser._internal.runtime.medium_runtime_support import ( + warn_on_medium_runtime_selector_mismatch as _warn_on_medium_runtime_selector_mismatch_impl, +) +from ser._internal.runtime.policy import run_with_retry_policy from ser._internal.runtime.process_timeout import ( run_with_process_timeout as _run_with_process_timeout_impl, ) @@ -54,65 +103,18 @@ from ser.repr import XLSRBackend from ser.repr.runtime_policy import FeatureRuntimePolicy from ser.runtime import medium_execution as medium_execution_helpers -from ser.runtime import medium_retry_policy as medium_retry_policy_helpers -from ser.runtime import medium_worker_operation as medium_worker_operation_helpers from ser.runtime.contracts import InferenceRequest -from ser.runtime.medium_backend_runtime import ( - prepare_medium_backend_runtime as _prepare_medium_backend_runtime_impl, -) -from ser.runtime.medium_backend_runtime import ( - resolve_medium_feature_runtime_policy as _resolve_medium_feature_runtime_policy_impl, -) from ser.runtime.medium_execution import LoadedModelLike as _MediumExecutionLoadedModelLike -from ser.runtime.medium_execution_context import ( - MediumExecutionContext, -) -from ser.runtime.medium_execution_context import ( - prepare_execution_context as _prepare_execution_context_impl, -) -from ser.runtime.medium_execution_flow import ( - execute_medium_inference_with_retry as _execute_medium_inference_with_retry_impl, -) from ser.runtime.medium_prediction import ( confidence_and_probabilities as _confidence_and_probabilities_impl, ) from ser.runtime.medium_prediction import predict_labels as _predict_labels_impl -from ser.runtime.medium_process_operation import _PayloadLike as _MediumPayloadLike -from ser.runtime.medium_process_operation import ( - prepare_process_operation as _prepare_process_operation_impl, -) -from ser.runtime.medium_process_operation import ( - run_process_operation as _run_process_operation_impl, -) -from ser.runtime.medium_retry_operation import ( - run_medium_inference_with_retry_policy as _run_medium_retry_policy_impl, -) -from ser.runtime.medium_runtime_support import LoadedModelLike as _MediumRuntimeLoadedModelLike -from ser.runtime.medium_runtime_support import ( - build_cpu_settings_snapshot as _build_cpu_settings_snapshot_impl, -) -from ser.runtime.medium_runtime_support import ( - build_medium_backend_for_settings as _build_medium_backend_for_settings_impl, -) -from ser.runtime.medium_runtime_support import ( - build_runtime_settings_snapshot as _build_runtime_settings_snapshot_impl, -) -from ser.runtime.medium_runtime_support import ( - encode_medium_sequence as _encode_medium_sequence_impl, -) -from ser.runtime.medium_runtime_support import ( - ensure_medium_loaded_model_compatibility as _ensure_medium_loaded_model_compatibility_impl, -) -from ser.runtime.medium_runtime_support import ( - warn_on_medium_runtime_selector_mismatch as _warn_on_medium_runtime_selector_mismatch_impl, -) from ser.runtime.phase_contract import PHASE_EMOTION_INFERENCE, PHASE_EMOTION_SETUP from ser.runtime.phase_timing import ( log_phase_completed, log_phase_failed, log_phase_started, ) -from ser.runtime.policy import run_with_retry_policy from ser.runtime.schema import InferenceResult from ser.utils.audio_utils import read_audio_file diff --git a/ser/runtime/medium_retry_operation.py b/ser/_internal/runtime/medium_retry_operation.py similarity index 100% rename from ser/runtime/medium_retry_operation.py rename to ser/_internal/runtime/medium_retry_operation.py diff --git a/ser/runtime/medium_retry_policy.py b/ser/_internal/runtime/medium_retry_policy.py similarity index 94% rename from ser/runtime/medium_retry_policy.py rename to ser/_internal/runtime/medium_retry_policy.py index 26f05b1..7697cef 100644 --- a/ser/runtime/medium_retry_policy.py +++ b/ser/_internal/runtime/medium_retry_policy.py @@ -2,10 +2,10 @@ from __future__ import annotations -from ser.runtime.retry_primitives import ( +from ser._internal.runtime.retry_primitives import ( is_optional_dependency_runtime_error as _is_optional_dependency_runtime_error_impl, ) -from ser.runtime.retry_primitives import ( +from ser._internal.runtime.retry_primitives import ( jittered_retry_delay_seconds as _jittered_retry_delay_seconds_impl, ) diff --git a/ser/runtime/medium_runtime_support.py b/ser/_internal/runtime/medium_runtime_support.py similarity index 94% rename from ser/runtime/medium_runtime_support.py rename to ser/_internal/runtime/medium_runtime_support.py index 48a34e5..579ab67 100644 --- a/ser/runtime/medium_runtime_support.py +++ b/ser/_internal/runtime/medium_runtime_support.py @@ -9,16 +9,18 @@ import numpy as np from numpy.typing import NDArray -from ser.config import AppConfig -from ser.repr import EncodedSequence, XLSRBackend -from ser.runtime import medium_worker_operation as medium_worker_operation_helpers -from ser.runtime.medium_backend_runtime import build_medium_backend as _build_medium_backend_impl -from ser.runtime.medium_backend_runtime import ( +from ser._internal.runtime import medium_worker_operation as medium_worker_operation_helpers +from ser._internal.runtime.medium_backend_runtime import ( + build_medium_backend as _build_medium_backend_impl, +) +from ser._internal.runtime.medium_backend_runtime import ( settings_with_torch_runtime as _settings_with_torch_runtime_impl, ) -from ser.runtime.medium_backend_runtime import ( +from ser._internal.runtime.medium_backend_runtime import ( warn_on_runtime_selector_mismatch as _warn_on_runtime_selector_mismatch_impl, ) +from ser.config import AppConfig +from ser.repr import EncodedSequence, XLSRBackend class LoadedModelLike(Protocol): diff --git a/ser/runtime/medium_worker_lifecycle.py b/ser/_internal/runtime/medium_worker_lifecycle.py similarity index 98% rename from ser/runtime/medium_worker_lifecycle.py rename to ser/_internal/runtime/medium_worker_lifecycle.py index f12fd74..0dbf0a9 100644 --- a/ser/runtime/medium_worker_lifecycle.py +++ b/ser/_internal/runtime/medium_worker_lifecycle.py @@ -8,6 +8,7 @@ from multiprocessing.process import BaseProcess from typing import TypeVar +from ser._internal.runtime import medium_process_timeout as medium_process_timeout_helpers from ser._internal.runtime.worker_bindings import ( is_setup_complete_message as _is_setup_complete_message_binding, ) @@ -22,7 +23,6 @@ from ser._internal.runtime.worker_bindings import ( terminate_worker_process as _terminate_worker_process_binding, ) -from ser.runtime import medium_process_timeout as medium_process_timeout_helpers _PayloadT = TypeVar("_PayloadT") _MessageT = TypeVar("_MessageT", bound=tuple[object, ...]) diff --git a/ser/runtime/medium_worker_operation.py b/ser/_internal/runtime/medium_worker_operation.py similarity index 100% rename from ser/runtime/medium_worker_operation.py rename to ser/_internal/runtime/medium_worker_operation.py diff --git a/ser/runtime/policy.py b/ser/_internal/runtime/policy.py similarity index 100% rename from ser/runtime/policy.py rename to ser/_internal/runtime/policy.py diff --git a/ser/runtime/retry_primitives.py b/ser/_internal/runtime/retry_primitives.py similarity index 100% rename from ser/runtime/retry_primitives.py rename to ser/_internal/runtime/retry_primitives.py diff --git a/ser/api.py b/ser/api.py index 289a138..f135696 100644 --- a/ser/api.py +++ b/ser/api.py @@ -22,7 +22,7 @@ DatasetRegistryRecord = _data_api.DatasetRegistryRecord -class _PublicRuntimePipeline(Protocol): +class RuntimePipeline(Protocol): """Minimal runtime pipeline contract exposed at the public API facade.""" def run_training(self) -> None: @@ -34,7 +34,7 @@ def run_inference(self, request: InferenceRequest) -> InferenceExecution: ... -type RuntimePipelineBuilder = Callable[[AppConfig], _PublicRuntimePipeline] +type RuntimePipelineBuilder = Callable[[AppConfig], RuntimePipeline] def _resolve_boundary_settings(settings: AppConfig | None) -> AppConfig: @@ -197,6 +197,8 @@ def run_startup_preflight( "DatasetPrepareResult", "DatasetRegistryHealthIssueRecord", "DatasetRegistryRecord", + "RuntimePipeline", + "RuntimePipelineBuilder", "configure_dataset_consents", "infer", "list_dataset_registry_health_issues", diff --git a/ser/config.py b/ser/config.py index 3595781..373d03e 100644 --- a/ser/config.py +++ b/ser/config.py @@ -9,9 +9,6 @@ ) from ser._internal.config.schema import ( APP_NAME, - DEFAULT_FAST_MODEL_FILE_NAME, - DEFAULT_FAST_SECURE_MODEL_FILE_NAME, - DEFAULT_FAST_TRAINING_REPORT_FILE_NAME, AccurateResearchRuntimeConfig, AccurateRuntimeConfig, AppConfig, @@ -21,7 +18,6 @@ DatasetConfig, FastRuntimeConfig, FeatureFlags, - FeatureRuntimeBackendOverride, FeatureRuntimePolicyConfig, MediumRuntimeConfig, MediumTrainingConfig, @@ -37,16 +33,9 @@ TranscriptionConfig, WhisperModelConfig, ) -from ser._internal.config.settings_inputs import ( - ResolvedSettingsInputs, - SettingsInputDeps, -) __all__ = [ "APP_NAME", - "DEFAULT_FAST_MODEL_FILE_NAME", - "DEFAULT_FAST_SECURE_MODEL_FILE_NAME", - "DEFAULT_FAST_TRAINING_REPORT_FILE_NAME", "AccurateResearchRuntimeConfig", "AccurateRuntimeConfig", "AppConfig", @@ -56,7 +45,6 @@ "DatasetConfig", "FastRuntimeConfig", "FeatureFlags", - "FeatureRuntimeBackendOverride", "FeatureRuntimePolicyConfig", "MediumRuntimeConfig", "MediumTrainingConfig", @@ -64,10 +52,8 @@ "NeuralNetConfig", "ProfileRuntimeConfig", "QualityGateConfig", - "ResolvedSettingsInputs", "RuntimeFlags", "SchemaConfig", - "SettingsInputDeps", "TimelineConfig", "TorchRuntimeConfig", "TrainingConfig", diff --git a/ser/diagnostics/__init__.py b/ser/diagnostics/__init__.py index 7063106..325f6f0 100644 --- a/ser/diagnostics/__init__.py +++ b/ser/diagnostics/__init__.py @@ -15,7 +15,6 @@ format_startup_preflight_one_liner, parse_preflight_mode, run_doctor_diagnostics, - run_startup_preflight, should_fail_preflight, ) @@ -32,6 +31,5 @@ "parse_preflight_mode", "run_doctor_command", "run_doctor_diagnostics", - "run_startup_preflight", "should_fail_preflight", ] diff --git a/ser/diagnostics/service.py b/ser/diagnostics/service.py index 5cf882b..c31d9dc 100644 --- a/ser/diagnostics/service.py +++ b/ser/diagnostics/service.py @@ -61,7 +61,7 @@ def apply_profile_override_for_diagnostics( return replace(settings, runtime_flags=runtime_flags) -def run_startup_preflight( +def _run_startup_preflight( *, settings: AppConfig, include_transcription_checks: bool, diff --git a/ser/domain.py b/ser/domain.py index 704155f..b27939a 100644 --- a/ser/domain.py +++ b/ser/domain.py @@ -2,6 +2,8 @@ from typing import NamedTuple +__all__ = ["EmotionSegment", "TimelineEntry", "TranscriptWord"] + class TranscriptWord(NamedTuple): """A transcript word with start/end timing in seconds.""" diff --git a/ser/models/__init__.py b/ser/models/__init__.py index e69de29..c6703c7 100644 --- a/ser/models/__init__.py +++ b/ser/models/__init__.py @@ -0,0 +1,28 @@ +"""Model facades for artifact loading, profile runtimes, and training entrypoints. + +Only the modules listed in ``__all__`` are intended facades; every other module +in this package is implementation detail. Facade modules are imported lazily to +keep package import free of heavy model dependencies. +""" + +from __future__ import annotations + +import importlib +from types import ModuleType +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from ser.models import emotion_model, profile_runtime, training_entrypoints + +__all__ = [ + "emotion_model", + "profile_runtime", + "training_entrypoints", +] + + +def __getattr__(name: str) -> ModuleType: + """Lazily imports one intended facade module on first attribute access.""" + if name in __all__: + return importlib.import_module(f"ser.models.{name}") + raise AttributeError(f"module 'ser.models' has no attribute {name!r}") diff --git a/ser/runtime/__init__.py b/ser/runtime/__init__.py index a003f69..33ab125 100644 --- a/ser/runtime/__init__.py +++ b/ser/runtime/__init__.py @@ -1,6 +1,5 @@ """Runtime helpers for profiling, orchestration, and benchmarks.""" -from .backend_hooks import build_backend_hooks from .contracts import InferenceExecution, InferenceRequest from .pipeline import RuntimePipeline, create_runtime_pipeline from .registry import ( @@ -16,7 +15,6 @@ "RuntimeCapability", "RuntimePipeline", "UnsupportedProfileError", - "build_backend_hooks", "create_runtime_pipeline", "ensure_profile_supported", "resolve_runtime_capability", diff --git a/ser/runtime/pipeline.py b/ser/runtime/pipeline.py index b3e98bb..7ae5632 100644 --- a/ser/runtime/pipeline.py +++ b/ser/runtime/pipeline.py @@ -10,12 +10,12 @@ from types import ModuleType from ser._internal.config.bootstrap import resolve_profile_transcription_config +from ser._internal.runtime.backend_hooks import build_backend_hooks from ser._internal.runtime.environment_plan import build_runtime_environment_plan from ser._internal.runtime.process_env import temporary_process_env from ser.config import AppConfig, settings_override from ser.domain import EmotionSegment, TimelineEntry, TranscriptWord from ser.profiles import RuntimeProfile, TranscriptionBackendId, resolve_profile -from ser.runtime.backend_hooks import build_backend_hooks from ser.runtime.contracts import ( BackendInferenceCallable, InferenceExecution, diff --git a/tests/suites/integration/api/test_api.py b/tests/suites/integration/api/test_api.py index 9fbd48e..49d59e6 100644 --- a/tests/suites/integration/api/test_api.py +++ b/tests/suites/integration/api/test_api.py @@ -1120,6 +1120,8 @@ def test_api_public_surface_snapshot_matches_expected_contract() -> None: "DatasetPrepareResult", "DatasetRegistryHealthIssueRecord", "DatasetRegistryRecord", + "RuntimePipeline", + "RuntimePipelineBuilder", "configure_dataset_consents", "infer", "list_dataset_registry_health_issues", diff --git a/tests/suites/integration/api/test_config_public_contract.py b/tests/suites/integration/api/test_config_public_contract.py index 33ca082..2ca4ebc 100644 --- a/tests/suites/integration/api/test_config_public_contract.py +++ b/tests/suites/integration/api/test_config_public_contract.py @@ -8,7 +8,13 @@ import ser.config as config _REMOVED_LEGACY_EXPORTS = { + "DEFAULT_FAST_MODEL_FILE_NAME", + "DEFAULT_FAST_SECURE_MODEL_FILE_NAME", + "DEFAULT_FAST_TRAINING_REPORT_FILE_NAME", + "FeatureRuntimeBackendOverride", "ProfileCatalogEntry", + "ResolvedSettingsInputs", + "SettingsInputDeps", "TranscriptionBackendId", "apply_settings", "default_profile_model_id", @@ -23,9 +29,6 @@ def test_config_public_surface_snapshot_matches_expected_contract() -> None: """Stable config facade snapshot should only change through explicit review.""" assert config.__all__ == [ "APP_NAME", - "DEFAULT_FAST_MODEL_FILE_NAME", - "DEFAULT_FAST_SECURE_MODEL_FILE_NAME", - "DEFAULT_FAST_TRAINING_REPORT_FILE_NAME", "AccurateResearchRuntimeConfig", "AccurateRuntimeConfig", "AppConfig", @@ -35,7 +38,6 @@ def test_config_public_surface_snapshot_matches_expected_contract() -> None: "DatasetConfig", "FastRuntimeConfig", "FeatureFlags", - "FeatureRuntimeBackendOverride", "FeatureRuntimePolicyConfig", "MediumRuntimeConfig", "MediumTrainingConfig", @@ -43,10 +45,8 @@ def test_config_public_surface_snapshot_matches_expected_contract() -> None: "NeuralNetConfig", "ProfileRuntimeConfig", "QualityGateConfig", - "ResolvedSettingsInputs", "RuntimeFlags", "SchemaConfig", - "SettingsInputDeps", "TimelineConfig", "TorchRuntimeConfig", "TrainingConfig", diff --git a/tests/suites/integration/architecture/test_api_import_boundary.py b/tests/suites/integration/architecture/test_api_import_boundary.py index 94dd701..6a2d02f 100644 --- a/tests/suites/integration/architecture/test_api_import_boundary.py +++ b/tests/suites/integration/architecture/test_api_import_boundary.py @@ -165,3 +165,91 @@ def test_legacy_api_implementation_modules_are_not_publicly_importable( """Legacy top-level API implementation modules should stay removed.""" with pytest.raises(ModuleNotFoundError): importlib.import_module(module_name) + + +_TIER_ONE_PUBLIC_EXPORTS: dict[str, tuple[str, ...]] = { + "ser": ( + "EmotionSegment", + "TimelineEntry", + "TranscriptWord", + ), + "ser.api": ( + "ComplianceMode", + "DatasetPrepareResult", + "DatasetRegistryHealthIssueRecord", + "DatasetRegistryRecord", + "RuntimePipeline", + "RuntimePipelineBuilder", + "configure_dataset_consents", + "infer", + "list_dataset_registry_health_issues", + "list_datasets", + "list_profiles", + "list_registered_datasets", + "load_profile", + "prepare_dataset", + "run_startup_preflight", + "show_dataset_consents", + "train", + ), + "ser.config": ( + "APP_NAME", + "AccurateResearchRuntimeConfig", + "AccurateRuntimeConfig", + "AppConfig", + "ArtifactProfileName", + "AudioReadConfig", + "DataLoaderConfig", + "DatasetConfig", + "FastRuntimeConfig", + "FeatureFlags", + "FeatureRuntimePolicyConfig", + "MediumRuntimeConfig", + "MediumTrainingConfig", + "ModelsConfig", + "NeuralNetConfig", + "ProfileRuntimeConfig", + "QualityGateConfig", + "RuntimeFlags", + "SchemaConfig", + "TimelineConfig", + "TorchRuntimeConfig", + "TrainingConfig", + "TranscriptionConfig", + "WhisperModelConfig", + "get_settings", + "reload_settings", + "settings_override", + ), + "ser.domain": ( + "EmotionSegment", + "TimelineEntry", + "TranscriptWord", + ), + "ser.utils": ( + "build_timeline", + "display_elapsed_time", + "get_logger", + "print_timeline", + "read_audio_file", + "save_timeline_to_csv", + ), +} + + +@pytest.mark.parametrize("module_name", sorted(_TIER_ONE_PUBLIC_EXPORTS)) +def test_tier_one_public_exports_do_not_grow_without_contract_review( + module_name: str, +) -> None: + """Tier-1 `__all__` surfaces should never change without contract review.""" + module = importlib.import_module(module_name) + exported = getattr(module, "__all__", None) + assert exported is not None, f"{module_name} must declare an explicit __all__." + assert len(set(exported)) == len( + exported + ), f"{module_name}.__all__ must not contain duplicates." + assert tuple(sorted(exported)) == _TIER_ONE_PUBLIC_EXPORTS[module_name], ( + f"{module_name}.__all__ diverged from the tier-1 public contract. " + "Shrinking or renaming requires updating this snapshot; growth requires " + "explicit API review." + ) diff --git a/tests/suites/integration/diagnostics/test_diagnostics_service.py b/tests/suites/integration/diagnostics/test_diagnostics_service.py index 980cf42..9f79331 100644 --- a/tests/suites/integration/diagnostics/test_diagnostics_service.py +++ b/tests/suites/integration/diagnostics/test_diagnostics_service.py @@ -12,12 +12,12 @@ import ser.diagnostics.service as diagnostics_service from ser.diagnostics.domain import DiagnosticFinding, DiagnosticReport from ser.diagnostics.service import ( + _run_startup_preflight, format_report_brief, format_report_json, format_report_text, parse_preflight_mode, run_doctor_diagnostics, - run_startup_preflight, should_fail_preflight, ) from ser.transcript.backends import CompatibilityIssue, CompatibilityReport @@ -194,7 +194,7 @@ def check_compatibility( lambda _backend_id: _FakeAdapter(), ) - report = run_startup_preflight( + report = _run_startup_preflight( settings=settings, include_transcription_checks=True, ) diff --git a/tests/suites/integration/test_accurate_inference.py b/tests/suites/integration/test_accurate_inference.py index 58332d1..671a72d 100644 --- a/tests/suites/integration/test_accurate_inference.py +++ b/tests/suites/integration/test_accurate_inference.py @@ -152,7 +152,7 @@ def fake_timeout_runner(*_args: object, **_kwargs: object) -> object: lambda **_kwargs: 0.1, ) monkeypatch.setattr( - "ser.runtime.policy.time.sleep", + "ser._internal.runtime.policy.time.sleep", lambda _delay: calls.__setitem__("sleeps", calls["sleeps"] + 1), ) diff --git a/tests/suites/integration/test_backend_hooks.py b/tests/suites/integration/test_backend_hooks.py index e3fb9cf..0d898c5 100644 --- a/tests/suites/integration/test_backend_hooks.py +++ b/tests/suites/integration/test_backend_hooks.py @@ -4,8 +4,8 @@ import pytest +import ser._internal.runtime.backend_hooks as backend_hooks import ser.config as config -import ser.runtime.backend_hooks as backend_hooks from ser.runtime.contracts import InferenceRequest from ser.runtime.schema import OUTPUT_SCHEMA_VERSION, InferenceResult diff --git a/tests/suites/integration/test_fast_inference.py b/tests/suites/integration/test_fast_inference.py index dd483e6..1af43ce 100644 --- a/tests/suites/integration/test_fast_inference.py +++ b/tests/suites/integration/test_fast_inference.py @@ -102,7 +102,7 @@ def fake_timeout_runner(*_args: object, **_kwargs: object) -> object: monkeypatch.setattr(fast_boundary, "_run_with_timeout_impl", fake_timeout_runner) monkeypatch.setattr( - "ser.runtime.policy.time.sleep", + "ser._internal.runtime.policy.time.sleep", lambda _delay: calls.__setitem__("sleeps", calls["sleeps"] + 1), ) @@ -143,7 +143,7 @@ def fake_process_runner(*_args: object, **_kwargs: object) -> InferenceResult: monkeypatch.setattr(fast_boundary, "load_model", fail_if_called) monkeypatch.setattr(fast_boundary, "_run_with_process_timeout_impl", fake_process_runner) monkeypatch.setattr( - "ser.runtime.policy.time.sleep", + "ser._internal.runtime.policy.time.sleep", lambda _delay: calls.__setitem__("sleep", calls["sleep"] + 1), ) diff --git a/tests/suites/integration/test_license_gates.py b/tests/suites/integration/test_license_gates.py index 3f34ee2..004f183 100644 --- a/tests/suites/integration/test_license_gates.py +++ b/tests/suites/integration/test_license_gates.py @@ -6,8 +6,8 @@ import pytest +import ser._internal.runtime.backend_hooks as backend_hooks import ser.config as config -import ser.runtime.backend_hooks as backend_hooks from ser.license_check import ( BackendLicensePolicyError, ensure_backend_access, diff --git a/tests/suites/integration/test_medium_inference.py b/tests/suites/integration/test_medium_inference.py index a1c3d66..f28670d 100644 --- a/tests/suites/integration/test_medium_inference.py +++ b/tests/suites/integration/test_medium_inference.py @@ -194,7 +194,7 @@ def fake_timeout_runner(*_args: object, **_kwargs: object) -> object: monkeypatch.setattr(medium_boundary, "_run_with_timeout_impl", fake_timeout_runner) monkeypatch.setattr(medium_boundary, "retry_delay_seconds", lambda **_kwargs: 0.1) monkeypatch.setattr( - "ser.runtime.policy.time.sleep", + "ser._internal.runtime.policy.time.sleep", lambda _delay: calls.__setitem__("sleeps", calls["sleeps"] + 1), ) diff --git a/tests/suites/integration/test_runtime_pipeline.py b/tests/suites/integration/test_runtime_pipeline.py index c7215aa..cec004f 100644 --- a/tests/suites/integration/test_runtime_pipeline.py +++ b/tests/suites/integration/test_runtime_pipeline.py @@ -502,7 +502,7 @@ def test_create_runtime_pipeline_uses_resolved_profile( """Factory should resolve medium profile when medium flag is enabled.""" monkeypatch.setenv("SER_ENABLE_MEDIUM_PROFILE", "true") monkeypatch.setattr( - "ser.runtime.backend_hooks._missing_optional_modules", + "ser._internal.runtime.backend_hooks._missing_optional_modules", lambda _required_modules: ("transformers",), ) settings = config.reload_settings() diff --git a/tests/suites/unit/runtime/test_medium_retry_policy.py b/tests/suites/unit/runtime/test_medium_retry_policy.py index 3d00f78..e7e6648 100644 --- a/tests/suites/unit/runtime/test_medium_retry_policy.py +++ b/tests/suites/unit/runtime/test_medium_retry_policy.py @@ -4,7 +4,7 @@ import pytest -from ser.runtime import medium_retry_policy +from ser._internal.runtime import medium_retry_policy def test_retry_delay_seconds_returns_zero_for_non_positive_base_delay() -> None: @@ -21,7 +21,7 @@ def test_retry_delay_seconds_applies_attempt_scaling_with_jitter( def _fixed_uniform(_start: float, _end: float) -> float: return 0.05 - monkeypatch.setattr("ser.runtime.retry_primitives.random.uniform", _fixed_uniform) + monkeypatch.setattr("ser._internal.runtime.retry_primitives.random.uniform", _fixed_uniform) assert medium_retry_policy.retry_delay_seconds(base_delay=0.5, attempt=2) == pytest.approx(1.05) diff --git a/tests/suites/unit/runtime/test_retry_primitives.py b/tests/suites/unit/runtime/test_retry_primitives.py index 14e5d2a..c3fc78d 100644 --- a/tests/suites/unit/runtime/test_retry_primitives.py +++ b/tests/suites/unit/runtime/test_retry_primitives.py @@ -4,7 +4,7 @@ import pytest -from ser.runtime import retry_primitives +from ser._internal.runtime import retry_primitives def test_jittered_retry_delay_seconds_returns_zero_for_non_positive_base_delay() -> None: @@ -22,7 +22,7 @@ def _fixed_uniform(_start: float, _end: float) -> float: return 0.05 monkeypatch.setattr( - "ser.runtime.retry_primitives.random.uniform", + "ser._internal.runtime.retry_primitives.random.uniform", _fixed_uniform, ) diff --git a/tests/suites/unit/test_accurate_execution_flow.py b/tests/suites/unit/test_accurate_execution_flow.py index 19f2ccf..af8356e 100644 --- a/tests/suites/unit/test_accurate_execution_flow.py +++ b/tests/suites/unit/test_accurate_execution_flow.py @@ -11,15 +11,15 @@ from numpy.typing import NDArray import ser.config as config -from ser.repr import EncodedSequence, FeatureBackend, PoolingWindow -from ser.runtime.accurate_execution_flow import ( +from ser._internal.runtime.accurate_execution_flow import ( execute_accurate_inference_with_retry, run_accurate_retryable_operation, ) -from ser.runtime.accurate_worker_operation import ( +from ser._internal.runtime.accurate_worker_operation import ( AccurateRetryOperationState, PreparedAccurateOperation, ) +from ser.repr import EncodedSequence, FeatureBackend, PoolingWindow from ser.runtime.schema import OUTPUT_SCHEMA_VERSION, InferenceResult pytestmark = pytest.mark.unit diff --git a/tests/suites/unit/test_accurate_operation_setup.py b/tests/suites/unit/test_accurate_operation_setup.py index cc0ef9d..3335bb8 100644 --- a/tests/suites/unit/test_accurate_operation_setup.py +++ b/tests/suites/unit/test_accurate_operation_setup.py @@ -9,9 +9,9 @@ import numpy as np import pytest +from ser._internal.runtime import accurate_operation_setup +from ser._internal.runtime.accurate_worker_operation import PreparedAccurateOperation from ser.config import AppConfig, ProfileRuntimeConfig -from ser.runtime import accurate_operation_setup -from ser.runtime.accurate_worker_operation import PreparedAccurateOperation pytestmark = pytest.mark.unit diff --git a/tests/suites/unit/test_accurate_process_timeout.py b/tests/suites/unit/test_accurate_process_timeout.py index 42e66ec..476da28 100644 --- a/tests/suites/unit/test_accurate_process_timeout.py +++ b/tests/suites/unit/test_accurate_process_timeout.py @@ -7,7 +7,7 @@ import pytest -from ser.runtime import accurate_process_timeout +from ser._internal.runtime import accurate_process_timeout pytestmark = pytest.mark.unit diff --git a/tests/suites/unit/test_accurate_retry_operation.py b/tests/suites/unit/test_accurate_retry_operation.py index e583a72..23b9293 100644 --- a/tests/suites/unit/test_accurate_retry_operation.py +++ b/tests/suites/unit/test_accurate_retry_operation.py @@ -6,7 +6,7 @@ import pytest -from ser.runtime.accurate_retry_operation import run_accurate_retry_operation +from ser._internal.runtime.accurate_retry_operation import run_accurate_retry_operation pytestmark = pytest.mark.unit diff --git a/tests/suites/unit/test_accurate_runtime_support.py b/tests/suites/unit/test_accurate_runtime_support.py index 8d12ec8..79e89b1 100644 --- a/tests/suites/unit/test_accurate_runtime_support.py +++ b/tests/suites/unit/test_accurate_runtime_support.py @@ -9,13 +9,13 @@ from numpy.typing import NDArray import ser.config as config -from ser.repr import EncodedSequence, PoolingWindow -from ser.runtime.accurate_runtime_support import ( +from ser._internal.runtime.accurate_runtime_support import ( build_cpu_settings_snapshot, build_process_settings_snapshot, encode_accurate_sequence, prepare_accurate_backend_runtime, ) +from ser.repr import EncodedSequence, PoolingWindow pytestmark = pytest.mark.unit diff --git a/tests/suites/unit/test_accurate_worker_lifecycle.py b/tests/suites/unit/test_accurate_worker_lifecycle.py index e272081..560fe73 100644 --- a/tests/suites/unit/test_accurate_worker_lifecycle.py +++ b/tests/suites/unit/test_accurate_worker_lifecycle.py @@ -11,7 +11,7 @@ import pytest -from ser.runtime import accurate_worker_lifecycle +from ser._internal.runtime import accurate_worker_lifecycle pytestmark = pytest.mark.unit diff --git a/tests/suites/unit/test_accurate_worker_operation.py b/tests/suites/unit/test_accurate_worker_operation.py index 9848f79..efb228a 100644 --- a/tests/suites/unit/test_accurate_worker_operation.py +++ b/tests/suites/unit/test_accurate_worker_operation.py @@ -11,8 +11,7 @@ import pytest import ser.config as config -from ser.config import AppConfig, ProfileRuntimeConfig -from ser.runtime.accurate_worker_operation import ( +from ser._internal.runtime.accurate_worker_operation import ( AccurateRetryOperationState, PreparedAccurateOperation, finalize_in_process_setup, @@ -22,6 +21,7 @@ run_inference_operation, run_process_operation, ) +from ser.config import AppConfig, ProfileRuntimeConfig from ser.runtime.contracts import InferenceRequest pytestmark = pytest.mark.unit diff --git a/tests/suites/unit/test_medium_execution_context.py b/tests/suites/unit/test_medium_execution_context.py index 41f97ff..5ce27df 100644 --- a/tests/suites/unit/test_medium_execution_context.py +++ b/tests/suites/unit/test_medium_execution_context.py @@ -9,11 +9,11 @@ import pytest +from ser._internal.runtime.medium_execution_context import prepare_execution_context +from ser._internal.runtime.medium_worker_operation import MediumRetryOperationState from ser.config import AppConfig from ser.repr.runtime_policy import FeatureRuntimePolicy from ser.runtime.contracts import InferenceRequest -from ser.runtime.medium_execution_context import prepare_execution_context -from ser.runtime.medium_worker_operation import MediumRetryOperationState pytestmark = pytest.mark.unit diff --git a/tests/suites/unit/test_medium_execution_flow.py b/tests/suites/unit/test_medium_execution_flow.py index 8bdba43..22e0382 100644 --- a/tests/suites/unit/test_medium_execution_flow.py +++ b/tests/suites/unit/test_medium_execution_flow.py @@ -9,12 +9,12 @@ import pytest from ser import config +from ser._internal.runtime.medium_execution_context import MediumExecutionContext +from ser._internal.runtime.medium_execution_flow import execute_medium_inference_with_retry +from ser._internal.runtime.medium_worker_operation import MediumRetryOperationState from ser.config import AppConfig from ser.repr.runtime_policy import FeatureRuntimePolicy from ser.runtime.contracts import InferenceRequest -from ser.runtime.medium_execution_context import MediumExecutionContext -from ser.runtime.medium_execution_flow import execute_medium_inference_with_retry -from ser.runtime.medium_worker_operation import MediumRetryOperationState pytestmark = pytest.mark.unit diff --git a/tests/suites/unit/test_medium_process_operation.py b/tests/suites/unit/test_medium_process_operation.py index 9316de1..eb32758 100644 --- a/tests/suites/unit/test_medium_process_operation.py +++ b/tests/suites/unit/test_medium_process_operation.py @@ -8,12 +8,12 @@ import pytest import ser.config as config -from ser.runtime.contracts import InferenceRequest -from ser.runtime.medium_process_operation import ( +from ser._internal.runtime.medium_process_operation import ( prepare_process_operation, run_process_operation, ) -from ser.runtime.medium_worker_operation import PreparedMediumOperation +from ser._internal.runtime.medium_worker_operation import PreparedMediumOperation +from ser.runtime.contracts import InferenceRequest pytestmark = pytest.mark.unit diff --git a/tests/suites/unit/test_medium_process_timeout.py b/tests/suites/unit/test_medium_process_timeout.py index 56d7e47..e868e2e 100644 --- a/tests/suites/unit/test_medium_process_timeout.py +++ b/tests/suites/unit/test_medium_process_timeout.py @@ -7,7 +7,7 @@ import pytest -from ser.runtime import medium_process_timeout +from ser._internal.runtime import medium_process_timeout pytestmark = pytest.mark.unit diff --git a/tests/suites/unit/test_medium_retry_operation.py b/tests/suites/unit/test_medium_retry_operation.py index 131275d..57d8db1 100644 --- a/tests/suites/unit/test_medium_retry_operation.py +++ b/tests/suites/unit/test_medium_retry_operation.py @@ -6,7 +6,7 @@ import pytest -from ser.runtime.medium_retry_operation import run_medium_inference_with_retry_policy +from ser._internal.runtime.medium_retry_operation import run_medium_inference_with_retry_policy pytestmark = pytest.mark.unit diff --git a/tests/suites/unit/test_medium_runtime_support.py b/tests/suites/unit/test_medium_runtime_support.py index adb33e9..94a0fd0 100644 --- a/tests/suites/unit/test_medium_runtime_support.py +++ b/tests/suites/unit/test_medium_runtime_support.py @@ -14,9 +14,7 @@ from numpy.typing import NDArray import ser.config as config -from ser.config import AppConfig -from ser.repr import EncodedSequence, XLSRBackend -from ser.runtime.medium_runtime_support import ( +from ser._internal.runtime.medium_runtime_support import ( build_cpu_medium_backend_for_settings, build_cpu_settings_snapshot, build_medium_backend_for_settings, @@ -24,6 +22,8 @@ encode_medium_sequence, validate_medium_loaded_model_runtime_contract, ) +from ser.config import AppConfig +from ser.repr import EncodedSequence, XLSRBackend pytestmark = pytest.mark.unit diff --git a/tests/suites/unit/test_medium_worker_lifecycle.py b/tests/suites/unit/test_medium_worker_lifecycle.py index c54fc30..e16facc 100644 --- a/tests/suites/unit/test_medium_worker_lifecycle.py +++ b/tests/suites/unit/test_medium_worker_lifecycle.py @@ -10,7 +10,7 @@ import pytest -from ser.runtime import medium_worker_lifecycle +from ser._internal.runtime import medium_worker_lifecycle pytestmark = pytest.mark.unit diff --git a/tests/suites/unit/test_medium_worker_operation.py b/tests/suites/unit/test_medium_worker_operation.py index df5481a..0d92fbc 100644 --- a/tests/suites/unit/test_medium_worker_operation.py +++ b/tests/suites/unit/test_medium_worker_operation.py @@ -9,8 +9,7 @@ import pytest import ser.config as config -from ser.runtime.contracts import InferenceRequest -from ser.runtime.medium_worker_operation import ( +from ser._internal.runtime.medium_worker_operation import ( MediumRetryOperationState, PreparedMediumOperation, build_transient_failure_handler, @@ -22,6 +21,7 @@ run_inference_operation, run_process_operation, ) +from ser.runtime.contracts import InferenceRequest pytestmark = pytest.mark.unit