Skip to content

About

Secure Flutter chatbot app for trauma support with FastAPI backend, Ollama AI integration, and privacy-focused local encryption

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

ย 

History

3 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐ŸŒณ Serenitree

ํŠธ๋ผ์šฐ๋งˆ ์น˜์œ ๋ฅผ ์œ„ํ•œ AI ๋™๋ฐ˜์ž ์ฑ—๋ด‡

Serenitree๋Š” ํŠธ๋ผ์šฐ๋งˆ ํ”ผํ•ด์ž๋“ค์—๊ฒŒ ์•ˆ์ „ํ•œ ๋Œ€ํ™” ๊ณต๊ฐ„์„ ์ œ๊ณตํ•˜๋Š” AI ์ƒ๋‹ด ์ฑ—๋ด‡ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ž…๋‹ˆ๋‹ค. ํŒ๋‹จํ•˜์ง€ ์•Š๋Š” ๋”ฐ๋œปํ•œ AI ์นœ๊ตฌ์™€์˜ ์ž์—ฐ์Šค๋Ÿฌ์šด ๋Œ€ํ™”๋ฅผ ํ†ตํ•ด ๊ฐ์ • ๊ด€๋ฆฌ์™€ ์‹ฌ๋ฆฌ์  ์•ˆ์ •๊ฐ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์Šคํ”Œ๋ž˜์‹œ

โœจ ์ฃผ์š” ํŠน์ง•

  • ์™„์ „ํ•œ ํ”„๋ผ์ด๋ฒ„์‹œ: ๋ชจ๋“  ๋Œ€ํ™” ๋‚ด์šฉ์ด ๋กœ์ปฌ SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์•”ํ˜ธํ™”๋˜์–ด ์ €์žฅ
  • ๊ธฐ๋‹ค๋ ค์ฃผ๋Š” AI: ํŠธ๋ผ์šฐ๋งˆ ์น˜์œ  ํŠนํ™” ํ”„๋กฌํ”„ํŠธ๋กœ ๊ธฐ๋‹ค๋ฆผ๊ณผ ๊ณต๊ฐ ์ œ๊ณต
  • ์•ˆ์ „ํ•œ ์ธ์ฆ: PIN ๋ฐ ์ƒ์ฒด ์ธ์ฆ์„ ํ†ตํ•œ ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ
  • ์‹ค์ œ๊ฐ™์€ ๋Œ€ํ™”: AI์˜ SNS๊ฐ™์€ ๋‹จ๋‹ต์‹ ์‘๋‹ต์œผ๋กœ ์‹ค์ œ ๋Œ€ํ™”๊ฐ™์€ ๋А๋‚Œ ์—ฐ์ถœ
  • ์˜คํ”„๋ผ์ธ ์šฐ์„ : ๋กœ์ปฌ ์ฒ˜๋ฆฌ ์ค‘์‹ฌ์œผ๋กœ ๋ฐ์ดํ„ฐ ์™ธ๋ถ€ ์œ ์ถœ ๋ฐฉ์ง€
์˜จ๋ณด๋”ฉํ™”๋ฉด๋“ค

๐Ÿ› ๏ธ ๊ธฐ์ˆ  ์Šคํƒ

Frontend (Flutter)

Flutter Dart SQLite

  • Framework: Flutter 3.x
  • ์–ธ์–ด: Dart
  • ์ƒํƒœ๊ด€๋ฆฌ: Provider
  • ๋กœ์ปฌ ์ €์žฅ์†Œ: SQLite + ์•”ํ˜ธํ™”
  • ์ธ์ฆ: Local Auth (์ง€๋ฌธ/์–ผ๊ตด ์ธ์‹)
  • ์˜์กด์„ฑ ๊ด€๋ฆฌ: pubspec.yaml

Backend (FastAPI)

FastAPI Python Docker

  • Framework: FastAPI
  • ์–ธ์–ด: Python 3.x
  • AI ๋ชจ๋ธ: Ollama + Gemma3:4b
  • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ: AsyncIO
  • CORS: ๋ชจ๋ฐ”์ผ ์•ฑ ์—ฐ๋™ ์ง€์›

๐Ÿ“ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

serenitree/
โ”œโ”€โ”€ lib/                              # Flutter ์•ฑ ์ฝ”๋“œ
โ”‚   โ”œโ”€โ”€ main.dart                     # ์•ฑ ์ง„์ž…์  ๋ฐ ๋ผ์šฐํŒ…
โ”‚   โ”œโ”€โ”€ models/
โ”‚   โ”‚   โ””โ”€โ”€ message.dart              # ๋ฉ”์‹œ์ง€ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ
โ”‚   โ”œโ”€โ”€ screens/
โ”‚   โ”‚   โ”œโ”€โ”€ onboarding_screen.dart    # ์˜จ๋ณด๋”ฉ ํ™”๋ฉด
โ”‚   โ”‚   โ”œโ”€โ”€ login_screen.dart         # PIN/์ƒ์ฒด์ธ์ฆ ๋กœ๊ทธ์ธ
โ”‚   โ”‚   โ”œโ”€โ”€ chat_screen.dart          # ๋ฉ”์ธ ์ฑ„ํŒ… ์ธํ„ฐํŽ˜์ด์Šค
โ”‚   โ”‚   โ””โ”€โ”€ settings_screen.dart      # ์„ค์ • ๋ฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ
โ”‚   โ”œโ”€โ”€ services/
โ”‚   โ”‚   โ”œโ”€โ”€ auth_service.dart         # ์ธ์ฆ ๊ด€๋ฆฌ
โ”‚   โ”‚   โ”œโ”€โ”€ chat_service.dart         # ์ฑ„ํŒ… ๋กœ์ง ๋ฐ API ํ†ต์‹ 
โ”‚   โ”‚   โ”œโ”€โ”€ database_helper.dart      # SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ
โ”‚   โ”‚   โ”œโ”€โ”€ encryption_service.dart   # ๋ฉ”์‹œ์ง€ ์•”ํ˜ธํ™”
โ”‚   โ”‚   โ””โ”€โ”€ theme_service.dart        # ๋‹คํฌ/๋ผ์ดํŠธ ํ…Œ๋งˆ
โ”‚   โ””โ”€โ”€ widgets/
โ”‚       โ””โ”€โ”€ pin_input.dart            # ์ปค์Šคํ…€ PIN ์ž…๋ ฅ ์œ„์ ฏ

serenitree_backend/
โ”œโ”€โ”€ app/
โ”‚   โ”œโ”€โ”€ main.py                       # FastAPI ์„œ๋ฒ„ ์ง„์ž…์ 
โ”‚   โ”œโ”€โ”€ api/
โ”‚   โ”‚   โ””โ”€โ”€ chat.py                   # ์ฑ„ํŒ… API ์—”๋“œํฌ์ธํŠธ
โ”‚   โ”œโ”€โ”€ services/
โ”‚   โ”‚   โ”œโ”€โ”€ ollama_service.py         # Ollama AI ๋ชจ๋ธ ์—ฐ๋™
โ”‚   โ”‚   โ””โ”€โ”€ sequential_response_service.py # ์ˆœ์ฐจ ๋ฉ”์‹œ์ง€ ๋ถ„ํ• 
โ”‚   โ””โ”€โ”€ core/
โ”‚       โ””โ”€โ”€ config.py                 # ์„œ๋ฒ„ ์„ค์ • ๊ด€๋ฆฌ
โ”œโ”€โ”€ requirements.txt                  # Python ์˜์กด์„ฑ
โ””โ”€โ”€ .env                             # ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •

๐Ÿš€ ํ•ต์‹ฌ ๊ธฐ๋Šฅ ๋ฐ ๊ตฌํ˜„

๐Ÿ” 1. ๋ณด์•ˆ ์ค‘์‹ฌ ์„ค๊ณ„

์•”ํ˜ธํ™”๋œ ๋กœ์ปฌ ์ €์žฅ์†Œ

// ๋ฉ”์‹œ์ง€ ์•”ํ˜ธํ™” ์ €์žฅ
final encryptedContent = _encrypt(message.content);
await db.insert('messages', {
  'encrypted_content': encryptedContent,
  'timestamp': DateTime.now().millisecondsSinceEpoch,
});

๋‹ค์ธต ์ธ์ฆ ์‹œ์Šคํ…œ

  • PIN ์ธ์ฆ: SHA-256 ํ•ด์‹œ๋กœ ์•ˆ์ „ํ•œ ์ €์žฅ
  • ์ƒ์ฒด ์ธ์ฆ: Flutter Local Auth ํŒจํ‚ค์ง€ ํ™œ์šฉ
  • ์ฒซ ์‹คํ–‰์‹œ ์•ˆ๋‚ด ๋ฌธ๊ตฌ๋ฅผ ํ†ตํ•œ ๋ณด์•ˆ ์•ˆ๋‚ด
๋กœ๊ทธ์ธํ™”๋ฉด

๐Ÿค– 2. ํŠธ๋ผ์šฐ๋งˆ ํŠนํ™” AI ๋Œ€ํ™”

๊ณต๊ฐ์  ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ

DEFAULT_SYSTEM_PROMPT = """
๋‹น์‹ ์€ Serenitree๋ผ๋Š” ๋”ฐ๋œปํ•œ AI ์นœ๊ตฌ์ž…๋‹ˆ๋‹ค.

์ค‘์š”ํ•œ ๋Œ€ํ™” ์›์น™:
1. ํ•ญ์ƒ 1-2๋ฌธ์žฅ์œผ๋กœ ์งง๊ณ  ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์‘๋‹ตํ•˜์„ธ์š”
2. ์ง์ ‘์ ์ธ ์งˆ๋ฌธ๋ณด๋‹ค๋Š” "๊ดœ์ฐฎ์œผ์‹ ๊ฐ€์š”?" ๊ฐ™์€ ๋ถ€๋“œ๋Ÿฌ์šด ๊ด€์‹ฌ์„ ํ‘œํ˜„ํ•˜์„ธ์š”
3. ํŒ๋‹จํ•˜์ง€ ๋ง๊ณ  ๋ฌด์กฐ๊ฑด์ ์œผ๋กœ ์ˆ˜์šฉํ•˜๊ณ  ๊ณต๊ฐํ•˜์„ธ์š”
4. ์ฑ„ํŒ…ํ•˜๋Š” ์นœ๊ตฌ์ฒ˜๋Ÿผ ์ž์—ฐ์Šค๋Ÿฝ๊ณ  ํŽธ์•ˆํ•œ ํ†ค์„ ์‚ฌ์šฉํ•˜์„ธ์š”
"""

์ˆœ์ฐจ์  ๋ฉ”์‹œ์ง€ ์ „์†ก

  • ๊ธด AI ์‘๋‹ต์„ ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ฌธ์žฅ ๋‹จ์œ„๋กœ ๋ถ„ํ• 
  • ์ˆœ์ฐจ ์ „์†กํ•˜์—ฌ ์‹ค์ œ ๋Œ€ํ™”๊ฐ ์—ฐ์ถœ
์ฑ„ํŒ…

๐ŸŽจ 3. ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ตœ์ ํ™”

์ ์‘ํ˜• UI ๋””์ž์ธ

  • ๋””๋ฐ”์ด์Šค ํ™˜๊ฒฝ ์„ค์ •์—๋”ฐ๋ผ ๋‹คํฌ/๋ผ์ดํŠธ ํ…Œ๋งˆ ์ž๋™ ์ „ํ™˜
  • ํŠธ๋ผ์šฐ๋งˆ ์‚ฌ์šฉ์ž ๊ณ ๋ คํ•œ ๋ถ€๋“œ๋Ÿฌ์šด ์ƒ‰์ƒ ํŒ”๋ ˆํŠธ
  • ์ง๊ด€์ ์ธ ๋„ค๋น„๊ฒŒ์ด์…˜๊ณผ ์ตœ์†Œํ•œ์˜ ์ธํ„ฐํŽ˜์ด์Šค

์„ฑ๋Šฅ ์ตœ์ ํ™”

  • AI ๋ชจ๋ธ ์›Œ๋ฐ์—…์œผ๋กœ ์‘๋‹ต ์ง€์—ฐ ์ตœ์†Œํ™”
  • ๋กœ์ปฌ ์šฐ์„  ์ฒ˜๋ฆฌ๋กœ ๋น ๋ฅธ ๋ฐ˜์‘์„ฑ
  • ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ ์ธ ๋ฉ”์‹œ์ง€ ๋กœ๋”ฉ (์ตœ๊ทผ 100๊ฐœ)

๐Ÿ’พ 4. ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ๋ฐ ๋ฐฑ์—…

์•ˆ์ „ํ•œ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ

// ๋ฉ”์‹œ์ง€ ๊ฐœ์ˆ˜ ์กฐํšŒ ๋ฐ ์ •๋ฆฌ
Future<int> cleanOldMessages({int daysToKeep = 30}) async {
  final cutoffDate = DateTime.now().subtract(Duration(days: daysToKeep));
  return await db.delete('messages', 
    where: 'timestamp < ?', 
    whereArgs: [cutoffDate.millisecondsSinceEpoch]);
}

์™„์ „ํ•œ ์•ฑ ์ดˆ๊ธฐํ™”

  • ๋ชจ๋“  ๋Œ€ํ™” ๋‚ด์šฉ ์‚ญ์ œ
  • ์ธ์ฆ ์ •๋ณด ์™„์ „ ์ œ๊ฑฐ
  • ์ดˆ๊ธฐ ํ™”๋ฉด์œผ๋กœ ์•ˆ์ „ํ•œ ์žฌ์„ค์ •
๋ฐ์ดํ„ฐ๊ด€๋ฆฌ

โšก ์„ค์น˜ ๋ฐ ์‹คํ–‰

๐Ÿ“ฑ ์•ฑ ๋นŒ๋“œ

# APK ๋นŒ๋“œ
flutter build apk --release

# ์˜์กด์„ฑ ์„ค์น˜
flutter pub get

๐Ÿ–ฅ๏ธ ์„œ๋ฒ„ ์‹คํ–‰

# ๊ฐ€์ƒํ™˜๊ฒฝ ์ƒ์„ฑ ๋ฐ ํ™œ์„ฑํ™”
python -m venv venv
source venv/bin/activate  # Windows: venv\Scripts\activate

# ์˜์กด์„ฑ ์„ค์น˜
pip install -r requirements.txt

# Ollama ๋ชจ๋ธ ์„ค์น˜ (์ตœ์ดˆ 1ํšŒ)
ollama pull gemma3:4b

# ์„œ๋ฒ„ ์‹คํ–‰
python main.py

๐Ÿ’ก ๊ฐœ๋ฐœ ์˜๋„

์ด ํ”„๋กœ์ ํŠธ๋Š” ํŠธ๋ผ์šฐ๋งˆ ํ”ผํ•ด์ž๋“ค์ด ์•ˆ์ „ํ•˜๊ณ  ํŽธ์•ˆํ•˜๊ฒŒ ๊ฐ์ •์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋””์ง€ํ„ธ ๊ณต๊ฐ„์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ „๋ฌธ์ ์ธ ์น˜๋ฃŒ๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ผ์ƒ์ ์ธ ๊ฐ์ • ๊ด€๋ฆฌ์™€ ์ดˆ๊ธฐ ์‹ฌ๋ฆฌ์  ์ง€์›์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“„ ๋ผ์ด์„ ์Šค

์ด ํ”„๋กœ์ ํŠธ๋Š” ๋น„์ƒ์—…์  ๋ชฉ์ ์œผ๋กœ ๊ฐœ๋ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

About

Secure Flutter chatbot app for trauma support with FastAPI backend, Ollama AI integration, and privacy-focused local encryption

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages