From 649af98bf74cebb63e6c0a394b41140c0ea26b2c Mon Sep 17 00:00:00 2001 From: SolitaryThinker Date: Sun, 5 Jul 2026 12:42:16 -0700 Subject: [PATCH] [refactor]: move interleave_thinker under fastvideo.workflows (was wheel-leaking top-level apps) --- apps/__init__.py | 2 -- examples/interleave/README.md | 6 +++--- examples/interleave/interleave_single_prompt.py | 2 +- fastvideo/workflows/__init__.py | 2 ++ .../workflows}/interleave_thinker/__init__.py | 16 ++++++++-------- .../workflows}/interleave_thinker/config.py | 0 .../workflows}/interleave_thinker/evaluation.py | 10 +++++----- .../workflows}/interleave_thinker/generator.py | 2 +- .../interleave_thinker/orchestrator.py | 4 ++-- .../workflows}/interleave_thinker/runner.py | 10 +++++----- .../workflows}/interleave_thinker/schema.py | 0 .../workflows}/interleave_thinker/trace.py | 2 +- .../workflows}/interleave_thinker/trace_eval.py | 0 pyproject.toml | 4 ++-- 14 files changed, 30 insertions(+), 30 deletions(-) delete mode 100644 apps/__init__.py create mode 100644 fastvideo/workflows/__init__.py rename {apps => fastvideo/workflows}/interleave_thinker/__init__.py (83%) rename {apps => fastvideo/workflows}/interleave_thinker/config.py (100%) rename {apps => fastvideo/workflows}/interleave_thinker/evaluation.py (97%) rename {apps => fastvideo/workflows}/interleave_thinker/generator.py (99%) rename {apps => fastvideo/workflows}/interleave_thinker/orchestrator.py (98%) rename {apps => fastvideo/workflows}/interleave_thinker/runner.py (92%) rename {apps => fastvideo/workflows}/interleave_thinker/schema.py (100%) rename {apps => fastvideo/workflows}/interleave_thinker/trace.py (97%) rename {apps => fastvideo/workflows}/interleave_thinker/trace_eval.py (100%) diff --git a/apps/__init__.py b/apps/__init__.py deleted file mode 100644 index f075a9ce8..000000000 --- a/apps/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 -"""Application-level integrations built on top of FastVideo.""" diff --git a/examples/interleave/README.md b/examples/interleave/README.md index 9efb23195..484ccad08 100644 --- a/examples/interleave/README.md +++ b/examples/interleave/README.md @@ -2,8 +2,8 @@ This directory contains a small Python example for running an application-level InterleaveThinker-style image generation trace on top of FastVideo. The helper -code lives under `apps/interleave_thinker` so it stays separate from FastVideo's -core generation package. +code lives under `fastvideo/workflows/interleave_thinker` and is importable as +`fastvideo.workflows.interleave_thinker`. ## Single-Prompt Trace @@ -39,7 +39,7 @@ added later. The app helper can also use closed-source Google image models through lazy wrappers when you instantiate the backend directly: -- `apps.interleave_thinker.generator.NanoBananaImageGeneratorBackend` +- `fastvideo.workflows.interleave_thinker.generator.NanoBananaImageGeneratorBackend` implements the same image backend protocol as the local FastVideo generator. Install the optional SDK and provide a key only when using these API backends: diff --git a/examples/interleave/interleave_single_prompt.py b/examples/interleave/interleave_single_prompt.py index 99f157f5a..24deef461 100644 --- a/examples/interleave/interleave_single_prompt.py +++ b/examples/interleave/interleave_single_prompt.py @@ -18,7 +18,7 @@ from fastvideo.api.schema import ( OffloadConfig, PipelineSelection, ) -from apps.interleave_thinker import ( +from fastvideo.workflows.interleave_thinker import ( AcceptAllCritic, FastVideoImageGeneratorBackend, InterleaveOrchestrator, diff --git a/fastvideo/workflows/__init__.py b/fastvideo/workflows/__init__.py new file mode 100644 index 000000000..e8207a7b2 --- /dev/null +++ b/fastvideo/workflows/__init__.py @@ -0,0 +1,2 @@ +# SPDX-License-Identifier: Apache-2.0 +"""Reusable multi-step generation workflows.""" diff --git a/apps/interleave_thinker/__init__.py b/fastvideo/workflows/interleave_thinker/__init__.py similarity index 83% rename from apps/interleave_thinker/__init__.py rename to fastvideo/workflows/interleave_thinker/__init__.py index da5d17e2c..fa3307d93 100644 --- a/apps/interleave_thinker/__init__.py +++ b/fastvideo/workflows/interleave_thinker/__init__.py @@ -1,7 +1,7 @@ # SPDX-License-Identifier: Apache-2.0 """InterleaveThinker example app helpers.""" -from apps.interleave_thinker.config import ( +from fastvideo.workflows.interleave_thinker.config import ( InterleaveCriticConfig, InterleaveImageBackendConfig, InterleavePlannerConfig, @@ -10,7 +10,7 @@ from apps.interleave_thinker.config import ( load_interleave_run_config, resolve_interleave_instruction, ) -from apps.interleave_thinker.evaluation import ( +from fastvideo.workflows.interleave_thinker.evaluation import ( InterleavePromptItem, InterleavePromptResult, InterleavePromptSetSummary, @@ -20,22 +20,22 @@ from apps.interleave_thinker.evaluation import ( run_interleave_prompt_set_config, save_prompt_set_summary, ) -from apps.interleave_thinker.generator import ( +from fastvideo.workflows.interleave_thinker.generator import ( FastVideoImageGeneratorBackend, ImageGeneratorBackend, ) -from apps.interleave_thinker.orchestrator import ( +from fastvideo.workflows.interleave_thinker.orchestrator import ( AcceptAllCritic, CriticProvider, InterleaveOrchestrator, PlannerProvider, SinglePromptPlanner, ) -from apps.interleave_thinker.runner import ( +from fastvideo.workflows.interleave_thinker.runner import ( InterleaveRunResult, run_interleave_config, ) -from apps.interleave_thinker.schema import ( +from fastvideo.workflows.interleave_thinker.schema import ( CriticDecision, CriticInput, GeneratedImage, @@ -45,11 +45,11 @@ from apps.interleave_thinker.schema import ( PlannedInterleaveStep, PlannerInput, ) -from apps.interleave_thinker.trace import ( +from fastvideo.workflows.interleave_thinker.trace import ( save_trace, trace_to_dict, ) -from apps.interleave_thinker.trace_eval import ( +from fastvideo.workflows.interleave_thinker.trace_eval import ( InterleaveTraceEvaluationSummary, InterleaveTraceMetrics, discover_interleave_trace_paths, diff --git a/apps/interleave_thinker/config.py b/fastvideo/workflows/interleave_thinker/config.py similarity index 100% rename from apps/interleave_thinker/config.py rename to fastvideo/workflows/interleave_thinker/config.py diff --git a/apps/interleave_thinker/evaluation.py b/fastvideo/workflows/interleave_thinker/evaluation.py similarity index 97% rename from apps/interleave_thinker/evaluation.py rename to fastvideo/workflows/interleave_thinker/evaluation.py index ac6943e0b..7d9c3a4fb 100644 --- a/apps/interleave_thinker/evaluation.py +++ b/fastvideo/workflows/interleave_thinker/evaluation.py @@ -11,14 +11,14 @@ from dataclasses import dataclass, field from pathlib import Path from typing import Any -from apps.interleave_thinker.generator import ImageGeneratorBackend -from apps.interleave_thinker.runner import ( +from fastvideo.workflows.interleave_thinker.generator import ImageGeneratorBackend +from fastvideo.workflows.interleave_thinker.runner import ( build_critic, build_image_backend, build_planner, ) -from apps.interleave_thinker.schema import InterleaveTrace -from apps.interleave_thinker.trace import save_trace +from fastvideo.workflows.interleave_thinker.schema import InterleaveTrace +from fastvideo.workflows.interleave_thinker.trace import save_trace @dataclass(frozen=True) @@ -208,7 +208,7 @@ def _build_prompt_set_orchestrator( config: Any, image_backend: ImageGeneratorBackend, ) -> Any: - from apps.interleave_thinker.orchestrator import InterleaveOrchestrator + from fastvideo.workflows.interleave_thinker.orchestrator import InterleaveOrchestrator return InterleaveOrchestrator( planner=build_planner(config.planner), diff --git a/apps/interleave_thinker/generator.py b/fastvideo/workflows/interleave_thinker/generator.py similarity index 99% rename from apps/interleave_thinker/generator.py rename to fastvideo/workflows/interleave_thinker/generator.py index 0ce734297..3dbb651be 100644 --- a/apps/interleave_thinker/generator.py +++ b/fastvideo/workflows/interleave_thinker/generator.py @@ -19,7 +19,7 @@ from fastvideo.api.compat import ( ) from fastvideo.api.results import GenerationResult from fastvideo.api.schema import GenerationRequest -from apps.interleave_thinker.schema import ( +from fastvideo.workflows.interleave_thinker.schema import ( GeneratedImage, InterleaveEditRequest, ) diff --git a/apps/interleave_thinker/orchestrator.py b/fastvideo/workflows/interleave_thinker/orchestrator.py similarity index 98% rename from apps/interleave_thinker/orchestrator.py rename to fastvideo/workflows/interleave_thinker/orchestrator.py index 59362b8d0..076dac577 100644 --- a/apps/interleave_thinker/orchestrator.py +++ b/fastvideo/workflows/interleave_thinker/orchestrator.py @@ -6,11 +6,11 @@ from __future__ import annotations from collections.abc import Sequence from typing import Any, Protocol -from apps.interleave_thinker.generator import ( +from fastvideo.workflows.interleave_thinker.generator import ( ImageGeneratorBackend, encode_file_to_base64, ) -from apps.interleave_thinker.schema import ( +from fastvideo.workflows.interleave_thinker.schema import ( CriticDecision, CriticInput, GeneratedImage, diff --git a/apps/interleave_thinker/runner.py b/fastvideo/workflows/interleave_thinker/runner.py similarity index 92% rename from apps/interleave_thinker/runner.py rename to fastvideo/workflows/interleave_thinker/runner.py index 2d48c3826..9caa4c988 100644 --- a/apps/interleave_thinker/runner.py +++ b/fastvideo/workflows/interleave_thinker/runner.py @@ -7,27 +7,27 @@ from collections.abc import Callable from dataclasses import dataclass from pathlib import Path -from apps.interleave_thinker.config import ( +from fastvideo.workflows.interleave_thinker.config import ( InterleaveCriticConfig, InterleaveImageBackendConfig, InterleavePlannerConfig, InterleaveRunConfig, resolve_interleave_instruction, ) -from apps.interleave_thinker.generator import ( +from fastvideo.workflows.interleave_thinker.generator import ( FastVideoImageGeneratorBackend, ImageGeneratorBackend, NanoBananaImageGeneratorBackend, ) -from apps.interleave_thinker.orchestrator import ( +from fastvideo.workflows.interleave_thinker.orchestrator import ( AcceptAllCritic, CriticProvider, InterleaveOrchestrator, PlannerProvider, SinglePromptPlanner, ) -from apps.interleave_thinker.schema import InterleaveTrace -from apps.interleave_thinker.trace import save_trace +from fastvideo.workflows.interleave_thinker.schema import InterleaveTrace +from fastvideo.workflows.interleave_thinker.trace import save_trace @dataclass(frozen=True) diff --git a/apps/interleave_thinker/schema.py b/fastvideo/workflows/interleave_thinker/schema.py similarity index 100% rename from apps/interleave_thinker/schema.py rename to fastvideo/workflows/interleave_thinker/schema.py diff --git a/apps/interleave_thinker/trace.py b/fastvideo/workflows/interleave_thinker/trace.py similarity index 97% rename from apps/interleave_thinker/trace.py rename to fastvideo/workflows/interleave_thinker/trace.py index 56aa486f4..86f34b31e 100644 --- a/apps/interleave_thinker/trace.py +++ b/fastvideo/workflows/interleave_thinker/trace.py @@ -7,7 +7,7 @@ import json from pathlib import Path from typing import Any -from apps.interleave_thinker.schema import ( +from fastvideo.workflows.interleave_thinker.schema import ( CriticDecision, GeneratedImage, InterleaveAttempt, diff --git a/apps/interleave_thinker/trace_eval.py b/fastvideo/workflows/interleave_thinker/trace_eval.py similarity index 100% rename from apps/interleave_thinker/trace_eval.py rename to fastvideo/workflows/interleave_thinker/trace_eval.py diff --git a/pyproject.toml b/pyproject.toml index 2ec03b14b..b6192bb08 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -195,13 +195,13 @@ dreamverse-mock-server = "dreamverse.mock_server:cli" [tool.setuptools.packages.find] where = [".", "apps/dreamverse"] -exclude = ["assets*", "docker*", "docs", "scripts*", "apps.dreamverse*", "dreamverse.tests*"] +exclude = ["assets*", "docker*", "docs", "scripts*", "apps*", "dreamverse.tests*"] [tool.setuptools.package-data] dreamverse = ["prompts/*.md"] [tool.wheel] -exclude = ["assets*", "docker*", "docs", "scripts*", "apps/dreamverse*"] +exclude = ["assets*", "docker*", "docs", "scripts*", "apps*"] [tool.pytest.ini_options] markers = [