"""evalharness.model -- calling and deploying models. Two plugin families, deliberately separate lifecycles: ModelAdapter HOW to call (protocol): openai_compatible, mock, ... Deployer HOW to run (environment): vllm, sglang, external (docker-pinned) Model spec grammar (strings everywhere, no config ceremony): mock / mock:boxed / mock:tool offline openai/http://host:8000/v1?model_id any OpenAI-protocol endpoint (vllm, sglang, cloud) deploy:vllm/qwen3-8b Deployer resolves endpoint (models.yaml pins env) All adapters are async and return structured ModelOutput(text, tool_calls, usage) -- the hinge the future agent loops hang on. """ from .adapter import ( ADAPTER_REGISTRY, ModelAdapter, OpenAICompatible, MockAdapter, register_adapter, resolve_adapter, parse_model_spec, ) from .deployer import ( DEPLOYER_REGISTRY, Deployer, VLLMDeployer, SGLangDeployer, External, deploy, load_model_config, register_deployer, stop_all, ) from .output import ModelOutput, ToolCall, Usage from .runner import generate_predictions, run_eval __all__ = [ 'ModelAdapter', 'OpenAICompatible', 'MockAdapter', 'register_adapter', 'resolve_adapter', 'parse_model_spec', 'ADAPTER_REGISTRY', 'Deployer', 'VLLMDeployer', 'SGLangDeployer', 'External', 'register_deployer', 'deploy', 'stop_all', 'load_model_config', 'DEPLOYER_REGISTRY', 'ModelOutput', 'ToolCall', 'Usage', 'generate_predictions', 'run_eval', ]