import type { Model } from "@mariozechner/pi-ai" ;
import type { ProviderEndpointClass, ProviderRequestCapabilities } from "./provider-attribution.js" ;
import { resolveProviderRequestCapabilities } from "./provider-attribution.js" ;
type OpenAICompletionsCompatDefaultsInput = {
provider?: string;
endpointClass: ProviderEndpointClass;
knownProviderFamily: string;
supportsNativeStreamingUsageCompat?: boolean ;
usesExplicitProxyLikeEndpoint?: boolean ;
};
export type OpenAICompletionsCompatDefaults = {
supportsStore: boolean ;
supportsDeveloperRole: boolean ;
supportsReasoningEffort: boolean ;
supportsUsageInStreaming: boolean ;
maxTokensField: "max_completion_tokens" | "max_tokens" ;
thinkingFormat: "openai" | "openrouter" | "deepseek" | "zai" ;
visibleReasoningDetailTypes: string[];
supportsStrictMode: boolean ;
};
export type DetectedOpenAICompletionsCompat = {
capabilities: ProviderRequestCapabilities;
defaults: OpenAICompletionsCompatDefaults;
};
function isDefaultRouteProvider(provider: string | undefined, ...ids: string[]) {
return provider !== undefined && ids.includes(provider);
}
const KNOWN_LOCAL_STREAMING_USAGE_PROVIDERS = new Set([
"jan" ,
"llama-cpp" ,
"llama.cpp" ,
"llamacpp" ,
"lm-studio" ,
"lmstudio" ,
"localai" ,
"sglang" ,
"tabby" ,
"tabbyapi" ,
"text-generation-webui" ,
"vllm" ,
]);
function isKnownLocalStreamingUsageProvider(...ids: Array<string | undefined>): boolean {
return ids.some(
(id) => id !== undefined && KNOWN_LOCAL_STREAMING_USAGE_PROVIDERS.has(id.toLowerCase()),
);
}
export function resolveOpenAICompletionsCompatDefaults(
input: OpenAICompletionsCompatDefaultsInput,
): OpenAICompletionsCompatDefaults {
const {
provider,
endpointClass,
knownProviderFamily,
supportsNativeStreamingUsageCompat = false ,
usesExplicitProxyLikeEndpoint = false ,
} = input;
const isDefaultRoute = endpointClass === "default" ;
const usesConfiguredNonOpenAIEndpoint =
endpointClass !== "default" && endpointClass !== "openai-public" ;
const isMoonshotLike =
knownProviderFamily === "moonshot" ||
knownProviderFamily === "modelstudio" ||
endpointClass === "moonshot-native" ||
endpointClass === "modelstudio-native" ;
const isZai =
endpointClass === "zai-native" ||
(isDefaultRoute && isDefaultRouteProvider(input.provider, "zai" ));
const isDeepSeek =
endpointClass === "deepseek-native" ||
(isDefaultRoute && isDefaultRouteProvider(input.provider, "deepseek" ));
const isNonStandard =
endpointClass === "cerebras-native" ||
endpointClass === "chutes-native" ||
endpointClass === "deepseek-native" ||
endpointClass === "mistral-public" ||
endpointClass === "opencode-native" ||
endpointClass === "xai-native" ||
isZai ||
(isDefaultRoute &&
isDefaultRouteProvider(input.provider, "cerebras" , "chutes" , "deepseek" , "opencode" , "xai" ));
const isOpenRouterLike = input.provider === "openrouter" || endpointClass === "openrouter" ;
const usesMaxTokens =
endpointClass === "chutes-native" ||
endpointClass === "mistral-public" ||
knownProviderFamily === "mistral" ||
(isDefaultRoute && isDefaultRouteProvider(provider, "chutes" ));
const supportsKnownLocalStreamingUsage = isKnownLocalStreamingUsageProvider(
provider,
knownProviderFamily,
);
return {
supportsStore:
!isNonStandard && knownProviderFamily !== "mistral" && !usesExplicitProxyLikeEndpoint,
supportsDeveloperRole: !isNonStandard && !isMoonshotLike && !usesConfiguredNonOpenAIEndpoint,
supportsReasoningEffort:
!isZai &&
knownProviderFamily !== "mistral" &&
endpointClass !== "xai-native" &&
!usesExplicitProxyLikeEndpoint,
supportsUsageInStreaming:
supportsKnownLocalStreamingUsage ||
(!isNonStandard && (!usesConfiguredNonOpenAIEndpoint || supportsNativeStreamingUsageCompat)),
maxTokensField: usesMaxTokens ? "max_tokens" : "max_completion_tokens" ,
thinkingFormat: isDeepSeek
? "deepseek"
: isZai
? "zai"
: isOpenRouterLike
? "openrouter"
: "openai" ,
visibleReasoningDetailTypes: isOpenRouterLike ? ["response.output_text" , "response.text" ] : [],
supportsStrictMode: !isZai && !usesConfiguredNonOpenAIEndpoint,
};
}
export function resolveOpenAICompletionsCompatDefaultsFromCapabilities(
input: Pick<
ProviderRequestCapabilities,
| "endpointClass"
| "knownProviderFamily"
| "supportsNativeStreamingUsageCompat"
| "usesExplicitProxyLikeEndpoint"
> & {
provider?: string;
},
): OpenAICompletionsCompatDefaults {
return resolveOpenAICompletionsCompatDefaults(input);
}
export function detectOpenAICompletionsCompat(
model: Pick<Model<"openai-completions" >, "provider" | "baseUrl" | "id" > & {
compat?: { supportsStore?: boolean } | null ;
},
): DetectedOpenAICompletionsCompat {
const capabilities = resolveProviderRequestCapabilities({
provider: model.provider,
api: "openai-completions" ,
baseUrl: model.baseUrl,
capability: "llm" ,
transport: "stream" ,
modelId: model.id,
compat:
model.compat && typeof model.compat === "object"
? (model.compat as { supportsStore?: boolean })
: undefined,
});
return {
capabilities,
defaults: resolveOpenAICompletionsCompatDefaultsFromCapabilities({
provider: model.provider,
...capabilities,
}),
};
}
Messung V0.5 in Prozent C=99 H=92 G=95
¤ Dauer der Verarbeitung: 0.14 Sekunden
(vorverarbeitet am 2026-05-26)
¤
*© Formatika GbR, Deutschland