Skip to content

Commit c04e770

Browse files
committed
fix indentation
1 parent a3621d7 commit c04e770

File tree

3 files changed

+94
-20
lines changed

3 files changed

+94
-20
lines changed

tests/llama_stack/conftest.py

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -255,45 +255,50 @@ def test_with_remote_milvus(llama_stack_server_config):
255255
env_vars.append({"name": "TRUSTYAI_EMBEDDING_MODEL", "value": trustyai_embedding_model})
256256

257257
# Kubeflow-related environment variables
258-
if params.get("enable_ragas_remote"):
259-
# Get fixtures only when Ragas Remote/Kubeflow is enabled
258+
enable_ragas_remote = params.get("enable_ragas_remote", False)
259+
enable_garak_remote = params.get("enable_garak_remote", False)
260+
enable_kubeflow_eval = enable_ragas_remote or enable_garak_remote
261+
262+
if enable_kubeflow_eval:
263+
# Get fixtures only when Kubeflow is enabled
260264
model_namespace = request.getfixturevalue(argname="model_namespace")
261265
current_client_token = request.getfixturevalue(argname="current_client_token")
262266
dspa_route = request.getfixturevalue(argname="dspa_route")
263267
dspa_s3_secret = request.getfixturevalue(argname="dspa_s3_secret")
264268

265-
# KUBEFLOW_LLAMA_STACK_URL: Build from LlamaStackDistribution service
269+
# New Garak-specific flag
270+
env_vars.append({"name": "ENABLE_KUBEFLOW_GARAK", "value": str(enable_garak_remote).lower()})
271+
272+
# KUBEFLOW_LLAMA_STACK_URL: Use internal service endpoint for KFP to callback to
273+
distribution_name = params.get("distribution_name", "rh-dev")
266274
env_vars.append({
267275
"name": "KUBEFLOW_LLAMA_STACK_URL",
268276
"value": f"http://{distribution_name}-service.{model_namespace.name}.svc.cluster.local:8321",
269277
})
270278

271-
# KUBEFLOW_PIPELINES_ENDPOINT: Get from DSPA route
279+
# KUBEFLOW_PIPELINES_ENDPOINT: Injected from DSPA
272280
env_vars.append({"name": "KUBEFLOW_PIPELINES_ENDPOINT", "value": f"https://{dspa_route.instance.spec.host}"})
273-
274-
# KUBEFLOW_NAMESPACE: Use model namespace
275281
env_vars.append({"name": "KUBEFLOW_NAMESPACE", "value": model_namespace.name})
276282

277-
# KUBEFLOW_BASE_IMAGE
278-
env_vars.append({
279-
"name": "KUBEFLOW_BASE_IMAGE",
280-
"value": params.get(
281-
"kubeflow_base_image",
282-
"quay.io/diegosquayorg/my-ragas-provider-image"
283-
"@sha256:3749096c47f7536d6be2a7932e691abebacd578bafbe65bad2f7db475e2b93fb",
284-
),
285-
})
283+
# KUBEFLOW_BASE_IMAGE: Select based on provider
284+
default_garak_image = "quay.io/trustyai/garak-remote-provider:latest"
285+
default_ragas_image = "quay.io/diegosquayorg/my-ragas-provider-image@sha256:3749096c47f7536d6be2a7932e691abebacd578bafbe65bad2f7db475e2b93fb"
286+
287+
selected_image = params.get("kubeflow_base_image")
288+
if not selected_image:
289+
selected_image = default_garak_image if enable_garak_remote else default_ragas_image
286290

287-
# KUBEFLOW_RESULTS_S3_PREFIX: Build from MinIO bucket
291+
env_vars.append({"name": "KUBEFLOW_BASE_IMAGE", "value": selected_image})
292+
293+
# KUBEFLOW_RESULTS_S3_PREFIX: Separate results by provider type
294+
s3_subfolder = "garak-results" if enable_garak_remote else "ragas-results"
288295
env_vars.append({
289296
"name": "KUBEFLOW_RESULTS_S3_PREFIX",
290-
"value": params.get("kubeflow_results_s3_prefix", "s3://llms/ragas-results"),
297+
"value": params.get("kubeflow_results_s3_prefix", f"s3://llms/{s3_subfolder}"),
291298
})
292299

293-
# KUBEFLOW_S3_CREDENTIALS_SECRET_NAME: Use DSPA secret name
300+
# Auth and Storage (Shared)
294301
env_vars.append({"name": "KUBEFLOW_S3_CREDENTIALS_SECRET_NAME", "value": dspa_s3_secret.name})
295-
296-
# KUBEFLOW_PIPELINES_TOKEN: Get from current client token
297302
env_vars.append({"name": "KUBEFLOW_PIPELINES_TOKEN", "value": str(current_client_token)})
298303

299304
# POSTGRESQL environment variables for sql_default and kvstore_default

tests/llama_stack/constants.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ class Eval(str, Enum):
1919
TRUSTYAI_LMEVAL = "trustyai_lmeval"
2020
TRUSTYAI_RAGAS_INLINE = "trustyai_ragas_inline"
2121
TRUSTYAI_RAGAS_REMOTE = "trustyai_ragas_remote"
22+
TRUSTYAI_GARAK_REMOTE = "trustyai_garak_remote"
2223

2324

2425
class ModelInfo(NamedTuple):
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import llama_stack_client
2+
import pytest
3+
4+
from tests.llama_stack.constants import LlamaStackProviders
5+
from tests.llama_stack.eval.utils import wait_for_eval_job_completion
6+
from utilities.constants import MinIo, QWEN_MODEL_NAME
7+
8+
GARAK_REMOTE_BENCHMARK_ID = "trustyai_garak::prompt_injection"
9+
10+
11+
@pytest.mark.parametrize(
12+
"model_namespace, minio_pod, minio_data_connection, llama_stack_server_config",
13+
[
14+
pytest.param(
15+
{"name": "test-garak-remote-security"},
16+
MinIo.PodConfig.QWEN_HAP_BPIV2_MINIO_CONFIG,
17+
{"bucket": "llms"},
18+
{
19+
"vllm_url_fixture": "qwen_isvc_url",
20+
"inference_model": QWEN_MODEL_NAME,
21+
"enable_garak_remote": True, # Injects ENABLE_KUBEFLOW_GARAK=true
22+
},
23+
)
24+
],
25+
indirect=True,
26+
)
27+
@pytest.mark.rawdeployment
28+
@pytest.mark.model_explainability
29+
class TestLlamaStackGarakRemoteProvider:
30+
"""Tests for LlamaStack Garak remote evaluation provider without dataset registration."""
31+
32+
def test_garak_remote_register_benchmark(self, llama_stack_client):
33+
"""Register a Garak benchmark. dataset_id is set to benchmark_id as garak provides its own data."""
34+
llama_stack_client.alpha.benchmarks.register(
35+
benchmark_id=GARAK_REMOTE_BENCHMARK_ID,
36+
dataset_id=GARAK_REMOTE_BENCHMARK_ID,
37+
scoring_functions=["string"],
38+
provider_id=LlamaStackProviders.Eval.TRUSTYAI_GARAK_REMOTE,
39+
provider_benchmark_id="prompt_injection",
40+
metadata={
41+
"probes": ["promptinject.HijackHateHumans"],
42+
"timeout": 600,
43+
},
44+
)
45+
46+
response = llama_stack_client.alpha.benchmarks.list()
47+
assert response[0].identifier == GARAK_REMOTE_BENCHMARK_ID
48+
assert response[0].provider_id == LlamaStackProviders.Eval.TRUSTYAI_GARAK_REMOTE
49+
50+
def test_garak_remote_run_eval(self, minio_pod, minio_data_connection, llama_stack_client):
51+
"""Run the security scan on Kubeflow and verify the vulnerability results."""
52+
53+
job = llama_stack_client.alpha.eval.run_eval(
54+
benchmark_id=GARAK_REMOTE_BENCHMARK_ID,
55+
benchmark_config={
56+
"eval_candidate": {
57+
"type": "model",
58+
"model": QWEN_MODEL_NAME,
59+
"sampling_params": {},
60+
}
61+
},
62+
)
63+
64+
wait_for_eval_job_completion(
65+
llama_stack_client=llama_stack_client,
66+
job_id=job.job_id,
67+
benchmark_id=GARAK_REMOTE_BENCHMARK_ID,
68+
)

0 commit comments

Comments
 (0)