Files
hunjing/backend/tests/ai_provider/test_pipeline.py
T
2026-08-21 16:00:13 +08:00

92 lines
3.3 KiB
Python

"""Tests for the parameter pipeline (Task 4)."""
from __future__ import annotations
import pytest
from app.ai_provider.config.models import ModelConfig, ParameterMapping, ProviderConfig
from app.ai_provider.pipeline import PipelineContext, PipelineFactory
class TestParameterPipeline:
"""Test the config-driven 4-stage parameter pipeline."""
@pytest.fixture
def pipeline(self):
provider_cfg = ProviderConfig(
name="deepseek",
format="openai",
base_url_env="DEEPSEEK_BASE_URL",
api_key_env="DEEPSEEK_API_KEY",
parameter_mappings={
"temperature": ParameterMapping(provider_param="temperature", min=0, max=2),
"max_tokens": ParameterMapping(provider_param="max_tokens", min=1),
"top_p": ParameterMapping(provider_param="top_p", min=0, max=1),
},
)
return PipelineFactory.create(provider_cfg)
def test_normalize_temperature(self, pipeline):
ctx = PipelineContext(params={"temperature": 0.7})
result = pipeline.run(ctx)
assert result.params["temperature"] == 0.7
def test_clamp_temperature(self, pipeline):
ctx = PipelineContext(params={"temperature": 5.0})
result = pipeline.run(ctx)
assert result.params["temperature"] == 2.0 # clamped to max
def test_filter_unknown_param(self, pipeline):
ctx = PipelineContext(params={"temperature": 0.5, "unknown_param": "value"})
result = pipeline.run(ctx)
assert "unknown_param" not in result.params
assert "temperature" in result.params
def test_inject_provider_defaults(self):
provider_cfg = ProviderConfig(
name="anthropic",
format="anthropic",
base_url_env="ANTHROPIC_BASE_URL",
api_key_env="ANTHROPIC_API_KEY",
parameter_mappings={
"max_tokens": ParameterMapping(provider_param="max_tokens", default=4096),
},
)
pipeline = PipelineFactory.create(provider_cfg)
ctx = PipelineContext(params={})
result = pipeline.run(ctx)
assert result.params["max_tokens"] == 4096
def test_transform_param(self):
provider_cfg = ProviderConfig(
name="openai",
format="openai",
base_url_env="OPENAI_BASE_URL",
api_key_env="OPENAI_API_KEY",
parameter_mappings={
"max_tokens": ParameterMapping(provider_param="max_tokens", transform="int"),
},
)
pipeline = PipelineFactory.create(provider_cfg)
ctx = PipelineContext(params={"max_tokens": 4096.0})
result = pipeline.run(ctx)
assert isinstance(result.params["max_tokens"], int)
def test_capability_filter_vision(self):
model = ModelConfig(
name="test",
provider="openai",
model="gpt-4o",
format="openai",
supports_vision=False,
)
provider_cfg = ProviderConfig(
name="openai", format="openai", base_url_env="X", api_key_env="Y"
)
pipeline = PipelineFactory.create(provider_cfg)
ctx = PipelineContext(
params={"image_url": "http://example.com/img.png"}, model_config=model
)
result = pipeline.run(ctx)
assert "image_url" in result.filtered_params