fix: AIPlanner에서 finish_reason 처리 및 휴리스틱 폴백 로직 개선

- 응답의 finish_reason이 'length'이고 비JSON 텍스트가 포함된 경우, 즉시 상태 기반 휴리스틱 폴백으로 전환하는 로직 추가
- AIPlanner 클래스에 _last_glm_finish_reason 속성을 추가하여 이전 finish_reason을 추적
- README.md에 변경 사항 반영
This commit is contained in:
kswdev0
2026-03-26 13:08:38 +09:00
parent 9d3c7176d3
commit 084c17418a
2 changed files with 16 additions and 0 deletions

View File

@@ -148,6 +148,7 @@ planner.set_goal(
- 재시도(attempt>0)에서는 `max_tokens`를 줄여(기본 `900`) 분석 텍스트가 길어져 JSON이 잘리는 패턴을 줄입니다.
- `JSON-only repair` 프롬프트가 붙는 경우에는 `max_tokens`를 더 낮추고(기본 `250`) `temperature`도 더 낮춰(기본 `0.0`) JSON 포맷 준수율을 올리려 요청합니다.
- `JSON-only repair`를 한 번 적용했는데도 비JSON 텍스트가 계속 오면, 불필요한 API 재시도 반복 대신 즉시 상태 기반 휴리스틱 폴백으로 전환합니다. 또한 LLM이 `actions=[]`를 반환하면 같은 이유로 휴리스틱 플랜으로 즉시 대체합니다.
- `finish_reason=length`이면서 응답이 비JSON 텍스트(`{' 없음`)로 시작하면, repair 재시도를 기다리지 않고 즉시 휴리스틱 폴백으로 전환해 턴 지연을 줄입니다.
- `ai_planner.py`의 `AIPlanner.decide()`는 `TimeoutError`/`ConnectionError`/`urllib.error.URLError` 같은 GLM HTTP 지연/연결 오류도 3회 재시도한 뒤, **상태 요약에 나온 광맥(앵커) 좌표가 있으면 `mine_resource`(먼 경우 `move` 후 채굴)로 폴백**하고, 광맥 정보가 없을 때만 `explore` 방향을 순환하며 탐색합니다(동일 방향 탐색 루프 완화).
- GLM이 `HTTP 429 (Rate limit)`에 걸리면 `Retry-After`가 있으면 그만큼 기다렸다가(없으면 기본 백오프) 재시도하도록 처리합니다.
- GLM HTTP 읽기 제한 시간은 기본 120초이며, `GLM_HTTP_TIMEOUT_SECONDS`로 조정할 수 있습니다. 광맥은 플레이어와 200타일 이상 떨어진 경우에만 폴백에서 `move`를 끼우며, 임계값은 `GLM_FALLBACK_MOVE_THRESHOLD`(기본 200)로 바꿀 수 있습니다.