From 8098865ed5e4814f829599bec98a542a28354eb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=A1=EC=84=B1=ED=98=B8?= Date: Thu, 4 Jun 2026 07:35:17 +0900 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20=EC=9B=B9=ED=9B=85=20=EB=B2=84?= =?UTF-8?q?=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/services/roadmap_assess.py | 8 ++++---- app/services/webhook.py | 22 ++++++++++++++++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/app/services/roadmap_assess.py b/app/services/roadmap_assess.py index 6ca665f..a141c20 100644 --- a/app/services/roadmap_assess.py +++ b/app/services/roadmap_assess.py @@ -10,7 +10,7 @@ from app.services.roadmap_merger import run_merged from app.services._rag_utils import _fetch_code_analysis as _fetch_project from app.jobs.store import update_job -from app.services.webhook import notify_be +from app.services.webhook import notify_be_roadmap logger = logging.getLogger(__name__) @@ -135,7 +135,7 @@ def _with_tier(node: dict) -> dict: } -def run_assess_task( +async def run_assess_task( job_id: str, ai_job_id: str, code_analysis_urls: list[str], @@ -185,7 +185,7 @@ def run_assess_task( update_job(job_id, status="done", result=results) try: - notify_be(ai_job_id=ai_job_id, result=results) + await notify_be_roadmap(ai_job_id=ai_job_id, result=results) except Exception as webhook_err: logger.warning("[Webhook] 콜백 실패 (결과는 저장됨): %s", webhook_err) @@ -193,6 +193,6 @@ def run_assess_task( update_job(job_id, status="failed", message=str(e)) logger.error("[로드맵] 평가 태스크 실패: %s", e) try: - notify_be(ai_job_id=ai_job_id, error_message=str(e)) + await notify_be_roadmap(ai_job_id=ai_job_id, error_message=str(e)) except Exception as webhook_err: logger.warning("[Webhook] 콜백 실패: %s", webhook_err) diff --git a/app/services/webhook.py b/app/services/webhook.py index 9da22f7..f1f5ea1 100644 --- a/app/services/webhook.py +++ b/app/services/webhook.py @@ -29,3 +29,25 @@ async def notify_be( resp = await client.post(be_url, json=payload, headers=headers) resp.raise_for_status() logger.info("[Webhook] 전송 완료: %s", ai_job_id) + + +async def notify_be_roadmap( + ai_job_id: str, + result: list | None = None, + error_message: str | None = None, +) -> None: + settings = get_settings() + status = "DONE" if result is not None else "ERROR" + payload = { + "ai_job_id": ai_job_id, + "status": status, + "result": result, + "error_message": error_message, + } + be_url = f"{settings.be_base_url}/api/v1/ai/roadmap/complete" + headers = {"X-INTERNAL-API-KEY": settings.passfolio_internal_api_key} + logger.info("[Webhook] POST %s | status=%s | job=%s", be_url, status, ai_job_id) + async with httpx.AsyncClient(timeout=10.0) as client: + resp = await client.post(be_url, json=payload, headers=headers) + resp.raise_for_status() + logger.info("[Webhook] 로드맵 콜백 완료: %s", ai_job_id) From 0adacac009c28d0bb6b7db85facee39111ad59bc Mon Sep 17 00:00:00 2001 From: Hooby Date: Thu, 4 Jun 2026 09:40:01 +0900 Subject: [PATCH 2/2] =?UTF-8?q?fix(roadmap):=20run=5Fassess=5Ftask?= =?UTF-8?q?=EA=B0=80=20notify=5Fbe=5Froadmap=EC=9D=84=20=ED=98=B8=EC=B6=9C?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit webhook.notify_be_roadmap(/roadmap/complete, result 포함)은 이미 추가돼 있었으나 run_assess_task가 여전히 공용 notify_be(/jobs/complete, result 없음·항상 ERROR)를 호출하고 있어 로드맵 결과가 BE로 전달되지 않았다. 연결만 수정: - import notify_be → notify_be_roadmap - finally: notify_be_roadmap(ai_job_id, result=results, error_message) 호출 (성공 시 result, 실패 시 None→ERROR) 공용 notify_be(pdf_pipeline)는 무변경. Co-Authored-By: Claude Opus 4.8 (1M context) --- app/services/roadmap_assess.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/app/services/roadmap_assess.py b/app/services/roadmap_assess.py index 2a37dc6..3eb0bed 100644 --- a/app/services/roadmap_assess.py +++ b/app/services/roadmap_assess.py @@ -11,7 +11,7 @@ from app.services.roadmap import rule_filter, llm_analyzer, market_tier, market_loader from app.services.roadmap_merger import run_merged from app.services._rag_utils import _fetch_code_analysis as _fetch_project -from app.services.webhook import notify_be +from app.services.webhook import notify_be_roadmap from app.jobs.store import JobStatus, update_job logger = logging.getLogger(__name__) @@ -197,7 +197,9 @@ def _run() -> list[dict[str, Any]]: logger.error("[로드맵] 평가 태스크 실패: %s", e) update_job(job_id, JobStatus.ERROR, message=error_message) finally: + # 로드맵은 PDF가 없으므로 공용 notify_be(/jobs/complete) 대신 result를 싣는 + # notify_be_roadmap(/roadmap/complete)으로 콜백한다(성공 시 result, 실패 시 None→ERROR). try: - await notify_be(ai_job_id=ai_job_id, output_pdf_url=None, error_message=error_message) + await notify_be_roadmap(ai_job_id=ai_job_id, result=results, error_message=error_message) except Exception as webhook_err: - logger.warning("[Webhook] 콜백 실패 (결과는 저장됨): %s", webhook_err) + logger.warning("[Webhook] 로드맵 콜백 실패 (결과는 저장됨): %s", webhook_err)