토큰 회전의 코드 홈은 core/auth/입니다. 프로파일과 플랜의 SoT는 ~/.geode/auth.toml(core/auth/auth_toml.py,core/auth/profiles.py)이고, 호출마다 어느 프로파일을 쓸지와 언제 갱신할지는core/auth/rotation.py의ProfileRotator가 정합니다.
선택과 갱신 규칙
| 규칙 | 동작 |
|---|---|
| 타입 우선 선택 | oauth > token > api_key 순으로 고르고, 같은 타입 안에서는 LRU로 돌립니다. |
| 선제 갱신 | 관리형(managed) 토큰은 만료 120초 이내면 외부 저장소에서 다시 읽습니다. Hermes의 skew 상수를 그대로 빌렸습니다. |
| 401 자동 갱신 | 인증 실패(401/403) 시 쿨다운을 적용하기 전에 한 번 더 다시 읽고, 토큰이 바뀌었으면 오류 카운트를 리셋합니다. |
| 쿨다운 | calculate_cooldown_ms가 오류 횟수에 따라 쿨다운을 키웁니다. 키별 상태는 core/auth/cooldown.py의 CooldownTracker가 보관합니다. |
관리형 토큰의 대표가 Codex입니다. 수명 관리는 Codex CLI가 하고 GEODE는 ~/.codex/auth.json을 읽기만 합니다. 그래서 "갱신"은 새 토큰 발급이 아니라 외부 저장소 재독입니다. 발급이 필요하면 codex login을 다시 돌립니다.
운영 시 알아둘 것
- thin CLI에서
/login을 마치면 데몬이 auth 상태를 다시 읽습니다. 이 리로드는 추가 전용입니다. 제거된 항목은 캐시된 싱글톤에서 즉시 빠지지 않으므로, 프로파일을 지운 뒤 확실히 하려면 데몬을 재시작합니다. - Codex의 선제 5시간 스로틀을 우회하려면
GEODE_CODEX_OAUTH_POLL_DISABLED=1을 켭니다. 구독 버킷으로 바로 떨어집니다. core/llm/credentials.py의resolve_provider_key(OAuth 우선, API 키 폴백)는 deprecated입니다. 어댑터 레지스트리의 소스별 명시 자격이 대체이고, v1.0.0 제거 대상입니다.
실패 모드
| 증상 | 원인 | 해법 |
|---|---|---|
| 한 프로파일만 계속 401 | 외부 저장소의 토큰 자체가 만료 | Codex는 codex login, Anthropic 구독은 Claude Code 재로그인으로 원본 토큰을 갱신합니다. |
| 호출이 점점 뜸해짐 | 반복 실패로 쿨다운 에스컬레이션 | 원인 자격을 고치면 성공 콜백이 쿨다운을 리셋합니다. |
| 프로파일을 지웠는데 계속 쓰임 | 데몬 리로드가 추가 전용 | 데몬을 재시작합니다. |