Files
openclaw/extensions/xai/provider-models.ts
EricKwan e00ef16ee7 fix(xai): follow OAuth default model automatically (#115617)
* fix(xai): default OAuth login to Grok 4.5

* fix(xai): follow OAuth default model automatically

* fix(xai): send OAuth proxy request headers

* fix(xai): avoid provider API shadowing

* fix(qa): restore current main validation gates

---------

Co-authored-by: echeung <echeung@agentsonly.com>
Co-authored-by: fuller-stack-dev <263060202+fuller-stack-dev@users.noreply.github.com>
2026-07-29 23:05:29 +00:00

62 lines
2.2 KiB
TypeScript

// Xai provider module implements model/runtime integration.
import type {
ProviderResolveDynamicModelContext,
ProviderRuntimeModel,
} from "openclaw/plugin-sdk/plugin-entry";
import { normalizeModelCompat } from "openclaw/plugin-sdk/provider-model-shared";
import {
normalizeOptionalLowercaseString,
normalizeOptionalString,
} from "openclaw/plugin-sdk/string-coerce-runtime";
import { resolveXaiCatalogEntry, XAI_BASE_URL } from "./model-definitions.js";
import { normalizeXaiModelId, XAI_OAUTH_AUTO_MODEL_ID } from "./model-id.js";
import { applyXaiRuntimeModelCompat } from "./runtime-model-compat.js";
const XAI_MODERN_MODEL_PREFIXES = ["grok-4.5", "grok-build-0.1", "grok-4.3", "grok-4.20"] as const;
export function isModernXaiModel(modelId: string): boolean {
const normalized = normalizeXaiModelId(modelId.trim());
const lower = normalizeOptionalLowercaseString(normalized) ?? "";
if (!lower || lower.includes("multi-agent")) {
return false;
}
return XAI_MODERN_MODEL_PREFIXES.some((prefix) => lower.startsWith(prefix));
}
export function resolveXaiForwardCompatModel(params: {
providerId: string;
ctx: ProviderResolveDynamicModelContext;
}) {
const definition = resolveXaiCatalogEntry(params.ctx.modelId);
if (!definition) {
return undefined;
}
return applyXaiRuntimeModelCompat(
normalizeModelCompat({
id: definition.id,
name: definition.name,
api: params.ctx.providerConfig?.api ?? "openai-responses",
provider: params.providerId,
baseUrl: normalizeOptionalString(params.ctx.providerConfig?.baseUrl) ?? XAI_BASE_URL,
reasoning: definition.reasoning,
input: definition.input,
cost: definition.cost,
contextWindow: definition.contextWindow,
maxTokens: definition.maxTokens,
} as ProviderRuntimeModel),
);
}
export function normalizeXaiResolvedModel(model: ProviderRuntimeModel): ProviderRuntimeModel {
const canonicalModelId =
typeof model.params?.canonicalModelId === "string"
? model.params.canonicalModelId.trim()
: undefined;
const resolved =
model.id === XAI_OAUTH_AUTO_MODEL_ID && canonicalModelId
? { ...model, id: canonicalModelId }
: model;
return applyXaiRuntimeModelCompat(resolved);
}