Django 통합
settings.py
# settings.py
import junyul
junyul.init(
api_key=os.environ["JUNYUL_API_KEY"],
tenant_secret=os.environ["JUNYUL_TENANT_SECRET"],
)
MIDDLEWARE = [
# ... your existing middleware ...
"junyul.disclosure.django.ComplyMiddleware",
]
JUNYUL_ASSET_ID = "chatbot_v1"
JUNYUL_BANNER_LOCALE = "ko"
JUNYUL_BANNER_POSITION = "top"view
# views.py
import junyul
@junyul.track(asset_id="chatbot_v1")
def chat_view(request):
reply = call_llm(request.POST["message"])
junyul.events.record_decision(
asset_id="chatbot_v1",
action="automated_decision_made",
legal_bases=["ai_basic_law_kr", "pipa_37_2_kr"],
risk_tier="limited",
subject_id=request.user.id, # HMAC'd locally
)
return JsonResponse({"reply": reply})Channels (ASGI) 지원
Django Channels 환경에서 junyul.init는 AppConfig.ready()에서 호출하십시오. WebSocket consumer 내부에서도 junyul.events.record_* 호출이 가능합니다 — SDK는 내부적으로 asyncio-safe 입니다.