openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
183 lines (182 loc) • 8.22 kB
JavaScript
import { l as defaultToolStreamExtraParams } from "../../provider-stream-shared-BIV_zuwB.js";
import { l as jsonResult } from "../../common-C4yy9V-D.js";
import { r as OPENAI_COMPATIBLE_REPLAY_HOOKS } from "../../provider-model-shared-D-lyTLvb.js";
import { t as defineSingleProviderPluginEntry } from "../../provider-entry-Dh06UXOP.js";
import "../../provider-web-search-9G87vZMY.js";
import { t as normalizeXaiModelId } from "../../model-id-BRM_wbb3.js";
import { n as buildLiveXaiProvider, r as buildXaiProvider, t as buildLiveXaiOAuthProvider } from "../../provider-catalog-BSjMsZcY.js";
import { n as applyXaiConfig, t as XAI_DEFAULT_MODEL_REF } from "../../onboard-QXb4qn-9.js";
import { t as buildXaiImageGenerationProvider } from "../../image-generation-provider-gH2I7UV9.js";
import { t as applyXaiRuntimeModelCompat } from "../../runtime-model-compat-DYerPIAs.js";
import { n as resolveXaiForwardCompatModel, t as isModernXaiModel } from "../../provider-models-B08yK9Eu.js";
import { r as resolveXaiTransport } from "../../api-Db3oc6y7.js";
import { n as createCodeExecutionToolDefinition, t as buildMissingCodeExecutionApiKeyPayload } from "../../code-execution-tool-shared-CeAkKo1Y.js";
import { t as resolveThinkingProfile } from "../../provider-policy-api-cbQ_K9GS.js";
import { t as buildXaiRealtimeTranscriptionProvider } from "../../realtime-transcription-provider-DT9sdxBb.js";
import { t as buildXaiSpeechProvider } from "../../speech-provider-C7TsQ7W2.js";
import { n as resolveFallbackXaiAuth, t as isXaiToolEnabled } from "../../tool-auth-shared-DHHTCxMr.js";
import { n as readPluginCodeExecutionConfig, r as resolveCodeExecutionEnabled } from "../../code-execution-config-DPt6AIt3.js";
import { t as resolveEffectiveXSearchConfig } from "../../x-search-config-YdgwPypr.js";
import { r as wrapXaiProviderStream } from "../../stream-CA--gs3u.js";
import { n as buildXaiMediaUnderstandingProvider } from "../../stt-lj4IgDbm.js";
import { t as buildXaiVideoGenerationProvider } from "../../video-generation-provider-B5Umfqke.js";
import { t as createXaiWebSearchProvider } from "../../web-search-DsIR51VL.js";
import { n as createXSearchToolDefinition, t as buildMissingXSearchApiKeyPayload } from "../../x-search-tool-shared-CF3dGCVO.js";
import { S as refreshXaiOAuthCredential, _ as createXaiOAuthAuthMethod, g as createXaiDeviceCodeAuthMethod } from "../../xai-oauth-BLNJaYLL.js";
//#region extensions/xai/index.ts
const PROVIDER_ID = "xai";
const XAI_CREDIT_OR_SPENDING_LIMIT_RE = /\b(?:used all available credits|monthly spending limit|purchase more credits|raise your spending limit)\b/i;
const XAI_RATE_LIMIT_RE = /\b(?:rate limit exceeded|too many requests)\b/i;
let codeExecutionModulePromise;
let xSearchModulePromise;
function loadCodeExecutionModule() {
codeExecutionModulePromise ??= import("./code-execution.js");
return codeExecutionModulePromise;
}
function loadXSearchModule() {
xSearchModulePromise ??= import("./x-search.js");
return xSearchModulePromise;
}
function classifyXaiFailoverReason(errorMessage) {
if (XAI_CREDIT_OR_SPENDING_LIMIT_RE.test(errorMessage)) return "billing";
if (XAI_RATE_LIMIT_RE.test(errorMessage)) return "rate_limit";
}
function hasResolvableXaiApiKey(config, auth) {
return isXaiToolEnabled({
sourceConfig: config,
auth
});
}
function isCodeExecutionEnabled(config, auth) {
return resolveCodeExecutionEnabled({
sourceConfig: config,
runtimeConfig: config,
config: readPluginCodeExecutionConfig(config),
auth
});
}
function isXSearchEnabled(config, auth) {
if ((config && typeof config === "object" ? resolveEffectiveXSearchConfig(config) : void 0)?.enabled === false) return false;
return hasResolvableXaiApiKey(config, auth);
}
function createLazyCodeExecutionTool(ctx) {
if (!isCodeExecutionEnabled(ctx.runtimeConfig ?? ctx.config, ctx)) return null;
return createCodeExecutionToolDefinition(async (toolCallId, args) => {
const { createCodeExecutionTool } = await loadCodeExecutionModule();
const tool = createCodeExecutionTool({
config: ctx.config,
runtimeConfig: ctx.runtimeConfig ?? null,
auth: ctx
});
if (!tool) return jsonResult(buildMissingCodeExecutionApiKeyPayload());
return await tool.execute(toolCallId, args);
});
}
function createLazyXSearchTool(ctx) {
if (!isXSearchEnabled(ctx.runtimeConfig ?? ctx.config, ctx)) return null;
return createXSearchToolDefinition(async (toolCallId, args) => {
const { createXSearchTool } = await loadXSearchModule();
const tool = createXSearchTool({
config: ctx.config,
runtimeConfig: ctx.runtimeConfig ?? null,
auth: ctx
});
if (!tool) return jsonResult(buildMissingXSearchApiKeyPayload());
return await tool.execute(toolCallId, args);
});
}
var xai_default = defineSingleProviderPluginEntry({
id: "xai",
name: "xAI Plugin",
description: "Bundled xAI plugin",
provider: {
label: "xAI",
aliases: ["x-ai"],
docsPath: "/providers/xai",
auth: [{
methodId: "api-key",
label: "xAI API key",
hint: "API key",
optionKey: "xaiApiKey",
flagName: "--xai-api-key",
envVar: "XAI_API_KEY",
promptMessage: "Enter xAI API key",
defaultModel: XAI_DEFAULT_MODEL_REF,
applyConfig: (cfg) => applyXaiConfig(cfg),
wizard: { groupLabel: "xAI (Grok)" }
}],
extraAuth: [createXaiOAuthAuthMethod(), createXaiDeviceCodeAuthMethod()],
catalog: {
order: "simple",
run: async (ctx) => {
const auth = ctx.resolveProviderAuth(PROVIDER_ID);
try {
const { resolveApiKeyForProvider } = await import("../../plugin-sdk/provider-auth-runtime.js");
const runtimeAuth = await resolveApiKeyForProvider({
provider: PROVIDER_ID,
cfg: ctx.config,
...ctx.agentDir ? { agentDir: ctx.agentDir } : {},
...ctx.workspaceDir ? { workspaceDir: ctx.workspaceDir } : {},
...auth.profileId ? {
profileId: auth.profileId,
lockedProfile: true
} : {}
});
if (runtimeAuth?.mode === "oauth" && runtimeAuth.apiKey) return { provider: await buildLiveXaiOAuthProvider({ discoveryApiKey: runtimeAuth.apiKey }) };
} catch {
if (auth.mode === "oauth") {}
}
if (auth.apiKey) return { provider: await buildLiveXaiProvider({
apiKey: auth.apiKey,
discoveryApiKey: auth.discoveryApiKey
}) };
const apiKey = ctx.resolveProviderApiKey(PROVIDER_ID);
if (!apiKey.apiKey) return null;
return { provider: await buildLiveXaiProvider({
apiKey: apiKey.apiKey,
discoveryApiKey: apiKey.discoveryApiKey
}) };
},
staticRun: async () => ({ provider: buildXaiProvider() })
},
...OPENAI_COMPATIBLE_REPLAY_HOOKS,
prepareExtraParams: (ctx) => defaultToolStreamExtraParams(ctx.extraParams),
wrapStreamFn: wrapXaiProviderStream,
resolveSyntheticAuth: ({ config }) => {
const fallbackAuth = resolveFallbackXaiAuth(config);
if (!fallbackAuth) return;
return {
apiKey: fallbackAuth.apiKey,
source: fallbackAuth.source,
mode: "api-key"
};
},
normalizeResolvedModel: ({ model }) => applyXaiRuntimeModelCompat(model),
normalizeTransport: ({ provider, api, baseUrl }) => resolveXaiTransport({
provider,
api,
baseUrl
}),
normalizeModelId: ({ modelId }) => normalizeXaiModelId(modelId),
resolveDynamicModel: (ctx) => resolveXaiForwardCompatModel({
providerId: PROVIDER_ID,
ctx
}),
refreshOAuth: refreshXaiOAuthCredential,
resolveThinkingProfile,
isModernModelRef: ({ modelId }) => isModernXaiModel(modelId),
classifyFailoverReason: ({ errorMessage }) => classifyXaiFailoverReason(errorMessage)
},
register(api) {
api.registerWebSearchProvider(createXaiWebSearchProvider());
api.registerMediaUnderstandingProvider(buildXaiMediaUnderstandingProvider());
api.registerVideoGenerationProvider(buildXaiVideoGenerationProvider());
api.registerImageGenerationProvider(buildXaiImageGenerationProvider());
api.registerSpeechProvider(buildXaiSpeechProvider());
api.registerRealtimeTranscriptionProvider(buildXaiRealtimeTranscriptionProvider());
api.registerTool((ctx) => createLazyCodeExecutionTool(ctx), { name: "code_execution" });
api.registerTool((ctx) => createLazyXSearchTool(ctx), { name: "x_search" });
}
});
//#endregion
export { xai_default as default };