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.initAppConfig.ready()에서 호출하십시오. WebSocket consumer 내부에서도 junyul.events.record_* 호출이 가능합니다 — SDK는 내부적으로 asyncio-safe 입니다.