[라우팅] 무료 모델 rate limit 막는 기간 기본값 #14
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
3b0cea80 남은 관찰 — 무료 모델 rate limit 회로가 1분마다 다시 열린다(7개 이상). 68068926 §9.6 이 「기간 규칙은 후속」으로 남겼고 지금은 감시 30분 규칙이 대신한다. 되돌릴 수 있는 기본값이라 운영 세션이 정해 넣는다(예: 분당 한도 오류 → 다음 분, 일 한도 → UTC 자정). 릴리즈 뒤. order projects/260926_Kandev/_Prj_Work/p300_orders/2610040300_order_followup-omissions-1004.md
R1 배포 후 검증(10-04 12:1x~): DevPass 「Dev Plan credit limit reached … wait for renewal on 10/…」 가 quota_limited(opencode.stderr.credit.v1)로 분류되지만 계정 막힘이 1분(strikes 1)씩만 걸려 매분 다시 시도된다(credential:profile:d4dcac99·9638edc0). Go 모델 막힘은 공급자 사용량 기준 10-05 09:00 KST 로 정확. 할 일에 「크레딧 소진은 문면의 갱신일(또는 provider-limits 의 block_until)까지 막기」를 더한다. 10-04 05시 소유자 「미리 하면 속도에 도움되는 것들은 … R2 배포에서 처리되도록」 → R2 로 옮겨 처리.
10-04 13:0x 소유자 「DevPass 도 사용량 과 리셋시간 조회 되지 않아? 왜 매 분 다시 시도 되는 거야?」 확인: DevPass 사용량은 공급자 API(/v1/key)로 읽힌다(monthly 100.0%·limit_reached, plan max) — 그러나 이 API 는 주간 프리미엄 리셋만 주고 월간 크레딧 갱신일을 주지 않아(client_llmgateway.go 주석) 막을 기한을 모르고 계정 회로가 1분씩 열렸다 닫히며 매분 재시도. 오류 문면의 갱신일 「renewal on 10/7/2026」은 Kandev 정제(sanitize)가 경로로 오인해 「10[path-redacted]」로 지워 읽을 수도 없다. 조치(운영 세션): Kandev 설정 「공급자 한도」 llmgateway 월간 리셋·유료 모델 막기 = 2026-10-07 23:20 KST 입력(소유자 10-03 콘솔 확인값, dynamic_provider_limits 행 확인). 코드 할 일: ① 사용량이 limit_reached 인데 리셋 시각이 없으면 그 공급자 유료 후보를 「갱신일 미상 — 소진」으로 계속 빼고, 짧은 회로 대신 공급자 한도 설정·문면 갱신일을 쓴다 ② 날짜(10/7/2026 등)를 경로로 지우지 않게 정제 규칙 조정 또는 원문에서 갱신일을 먼저 읽는다.
10-04 13:1x 소유자 「리셋 시각을 모를 때는 몇회 반복하면서 차단 주기를 늘려가기로 하지 않았었어?」 — 맞다(10-03 소유자 규칙: 2시간×3 → 24시간 → 월간 리셋, 모르면 24시간 반복; 감시 스크립트 LIMIT_BACKOFF·credit 6h·free_daily UTC 0시도 같은 취지). 확인: #53 apps/backend/internal/agent/runtime/dynamic/suspension_policy.go 의 사다리 openCodeGoLadder 가 policyForModel 에서 opencode-go 에만 붙고, 그 밖의 유료 공급자(llmgateway=DevPass, openrouter 유료, modal 등)는 「every other failure keeps the standard short backoff」로 circuitBackoff(1분)만 쓴다. ExhaustedUntil(사용량 창 소진) 연장도 사다리 있는 공급자에서만 탄다. DevPass 는 계정 하나를 프로필 6개가 같이 쓰는데 회로 키가 credential:profile:<프로필> 이라 strikes 가 프로필마다 1 에 머문다. 고칠 것: ① 리셋 미상 사용량 한도는 공급자 구분 없이 사다리 적용(유료: 2h×3→24h→월간 리셋/24h 반복, 무료 일 한도: 다음 UTC 0시, rate limit: 짧게 시작해 늘림) ② 사용량 창 limit_reached·공급자 한도 설정(dynamic_provider_limits)을 모든 공급자에 반영 ③ 같은 계정(같은 API 키)을 쓰는 프로필은 회로·strikes 를 계정 단위로 묶는다 ④ 오류 문면 날짜(10/7/2026)를 정제가 경로로 지우지 않게. R2.
10-04 13:2x 소유자 「무료 모델들의 경우 가장 짧은 주기 차단이 얼마이지? 처음부터 2시간 차단은 너무 긴가?」 — 지금 무료 모델은 사다리 없이 circuitBackoff 1분(engine.go:1583). 실측(로그 10-02~04, 모델 실제 적용 기준): muse-spark 무료 한도 실패 228·정상 턴 26, 막힌 뒤 다시 정상까지 225분(마지막 실패→성공 101분), big-pickle 170분, longcat·mimo 무료는 기록 안에서 회복 없음 — Zen 무료 rate limit 은 수 시간짜리로 보이나 회복 표본이 모델마다 1건. 운영 세션 기본값(소유자가 바꿀 수 있음): 무료 rate limit(Zen 등) 30분→1시간→2시간→4시간(최대), 성공하면 처음부터 · OpenRouter 무료 분당 제한 1분→5분→15분 · OpenRouter 무료 하루 한도(free-models-per-day) 다음 UTC 0시 · 유료 리셋 미상 2시간×3→24시간→월간 리셋(모르면 24시간 반복). 실패는 출력 전이라 5초 안에 다음 후보로 넘어가므로 짧게 시작하는 비용이 작다.
소유자 결정(10-04 13:3x 운영 세션 채팅): 「추천하는 대로가 좋을 것 같아. 다만 무료 모델들의 경우 병렬 실행 시 제한도 있었던 것 같은데 그건 따로 계산되는거야? 그것도 무료 rate limit 으로 계산된다면 최초 30분 앞에 1분 5분 15분 도 추가하는 게 좋겠는데?」 — 확인: 분류 규칙 opencode.stderr.rate.v1 은
(?i)rate.?limit하나라 동시 실행 제한도 「Rate limit exceeded」로 오면 같은 rate_limited 로 센다(10-02~04 로그에 동시 실행 전용 문구 없음). 확정 기본값: 무료 rate limit 1분→5분→15분→30분→1시간→2시간→4시간(최대), 한 번 성공하면 처음부터 · OpenRouter 무료 분당 제한도 같은 사다리 · OpenRouter 무료 하루 한도(free-models-per-day) 다음 UTC 0시 · 유료 리셋 미상 2시간×3→24시간→월간 리셋(모르면 24시간 반복). R2.추가(소유자 10-04 16:2x 운영 세션 채팅 「사용한도에 걸렸는데 자리를 왜 차지하고 있어? 이거 자체가 문제 잖아? 수정한 내용 아니었어?」): 4096b726 세션 713f31b2(고정 Gemini 3.8 Flash High, agy)가 15:51 일반 메시지 「Usage Limit Reached … reset in 1 hour, 28 minutes」 뒤 RUNNING 으로 27분 남아 구현 칸·세션 자리를 쥠. 범위 추가: 한도 문면이 일반 메시지로 와도 quota_limited 로 분류 · 분류되면 턴을 끝내 자리 반환 · 동적은 리셋까지 막고 다음 후보, 고정은 한도 대기 표시. 계획 세션 52760feb 가 16:27 무응답으로 끊겨 새 세션 22df70c1 로 이어 감(추가 범위 함께 전달). 감시 보조 수정: 한도 문면 뒤 RUNNING 세션은 1분 뒤 멈추고 한도 처리로(kandev_watchdog.py, 백업 .bak-20261004-runlimit).