fix: JSON 파싱 견고화 + 분류기 프롬프트 강화
- _parse_classification: 어떤 형태든 첫{~마지막} 추출, 백틱 잔재 제거
- 분류기: 판단 예시 추가 (일정→tools, 인사→direct 등), 백틱/코드블록 금지 명시
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -35,13 +35,22 @@ JSON 형식:
|
|||||||
- direct/route/clarify: {"action": "...", "response": "...", "prompt": "..."}
|
- direct/route/clarify: {"action": "...", "response": "...", "prompt": "..."}
|
||||||
- tools: {"action": "tools", "tool": "calendar|email|document", "operation": "...", "params": {...}}
|
- tools: {"action": "tools", "tool": "calendar|email|document", "operation": "...", "params": {...}}
|
||||||
|
|
||||||
규칙:
|
중요 규칙:
|
||||||
- JSON 외 텍스트는 절대 출력하지 마라
|
- 반드시 순수 JSON만 출력. 백틱, 코드블록, 설명 텍스트 금지
|
||||||
- 날짜는 YYYY-MM-DD, 시간은 HH:MM
|
- 날짜는 YYYY-MM-DD, 시간은 HH:MM
|
||||||
- pending_draft가 있다고 [대화 이력]에 표시되어 있을 때만 create_confirmed 사용
|
- pending_draft가 있다고 [대화 이력]에 표시되어 있을 때만 create_confirmed 사용
|
||||||
- 오늘 날짜 정보가 [현재 시간]에 있으니 참고하라
|
- [현재 시간]의 날짜를 참고하여 "오늘", "내일", "이번주" 등을 YYYY-MM-DD로 변환하라
|
||||||
|
|
||||||
<EFBFBD><EFBFBD><EFBFBD>의 이름은 '이드'. 상냥하고 친근하게 대화한다.
|
판단 예시:
|
||||||
|
- "오늘 일정" → tools: calendar.today()
|
||||||
|
- "이번주 일정" → tools: calendar.search(이번주 월~일)
|
||||||
|
- "내일 3시 회의" → tools: calendar.create_draft(...)
|
||||||
|
- "최근 메일" → tools: email.search("", 7)
|
||||||
|
- "문서 찾아줘" → tools: document.search(...)
|
||||||
|
- "안녕" → direct
|
||||||
|
- "양자역학 설명해줘" → route
|
||||||
|
|
||||||
|
너의 이름은 '이드'. 상냥하고 친근하게 대화한다.
|
||||||
대화 이력이 있으면 맥락을 고려하라.\
|
대화 이력이 있으면 맥락을 고려하라.\
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|||||||
@@ -70,20 +70,21 @@ async def _stream_with_cancel(adapter, message: str, job: Job, collected: list[s
|
|||||||
def _parse_classification(raw: str) -> dict:
|
def _parse_classification(raw: str) -> dict:
|
||||||
"""EXAONE JSON 응답 파싱. 실패 시 direct fallback."""
|
"""EXAONE JSON 응답 파싱. 실패 시 direct fallback."""
|
||||||
raw = raw.strip()
|
raw = raw.strip()
|
||||||
# JSON 블록 추출 (```json ... ``` 감싸는 경우 대응)
|
# 어떤 형태든 첫 번째 { ~ 마지막 } 추출
|
||||||
if "```" in raw:
|
start = raw.find("{")
|
||||||
start = raw.find("{")
|
end = raw.rfind("}")
|
||||||
end = raw.rfind("}") + 1
|
if start >= 0 and end > start:
|
||||||
if start >= 0 and end > start:
|
json_str = raw[start:end + 1]
|
||||||
raw = raw[start:end]
|
try:
|
||||||
try:
|
result = json.loads(json_str)
|
||||||
result = json.loads(raw)
|
if "action" in result:
|
||||||
if "action" in result:
|
return result
|
||||||
return result
|
except json.JSONDecodeError:
|
||||||
except json.JSONDecodeError:
|
pass
|
||||||
pass
|
|
||||||
# JSON 파싱 실패 → direct로 취급 (raw 텍스트가 직접 응답)
|
# JSON 파싱 실패 → direct로 취급 (raw 텍스트가 직접 응답)
|
||||||
return {"action": "direct", "response": raw, "prompt": ""}
|
# 마크다운/코드블록 잔재 제거
|
||||||
|
cleaned = raw.replace("```json", "").replace("```", "").replace("`json", "").replace("`", "").strip()
|
||||||
|
return {"action": "direct", "response": cleaned, "prompt": ""}
|
||||||
|
|
||||||
|
|
||||||
async def _send_callback(job: Job, text: str) -> None:
|
async def _send_callback(job: Job, text: str) -> None:
|
||||||
|
|||||||
Reference in New Issue
Block a user