[build-system] requires = ["hatchling>=1.21"] build-backend = "hatchling.build" [project] name = "korean-privacy-ai-assistant" version = "0.1.0" description = "Korean Privacy Law (개인정보보호법) consultation chatbot for individuals, SMBs, and small clinics" readme = "README.md" license = "MIT" requires-python = ">=3.11" keywords = ["korean-law", "privacy", "개인정보보호법", "rag", "chatbot", "gemma"] classifiers = [ "Development Status :: 3 - Alpha", "Intended Audience :: End Users/Desktop", "License :: OSI Approved :: MIT License", "Natural Language :: Korean", "Operating System :: OS Independent", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", ] dependencies = [ "httpx[http2]>=0.27", "pydantic>=2.6", "pydantic-settings>=2.2", "lxml>=5", "diskcache>=5.6", "tenacity>=8", "platformdirs>=4", "fastapi>=0.110", "uvicorn[standard]>=0.27", "python-dotenv>=1", "pyyaml>=6", "huggingface-hub>=0.23", "tqdm>=4.66", "sse-starlette>=2.1", "truststore>=0.10", ] [project.optional-dependencies] llm = ["llama-cpp-python>=0.3"] # HF Spaces (ZeroGPU) 데모 배포용 — 같은 가중치 `google/gemma-4-E2B-it` 를 # transformers + @spaces.GPU 로 돌린다. 로컬 사용자는 설치 불필요. hf = [ "gradio>=5.0", "transformers>=4.45", "torch>=2.4", "accelerate>=0.34", "spaces>=0.30", ] # 빌드 타임 docling 의존성 — 두 용도가 같은 패키지 셋을 공유: # 1) PIPC 결정문 별지(이미지) → markdown OCR. 옵트인: # pip install -e ".[pipc-ocr]" # export KPAA_PIPC_OCR=1 # EasyOCR 한국어 모델로 한글 별지 정확도 ↑ (docling 기본 ocrmac 대비). # 2) `kpaa extract-guide` (안내서 PDF → markdown). born-digital 이라 OCR 없이 # 텍스트 직접 추출 → easyocr 가중치 다운로드는 발생하지 않음. 이후 청킹은 # 사용자 + Claude 인터랙티브 큐레이션 → `data/guide/chunks/*.jsonl`. # 런타임(검색·답변)은 sqlite3 만 필요 — 일반 사용자는 이 extra 설치 불필요. pipc-ocr = ["docling>=2.0", "easyocr>=1.7"] dev = [ "pytest>=8", "pytest-asyncio>=0.23", "vcrpy>=6", "ruff>=0.4", "invoke>=2.2", ] [project.scripts] kpaa = "kpaa.cli:main" [project.urls] Homepage = "https://github.com/sz1-kca/korean-privacy-ai-assistant" Issues = "https://github.com/sz1-kca/korean-privacy-ai-assistant/issues" [tool.hatch.build.targets.wheel] packages = ["src/kpaa"] [tool.ruff] line-length = 100 target-version = "py311" [tool.ruff.lint] select = ["E", "F", "W", "I", "B", "UP"] ignore = ["E501"] # SIM 룰은 가독성 호불호가 갈려서 select에서 제외 (한국어 분기 코드 가독성 우선) [tool.pytest.ini_options] asyncio_mode = "auto" testpaths = ["tests"]