GET /ai/admin/recruit-agent/campaign/{collabNo}/progress
캠페인 모집 진행 상태 폴링
모집 진행 상태 조회
진행바·"모집 중…" 표시용. 실행 상태 / 이번 실행 확보 인원 / 최근 iteration을 반환합니다.
2026-07-08 변경: 응답 생성이 에이전트 프록시에서 백엔드 직접 조회(에이전트 PG)로 전환됐습니다.
스키마는 기존과 동일하되 ①collected(이번 실행 확보 인원, 아래 참조) 추가 ②rankings_stored(캠페인
역대 누적치 — 진행 표시 오염원) 제거. 진행률 계산 필드는 제공하지 않습니다(계산은 프론트 몫).
HTTP 요청
GET /ai/admin/recruit-agent/campaign/{collabNo}/progress
Authorization: Bearer {access_token}응답 (200 OK)
running 예시 (2026-07-07 실측):
{
"status": 200,
"code": null,
"message": "진행 상태 조회 완료",
"data": {
"campaign_id": 3115,
"run_id": "9d0d115c",
"started_at": "2026-07-07 03:16:06.460851",
"status": "running",
"params": { "existing_target": 20, "new_target": 80, "api_budget": 50, "min_followers": 5000 },
"collected": { "existing": 0, "new": 1, "total": 1 },
"recent_iterations": [
{ "iteration": 1, "discovered": 7, "passed": 1, "decision": "need_more" },
{ "iteration": 0, "discovered": 0, "passed": 0, "decision": "run_started" }
]
}
}completed 예시:
{
"data": {
"campaign_id": 3127,
"run_id": "9b43dbc3",
"started_at": "2026-07-07 09:28:26.435178",
"params": { "existing_target": 1, "new_target": 1, "api_budget": 50, "min_followers": 5000 },
"status": "completed",
"stored_count": 12,
"error": null,
"finished_at": "2026-07-07 11:49:30.541331",
"elapsed_sec": 8464,
"collected": { "existing": 0, "new": 12, "total": 12 },
"result": { "existing_fit": 0, "newly_found": 12, "total_candidates": 12, "iterations": 1 },
"recent_iterations": [ "..." ]
}
}result는 완료 시 항상 내려갑니다 — 기존 프록시는 에이전트 프로세스 메모리가 살아있을 때만
제공(Job 모드 누락)했지만, 직접 조회는 DB에서 재구성하므로 누락이 없습니다.
collected — 이번 실행 확보 인원 (진행 표시는 이 값 사용)
| 필드 | 의미 |
|---|---|
existing | 기존 풀(글로우비) 크리에이터 확보 수 — 실행 중에는 집계가 없어 0, 완료 후 정확값 |
new | 인스타그램 추천(신규 발굴) 확보 수 — 실행 중 실시간 누적, 완료 후 저장분 기준 정본 |
total | existing + new 합산 |
rankings_stored는 제거됐습니다 — 캠페인 역대 실행 누적치라 새 실행 시작 직후에도 과거 값이
그대로 잡혀 "시작하자마자 99%" 오표시의 원인이었습니다. 수집 인원 표시는 collected만 사용하세요
(candidates API의 totalCount도 같은 누적치이므로 진행 표시에 쓰면 안 됩니다).
params는 running 시작 시점(iteration 0)부터 항상 포함됩니다 (2026-07-07 에이전트 반영).
목표 인원 키는 모집 시작 응답과 동일한 existing_target(글로우비 풀) + new_target(인스타그램 후보군) 분리형입니다 —
구키 target_count(단일형)는 07-01 개편으로 폐기됐습니다.
진행률 계산 (프론트 가이드)
- 수집 인원 =
collected.total(또는 신규만이면collected.new), 목표 =params.existing_target + new_target— 진행률은 프론트에서 계산 recent_iterations는 진행 로그 표시용 참고:decision값 =run_started(시작) /in_progress(발굴 중간 기록 — 해시태그 단위) /need_more(한 바퀴 완료, 계속) /goal_reached(목표 달성) /stalled(풀 소진 종료) /run_completed(완료). 행의passed는 run 내 누적,discovered는 행 종류에 따라 단위가 달라(중간 기록=원시 탐색 풀) 표시용으로 부적합 — 인원 표시는collected만 사용- 참고 소요: 신규 발굴 1 iteration ≈ 1시간 내외.
new_target: 0(글로우비 풀만)이면 수 분 내 완료
data.status 폴링 처리
| status | 의미 | 처리 |
|---|---|---|
not_started | 모집 이력 없음 | — |
running | 진행 중 | 계속 폴링 (params+recent_iterations로 진행률 표시) |
completed | 완료 | 폴링 종료 → rankings/candidates 조회 |
failed | 실패 | 폴링 종료 → error 표시 |
result·elapsed_sec는 완료 단계부터 채워집니다. 완료 판정은 status로 하세요.
running인데 시작 후 2시간 동안 완료 이벤트가 없으면 죽은 실행으로 간주되어 재트리거가 허용됩니다(stale 가드).