Files
wehub-resource-sync 97e91a83f3
Ruff / Ruff (push) Has been cancelled
Test / Core Tests (push) Has been cancelled
Test / Offline Coverage Tests (Python 3.10) (push) Has been cancelled
Test / Offline Coverage Tests (Python 3.11) (push) Has been cancelled
Test / Offline Coverage Tests (Python 3.12) (push) Has been cancelled
Test / Offline Coverage Tests (Python 3.13) (push) Has been cancelled
Test / Offline Coverage Tests (Python 3.9) (push) Has been cancelled
Test / Full Coverage (Python 3.11) (push) Has been cancelled
Test / Core Provider Tests (OpenAI) (push) Has been cancelled
Test / Core Provider Tests (Anthropic) (push) Has been cancelled
Test / Core Provider Tests (Google) (push) Has been cancelled
Test / Core Provider Tests (Other) (push) Has been cancelled
Test / Anthropic Tests (push) Has been cancelled
Test / Gemini Tests (push) Has been cancelled
Test / Google GenAI Tests (push) Has been cancelled
Test / Vertex AI Tests (push) Has been cancelled
Test / OpenAI Tests (push) Has been cancelled
Test / Writer Tests (push) Has been cancelled
Test / Auto Client Tests (push) Has been cancelled
ty / type-check (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:36:38 +08:00

119 lines
4.1 KiB
Python

"""Tests for v2 mode registry."""
import pytest
from instructor import Mode
from instructor.v2 import Provider, mode_registry
from instructor.v2.core.decorators import register_mode_handler
from tests.v2.conftest import get_registered_provider_mode_pairs
def _get_registered_providers() -> list[Provider]:
pairs = get_registered_provider_mode_pairs()
return sorted({provider for provider, _ in pairs}, key=lambda p: p.value)
def _get_registered_modes() -> list[Mode]:
pairs = get_registered_provider_mode_pairs()
return sorted({mode for _, mode in pairs}, key=lambda m: m.value)
def _get_registered_provider_modes() -> list[tuple[Provider, Mode]]:
return get_registered_provider_mode_pairs()
def test_registry_registration():
"""Test basic registration."""
@register_mode_handler(Provider.DEEPSEEK, Mode.JSON)
class TestHandler:
def prepare_request(self, response_model, kwargs):
return response_model, kwargs
def handle_reask(self, kwargs, _response, _exception):
return kwargs
def parse_response(self, _response, response_model, **_kwargs):
return response_model()
# Check it's registered
assert mode_registry.is_registered(Provider.DEEPSEEK, Mode.JSON)
# Get handlers
handlers = mode_registry.get_handlers(Provider.DEEPSEEK, Mode.JSON)
assert handlers.request_handler is not None
assert handlers.reask_handler is not None
assert handlers.response_parser is not None
def test_registry_get_handler():
"""Test getting specific handler types."""
@register_mode_handler(Provider.OPENROUTER, Mode.TOOLS)
class TestHandler:
def prepare_request(self, response_model, _kwargs):
return response_model, {"test": "request"}
def handle_reask(self, _kwargs, _response, _exception):
return {"test": "reask"}
def parse_response(self, _response, response_model, **_kwargs):
return response_model()
# Get individual handlers
request_handler = mode_registry.get_handler(
Provider.OPENROUTER, Mode.TOOLS, "request"
)
result = request_handler(None, {})
assert result[1]["test"] == "request"
reask_handler = mode_registry.get_handler(Provider.OPENROUTER, Mode.TOOLS, "reask")
result = reask_handler({}, None, None)
assert result["test"] == "reask"
@pytest.mark.parametrize("provider", _get_registered_providers())
def test_registry_query_by_provider(provider: Provider):
"""Test querying modes for a provider."""
modes = mode_registry.get_modes_for_provider(provider)
assert modes, f"{provider.value} should have at least one mode"
expected_modes = {
mode for prov, mode in get_registered_provider_mode_pairs() if prov == provider
}
assert expected_modes.issubset(set(modes))
@pytest.mark.parametrize("mode", _get_registered_modes())
def test_registry_query_by_mode_type(mode: Mode):
"""Test querying providers for a mode type."""
providers = mode_registry.get_providers_for_mode(mode)
assert providers, f"{mode.value} should have at least one provider"
expected_providers = {
provider
for provider, registered_mode in get_registered_provider_mode_pairs()
if registered_mode == mode
}
assert expected_providers.issubset(set(providers))
@pytest.mark.parametrize("provider,mode", _get_registered_provider_modes())
def test_registry_list_modes(provider: Provider, mode: Mode):
"""Test listing all registered modes."""
all_modes = mode_registry.list_modes()
assert (provider, mode) in all_modes
def test_registry_not_registered():
"""Test error when mode not registered."""
with pytest.raises(KeyError, match="not registered"):
mode_registry.get_handlers(Provider.GEMINI, Mode.JSON_SCHEMA)
@pytest.mark.parametrize("provider,mode", _get_registered_provider_modes())
def test_registry_invalid_handler_type(provider: Provider, mode: Mode):
"""Test error for invalid handler type."""
with pytest.raises(ValueError, match="Invalid handler_type"):
mode_registry.get_handler(provider, mode, "invalid_type")