A custom OpenAI-compatible endpoint typed without `/v1` in the Desktop
onboarding or Settings > Custom endpoints flow was probed only at
`{base}/models`, while the CLI's probe_api_models falls through to the
`/v1` alternate. Whatever the probe reported, the URL was saved verbatim
and the runtime POSTs `{base_url}/chat/completions` to it, so a server
that only serves `/v1/*` 404'd every chat request.
Both dashboard validators (`/api/providers/validate` OPENAI_BASE_URL
branch and `/api/providers/custom-endpoints/validate`) now share one
probe that tries the URL as entered and then its `/v1` variant (or the
stripped variant), and return `resolved_base_url` — the base that
actually served the model list. The Desktop onboarding persists that
URL, and the Settings "Test" rewrites the form's URL to it so the
following Save stores a URL chat can reach.
Co-authored-by: Jeongseok Kang <jskang@lablup.com>