mirror of
https://github.com/openclaw/openclaw.git
synced 2026-08-16 07:33:46 -06:00
e00ef16ee7
* 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>
62 lines
2.2 KiB
TypeScript
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);
|
|
}
|