Phase 5-6: API usage tracking + Calendar/Mail/DEVONthink/OmniFocus/News pipeline
- 파이프라인 42→51노드 확장 (calendar/mail/note 핸들러 추가) - 네이티브 서비스 6개: heic_converter(:8090), chat_bridge(:8091), caldav_bridge(:8092), devonthink_bridge(:8093), inbox_processor, news_digest - 분류기 v2→v3: calendar, reminder, mail, note intent 추가 - Mail Processing Pipeline (7노드, IMAP 폴링) - LaunchAgent plist 6개 + manage_services.sh - migrate-v3.sql: news_digest_log + calendar_events 확장 - 개발 문서 현행화 (CLAUDE.md, QUICK_REFERENCE.md, docs/architecture.md) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -32,6 +32,10 @@ curl -s http://192.168.1.186:11434/api/generate -d '{"model":"qwen3.5:9b-q8_0","
|
||||
| Ollama API (맥미니) | http://localhost:11434 |
|
||||
| Ollama API (GPU) | http://192.168.1.186:11434 |
|
||||
| Synology Chat | NAS (192.168.1.227) |
|
||||
| chat_bridge | http://localhost:8091 |
|
||||
| HEIC converter | http://localhost:8090 |
|
||||
| caldav_bridge | http://localhost:8092 |
|
||||
| devonthink_bridge | http://localhost:8093 |
|
||||
|
||||
## Docker 명령어
|
||||
|
||||
@@ -61,6 +65,9 @@ docker exec -i bot-postgres psql -U bot -d chatbot < init/migrate-v2.sql
|
||||
|
||||
# Qdrant tk_company 컬렉션 + 인덱스 설정
|
||||
bash init/setup-qdrant.sh
|
||||
|
||||
# v3 마이그레이션 실행 (Phase 5-6 테이블 추가)
|
||||
docker exec -i bot-postgres psql -U bot -d chatbot < init/migrate-v3.sql
|
||||
```
|
||||
|
||||
## 헬스체크 (전체)
|
||||
@@ -77,6 +84,12 @@ echo "=== Qdrant 컬렉션 ===" && \
|
||||
curl -s http://localhost:6333/collections | python3 -c "import sys,json; [print(f' {c[\"name\"]}') for c in json.loads(sys.stdin.read())['result']['collections']]" && \
|
||||
echo "=== tk_company ===" && \
|
||||
curl -s http://localhost:6333/collections/tk_company | python3 -c "import sys,json; r=json.loads(sys.stdin.read())['result']; print(f' 벡터수: {r[\"points_count\"]}, 상태: {r[\"status\"]}')" 2>/dev/null || echo " (미생성)" && \
|
||||
echo "=== 네이티브 서비스 ===" && \
|
||||
curl -s http://localhost:8090/health && echo && \
|
||||
curl -s http://localhost:8091/health && echo && \
|
||||
curl -s http://localhost:8092/health && echo && \
|
||||
curl -s http://localhost:8093/health && echo && \
|
||||
./manage_services.sh status && \
|
||||
echo "=== n8n ===" && \
|
||||
curl -s -o /dev/null -w ' HTTP %{http_code}' http://localhost:5678 && echo && \
|
||||
echo "=== API 사용량 ===" && \
|
||||
@@ -92,16 +105,27 @@ syn-chat-bot/
|
||||
├── .env.example ← 환경변수 템플릿
|
||||
├── CLAUDE.md ← 프로젝트 문서
|
||||
├── QUICK_REFERENCE.md ← 이 파일
|
||||
├── heic_converter.py ← HEIC→JPEG 변환 API (macOS sips, port 8090)
|
||||
├── chat_bridge.py ← DSM Chat API 브릿지 (사진 폴링/다운로드, port 8091)
|
||||
├── caldav_bridge.py ← CalDAV REST 래퍼 (Synology Calendar, port 8092)
|
||||
├── devonthink_bridge.py ← DEVONthink AppleScript 래퍼 (port 8093)
|
||||
├── inbox_processor.py ← OmniFocus Inbox 폴링 (LaunchAgent, 5분)
|
||||
├── news_digest.py ← 뉴스 번역·요약 (LaunchAgent, 매일 07:00)
|
||||
├── manage_services.sh ← 네이티브 서비스 관리 (start/stop/status)
|
||||
├── start-bridge.sh ← 브릿지 서비스 시작 헬퍼
|
||||
├── com.syn-chat-bot.*.plist ← LaunchAgent 설정 (6개)
|
||||
├── docs/
|
||||
│ ├── architecture.md ← 아키텍처, DB 스키마, 파이프라인 상세
|
||||
│ └── claude-code-playbook.md
|
||||
├── n8n/
|
||||
│ ├── data/ ← n8n 런타임 데이터
|
||||
│ └── workflows/
|
||||
│ └── main-chat-pipeline.json ← 메인 워크플로우 (37노드)
|
||||
│ ├── main-chat-pipeline.json ← 메인 워크플로우 (51노드)
|
||||
│ └── mail-processing-pipeline.json ← 메일 처리 파이프라인 (7노드)
|
||||
├── init/
|
||||
│ ├── init.sql ← DB 초기 스키마 v2 (12테이블)
|
||||
│ ├── migrate-v2.sql ← 기존 DB 마이그레이션
|
||||
│ ├── migrate-v3.sql ← v3 마이그레이션 (Phase 5-6 테이블)
|
||||
│ └── setup-qdrant.sh ← Qdrant 컬렉션/인덱스 설정
|
||||
└── postgres/data/ ← DB 데이터
|
||||
```
|
||||
@@ -138,6 +162,30 @@ docker exec bot-postgres psql -U bot -d chatbot -c "SELECT * FROM api_usage_mont
|
||||
# GPU 서버 연결 안 될 때
|
||||
ping 192.168.1.186
|
||||
curl -s http://192.168.1.186:11434/api/tags
|
||||
|
||||
# chat_bridge 상태 확인
|
||||
curl -s http://localhost:8091/health | python3 -m json.tool
|
||||
|
||||
# chat_bridge 사진 조회 테스트
|
||||
curl -s -X POST http://localhost:8091/chat/recent-photo \
|
||||
-H 'Content-Type: application/json' \
|
||||
-d '{"channel_id":17,"user_id":6,"before_timestamp":9999999999999}' | python3 -m json.tool
|
||||
|
||||
# chat_bridge 로그
|
||||
tail -50 /tmp/chat-bridge.log
|
||||
tail -50 /tmp/chat-bridge.err
|
||||
|
||||
# caldav_bridge 상태 확인
|
||||
curl -s http://localhost:8092/health | python3 -m json.tool
|
||||
|
||||
# devonthink_bridge 상태 확인
|
||||
curl -s http://localhost:8093/health | python3 -m json.tool
|
||||
|
||||
# inbox_processor 로그
|
||||
tail -50 /tmp/inbox-processor.log
|
||||
|
||||
# news_digest 로그
|
||||
tail -50 /tmp/news-digest.log
|
||||
```
|
||||
|
||||
## n8n 접속 정보
|
||||
@@ -145,7 +193,8 @@ curl -s http://192.168.1.186:11434/api/tags
|
||||
- URL: http://localhost:5678
|
||||
- 이메일: ahn@hyungi.net
|
||||
- 비밀번호: .env의 N8N_BASIC_AUTH_PASSWORD와 동일
|
||||
- 워크플로우: "메인 채팅 파이프라인 v2" (37 노드, 활성 상태)
|
||||
- 워크플로우: "메인 채팅 파이프라인 v3" (51 노드, 활성 상태)
|
||||
- 메일 처리 워크플로우: "메일 처리 파이프라인" (7 노드)
|
||||
- 웹훅 엔드포인트: POST http://localhost:5678/webhook/chat
|
||||
|
||||
## Synology Chat 연동
|
||||
@@ -163,7 +212,6 @@ NAS에서 Outgoing Webhook 설정 필요:
|
||||
### Phase 0: 맥미니 정리
|
||||
- [ ] ollama rm qwen3.5:35b-a3b (삭제)
|
||||
- [ ] ollama rm qwen3.5:35b-a3b-think (삭제)
|
||||
- [ ] ollama pull minicpm-v:8b (비전 모델 설치, Phase 5용)
|
||||
|
||||
### Phase 1: 기반 (Qdrant + DB)
|
||||
- [x] init.sql v2 (12테이블 + 분류기 v2 프롬프트 + 메모리 판단 프롬프트)
|
||||
@@ -173,7 +221,7 @@ NAS에서 Outgoing Webhook 설정 필요:
|
||||
- [ ] Qdrant 설정 실행
|
||||
|
||||
### Phase 2: 3단계 라우팅 + 검색 라우팅
|
||||
- [x] 워크플로우 v2 (37노드): 토큰검증, Rate Limit, 프리필터, 분류기v2, 3-tier, 멀티-컬렉션 RAG
|
||||
- [x] 워크플로우 v2 (42노드): 토큰검증, Rate Limit, 프리필터, 분류기v2, 3-tier, 멀티-컬렉션 RAG
|
||||
- [x] .env + docker-compose.yml 환경변수 추가
|
||||
- [ ] n8n에 워크플로우 임포트 + 활성화
|
||||
- [ ] 테스트: "안녕" → local, "요약해줘" → Haiku, "법률 해석" → Opus
|
||||
@@ -188,16 +236,34 @@ NAS에서 Outgoing Webhook 설정 필요:
|
||||
- [ ] 텍스트 청킹 + 임베딩 + tk_company 저장 구현
|
||||
- [ ] 문서 버전 관리 (deprecated + version++)
|
||||
|
||||
### Phase 5: 현장 리포팅
|
||||
### Phase 5: 현장 리포팅 + API 사용량 추적
|
||||
- [x] field_reports 테이블 + SLA 인덱스
|
||||
- [ ] 비전 모델 설치 + 사진 분석 노드
|
||||
- [ ] /보고서 월간 보고서 생성 구현
|
||||
- [ ] SLA 트래킹 스케줄 워크플로우
|
||||
- [x] 비전 모델 사진 분석 (base64 변환 + HEIC 자동 변환)
|
||||
- [x] HEIC→JPEG 변환 서비스 (heic_converter.py, macOS sips)
|
||||
- [x] chat_bridge.py — DSM Chat API 브릿지 (사진 폴링 + 다운로드 + ack)
|
||||
- [x] n8n Handle Log Event / Handle Field Report → bridge 연동
|
||||
- [x] API 사용량 추적 (api_usage_monthly UPSERT)
|
||||
- [x] /보고서 월간 보고서 생성 구현
|
||||
- [x] report_cache 캐시 + --force 재생성
|
||||
|
||||
### Phase 6: 메일 + 캘린더
|
||||
### Phase 6: 캘린더·메일·DEVONthink·OmniFocus·뉴스
|
||||
- [x] mail_logs, calendar_events 테이블
|
||||
- [ ] IMAP 폴링 워크플로우
|
||||
- [ ] CalDAV 연동
|
||||
- [x] 분류기 v3 (calendar, reminder, mail, note intent 추가)
|
||||
- [x] caldav_bridge.py — CalDAV REST 래퍼 (Synology Calendar)
|
||||
- [x] devonthink_bridge.py — DEVONthink AppleScript 래퍼
|
||||
- [x] inbox_processor.py — OmniFocus Inbox 폴링 (LaunchAgent, 5분)
|
||||
- [x] news_digest.py — 뉴스 번역·요약 (LaunchAgent, 매일 07:00)
|
||||
- [x] manage_services.sh — 네이티브 서비스 관리
|
||||
- [x] LaunchAgent plist 6개
|
||||
- [x] n8n 파이프라인 51노드 (calendar/mail/note 핸들러 추가)
|
||||
- [x] Mail Processing Pipeline (7노드, IMAP 폴링)
|
||||
- [x] migrate-v3.sql (news_digest_log + calendar_events 확장)
|
||||
|
||||
### 서비스 기동 전제조건
|
||||
- Synology Calendar (CalDAV) — NAS에서 활성화 필요
|
||||
- Synology MailPlus — NAS에서 활성화 + 계정 설정 필요
|
||||
- DEVONthink 4 — 맥미니에 설치 필요 (AppleScript 접근)
|
||||
- OmniFocus — 맥미니에 설치 필요 (Inbox 폴링)
|
||||
|
||||
## 검증 체크리스트
|
||||
|
||||
@@ -211,3 +277,6 @@ NAS에서 Outgoing Webhook 설정 필요:
|
||||
8. GPU 서버 다운 → fallback Haiku 답변
|
||||
9. 잘못된 토큰 → reject
|
||||
10. 10초 내 6건 → rate limit
|
||||
11. "내일 회의 잡아줘" → calendar intent → CalDAV 이벤트 생성
|
||||
12. "최근 메일 확인" → mail intent → 메일 요약 반환
|
||||
13. "이거 메모해둬" → note intent → DEVONthink 저장
|
||||
|
||||
Reference in New Issue
Block a user