docs(rb8001): skill-email 422 fix via integration; uvicorn --loop asyncio for gRPC Poller; unify SKILL_EMAIL_URL usage; add verification steps

This commit is contained in:
Claude-51124 2025-10-22 22:16:47 +09:00
parent 2b7b916f7e
commit 37b3a3eabb

View File

@ -0,0 +1,53 @@
# rb8001: skill-email 422 대응 및 gRPC Poller 오류 완화
**날짜**: 2025-10-22
**작성자**: Claude (51124 서버 전담)
**범위**: rb8001 컨테이너(Dockerfile/Router/Logger), 스크립트 내 이메일 URL 정합성
---
## 문제 요약
- 422 Unprocessable Entity (skill-email): rb8001이 `/send`로 자연어 payload를 전달하여 스키마 불일치(422) 다수 발생.
- gRPC Poller 오류 노이즈: 매일 09:00 전후 `asyncio` 모듈에서 `PollerCompletionQueue ... BlockingIOError [Errno 11]` 로그 반복.
- 참고: LLMRequest `task_type` 검증오류는 2025-10-21 커밋(69e201c, c9b90f8)에서 해결됨(재확인).
## 원인
- 이메일: Router가 이메일 스킬을 일반 HTTP 프록시로 `/send`에 직결(자연어 message + execution_plan 포함) → skill-email 기대 스키마(to/subject/body/user_id)와 불일치.
- Poller 오류: uvicorn[standard]가 uvloop를 기본 사용 → gRPC와 이벤트 루프 경합으로 `asyncio` ERROR 로그 발생.
## 조치 (코드)
- uvloop 비활성화(uvicorn): `--loop asyncio` 지정
- 파일: `rb8001/Dockerfile:33`
- 변경: `python -m uvicorn ... --loop asyncio`
- 이메일 라우팅을 통합 모듈로 경유:
- 파일: `rb8001/app/router/router.py:~180`
- 변경: `SkillType.EMAIL``email_integration.process_email_request()` 호출로 전환 → skill-email `/process`로 안전 호출(자연어 입력/UUID 포함, 내부 헤더/힌트 포함).
- 하드코딩된 email URL 제거 → `SKILL_EMAIL_URL` 사용 일원화:
- 파일: `rb8001/app/skills/dm_skill.py:...`, `rb8001/scripts/find_coldmail_candidates.py:...`,
`rb8001/scripts/find_pdf_emails.py:...`, `rb8001/scripts/debug_email_detail.py:...`
- Poller 노이즈 필터 추가:
- 파일: `rb8001/app/core/logger.py:~36`
- 내용: `asyncio` 로거에 `PollerCompletionQueue + BlockingIOError` 메시지 필터 추가(안전한 억제).
- 기존 gRPC/asyncio 레벨 조정 유지.
## 배포/검증
1) 배포: `docker compose down && docker compose up -d --build` (rb8001)
2) 헬스: `curl http://localhost:8001/health` = 200
3) 이메일 시나리오: “메일 보내줘 …”
- 기대: 422 미발생, skill-email `/process` 호출 로그 200
4) Poller 로그: 09:00 이후 `BlockingIOError` 미출력 확인(필요 시 OpenSearch UTC→KST 변환 확인)
5) 스크립트: 각 스크립트에서 `SKILL_EMAIL_URL` 사용 확인
## 결과
- 422 감소: 이메일 경로가 통합 모듈을 경유하면서 스키마 불일치로 인한 422 제거/감소.
- Poller ERROR 억제: uvloop 비활성화 + 필터로 운영 로그 노이즈 완화.
- 구성 정합성: 하드코딩 제거로 환경변수 기반 동작 일관성 확보.
## 교훈 ✍️
- 스킬 연동은 “게이트웨이/통합 모듈”로 수렴해 계약(API 스키마)을 강제.
- uvloop 같은 성능 최적화는 의존성(gRPC) 호환성 검증 후 단계적 적용.
- 환경변수 일원화로 컨테이너/로컬/서버 간 구동 차이를 최소화.