# AI_CHANGELOG # - 2026-03-29 | Prompt: DWS_TASK_ENGINE ETL 任务 | 新建文件。 # 提供 POST /api/internal/run-job 端点,供 ETL 按 job_name 执行 # biz.trigger_jobs 中的任务。Internal-Token 认证。 # -*- coding: utf-8 -*- """ 内部任务执行 API — ETL/内部服务调用入口。 端点: - POST /api/internal/run-job — 按 job_name 执行 biz.trigger_jobs 中的任务 认证方式:Authorization: Internal-Token {token} """ from __future__ import annotations import logging from fastapi import APIRouter, Depends, HTTPException, status from pydantic import BaseModel, Field from app.auth.internal_token import verify_internal_token logger = logging.getLogger(__name__) router = APIRouter(prefix="/api/internal", tags=["internal-events"]) class RunJobByNameRequest(BaseModel): """按 job_name 执行任务的请求体。""" job_name: str = Field(..., description="任务名称,如 recall_completion_check") class RunJobByNameResponse(BaseModel): """执行结果。""" success: bool message: str job_name: str @router.post("/run-job", response_model=RunJobByNameResponse) async def run_job_by_name_endpoint( body: RunJobByNameRequest, _token: str = Depends(verify_internal_token), ) -> RunJobByNameResponse: """按 job_name 查找并执行 biz.trigger_jobs 中的任务。 ETL DWS_TASK_ENGINE 任务通过此端点按顺序执行后端任务引擎的各个步骤。 """ from app.database import get_connection from app.services.trigger_scheduler import run_job_by_id conn = get_connection() try: with conn.cursor() as cur: cur.execute( "SELECT id FROM biz.trigger_jobs WHERE job_name = %s", (body.job_name,), ) row = cur.fetchone() conn.commit() finally: conn.close() if not row: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail=f"任务 '{body.job_name}' 不存在", ) job_id = row[0] result = run_job_by_id(job_id) logger.info( "内部任务执行: job_name=%s, success=%s", body.job_name, result.get("success"), ) return RunJobByNameResponse( success=result.get("success", False), message=result.get("message", ""), job_name=body.job_name, )