first piece for /jobs endpoint part7

This commit is contained in:
henryruhs
2026-08-24 09:11:22 +02:00
parent 830deb69c9
commit 1bae62ad26
5 changed files with 59 additions and 37 deletions
+29 -29
View File
@@ -33,35 +33,35 @@ def pre_check() -> bool:
def create_api() -> Starlette:
session_guard = Middleware(create_session_guard)
routes =\
[
Route('/session', create_session, methods = [ 'POST' ]),
Route('/session', get_session, methods = [ 'GET' ], middleware = [ session_guard ]),
Route('/session', refresh_session, methods = [ 'PUT' ]),
Route('/session', destroy_session, methods = [ 'DELETE' ], middleware = [ session_guard ]),
Route('/state', get_state, methods = [ 'GET' ], middleware = [ session_guard ]),
Route('/state', set_state, methods = [ 'PUT' ], middleware = [ session_guard ]),
Route('/assets', get_assets, methods = [ 'GET' ], middleware = [ session_guard ]),
Route('/assets', upload_asset, methods = [ 'POST' ], middleware = [ session_guard ]),
Route('/assets/{asset_id}', get_asset, methods = [ 'GET' ], middleware = [ session_guard ]),
Route('/assets', delete_assets, methods = [ 'DELETE' ], middleware = [ session_guard ]),
Route('/capabilities', get_capabilities, methods = [ 'GET' ]),
Route('/metrics', get_metrics, methods = [ 'GET' ], middleware = [ session_guard ]),
Route('/stream', post_stream, methods = [ 'POST' ], middleware = [ session_guard ]),
Route('/stream', delete_stream, methods = [ 'DELETE' ], name = 'delete_stream', middleware = [ session_guard ]),
Route('/jobs', get_jobs, methods = [ 'GET' ], middleware = [ session_guard ]),
Route('/jobs', create_job, methods = [ 'POST' ], middleware = [ session_guard ]),
Route('/jobs', update_jobs, methods = [ 'PATCH' ], middleware = [ session_guard ]),
Route('/jobs', delete_jobs, methods = [ 'DELETE' ], middleware = [ session_guard ]),
Route('/jobs/{job_id}', get_job, methods = [ 'GET' ], middleware = [ session_guard ]),
Route('/jobs/{job_id}', create_step, methods = [ 'POST' ], middleware = [ session_guard ]),
Route('/jobs/{job_id}', update_job, methods = [ 'PATCH' ], middleware = [ session_guard ]),
Route('/jobs/{job_id}', delete_job, methods = [ 'DELETE' ], middleware = [ session_guard ]),
Route('/jobs/{job_id}/{step_index:int}', create_step, methods = [ 'POST' ], middleware = [ session_guard ]),
Route('/jobs/{job_id}/{step_index:int}', delete_step, methods = [ 'DELETE' ], middleware = [ session_guard ]),
WebSocketRoute('/metrics', websocket_metrics, middleware = [ session_guard ]),
WebSocketRoute('/ping', websocket_ping, middleware = [ session_guard ]),
WebSocketRoute('/stream', websocket_stream, middleware = [ session_guard ])
]
[
Route('/session', create_session, methods = [ 'POST' ]),
Route('/session', get_session, methods = [ 'GET' ], middleware = [ session_guard ]),
Route('/session', refresh_session, methods = [ 'PUT' ]),
Route('/session', destroy_session, methods = [ 'DELETE' ], middleware = [ session_guard ]),
Route('/state', get_state, methods = [ 'GET' ], middleware = [ session_guard ]),
Route('/state', set_state, methods = [ 'PUT' ], middleware = [ session_guard ]),
Route('/assets', get_assets, methods = [ 'GET' ], middleware = [ session_guard ]),
Route('/assets', upload_asset, methods = [ 'POST' ], middleware = [ session_guard ]),
Route('/assets/{asset_id}', get_asset, methods = [ 'GET' ], middleware = [ session_guard ]),
Route('/assets', delete_assets, methods = [ 'DELETE' ], middleware = [ session_guard ]),
Route('/capabilities', get_capabilities, methods = [ 'GET' ]),
Route('/metrics', get_metrics, methods = [ 'GET' ], middleware = [ session_guard ]),
Route('/stream', post_stream, methods = [ 'POST' ], middleware = [ session_guard ]),
Route('/stream', delete_stream, methods = [ 'DELETE' ], name = 'delete_stream', middleware = [ session_guard ]),
Route('/jobs', get_jobs, methods = [ 'GET' ], middleware = [ session_guard ]),
Route('/jobs', create_job, methods = [ 'POST' ], middleware = [ session_guard ]),
Route('/jobs', update_jobs, methods = [ 'PATCH' ], middleware = [ session_guard ]),
Route('/jobs', delete_jobs, methods = [ 'DELETE' ], middleware = [ session_guard ]),
Route('/jobs/{job_id}', get_job, methods = [ 'GET' ], middleware = [ session_guard ]),
Route('/jobs/{job_id}', create_step, methods = [ 'POST' ], middleware = [ session_guard ]),
Route('/jobs/{job_id}', update_job, methods = [ 'PATCH' ], middleware = [ session_guard ]),
Route('/jobs/{job_id}', delete_job, methods = [ 'DELETE' ], middleware = [ session_guard ]),
Route('/jobs/{job_id}/{step_index:int}', create_step, methods = [ 'POST' ], middleware = [ session_guard ]),
Route('/jobs/{job_id}/{step_index:int}', delete_step, methods = [ 'DELETE' ], middleware = [ session_guard ]),
WebSocketRoute('/metrics', websocket_metrics, middleware = [ session_guard ]),
WebSocketRoute('/ping', websocket_ping, middleware = [ session_guard ]),
WebSocketRoute('/stream', websocket_stream, middleware = [ session_guard ])
]
api = Starlette(routes = routes)
api.add_middleware(CORSMiddleware, allow_origins = [ '*' ], allow_methods = [ '*' ], allow_headers = [ '*' ])
+2 -2
View File
@@ -7,7 +7,7 @@ from starlette.status import HTTP_200_OK, HTTP_201_CREATED, HTTP_202_ACCEPTED, H
import facefusion.choices
import facefusion.core
from facefusion import state_manager, translator
from facefusion import args_helper, state_manager, translator
from facefusion.jobs import job_helper, job_manager, job_runner
@@ -189,7 +189,7 @@ async def create_step(request : Request) -> JSONResponse:
job_id = request.path_params.get('job_id')
step_index = request.path_params.get('step_index')
action = request.query_params.get('action')
step_args = await request.json()
step_args = args_helper.filter_api_step_args(await request.json())
if action == 'add':
if job_manager.add_step(job_id, step_args):
+9 -1
View File
@@ -123,7 +123,15 @@ def extract_step_args(state : Union[State, ProcessorState]) -> Args:
return step_args
def filter_step_args(args : Args) -> Args:
def filter_api_step_args(args : Args) -> Args:
step_args =\
{
key: args.get(key) for key in args if key in get_api_arguments() and key not in get_sys_arguments()
}
return step_args
def filter_cli_step_args(args : Args) -> Args:
step_args =\
{
key: args.get(key) for key in args if key in get_cli_arguments() and key not in get_sys_arguments()
+5 -5
View File
@@ -182,7 +182,7 @@ def route_job_manager(args : Args) -> ErrorCode:
return 1
if state_manager.get_item('command') == 'job-add-step':
step_args = args_helper.filter_step_args(args)
step_args = args_helper.filter_cli_step_args(args)
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__)
@@ -191,7 +191,7 @@ def route_job_manager(args : Args) -> ErrorCode:
return 1
if state_manager.get_item('command') == 'job-remix-step':
step_args = args_helper.filter_step_args(args)
step_args = args_helper.filter_cli_step_args(args)
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__)
@@ -200,7 +200,7 @@ def route_job_manager(args : Args) -> ErrorCode:
return 1
if state_manager.get_item('command') == 'job-insert-step':
step_args = args_helper.filter_step_args(args)
step_args = args_helper.filter_cli_step_args(args)
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__)
@@ -254,7 +254,7 @@ def route_job_runner() -> ErrorCode:
def process_headless(args : Args) -> ErrorCode:
job_id = job_helper.suggest_job_id('headless')
step_args = args_helper.filter_step_args(args)
step_args = args_helper.filter_cli_step_args(args)
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
@@ -263,7 +263,7 @@ def process_headless(args : Args) -> ErrorCode:
def process_batch(args : Args) -> ErrorCode:
job_id = job_helper.suggest_job_id('batch')
step_args = args_helper.filter_step_args(args)
step_args = args_helper.filter_cli_step_args(args)
source_paths = resolve_file_pattern(step_args.get('source_pattern'))
target_paths = resolve_file_pattern(step_args.get('target_pattern'))
+14
View File
@@ -7,9 +7,15 @@ from starlette.testclient import TestClient
from facefusion import metadata, session_manager
from facefusion.apis.core import create_api
from facefusion.jobs.job_manager import clear_jobs, count_step_total, create_job, find_job_ids, init_jobs
from facefusion.program import create_program
from .assert_helper import get_test_jobs_directory
@pytest.fixture(scope = 'module', autouse = True)
def before_all() -> None:
create_program()
@pytest.fixture(scope = 'function', autouse = True)
def before_each() -> None:
session_manager.SESSIONS.clear()
@@ -447,6 +453,14 @@ def test_create_step(test_client : TestClient) -> None:
assert count_step_total('job-test-create-step') == 1
assert create_step_response.status_code == 201
get_job_response = test_client.get('/jobs/job-test-create-step', headers =
{
'Authorization': 'Bearer ' + access_token
})
get_job_body = get_job_response.json()
assert get_job_body.get('steps')[0].get('args') == { 'processors': [ 'face_swapper' ] }
create_step_response = test_client.post('/jobs/job-test-create-step/0?action=insert', headers =
{
'Authorization': 'Bearer ' + access_token