Files
wehub-resource-sync e4dcfc49aa
Tests / Import Check (Python 3.13) (push) Has been cancelled
Tests / Import Check (Python 3.14) (push) Has been cancelled
Tests / Python Tests (Python 3.11) (push) Has been cancelled
Tests / Python Tests (Python 3.12) (push) Has been cancelled
Tests / Python Tests (Python 3.14) (push) Has been cancelled
Tests / Test Summary (push) Has been cancelled
Tests / Lint and Format (push) Has been cancelled
Tests / Web Node Tests (push) Has been cancelled
Tests / Import Check (Python 3.11) (push) Has been cancelled
Tests / Import Check (Python 3.12) (push) Has been cancelled
Tests / Python Tests (Python 3.13) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:00:43 +08:00

60 lines
2.3 KiB
Python

"""Factory for services-layer provider runtime objects."""
from __future__ import annotations
from deeptutor.services.llm.config import LLMConfig, get_llm_config
from deeptutor.services.llm.provider_core import (
AnthropicProvider,
AzureOpenAIProvider,
GenerationSettings,
GitHubCopilotProvider,
LLMProvider,
OpenAICodexProvider,
OpenAICompatProvider,
)
from deeptutor.services.provider_registry import find_by_name
def get_runtime_provider(config: LLMConfig | None = None) -> LLMProvider:
"""Build the authoritative services-layer provider for the supplied config."""
llm_config = config or get_llm_config()
provider_name = llm_config.provider_name or llm_config.binding
spec = find_by_name(provider_name)
backend = spec.backend if spec else "openai_compat"
if backend == "openai_codex":
provider: LLMProvider = OpenAICodexProvider(default_model=llm_config.model)
elif backend == "github_copilot":
provider = GitHubCopilotProvider(default_model=llm_config.model)
elif backend == "azure_openai":
provider = AzureOpenAIProvider(
api_key=llm_config.api_key or "",
api_base=llm_config.effective_url or llm_config.base_url or "",
default_model=llm_config.model,
extra_headers=llm_config.extra_headers or None,
)
elif backend == "anthropic":
provider = AnthropicProvider(
api_key=llm_config.api_key or None,
api_base=llm_config.effective_url or llm_config.base_url or None,
default_model=llm_config.model,
extra_headers=llm_config.extra_headers or None,
supports_prompt_caching=bool(spec and spec.supports_prompt_caching),
)
else:
provider = OpenAICompatProvider(
api_key=llm_config.api_key or None,
api_base=llm_config.effective_url or llm_config.base_url or None,
default_model=llm_config.model,
extra_headers=llm_config.extra_headers or None,
spec=spec,
provider_name=provider_name,
)
provider.generation = GenerationSettings(
temperature=llm_config.temperature,
max_tokens=llm_config.max_tokens,
reasoning_effort=llm_config.reasoning_effort,
)
return provider