fix(bot): chat 응답 JSON 파싱 strict=False + Embed 렌더링 통일

This commit is contained in:
2026-03-19 07:40:20 +09:00
parent 18edfd668f
commit a893593f25

View File

@@ -163,7 +163,7 @@ def _parse_unified_response(raw: str) -> dict:
m = _re.search(r"```json\s*\n(.+?)```", raw, _re.DOTALL)
if m:
try:
return json.loads(m.group(1))
return json.loads(m.group(1), strict=False)
except json.JSONDecodeError:
pass
@@ -178,7 +178,7 @@ def _parse_unified_response(raw: str) -> dict:
depth -= 1
if depth == 0:
try:
return json.loads(raw[start:i + 1])
return json.loads(raw[start:i + 1], strict=False)
except json.JSONDecodeError:
break
@@ -411,16 +411,27 @@ async def on_message(message: discord.Message):
logger.info("[NC] handle 완료")
elif mode == "chat":
# 즉시 응답
# 즉시 응답 — 항상 Embed 사용 (Discord markdown 렌더링)
response = parsed.get("response", "")
logger.info(f"[chat] 응답 길이: {len(response)}")
if response:
if len(response) <= 2000:
await message.reply(response)
else:
# 응답이 JSON 구조를 포함하면 제거 (fallback 시 raw 전체가 들어옴)
if response.strip().startswith('"mode"') or response.strip().startswith('{"mode"'):
import re as _re
m = _re.search(r'"response"\s*:\s*"(.*)', response, _re.DOTALL)
if m:
cleaned = m.group(1)
# 끝의 따옴표+중괄호 제거
if cleaned.endswith('"}'):
cleaned = cleaned[:-2]
elif cleaned.endswith('"'):
cleaned = cleaned[:-1]
response = cleaned.replace('\\n', '\n')
from handlers.renderer import safe_send_embed
for i in range(0, len(response), 4000):
embed = discord.Embed(description=response[i:i + 4000], color=0x3498DB)
await message.channel.send(embed=embed)
chunk = response[i:i + 4000]
embed = discord.Embed(description=chunk, color=0x3498DB)
await safe_send_embed(message.channel, embed)
else:
await message.reply("응답을 생성하지 못했습니다.")