재회 매니저는 카카오톡 대화 내보내기 파일을 가져와 연락 가능 여부와 다음 행동, 첫 문장 또는 보류 판단을 만들어 주는 Android 앱입니다. 디버그 빌드에 OpenRouter 키가 있으면 DeepSeek V4 Flash로 정리하고, 키가 없거나 모델 호출이 실패하면 안전 정리로 돌아갑니다.
이 저장소는 단일 Android 앱 모듈로 구성되어 있으며, 현재 다음 흐름을 지원합니다.
- 카카오톡 대화 내보내기 파일 가져오기 (
.txt또는 지원되는.csv계열 텍스트) - 대화 내용 로컬 파싱
- 대화, 참여자, 메시지, 분석 결과, 로컬 AI 설정을 Room에 저장
- 저장한 대화 목록과 최근 메시지 확인
- 저장한 대화와 정리 결과를 기기에서 삭제
- 연락 판단, 오늘 할 일, 첫 연락 문장 또는 보류 행동으로 구성된 다음 행동 정리
- 대화 참여자 중 내 카톡 이름을 선택하거나 직접 저장하면 새 연락인지 상대 메시지에 대한 답장인지 구분
.env의OPENROUTER_API_KEY가 있으면 OpenRouter DeepSeek V4 Flash 우선 사용- Gemma 모델 파일이 없을 때도 전체 흐름을 확인할 수 있는 안전 정리 모드
- Gemma 4
.litertlm모델 파일을 선택하고 실행 점검을 통과하면 LiteRT-LM으로 기기 내 분석 실행
- 가져온 대화와 분석 결과는 기기 안에만 저장합니다.
- OpenRouter 모드에서는 분석에 필요한 대화 일부가 OpenRouter로 전송됩니다.
- 필요 없어진 대화와 분석 결과는 기기에서 삭제할 수 있습니다.
- 로그인, 로그아웃, 회원 관리 기능은 넣지 않습니다.
- 클라우드 동기화, 분석 추적, 내장 비밀키는 사용하지 않습니다.
- release 빌드에는 OpenRouter 키를 넣지 않습니다.
- 앱 모듈은 하나로 유지합니다.
- 내부 패키지는
ui,domain,data경계를 유지합니다.
상세 범위는 docs/2026-04-06-mvp-scope.md에 정리되어 있습니다.
현재 파서는 실제 공개 자료에서 확인되는 모바일 텍스트, PC CSV, 익명 말뭉치형 텍스트 패턴을 지원합니다.
- 상단의 대화방 제목 또는 헤더
저장한 날짜 : yyyy-MM-dd HH:mm:ss--------------- 2024년 3월 27일 수요일 ---------------같은 날짜 구분선[이름] [오전 10:55] 메시지형태의 모바일 텍스트 메시지- 이전 메시지에 이어지는 여러 줄 메시지
Date,User,Message형태의 PC CSV 계열 행2019-11-04 22:25:00 , P1 : 메시지형태의 익명 말뭉치형 행
지원하지 않는 파일은 일부만 저장하지 않고 명확한 가져오기 오류를 보여줍니다.
- 앱은 분석 전에 초반 대화, 최근 대화, 감정/경계 신호 주변 메시지, 긴 공백과 마지막 발신자 같은 지표를 먼저 추립니다.
- 내 카톡 이름이 설정되어 있으면 마지막 발신자가 나인지 상대인지 구분해 보류와 답장 제안을 다르게 냅니다.
- 디버그 빌드에
OPENROUTER_API_KEY가 있으면 OpenRouter DeepSeek V4 Flash provider를 먼저 사용합니다. - OpenRouter 키가 없거나 모델 호출이 실패하면 안전 정리 provider를 사용합니다.
- Gemma 4
.litertlm파일을 선택한 뒤 앱 안의 모델 실행 점검을 통과해야 LiteRT-LM provider가 실제 분석에 사용됩니다. - OpenRouter와 Gemma 분석은 로컬 병렬 검수 provider가 안전, 마지막 메시지, 관계 맥락을 다시 확인한 뒤 저장합니다.
- 모델 파일은 APK에 포함하지 않습니다. 앱의 로컬 AI 설정에서
gemma-4-E4B-it.litertlm같은 모델 파일을 선택하면 앱 전용 저장소로 복사합니다. - 로컬 AI 설정에서 모델 파일을 제거하거나 다른 모델로 교체하면 앱 전용 저장소의 기존 복사본만 정리하고 안전 정리로 돌아갈 수 있습니다.
- 분석 결과는 로컬에 저장되며, 확정적인 판단 대신
지금은 보류,먼저 사과 필요,아주 가볍게 가능,정보 부족같은 조심스러운 연락 판단으로 표시됩니다. 보류 판단에서는 보낼 문장을 만들지 않고 오늘 보내지 않는 행동을 제안합니다.
OpenRouter를 직접 확인하려면 루트에 .env를 만들고 키를 넣습니다. .env는 git에 올리지 않습니다.
OPENROUTER_API_KEY=sk-or-v1-..../gradlew testDebugUnitTest
./gradlew lintDebug
./gradlew assembleDebug실제 OpenRouter 호출 smoke는 네트워크와 과금 상태에 영향을 받으므로 명시적으로 켭니다.
RUN_OPENROUTER_LIVE_TESTS=true ./gradlew :app:testDebugUnitTest \
--tests 'com.bssm.reunionmanager.data.analysis.OpenRouterAnalysisProviderTest.analyze_liveOpenRouterSmokeUsesDeepSeekV4FlashWhenKeyIsAvailable'에뮬레이터가 준비되어 있다면 사용자 흐름까지 확인할 수 있습니다.
./gradlew connectedDebugAndroidTest실제 .litertlm 모델 파일까지 확인하려면 모델을 기기에 올린 뒤 smoke test에 경로를 넘깁니다. 에뮬레이터에서는 LiteRT-LM 네이티브 런타임이 SIGILL로 종료될 수 있으므로, 최종 모델 추론 검증은 실제 ARM64 기기에서 확인해야 합니다.
adb push /path/to/gemma-4-E4B-it.litertlm /data/local/tmp/gemma-4-E4B-it.litertlm
./gradlew connectedDebugAndroidTest \
-Pandroid.testInstrumentationRunnerArguments.class=com.bssm.reunionmanager.data.analysis.Gemma4AnalysisProviderDeviceSmokeTest \
-Pandroid.testInstrumentationRunnerArguments.gemmaModelPath=/data/local/tmp/gemma-4-E4B-it.litertlm직접 실행하려면 debug APK를 설치한 뒤 앱을 시작합니다.
adb install -r app/build/outputs/apk/debug/app-debug.apk
adb shell am start -n com.bssm.reunionmanager/.MainActivity- 홈 화면
- 카카오톡 대화 가져오기
- 저장한 대화 목록
- 대화 상세 보기
- 연락 판단과 첫 연락 문장 또는 보류 행동이 포함된 다음 행동
- 로컬 AI 설정
app/src/main/java/com/bssm/reunionmanager/ui- Compose 화면, 내비게이션, ViewModel 상태app/src/main/java/com/bssm/reunionmanager/domain- use case와 분석 provider 계약app/src/main/java/com/bssm/reunionmanager/data- 파서, Room 저장소, repository, provider 구현docs/- 제품 범위와 구현 문서.github/workflows/android.yml- 유닛 테스트, lint, debug 빌드, 에뮬레이터 기능 테스트
- docs/2026-04-06-mvp-scope.md - MVP 범위와 제외 항목
- docs/2026-04-06-implementation.md - 구현 구조와 QA 기록
GitHub Actions는 다음 검증을 실행합니다.
./gradlew testDebugUnitTest./gradlew lintDebug./gradlew assembleDebug./gradlew connectedDebugAndroidTest
성공한 실행에서는 app/build/outputs/apk/debug/app-debug.apk가 workflow artifact로 업로드됩니다.
v* 태그를 push하면 Android release workflow가 실행됩니다. 이 workflow는 debug APK를 빌드하고 artifact로 업로드한 뒤, 같은 APK를 GitHub Release에 첨부합니다.