diff --git a/.env.example b/.env.example index 7ffa667..038a828 100644 --- a/.env.example +++ b/.env.example @@ -6,9 +6,9 @@ PROJECT_NAME="Kaapi-Guardrails" STACK_NAME=Kaapi-Guardrails #Backend -SECRET_KEY=changethis +SECRET_KEY="" FIRST_SUPERUSER=superuser@example.com -FIRST_SUPERUSER_PASSWORD=changethis +FIRST_SUPERUSER_PASSWORD="" EMAIL_TEST_USER="test@example.com" # API Base URL for cron scripts (defaults to http://localhost:8000 if not set) @@ -32,6 +32,6 @@ CALLBACK_CONNECT_TIMEOUT=3 CALLBACK_READ_TIMEOUT=10 # require as a env if you want to use doc transformation -OPENAI_API_KEY="" -GUARDRAILS_HUB_API_KEY="" -AUTH_TOKEN="" \ No newline at end of file +OPENAI_API_KEY="" +GUARDRAILS_HUB_API_KEY="" +AUTH_TOKEN="" diff --git a/.env.test b/.env.test index 50fa678..17af860 100644 --- a/.env.test +++ b/.env.test @@ -6,9 +6,9 @@ PROJECT_NAME="Kaapi-Guardrails" STACK_NAME=Kaapi-Guardrails #Backend -SECRET_KEY="" +SECRET_KEY="" FIRST_SUPERUSER=superuser@example.com -FIRST_SUPERUSER_PASSWORD="" +FIRST_SUPERUSER_PASSWORD="" EMAIL_TEST_USER="test@example.com" # API Base URL for cron scripts (defaults to http://localhost:8000 if not set) @@ -32,6 +32,6 @@ CALLBACK_CONNECT_TIMEOUT=3 CALLBACK_READ_TIMEOUT=10 # require as a env if you want to use doc transformation -OPENAI_API_KEY="" -GUARDRAILS_HUB_API_KEY="" -AUTH_TOKEN="" \ No newline at end of file +OPENAI_API_KEY="" +GUARDRAILS_HUB_API_KEY="" +AUTH_TOKEN="" diff --git a/backend/Dockerfile b/backend/Dockerfile index 99f8bc6..38f4a43 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.10 +FROM python:3.12 ENV PYTHONUNBUFFERED=1 diff --git a/backend/app/api/deps.py b/backend/app/api/deps.py index 3c417bc..8255665 100644 --- a/backend/app/api/deps.py +++ b/backend/app/api/deps.py @@ -1,11 +1,11 @@ from collections.abc import Generator +import secrets from typing import Annotated from fastapi import Depends, Header, HTTPException, status, Security from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials from sqlmodel import Session -# from app.core import security from app.core.config import settings from app.core.db import engine @@ -30,7 +30,7 @@ def verify_bearer_token( token = credentials.credentials - if token != settings.AUTH_TOKEN: + if not secrets.compare_digest(token, settings.AUTH_TOKEN): raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid token", diff --git a/backend/app/api/main.py b/backend/app/api/main.py index 0fc8026..dbab9f4 100644 --- a/backend/app/api/main.py +++ b/backend/app/api/main.py @@ -4,7 +4,4 @@ api_router = APIRouter() api_router.include_router(utils.router) -api_router.include_router(guardrails.router) - -# if settings.ENVIRONMENT == "local": -# api_router.include_router(private.router) +api_router.include_router(guardrails.router) \ No newline at end of file diff --git a/backend/app/api/routes/guardrails.py b/backend/app/api/routes/guardrails.py index d5c8699..df0f1ba 100644 --- a/backend/app/api/routes/guardrails.py +++ b/backend/app/api/routes/guardrails.py @@ -1,14 +1,13 @@ import uuid from uuid import UUID -from fastapi import APIRouter, HTTPException, status +from fastapi import APIRouter, status from fastapi.responses import JSONResponse -from app.models.guardrail_config import GuardrailInputRequest, GuardrailOutputRequest from app.api.deps import AuthDep, SessionDep from app.core.api_response import APIResponse from app.core.guardrail_controller import build_guard, get_validator_config_models - from app.crud.request_log import RequestLogCrud +from app.models.guardrail_config import GuardrailInputRequest, GuardrailOutputRequest from app.models.request import RequestLogUpdate router = APIRouter(prefix="/guardrails", tags=["guardrails"]) diff --git a/backend/app/api/routes/utils.py b/backend/app/api/routes/utils.py index 70b7791..25f506c 100644 --- a/backend/app/api/routes/utils.py +++ b/backend/app/api/routes/utils.py @@ -1,5 +1,4 @@ from fastapi import APIRouter -from app.api.deps import AuthDep router = APIRouter(prefix="/utils", tags=["utils"]) diff --git a/backend/app/core/api_response.py b/backend/app/core/api_response.py index a6a57df..a7eae03 100644 --- a/backend/app/core/api_response.py +++ b/backend/app/core/api_response.py @@ -9,7 +9,7 @@ class APIResponse(BaseModel): @classmethod def success_response(cls, data: Any, metadata: Any = None): - return cls(success=True, data=data, metadata=metadata) + return cls(success=True, data=data).model_dump(exclude_none=True) @classmethod def failure_response(cls, error: Any, metadata: Any = None): diff --git a/backend/app/core/validators/gender_assumption_bias.py b/backend/app/core/validators/gender_assumption_bias.py index 33dd0bb..5c5add4 100644 --- a/backend/app/core/validators/gender_assumption_bias.py +++ b/backend/app/core/validators/gender_assumption_bias.py @@ -21,9 +21,11 @@ class GenderAssumptionBias(Validator): def __init__( self, - categories: Optional[List[BiasCategories]] = [BiasCategories.All], + categories: Optional[List[BiasCategories]] = None, on_fail: Optional[Callable] = OnFailAction.FIX ): + if categories is None: + categories = [BiasCategories.All] self.gender_bias_list = self.load_gender_bias_list(categories) self.text = None super().__init__(on_fail=on_fail) diff --git a/backend/app/crud/__init__.py b/backend/app/crud/__init__.py index c3ce47f..c955a67 100644 --- a/backend/app/crud/__init__.py +++ b/backend/app/crud/__init__.py @@ -1 +1 @@ -from .request_log import RequestLogCrud \ No newline at end of file +from app.crud.request_log import RequestLogCrud \ No newline at end of file diff --git a/backend/app/models/__init__.py b/backend/app/models/__init__.py index d2e3b13..7d11c06 100644 --- a/backend/app/models/__init__.py +++ b/backend/app/models/__init__.py @@ -1,5 +1,4 @@ from sqlmodel import SQLModel -from .request import RequestLog - -from .validator import ValidatorLog \ No newline at end of file +from app.models.request import RequestLog +from app.models.validator import ValidatorLog \ No newline at end of file