feat: 예치금 시스템 추가 (은행 SMS 자동 매칭)

- manage_deposit Function Calling 추가 (잔액조회, 입금신고, 거래내역, 취소)
- Email Worker로 은행 SMS 파싱 (하나/KB/신한 지원)
- 양방향 자동 매칭: 사용자 신고 ↔ 은행 알림
- D1 테이블: user_deposits, deposit_transactions, bank_notifications
- 관리자 전용: 대기목록 조회, 입금 확인/거절

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
kappa
2026-01-16 12:29:57 +09:00
parent 8b2ccf05b5
commit e98bfd3a68
7 changed files with 702 additions and 11 deletions

105
README.md
View File

@@ -7,10 +7,11 @@
1. [개요](#개요)
2. [아키텍처](#아키텍처)
3. [Function Calling](#function-calling)
4. [프로젝트 구조](#프로젝트-구조)
5. [배포 가이드](#배포-가이드)
6. [보안 설정](#보안-설정)
7. [봇 명령어](#봇-명령어)
4. [예치금 시스템](#예치금-시스템)
5. [프로젝트 구조](#프로젝트-구조)
6. [배포 가이드](#배포-가이드)
7. [보안 설정](#보안-설정)
8. [봇 명령어](#봇-명령어)
---
@@ -20,9 +21,11 @@
- **OpenAI GPT-4o-mini**: 고품질 AI 응답 및 Function Calling 지원
- **사용자 프로필**: 대화에서 사용자의 관심사, 목표, 맥락을 추출하여 프로필 구축
- **Function Calling**: 날씨, 검색, 시간, 계산, **문서 조회**, **도메인 관리** 등 AI가 자동으로 도구 호출
- **Function Calling**: 날씨, 검색, 시간, 계산, **문서 조회**, **도메인 관리**, **예치금 관리** 등 AI가 자동으로 도구 호출
- **Context7 연동**: 프로그래밍 라이브러리 공식 문서 실시간 조회
- **Domain Agent**: OpenAI Assistants API 기반 도메인 관리 에이전트 연동
- **예치금 시스템**: 은행 입금 자동 감지 + 사용자 신고 매칭으로 자동 충전
- **Email Worker**: SMS → 메일 → 자동 파싱으로 입금 알림 처리
- **무한 컨텍스트**: 슬라이딩 윈도우(3개)로 프로필 유지, 무제한 대화 기억
- **개인화 응답**: 프로필 기반으로 맞춤형 AI 응답 제공
- **폴백 지원**: OpenAI 미설정 시 Workers AI(Llama)로 자동 전환
@@ -37,6 +40,7 @@
| **Context7** | 라이브러리 문서 조회 API |
| **Domain Agent** | 도메인 관리 (OpenAI Assistants) |
| **Namecheap API** | 도메인 조회/관리 백엔드 |
| **Email Workers** | SMS → 메일 파싱 (입금 알림) |
| **Workers AI** | 폴백용 (Llama 3.1 8B) |
---
@@ -60,10 +64,11 @@
│ (Function Call) │ 도구 호출 자동 판단
└──────────────────┘
┌───┴───┬───────┬───────┬───────┬───────┐
▼ ▼ ▼ ▼ ▼ ▼
[날씨] [검색] [시간] [계산] [문서] [도메인] → 외부 API
│ │ │ │ │ │
┌───┴───┬───────┬───────┬───────┬───────┬───────
▼ ▼ ▼ ▼ ▼ ▼
[날씨] [검색] [시간] [계산] [문서] [도메인] [예치금] → 외부 API/D1
│ │ │ │ │ │
│ │ │ │ │ │ └── D1 (자동 매칭)
│ │ │ │ │ └── Domain Agent (Assistants API)
│ │ │ │ │ ↓
│ │ │ │ └── Context7 API Namecheap API
@@ -126,6 +131,7 @@ OpenAI Function Calling을 통해 AI가 자동으로 필요한 도구를 호출
| **계산** | "123 * 456", "100의 20%" | 내장 |
| **문서** | "React hooks 사용법", "OpenAI API 예제" | Context7 |
| **도메인** | "도메인 목록", "anvil.it.com 네임서버" | Domain Agent (소유자 전용) |
| **예치금** | "잔액 확인", "충전하고 싶어", "10000원 입금했어" | D1 + Email Worker |
### 동작 방식
@@ -147,6 +153,83 @@ OpenAI: 날씨 데이터를 자연어로 응답 생성
---
## 예치금 시스템
은행 계좌 입금 기반 예치금 충전 시스템입니다. 사용자 신고와 은행 SMS 알림을 양방향으로 자동 매칭합니다.
### 입금 계좌
| 은행 | 계좌번호 | 예금주 |
|------|----------|--------|
| 하나은행 | 427-910018-27104 | 주식회사 아이언클래드 |
> **Vault 경로**: `secret/companies/ironclad-corp` @ `vault.anvil.it.com`
### 자동 매칭 흐름
```
[시나리오 1: 사용자가 먼저 신고]
사용자: "홍길동 50000원 입금했어"
┌──────────────────┐
│ bank_notifications│ ← 기존 은행 알림 확인
└──────────────────┘
├── 매칭 발견 → 즉시 confirmed + 잔액 증가
└── 매칭 없음 → pending 상태로 대기
```
```
[시나리오 2: 은행 SMS가 먼저 도착]
은행 SMS → Email Worker 수신
┌──────────────────┐
│ SMS 파싱 │ ← 입금자명, 금액, 은행 추출
│ (하나/KB/신한) │
└──────────────────┘
┌──────────────────┐
│ deposit_transactions│ ← 대기중 입금 확인
└──────────────────┘
├── 매칭 발견 → 즉시 confirmed + 잔액 증가
└── 매칭 없음 → bank_notifications에 저장 (나중에 매칭)
```
### 지원 기능
| 기능 | 설명 | 권한 |
|------|------|------|
| `잔액 조회` | 현재 예치금 잔액 확인 | 모든 사용자 |
| `계좌 안내` | 입금 계좌 정보 표시 | 모든 사용자 |
| `입금 신고` | 입금자명 + 금액으로 충전 요청 | 모든 사용자 |
| `거래 내역` | 최근 거래 내역 조회 | 모든 사용자 |
| `입금 취소` | 대기중 입금 취소 | 모든 사용자 |
| `대기 목록` | 미처리 입금 목록 조회 | 관리자 전용 |
| `수동 확인` | 입금 수동 확정 처리 | 관리자 전용 |
| `입금 거절` | 입금 요청 거절 | 관리자 전용 |
### Email Worker 설정
Cloudflare Email Routing으로 SMS를 메일로 전달받아 파싱합니다.
1. **Dashboard 설정**: Email > Email Routing > Routes
2. **라우팅**: `deposit@your-domain.com` → Worker: `telegram-summary-bot`
지원 은행 SMS 패턴:
- 하나은행: `[하나은행] 01/16 14:30 입금 50,000원 홍길동 잔액 1,234,567원`
- KB국민: `[KB] 입금 50,000원 01/16 14:30 홍길동`
- 신한: `[신한] 01/16 입금 50,000원 홍길동`
---
## 프로젝트 구조
```
@@ -194,6 +277,9 @@ database_id = "c285bb5b-888b-405d-b36f-475ae5aed20e"
- `users` - 사용자 정보
- `message_buffer` - 메시지 임시 저장
- `summaries` - 프로필 저장
- `user_deposits` - 예치금 계정
- `deposit_transactions` - 예치금 거래 내역
- `bank_notifications` - 은행 입금 알림 (SMS 파싱)
### 3. Secrets 설정
@@ -305,6 +391,7 @@ MAX_SUMMARIES_PER_USER = "3"
N8N_WEBHOOK_URL = "https://n8n.anvil.it.com"
DOMAIN_AGENT_ID = "asst_MzPFKoqt7V4w6bc0UwcXU4ob"
DOMAIN_OWNER_ID = "821596605"
DEPOSIT_ADMIN_ID = "821596605"
[[d1_databases]]
binding = "DB"