|
명함 이미지를 받으면 자동 감지 → 전처리 → OCR → 사용자 확인 → Google Contacts 저장까지 처리한다.
CODEBLOCK0
CODEBLOCK1
imageModel에 요청:
CODEBLOCK2
CODEBLOCK3
전처리된 이미지로 OCR 진행.
원본 그대로 OCR 진행. 전처리 건너뜀.
imageModel(Gemini Flash)에 다음 JSON 구조로 추출 요청:
CODEBLOCK4
한국 번호를 국제 형식으로 변환:
| 원본 | 변환 |
|---|---|
| INLINECODE0 | INLINECODE1 |
| INLINECODE2 |
+82-2-1234-5678 |031-123-4567 | +82-31-123-4567 |
규칙:
0으로 시작하는 한국 번호 → 앞의 0을 +82-로 교체- 또는 공백은 -로 통일koreanStyleName=true, 기본값)한국에서는 성과 이름을 분리하지 않는다. 비즈니스에서 "홍길동 대표", "김갑돌 과장"처럼 풀네임이 하나의 단위다.
People API 저장 시:
familyName → 비움 (빈 문자열)홍길동)#홍길동 과장)koreanStyleName=false이거나, OCR language가 ko가 아닌 경우)외국인은 first name / last name 분리가 기본:
givenName → first name (예: John)Smith)koreanReading=true)외국어 명함일 때, 이름과 회사명을 한국어로 독음(transliteration)하여 기록:
| 원본 | 독음 |
|---|---|
| John Smith | 존 스미스 |
| Google LLC |
적용 방법:
phoneticName 필드에 저장 (검색 가능!)biographies에 기록People API 저장:
CODEBLOCK5
규칙: 독음은 성/이름 분리하지 않는다. 풀네임 독음을 phoneticGivenName에 통째로 넣는다.
예시: Kweh Hoong Wayne → phoneticGivenName=퀘 훙 웨인
예시: François Dupont → phoneticGivenName= INLINECODE31
효과: Google Contacts에서 "퀘 훙 웨인"으로 검색해도 해당 연락처를 찾을 수 있다.
INLINECODE32 이면 독음 생략.
config 설정을 읽어 unstructuredName (displayName)을 생성한다.
CODEBLOCK6
| hashtag | appendTitle | appendCompany | 결과 |
|---|---|---|---|
| off | off | off | INLINECODE34 |
| on |
#홍길동 |
| off | on | off | 홍길동 과장 |
| off | off | on | 홍길동 (ABC주식회사) |
| on | on | on | #홍길동 과장 (ABC주식회사) |
names[].unstructuredName → 포맷된 displayName (예: #홍길동 과장)홍길동)names[].unstructuredName → 포맷된 displayName (예: #John Smith, VP)John)Smith)OCR + 포맷 결과를 아래 템플릿 그대로 출력한다. 포맷 변경 금지.
한국 명함 템플릿 (이 포맷 그대로 사용):
CODEBLOCK7
거점이 1개뿐이면 📍 label 없이 한 줄로:
CODEBLOCK8
외국 명함 템플릿 (koreanReading=true, 이 포맷 그대로 사용):
CODEBLOCK9
규칙:
👤 #Kweh Hoong Wayne + 💼 Technical Service Manager👤 #Kweh Hoong Wayne TECHNICAL SERVICE MANAGER1. 저장 / 2. 수정 / 3. 취소 번호 선택. "저장할까?" 같은 서술형 금지.| 입력 | 동작 |
|---|---|
| INLINECODE55 | 저장 진행 |
| INLINECODE56 |
3 | 취소 |
번호 외 텍스트 입력도 허용: "ㅇㅇ", "ok" → 1번 처리, "취소" → 3번 처리.
하지만 번호 입력을 우선 유도한다.
INLINECODE58 이면 무조건 실행한다. 모든 명함을 일관되게 보정한다.
말로만 "적용했어" 하지 말고 실제로 exec 도구로 명령어를 실행해라.
CODEBLOCK10
원본 이미지를 Nano Banana Pro에 보내서 배경 제거 + 정면 보정 + 1:1 정사각형으로 변환.
CODEBLOCK11
결과: $BIZCARD_TMP/clean.jpg — 1024x1024, 배경 제거, 정면 보정, 1:1 정사각형.
clean.jpg를 업로드한다. raw.jpg가 아니다.
CODEBLOCK12
CODEBLOCK13
절대 금지:
-deskew나 -distort Perspective 사용 (Nano Banana Pro가 전부 처리)Nano Banana Pro API 실패 시: 원본(raw.jpg)을 그대로 업로드하고 "이미지 보정 실패: 원본으로 저장" 알림.
저장 전 반드시 이름 + 휴대폰 번호 2개 필드로 기존 연락처를 자동 검색한다. 사용자가 요청하지 않아도 항상 실행.
CODEBLOCK14
번호 검색 시 정규화된 +82 포맷과 원본(010) 포맷 모두로 검색하여 누락을 방지한다.
| 이름 일치 | 번호 일치 | 판정 | 동작 |
|---|---|---|---|
| ✅ | ✅ | 확정 중복 | 사용자에게 옵션 제시 |
| ✅ |
아래 템플릿을 그대로 출력한다. 포맷 변경 금지.
CODEBLOCK15
아래 템플릿을 그대로 출력한다. 포맷 변경 금지.
CODEBLOCK16
중복 없으면 중복 관련 메시지 자체를 출력하지 않는다. 바로 사용자 확인으로 넘어간다.
Maton API Gateway (People API)를 사용. 전체 필드 + 커스텀 Name + 사진 지원.
CODEBLOCK17
cardAsPhoto=true)Section 8의 파이프라인을 따른다. 보정 + 업로드는 Section 8에서 일괄 처리.
파이프라인 종료 시 (성공, 취소, 에러 무관) $BIZCARD_TMP 디렉터리 전체 삭제 (rm -rf "$BIZCARD_TMP").
다른 세션의 파일을 건드리지 않는다.
/bizcard config사용자가 /bizcard config 또는 "명함 설정"을 입력하면, 아래 템플릿을 그대로 복사해서 출력한다. 절대 다른 포맷으로 바꾸지 마라. on/off 값만 config.json 실제 상태에 맞춰 교체.
출력 템플릿 (이 포맷 그대로 사용):
CODEBLOCK18
이모지 규칙: on → 🟢, off → ❌. 값 바로 뒤에 이모지 붙인다.
규칙:
off 값만 config.json 실제 상태에 맞춰 출력.번호만 입력하면 현재 상태의 반대로 자동 전환된다. config.json 파일을 실제로 수정하고, 아래 응답 포맷 그대로 출력.
세션 규칙: /bizcard config 실행 후 다음 1회 입력만 설정 변경으로 처리한다. 그 이후의 숫자 입력은 일반 대화로 취급. 설정을 연속 변경하려면 /bizcard config를 다시 입력.
예시 1: 현재 3. Append company : off 상태에서 사용자가 3 입력
응답 (이 포맷 그대로):
CODEBLOCK19
예시 2: 현재 1. Hashtag : on 상태에서 사용자가 1 입력
응답 (이 포맷 그대로):
CODEBLOCK20
규칙: 변경된 항목만 한 줄 출력 + "All set now." 그 외 추가 멘트 금지.
| 코드 | 동작 | 설명 |
|---|---|---|
| INLINECODE79 | Reset | 기본값으로 초기화 |
| INLINECODE80 |
49 | All off | 전체 설정 끄기 |
입력: 49
응답:
CODEBLOCK21
입력: 00
응답:
CODEBLOCK22
| # | config key | 설명 |
|---|---|---|
| 1 | INLINECODE84 | 이름 앞에 # 추가 (카카오톡 자동추가 방지) |
| 2 |
appendTitle | 이름 뒤에 직함 추가 |
| 3 | appendCompany | 이름 뒤에 (회사명) 추가 |
| 4 | cardAsPhoto | 명함 이미지를 연락처 사진으로 저장 |
| 5 | koreanReading | 외국 명함 이름/회사를 한국어 독음으로 기록 |
| 6 | koreanStyleName | 한국 명함: familyName 비우고 givenName에 풀네임 |
CODEBLOCK23
사용자가 처음 명함을 보낼 때 (bizcard-log.jsonl이 없거나 비어있을 때):
CODEBLOCK24
이후에는 온보딩 없이 바로 처리.
저장 성공 시 memory/bizcard-log.jsonl에 최소한의 정보만 기록한다. 이메일, 전화번호 등 민감한 PII는 저장하지 않는다. 상세 정보는 Google Contacts에서 resourceName으로 조회.
CODEBLOCK25
PII 최소화 원칙: 로그에는 이름과 회사명(검색용)만 남기고, 전화번호/이메일/주소는 저장하지 않는다.
| 명령 | 동작 |
|---|---|
| "명함 검색 홍길동" / "bizcard search 홍길동" | People API searchContacts 실행 |
| "최근 명함" / "recent bizcards" |
bizcard-log.jsonl에서 최근 10건 표시 || 에러 상황 | 사용자 메시지 |
|---|---|
| OCR 실패 / 빈 결과 | "텍스트를 인식하지 못했어. 더 선명한 사진으로 다시 보내줘" |
| Maton API 실패 |
설정 파일: skills/bizcard/config.json
| # | key | 기본값 | 설명 |
|---|---|---|---|
| 1 | INLINECODE96 | INLINECODE97 | 이름 앞에 # 추가 (카카오톡 자동추가 방지) |
| 2 |
appendTitle | true | 이름 뒤에 직함 추가 |appendCompany | false | 이름 뒤에 (회사명) 추가 |cardAsPhoto | true | 명함 이미지를 연락처 사진으로 저장 |koreanReading | true | 외국 명함 이름/회사를 한국어 독음으로 기록 |koreanStyleName | true | 한국 명함: familyName 비우고 givenName에 풀네임 |
| Tool | Purpose | Install |
|---|---|---|
| INLINECODE110 | Maton API Gateway auth (People API proxy) | maton.ai/settings |
| INLINECODE111 |
该技能支持在以下平台通过对话安装:
帮我安装 SkillHub 和 bizcard-1776419958 技能
设置 SkillHub 为我的优先技能安装源,然后帮我安装 bizcard-1776419958 技能
skillhub install bizcard-1776419958
文件大小: 16.92 KB | 发布时间: 2026-4-17 20:02