from llama_index.core.llms import LLM from rag.config import MAX_ANSWER_TOKENS, PROVIDERS def make_llm(provider: str, api_key: str, model: str, **kwargs) -> LLM: """Build an LLM client for a single request. Args: provider: a slug from `config.PROVIDERS` ("openai" | "gemini" | "anthropic"). api_key: the key the user pasted into the UI. model: a model ID, one of the provider's `models`. **kwargs: passed through to the underlying LlamaIndex class. Raises: ValueError: unknown provider, or a blank API key. """ spec = PROVIDERS.get(provider) if spec is None: raise ValueError( f"Unknown provider {provider!r}. Expected one of: {', '.join(PROVIDERS)}" ) api_key = (api_key or "").strip() if not api_key: raise ValueError(f"No API key provided. Please paste your {spec.key_label}.") # We leave temperature at each provider's default, because the gpt-5 family # rejects any value other than 1. kwargs.setdefault("max_tokens", MAX_ANSWER_TOKENS) if provider == "openai": from llama_index.llms.openai import OpenAI return OpenAI(model=model, api_key=api_key, **kwargs) if provider == "gemini": from llama_index.llms.google_genai import GoogleGenAI return GoogleGenAI(model=model, api_key=api_key, **kwargs) if provider == "anthropic": from llama_index.llms.anthropic import Anthropic return Anthropic(model=model, api_key=api_key, **kwargs) raise ValueError(f"Provider {provider!r} is configured but not implemented.")