e2e: add retry/failover test configuration files

Add 13 test-specific plano configs covering:
- Basic 429/503 retry scenarios
- Multi-provider failover with priority ordering
- Max attempts and backoff delay verification
- Retry-After header honoring and blocking
- Timeout-triggered retry
- High latency failover
- Streaming retry
- Request body preservation across retries

Signed-off-by: Troy Mitchell <i@troy-y.org>
This commit is contained in:
Troy Mitchell 2026-04-28 16:56:33 +08:00
parent 4da0c63231
commit 09a5fea8ba
13 changed files with 330 additions and 0 deletions

View file

@ -0,0 +1,27 @@
version: v0.3.0
listeners:
- type: model
name: model_listener
port: 12000
model_providers:
- model: openai/gpt-4o
base_url: http://host.docker.internal:${MOCK_PRIMARY_PORT}
access_key: test-key-primary
default: true
retry_policy:
fallback_models: [anthropic/claude-3-5-sonnet]
default_strategy: "different_provider"
default_max_attempts: 2
on_status_codes:
- codes: [429]
strategy: "different_provider"
max_attempts: 2
on_timeout:
strategy: "different_provider"
max_attempts: 2
- model: anthropic/claude-3-5-sonnet
base_url: http://host.docker.internal:${MOCK_SECONDARY_PORT}
access_key: test-key-secondary

View file

@ -0,0 +1,33 @@
version: v0.3.0
listeners:
- type: model
name: model_listener
port: 12000
model_providers:
- model: openai/gpt-4o
base_url: http://host.docker.internal:${MOCK_PRIMARY_PORT}
access_key: test-key-primary
default: true
retry_policy:
fallback_models: [anthropic/claude-3-5-sonnet]
default_strategy: "different_provider"
default_max_attempts: 2
on_status_codes:
- codes: [429]
strategy: "different_provider"
max_attempts: 2
on_high_latency:
threshold_ms: 1000
measure: "total"
min_triggers: 1
strategy: "different_provider"
max_attempts: 2
block_duration_seconds: 60
scope: "model"
apply_to: "global"
- model: anthropic/claude-3-5-sonnet
base_url: http://host.docker.internal:${MOCK_SECONDARY_PORT}
access_key: test-key-secondary

View file

@ -0,0 +1,23 @@
version: v0.3.0
listeners:
- type: model
name: model_listener
port: 12000
model_providers:
- model: openai/gpt-4o
base_url: http://host.docker.internal:${MOCK_PRIMARY_PORT}
access_key: test-key-primary
default: true
retry_policy:
default_strategy: "different_provider"
default_max_attempts: 2
on_status_codes:
- codes: [429]
strategy: "different_provider"
max_attempts: 2
- model: anthropic/claude-3-5-sonnet
base_url: http://host.docker.internal:${MOCK_SECONDARY_PORT}
access_key: test-key-secondary

View file

@ -0,0 +1,23 @@
version: v0.3.0
listeners:
- type: model
name: model_listener
port: 12000
model_providers:
- model: openai/gpt-4o
base_url: http://host.docker.internal:${MOCK_PRIMARY_PORT}
access_key: test-key-primary
default: true
retry_policy:
default_strategy: "different_provider"
default_max_attempts: 2
on_status_codes:
- codes: [429]
strategy: "different_provider"
max_attempts: 2
- model: anthropic/claude-3-5-sonnet
base_url: http://host.docker.internal:${MOCK_SECONDARY_PORT}
access_key: test-key-secondary

View file

@ -0,0 +1,23 @@
version: v0.3.0
listeners:
- type: model
name: model_listener
port: 12000
model_providers:
- model: openai/gpt-4o
base_url: http://host.docker.internal:${MOCK_PRIMARY_PORT}
access_key: test-key-primary
default: true
retry_policy:
default_strategy: "different_provider"
default_max_attempts: 2
on_status_codes:
- codes: [429]
strategy: "different_provider"
max_attempts: 2
- model: anthropic/claude-3-5-sonnet
base_url: http://host.docker.internal:${MOCK_SECONDARY_PORT}
access_key: test-key-secondary

View file

@ -0,0 +1,23 @@
version: v0.3.0
listeners:
- type: model
name: model_listener
port: 12000
model_providers:
- model: openai/gpt-4o
base_url: http://host.docker.internal:${MOCK_PRIMARY_PORT}
access_key: test-key-primary
default: true
retry_policy:
default_strategy: "different_provider"
default_max_attempts: 2
on_status_codes:
- codes: [503]
strategy: "different_provider"
max_attempts: 2
- model: anthropic/claude-3-5-sonnet
base_url: http://host.docker.internal:${MOCK_SECONDARY_PORT}
access_key: test-key-secondary

View file

@ -0,0 +1,23 @@
version: v0.3.0
listeners:
- type: model
name: model_listener
port: 12000
model_providers:
- model: openai/gpt-4o
base_url: http://host.docker.internal:${MOCK_PRIMARY_PORT}
access_key: test-key-primary
default: true
retry_policy:
default_strategy: "different_provider"
default_max_attempts: 2
on_status_codes:
- codes: [429]
strategy: "different_provider"
max_attempts: 2
- model: anthropic/claude-3-5-sonnet
base_url: http://host.docker.internal:${MOCK_SECONDARY_PORT}
access_key: test-key-secondary

View file

@ -0,0 +1,17 @@
version: v0.3.0
listeners:
- type: model
name: model_listener
port: 12000
model_providers:
- model: openai/gpt-4o
base_url: http://host.docker.internal:${MOCK_PRIMARY_PORT}
access_key: test-key-primary
default: true
# No retry_policy — errors should be returned directly to client
- model: anthropic/claude-3-5-sonnet
base_url: http://host.docker.internal:${MOCK_SECONDARY_PORT}
access_key: test-key-secondary

View file

@ -0,0 +1,27 @@
version: v0.3.0
listeners:
- type: model
name: model_listener
port: 12000
model_providers:
- model: openai/gpt-4o
base_url: http://host.docker.internal:${MOCK_PRIMARY_PORT}
access_key: test-key-primary
default: true
retry_policy:
default_strategy: "different_provider"
default_max_attempts: 1
on_status_codes:
- codes: [429]
strategy: "different_provider"
max_attempts: 1
- model: anthropic/claude-3-5-sonnet
base_url: http://host.docker.internal:${MOCK_SECONDARY_PORT}
access_key: test-key-secondary
- model: mistral/mistral-large
base_url: http://host.docker.internal:${MOCK_TERTIARY_PORT}
access_key: test-key-tertiary

View file

@ -0,0 +1,24 @@
version: v0.3.0
listeners:
- type: model
name: model_listener
port: 12000
model_providers:
- model: openai/gpt-4o
base_url: http://host.docker.internal:${MOCK_PRIMARY_PORT}
access_key: test-key-primary
default: true
retry_policy:
default_strategy: "same_model"
default_max_attempts: 3
on_status_codes:
- codes: [429]
strategy: "same_model"
max_attempts: 3
backoff:
apply_to: "same_model"
base_ms: 500
max_ms: 5000
jitter: false

View file

@ -0,0 +1,28 @@
version: v0.3.0
listeners:
- type: model
name: model_listener
port: 12000
model_providers:
- model: openai/gpt-4o
base_url: http://host.docker.internal:${MOCK_PRIMARY_PORT}
access_key: test-key-primary
default: true
retry_policy:
fallback_models: [anthropic/claude-3-5-sonnet, mistral/mistral-large]
default_strategy: "different_provider"
default_max_attempts: 3
on_status_codes:
- codes: [429]
strategy: "different_provider"
max_attempts: 3
- model: anthropic/claude-3-5-sonnet
base_url: http://host.docker.internal:${MOCK_FALLBACK1_PORT}
access_key: test-key-fallback1
- model: mistral/mistral-large
base_url: http://host.docker.internal:${MOCK_FALLBACK2_PORT}
access_key: test-key-fallback2

View file

@ -0,0 +1,23 @@
version: v0.3.0
listeners:
- type: model
name: model_listener
port: 12000
model_providers:
- model: openai/gpt-4o
base_url: http://host.docker.internal:${MOCK_PRIMARY_PORT}
access_key: test-key-primary
default: true
retry_policy:
default_strategy: "same_model"
default_max_attempts: 2
on_status_codes:
- codes: [429]
strategy: "same_model"
max_attempts: 2
retry_after_handling:
scope: "model"
apply_to: "request"
max_retry_after_seconds: 300

View file

@ -0,0 +1,36 @@
version: v0.3.0
listeners:
- type: model
name: model_listener
port: 12000
model_providers:
- model: openai/gpt-4o
base_url: http://host.docker.internal:${MOCK_PRIMARY_PORT}
access_key: test-key-primary
default: true
retry_policy:
fallback_models: [anthropic/claude-3-5-sonnet]
default_strategy: "different_provider"
default_max_attempts: 2
on_status_codes:
- codes: [429]
strategy: "different_provider"
max_attempts: 2
retry_after_handling:
scope: "model"
apply_to: "global"
max_retry_after_seconds: 300
- model: anthropic/claude-3-5-sonnet
base_url: http://host.docker.internal:${MOCK_SECONDARY_PORT}
access_key: test-key-secondary
default: false
retry_policy:
default_strategy: "different_provider"
default_max_attempts: 2
on_status_codes:
- codes: [429]
strategy: "different_provider"
max_attempts: 2