feat: DuckDuckGo → Brave Search 교체 + 입금 알림 개선
## 검색 API 교체 - DuckDuckGo Instant Answer API → Brave Search API - 실제 웹 검색 결과 반환 (제목, 설명, URL) - Vault에 API 키 저장 (secret/brave-search) - Free AI 플랜: 2,000 queries/월 ## 시스템 프롬프트 개선 - 검색 도구 사용 조건 명시 (최신 정보, 실시간 가격 등) - 도구 description에 트리거 키워드 추가 ## 입금 알림 개선 - 자동 매칭 성공 시 사용자에게 Telegram 알림 전송 - tryAutoMatch() 반환값에 userId, amount 추가 ## 문서 업데이트 - Function Calling Tools 테이블에 트리거 키워드 컬럼 추가 - AI 시스템 프롬프트 섹션 추가 - Deposit Agent 프롬프트 수정 방법 문서화 - 자동 알림 시스템 섹션 추가 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
77
CLAUDE.md
77
CLAUDE.md
@@ -156,6 +156,8 @@ curl https://telegram-summary-bot.kappa-d8e.workers.dev/webhook-info
|
||||
| Function Calling 무한 루프 | tool_choice 설정 오류 | `tool_choice: "auto"` 확인 |
|
||||
| 프로필 업데이트 안됨 | 메시지 20개 미만 | `/context`로 버퍼 수 확인 |
|
||||
| Email Worker 파싱 실패 | SMS 형식 변경 | `index.ts`의 정규식 패턴 확인 |
|
||||
| **AI가 도구 호출 안 함** | 키워드 미인식 | 시스템 프롬프트 + 도구 description에 키워드 추가 |
|
||||
| **예치금 최소 금액 제한** | Agent 프롬프트 문제 | Deposit Agent 프롬프트 수정 (OpenAI API) |
|
||||
|
||||
### 디버깅 명령어
|
||||
```bash
|
||||
@@ -198,15 +200,15 @@ Telegram Webhook → Security Validation → Command/Message Router
|
||||
| `telegram.ts` | Telegram API | `sendMessage()`, `sendTypingAction()` |
|
||||
|
||||
**Function Calling Tools (7개):**
|
||||
| 도구 | 함수명 | 외부 API |
|
||||
|------|--------|----------|
|
||||
| 날씨 | `get_weather` | wttr.in |
|
||||
| 검색 | `web_search` | DuckDuckGo |
|
||||
| 시간 | `get_current_time` | 내장 |
|
||||
| 계산 | `calculate` | 내장 |
|
||||
| 문서 | `lookup_docs` | Context7 |
|
||||
| 도메인 | `manage_domain` | Domain Agent → Namecheap |
|
||||
| 예치금 | `manage_deposit` | D1 |
|
||||
| 도구 | 함수명 | 외부 API | 트리거 키워드 |
|
||||
|------|--------|----------|---------------|
|
||||
| 날씨 | `get_weather` | wttr.in | 날씨 |
|
||||
| 검색 | `web_search` | Brave Search | ~란, ~뭐야 |
|
||||
| 시간 | `get_current_time` | 내장 | 몇 시, 시간 |
|
||||
| 계산 | `calculate` | 내장 | 계산, +, -, *, / |
|
||||
| 문서 | `lookup_docs` | Context7 | 문서, 사용법, API |
|
||||
| 도메인 | `manage_domain` | Domain Agent → Namecheap | 도메인, 네임서버, WHOIS |
|
||||
| 예치금 | `manage_deposit` | Deposit Agent → D1 | **입금, 충전, 잔액, 계좌, 송금** |
|
||||
|
||||
**Data Layer (D1 SQLite):**
|
||||
| 테이블 | 용도 | 주요 컬럼 |
|
||||
@@ -265,6 +267,30 @@ case 'new_tool':
|
||||
// → AI 프롬프트의 system 메시지에 포함
|
||||
```
|
||||
|
||||
### AI 시스템 프롬프트 (`summary-service.ts`)
|
||||
```
|
||||
- 날씨, 시간, 계산, 검색 등의 요청은 제공된 도구를 사용하세요.
|
||||
- 예치금, 입금, 충전, 잔액, 계좌 관련 요청은 반드시 manage_deposit 도구를 사용하세요.
|
||||
금액 제한이나 규칙을 직접 판단하지 마세요.
|
||||
- 도메인 관련 요청은 반드시 manage_domain 도구를 사용하세요.
|
||||
```
|
||||
|
||||
**중요:** 메인 AI가 도구를 호출하지 않고 직접 답변하는 경우:
|
||||
1. 시스템 프롬프트에 해당 키워드 추가 (`summary-service.ts:252-254`)
|
||||
2. 도구 description에 키워드 명시 (`openai-service.ts` tools 배열)
|
||||
|
||||
### Deposit Agent 프롬프트 수정 방법
|
||||
```bash
|
||||
# Vault에서 API 키 조회
|
||||
curl -s -H "X-Vault-Token: hvs.xxx" https://vault.anvil.it.com/v1/secret/data/openai
|
||||
|
||||
# Assistant 프롬프트 업데이트
|
||||
curl -X POST 'https://api.openai.com/v1/assistants/asst_XMoVGU7ZwRpUPI6PHGvRNm8E' \
|
||||
-H 'Authorization: Bearer sk-xxx' \
|
||||
-H 'OpenAI-Beta: assistants=v2' \
|
||||
-d @update-agent.json
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Configuration
|
||||
@@ -279,6 +305,7 @@ case 'new_tool':
|
||||
| `DEPOSIT_AGENT_ID` | - | 예치금 관리 Assistant ID |
|
||||
| `DEPOSIT_ADMIN_ID` | - | 예치금 관리 권한 Telegram ID |
|
||||
| `BANK_API_SECRET` | - | 입금 알림 API 인증 키 (wrangler secret) |
|
||||
| `BRAVE_API_KEY` | - | Brave Search API 키 (wrangler secret) |
|
||||
|
||||
---
|
||||
|
||||
@@ -292,7 +319,7 @@ case 'new_tool':
|
||||
| Namecheap API | 도메인 백엔드 | namecheap-api.anvil.it.com | 날짜: MM/DD/YYYY → ISO 변환 |
|
||||
| WHOIS API | WHOIS 조회 | whois-api-eight.vercel.app | ccSLD 미지원 |
|
||||
| wttr.in | 날씨 | wttr.in | - |
|
||||
| DuckDuckGo | 검색 | api.duckduckgo.com | - |
|
||||
| Brave Search | 검색 | api.search.brave.com | Free AI 플랜 (2,000/월) |
|
||||
| Vault | API 키 관리 | vault.anvil.it.com | - |
|
||||
| Gmail | 입금 SMS 수신 | deposit.anvil@gmail.com | Apps Script 연동 |
|
||||
| Apps Script | Gmail → Worker 연동 | script.google.com | 1분마다 실행, message_id 중복 방지 |
|
||||
@@ -306,7 +333,7 @@ case 'new_tool':
|
||||
[시나리오 1: 사용자 먼저]
|
||||
"홍길동 50000원 입금" → bank_notifications 검색
|
||||
↓
|
||||
매칭 O → confirmed | 매칭 X → pending
|
||||
매칭 O → confirmed + 잔액↑ | 매칭 X → pending
|
||||
|
||||
[시나리오 2: SMS 먼저 - Gmail → Apps Script → Worker]
|
||||
은행 SMS → Gmail(deposit.anvil@gmail.com) → Apps Script (1분마다)
|
||||
@@ -317,9 +344,16 @@ case 'new_tool':
|
||||
↓
|
||||
deposit_transactions 검색 (pending)
|
||||
↓
|
||||
매칭 O → confirmed + 잔액↑ | 매칭 X → 저장만
|
||||
매칭 O → confirmed + 잔액↑ + 사용자/관리자 알림
|
||||
매칭 X → 저장만 + 관리자 알림
|
||||
```
|
||||
|
||||
**알림 시스템:**
|
||||
| 이벤트 | 사용자 알림 | 관리자 알림 |
|
||||
|--------|-------------|-------------|
|
||||
| 자동 매칭 성공 | ✅ 입금액 + 현재 잔액 | ✅ 입금 정보 + 매칭 완료 |
|
||||
| 매칭 대기 (SMS만) | - | ✅ 입금 정보 + 대기 상태 |
|
||||
|
||||
**Gmail → Worker 연동:**
|
||||
- Gmail 계정: `deposit.anvil@gmail.com`
|
||||
- Apps Script: 1분마다 `is:unread 입금` 검색 → Worker API 호출
|
||||
@@ -340,6 +374,25 @@ Content-Type: application/json
|
||||
**입금 계좌:** 하나은행 427-910018-27104 (주식회사 아이언클래드)
|
||||
- Vault 경로: `secret/companies/ironclad-corp`
|
||||
|
||||
**Deposit Agent 핵심 규칙:**
|
||||
```
|
||||
1. 금액 제한 없음: 1원도 입금 가능
|
||||
2. 입금 신고 시 반드시 입금자명 + 금액 확인 (빠지면 물어보기)
|
||||
3. "계좌번호 주세요" → get_account_info 호출
|
||||
```
|
||||
|
||||
**Deposit Agent 도구:**
|
||||
| 함수 | 설명 | 권한 |
|
||||
|------|------|------|
|
||||
| `get_balance` | 잔액 조회 | 모든 사용자 |
|
||||
| `get_account_info` | 입금 계좌 안내 | 모든 사용자 |
|
||||
| `request_deposit` | 입금 신고 | 모든 사용자 |
|
||||
| `get_transactions` | 거래 내역 | 모든 사용자 |
|
||||
| `cancel_transaction` | 입금 취소 | 모든 사용자 |
|
||||
| `get_pending_list` | 대기 목록 | 관리자 |
|
||||
| `confirm_deposit` | 입금 확인 | 관리자 |
|
||||
| `reject_deposit` | 입금 거절 | 관리자 |
|
||||
|
||||
---
|
||||
|
||||
## Domain System
|
||||
|
||||
Reference in New Issue
Block a user