From 2af4206fc55c2d91ba04b9bafb11db1e55e925b4 Mon Sep 17 00:00:00 2001 From: Henry Ruhs Date: Wed, 25 Feb 2026 09:22:09 +0100 Subject: [PATCH] better args types (#1049) * fix lint and remove unused types, restructure helpers * fix lint * fix lint * fix lint --- facefusion/apis/endpoints/assets.py | 4 +- facefusion/args_helper.py | 58 ++++++++++++------- facefusion/core.py | 14 ++--- .../processors/modules/age_modifier/core.py | 4 +- .../modules/background_remover/core.py | 4 +- .../processors/modules/deep_swapper/core.py | 4 +- .../modules/expression_restorer/core.py | 4 +- .../processors/modules/face_debugger/core.py | 4 +- .../processors/modules/face_editor/core.py | 4 +- .../processors/modules/face_enhancer/core.py | 4 +- .../processors/modules/face_swapper/core.py | 4 +- .../modules/frame_colorizer/core.py | 4 +- .../processors/modules/frame_enhancer/core.py | 4 +- .../processors/modules/lip_syncer/core.py | 4 +- facefusion/processors/types.py | 10 +++- facefusion/program.py | 3 - facefusion/state_manager.py | 18 +++--- facefusion/types.py | 12 +++- facefusion/workflows/audio_to_image.py | 2 +- 19 files changed, 97 insertions(+), 68 deletions(-) diff --git a/facefusion/apis/endpoints/assets.py b/facefusion/apis/endpoints/assets.py index 02c5b703..ab200b29 100644 --- a/facefusion/apis/endpoints/assets.py +++ b/facefusion/apis/endpoints/assets.py @@ -24,13 +24,13 @@ async def upload_asset(request : Request) -> Response: form = await request.form() upload_files = form.getlist('file') - asset_paths = await save_asset_files(upload_files) # type: ignore[arg-type] + asset_paths = await save_asset_files(upload_files) #type:ignore[arg-type] if asset_paths: asset_ids : List[str] = [] for asset_path in asset_paths: - asset = asset_store.create_asset(session_id, asset_type, asset_path) # type: ignore[arg-type] + asset = asset_store.create_asset(session_id, asset_type, asset_path) #type:ignore[arg-type] if asset: asset_id = asset.get('id') diff --git a/facefusion/args_helper.py b/facefusion/args_helper.py index 94a55c0e..83ef2287 100644 --- a/facefusion/args_helper.py +++ b/facefusion/args_helper.py @@ -1,35 +1,29 @@ +from facefusion.capability_store import get_api_arguments, get_cli_arguments, get_sys_arguments from facefusion.filesystem import get_file_name, is_video, resolve_file_paths from facefusion.normalizer import normalize_fps, normalize_space from facefusion.processors.core import get_processors_modules -from facefusion.types import ApplyStateItem, Args +from facefusion.types import ApplyStateItem, Args, State from facefusion.vision import detect_video_fps def apply_args(args : Args, apply_state_item : ApplyStateItem) -> None: - # general apply_state_item('command', args.get('command')) - # workflow apply_state_item('workflow', args.get('workflow')) - # paths apply_state_item('temp_path', args.get('temp_path')) apply_state_item('jobs_path', args.get('jobs_path')) apply_state_item('source_paths', args.get('source_paths')) apply_state_item('target_path', args.get('target_path')) apply_state_item('output_path', args.get('output_path')) - # patterns apply_state_item('source_pattern', args.get('source_pattern')) apply_state_item('target_pattern', args.get('target_pattern')) apply_state_item('output_pattern', args.get('output_pattern')) - # face detector apply_state_item('face_detector_model', args.get('face_detector_model')) apply_state_item('face_detector_size', args.get('face_detector_size')) apply_state_item('face_detector_margin', normalize_space(args.get('face_detector_margin'))) apply_state_item('face_detector_angles', args.get('face_detector_angles')) apply_state_item('face_detector_score', args.get('face_detector_score')) - # face landmarker apply_state_item('face_landmarker_model', args.get('face_landmarker_model')) apply_state_item('face_landmarker_score', args.get('face_landmarker_score')) - # face selector apply_state_item('face_selector_mode', args.get('face_selector_mode')) apply_state_item('face_selector_order', args.get('face_selector_order')) apply_state_item('face_selector_age_start', args.get('face_selector_age_start')) @@ -39,7 +33,6 @@ def apply_args(args : Args, apply_state_item : ApplyStateItem) -> None: apply_state_item('reference_face_position', args.get('reference_face_position')) apply_state_item('reference_face_distance', args.get('reference_face_distance')) apply_state_item('reference_frame_number', args.get('reference_frame_number')) - # face masker apply_state_item('face_occluder_model', args.get('face_occluder_model')) apply_state_item('face_parser_model', args.get('face_parser_model')) apply_state_item('face_mask_types', args.get('face_mask_types')) @@ -47,13 +40,10 @@ def apply_args(args : Args, apply_state_item : ApplyStateItem) -> None: apply_state_item('face_mask_regions', args.get('face_mask_regions')) apply_state_item('face_mask_blur', args.get('face_mask_blur')) apply_state_item('face_mask_padding', normalize_space(args.get('face_mask_padding'))) - # voice extractor apply_state_item('voice_extractor_model', args.get('voice_extractor_model')) - # frame extraction apply_state_item('trim_frame_start', args.get('trim_frame_start')) apply_state_item('trim_frame_end', args.get('trim_frame_end')) apply_state_item('temp_frame_format', args.get('temp_frame_format')) - # output creation apply_state_item('output_image_quality', args.get('output_image_quality')) apply_state_item('output_image_scale', args.get('output_image_scale')) apply_state_item('output_audio_encoder', args.get('output_audio_encoder')) @@ -63,34 +53,62 @@ def apply_args(args : Args, apply_state_item : ApplyStateItem) -> None: apply_state_item('output_video_preset', args.get('output_video_preset')) apply_state_item('output_video_quality', args.get('output_video_quality')) apply_state_item('output_video_scale', args.get('output_video_scale')) + if args.get('output_video_fps') or is_video(args.get('target_path')): output_video_fps = normalize_fps(args.get('output_video_fps')) or detect_video_fps(args.get('target_path')) apply_state_item('output_video_fps', output_video_fps) - # processors + available_processors = [ get_file_name(file_path) for file_path in resolve_file_paths('facefusion/processors/modules') ] apply_state_item('processors', args.get('processors')) + for processor_module in get_processors_modules(available_processors): processor_module.apply_args(args, apply_state_item) - # execution + apply_state_item('execution_device_ids', args.get('execution_device_ids')) apply_state_item('execution_providers', args.get('execution_providers')) apply_state_item('execution_thread_count', args.get('execution_thread_count')) - # download apply_state_item('download_providers', args.get('download_providers')) apply_state_item('download_scope', args.get('download_scope')) - # benchmark apply_state_item('benchmark_mode', args.get('benchmark_mode')) apply_state_item('benchmark_resolutions', args.get('benchmark_resolutions')) apply_state_item('benchmark_cycle_count', args.get('benchmark_cycle_count')) - # api apply_state_item('api_host', args.get('api_host')) apply_state_item('api_port', args.get('api_port')) - # memory apply_state_item('video_memory_strategy', args.get('video_memory_strategy')) - # misc apply_state_item('log_level', args.get('log_level')) apply_state_item('halt_on_error', args.get('halt_on_error')) - # jobs apply_state_item('job_id', args.get('job_id')) apply_state_item('job_status', args.get('job_status')) apply_state_item('step_index', args.get('step_index')) + + +def extract_api_args(state : State) -> Args: + api_args =\ + { + key: state.get(key) for key in state if key in get_api_arguments() + } + return api_args + + +def extract_cli_args(state : State) -> Args: + cli_args =\ + { + key: state.get(key) for key in state if key in get_cli_arguments() + } + return cli_args + + +def extract_sys_args(state : State) -> Args: + sys_args =\ + { + key: state.get(key) for key in state if key in get_sys_arguments() + } + return sys_args + + +def extract_step_args(state : State) -> Args: + step_args =\ + { + key: state.get(key) for key in state if key in get_cli_arguments() and key not in get_sys_arguments() + } + return step_args diff --git a/facefusion/core.py b/facefusion/core.py index 8f286715..8692d511 100755 --- a/facefusion/core.py +++ b/facefusion/core.py @@ -7,7 +7,7 @@ from time import time import uvicorn -from facefusion import benchmarker, capability_store, cli_helper, content_analyser, face_classifier, face_detector, face_landmarker, face_masker, face_recognizer, hash_helper, logger, state_manager, translator, voice_extractor +from facefusion import args_helper, benchmarker, cli_helper, content_analyser, face_classifier, face_detector, face_landmarker, face_masker, face_recognizer, hash_helper, logger, state_manager, translator, voice_extractor from facefusion.apis.core import create_api from facefusion.args_helper import apply_args from facefusion.download import conditional_download_hashes, conditional_download_sources @@ -198,7 +198,7 @@ def route_job_manager(args : Args) -> ErrorCode: return 1 if state_manager.get_item('command') == 'job-add-step': - step_args = capability_store.filter_step_args(args) + step_args = args_helper.extract_step_args(args) # type:ignore[arg-type] if job_manager.add_step(state_manager.get_item('job_id'), step_args): logger.info(translator.get('job_step_added').format(job_id = state_manager.get_item('job_id')), __name__) @@ -207,7 +207,7 @@ def route_job_manager(args : Args) -> ErrorCode: return 1 if state_manager.get_item('command') == 'job-remix-step': - step_args = capability_store.filter_step_args(args) + step_args = args_helper.extract_step_args(args) # type:ignore[arg-type] if job_manager.remix_step(state_manager.get_item('job_id'), state_manager.get_item('step_index'), step_args): logger.info(translator.get('job_remix_step_added').format(job_id = state_manager.get_item('job_id'), step_index = state_manager.get_item('step_index')), __name__) @@ -216,7 +216,7 @@ def route_job_manager(args : Args) -> ErrorCode: return 1 if state_manager.get_item('command') == 'job-insert-step': - step_args = capability_store.filter_step_args(args) + step_args = args_helper.extract_step_args(args) # type:ignore[arg-type] if job_manager.insert_step(state_manager.get_item('job_id'), state_manager.get_item('step_index'), step_args): logger.info(translator.get('job_step_inserted').format(job_id = state_manager.get_item('job_id'), step_index = state_manager.get_item('step_index')), __name__) @@ -270,7 +270,7 @@ def route_job_runner() -> ErrorCode: def process_headless(args : Args) -> ErrorCode: job_id = job_helper.suggest_job_id('headless') - step_args = capability_store.filter_step_args(args) + step_args = args_helper.extract_step_args(args) # type:ignore[arg-type] if job_manager.create_job(job_id) and job_manager.add_step(job_id, step_args) and job_manager.submit_job(job_id) and job_runner.run_job(job_id, process_step): return 0 @@ -279,7 +279,7 @@ def process_headless(args : Args) -> ErrorCode: def process_batch(args : Args) -> ErrorCode: job_id = job_helper.suggest_job_id('batch') - step_args = capability_store.filter_step_args(args) + step_args = args_helper.extract_step_args(args) # type:ignore[arg-type] source_paths = resolve_file_pattern(step_args.get('source_pattern')) target_paths = resolve_file_pattern(step_args.get('target_pattern')) @@ -317,7 +317,7 @@ def process_batch(args : Args) -> ErrorCode: def process_step(job_id : str, step_index : int, step_args : Args) -> bool: step_total = job_manager.count_step_total(job_id) - cli_args = capability_store.filter_cli_args(state_manager.get_state()) #type:ignore[arg-type] + cli_args = args_helper.extract_cli_args(state_manager.get_state()) #type:ignore[arg-type] args = cli_args.copy() args.update(step_args) apply_args(args, state_manager.set_item) diff --git a/facefusion/processors/modules/age_modifier/core.py b/facefusion/processors/modules/age_modifier/core.py index ccb3368b..a364d2a0 100755 --- a/facefusion/processors/modules/age_modifier/core.py +++ b/facefusion/processors/modules/age_modifier/core.py @@ -18,10 +18,10 @@ from facefusion.face_selector import select_faces from facefusion.filesystem import in_directory, is_image, is_video, resolve_relative_path from facefusion.processors.modules.age_modifier import choices as age_modifier_choices from facefusion.processors.modules.age_modifier.types import AgeModifierDirection, AgeModifierInputs -from facefusion.processors.types import ProcessorOutputs +from facefusion.processors.types import ApplyStateItem, ProcessorOutputs from facefusion.program_helper import find_argument_group from facefusion.thread_helper import thread_semaphore -from facefusion.types import ApplyStateItem, Args, DownloadScope, Face, InferencePool, ModelOptions, ModelSet, ProcessMode, VisionFrame +from facefusion.types import Args, DownloadScope, Face, InferencePool, ModelOptions, ModelSet, ProcessMode, VisionFrame from facefusion.vision import match_frame_color, read_static_image, read_static_video_frame diff --git a/facefusion/processors/modules/background_remover/core.py b/facefusion/processors/modules/background_remover/core.py index 6ec3962b..732fec61 100644 --- a/facefusion/processors/modules/background_remover/core.py +++ b/facefusion/processors/modules/background_remover/core.py @@ -15,11 +15,11 @@ from facefusion.filesystem import in_directory, is_image, is_video, resolve_rela from facefusion.normalizer import normalize_color from facefusion.processors.modules.background_remover import choices as background_remover_choices from facefusion.processors.modules.background_remover.types import BackgroundRemoverInputs -from facefusion.processors.types import ProcessorOutputs +from facefusion.processors.types import ApplyStateItem, ProcessorOutputs from facefusion.program_helper import find_argument_group from facefusion.sanitizer import sanitize_int_range from facefusion.thread_helper import thread_semaphore -from facefusion.types import ApplyStateItem, Args, DownloadScope, ExecutionProvider, InferencePool, Mask, ModelOptions, ModelSet, ProcessMode, VisionFrame +from facefusion.types import Args, DownloadScope, ExecutionProvider, InferencePool, Mask, ModelOptions, ModelSet, ProcessMode, VisionFrame from facefusion.vision import read_static_image, read_static_video_frame diff --git a/facefusion/processors/modules/deep_swapper/core.py b/facefusion/processors/modules/deep_swapper/core.py index 56c5dc6f..a10a9290 100755 --- a/facefusion/processors/modules/deep_swapper/core.py +++ b/facefusion/processors/modules/deep_swapper/core.py @@ -18,10 +18,10 @@ from facefusion.face_selector import select_faces from facefusion.filesystem import get_file_name, in_directory, is_image, is_video, resolve_file_paths, resolve_relative_path from facefusion.processors.modules.deep_swapper import choices as deep_swapper_choices from facefusion.processors.modules.deep_swapper.types import DeepSwapperInputs, DeepSwapperMorph -from facefusion.processors.types import ProcessorOutputs +from facefusion.processors.types import ApplyStateItem, ProcessorOutputs from facefusion.program_helper import find_argument_group from facefusion.thread_helper import thread_semaphore -from facefusion.types import ApplyStateItem, Args, DownloadScope, Face, InferencePool, Mask, ModelOptions, ModelSet, ProcessMode, VisionFrame +from facefusion.types import Args, DownloadScope, Face, InferencePool, Mask, ModelOptions, ModelSet, ProcessMode, VisionFrame from facefusion.vision import conditional_match_frame_color, read_static_image, read_static_video_frame diff --git a/facefusion/processors/modules/expression_restorer/core.py b/facefusion/processors/modules/expression_restorer/core.py index 6cb8269a..04fd0421 100755 --- a/facefusion/processors/modules/expression_restorer/core.py +++ b/facefusion/processors/modules/expression_restorer/core.py @@ -18,10 +18,10 @@ from facefusion.filesystem import in_directory, is_image, is_video, resolve_rela from facefusion.processors.live_portrait import create_rotation, limit_expression from facefusion.processors.modules.expression_restorer import choices as expression_restorer_choices from facefusion.processors.modules.expression_restorer.types import ExpressionRestorerInputs -from facefusion.processors.types import LivePortraitExpression, LivePortraitFeatureVolume, LivePortraitMotionPoints, LivePortraitPitch, LivePortraitRoll, LivePortraitScale, LivePortraitTranslation, LivePortraitYaw, ProcessorOutputs +from facefusion.processors.types import ApplyStateItem, LivePortraitExpression, LivePortraitFeatureVolume, LivePortraitMotionPoints, LivePortraitPitch, LivePortraitRoll, LivePortraitScale, LivePortraitTranslation, LivePortraitYaw, ProcessorOutputs from facefusion.program_helper import find_argument_group from facefusion.thread_helper import conditional_thread_semaphore, thread_semaphore -from facefusion.types import ApplyStateItem, Args, DownloadScope, Face, InferencePool, ModelOptions, ModelSet, ProcessMode, VisionFrame +from facefusion.types import Args, DownloadScope, Face, InferencePool, ModelOptions, ModelSet, ProcessMode, VisionFrame from facefusion.vision import read_static_image, read_static_video_frame diff --git a/facefusion/processors/modules/face_debugger/core.py b/facefusion/processors/modules/face_debugger/core.py index 01c08c60..fc05e7b8 100755 --- a/facefusion/processors/modules/face_debugger/core.py +++ b/facefusion/processors/modules/face_debugger/core.py @@ -13,9 +13,9 @@ from facefusion.face_selector import select_faces from facefusion.filesystem import in_directory, is_image, is_video from facefusion.processors.modules.face_debugger import choices as face_debugger_choices from facefusion.processors.modules.face_debugger.types import FaceDebuggerInputs -from facefusion.processors.types import ProcessorOutputs +from facefusion.processors.types import ApplyStateItem, ProcessorOutputs from facefusion.program_helper import find_argument_group -from facefusion.types import ApplyStateItem, Args, Face, InferencePool, ProcessMode, VisionFrame +from facefusion.types import Args, Face, InferencePool, ProcessMode, VisionFrame from facefusion.vision import read_static_image, read_static_video_frame diff --git a/facefusion/processors/modules/face_editor/core.py b/facefusion/processors/modules/face_editor/core.py index dafc2cb6..9f9174a1 100755 --- a/facefusion/processors/modules/face_editor/core.py +++ b/facefusion/processors/modules/face_editor/core.py @@ -18,10 +18,10 @@ from facefusion.filesystem import in_directory, is_image, is_video, resolve_rela from facefusion.processors.live_portrait import create_rotation, limit_angle, limit_expression from facefusion.processors.modules.face_editor import choices as face_editor_choices from facefusion.processors.modules.face_editor.types import FaceEditorInputs -from facefusion.processors.types import LivePortraitExpression, LivePortraitFeatureVolume, LivePortraitMotionPoints, LivePortraitPitch, LivePortraitRoll, LivePortraitRotation, LivePortraitScale, LivePortraitTranslation, LivePortraitYaw, ProcessorOutputs +from facefusion.processors.types import ApplyStateItem, LivePortraitExpression, LivePortraitFeatureVolume, LivePortraitMotionPoints, LivePortraitPitch, LivePortraitRoll, LivePortraitRotation, LivePortraitScale, LivePortraitTranslation, LivePortraitYaw, ProcessorOutputs from facefusion.program_helper import find_argument_group from facefusion.thread_helper import conditional_thread_semaphore, thread_semaphore -from facefusion.types import ApplyStateItem, Args, DownloadScope, Face, FaceLandmark68, InferencePool, ModelOptions, ModelSet, ProcessMode, VisionFrame +from facefusion.types import Args, DownloadScope, Face, FaceLandmark68, InferencePool, ModelOptions, ModelSet, ProcessMode, VisionFrame from facefusion.vision import read_static_image, read_static_video_frame diff --git a/facefusion/processors/modules/face_enhancer/core.py b/facefusion/processors/modules/face_enhancer/core.py index 808de735..bc40538d 100755 --- a/facefusion/processors/modules/face_enhancer/core.py +++ b/facefusion/processors/modules/face_enhancer/core.py @@ -15,10 +15,10 @@ from facefusion.face_selector import select_faces from facefusion.filesystem import in_directory, is_image, is_video, resolve_relative_path from facefusion.processors.modules.face_enhancer import choices as face_enhancer_choices from facefusion.processors.modules.face_enhancer.types import FaceEnhancerInputs, FaceEnhancerWeight -from facefusion.processors.types import ProcessorOutputs +from facefusion.processors.types import ApplyStateItem, ProcessorOutputs from facefusion.program_helper import find_argument_group from facefusion.thread_helper import thread_semaphore -from facefusion.types import ApplyStateItem, Args, DownloadScope, Face, InferencePool, ModelOptions, ModelSet, ProcessMode, VisionFrame +from facefusion.types import Args, DownloadScope, Face, InferencePool, ModelOptions, ModelSet, ProcessMode, VisionFrame from facefusion.vision import blend_frame, read_static_image, read_static_video_frame diff --git a/facefusion/processors/modules/face_swapper/core.py b/facefusion/processors/modules/face_swapper/core.py index 2d68f066..4122a0af 100755 --- a/facefusion/processors/modules/face_swapper/core.py +++ b/facefusion/processors/modules/face_swapper/core.py @@ -21,10 +21,10 @@ from facefusion.model_helper import get_static_model_initializer from facefusion.processors.modules.face_swapper import choices as face_swapper_choices from facefusion.processors.modules.face_swapper.types import FaceSwapperInputs from facefusion.processors.pixel_boost import explode_pixel_boost, implode_pixel_boost -from facefusion.processors.types import ProcessorOutputs +from facefusion.processors.types import ApplyStateItem, ProcessorOutputs from facefusion.program_helper import find_argument_group from facefusion.thread_helper import conditional_thread_semaphore -from facefusion.types import ApplyStateItem, Args, DownloadScope, Embedding, Face, InferencePool, ModelOptions, ModelSet, ProcessMode, VisionFrame +from facefusion.types import Args, DownloadScope, Embedding, Face, InferencePool, ModelOptions, ModelSet, ProcessMode, VisionFrame from facefusion.vision import read_static_image, read_static_images, read_static_video_frame, unpack_resolution diff --git a/facefusion/processors/modules/frame_colorizer/core.py b/facefusion/processors/modules/frame_colorizer/core.py index cb743ff6..75966067 100644 --- a/facefusion/processors/modules/frame_colorizer/core.py +++ b/facefusion/processors/modules/frame_colorizer/core.py @@ -14,10 +14,10 @@ from facefusion.execution import has_execution_provider from facefusion.filesystem import in_directory, is_image, is_video, resolve_relative_path from facefusion.processors.modules.frame_colorizer import choices as frame_colorizer_choices from facefusion.processors.modules.frame_colorizer.types import FrameColorizerInputs -from facefusion.processors.types import ProcessorOutputs +from facefusion.processors.types import ApplyStateItem, ProcessorOutputs from facefusion.program_helper import find_argument_group from facefusion.thread_helper import thread_semaphore -from facefusion.types import ApplyStateItem, Args, DownloadScope, ExecutionProvider, InferencePool, ModelOptions, ModelSet, ProcessMode, VisionFrame +from facefusion.types import Args, DownloadScope, ExecutionProvider, InferencePool, ModelOptions, ModelSet, ProcessMode, VisionFrame from facefusion.vision import blend_frame, read_static_image, read_static_video_frame, unpack_resolution diff --git a/facefusion/processors/modules/frame_enhancer/core.py b/facefusion/processors/modules/frame_enhancer/core.py index b2c6ffd7..2adc0ffc 100644 --- a/facefusion/processors/modules/frame_enhancer/core.py +++ b/facefusion/processors/modules/frame_enhancer/core.py @@ -13,10 +13,10 @@ from facefusion.execution import has_execution_provider from facefusion.filesystem import in_directory, is_image, is_video, resolve_relative_path from facefusion.processors.modules.frame_enhancer import choices as frame_enhancer_choices from facefusion.processors.modules.frame_enhancer.types import FrameEnhancerInputs -from facefusion.processors.types import ProcessorOutputs +from facefusion.processors.types import ApplyStateItem, ProcessorOutputs from facefusion.program_helper import find_argument_group from facefusion.thread_helper import conditional_thread_semaphore -from facefusion.types import ApplyStateItem, Args, DownloadScope, InferencePool, ModelOptions, ModelSet, ProcessMode, VisionFrame +from facefusion.types import Args, DownloadScope, InferencePool, ModelOptions, ModelSet, ProcessMode, VisionFrame from facefusion.vision import blend_frame, create_tile_frames, merge_tile_frames, read_static_image, read_static_video_frame diff --git a/facefusion/processors/modules/lip_syncer/core.py b/facefusion/processors/modules/lip_syncer/core.py index 2ed21e95..9291afa1 100755 --- a/facefusion/processors/modules/lip_syncer/core.py +++ b/facefusion/processors/modules/lip_syncer/core.py @@ -17,10 +17,10 @@ from facefusion.face_selector import select_faces from facefusion.filesystem import has_audio, resolve_relative_path from facefusion.processors.modules.lip_syncer import choices as lip_syncer_choices from facefusion.processors.modules.lip_syncer.types import LipSyncerInputs, LipSyncerWeight -from facefusion.processors.types import ProcessorOutputs +from facefusion.processors.types import ApplyStateItem, ProcessorOutputs from facefusion.program_helper import find_argument_group from facefusion.thread_helper import conditional_thread_semaphore -from facefusion.types import ApplyStateItem, Args, AudioFrame, DownloadScope, Face, InferencePool, ModelOptions, ModelSet, ProcessMode, VisionFrame +from facefusion.types import Args, AudioFrame, DownloadScope, Face, InferencePool, ModelOptions, ModelSet, ProcessMode, VisionFrame from facefusion.vision import read_static_image, read_static_video_frame diff --git a/facefusion/processors/types.py b/facefusion/processors/types.py index 71711f5c..a172f8f1 100644 --- a/facefusion/processors/types.py +++ b/facefusion/processors/types.py @@ -1,4 +1,4 @@ -from typing import Any, Dict, Tuple, TypeAlias +from typing import Any, Callable, Dict, Tuple, TypeAlias from numpy.typing import NDArray @@ -14,7 +14,11 @@ LivePortraitRotation : TypeAlias = NDArray[Any] LivePortraitScale : TypeAlias = NDArray[Any] LivePortraitTranslation : TypeAlias = NDArray[Any] -ProcessorStateKey = str -ProcessorState : TypeAlias = Dict[ProcessorStateKey, Any] +ProcessorStateValue : TypeAlias = Any +ProcessorStateKey : TypeAlias = str +ProcessorState : TypeAlias = Dict[ProcessorStateKey, ProcessorStateValue] ProcessorStateSet : TypeAlias = Dict[AppContext, ProcessorState] + +ApplyStateItem : TypeAlias = Callable[[ProcessorStateKey, ProcessorStateValue], None] + ProcessorOutputs : TypeAlias = Tuple[VisionFrame, Mask] diff --git a/facefusion/program.py b/facefusion/program.py index e1bdec12..57156bc6 100755 --- a/facefusion/program.py +++ b/facefusion/program.py @@ -998,7 +998,6 @@ def create_program() -> ArgumentParser: ) sub_program = program.add_subparsers(dest = 'command') - # general sub_program.add_parser( 'run', help = translator.get('help.run'), @@ -1068,7 +1067,6 @@ def create_program() -> ArgumentParser: ], formatter_class = create_help_formatter_large ) - # job manager sub_program.add_parser( 'job-list', help = translator.get('help.job_list'), @@ -1199,7 +1197,6 @@ def create_program() -> ArgumentParser: ], formatter_class = create_help_formatter_large ) - # job runner sub_program.add_parser( 'job-run', help = translator.get('help.job_run'), diff --git a/facefusion/state_manager.py b/facefusion/state_manager.py index 048e2a7b..f9b9e7d7 100644 --- a/facefusion/state_manager.py +++ b/facefusion/state_manager.py @@ -1,10 +1,10 @@ import os -from typing import Any, Union +from typing import Union from facefusion.app_context import detect_app_context from facefusion.processors.types import ProcessorState, ProcessorStateKey, ProcessorStateSet from facefusion.session_context import get_session_id -from facefusion.types import Args, State, StateKey, StateSet +from facefusion.types import Args, State, StateKey, StateSet, StateValue STATE_SET : Union[StateSet, ProcessorStateSet] =\ { @@ -15,27 +15,27 @@ STATE_SET : Union[StateSet, ProcessorStateSet] =\ def get_state() -> Union[State, ProcessorState]: app_context = detect_app_context() - return STATE_SET.get(app_context) #type:ignore[return-value] + return STATE_SET.get(app_context) def collect_state(args : Args) -> Union[State, ProcessorState]: state =\ { - key: get_item(key) for key in args #type:ignore[arg-type] + key: get_item(key) for key in args } - return state #type:ignore[return-value] + return state -def init_item(key : Union[StateKey, ProcessorStateKey], value : Any) -> None: +def init_item(key : Union[StateKey, ProcessorStateKey], value : StateValue) -> None: STATE_SET['api'][key] = value #type:ignore[literal-required] STATE_SET['cli'][key] = value #type:ignore[literal-required] -def get_item(key : Union[StateKey, ProcessorStateKey]) -> Any: - return get_state().get(key) #type:ignore[literal-required] +def get_item(key : Union[StateKey, ProcessorStateKey]) -> StateValue: + return get_state().get(key) -def set_item(key : Union[StateKey, ProcessorStateKey], value : Any) -> None: +def set_item(key : Union[StateKey, ProcessorStateKey], value : StateValue) -> None: app_context = detect_app_context() STATE_SET[app_context][key] = value #type:ignore[literal-required] diff --git a/facefusion/types.py b/facefusion/types.py index 9cd48f99..55439b0d 100755 --- a/facefusion/types.py +++ b/facefusion/types.py @@ -375,9 +375,11 @@ Job = TypedDict('Job', }) JobSet : TypeAlias = Dict[str, Job] +StateValue : TypeAlias = Any StateKey = Literal\ [ 'command', + 'workflow', 'config_path', 'temp_path', 'jobs_path', @@ -437,6 +439,9 @@ StateKey = Literal\ 'video_memory_strategy', 'log_level', 'halt_on_error', + 'api_host', + 'api_port', + 'api_key', 'job_id', 'job_status', 'step_index' @@ -444,6 +449,7 @@ StateKey = Literal\ State = TypedDict('State', { 'command' : str, + 'workflow' : WorkFlow, 'config_path' : str, 'temp_path' : str, 'jobs_path' : str, @@ -503,9 +509,13 @@ State = TypedDict('State', 'video_memory_strategy' : VideoMemoryStrategy, 'log_level' : LogLevel, 'halt_on_error' : bool, + 'api_host' : str, + 'api_port' : int, + 'api_key' : str, 'job_id' : str, 'job_status' : JobStatus, 'step_index' : int }) -ApplyStateItem : TypeAlias = Callable[[Any, Any], None] StateSet : TypeAlias = Dict[AppContext, State] + +ApplyStateItem : TypeAlias = Callable[[StateKey, StateValue], None] diff --git a/facefusion/workflows/audio_to_image.py b/facefusion/workflows/audio_to_image.py index e7d9607b..db0476f5 100644 --- a/facefusion/workflows/audio_to_image.py +++ b/facefusion/workflows/audio_to_image.py @@ -24,7 +24,7 @@ def process(start_time : float) -> ErrorCode: process_manager.start() for task in tasks: - error_code = task() # type:ignore[operator] + error_code = task() #type:ignore[operator] if error_code > 0: process_manager.end()