diff --git a/litellm/proxy/guardrails/guardrail_hooks/akto/akto.py b/litellm/proxy/guardrails/guardrail_hooks/akto/akto.py index 0669d662f9b..3ed9d064ead 100644 --- a/litellm/proxy/guardrails/guardrail_hooks/akto/akto.py +++ b/litellm/proxy/guardrails/guardrail_hooks/akto/akto.py @@ -293,7 +293,7 @@ class AktoGuardrail(CustomGuardrail): async def send_to_akto(self, payload: dict) -> httpx.Response: """POST payload to Akto guardrail API for validation.""" return await self.async_handler.post( - url=endpoint, + url=f"{self.akto_base_url}{HTTP_PROXY_PATH}", data=json.dumps(payload), params={"akto_connector": AKTO_CONNECTOR_NAME, "guardrails": "true"}, headers={ @@ -394,10 +394,10 @@ class AktoGuardrail(CustomGuardrail): if input_type != "request": return inputs - payload = self.build_akto_payload(request_data) + payload = self.build_akto_payload(inputs, request_data) try: response = await self.send_to_akto(payload) - allowed, reason = self.parse_guardrail_response(response) + allowed, reason = self.handle_guardrail_response(response) except HTTPException: raise except (httpx.RequestError, httpx.HTTPStatusError) as e: diff --git a/tests/guardrails_tests/test_akto_guardrails.py b/tests/guardrails_tests/test_akto_guardrails.py index fac1ea3c02d..9056accb545 100644 --- a/tests/guardrails_tests/test_akto_guardrails.py +++ b/tests/guardrails_tests/test_akto_guardrails.py @@ -119,7 +119,7 @@ def test_init_from_env(): }, ): g = AktoGuardrail(guardrail_name="t", event_hook="pre_call") - assert g.akto_base_url == "http://env:9090" + assert g.akto_base_url == "http://env-host:9090" assert g.akto_api_key == "env-token" assert g.guardrail_timeout == 5 assert g.akto_account_id == "2000000" @@ -142,8 +142,8 @@ def test_init_defaults(): # ── Payload ── -def test_build_akto_payload(akto_validate, sample_request_data): - payload = akto_validate.build_akto_payload(sample_request_data) +def test_build_akto_payload(akto_validate, sample_inputs, sample_request_data): + payload = akto_validate.build_akto_payload(sample_inputs, sample_request_data) assert payload["path"] == "/v1/chat/completions" assert payload["method"] == "POST" @@ -186,7 +186,8 @@ def test_build_akto_payload_custom_ids(sample_request_data): guardrail_name="t", event_hook="pre_call", ) - payload = g.build_akto_payload(sample_request_data) + inputs = GenericGuardrailAPIInputs(texts=["test"], model="gpt-4") + payload = g.build_akto_payload(inputs, sample_request_data) assert payload["akto_account_id"] == "9999" assert payload["akto_vxlan_id"] == "7" @@ -309,7 +310,7 @@ async def test_pre_call_allowed(akto_validate, sample_inputs, sample_request_dat @pytest.mark.asyncio async def test_pre_call_blocked(akto_validate, sample_inputs, sample_request_data): - akto_validate.async_handler.post = AsyncMock(return_value=_mock_blocked("PII")) + akto_validate.async_handler.post = AsyncMock(return_value=_mock_blocked_response("PII")) with pytest.raises(HTTPException) as exc_info: await akto_validate.apply_guardrail( @@ -318,8 +319,8 @@ async def test_pre_call_blocked(akto_validate, sample_inputs, sample_request_dat input_type="request", ) - assert exc.value.status_code == 403 - assert "PII" in exc.value.detail + assert exc_info.value.status_code == 403 + assert "PII" in exc_info.value.detail akto_validate.async_handler.post.assert_called_once()