From 865d846085bb03d612aab39099a8fae640e0d608 Mon Sep 17 00:00:00 2001 From: Diego Maniloff Date: Mon, 1 Sep 2025 10:00:05 -0400 Subject: [PATCH] feat: Add Kubernetes dependency and refactor token retrieval in RagasEvaluatorRemote. --- pyproject.toml | 2 +- src/llama_stack_provider_ragas/eval_remote.py | 34 +++++++++++-------- uv.lock | 3 ++ 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 7b1e431..957fadd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,7 +13,7 @@ dependencies = [ ] [project.optional-dependencies] -remote = ["kfp>=2.5.0", "kfp-kubernetes>=2.0.0", "s3fs>=2024.12.0"] +remote = ["kfp>=2.5.0", "kfp-kubernetes>=2.0.0", "s3fs>=2024.12.0", "kubernetes>=30.0.0"] distro = ["opentelemetry-api", "opentelemetry-exporter-otlp", "aiosqlite", "ollama", "uvicorn"] dev = [ "llama-stack-provider-ragas[distro]", diff --git a/src/llama_stack_provider_ragas/eval_remote.py b/src/llama_stack_provider_ragas/eval_remote.py index 3c16892..95195f0 100644 --- a/src/llama_stack_provider_ragas/eval_remote.py +++ b/src/llama_stack_provider_ragas/eval_remote.py @@ -1,6 +1,4 @@ -# TODO: decide how to treat these imports & possibly an extras_require import logging -import subprocess import uuid from typing import Any @@ -38,14 +36,7 @@ def __init__( try: import kfp - result = subprocess.run( - ["oc", "whoami", "-t"], - capture_output=True, - text=True, - check=True, - timeout=5, - ) - token = result.stdout.strip() + token = self._get_token() if not token: raise RagasEvaluationError( "No token found. Please run `oc login` and try again." @@ -70,10 +61,6 @@ def __init__( raise RagasEvaluationError( "Kubeflow Pipelines SDK not available. Install with: pip install .[remote]" ) from e - except subprocess.CalledProcessError as e: - raise RagasEvaluationError( - f"Failed to get OpenShift token. Command failed with exit code {e.returncode}: {e.stderr.strip()}" - ) from e except requests.exceptions.RequestException as e: raise RagasEvaluationError( f"Failed to connect to Kubeflow Pipelines server at {self.config.kubeflow_config.pipelines_endpoint}, " @@ -84,6 +71,25 @@ def __init__( "Failed to initialize Kubeflow Pipelines client." ) from e + def _get_token(self) -> str: + try: + from kubernetes.client.configuration import Configuration + from kubernetes.config.kube_config import load_kube_config + + config = Configuration() + load_kube_config(client_configuration=config) + token = str(config.api_key["authorization"].split(" ")[-1]) + except ImportError as e: + raise RagasEvaluationError( + "Kubernetes client is not installed. Install with: pip install .[remote]" + ) from e + except Exception as e: + raise RagasEvaluationError( + "Failed to get OpenShift token. Please run `oc login` and try again." + ) from e + + return token + async def run_eval( self, benchmark_id: str, diff --git a/uv.lock b/uv.lock index c1279bb..bfbc015 100644 --- a/uv.lock +++ b/uv.lock @@ -1369,6 +1369,7 @@ dev = [ { name = "ipykernel" }, { name = "kfp" }, { name = "kfp-kubernetes" }, + { name = "kubernetes" }, { name = "mypy" }, { name = "ollama" }, { name = "opentelemetry-api" }, @@ -1392,6 +1393,7 @@ distro = [ remote = [ { name = "kfp" }, { name = "kfp-kubernetes" }, + { name = "kubernetes" }, { name = "s3fs" }, ] @@ -1401,6 +1403,7 @@ requires-dist = [ { name = "ipykernel", marker = "extra == 'dev'" }, { name = "kfp", marker = "extra == 'remote'", specifier = ">=2.5.0" }, { name = "kfp-kubernetes", marker = "extra == 'remote'", specifier = ">=2.0.0" }, + { name = "kubernetes", marker = "extra == 'remote'", specifier = ">=30.0.0" }, { name = "llama-stack", specifier = "==0.2.11" }, { name = "llama-stack-provider-ragas", extras = ["distro"], marker = "extra == 'dev'" }, { name = "llama-stack-provider-ragas", extras = ["remote"], marker = "extra == 'dev'" },