1 line
17 KiB
JSON
1 line
17 KiB
JSON
{"repo": "chethan616/dex", "files": {"dex/core/extensions/minimax/src/minimax-web-search-provider.ts": {"2c5614d01d8dbe49c7b2ba864d27c1fb70f08375": {"t": 1785674019.3493032, "n": 2383, "h": "2a6e91c7f295232c", "c": "import {\n createWebSearchProviderContractFields,\n type WebSearchProviderPlugin,\n} from \"openclaw/plugin-sdk/provider-web-search-config-contract\";\n\nconst MINIMAX_CREDENTIAL_PATH = \"plugins.entries.minimax.config.webSearch.apiKey\";\nconst MINIMAX_TOKEN_PLAN_ENV_VARS = [\n \"MINIMAX_CODE_PLAN_KEY\",\n \"MINIMAX_CODING_API_KEY\",\n \"MINIMAX_OAUTH_TOKEN\",\n] as const;\nconst MINIMAX_WEB_SEARCH_ENV_VARS = [...MINIMAX_TOKEN_PLAN_ENV_VARS, \"MINIMAX_API_KEY\"] as const;\n\ntype MiniMaxWebSearchRuntime = typeof import(\"./minimax-web-search-provider.runtime.js\");\n\nlet miniMaxWebSearchRuntimePromise: Promise<MiniMaxWebSearchRuntime> | undefined;\n\nfunction loadMiniMaxWebSearchRuntime(): Promise<MiniMaxWebSearchRuntime> {\n miniMaxWebSearchRuntimePromise ??= import(\"./minimax-web-search-provider.runtime.js\");\n return miniMaxWebSearchRuntimePromise;\n}\n\nconst MiniMaxSearchSchema = {\n type: \"object\",\n properties: {\n query: { type: \"string\", description: \"Search query string.\" },\n count: {\n type: \"integer\",\n description: \"Number of results to return (1-10).\",\n minimum: 1,\n maximum: 10,\n },\n },\n} satisfies Record<string, unknown>;\n\nexport function createMiniMaxWebSearchProvider(): WebSearchProviderPlugin {\n return {\n id: \"minimax\",\n label: \"MiniMax Search\",\n hint: \"Structured results via MiniMax Token Plan search API\",\n onboardingScopes: [\"text-inference\"],\n credentialLabel: \"MiniMax Token Plan key or OAuth token\",\n envVars: [...MINIMAX_WEB_SEARCH_ENV_VARS],\n placeholder: \"sk-cp-...\",\n signupUrl: \"https://platform.minimax.io/user-center/basic-information/interface-key\",\n docsUrl: \"https://docs.openclaw.ai/tools/minimax-search\",\n autoDetectOrder: 15,\n credentialPath: MINIMAX_CREDENTIAL_PATH,\n ...createWebSearchProviderContractFields({\n credentialPath: MINIMAX_CREDENTIAL_PATH,\n searchCredential: { type: \"top-level\" },\n configuredCredential: { pluginId: \"minimax\" },\n }),\n createTool: (ctx) => ({\n description:\n \"Search the web using MiniMax Search API. Returns titles, URLs, snippets, and related search suggestions.\",\n parameters: MiniMaxSearchSchema,\n execute: async (args) => {\n const { executeMiniMaxWebSearchProviderTool } = await loadMiniMaxWebSearchRuntime();\n return await executeMiniMaxWebSearchProviderTool(ctx, args);\n },\n }),\n };\n}\n"}}, "dex/core/extensions/minimax/web-search-contract-api.ts": {"2c5614d01d8dbe49c7b2ba864d27c1fb70f08375": {"t": 1785674021.210559, "n": 1246, "h": "a5572f5fdacb7a87", "c": "import {\n createWebSearchProviderContractFields,\n type WebSearchProviderPlugin,\n} from \"openclaw/plugin-sdk/provider-web-search-config-contract\";\n\nconst MINIMAX_TOKEN_PLAN_ENV_VARS = [\n \"MINIMAX_CODE_PLAN_KEY\",\n \"MINIMAX_CODING_API_KEY\",\n \"MINIMAX_OAUTH_TOKEN\",\n] as const;\nconst MINIMAX_WEB_SEARCH_ENV_VARS = [...MINIMAX_TOKEN_PLAN_ENV_VARS, \"MINIMAX_API_KEY\"] as const;\n\nexport function createMiniMaxWebSearchProvider(): WebSearchProviderPlugin {\n const credentialPath = \"plugins.entries.minimax.config.webSearch.apiKey\";\n\n return {\n id: \"minimax\",\n label: \"MiniMax Search\",\n hint: \"Structured results via MiniMax Token Plan search API\",\n onboardingScopes: [\"text-inference\"],\n credentialLabel: \"MiniMax Token Plan key or OAuth token\",\n envVars: [...MINIMAX_WEB_SEARCH_ENV_VARS],\n placeholder: \"sk-cp-...\",\n signupUrl: \"https://platform.minimax.io/user-center/basic-information/interface-key\",\n docsUrl: \"https://docs.openclaw.ai/tools/minimax-search\",\n autoDetectOrder: 15,\n credentialPath,\n ...createWebSearchProviderContractFields({\n credentialPath,\n searchCredential: { type: \"top-level\" },\n configuredCredential: { pluginId: \"minimax\" },\n }),\n createTool: () => null,\n };\n}\n"}}, "dex/core/extensions/minimax/provider-registration.ts": {"2c5614d01d8dbe49c7b2ba864d27c1fb70f08375": {"t": 1785674021.5552614, "n": 12432, "h": "88c779b90e7f6066", "c": "import { formatErrorMessage } from \"openclaw/plugin-sdk/error-runtime\";\nimport type {\n DexPluginApi,\n DexConfig,\n ProviderAuthContext,\n ProviderAuthResult,\n ProviderCatalogContext,\n ProviderResolveDynamicModelContext,\n ProviderRuntimeModel,\n} from \"openclaw/plugin-sdk/plugin-entry\";\nimport {\n MINIMAX_OAUTH_MARKER,\n ensureAuthProfileStore,\n listProfilesForProvider,\n} from \"openclaw/plugin-sdk/provider-auth\";\nimport { buildOauthProviderAuthResult } from \"openclaw/plugin-sdk/provider-auth\";\nimport { createProviderApiKeyAuthMethod } from \"openclaw/plugin-sdk/provider-auth-api-key\";\nimport type { ProviderPlugin } from \"openclaw/plugin-sdk/provider-model-shared\";\nimport {\n buildProviderReplayFamilyHooks,\n normalizeModelCompat,\n} from \"openclaw/plugin-sdk/provider-model-shared\";\nimport { MINIMAX_FAST_MODE_STREAM_HOOKS } from \"openclaw/plugin-sdk/provider-stream-family\";\nimport { fetchMinimaxUsage } from \"openclaw/plugin-sdk/provider-usage\";\nimport { normalizeOptionalString } from \"openclaw/plugin-sdk/string-coerce-runtime\";\nimport {\n isMiniMaxModernModelId,\n MINIMAX_DEFAULT_MODEL_ID,\n MINIMAX_TEXT_MODEL_CATALOG,\n MINIMAX_TEXT_MODEL_ORDER,\n} from \"./api.js\";\nimport { DEFAULT_MINIMAX_MAX_TOKENS, resolveMinimaxApiCost } from \"./model-definitions.js\";\nimport type { MiniMaxRegion } from \"./oauth.js\";\nimport { applyMinimaxApiConfig, applyMinimaxApiConfigCn } from \"./onboard.js\";\nimport {\n buildMinimaxPortalProvider,\n buildMinimaxProvider,\n resolveMinimaxCatalogBaseUrl,\n} from \"./provider-catalog.js\";\n\nconst API_PROVIDER_ID = \"minimax\";\nconst PORTAL_PROVIDER_ID = \"minimax-portal\";\nconst PROVIDER_LABEL = \"MiniMax\";\nconst DEFAULT_MODEL = MINIMAX_DEFAULT_MODEL_ID;\nconst DEFAULT_BASE_URL_CN = \"https://api.minimaxi.com/anthropic\";\nconst DEFAULT_BASE_URL_GLOBAL = \"https://api.minimax.io/anthropic\";\nconst MINIMAX_USAGE_ENV_VAR_KEYS = [\n \"MINIMAX_OAUTH_TOKEN\",\n \"MINIMAX_CODE_PLAN_KEY\",\n \"MINIMAX_CODING_API_KEY\",\n \"MINIMAX_API_KEY\",\n] as const;\nconst MINIMAX_WIZARD_GROUP = {\n groupId: \"minimax\",\n groupLabel: \"MiniMax\",\n groupHint: \"M3 (recommended)\",\n} as const;\nconst HYBRID_ANTHROPIC_OPENAI_REPLAY_HOOKS = buildProviderReplayFamilyHooks({\n family: \"hybrid-anthropic-openai\",\n anthropicModelDropThinkingBlocks: true,\n});\nconst MINIMAX_PROVIDER_HOOKS = {\n ...HYBRID_ANTHROPIC_OPENAI_REPLAY_HOOKS,\n ...MINIMAX_FAST_MODE_STREAM_HOOKS,\n resolveReasoningOutputMode: () => \"native\" as const,\n};\n\nfunction getDefaultBaseUrl(region: MiniMaxRegion): string {\n return region === \"cn\" ? DEFAULT_BASE_URL_CN : DEFAULT_BASE_URL_GLOBAL;\n}\n\nfunction resolveMinimaxRegionLabel(region: MiniMaxRegion): string {\n return region === \"cn\" ? \"CN\" : \"Global\";\n}\n\nfunction resolveMinimaxEndpointHint(region: MiniMaxRegion): string {\n return region === \"cn\" ? \"CN endpoint - api.minimaxi.com\" : \"Global endpoint - api.minimax.io\";\n}\n\nfunction apiModelRef(modelId: string): string {\n return `${API_PROVIDER_ID}/${modelId}`;\n}\n\nfunction portalModelRef(modelId: string): string {\n return `${PORTAL_PROVIDER_ID}/${modelId}`;\n}\n\nfunction getProviderBaseUrl(cfg: DexConfig, providerId: string): string | undefined {\n return normalizeOptionalString(cfg.models?.providers?.[providerId]?.baseUrl);\n}\n\nfunction resolveMinimaxUsageBaseUrl(cfg: DexConfig): string | undefined {\n return getProviderBaseUrl(cfg, PORTAL_PROVIDER_ID) ?? getProviderBaseUrl(cfg, API_PROVIDER_ID);\n}\n\nfunction buildPortalProviderCatalog(params: { baseUrl: string; apiKey: string }) {\n return {\n ...buildMinimaxPortalProvider(),\n baseUrl: params.baseUrl,\n apiKey: params.apiKey,\n };\n}\n\nfunction findMinimaxCatalogModel(modelId: string) {\n const normalizedModelId = modelId.trim().toLowerCase();\n const catalogId = MINIMAX_TEXT_MODEL_ORDER.find((id) => id.toLowerCase() === normalizedModelId);\n return catalogId ? { id: catalogId, model: MINIMAX_TEXT_MODEL_CATALOG[catalogId] } : undefined;\n}\n\nfunction resolveMinimaxDynamicModel(params: {\n providerId: string;\n ctx: ProviderResolveDynamicModelContext;\n}): ProviderRuntimeModel | undefined {\n const catalogModel = findMinimaxCatalogModel(params.ctx.modelId);\n if (!catalogModel) {\n return undefined;\n }\n return normalizeModelCompat({\n id: catalogModel.id,\n name: catalogModel.model.name,\n provider: params.providerId,\n api: \"anthropic-messages\",\n baseUrl:\n normalizeOptionalString(params.ctx.providerConfig?.baseUrl) ?? resolveMinimaxCatalogBaseUrl(),\n reasoning: catalogModel.model.reasoning,\n input: [...catalogModel.model.input],\n cost: resolveMinimaxApiCost(catalogModel.id),\n contextWindow: catalogModel.model.contextWindow,\n maxTokens: DEFAULT_MINIMAX_MAX_TOKENS,\n });\n}\n\nfunction resolveApiCatalog(ctx: ProviderCatalogContext) {\n const apiKey = ctx.resolveProviderApiKey(API_PROVIDER_ID).apiKey;\n if (!apiKey) {\n return null;\n }\n return {\n provider: {\n ...buildMinimaxProvider(ctx.env),\n apiKey,\n },\n };\n}\n\nfunction resolvePortalCatalog(ctx: ProviderCatalogContext) {\n const explicitProvider = ctx.config.models?.providers?.[PORTAL_PROVIDER_ID];\n const envApiKey = ctx.resolveProviderApiKey(PORTAL_PROVIDER_ID).apiKey;\n const authStore = ensureAuthProfileStore(ctx.agentDir, {\n allowKeychainPrompt: false,\n });\n const hasProfiles = listProfilesForProvider(authStore, PORTAL_PROVIDER_ID).length > 0;\n const explicitApiKey = normalizeOptionalString(explicitProvider?.apiKey);\n const apiKey = envApiKey ?? explicitApiKey ?? (hasProfiles ? MINIMAX_OAUTH_MARKER : undefined);\n if (!apiKey) {\n return null;\n }\n\n const explicitBaseUrl = normalizeOptionalString(explicitProvider?.baseUrl);\n\n return {\n provider: buildPortalProviderCatalog({\n baseUrl: explicitBaseUrl || buildMinimaxPortalProvider(ctx.env).baseUrl,\n apiKey,\n }),\n };\n}\n\nfunction createOAuthHandler(region: MiniMaxRegion) {\n const defaultBaseUrl = getDefaultBaseUrl(region);\n const regionLabel = resolveMinimaxRegionLabel(region);\n\n return async (ctx: ProviderAuthContext): Promise<ProviderAuthResult> => {\n const progress = ctx.prompter.progress(`Starting MiniMax OAuth (${regionLabel})…`);\n try {\n const { loginMiniMaxPortalOAuth } = await import(\"./oauth.runtime.js\");\n const result = await loginMiniMaxPortalOAuth({\n openUrl: ctx.openUrl,\n note: ctx.prompter.note,\n progress,\n region,\n });\n\n progress.stop(\"MiniMax OAuth complete\");\n\n if (result.notification_message) {\n await ctx.prompter.note(result.notification_message, \"MiniMax OAuth\");\n }\n\n const baseUrl = result.resourceUrl || defaultBaseUrl;\n\n return buildOauthProviderAuthResult({\n providerId: PORTAL_PROVIDER_ID,\n defaultModel: portalModelRef(DEFAULT_MODEL),\n access: result.access,\n refresh: result.refresh,\n expires: result.expires,\n configPatch: {\n models: {\n providers: {\n [PORTAL_PROVIDER_ID]: {\n baseUrl,\n api: \"anthropic-messages\",\n authHeader: true,\n models: [],\n },\n },\n },\n agents: {\n defaults: {\n models: {\n [portalModelRef(\"MiniMax-M3\")]: { alias: \"minimax-m3\" },\n [portalModelRef(\"MiniMax-M2.7\")]: { alias: \"minimax-m2.7\" },\n [portalModelRef(\"MiniMax-M2.7-highspeed\")]: {\n alias: \"minimax-m2.7-highspeed\",\n },\n },\n },\n },\n },\n notes: [\n \"MiniMax OAuth tokens auto-refresh. Re-run login if refresh fails or access is revoked.\",\n `Base URL defaults to ${defaultBaseUrl}. Override models.providers.${PORTAL_PROVIDER_ID}.baseUrl if needed.`,\n ...(result.notification_message ? [result.notification_message] : []),\n ],\n });\n } catch (err) {\n const errorMsg = formatErrorMessage(err);\n progress.stop(`MiniMax OAuth failed: ${errorMsg}`);\n await ctx.prompter.note(\n \"If OAuth fails, verify your MiniMax account has portal access and try again.\",\n \"MiniMax OAuth\",\n );\n throw err;\n }\n };\n}\n\nfunction createMinimaxApiKeyMethod(region: MiniMaxRegion) {\n const regionLabel = resolveMinimaxRegionLabel(region);\n const endpointHint = resolveMinimaxEndpointHint(region);\n const isCn = region === \"cn\";\n return createProviderApiKeyAuthMethod({\n providerId: API_PROVIDER_ID,\n methodId: isCn ? \"api-cn\" : \"api-global\",\n label: `MiniMax API key (${regionLabel})`,\n hint: endpointHint,\n optionKey: \"minimaxApiKey\",\n flagName: \"--minimax-api-key\",\n envVar: \"MINIMAX_API_KEY\",\n promptMessage: isCn\n ? \"Enter MiniMax CN API key (sk-api- or sk-cp-)\\nhttps://platform.minimaxi.com/user-center/basic-information/interface-key\"\n : \"Enter MiniMax API key (sk-api- or sk-cp-)\\nhttps://platform.minimax.io/user-center/basic-information/interface-key\",\n profileId: isCn ? \"minimax:cn\" : \"minimax:global\",\n allowProfile: false,\n defaultModel: apiModelRef(DEFAULT_MODEL),\n expectedProviders: isCn ? [\"minimax\", \"minimax-cn\"] : [\"minimax\"],\n applyConfig: (cfg) => (isCn ? applyMinimaxApiConfigCn(cfg) : applyMinimaxApiConfig(cfg)),\n wizard: {\n choiceId: isCn ? \"minimax-cn-api\" : \"minimax-global-api\",\n choiceLabel: `MiniMax API key (${regionLabel})`,\n choiceHint: endpointHint,\n ...MINIMAX_WIZARD_GROUP,\n },\n });\n}\n\nfunction createMinimaxOAuthMethod(region: MiniMaxRegion) {\n const regionLabel = resolveMinimaxRegionLabel(region);\n const endpointHint = resolveMinimaxEndpointHint(region);\n const isCn = region === \"cn\";\n return {\n id: isCn ? \"oauth-cn\" : \"oauth\",\n label: `MiniMax OAuth (${regionLabel})`,\n hint: endpointHint,\n kind: \"device_code\" as const,\n wizard: {\n choiceId: isCn ? \"minimax-cn-oauth\" : \"minimax-global-oauth\",\n choiceLabel: `MiniMax OAuth (${regionLabel})`,\n choiceHint: endpointHint,\n ...MINIMAX_WIZARD_GROUP,\n },\n run: createOAuthHandler(region),\n };\n}\n\nexport function buildMinimaxApiProviderPlugin(): ProviderPlugin {\n return {\n id: API_PROVIDER_ID,\n label: PROVIDER_LABEL,\n hookAliases: [\"minimax-cn\"],\n docsPath: \"/providers/minimax\",\n envVars: [\"MINIMAX_API_KEY\"],\n auth: [createMinimaxApiKeyMethod(\"global\"), createMinimaxApiKeyMethod(\"cn\")],\n catalog: {\n order: \"simple\",\n run: async (ctx) => resolveApiCatalog(ctx),\n },\n staticCatalog: {\n order: \"simple\",\n run: async (ctx) => ({ providers: { [API_PROVIDER_ID]: buildMinimaxProvider(ctx.env) } }),\n },\n resolveUsageAuth: async (ctx) => {\n const portalOauth = await ctx.resolveOAuthToken({ provider: PORTAL_PROVIDER_ID });\n if (portalOauth) {\n return portalOauth;\n }\n const apiKey = ctx.resolveApiKeyFromConfigAndStore({\n providerIds: [API_PROVIDER_ID, PORTAL_PROVIDER_ID],\n envDirect: MINIMAX_USAGE_ENV_VAR_KEYS.map((name) => ctx.env[name]),\n });\n return apiKey ? { token: apiKey } : null;\n },\n ...MINIMAX_PROVIDER_HOOKS,\n resolveDynamicModel: (ctx) => resolveMinimaxDynamicModel({ providerId: API_PROVIDER_ID, ctx }),\n isModernModelRef: ({ modelId }) => isMiniMaxModernModelId(modelId),\n fetchUsageSnapshot: async (ctx) =>\n await fetchMinimaxUsage(ctx.token, ctx.timeoutMs, ctx.fetchFn, {\n baseUrl: resolveMinimaxUsageBaseUrl(ctx.config),\n }),\n };\n}\n\nexport function buildMinimaxPortalProviderPlugin(): ProviderPlugin {\n return {\n id: PORTAL_PROVIDER_ID,\n label: PROVIDER_LABEL,\n hookAliases: [\"minimax-portal-cn\"],\n docsPath: \"/providers/minimax\",\n envVars: [\"MINIMAX_OAUTH_TOKEN\", \"MINIMAX_API_KEY\"],\n catalog: {\n run: async (ctx) => resolvePortalCatalog(ctx),\n },\n staticCatalog: {\n run: async (ctx) => ({\n providers: { [PORTAL_PROVIDER_ID]: buildMinimaxPortalProvider(ctx.env) },\n }),\n },\n auth: [createMinimaxOAuthMethod(\"global\"), createMinimaxOAuthMethod(\"cn\")],\n ...MINIMAX_PROVIDER_HOOKS,\n resolveDynamicModel: (ctx) =>\n resolveMinimaxDynamicModel({ providerId: PORTAL_PROVIDER_ID, ctx }),\n isModernModelRef: ({ modelId }) => isMiniMaxModernModelId(modelId),\n };\n}\n\nexport function registerMinimaxProviders(api: DexPluginApi) {\n api.registerProvider(buildMinimaxApiProviderPlugin());\n api.registerProvider(buildMinimaxPortalProviderPlugin());\n}\n"}}}} |