--- title: Local Bridge API emoji: ๐ŸŒ‰ colorFrom: blue colorTo: green sdk: docker pinned: false app_port: 7860 --- # Local Bridge โ€” Backend API ์™ธ๊ตญ์ธ ๊ทผ๋กœ์ž๋ฅผ ์œ„ํ•œ AI ๊ธฐ๋ฐ˜ ๋…ธ๋™๊ถŒ์ต ๋ณดํ˜ธ ํ”Œ๋žซํผ **Local Bridge**์˜ FastAPI ๋ฐฑ์—”๋“œ์ž…๋‹ˆ๋‹ค. Hugging Face Spaces (CPU Basic) ์œ„์—์„œ ๋™์ž‘ํ•˜๋ฉฐ, Flutter ์•ฑ๊ณผ `/chat` ์—”๋“œํฌ์ธํŠธ๋กœ ํ†ต์‹ ํ•ฉ๋‹ˆ๋‹ค. --- ## ์—”๋“œํฌ์ธํŠธ | Method | Path | ์„ค๋ช… | |--------|------|------| | GET | `/` | ์„œ๋ฒ„ ์ƒํƒœ ํ™•์ธ | | GET | `/health` | ํ—ฌ์Šค์ฒดํฌ | | POST | `/chat` | ๋ฉ”์ธ ์—์ด์ „ํŠธ ํ˜ธ์ถœ | ### POST `/chat` โ€” ์š”์ฒญ ```json { "session_id": "uuid-v4", "message": "์ฃผํœด์ˆ˜๋‹น์ด ๋ญ์˜ˆ์š”?", "image_base64": "...(์„ ํƒ, ๊ณ„์•ฝ์„œ ์ด๋ฏธ์ง€)", "language": "ko", "location": { "lat": 37.2636, "lng": 127.0286 } } ``` ### POST `/chat` โ€” ์‘๋‹ต ```json { "session_id": "uuid-v4", "reply": "์ฃผํœด์ˆ˜๋‹น์€ ...", "warning_cards": [ { "title": "์ตœ์ €์ž„๊ธˆ ๋ฏธ๋‹ฌ", "content": "...", "severity": "high", "law": "์ตœ์ €์ž„๊ธˆ๋ฒ• ์ œ6์กฐ" } ], "map_pins": [ { "name": "์ˆ˜์›์‹œ์™ธ๊ตญ์ธ๋ณต์ง€์„ผํ„ฐ", "address": "...", "lat": 37.27, "lng": 127.01, "phone": "031-..." } ], "next_actions": ["๊ณ ์šฉ๋…ธ๋™๋ถ€ 1350์— ์ „ํ™”ํ•˜์„ธ์š”"] } ``` --- ## ํŒŒ์ดํ”„๋ผ์ธ ``` POST /chat โ””โ”€ DLP ๋งˆ์Šคํ‚น (PII ์ œ๊ฑฐ) โ””โ”€ ๊ณ„์•ฝ์„œ ์ด๋ฏธ์ง€ ์ „์ฒ˜๋ฆฌ (์ด๋ฏธ์ง€ ์ฒจ๋ถ€ ์‹œ, Gemini Vision) โ””โ”€ Gemini 3.1 Pro ๋‹จ์ผ ์—์ด์ „ํŠธ + Function Calling ๋ฃจํ”„ (์ตœ๋Œ€ 8ํšŒ) โ”œโ”€ search_labor_law(query) โ†’ ChromaDB ๋ฒกํ„ฐ ๊ฒ€์ƒ‰ โ”œโ”€ find_nearby_centers(lat, lng) โ†’ ์ˆ˜์›์‹œ ๊ธฐ๊ด€ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ โ””โ”€ get_center_info(type) โ†’ ๊ธฐ๊ด€ ๋ชฉ๋ก ์กฐํšŒ โ””โ”€ ChatResponse ๋ฐ˜ํ™˜ ``` --- ## ํ™˜๊ฒฝ๋ณ€์ˆ˜ (HF Spaces Secrets) Space ์„ค์ • โ†’ **Variables and secrets** ์—์„œ ์•„๋ž˜ ํ•ญ๋ชฉ์„ Secret์œผ๋กœ ๋“ฑ๋กํ•˜์„ธ์š”. | ๋ณ€์ˆ˜๋ช… | ํ•„์ˆ˜ | ์„ค๋ช… | |--------|------|------| | `GEMINI_API_KEY` | โœ… | Google AI Studio API ํ‚ค | | `GOOGLE_MAPS_API_KEY` | ์„ ํƒ | Maps API (๋ฏธ์„ค์ • ์‹œ maps_tool ๋น„ํ™œ์„ฑ) | | `GOOGLE_CLOUD_PROJECT_ID` | ์„ ํƒ | Cloud DLP ์‚ฌ์šฉ ์‹œ ํ•„์š” | > `VECTOR_DB_PATH`๋Š” Dockerfile์—์„œ `/data/chromadb`๋กœ ์ž๋™ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. > ์ฒซ ์‹คํ–‰ ์‹œ `labor_law_chunks.json`์—์„œ ์ž๋™ ์‹œ๋”ฉ๋˜๋ฉฐ, `/data`์— ์ €์žฅ๋˜์–ด ์žฌ์‹œ์ž‘ ์‹œ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. --- ## ๋กœ์ปฌ ์‹คํ–‰ ```bash cd backend cp ../.env.example .env # ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ • pip install -r requirements.txt uvicorn app:app --reload --host 0.0.0.0 --port 8000 ``` Flutter ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ์ ‘๊ทผํ•  ๋•Œ๋Š” `http://10.0.2.2:8000` ์„ ์‚ฌ์šฉํ•˜์„ธ์š”. --- ## ๊ธฐ์ˆ  ์Šคํƒ - **Runtime**: Python 3.11 / FastAPI / Uvicorn - **AI**: Gemini 3.1 Pro (Function Calling), `text-embedding-004` - **Vector DB**: ChromaDB (persistent, `/data/chromadb`) - **PII**: Google Cloud DLP (์„ ํƒ) / regex fallback - **๋ฐฐํฌ**: Hugging Face Spaces โ€” Docker SDK, CPU Basic (2 vCPU / 16 GB RAM)