Fix provider feature detection to use model.provider, not just URL

Previously, OpenAI-compatible provider settings (like developer role support)
were detected only from the baseUrl. When using custom URLs (e.g., proxies),
detection failed. Now checks model.provider first, then falls back to URL.

Fixes #774
This commit is contained in:
Mario Zechner 2026-01-16 12:41:23 +01:00
parent 0b625b66b7
commit f900eb591d
2 changed files with 20 additions and 8 deletions

View file

@ -2,6 +2,10 @@
## [Unreleased]
### Fixed
- Fixed OpenAI-compatible provider feature detection to use `model.provider` in addition to URL, allowing custom base URLs (e.g., proxies) to work correctly with provider-specific settings ([#774](https://github.com/badlogic/pi-mono/issues/774))
## [0.47.0] - 2026-01-16
### Fixed

View file

@ -679,25 +679,33 @@ function mapStopReason(reason: ChatCompletionChunk.Choice["finish_reason"]): Sto
}
/**
* Detect compatibility settings from baseUrl for known providers.
* Detect compatibility settings from provider and baseUrl for known providers.
* Provider takes precedence over URL-based detection since it's explicitly configured.
* Returns a fully resolved OpenAICompat object with all fields set.
*/
function detectCompatFromUrl(baseUrl: string): Required<OpenAICompat> {
const isZai = baseUrl.includes("api.z.ai");
function detectCompat(model: Model<"openai-completions">): Required<OpenAICompat> {
const provider = model.provider;
const baseUrl = model.baseUrl;
const isZai = provider === "zai" || baseUrl.includes("api.z.ai");
const isNonStandard =
provider === "cerebras" ||
baseUrl.includes("cerebras.ai") ||
provider === "xai" ||
baseUrl.includes("api.x.ai") ||
provider === "mistral" ||
baseUrl.includes("mistral.ai") ||
baseUrl.includes("chutes.ai") ||
isZai ||
provider === "opencode" ||
baseUrl.includes("opencode.ai");
const useMaxTokens = baseUrl.includes("mistral.ai") || baseUrl.includes("chutes.ai");
const useMaxTokens = provider === "mistral" || baseUrl.includes("mistral.ai") || baseUrl.includes("chutes.ai");
const isGrok = baseUrl.includes("api.x.ai");
const isGrok = provider === "xai" || baseUrl.includes("api.x.ai");
const isMistral = baseUrl.includes("mistral.ai");
const isMistral = provider === "mistral" || baseUrl.includes("mistral.ai");
return {
supportsStore: !isNonStandard,
@ -715,10 +723,10 @@ function detectCompatFromUrl(baseUrl: string): Required<OpenAICompat> {
/**
* Get resolved compatibility settings for a model.
* Uses explicit model.compat if provided, otherwise auto-detects from URL.
* Uses explicit model.compat if provided, otherwise auto-detects from provider/URL.
*/
function getCompat(model: Model<"openai-completions">): Required<OpenAICompat> {
const detected = detectCompatFromUrl(model.baseUrl);
const detected = detectCompat(model);
if (!model.compat) return detected;
return {