| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| import yaml |
| import logging |
| import uuid |
| from typing import Dict |
|
|
| from fastapi import FastAPI, BackgroundTasks, HTTPException |
|
|
| |
| import aduc_framework |
| from aduc_framework.types import GenerationState, PreProductionParams, ProductionParams |
|
|
| |
| logger = logging.getLogger(__name__) |
|
|
| |
| app = FastAPI( |
| title="ADUC-SDR Framework API", |
| description="API para orquestração de geração de vídeo coerente com IA.", |
| version="3.0.0" |
| ) |
|
|
| |
| |
| try: |
| with open("config.yaml", 'r') as f: config = yaml.safe_load(f) |
| WORKSPACE_DIR = config['application']['workspace_dir'] |
| |
| aduc = aduc_framework.create_aduc_instance(workspace_dir=WORKSPACE_DIR) |
| |
| logger.info("API FastAPI inicializada e conectada ao Aduc Framework.") |
| except Exception as e: |
| logger.critical(f"ERRO CRÍTICO durante a inicialização da API: {e}", exc_info=True) |
| |
| exit() |
|
|
| |
| |
| |
| tasks_state: Dict[str, GenerationState] = {} |
|
|
|
|
| |
|
|
| def run_production_in_background(task_id: str, params: ProductionParams): |
| """ |
| Função que executa a tarefa de produção demorada em segundo plano. |
| Ela opera na instância global 'aduc' para modificar seu estado interno. |
| """ |
| logger.info(f"Background task {task_id}: Iniciando produção de vídeo...") |
| try: |
| |
| _, _, final_state = aduc.task_produce_original_movie(params=params) |
| |
| |
| tasks_state[task_id] = final_state |
| logger.info(f"Background task {task_id}: Produção de vídeo concluída com sucesso.") |
| except Exception as e: |
| logger.error(f"Background task {task_id}: Falha na produção. Erro: {e}", exc_info=True) |
| |
|
|
|
|
| |
|
|
| @app.post("/v1/pre-production", response_model=GenerationState, tags=["Workflow"]) |
| async def start_pre_production(params: PreProductionParams): |
| """ |
| Inicia e executa a etapa de pré-produção (storyboard e keyframes). |
| |
| Esta é uma chamada síncrona, pois a pré-produção é relativamente rápida. |
| Ela retorna o estado de geração completo após a conclusão. |
| """ |
| logger.info(f"API: Recebida solicitação de pré-produção com prompt: '{params.prompt[:30]}...'") |
| try: |
| _, _, updated_state = aduc.task_pre_production(params=params) |
| return updated_state |
| except Exception as e: |
| logger.error(f"API: Erro na pré-produção: {e}", exc_info=True) |
| raise HTTPException(status_code=500, detail=f"Erro interno durante a pré-produção: {e}") |
|
|
| @app.post("/v1/production", status_code=202, tags=["Workflow"]) |
| async def start_production(params: ProductionParams, background_tasks: BackgroundTasks): |
| """ |
| Inicia a tarefa de produção de vídeo principal em segundo plano. |
| |
| Esta chamada retorna imediatamente com um `task_id`. Use o endpoint |
| `/v1/status/{task_id}` para verificar o progresso e obter o resultado final. |
| """ |
| task_id = str(uuid.uuid4()) |
| logger.info(f"API: Recebida solicitação de produção. Criando tarefa de background com ID: {task_id}") |
| |
| |
| tasks_state[task_id] = aduc.get_current_state() |
| |
| |
| background_tasks.add_task(run_production_in_background, task_id, params) |
| |
| return {"message": "Produção de vídeo iniciada em segundo plano.", "task_id": task_id} |
|
|
| @app.get("/v1/status/{task_id}", response_model=GenerationState, tags=["Workflow"]) |
| async def get_task_status(task_id: str): |
| """ |
| Verifica o estado de uma tarefa de geração em andamento ou concluída. |
| """ |
| logger.info(f"API: Verificando status da tarefa {task_id}") |
| state = tasks_state.get(task_id) |
| if not state: |
| raise HTTPException(status_code=404, detail="ID de tarefa não encontrado.") |
| |
| |
| return state |
|
|
| @app.get("/health", tags=["Infra"]) |
| async def health_check(): |
| """ |
| Endpoint simples para verificar se a API está online. |
| """ |
| return {"status": "ok"} |