tldw_server Unified Evaluations API Reference¶
Overview¶
The tldw_server Evaluations API provides a comprehensive, OpenAI-compatible evaluation framework for assessing AI-generated content quality. This unified API combines industry-standard evaluation patterns with tldw-specific features for advanced content assessment.
Version: 1.0.0 (Unified)
Base URL: /api/v1/evaluations
Standards: OpenAI Evals compatible with extensions
Authentication
- Single-user: X-API-KEY: <key>
- Multi-user: Authorization: Bearer <JWT>
Rate limiting is enforced on core run endpoints (geval, rag, response-quality, propositions, batch).
Architecture¶
Core Components¶
┌─────────────────────────────────────────────────────────────┐
│ API Layer │
│ /api/v1/evaluations/* (Unified OpenAI-compatible + tldw) │
└─────────────────────────────────────────────────────────────┘
│
┌─────────────────────────────────────────────────────────────┐
│ Service Layer │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Evaluation │ │ Dataset │ │ Run │ │
│ │ Manager │ │ Manager │ │ Manager │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Metrics │ │ Webhooks │ │Rate Limiting │ │
│ │ Service │ │ Manager │ │ Service │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────────┘
│
┌─────────────────────────────────────────────────────────────┐
│ Evaluation Engines │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ G-Eval │ │ RAG │ │ Response │ │
│ │ Engine │ │ Evaluator │ │ Quality │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │Model-Graded │ │Exact Match │ │ Custom │ │
│ │ Evaluator │ │ Evaluator │ │ Evaluator │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────────┘
│
┌─────────────────────────────────────────────────────────────┐
│ Data Layer │
│ ┌────────────────────────────────────────────────────┐ │
│ │ Unified Evaluations Database │ │
│ │ - evaluations table (definitions) │ │
│ │ - runs table (execution records) │ │
│ │ - datasets table (test data) │ │
│ │ - results table (evaluation outputs) │ │
│ │ - metrics table (performance data) │ │
│ └────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
Authentication¶
The API supports multiple authentication modes:
Single-User Mode (Default)¶
# Using API Key header
curl -H "X-API-KEY: your-api-key" https://api.example.com/api/v1/evaluations
# Using Bearer token
curl -H "Authorization: Bearer your-api-key" https://api.example.com/api/v1/evaluations
Multi-User Mode (JWT)¶
# Using JWT token
curl -H "Authorization: Bearer eyJhbGc..." https://api.example.com/api/v1/evaluations
OpenAI Compatibility¶
# Using OpenAI-style key
curl -H "Authorization: Bearer sk-..." https://api.example.com/api/v1/evaluations
Rate Limiting¶
Global Limits¶
- Standard Operations: 60 requests/minute
- Evaluation Runs: 10 requests/minute
- Batch Operations: 5 requests/minute
- Burst Protection: 10 requests/second max
User-Based Limits (Multi-User Mode)¶
| Tier | Requests/Min | Tokens/Min | Batch Size | Cost/Month |
|---|---|---|---|---|
| Free | 10 | 10,000 | 10 | $0 |
| Basic | 30 | 50,000 | 50 | $10 |
| Premium | 100 | 200,000 | 200 | $50 |
| Enterprise | Unlimited | Unlimited | 1000 | Custom |
Rate Limit Response Headers¶
Unified evaluation endpoints include standard response headers that surface current limits and remaining allowances:
- X-RateLimit-Tier
- X-RateLimit-PerMinute-Limit
- X-RateLimit-PerMinute-Remaining
- X-RateLimit-Daily-Limit
- X-RateLimit-Daily-Remaining
- X-RateLimit-Tokens-Remaining
- X-RateLimit-Daily-Cost-Remaining
- X-RateLimit-Monthly-Cost-Remaining
In addition, draft standard headers are provided for compatibility with proxies and SDKs:
- RateLimit-Limit
- RateLimit-Remaining
- RateLimit-Reset (seconds until the current minute window resets)
Note: Remaining values are based on the latest limiter decision; actual token/cost usage may adjust after the request completes when providers return precise usage metadata.
Core API Endpoints¶
Evaluation Management¶
Create Evaluation¶
POST /api/v1/evaluations
Creates a new evaluation definition that can be run multiple times.
Request:
{
"name": "summary_quality_eval",
"description": "Evaluate summary quality using multiple metrics",
"eval_type": "model_graded",
"eval_spec": {
"metrics": ["fluency", "consistency", "relevance", "coherence"],
"thresholds": {
"pass": 0.7,
"excellent": 0.9
},
"model": "gpt-4",
"temperature": 0.3
},
"dataset_id": "dataset_123",
"metadata": {
"project": "content_quality",
"version": "1.0"
}
}
Response (201 Created):
{
"id": "eval_abc123",
"name": "summary_quality_eval",
"description": "Evaluate summary quality using multiple metrics",
"eval_type": "model_graded",
"eval_spec": {...},
"dataset_id": "dataset_123",
"created_at": 1234567890,
"created_by": "user_123",
"metadata": {...}
}
List Evaluations¶
GET /api/v1/evaluations
Query Parameters:
- limit: 1-100 (default: 20)
- after: Cursor for pagination
- eval_type: Filter by type
- project: Filter by project metadata
Response:
{
"object": "list",
"data": [...],
"has_more": true,
"first_id": "eval_abc123",
"last_id": "eval_xyz789"
}
Get Evaluation¶
GET /api/v1/evaluations/{eval_id}
Update Evaluation¶
PATCH /api/v1/evaluations/{eval_id}
Delete Evaluation¶
DELETE /api/v1/evaluations/{eval_id}
Evaluation Runs¶
Create Run¶
POST /api/v1/evaluations/{eval_id}/runs
Starts an asynchronous evaluation run.
Request:
{
"target_model": "gpt-4o",
"dataset_override": null,
"config": {
"temperature": 0.7,
"max_workers": 4,
"timeout_seconds": 300
},
"webhook_url": "https://example.com/webhook"
}
Response (202 Accepted):
{
"id": "run_def456",
"eval_id": "eval_abc123",
"status": "pending",
"target_model": "gpt-4o",
"created_at": 1234567890,
"progress": {
"completed_samples": 0,
"total_samples": 100
}
}
Get Run Status¶
GET /api/v1/evaluations/runs/{run_id}
Results are included in the run object when status becomes completed. There is no separate results endpoint.
Stream Run Progress (SSE)¶
Not available on the unified router. Poll GET /api/v1/evaluations/runs/{run_id} for status.
Cancel Run¶
POST /api/v1/evaluations/runs/{run_id}/cancel
Dataset Management¶
Create Dataset¶
POST /api/v1/evaluations/datasets
Request:
{
"name": "qa_test_set",
"description": "Question-answer pairs for testing",
"samples": [
{
"input": "What is the capital of France?",
"expected": "Paris",
"metadata": {"difficulty": "easy"}
}
]
}
List Datasets¶
GET /api/v1/evaluations/datasets
Get Dataset¶
GET /api/v1/evaluations/datasets/{dataset_id}
Delete Dataset¶
DELETE /api/v1/evaluations/datasets/{dataset_id}
Specialized Evaluation Endpoints¶
RAG Pipeline Presets¶
POST /api/v1/evaluations/rag/pipeline/presets
Create a named RAG pipeline preset.
Request:
{ "name": "baseline_hybrid", "config": { "chunking": {"method": "sentences", "size": 8, "overlap": 1}, "retriever": {"mode": "hybrid", "k": 8, "alpha": 0.5}, "reranker": {"provider": "cohere", "model": "rerank-3"}, "rag": {"max_context_tokens": 2000} } }
Responses:
- 201 PipelinePresetResponse { "name": "...", "config": {..}, "created_at": 123, "updated_at": 123 }
GET /api/v1/evaluations/rag/pipeline/presets
List presets. Response { "items": [ {"name": "...", "config": {...}} ], "total": 1 }
GET /api/v1/evaluations/rag/pipeline/presets/{name}
Get a preset by name.
DELETE /api/v1/evaluations/rag/pipeline/presets/{name}
Delete a preset. Response 204 No Content.
POST /api/v1/evaluations/rag/pipeline/cleanup
Cleanup ephemeral vector store collections. Response { "expired_count": 0, "deleted_count": 0, "errors": [] }
Embeddings A/B Tests¶
POST /api/v1/evaluations/embeddings/abtest
Create an embeddings A/B test. Request { "name": "string", "config": { "arms": [...], "media_ids": [], "chunking": {...}, "retrieval": {...}, "queries": [...] }, "run_immediately": false }. Response { "test_id": "...", "status": "created" }.
POST /api/v1/evaluations/embeddings/abtest/{test_id}/run
Start execution. Response { "test_id": "...", "status": "running", "progress": { } }.
GET /api/v1/evaluations/embeddings/abtest/{test_id}
Summary: { "test_id": "...", "status": "...", "arms": [ {"arm_id":"...","provider":"...","model":"...","metrics": {"ndcg": 0.72}, "latency_ms": {"p50": 30.3} } ] }.
GET /api/v1/evaluations/embeddings/abtest/{test_id}/results
Paginated results. Response { "summary": {...}, "results": [ { "result_id": "...", "test_id": "...", "arm_id": "...", "query_id": "...", "ranked_ids": ["..."], "scores": [0.9], "metrics": {"ndcg": 0.72}, "latency_ms": 12.3, "ranked_distances": [0.1], "ranked_metadatas": [{"source": "..."}], "ranked_documents": ["..."], "rerank_scores": [0.7], "created_at": "2026-01-12T00:00:00Z" } ], "page": 1, "page_size": 50, "total": 120 }.
GET /api/v1/evaluations/embeddings/abtest/{test_id}/significance?metric=ndcg
Statistical significance for chosen metric.
GET /api/v1/evaluations/embeddings/abtest/{test_id}/events
SSE event stream of progress/updates.
GET /api/v1/evaluations/embeddings/abtest/{test_id}/export?format=json|csv
Export results (admin-only).
DELETE /api/v1/evaluations/embeddings/abtest/{test_id}
Delete a test.
G-Eval Summarization¶
POST /api/v1/evaluations/geval
Evaluates summary quality using Google's G-Eval framework.
Request:
{
"source_text": "Original long document...",
"summary": "Concise summary...",
"metrics": ["fluency", "consistency", "relevance", "coherence"],
"api_name": "openai",
"save_results": true
}
Response:
{
"metrics": {
"fluency": {
"score": 0.85,
"raw_score": 2.55,
"explanation": "Well-structured with minor grammatical issues"
},
"consistency": {
"score": 0.92,
"raw_score": 4.6,
"explanation": "Highly consistent with source material"
}
},
"average_score": 0.88,
"summary_assessment": "High-quality summary with excellent factual accuracy",
"evaluation_time": 2.34,
"metadata": {
"evaluation_id": "eval_result_789"
}
}
RAG Evaluation¶
POST /api/v1/evaluations/rag
Evaluates retrieval-augmented generation quality.
Request:
{
"query": "What are the benefits of exercise?",
"retrieved_contexts": [
"Exercise improves cardiovascular health...",
"Regular physical activity boosts mood..."
],
"generated_response": "Exercise provides numerous benefits including...",
"ground_truth": "Expected answer for comparison",
"metrics": ["relevance", "faithfulness", "answer_similarity", "context_precision", "claim_faithfulness"]
}
Response:
{
"metrics": {
"relevance": {"score": 0.89, "explanation": "Highly relevant to query"},
"faithfulness": {"score": 0.95, "explanation": "Well-grounded in contexts"},
"answer_similarity": {"score": 0.82, "explanation": "Close to ground truth"},
"context_precision": {"score": 0.78, "explanation": "Good context selection"},
"claim_faithfulness": {"score": 0.90, "explanation": "Most extracted claims are supported by contexts"}
},
"overall_score": 0.86,
"retrieval_quality": 0.78,
"generation_quality": 0.89,
"suggestions": [
"Consider adding more diverse contexts",
"Response could be more concise"
]
}
Response Quality¶
POST /api/v1/evaluations/response-quality
Evaluates general response quality and format compliance.
Request:
{
"prompt": "Write a professional email...",
"response": "Dear colleague...",
"expected_format": "email",
"evaluation_criteria": {
"professionalism": "Appropriate tone and language",
"completeness": "All required elements present",
"clarity": "Clear and unambiguous"
}
}
Batch Evaluation¶
POST /api/v1/evaluations/batch
Process multiple evaluations in parallel. Supported evaluation_type values: geval, rag, response_quality, ocr, propositions.
Request:
{
"evaluation_type": "geval",
"items": [...],
"parallel_workers": 4,
"continue_on_error": true
}
Example (curl):
curl -X POST "http://localhost:8000/api/v1/evaluations/batch" \
-H "Content-Type: application/json" \
-H "X-API-KEY: $API_KEY" \
-d '{
"evaluation_type": "geval",
"items": [
{
"source_text": "The mitochondrion is the powerhouse of the cell.",
"summary": "Mitochondria produce energy in cells.",
"metrics": ["coherence", "consistency"]
},
{
"source_text": "Deep learning uses neural networks to model complex patterns.",
"summary": "Neural networks model complex patterns in deep learning.",
"metrics": ["coherence"]
}
],
"parallel_workers": 2,
"continue_on_error": true
}'
Example response:
{
"total_items": 2,
"successful": 2,
"failed": 0,
"results": [
{
"evaluation_id": "eval_01HXXXX",
"status": "completed",
"results": {
"metrics": {
"coherence": {"score": 0.94, "explanation": "Strong logical flow"},
"consistency": {"score": 0.91, "explanation": "Consistent details"}
},
"average_score": 0.925
}
},
{
"evaluation_id": "eval_01HYYYY",
"status": "completed",
"results": {
"metrics": {
"coherence": {"score": 0.89, "explanation": "Minor clarity issues"}
},
"average_score": 0.89
}
}
],
"aggregate_metrics": {"coherence": 0.915},
"processing_time": 1.82
}
Additional examples:
Propositions (Jaccard):
curl -X POST "http://localhost:8000/api/v1/evaluations/batch" \
-H "Content-Type: application/json" \
-H "X-API-KEY: $API_KEY" \
-d '{
"evaluation_type": "propositions",
"items": [
{
"extracted": ["Alice founded Acme in 2020", "Bob joined in 2021"],
"reference": ["Alice founded Acme in 2020"],
"method": "jaccard",
"threshold": 0.5
}
],
"parallel_workers": 1
}'
OCR (text-based items):
curl -X POST "http://localhost:8000/api/v1/evaluations/batch" \
-H "Content-Type: application/json" \
-H "X-API-KEY: $API_KEY" \
-d '{
"evaluation_type": "ocr",
"items": [
{
"items": [
{"id": "d1", "extracted_text": "hello world", "ground_truth_text": "hello world"}
],
"metrics": ["cer", "wer"]
}
],
"parallel_workers": 1
}'
Propositions Evaluation¶
POST /api/v1/evaluations/propositions
Evaluates proposition extraction quality with precision/recall/F1, density, and length metrics.
Request (example):
{
"extracted": ["Claim A", "Claim B"],
"reference": ["Claim A", "Claim C"],
"method": "semantic",
"threshold": 0.7
}
Example (curl):
curl -X POST "http://localhost:8000/api/v1/evaluations/propositions" \
-H "Content-Type: application/json" \
-H "X-API-KEY: $API_KEY" \
-d '{
"extracted": ["Mitochondria produce ATP", "Cells contain nuclei"],
"reference": ["Mitochondria produce energy", "Cells contain nuclei"],
"method": "semantic",
"threshold": 0.7
}'
Example response:
{
"precision": 0.50,
"recall": 1.00,
"f1": 0.67,
"matched": 1,
"total_extracted": 2,
"total_reference": 2,
"claim_density_per_100_tokens": 2.3,
"avg_prop_len_tokens": 7.8,
"dedup_rate": 0.0,
"details": {
"matches": [
{"extracted": "Cells contain nuclei", "reference": "Cells contain nuclei", "score": 1.0}
],
"misses": [
{"extracted": "Mitochondria produce ATP", "closest": "Mitochondria produce energy", "score": 0.65}
]
},
"metadata": {"evaluation_id": "eval_01HZZZZ", "evaluation_time": 0.21}
}
OCR Evaluation¶
POST /api/v1/evaluations/ocr - Evaluate OCR text quality on provided content
POST /api/v1/evaluations/ocr-pdf - Evaluate OCR text quality on uploaded PDF
Webhook Management¶
Register Webhook¶
POST /api/v1/evaluations/webhooks
{
"url": "https://example.com/webhook",
"events": ["evaluation.completed", "evaluation.failed"],
"secret": "webhook_secret_key"
}
List Webhooks¶
GET /api/v1/evaluations/webhooks
Returns all registered webhooks for the current user.
Unregister Webhook¶
DELETE /api/v1/evaluations/webhooks?url=...
Removes the specified webhook URL.
Test Webhook¶
POST /api/v1/evaluations/webhooks/test
Sends a test event to the provided URL and returns delivery stats.
Webhook Events¶
Events are sent as POST requests with HMAC-SHA256 signatures.
Headers:
- X-Webhook-Signature: HMAC-SHA256 signature
- X-Webhook-Timestamp: Unix timestamp
- X-Webhook-Event: Event type
Payload Example:
{
"event": "evaluation.completed",
"timestamp": 1234567890,
"data": {
"evaluation_id": "eval_123",
"run_id": "run_456",
"results": {...}
}
}
Metrics & Monitoring¶
Health Check¶
GET /api/v1/evaluations/health
{
"status": "healthy",
"version": "1.0.0",
"uptime": 3600,
"database": "connected",
"rate_limit": {
"requests_remaining": 50,
"reset_at": 1234567890
}
}
Prometheus Metrics¶
GET /api/v1/evaluations/metrics
Exports metrics in Prometheus format:
- evaluation_requests_total
- evaluation_duration_seconds
- evaluation_errors_total
- evaluation_queue_depth
- evaluation_cost_dollars
Rate Limit Status¶
GET /api/v1/evaluations/rate-limits
Returns current tier, limits, usage, remaining allowance, and reset time.
Responses from evaluation endpoints also include standard X-RateLimit-* headers:
- X-RateLimit-Tier
- X-RateLimit-PerMinute-Limit
- X-RateLimit-Daily-Limit
- X-RateLimit-Daily-Remaining
- X-RateLimit-Tokens-Remaining
- X-RateLimit-Daily-Cost-Remaining
- X-RateLimit-Monthly-Cost-Remaining
Idempotency¶
For create endpoints, supply Idempotency-Key to make requests safe to retry. When a prior successful request with the same key exists (scoped per user and entity type), the API returns the original resource instead of creating a duplicate.
POST /api/v1/evaluations- create evaluation definitionPOST /api/v1/evaluations/datasets- create datasetPOST /api/v1/evaluations/{eval_id}/runs- create runPOST /api/v1/evaluations/embeddings/abtest- create embeddings A/B test (scaffold)POST /api/v1/evaluations/embeddings/abtest/{test_id}/run- start A/B test (admin-gated)
Example:
Idempotency-Key: 9c20c0b8-5e5b-42d1-ae6a-6b1ae1a4f3de
Keys are stored server-side and are unique per {user_id, entity_type, key}.
Admin Gating¶
Some heavy operations (e.g., embeddings A/B test run and export) are admin-gated by default. Control this behavior with the environment variable:
EVALS_HEAVY_ADMIN_ONLY=true|false(default:true)
When enabled, non-admin users receive 403 for gated endpoints.
Error Handling¶
All errors follow a consistent format:
{
"error": {
"message": "Detailed error description",
"type": "error_category",
"param": "field_name",
"code": "ERROR_CODE"
}
}
Error Types¶
authentication_error: Auth failuresinvalid_request_error: Validation errorsrate_limit_error: Rate limit exceedednot_found_error: Resource not foundserver_error: Internal errors
HTTP Status Codes¶
200: Success201: Created202: Accepted (async operation)400: Bad Request401: Unauthorized403: Forbidden404: Not Found429: Too Many Requests500: Internal Server Error
Migration Guide¶
From Legacy Endpoints¶
Old tldw endpoints → New unified endpoints¶
/api/v1/evaluations/geval→/api/v1/evaluations/geval(unchanged)/api/v1/evaluations/rag→/api/v1/evaluations/rag(unchanged)/api/v1/evaluations/batch→/api/v1/evaluations/batch(unchanged)
Old OpenAI endpoints → New unified endpoints¶
/api/v1/evals→/api/v1/evaluations/api/v1/evals/{id}/runs→/api/v1/evaluations/{id}/runs/api/v1/runs/{id}→/api/v1/evaluations/runs/{id}
Note: Current server builds expose the unified routes. Legacy aliases may exist in older deployments only.
Breaking Changes¶
- Webhook event names standardized (see Webhook Events section)
- Rate limit headers now use
X-RateLimit-*prefix - Dataset samples format standardized to OpenAI format
Deprecation Timeline¶
- Current: Unified endpoints are the supported API surface.
- Legacy deployments: May still expose alias routes (
/evals,/runs) behind compatibility shims. - Future: Alias routes, where present, are subject to removal without feature updates.
Examples¶
Python (requests)¶
import json
from urllib.request import Request, urlopen
API_KEY = "your-key"
BASE = "http://localhost:8000/api/v1/evaluations"
headers = {"X-API-KEY": API_KEY}
def request_json(method, url, payload=None, headers=None):
data = json.dumps(payload).encode("utf-8") if payload is not None else None
hdrs = {"Content-Type": "application/json"}
if headers:
hdrs.update(headers)
req = Request(url, data=data, headers=hdrs, method=method)
with urlopen(req) as resp:
return json.loads(resp.read().decode("utf-8"))
# Create evaluation
payload = {
"name": "my_eval",
"eval_type": "model_graded",
"eval_spec": {"metrics": ["fluency"], "model": "gpt-4"},
"dataset": [{"input": {"text": "hi"}, "expected": {"text": "hi"}}]
}
e = request_json("POST", BASE, payload=payload, headers=headers)
# Start a run
r = request_json(
"POST",
f"{BASE}/{e['id']}/runs",
payload={"target_model": "gpt-4"},
headers=headers,
)
# Poll run status
status = request_json("GET", f"{BASE}/runs/{r['id']}", headers=headers)
Pipeline Presets & Cleanup¶
Create or update a pipeline preset:
curl -X POST "$BASE/rag/pipeline/presets" \
-H "X-API-KEY: $API_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"standard","config": {"retrieval": {"k": 8}}}'
List presets:
curl "$BASE/rag/pipeline/presets" -H "X-API-KEY: $API_KEY"
Cleanup expired ephemeral collections:
curl -X POST "$BASE/rag/pipeline/cleanup" -H "X-API-KEY: $API_KEY"
Embeddings A/B Test (SSE)¶
Stream events for a running A/B test:
curl "$BASE/embeddings/abtest/abtest_123/events" -H "X-API-KEY: $API_KEY"
Best Practices¶
Evaluation Design¶
- Choose appropriate metrics for your use case
- Use consistent datasets for comparable results
- Set reasonable thresholds based on baseline testing
- Version your evaluations for reproducibility
Performance Optimization¶
- Batch similar evaluations to reduce overhead
- Use parallel workers for large datasets
- Set appropriate timeouts to prevent hanging
- Cache evaluation results when possible
Cost Management¶
- Monitor token usage via metrics endpoint
- Use smaller models for initial testing
- Implement sampling for large datasets
- Set spending limits via configuration
Security¶
- Rotate API keys regularly
- Use webhook secrets for verification
- Implement IP allowlisting for production
- Audit evaluation access via logs
Support¶
Resources¶
- GitHub Issues: https://github.com/tldw/tldw_server/issues
- Documentation: https://docs.tldw.ai/evaluations
- Discord Community: https://discord.gg/tldw
Feature Requests¶
Submit feature requests via GitHub issues with the enhancement label.
Contributing¶
See CONTRIBUTING.md for guidelines on contributing to the evaluation module.
Last Updated: 2024 Version: 1.0.0 Status: Unified Implementation
History¶
Evaluation History¶
POST /api/v1/evaluations/history
Retrieve evaluation history for a user with optional filters.
Request:
{
"user_id": "optional-user-id",
"evaluation_type": "rag|geval|response_quality|...",
"start_date": "2025-01-01T00:00:00Z",
"end_date": "2025-01-31T23:59:59Z",
"limit": 20,
"offset": 0
}