From b6a1adb7a53348295393e9b767a63343c8f9cea7 Mon Sep 17 00:00:00 2001 From: henryruhs Date: Thu, 2 Jul 2026 20:39:09 +0200 Subject: [PATCH] add groups to capabilities --- facefusion/apis/endpoints/capabilities.py | 2 +- facefusion/capability_store.py | 17 +- .../processors/modules/age_modifier/core.py | 3 +- .../modules/background_remover/core.py | 3 +- .../processors/modules/deep_swapper/core.py | 3 +- .../modules/expression_restorer/core.py | 3 +- .../processors/modules/face_debugger/core.py | 3 +- .../processors/modules/face_editor/core.py | 3 +- .../processors/modules/face_enhancer/core.py | 3 +- .../processors/modules/face_swapper/core.py | 6 +- .../modules/frame_colorizer/core.py | 3 +- .../processors/modules/frame_enhancer/core.py | 3 +- .../processors/modules/lip_syncer/core.py | 3 +- facefusion/program.py | 180 ++++++++++++------ facefusion/types.py | 5 +- tests/test_api_capabilities.py | 10 +- tests/test_api_state.py | 9 +- 17 files changed, 175 insertions(+), 84 deletions(-) diff --git a/facefusion/apis/endpoints/capabilities.py b/facefusion/apis/endpoints/capabilities.py index 0c998cc3..324b1b3f 100644 --- a/facefusion/apis/endpoints/capabilities.py +++ b/facefusion/apis/endpoints/capabilities.py @@ -15,6 +15,6 @@ async def get_capabilities(request : Request) -> JSONResponse: 'image': facefusion.choices.image_formats, 'video': facefusion.choices.video_formats }, - 'arguments': capability_store.get_api_capability_set() + 'arguments': capability_store.get_api_capability_group() } return JSONResponse(capabilities, status_code = HTTP_200_OK) diff --git a/facefusion/capability_store.py b/facefusion/capability_store.py index 83ef0dc2..a25eaa27 100644 --- a/facefusion/capability_store.py +++ b/facefusion/capability_store.py @@ -1,7 +1,7 @@ from argparse import Action from typing import Dict, List -from facefusion.types import CapabilitySet, CapabilityStore, Scope +from facefusion.types import CapabilityGroup, CapabilitySet, CapabilityStore, Group, Scope CAPABILITY_STORE : CapabilityStore =\ { @@ -11,6 +11,16 @@ CAPABILITY_STORE : CapabilityStore =\ } +def get_api_capability_group() -> CapabilityGroup: + capability_group : CapabilityGroup = {} + + for name, value in CAPABILITY_STORE.get('api').items(): + for group in value.get('groups'): + capability_group.setdefault(group, {})[name] = value + + return capability_group + + def get_api_capability_set() -> Dict[str, CapabilitySet]: return CAPABILITY_STORE.get('api') @@ -35,11 +45,12 @@ def get_sys_arguments() -> List[str]: return list(get_sys_capability_set().keys()) -def register_capability_set(actions : List[Action], scopes : List[Scope]) -> None: +def register_capability_set(actions : List[Action], scopes : List[Scope], groups : List[Group]) -> None: for action in actions: value : CapabilitySet =\ { - 'default': action.default + 'default': action.default, + 'groups': groups } if action.choices: diff --git a/facefusion/processors/modules/age_modifier/core.py b/facefusion/processors/modules/age_modifier/core.py index f5f023d9..adb9c89d 100755 --- a/facefusion/processors/modules/age_modifier/core.py +++ b/facefusion/processors/modules/age_modifier/core.py @@ -142,7 +142,8 @@ def register_args(program : ArgumentParser) -> None: metavar = create_int_metavar(age_modifier_choices.age_modifier_direction_range) ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'age_modifier' ] ) diff --git a/facefusion/processors/modules/background_remover/core.py b/facefusion/processors/modules/background_remover/core.py index 735d19f3..8a268136 100644 --- a/facefusion/processors/modules/background_remover/core.py +++ b/facefusion/processors/modules/background_remover/core.py @@ -519,7 +519,8 @@ def register_args(program : ArgumentParser) -> None: nargs = '+' ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'background_remover' ] ) diff --git a/facefusion/processors/modules/deep_swapper/core.py b/facefusion/processors/modules/deep_swapper/core.py index 1de063df..e98ff6fc 100755 --- a/facefusion/processors/modules/deep_swapper/core.py +++ b/facefusion/processors/modules/deep_swapper/core.py @@ -294,7 +294,8 @@ def register_args(program : ArgumentParser) -> None: metavar = create_int_metavar(deep_swapper_choices.deep_swapper_morph_range) ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'deep_swapper' ] ) diff --git a/facefusion/processors/modules/expression_restorer/core.py b/facefusion/processors/modules/expression_restorer/core.py index 6a6808e9..16170b0e 100755 --- a/facefusion/processors/modules/expression_restorer/core.py +++ b/facefusion/processors/modules/expression_restorer/core.py @@ -125,7 +125,8 @@ def register_args(program : ArgumentParser) -> None: metavar = 'EXPRESSION_RESTORER_AREAS' ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'expression_restorer' ] ) diff --git a/facefusion/processors/modules/face_debugger/core.py b/facefusion/processors/modules/face_debugger/core.py index 8e14ced1..a72d5818 100755 --- a/facefusion/processors/modules/face_debugger/core.py +++ b/facefusion/processors/modules/face_debugger/core.py @@ -44,7 +44,8 @@ def register_args(program : ArgumentParser) -> None: metavar = 'FACE_DEBUGGER_ITEMS' ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'face_debugger' ] ) diff --git a/facefusion/processors/modules/face_editor/core.py b/facefusion/processors/modules/face_editor/core.py index 78d96e75..fe9e4faa 100755 --- a/facefusion/processors/modules/face_editor/core.py +++ b/facefusion/processors/modules/face_editor/core.py @@ -251,7 +251,8 @@ def register_args(program : ArgumentParser) -> None: metavar = create_float_metavar(face_editor_choices.face_editor_head_roll_range) ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'face_editor' ] ) diff --git a/facefusion/processors/modules/face_enhancer/core.py b/facefusion/processors/modules/face_enhancer/core.py index d73a0f3d..774b216c 100755 --- a/facefusion/processors/modules/face_enhancer/core.py +++ b/facefusion/processors/modules/face_enhancer/core.py @@ -319,7 +319,8 @@ def register_args(program : ArgumentParser) -> None: metavar = create_float_metavar(face_enhancer_choices.face_enhancer_weight_range) ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'face_enhancer' ] ) diff --git a/facefusion/processors/modules/face_swapper/core.py b/facefusion/processors/modules/face_swapper/core.py index d7fa11a6..6509caa5 100755 --- a/facefusion/processors/modules/face_swapper/core.py +++ b/facefusion/processors/modules/face_swapper/core.py @@ -537,7 +537,8 @@ def register_args(program : ArgumentParser) -> None: choices = face_swapper_choices.face_swapper_models ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'face_swapper' ] ) known_args, _ = program.parse_known_args() face_swapper_pixel_boost_choices = face_swapper_choices.face_swapper_set.get(known_args.face_swapper_model) @@ -557,7 +558,8 @@ def register_args(program : ArgumentParser) -> None: choices = face_swapper_choices.face_swapper_weight_range ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'face_swapper' ] ) diff --git a/facefusion/processors/modules/frame_colorizer/core.py b/facefusion/processors/modules/frame_colorizer/core.py index cdef0e1c..84d147f1 100644 --- a/facefusion/processors/modules/frame_colorizer/core.py +++ b/facefusion/processors/modules/frame_colorizer/core.py @@ -211,7 +211,8 @@ def register_args(program : ArgumentParser) -> None: metavar = create_int_metavar(frame_colorizer_choices.frame_colorizer_blend_range) ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'frame_colorizer' ] ) diff --git a/facefusion/processors/modules/frame_enhancer/core.py b/facefusion/processors/modules/frame_enhancer/core.py index d0d07b79..e828bd1e 100644 --- a/facefusion/processors/modules/frame_enhancer/core.py +++ b/facefusion/processors/modules/frame_enhancer/core.py @@ -599,7 +599,8 @@ def register_args(program : ArgumentParser) -> None: metavar = create_int_metavar(frame_enhancer_choices.frame_enhancer_blend_range) ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'frame_enhancer' ] ) diff --git a/facefusion/processors/modules/lip_syncer/core.py b/facefusion/processors/modules/lip_syncer/core.py index 227f4b71..d667ff77 100755 --- a/facefusion/processors/modules/lip_syncer/core.py +++ b/facefusion/processors/modules/lip_syncer/core.py @@ -151,7 +151,8 @@ def register_args(program : ArgumentParser) -> None: metavar = create_float_metavar(lip_syncer_choices.lip_syncer_weight_range) ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'lip_syncer' ] ) diff --git a/facefusion/program.py b/facefusion/program.py index d11198fb..f591d079 100755 --- a/facefusion/program.py +++ b/facefusion/program.py @@ -32,7 +32,8 @@ def create_config_path_program() -> ArgumentParser: default = 'facefusion.ini' ) ], - scopes = [ 'cli' ] + scopes = [ 'cli' ], + groups = [ 'paths' ] ) apply_config_path(program) @@ -52,7 +53,8 @@ def create_workflow_program() -> ArgumentParser: choices = facefusion.choices.workflows ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'paths' ] ) return program @@ -70,7 +72,8 @@ def create_temp_path_program() -> ArgumentParser: default = config.get_str_value('paths', 'temp_path', tempfile.gettempdir()) ) ], - scopes = [ 'cli' ] + scopes = [ 'cli' ], + groups = [ 'paths' ] ) return program @@ -88,7 +91,8 @@ def create_jobs_path_program() -> ArgumentParser: default = config.get_str_value('paths', 'jobs_path', '.jobs') ) ], - scopes = [ 'cli' ] + scopes = [ 'cli' ], + groups = [ 'paths' ] ) return program @@ -107,7 +111,8 @@ def create_source_paths_program() -> ArgumentParser: nargs = '+' ) ], - scopes = [ 'cli' ] + scopes = [ 'cli' ], + groups = [ 'paths' ] ) return program @@ -125,7 +130,8 @@ def create_target_path_program() -> ArgumentParser: default = config.get_str_value('paths', 'target_path') ) ], - scopes = [ 'cli' ] + scopes = [ 'cli' ], + groups = [ 'paths' ] ) return program @@ -143,7 +149,8 @@ def create_output_path_program() -> ArgumentParser: default = config.get_str_value('paths', 'output_path') ) ], - scopes = [ 'cli' ] + scopes = [ 'cli' ], + groups = [ 'paths' ] ) return program @@ -161,7 +168,8 @@ def create_source_pattern_program() -> ArgumentParser: default = config.get_str_value('patterns', 'source_pattern') ) ], - scopes = [ 'cli' ] + scopes = [ 'cli' ], + groups = [ 'patterns' ] ) return program @@ -179,7 +187,8 @@ def create_target_pattern_program() -> ArgumentParser: default = config.get_str_value('patterns', 'target_pattern') ) ], - scopes = [ 'cli' ] + scopes = [ 'cli' ], + groups = [ 'patterns' ] ) return program @@ -197,7 +206,8 @@ def create_output_pattern_program() -> ArgumentParser: default = config.get_str_value('patterns', 'output_pattern') ) ], - scopes = [ 'cli' ] + scopes = [ 'cli' ], + groups = [ 'patterns' ] ) return program @@ -216,7 +226,8 @@ def create_face_detector_program() -> ArgumentParser: choices = facefusion.choices.face_detector_models ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'face_detector' ] ) known_args, _ = program.parse_known_args() @@ -231,7 +242,8 @@ def create_face_detector_program() -> ArgumentParser: choices = face_detector_size_choices ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'face_detector' ] ) capability_store.register_capability_set( [ @@ -243,7 +255,8 @@ def create_face_detector_program() -> ArgumentParser: nargs = '+' ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'face_detector' ] ) capability_store.register_capability_set( [ @@ -257,7 +270,8 @@ def create_face_detector_program() -> ArgumentParser: metavar = 'FACE_DETECTOR_ANGLES' ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'face_detector' ] ) capability_store.register_capability_set( [ @@ -270,7 +284,8 @@ def create_face_detector_program() -> ArgumentParser: metavar = create_float_metavar(facefusion.choices.face_detector_score_range) ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'face_detector' ] ) return program @@ -289,7 +304,8 @@ def create_face_landmarker_program() -> ArgumentParser: choices = facefusion.choices.face_landmarker_models ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'face_landmarker' ] ) capability_store.register_capability_set( [ @@ -302,7 +318,8 @@ def create_face_landmarker_program() -> ArgumentParser: metavar = create_float_metavar(facefusion.choices.face_landmarker_score_range) ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'face_landmarker' ] ) return program @@ -321,7 +338,8 @@ def create_face_selector_program() -> ArgumentParser: choices = facefusion.choices.face_selector_modes ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'face_selector' ] ) capability_store.register_capability_set( [ @@ -332,7 +350,8 @@ def create_face_selector_program() -> ArgumentParser: choices = facefusion.choices.face_selector_orders ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'face_selector' ] ) capability_store.register_capability_set( [ @@ -345,7 +364,8 @@ def create_face_selector_program() -> ArgumentParser: metavar = create_int_metavar(facefusion.choices.face_selector_age_range) ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'face_selector' ] ) capability_store.register_capability_set( [ @@ -358,7 +378,8 @@ def create_face_selector_program() -> ArgumentParser: metavar = create_int_metavar(facefusion.choices.face_selector_age_range) ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'face_selector' ] ) capability_store.register_capability_set( [ @@ -369,7 +390,8 @@ def create_face_selector_program() -> ArgumentParser: choices = facefusion.choices.face_selector_genders ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'face_selector' ] ) capability_store.register_capability_set( [ @@ -380,7 +402,8 @@ def create_face_selector_program() -> ArgumentParser: choices = facefusion.choices.face_selector_races ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'face_selector' ] ) capability_store.register_capability_set( [ @@ -391,7 +414,8 @@ def create_face_selector_program() -> ArgumentParser: default = config.get_int_value('face_selector', 'reference_face_position', '0') ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'face_selector' ] ) capability_store.register_capability_set( [ @@ -404,7 +428,8 @@ def create_face_selector_program() -> ArgumentParser: metavar = create_float_metavar(facefusion.choices.reference_face_distance_range) ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'face_selector' ] ) capability_store.register_capability_set( [ @@ -415,7 +440,8 @@ def create_face_selector_program() -> ArgumentParser: default = config.get_int_value('face_selector', 'reference_frame_number', '0') ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'face_selector' ] ) return program @@ -436,7 +462,8 @@ def create_face_tracker_program() -> ArgumentParser: metavar = create_float_metavar(facefusion.choices.face_tracker_score_range) ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'face_tracker' ] ) return program @@ -455,7 +482,8 @@ def create_face_masker_program() -> ArgumentParser: choices = facefusion.choices.face_occluder_models ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'face_masker' ] ) capability_store.register_capability_set( [ @@ -466,7 +494,8 @@ def create_face_masker_program() -> ArgumentParser: choices = facefusion.choices.face_parser_models ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'face_masker' ] ) capability_store.register_capability_set( [ @@ -479,7 +508,8 @@ def create_face_masker_program() -> ArgumentParser: metavar = 'FACE_MASK_TYPES' ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'face_masker' ] ) capability_store.register_capability_set( [ @@ -492,7 +522,8 @@ def create_face_masker_program() -> ArgumentParser: metavar = 'FACE_MASK_AREAS' ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'face_masker' ] ) capability_store.register_capability_set( [ @@ -505,7 +536,8 @@ def create_face_masker_program() -> ArgumentParser: metavar = 'FACE_MASK_REGIONS' ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'face_masker' ] ) capability_store.register_capability_set( [ @@ -518,7 +550,8 @@ def create_face_masker_program() -> ArgumentParser: metavar = create_float_metavar(facefusion.choices.face_mask_blur_range) ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'face_masker' ] ) capability_store.register_capability_set( [ @@ -530,7 +563,8 @@ def create_face_masker_program() -> ArgumentParser: nargs = '+' ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'face_masker' ] ) return program @@ -549,7 +583,8 @@ def create_voice_extractor_program() -> ArgumentParser: choices = facefusion.choices.voice_extractor_models ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'voice_extractor' ] ) return program @@ -568,7 +603,8 @@ def create_frame_extraction_program() -> ArgumentParser: default = facefusion.config.get_int_value('frame_extraction', 'trim_frame_start') ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'frame_extraction' ] ) capability_store.register_capability_set( [ @@ -579,7 +615,8 @@ def create_frame_extraction_program() -> ArgumentParser: default = facefusion.config.get_int_value('frame_extraction', 'trim_frame_end') ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'frame_extraction' ] ) capability_store.register_capability_set( [ @@ -590,7 +627,8 @@ def create_frame_extraction_program() -> ArgumentParser: choices = facefusion.choices.temp_frame_formats ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'frame_extraction' ] ) return program @@ -611,7 +649,8 @@ def create_frame_distribution_program() -> ArgumentParser: metavar = create_int_metavar(facefusion.choices.target_frame_amount_range) ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'frame_distribution' ] ) return program @@ -633,7 +672,8 @@ def create_output_creation_program() -> ArgumentParser: metavar = create_int_metavar(facefusion.choices.output_image_quality_range) ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'output_creation' ] ) capability_store.register_capability_set( [ @@ -645,7 +685,8 @@ def create_output_creation_program() -> ArgumentParser: choices = facefusion.choices.output_image_scale_range ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'output_creation' ] ) capability_store.register_capability_set( [ @@ -656,7 +697,8 @@ def create_output_creation_program() -> ArgumentParser: choices = available_encoder_set.get('audio') ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'output_creation' ] ) capability_store.register_capability_set( [ @@ -669,7 +711,8 @@ def create_output_creation_program() -> ArgumentParser: metavar = create_int_metavar(facefusion.choices.output_audio_quality_range) ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'output_creation' ] ) capability_store.register_capability_set( [ @@ -682,7 +725,8 @@ def create_output_creation_program() -> ArgumentParser: metavar = create_int_metavar(facefusion.choices.output_audio_volume_range) ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'output_creation' ] ) capability_store.register_capability_set( [ @@ -693,7 +737,8 @@ def create_output_creation_program() -> ArgumentParser: choices = available_encoder_set.get('video') ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'output_creation' ] ) capability_store.register_capability_set( [ @@ -704,7 +749,8 @@ def create_output_creation_program() -> ArgumentParser: choices = facefusion.choices.video_presets ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'output_creation' ] ) capability_store.register_capability_set( [ @@ -717,7 +763,8 @@ def create_output_creation_program() -> ArgumentParser: metavar = create_int_metavar(facefusion.choices.output_video_quality_range) ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'output_creation' ] ) capability_store.register_capability_set( [ @@ -729,7 +776,8 @@ def create_output_creation_program() -> ArgumentParser: choices = facefusion.choices.output_video_scale_range ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'output_creation' ] ) capability_store.register_capability_set( [ @@ -740,7 +788,8 @@ def create_output_creation_program() -> ArgumentParser: default = config.get_float_value('output_creation', 'output_video_fps') ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'output_creation' ] ) capability_store.register_capability_set( [ @@ -751,7 +800,8 @@ def create_output_creation_program() -> ArgumentParser: default = config.get_float_value('output_creation', 'output_audio_fps', '25.0') ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'output_creation' ] ) return program @@ -772,7 +822,8 @@ def create_processors_program() -> ArgumentParser: nargs = '+' ) ], - scopes = [ 'api', 'cli' ] + scopes = [ 'api', 'cli' ], + groups = [ 'processors' ] ) for processor_module in get_processors_modules(available_processors): @@ -796,7 +847,8 @@ def create_download_providers_program() -> ArgumentParser: metavar = 'DOWNLOAD_PROVIDERS' ) ], - scopes = [ 'cli', 'sys' ] + scopes = [ 'cli', 'sys' ], + groups = [ 'download' ] ) return program @@ -815,7 +867,8 @@ def create_download_scope_program() -> ArgumentParser: choices = facefusion.choices.download_scopes ) ], - scopes = [ 'cli', 'sys' ] + scopes = [ 'cli', 'sys' ], + groups = [ 'download' ] ) return program @@ -873,7 +926,8 @@ def create_api_program() -> ArgumentParser: choices = facefusion.choices.api_security_strategies ) ], - scopes = [ 'api' ] + scopes = [ 'api' ], + groups = [ 'api' ] ) return program @@ -895,7 +949,8 @@ def create_execution_program() -> ArgumentParser: metavar = 'EXECUTION_DEVICE_IDS' ) ], - scopes = [ 'cli', 'sys' ] + scopes = [ 'cli', 'sys' ], + groups = [ 'execution' ] ) capability_store.register_capability_set( [ @@ -908,7 +963,8 @@ def create_execution_program() -> ArgumentParser: metavar = 'EXECUTION_PROVIDERS' ) ], - scopes = [ 'cli', 'sys' ] + scopes = [ 'cli', 'sys' ], + groups = [ 'execution' ] ) capability_store.register_capability_set( [ @@ -921,7 +977,8 @@ def create_execution_program() -> ArgumentParser: metavar = create_int_metavar(facefusion.choices.execution_thread_count_range) ) ], - scopes = [ 'cli', 'sys' ] + scopes = [ 'cli', 'sys' ], + groups = [ 'execution' ] ) return program @@ -940,7 +997,8 @@ def create_memory_program() -> ArgumentParser: choices = facefusion.choices.video_memory_strategies ) ], - scopes = [ 'cli', 'sys' ] + scopes = [ 'cli', 'sys' ], + groups = [ 'memory' ] ) return program @@ -959,7 +1017,8 @@ def create_log_level_program() -> ArgumentParser: choices = facefusion.choices.log_levels ) ], - scopes = [ 'cli' ] + scopes = [ 'cli' ], + groups = [ 'misc' ] ) return program @@ -978,7 +1037,8 @@ def create_halt_on_error_program() -> ArgumentParser: default = config.get_bool_value('misc', 'halt_on_error') ) ], - scopes = [ 'cli' ] + scopes = [ 'cli' ], + groups = [ 'misc' ] ) return program diff --git a/facefusion/types.py b/facefusion/types.py index f06d1b0c..460ea5b3 100755 --- a/facefusion/types.py +++ b/facefusion/types.py @@ -135,11 +135,13 @@ Args : TypeAlias = Dict[str, Any] Choice : TypeAlias = Union[int | str] Scope : TypeAlias = Literal['api', 'cli', 'sys'] +Group : TypeAlias = str CapabilitySet = TypedDict('CapabilitySet', { 'default' : Any, - 'choices' : NotRequired[List[Choice]] + 'choices' : NotRequired[List[Choice]], + 'groups' : NotRequired[List[Group]] }) CapabilityStore = TypedDict('CapabilityStore', { @@ -147,6 +149,7 @@ CapabilityStore = TypedDict('CapabilityStore', 'cli' : Dict[str, CapabilitySet], 'sys' : Dict[str, CapabilitySet] }) +CapabilityGroup : TypeAlias = Dict[Group, Dict[str, CapabilitySet]] ProcessState = Literal['checking', 'processing', 'stopping', 'pending'] UpdateProgress : TypeAlias = Callable[[int], None] diff --git a/tests/test_api_capabilities.py b/tests/test_api_capabilities.py index a6c5dbfa..dbeec217 100644 --- a/tests/test_api_capabilities.py +++ b/tests/test_api_capabilities.py @@ -18,7 +18,8 @@ def before_all() -> None: nargs = '+' ) ], - scopes = [ 'api' ] + scopes = [ 'api' ], + groups = [ 'paths' ] ) capability_store.register_capability_set( [ @@ -28,7 +29,8 @@ def before_all() -> None: choices = [ 'mp4', 'mkv', 'webm' ] ) ], - scopes = [ 'api' ] + scopes = [ 'api' ], + groups = [ 'paths' ] ) @@ -55,5 +57,5 @@ def test_get_capabilities(test_client : TestClient) -> None: assert 'mp4' in capabilities_body.get('formats').get('video') - assert capabilities_body.get('arguments').get('source_paths').get('default') is None - assert capabilities_body.get('arguments').get('output_format').get('choices') == [ 'mp4', 'mkv', 'webm' ] + assert capabilities_body.get('arguments').get('paths').get('source_paths').get('default') is None + assert capabilities_body.get('arguments').get('paths').get('output_format').get('choices') == [ 'mp4', 'mkv', 'webm' ] diff --git a/tests/test_api_state.py b/tests/test_api_state.py index b1912353..5705f8c1 100644 --- a/tests/test_api_state.py +++ b/tests/test_api_state.py @@ -22,7 +22,8 @@ def before_all() -> None: nargs = '+' ) ], - scopes = [ 'api' ] + scopes = [ 'api' ], + groups = [ 'paths' ] ) capability_store.register_capability_set( [ @@ -30,7 +31,8 @@ def before_all() -> None: '--target-path' ) ], - scopes = [ 'api' ] + scopes = [ 'api' ], + groups = [ 'paths' ] ) capability_store.register_capability_set( [ @@ -39,7 +41,8 @@ def before_all() -> None: nargs = '+' ) ], - scopes = [ 'api' ] + scopes = [ 'api' ], + groups = [ 'paths' ] ) state_manager.init_item('execution_providers', [ 'cpu' ])