vLLM/LocalLLM provider via OpenAI-compatible client
nforum adds support for self-hosted vLLM endpoints alongside cloud providers. The conflict-resolving merge that united this with the OpenAI PR is the most consequential piece - it rewires defaults in a way that deserves a second look before import.
The initial commit (0c84ef4) introduces localllm-main and localllm-lite model ids backed by four env vars: VLLM_BASE_URL, VLLM_API_KEY, VLLM_MAIN_MODEL, and VLLM_LIGHT_MODEL. No per-user key - it's a server-configured endpoint. modelAvailability treats LocalLLM as always-available when VLLM_BASE_URL is set.
A follow-up commit scrubbed a specific model name (unsloth/gemma-4-E2B-it-GGUF:Q5_K_S) from .env.example, replacing it with a generic placeholder. Someone had left their own model identifier in.
The reconciling merge (86dab80) is what matters. It unifies the LocalLLM and OpenAI PRs into a single openai.ts with a getClient(model) factory: gpt-* ids get the OpenAI cloud client; localllm-* ids get a vLLM client with a different baseURL and VLLM_API_KEY fallback. Tool-call handling upgrades to a streaming-delta accumulator with full tool_calls round-trip. The post-merge defaults flip DEFAULT_MAIN_MODEL to "localllm-main" and resolveTitleModel silently prefers localllm-lite whenever VLLM_BASE_URL is present.
That default flip is a policy decision encoded in the code. Anyone deploying this with a VLLM_BASE_URL set will route all title generation through vLLM without any UI indication.
Spotted something wrong? Or know the PR text has fresher detail than the writeup above?