mirror of
https://github.com/katanemo/plano.git
synced 2026-06-08 14:55:14 +02:00
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:
parent
4da0c63231
commit
09a5fea8ba
13 changed files with 330 additions and 0 deletions
27
tests/e2e/configs/retry_it10_timeout_triggers_retry.yaml
Normal file
27
tests/e2e/configs/retry_it10_timeout_triggers_retry.yaml
Normal 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
|
||||
33
tests/e2e/configs/retry_it11_high_latency_failover.yaml
Normal file
33
tests/e2e/configs/retry_it11_high_latency_failover.yaml
Normal 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
|
||||
23
tests/e2e/configs/retry_it12_streaming.yaml
Normal file
23
tests/e2e/configs/retry_it12_streaming.yaml
Normal 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
|
||||
23
tests/e2e/configs/retry_it13_body_preserved.yaml
Normal file
23
tests/e2e/configs/retry_it13_body_preserved.yaml
Normal 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
|
||||
23
tests/e2e/configs/retry_it1_basic_429.yaml
Normal file
23
tests/e2e/configs/retry_it1_basic_429.yaml
Normal 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
|
||||
23
tests/e2e/configs/retry_it2_503_different_provider.yaml
Normal file
23
tests/e2e/configs/retry_it2_503_different_provider.yaml
Normal 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
|
||||
23
tests/e2e/configs/retry_it3_all_exhausted.yaml
Normal file
23
tests/e2e/configs/retry_it3_all_exhausted.yaml
Normal 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
|
||||
17
tests/e2e/configs/retry_it4_no_retry_policy.yaml
Normal file
17
tests/e2e/configs/retry_it4_no_retry_policy.yaml
Normal 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
|
||||
27
tests/e2e/configs/retry_it5_max_attempts.yaml
Normal file
27
tests/e2e/configs/retry_it5_max_attempts.yaml
Normal 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
|
||||
24
tests/e2e/configs/retry_it6_backoff_delay.yaml
Normal file
24
tests/e2e/configs/retry_it6_backoff_delay.yaml
Normal 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
|
||||
28
tests/e2e/configs/retry_it7_fallback_priority.yaml
Normal file
28
tests/e2e/configs/retry_it7_fallback_priority.yaml
Normal 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
|
||||
23
tests/e2e/configs/retry_it8_retry_after_honored.yaml
Normal file
23
tests/e2e/configs/retry_it8_retry_after_honored.yaml
Normal 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
|
||||
|
|
@ -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
|
||||
Loading…
Add table
Add a link
Reference in a new issue