"""LLM layer: provider abstraction, concrete providers, service and fake.""" from .base import ( FakeLLMProvider, LLMGenerationError, LLMProvider, LLMProviderError, StructuredOutputError, ) from .cursor_provider import CursorCloudProvider from .kimi_provider import KimiProvider from .openrouter_provider import OpenRouterProvider from .service import LLMService, extract_json_object def create_llm_provider(settings): """Construct the provider selected in configuration.""" provider_name = (settings.llm_provider or "cursor").strip().lower() if provider_name == "cursor": return CursorCloudProvider(settings) if provider_name == "kimi": return KimiProvider(settings) if provider_name in ("openrouter", "groq", "gemini", "openai"): return OpenRouterProvider(settings) raise RuntimeError(f"Unsupported LLM provider: {provider_name!r}") __all__ = [ "CursorCloudProvider", "FakeLLMProvider", "KimiProvider", "LLMGenerationError", "LLMProvider", "LLMProviderError", "LLMService", "OpenRouterProvider", "StructuredOutputError", "create_llm_provider", "extract_json_object", ]