Arena Fleet: Run Your First Evaluation
This tutorial walks you through running your first prompt evaluation using Arena Fleet. By the end, you’ll have a complete evaluation pipeline running in your cluster.
Prerequisites
Section titled “Prerequisites”Before you begin, ensure you have:
- A Kubernetes cluster with Omnia installed
kubectlconfigured to access your cluster- An LLM provider configured (or use the demo Ollama setup)
Overview
Section titled “Overview”Arena Fleet evaluates prompts through two CRDs and a config file that lives inside your bundle:
ArenaSource ───────────────▶ ArenaJob ───▶ Results (bundle: │ config.arena.yaml ◀─────────┘ selects with spec.arenaFile + prompts + scenarios) executes the evaluation- ArenaSource fetches your bundle. The bundle contains the arena config file (
config.arena.yaml), plus the prompt and scenario files it references. - ArenaJob references the source, selects the config file with
spec.arenaFile, supplies providers, and runs the evaluation.
There is no ArenaConfig Kubernetes resource — the configuration is the config.arena.yaml file inside the bundle, not something you kubectl apply.
Step 1: Create an ArenaSource
Section titled “Step 1: Create an ArenaSource”An ArenaSource defines where to fetch your bundle from. For this tutorial, we’ll use a ConfigMap source. Each key in the ConfigMap becomes a file in the bundle — nested paths are encoded with __ (double underscore) in place of /, because Kubernetes ConfigMap keys cannot contain slashes.
Create a ConfigMap containing the whole bundle: the arena config file, one prompt, and one scenario with an assertion:
apiVersion: v1kind: ConfigMapmetadata: name: greeting-bundle namespace: defaultdata: config.arena.yaml: | apiVersion: promptkit.altairalabs.ai/v1alpha1 kind: Arena metadata: name: greeting-eval spec: prompt_configs: - id: assistant file: prompts/assistant.yaml # Providers are supplied by the ArenaJob from Provider CRDs. providers: [] scenarios: - file: scenarios/greeting.scenario.yaml defaults: temperature: 0.7 max_tokens: 200 output: dir: out formats: - json
# "prompts__assistant.yaml" decodes to "prompts/assistant.yaml" prompts__assistant.yaml: | apiVersion: promptkit.altairalabs.ai/v1alpha1 kind: PromptConfig metadata: name: assistant spec: task_type: assistant version: v1.0.0 description: A friendly greeting assistant system_template: "You are a friendly assistant. Respond warmly to greetings."
# "scenarios__greeting.scenario.yaml" decodes to "scenarios/greeting.scenario.yaml" scenarios__greeting.scenario.yaml: | apiVersion: promptkit.altairalabs.ai/v1alpha1 kind: Scenario metadata: name: greeting-test spec: id: greeting-test task_type: assistant description: Greeting test turns: - role: user content: "Say hello to the world." assertions: - type: contains params: patterns: - "hello"Now create the ArenaSource that points at the ConfigMap:
apiVersion: omnia.altairalabs.ai/v1alpha1kind: ArenaSourcemetadata: name: greeting-source namespace: defaultspec: type: configmap configMap: name: greeting-bundle interval: 5mApply both resources:
kubectl apply -f configmap.yamlkubectl apply -f arenasource.yamlVerify the source is ready:
kubectl get arenasource greeting-sourceYou should see:
NAME TYPE PHASE AGEgreeting-source configmap Ready 10sStep 2: Configure a Provider
Section titled “Step 2: Configure a Provider”If you don’t already have a Provider configured, create one. The ArenaJob will resolve providers from this CRD, so no provider file is needed inside the bundle.
apiVersion: v1kind: Secretmetadata: name: llm-credentials namespace: defaulttype: OpaquestringData: ANTHROPIC_API_KEY: "sk-ant-..." # Or OPENAI_API_KEY---apiVersion: omnia.altairalabs.ai/v1alpha1kind: Providermetadata: name: claude-provider namespace: defaultspec: type: claude model: claude-sonnet-4-20250514 secretRef: name: llm-credentialskubectl apply -f provider.yamlVerify the provider is ready:
kubectl get provider claude-providerStep 3: Run an ArenaJob
Section titled “Step 3: Run an ArenaJob”Create an ArenaJob to execute the evaluation. It references the source, selects the config file with arenaFile, and maps the Provider CRD into the config’s default provider group:
apiVersion: omnia.altairalabs.ai/v1alpha1kind: ArenaJobmetadata: name: greeting-eval-001 namespace: defaultspec: sourceRef: name: greeting-source arenaFile: config.arena.yaml type: evaluation providers: default: - providerRef: name: claude-provider evaluation: outputFormats: - json workers: replicas: 1 ttlSecondsAfterFinished: 3600kubectl apply -f arenajob.yamlStep 4: Monitor the Job
Section titled “Step 4: Monitor the Job”Watch the job progress:
kubectl get arenajob greeting-eval-001 -wYou’ll see the job progress through phases:
NAME SOURCE TYPE PHASE AGEgreeting-eval-001 greeting-source evaluation Pending 5sgreeting-eval-001 greeting-source evaluation Running 10sgreeting-eval-001 greeting-source evaluation Succeeded 30sGet detailed status:
kubectl get arenajob greeting-eval-001 -o yamlThe status section shows:
status: phase: Succeeded progress: total: 1 completed: 1 failed: 0 result: summary: passed: "1" failed: "0"Step 5: View Results
Section titled “Step 5: View Results”For jobs with S3 or PVC output configured, results are stored at the configured location. For this simple example, view results in the job status:
kubectl describe arenajob greeting-eval-001To see worker logs:
kubectl logs -l arena.omnia.altairalabs.ai/job=greeting-eval-001Understanding the Results
Section titled “Understanding the Results”Arena Fleet evaluations produce results showing:
- Pass/Fail: Whether assertions passed (our scenario asserts the response
contains“hello”) - Latency: Response time from the LLM
- Tokens: Input/output token counts
- Cost: Estimated cost (if pricing configured)
Example result summary:
{ "job": "greeting-eval-001", "scenarios": [ { "id": "greeting-test", "provider": "claude-provider", "passed": true, "latency_ms": 1234, "tokens": { "input": 45, "output": 28 }, "assertions": [ { "type": "contains", "passed": true } ] } ]}Next Steps
Section titled “Next Steps”Now that you’ve run your first evaluation:
- Configure S3 Storage: Store results in S3 for persistence
- Set Up Scheduled Jobs: Run evaluations on a schedule
- Monitor Job Progress: Track evaluations in real-time
- Use Git Sources: Fetch bundles from Git repositories
- Compare Providers: Test against multiple LLMs
- Tune the config file: Learn the full
config.arena.yamlschema
Cleanup
Section titled “Cleanup”Remove the resources created in this tutorial:
kubectl delete arenajob greeting-eval-001kubectl delete arenasource greeting-sourcekubectl delete configmap greeting-bundlekubectl delete provider claude-providerkubectl delete secret llm-credentials