forked from retoor/devplacepy
Update
This commit is contained in:
@@ -1,5 +1,8 @@
|
||||
# retoor <retoor@molodetz.nl>
|
||||
|
||||
import pytest
|
||||
from pydantic import ValidationError
|
||||
|
||||
from devplacepy.services.openai_gateway import routing as r
|
||||
from devplacepy.services.openai_gateway.usage import pricing_from_cfg
|
||||
|
||||
@@ -14,6 +17,7 @@ def _cleanup(providers, models):
|
||||
def test_no_routes_pass_through(local_db):
|
||||
assert r.chat_overlay("ghost-model-xyz", {}) is None
|
||||
assert r.embed_overlay("ghost-embed-xyz", {}) is None
|
||||
assert r.image_overlay("ghost-image-xyz", {}) is None
|
||||
|
||||
|
||||
def test_chat_route_overlay_and_economy(local_db):
|
||||
@@ -80,6 +84,37 @@ def test_vision_merge_overlay(local_db):
|
||||
_cleanup(["utvis"], ["ut-vision"])
|
||||
|
||||
|
||||
def test_image_route_and_kind_isolation(local_db):
|
||||
r.provider_store.set(
|
||||
r.ProviderIn(
|
||||
name="utimg",
|
||||
base_url="https://img.example/v1/chat/completions",
|
||||
api_key="ik",
|
||||
)
|
||||
)
|
||||
r.model_store.set(
|
||||
r.ModelRouteIn(
|
||||
source_model="ut-image",
|
||||
provider="utimg",
|
||||
target_model="vendor/flux",
|
||||
kind="image",
|
||||
price_input_per_m=0.05,
|
||||
)
|
||||
)
|
||||
try:
|
||||
overlay = r.image_overlay("ut-image", {})
|
||||
assert overlay["gateway_image_model"] == "vendor/flux"
|
||||
assert overlay["gateway_image_url"] == "https://img.example/v1/images"
|
||||
assert overlay["gateway_image_key"] == "ik"
|
||||
assert overlay["gateway_image_price_per_call"] == 0.05
|
||||
assert r.chat_overlay("ut-image", {}) is None
|
||||
assert r.embed_overlay("ut-image", {}) is None
|
||||
pricing = pricing_from_cfg(overlay)
|
||||
assert pricing.image_per_call == 0.05
|
||||
finally:
|
||||
_cleanup(["utimg"], ["ut-image"])
|
||||
|
||||
|
||||
def test_embed_route_and_kind_isolation(local_db):
|
||||
r.provider_store.set(
|
||||
r.ProviderIn(
|
||||
@@ -140,3 +175,108 @@ def test_blank_provider_uses_default_upstream(local_db):
|
||||
assert overlay["gateway_price_output_per_m"] == 3.0
|
||||
finally:
|
||||
_cleanup([], ["ut-default"])
|
||||
|
||||
|
||||
def test_tier2_and_off_peak_fields_propagate_through_overlay(local_db):
|
||||
r.model_store.set(
|
||||
r.ModelRouteIn(
|
||||
source_model="ut-tiered",
|
||||
target_model="vendor/tiered",
|
||||
kind="chat",
|
||||
price_cache_hit_per_m=0.0028,
|
||||
price_cache_miss_per_m=0.14,
|
||||
price_output_per_m=0.28,
|
||||
context_tier_threshold_tokens=128_000,
|
||||
price_output_per_m_tier2=0.56,
|
||||
off_peak_start_minute=990,
|
||||
off_peak_end_minute=30,
|
||||
off_peak_discount_pct=25.0,
|
||||
)
|
||||
)
|
||||
try:
|
||||
overlay = r.chat_overlay("ut-tiered", {})
|
||||
assert overlay["gateway_context_tier_threshold_tokens"] == 128_000
|
||||
assert overlay["gateway_price_output_per_m_tier2"] == 0.56
|
||||
assert overlay["gateway_price_cache_hit_per_m_tier2"] is None
|
||||
assert overlay["gateway_off_peak_start_minute"] == 990
|
||||
assert overlay["gateway_off_peak_end_minute"] == 30
|
||||
assert overlay["gateway_off_peak_discount_pct"] == 25.0
|
||||
pricing = pricing_from_cfg(overlay)
|
||||
assert pricing.context_tier_threshold_tokens == 128_000
|
||||
assert pricing.chat_output_per_m_tier2 == 0.56
|
||||
assert pricing.chat_cache_hit_per_m_tier2 is None
|
||||
assert pricing.off_peak_start_minute == 990
|
||||
finally:
|
||||
_cleanup([], ["ut-tiered"])
|
||||
|
||||
|
||||
def test_unrouted_request_never_gains_tier_or_off_peak_keys(local_db):
|
||||
assert r.chat_overlay("ghost-model-untiered", {}) is None
|
||||
pricing = pricing_from_cfg({})
|
||||
assert pricing.context_tier_threshold_tokens == 0
|
||||
assert pricing.off_peak_start_minute is None
|
||||
assert pricing.off_peak_end_minute is None
|
||||
assert pricing.chat_output_per_m_tier2 is None
|
||||
|
||||
|
||||
def test_off_peak_window_requires_both_start_and_end():
|
||||
with pytest.raises(ValidationError):
|
||||
r.ModelRouteIn(
|
||||
source_model="ut-bad-window",
|
||||
target_model="vendor/x",
|
||||
off_peak_start_minute=60,
|
||||
)
|
||||
with pytest.raises(ValidationError):
|
||||
r.ModelRouteIn(
|
||||
source_model="ut-bad-window",
|
||||
target_model="vendor/x",
|
||||
off_peak_end_minute=120,
|
||||
)
|
||||
|
||||
|
||||
def test_seed_default_image_routes_is_idempotent(local_db):
|
||||
r.model_store.remove(r.IMAGE_SOURCE_MODEL)
|
||||
r.seed_default_image_routes()
|
||||
route = r.model_store.get(r.IMAGE_SOURCE_MODEL)
|
||||
assert route is not None
|
||||
assert route.kind == "image"
|
||||
assert route.target_model == r.FLUX_TARGET_MODEL
|
||||
r.seed_default_image_routes()
|
||||
assert r.model_store.get(r.IMAGE_SOURCE_MODEL).target_model == r.FLUX_TARGET_MODEL
|
||||
|
||||
|
||||
def test_seed_default_deepseek_routes_is_idempotent_and_preserves_customization(
|
||||
local_db,
|
||||
):
|
||||
r.seed_default_deepseek_routes()
|
||||
flash = r.model_store.get("deepseek-v4-flash")
|
||||
pro = r.model_store.get("deepseek-v4-pro")
|
||||
assert flash is not None and pro is not None
|
||||
assert flash.price_cache_hit_per_m == 0.0028
|
||||
assert flash.price_cache_miss_per_m == 0.14
|
||||
assert flash.price_output_per_m == 0.28
|
||||
assert flash.context_window == 1_048_576
|
||||
assert pro.price_cache_hit_per_m == 0.003625
|
||||
assert pro.price_cache_miss_per_m == 0.435
|
||||
assert pro.price_output_per_m == 0.87
|
||||
r.model_store.set(
|
||||
r.ModelRouteIn(
|
||||
source_model="deepseek-v4-pro",
|
||||
target_model="deepseek-v4-pro",
|
||||
price_output_per_m=1.23,
|
||||
)
|
||||
)
|
||||
try:
|
||||
r.seed_default_deepseek_routes()
|
||||
assert r.model_store.get("deepseek-v4-pro").price_output_per_m == 1.23
|
||||
finally:
|
||||
r.model_store.set(
|
||||
r.ModelRouteIn(
|
||||
source_model="deepseek-v4-pro",
|
||||
target_model="deepseek-v4-pro",
|
||||
price_cache_hit_per_m=0.003625,
|
||||
price_cache_miss_per_m=0.435,
|
||||
price_output_per_m=0.87,
|
||||
context_window=1_048_576,
|
||||
)
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user