fix: AIPlanner JSON 출력 요구사항 및 max_tokens 조정

- JSON 출력 요구사항을 명확히 하여 응답의 첫 비공백 문자가 반드시 `{` 이어야 함을 추가
- 재시도 시 max_tokens를 줄여 JSON 잘림 문제를 완화하는 로직 추가
- README.md에 변경 사항 반영
This commit is contained in:
kswdev0
2026-03-26 11:58:08 +09:00
parent 6e5f781529
commit c30fb426a8
2 changed files with 11 additions and 4 deletions

View File

@@ -116,7 +116,7 @@ state_reader가 상태 요약에 포함하는 `마지막 행동(기억)` 섹션
### 대기
- "wait"{"seconds": int}
## 절대 중요: 순수 JSON만 출력하세요. ```json 같은 마크다운 블록, 설명 텍스트, 주석 없이 오직 { } 만."""
## 절대 중요: 순수 JSON만 출력하세요. ```json 같은 마크다운 블록, 설명 텍스트, 주석 없이 오직 { } 만. 또한 응답의 첫 비공백 문자는 반드시 `{` 입니다."""
def _glm_debug_enabled() -> bool:
@@ -197,7 +197,7 @@ class AIPlanner:
"현재 상태를 분석하고, 장기 목표를 향해 지금 해야 할 행동 시퀀스를 계획하세요.\n"
"⚠️ 순수 플레이입니다. 건설/채굴/삽입 전에 반드시 move로 가까이 이동하세요.\n"
"⚠️ 제작은 재료가 있어야 합니다. 인벤토리를 확인하세요.\n"
"반드시 JSON만 반환하세요. 마크다운 블록(```)이나 설명 텍스트 없이 순수 JSON만."
"반드시 JSON만 반환하세요. 마크다운 블록(```)이나 설명 텍스트 없이 순수 JSON만. 그리고 응답의 첫 비공백 문자는 반드시 `{` 입니다."
)
print(f"\n[GLM] 생각 중...")
@@ -229,6 +229,7 @@ class AIPlanner:
"\n\n[중요] 이전 응답은 JSON 요구사항을 위반했습니다.\n"
"지금은 아래 스키마의 JSON 객체만 '그대로' 반환하세요.\n"
"마크다운/설명 금지.\n"
"응답의 첫 비공백 문자는 반드시 `{` 입니다.\n"
"키 이름과 구문은 동일해야 합니다.\n"
"{"
"\"thinking\":\"\","
@@ -332,6 +333,12 @@ class AIPlanner:
return "\n".join(lines) + "\n\n"
def _call_glm(self, user_message: str, attempt: int) -> str:
# attempt가 올라갈수록 "분석 텍스트"가 길어지면서 JSON이 잘리는 패턴이 있어
# retry에서는 출력 길이를 줄인다.
base_max_tokens = int(os.environ.get("GLM_MAX_TOKENS", "2000"))
retry_max_tokens = int(os.environ.get("GLM_RETRY_MAX_TOKENS", "900"))
max_tokens = base_max_tokens if attempt == 0 else min(base_max_tokens, retry_max_tokens)
payload = json.dumps({
"model": GLM_MODEL,
"messages": [
@@ -339,12 +346,11 @@ class AIPlanner:
{"role": "user", "content": user_message},
],
"temperature": 0.3,
"max_tokens": 2000,
"max_tokens": max_tokens,
}).encode("utf-8")
prompt_chars = len(user_message)
system_chars = len(SYSTEM_PROMPT)
max_tokens = 2000
http_timeout = float(os.environ.get("GLM_HTTP_TIMEOUT_SECONDS", "120"))
if _glm_debug_enabled():