모델 동시 쿨다운 실패 재발 방지 정책
작성일: 2026-08-17 작성자: Cowork (아키텍처 검토) 상태: 제안 — 해리 승인 후 codex 구현
[권고]
1순위: 크론 등급 분리 + LLM-free 운영 크론 식별 → telegram-outbox-flusher(*/2)를 포함한 운영성 고빈도 크론 중 LLM 호출이 실제로 필요 없는 태스크를 no_agent=True 또는 경량 스크립트 모드로 전환. 현재 매 2분마다 실행되는 outbox-flusher가 LLM 할당량을 소비하고 있다면 이것 하나만 정리해도 07:00-08:00 KST 피크 요청 수가 30% 이상 감소 추정. 기대효과: 피크 시간대 LLM 호출 수 -30건/시간, 429 발생 빈도 절반 이하.
2순위: 글로벌 동시 LLM 호출 세마포어 도입 → agent_queue_worker.py의 _call_llm_with_guardrails 진입 전에 프로세스-전역 Semaphore(value=3)를 걸어 동시 LLM 호출 수를 최대 3개로 제한. 현재는 에이전트 6개가 동시에 429를 받아 _MODEL_COOLDOWN_UNTIL에 동일 모델을 동시에 기록 → 모든 에이전트가 함께 쿨다운에 빠지는 구조적 취약점 해소. 기대효과: 동시 실패 6건 → 0건 (순차 대기 후 처리).
3순위: 분석 에이전트와 운영 에이전트의 모델 체인 분리 → agent_registry.py에서 AGENT_MODEL_MAP을 2-tier로 재편. 분석(analyst-*, cowork, data-analyst): 현행 PREMIUM_MODEL_CHAIN 유지. 운영(codex, orchestrator, telegram-outbox-flusher 포함 운영 크론): 용량이 낮고 비용이 작은 모델(예: claude-haiku-3.6 또는 gpt-4o-mini)을 우선 체인으로 지정. 이렇게 하면 claude-sonnet-4-6 토큰 소비를 분석 작업에만 집중시킬 수 있음. 기대효과: sonnet-4-6 시간당 요청 수 -40%, 429 임계 도달 여유 확보.
[현황]
실패 발생 시각: 2026-08-17 07:32 ~ 08:09 KST (37분 구간) 실패 패턴: HTTP 429 Rate-Limit (Anthropic API) → _MODEL_COOLDOWN_UNTIL 기록 → eligible_models=[] → 백오프 30s+60s+120s 소진 → 즉시 실패 처리
관련 에러 로그 (errors.log): - req_011Ce7GEjuhyNNVPwuniMPrD 08:04:20 KST - req_011Ce7GKAtEkG4ehWx3MC97L 08:05:20 KST - req_011Ce7GPbhbRiJg5b4rgxn4t 08:06:20 KST - req_011Ce7GYUMKxDQY6R5gSm4vk 08:08:21 KST - req_011Ce7GdQ8TwECZg6CXpVczH 08:09:28 KST 발화 에이전트: telegram-outbox-flusher (4건), research-broker-retry-0600 (2건 이상)
07:00-08:00 KST 활성 크론 수: 71개 중 15개 이상이 이 구간에 집중 - telegram-outbox-flusher: /2 분 (30회/시간) — 최고빈도 - research-broker-retry-0600: /5 6-8 (12회/2시간) - fi-earnings-refresh: 0,30 7-9 (평일) - market-indicator-tracker, daily-heartbeat, morning-calendar-notify, com.openclaw.cold-alert, 해외채권 모닝 브리핑, claude-token-daily-report, research-brief-daily-0730, 해외채권 데스크 할 일 알림, com.openclaw.kpi-daily, analyst-channel-collector, HMIG morning monitor
쿨다운 코드 구조 (agent_queue_worker.py): - _MODEL_COOLDOWN_UNTIL: 프로세스 전역 딕셔너리 — 한 에이전트의 429가 동일 프로세스 내 모든 에이전트의 해당 모델 접근을 차단 - _eligible_model_chain(): 쿨다운 중인 모델 제외, 후보 없으면 빈 리스트 반환 - _call_llm_with_guardrails(): 백오프 30s→60s→120s (최대 3회), 소진 시 실패 - 현재 모든 에이전트가 동일 체인 [openai-codex/gpt-5.5 → anthropic/claude-sonnet-4-6] 공유
모델 체인 현황 (agent_registry.py): - DEFAULT_MODEL_CHAIN → codex, analyst-fundamental, analyst-macro 사용 - PREMIUM_MODEL_CHAIN → cowork, analyst-technical 사용 - 체인 후보가 2개뿐 → 둘 다 쿨다운 시 즉시 전멸
[리스크]
구조적 위험 1 — 단일 모델 체인 의존 원인: 전체 에이전트가 동일 Anthropic 계정의 claude-sonnet-4-6에 집중. 한 모델에 429가 발생하면 쿨다운이 프로세스 전역으로 전파되어 관련 없는 다른 에이전트까지 연쇄 실패하는 도미노 구조. fallback_providers: [] (config.yaml) — 폴백 프로바이더가 없음.
구조적 위험 2 — 고빈도 운영 크론의 LLM 소비 원인: telegram-outbox-flusher(*/2)가 메시지 전송 목적임에도 LLM 호출을 유발할 경우 시간당 30회 × LLM 호출 = 분석 에이전트보다 많은 토큰 소비 가능. 운영 목적 크론이 분석 목적 에이전트의 할당량을 선점하는 역전 현상.
구조적 위험 3 — 백오프 블로킹 원인: _call_llm_with_guardrails의 현재 백오프(30s+60s+120s = 최대 210s 블로킹)가 큐 워커 스레드를 점유. 여러 에이전트가 동시에 백오프 상태에 빠지면 워커풀 전체가 sleep 상태가 되어 신규 태스크도 처리하지 못하는 스레드 기아 발생 가능.
구조적 위험 4 — 06:00-08:30 KST 피크 집중 원인: 조선/에너지/채권 리포트 + 외사 브로커 수집이 모두 장전 시간(개장 전)에 집중. 이 구간에 에이전트 3개 이상이 동시에 LLM을 호출하면 즉시 429 임계 도달. 현재 크론 71개 중 15개 이상이 07:00-08:00에 몰려 있어 피크 해소 없이 근본 개선 불가.
[검증방법]
개선안 1 (LLM-free 전환) 성공 기준: - telegram-outbox-flusher 실행 로그에서 LLM 호출 흔적 없음 - errors.log에 해당 크론 이름의 429 항목 0건 (7일 연속) - 롤백 조건: 메시지 전송 누락 발생 시 no_agent 모드 해제 후 롤백
개선안 2 (세마포어) 성공 기준: - 측정 지표: 07:00-08:00 KST 구간 동시 LLM 호출 수 ≤ 3 (로그에서 confirmed_model 개수 카운트) - 검증 명령: grep "confirmed_model" ~/.hermes/logs/agent.log | awk '{print $1}' | sort | uniq -c - 기대값: 60분 구간에서 동시 호출 동시성이 3을 초과하는 초가 0 - 롤백 조건: 태스크 평균 대기 시간이 세마포어 도입 전 대비 2배 이상 증가 시
개선안 3 (모델 체인 분리) 성공 기준: - 측정 지표: claude-sonnet-4-6 시간당 요청 수 도입 전 대비 -40% 이상 - 검증 명령: grep "confirmed_model=anthropic/claude-sonnet" ~/.hermes/logs/agent.log | wc -l (1시간 슬라이딩) - 기대값: 피크 구간 sonnet 호출 수 ≤ 시간당 20회 (이전 추정 40+ 회 대비) - 롤백 조건: 운영 에이전트의 경량 모델 오류율이 10% 초과 시 DEFAULT_MODEL_CHAIN 복원
전체 개선 통합 기준: - "all candidate models are cooling down" 오류 14일 연속 0건 - 07:00-08:30 KST 구간 에이전트 실패율 ≤ 2% (현재 이번 사이클 6/6 = 100%) - 분석 에이전트(analyst-*, cowork) 성공률 ≥ 95% 유지
실행 위임
구현 작업은 codex에 위임한다. 변경 범위: - agent_queue_worker.py: Semaphore 추가 (10줄 이내 변경) - agent_registry.py: 운영 에이전트 모델 체인 재편 (LIGHT_MODEL_CHAIN 추가) - jobs.json: telegram-outbox-flusher no_agent 여부 확인 + LLM 제거 가능 여부 판단 - 코드 변경 전 해리 최종 승인 필요 (크론 설정 변경 해당)