# Test Recording System

This directory contains recorded inference API responses used for deterministic testing without requiring live API access.

## Structure

- `responses/` - JSON files containing request/response pairs for inference operations

## Recording Format

Each JSON file contains:
- `request` - The normalized request parameters (method, endpoint, body)
- `response` - The response body (serialized from Pydantic models)

## Normalization

To reduce noise in git diffs, the recording system automatically normalizes fields that vary between runs but don't affect test behavior:

### OpenAI-style responses
- `id` - Deterministic hash based on request: `rec-{request_hash[:12]}`
- `created` - Normalized to epoch: `0`

### Ollama-style responses
- `created_at` - Normalized to: `"1970-01-01T00:00:00.000000Z"`
- `total_duration` - Normalized to: `0`
- `load_duration` - Normalized to: `0`
- `prompt_eval_duration` - Normalized to: `0`
- `eval_duration` - Normalized to: `0`

These normalizations ensure that re-recording tests produces minimal git diffs, making it easier to review actual changes to test behavior.

## Usage

### Replay mode (default)
Responses are replayed from recordings:
```bash
LLAMA_STACK_TEST_INFERENCE_MODE=replay pytest tests/integration/
```

### Record-if-missing mode (recommended for adding new tests)
Records only when no recording exists, otherwise replays. Use this for iterative development:
```bash
LLAMA_STACK_TEST_INFERENCE_MODE=record-if-missing pytest tests/integration/
```

### Recording mode
**Force-records all API interactions**, overwriting existing recordings. Use with caution:
```bash
LLAMA_STACK_TEST_INFERENCE_MODE=record pytest tests/integration/
```

### Live mode
Skip recordings entirely and use live APIs:
```bash
LLAMA_STACK_TEST_INFERENCE_MODE=live pytest tests/integration/
```

## Re-normalizing Existing Recordings

If you need to apply normalization to existing recordings (e.g., after updating the normalization logic):

```bash
python scripts/normalize_recordings.py
```

Use `--dry-run` to preview changes without modifying files.
