@openclaw/moonshot-provider 2026.11.3 → 2026.11.5-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,21 +1,12 @@
1
1
  import { createLazyRuntimeMethod, createLazyRuntimeModule } from "openclaw/plugin-sdk/lazy-runtime";
2
- import { createWebSearchProviderContractFields } from "openclaw/plugin-sdk/provider-web-search-config-contract";
2
+ import { WEB_SEARCH_QUERY_COUNT_PROPERTIES, createWebSearchProviderContractFields } from "openclaw/plugin-sdk/provider-web-search-config-contract";
3
3
  //#region extensions/moonshot/src/kimi-web-search-provider.ts
4
4
  const KIMI_CREDENTIAL_PATH = "plugins.entries.moonshot.config.webSearch.apiKey";
5
- const loadKimiWebSearchProviderRuntime = createLazyRuntimeModule(() => import("./kimi-web-search-provider.runtime-Je75Zave.mjs"));
5
+ const loadKimiWebSearchProviderRuntime = createLazyRuntimeModule(() => import("./kimi-web-search-provider.runtime-DsvZqNMD.mjs"));
6
6
  const KimiSearchSchema = {
7
7
  type: "object",
8
8
  properties: {
9
- query: {
10
- type: "string",
11
- description: "Search query string."
12
- },
13
- count: {
14
- type: "integer",
15
- description: "Number of results to return (1-10).",
16
- minimum: 1,
17
- maximum: 10
18
- },
9
+ ...WEB_SEARCH_QUERY_COUNT_PROPERTIES,
19
10
  country: {
20
11
  type: "string",
21
12
  description: "Not supported by Kimi."
@@ -1,13 +1,11 @@
1
1
  import { MOONSHOT_BASE_URL, MOONSHOT_CN_BASE_URL, isNativeMoonshotBaseUrl } from "../provider-policy-api.js";
2
2
  import "../provider-catalog.js";
3
3
  import { asNonArrayRecord, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
4
+ import { sha256Hex } from "openclaw/plugin-sdk/node-crypto-runtime";
4
5
  import { createProviderHttpError, normalizeBaseUrl, readProviderJsonObjectResponse } from "openclaw/plugin-sdk/provider-http";
5
- import { DEFAULT_SEARCH_COUNT, MAX_SEARCH_COUNT, buildSearchCacheKey, buildUnsupportedSearchFilterResponse, mergeScopedSearchConfig, readCachedSearchPayload, readConfiguredSecretString, readPositiveIntegerParam, readProviderEnvValue, readStringParam, resolveProviderWebSearchPluginConfig, resolveSearchCacheTtlMs, resolveSearchCount, resolveSearchTimeoutSeconds, resolveSiteName, setProviderWebSearchPluginConfigValue, withTrustedWebSearchEndpoint, wrapWebContent, writeCachedSearchPayload } from "openclaw/plugin-sdk/provider-web-search";
6
+ import { DEFAULT_SEARCH_COUNT, buildSearchCacheKey, buildUnsupportedSearchFilterResponse, externalContentStamp, mergeScopedSearchConfig, readCachedSearchPayload, readWebSearchApiKey, readWebSearchQueryAndCount, resolveProviderWebSearchPluginConfig, resolveSearchCacheTtlMs, resolveSearchCount, resolveSearchTimeoutSeconds, resolveSiteName, setProviderWebSearchPluginConfigValue, withTrustedWebSearchEndpoint, wrapWebContent, writeCachedSearchPayload } from "openclaw/plugin-sdk/provider-web-search";
6
7
  //#region extensions/moonshot/src/kimi-web-search-provider.runtime.ts
7
8
  const DEFAULT_KIMI_BASE_URL = MOONSHOT_BASE_URL;
8
- function resolveKimiApiKey(kimi) {
9
- return readConfiguredSecretString(kimi?.apiKey, "plugins.entries.moonshot.config.webSearch.apiKey") ?? readProviderEnvValue(["KIMI_API_KEY", "MOONSHOT_API_KEY"]);
10
- }
11
9
  function resolveKimiBaseUrl(kimi, openClawConfig) {
12
10
  const explicitBaseUrl = normalizeOptionalString(kimi?.baseUrl);
13
11
  if (explicitBaseUrl) return normalizeBaseUrl(explicitBaseUrl) || DEFAULT_KIMI_BASE_URL;
@@ -18,93 +16,75 @@ function resolveKimiBaseUrl(kimi, openClawConfig) {
18
16
  }
19
17
  return DEFAULT_KIMI_BASE_URL;
20
18
  }
21
- async function runKimiSearch(params) {
22
- return withTrustedWebSearchEndpoint({
23
- url: `${params.baseUrl}/tools/search`,
24
- timeoutSeconds: params.timeoutSeconds,
25
- signal: params.signal,
19
+ async function executeKimiWebSearchProviderTool(ctx, args, opts) {
20
+ opts?.signal?.throwIfAborted();
21
+ const searchConfig = mergeScopedSearchConfig(ctx.searchConfig, "kimi", resolveProviderWebSearchPluginConfig(ctx.config, "moonshot"));
22
+ const unsupportedResponse = buildUnsupportedSearchFilterResponse(args, "kimi");
23
+ if (unsupportedResponse) return unsupportedResponse;
24
+ const kimiConfig = asNonArrayRecord(searchConfig?.kimi);
25
+ const apiKey = readWebSearchApiKey(kimiConfig.apiKey, "plugins.entries.moonshot.config.webSearch.apiKey", ["KIMI_API_KEY", "MOONSHOT_API_KEY"]);
26
+ if (!apiKey) return {
27
+ error: "missing_kimi_api_key",
28
+ message: "web_search (kimi) needs a Moonshot API key. Set KIMI_API_KEY or MOONSHOT_API_KEY in the Gateway environment, or configure plugins.entries.moonshot.config.webSearch.apiKey. If you do not want to configure a search API key, use web_fetch for a specific URL or the browser tool for interactive pages.",
29
+ docs: "https://docs.openclaw.ai/tools/web"
30
+ };
31
+ const { query, count: requestedCount } = readWebSearchQueryAndCount(args, searchConfig);
32
+ const count = resolveSearchCount(requestedCount, DEFAULT_SEARCH_COUNT);
33
+ const baseUrl = resolveKimiBaseUrl(kimiConfig, ctx.config);
34
+ const cacheKey = buildSearchCacheKey([
35
+ "kimi",
36
+ sha256Hex(apiKey),
37
+ query,
38
+ baseUrl,
39
+ count
40
+ ]);
41
+ const cacheTtlMs = resolveSearchCacheTtlMs(searchConfig);
42
+ const cached = readCachedSearchPayload(cacheKey, cacheTtlMs);
43
+ if (cached) return cached;
44
+ const start = Date.now();
45
+ const timeoutSeconds = resolveSearchTimeoutSeconds(searchConfig);
46
+ const signal = opts?.signal;
47
+ const results = await withTrustedWebSearchEndpoint({
48
+ url: `${baseUrl}/tools/search`,
49
+ timeoutSeconds,
50
+ signal,
26
51
  init: {
27
52
  method: "POST",
28
53
  headers: {
29
54
  "Content-Type": "application/json",
30
- Authorization: `Bearer ${params.apiKey}`
55
+ Authorization: `Bearer ${apiKey}`
31
56
  },
32
57
  body: JSON.stringify({
33
- text_query: params.query,
34
- limit: params.count
58
+ text_query: query,
59
+ limit: count
35
60
  })
36
61
  }
37
62
  }, async (res) => {
38
63
  if (!res.ok) throw await createProviderHttpError(res, "Kimi API error");
39
64
  const data = await readProviderJsonObjectResponse(res, "Kimi API error");
40
65
  if (!Array.isArray(data.search_results)) throw new Error("Kimi API error: malformed JSON response");
41
- return data.search_results.slice(0, params.count).map((entry) => {
66
+ return data.search_results.slice(0, count).map((entry) => {
42
67
  const result = asNonArrayRecord(entry);
43
68
  const title = normalizeOptionalString(result.title);
44
69
  const url = normalizeOptionalString(result.url) ?? "";
45
70
  const description = normalizeOptionalString(result.snippet);
71
+ const date = normalizeOptionalString(result.date);
46
72
  return {
47
73
  title: title ? wrapWebContent(title, "web_search") : "",
48
74
  url,
49
75
  description: description ? wrapWebContent(description, "web_search") : "",
50
- published: normalizeKimiResultDate(result.date),
76
+ published: date && /^\d{4}-\d{2}-\d{2}$/.test(date) ? date : void 0,
51
77
  siteName: resolveSiteName(url) || void 0
52
78
  };
53
79
  });
54
80
  });
55
- }
56
- function normalizeKimiResultDate(value) {
57
- const date = normalizeOptionalString(value);
58
- return date && /^\d{4}-\d{2}-\d{2}$/.test(date) ? date : void 0;
59
- }
60
- async function executeKimiWebSearchProviderTool(ctx, args, opts) {
61
- opts?.signal?.throwIfAborted();
62
- const searchConfig = mergeScopedSearchConfig(ctx.searchConfig, "kimi", resolveProviderWebSearchPluginConfig(ctx.config, "moonshot"));
63
- const unsupportedResponse = buildUnsupportedSearchFilterResponse(args, "kimi");
64
- if (unsupportedResponse) return unsupportedResponse;
65
- const kimiConfig = asNonArrayRecord(searchConfig?.kimi);
66
- const apiKey = resolveKimiApiKey(kimiConfig);
67
- if (!apiKey) return {
68
- error: "missing_kimi_api_key",
69
- message: "web_search (kimi) needs a Moonshot API key. Set KIMI_API_KEY or MOONSHOT_API_KEY in the Gateway environment, or configure plugins.entries.moonshot.config.webSearch.apiKey. If you do not want to configure a search API key, use web_fetch for a specific URL or the browser tool for interactive pages.",
70
- docs: "https://docs.openclaw.ai/tools/web"
71
- };
72
- const query = readStringParam(args, "query", { required: true });
73
- const count = resolveSearchCount(readPositiveIntegerParam(args, "count", {
74
- max: MAX_SEARCH_COUNT,
75
- message: `count must be an integer from 1 to ${MAX_SEARCH_COUNT}.`
76
- }) ?? searchConfig?.maxResults, DEFAULT_SEARCH_COUNT);
77
- const baseUrl = resolveKimiBaseUrl(kimiConfig, ctx.config);
78
- const cacheKey = buildSearchCacheKey([
79
- "kimi",
80
- query,
81
- baseUrl,
82
- count
83
- ]);
84
- const cacheTtlMs = resolveSearchCacheTtlMs(searchConfig);
85
- const cached = readCachedSearchPayload(cacheKey, cacheTtlMs);
86
- if (cached) return cached;
87
- const start = Date.now();
88
- const results = await runKimiSearch({
89
- query,
90
- count,
91
- apiKey,
92
- baseUrl,
93
- timeoutSeconds: resolveSearchTimeoutSeconds(searchConfig),
94
- signal: opts?.signal
95
- });
96
81
  opts?.signal?.throwIfAborted();
97
82
  const payload = {
98
83
  query,
99
84
  provider: "kimi",
100
85
  count: results.length,
101
86
  tookMs: Date.now() - start,
102
- externalContent: {
103
- untrusted: true,
104
- source: "web_search",
105
- provider: "kimi",
106
- wrapped: true
107
- },
87
+ externalContent: externalContentStamp("kimi"),
108
88
  results
109
89
  };
110
90
  writeCachedSearchPayload(cacheKey, payload, cacheTtlMs);
@@ -32,6 +32,7 @@ var openclaw_plugin_default = {
32
32
  "baseUrl": "https://api.moonshot.ai/v1",
33
33
  "api": "openai-completions",
34
34
  "defaultModel": "kimi-k3",
35
+ "family": "moonshot",
35
36
  "models": [
36
37
  {
37
38
  "id": "kimi-k3",
@@ -0,0 +1 @@
1
+ {"version":3,"entries":[{"output":"api.js","source":"extensions/moonshot/api.ts"},{"output":"index.js","source":"extensions/moonshot/index.ts"},{"output":"native-video.js","source":"extensions/moonshot/native-video.ts"},{"output":"provider-catalog.js","source":"extensions/moonshot/provider-catalog.ts"},{"output":"provider-contract-api.js","source":"extensions/moonshot/provider-contract-api.ts"},{"output":"provider-discovery.js","source":"extensions/moonshot/provider-discovery.ts"},{"output":"provider-policy-api.js","source":"extensions/moonshot/provider-policy-api.ts"},{"output":"web-search-contract-api.js","source":"extensions/moonshot/web-search-contract-api.ts"},{"output":"web-search-provider.js","source":"extensions/moonshot/web-search-provider.ts"}],"chunks":[{"output":".setup/kimi-web-search-provider-Cj-AKDB0.mjs","sha256":"dab1b3e335f011effede621f3757b8f3025c2b0db9f0b868aa9601f995dea26f","facadeSource":null,"sources":["extensions/moonshot/src/kimi-web-search-provider.ts"]},{"output":".setup/kimi-web-search-provider.runtime-DsvZqNMD.mjs","sha256":"25e548a1b302a4b6b77701271d169f68c2866b624286c8632fdc62500df8821d","facadeSource":"extensions/moonshot/src/kimi-web-search-provider.runtime.ts","sources":["extensions/moonshot/src/kimi-web-search-provider.runtime.ts"]},{"output":".setup/openclaw.plugin-Bma3Qiyx.mjs","sha256":"1ecf14cfb56b76fef215a230ee34bb4068d41da44277ea7e983bbf990ad61da5","facadeSource":null,"sources":["extensions/moonshot/openclaw.plugin.json"]},{"output":"api.js","sha256":"4bf3ecbf9a4470db6a310a700c704c9ae1f44b442c20bbbdb6e256a50fbdb7e7","facadeSource":"extensions/moonshot/api.ts","sources":[]},{"output":"index.js","sha256":"ca2abf4c6b417cad7157bb38edcf4c47a5ba112d35fbc8dc0a229e7a08ab8c64","facadeSource":"extensions/moonshot/index.ts","sources":["extensions/moonshot/index.ts"]},{"output":"native-video.js","sha256":"dba43cd584bd67e0ff4534406d0293125ed7c5c120d61fc75f624c96448df9c6","facadeSource":"extensions/moonshot/native-video.ts","sources":["extensions/moonshot/native-video.ts"]},{"output":"provider-catalog.js","sha256":"b54d3e2f1f7eb3252613874a561f87bf1a2c82985de848a010fcabead30cb2fb","facadeSource":"extensions/moonshot/provider-catalog.ts","sources":["extensions/moonshot/provider-catalog.ts"]},{"output":"provider-contract-api.js","sha256":"1e2b4a4a190e14c5330e812f333f9a6a5d530b067c435e27faf8f1ca5f730bcc","facadeSource":"extensions/moonshot/provider-contract-api.ts","sources":["extensions/moonshot/provider-contract-api.ts"]},{"output":"provider-discovery.js","sha256":"e7cada03a31fba2c8fd7fd69a3f34810fffe2b516fbd0f390b5efb79264040f3","facadeSource":"extensions/moonshot/provider-discovery.ts","sources":["extensions/moonshot/provider-discovery.ts"]},{"output":"provider-policy-api.js","sha256":"5349b88cf07c99f547ac25108d8362672e7061e9ac0c1ea598ad001be9622fcb","facadeSource":"extensions/moonshot/provider-policy-api.ts","sources":["extensions/moonshot/provider-policy-api.ts"]},{"output":"web-search-contract-api.js","sha256":"d69089f5fbed0e127ec77ac2a57e0bb3d34cd75886b2d7b277572176c8737357","facadeSource":"extensions/moonshot/web-search-contract-api.ts","sources":[]},{"output":"web-search-provider.js","sha256":"b5283160b092f788a824bf6813c1fd941e0700afb0b112d0cd9e6d9fe00da337","facadeSource":"extensions/moonshot/web-search-provider.ts","sources":[]}],"unrenderedSources":["extensions/moonshot/api.ts","extensions/moonshot/web-search-contract-api.ts","extensions/moonshot/web-search-provider.ts"]}
package/dist/index.js CHANGED
@@ -1,14 +1,31 @@
1
- import { t as openclaw_plugin_default } from "./.setup/openclaw.plugin-ByEFwJ6V.mjs";
2
- import { isMoonshotAlwaysThinkingModelId, isMoonshotK3NativeVideoRoute, resolveThinkingProfile } from "./provider-policy-api.js";
3
- import { MOONSHOT_DEFAULT_MODEL_REF, buildMoonshotProvider } from "./provider-catalog.js";
4
- import { moonshotMediaUnderstandingProvider } from "./media-understanding-provider.js";
1
+ import { MOONSHOT_BASE_URL, MOONSHOT_CN_BASE_URL, isMoonshotAlwaysThinkingModelId, isMoonshotK3NativeVideoRoute, resolveThinkingProfile } from "./provider-policy-api.js";
5
2
  import { wrapMoonshotStream } from "./native-video.js";
6
- import { applyMoonshotConfig, applyMoonshotConfigCn } from "./onboard.js";
7
- import { t as createKimiWebSearchProvider } from "./.setup/kimi-web-search-provider-DCbJoku0.mjs";
3
+ import { t as openclaw_plugin_default } from "./.setup/openclaw.plugin-Bma3Qiyx.mjs";
4
+ import { MOONSHOT_DEFAULT_MODEL_ID, MOONSHOT_DEFAULT_MODEL_REF, buildMoonshotProvider } from "./provider-catalog.js";
5
+ import { t as createKimiWebSearchProvider } from "./.setup/kimi-web-search-provider-Cj-AKDB0.mjs";
6
+ import { describeOpenAiCompatibleVideo } from "openclaw/plugin-sdk/media-understanding";
8
7
  import { createProviderApiKeyAuthMethod } from "openclaw/plugin-sdk/provider-auth-api-key";
9
8
  import { defineSingleProviderPluginEntry } from "openclaw/plugin-sdk/provider-entry";
10
9
  import { buildOpenAICompatibleReplayPolicy } from "openclaw/plugin-sdk/provider-model-shared";
10
+ import { createDefaultModelsPresetAppliers } from "openclaw/plugin-sdk/provider-onboard";
11
11
  //#region extensions/moonshot/index.ts
12
+ const moonshotPresetAppliers = createDefaultModelsPresetAppliers({
13
+ primaryModelRef: MOONSHOT_DEFAULT_MODEL_REF,
14
+ resolveParams: (cfg, baseUrl) => {
15
+ const defaultModel = buildMoonshotProvider().models.find(({ id }) => id === MOONSHOT_DEFAULT_MODEL_ID);
16
+ return defaultModel ? {
17
+ providerId: "moonshot",
18
+ api: "openai-completions",
19
+ baseUrl,
20
+ defaultModels: cfg.models?.mode === "replace" ? [defaultModel] : [],
21
+ defaultModelId: MOONSHOT_DEFAULT_MODEL_ID,
22
+ aliases: [{
23
+ modelRef: MOONSHOT_DEFAULT_MODEL_REF,
24
+ alias: "Kimi"
25
+ }]
26
+ } : null;
27
+ }
28
+ });
12
29
  const PROVIDER_ID = "moonshot";
13
30
  var moonshot_default = defineSingleProviderPluginEntry({
14
31
  id: PROVIDER_ID,
@@ -19,7 +36,7 @@ var moonshot_default = defineSingleProviderPluginEntry({
19
36
  label: "Moonshot",
20
37
  docsPath: "/providers/moonshot",
21
38
  aliases: ["moonshotai", "moonshot-ai"],
22
- manifestAuth: { applyConfig: applyMoonshotConfig },
39
+ manifestAuth: { applyConfig: (cfg) => moonshotPresetAppliers.applyConfig(cfg, MOONSHOT_BASE_URL) },
23
40
  extraAuth: [createProviderApiKeyAuthMethod({
24
41
  providerId: PROVIDER_ID,
25
42
  methodId: "api-key-cn",
@@ -30,7 +47,7 @@ var moonshot_default = defineSingleProviderPluginEntry({
30
47
  envVar: "MOONSHOT_API_KEY",
31
48
  promptMessage: "Enter Moonshot API key (.cn)",
32
49
  defaultModel: MOONSHOT_DEFAULT_MODEL_REF,
33
- applyConfig: applyMoonshotConfigCn,
50
+ applyConfig: (cfg) => moonshotPresetAppliers.applyConfig(cfg, MOONSHOT_CN_BASE_URL),
34
51
  wizard: { groupLabel: "Moonshot AI (Kimi)" }
35
52
  })],
36
53
  catalog: {
@@ -60,7 +77,25 @@ var moonshot_default = defineSingleProviderPluginEntry({
60
77
  isModernModelRef: ({ modelId }) => isMoonshotAlwaysThinkingModelId(modelId)
61
78
  },
62
79
  register(api) {
63
- api.registerMediaUnderstandingProvider(moonshotMediaUnderstandingProvider);
80
+ api.registerMediaUnderstandingProvider({
81
+ id: "moonshot",
82
+ capabilities: ["image", "video"],
83
+ defaultModels: {
84
+ image: openclaw_plugin_default.mediaUnderstandingProviderMetadata.moonshot.defaultModels.image,
85
+ video: openclaw_plugin_default.mediaUnderstandingProviderMetadata.moonshot.defaultModels.video
86
+ },
87
+ autoPriority: { video: 20 },
88
+ describeImage: void 0,
89
+ describeImages: void 0,
90
+ describeVideo: async (params) => describeOpenAiCompatibleVideo({
91
+ ...params,
92
+ defaultBaseUrl: MOONSHOT_BASE_URL,
93
+ defaultModel: openclaw_plugin_default.mediaUnderstandingProviderMetadata.moonshot.defaultModels.video,
94
+ defaultPrompt: "Describe the video.",
95
+ provider: "moonshot",
96
+ providerLabel: "Moonshot"
97
+ })
98
+ });
64
99
  api.registerWebSearchProvider(createKimiWebSearchProvider());
65
100
  }
66
101
  });
@@ -6,13 +6,6 @@ import { isRecord } from "openclaw/plugin-sdk/string-coerce-runtime";
6
6
  const VIDEO_PREFIX = "data:video/mp4;base64,";
7
7
  const VIDEO_OMISSION = "(video omitted: untrusted or unsupported Moonshot video)";
8
8
  const MOONSHOT_REQUEST_BYTES_EXCLUSIVE = 1e8;
9
- function forEachUserContentPart(payload, visit) {
10
- const messages = isRecord(payload) && Array.isArray(payload.messages) ? payload.messages : [];
11
- for (const message of messages) {
12
- if (!isRecord(message) || message.role !== "user" || !Array.isArray(message.content)) continue;
13
- for (const part of message.content) if (isRecord(part)) visit(part);
14
- }
15
- }
16
9
  function partUrl(part, field) {
17
10
  const url = isRecord(part[field]) ? part[field].url : void 0;
18
11
  return typeof url === "string" ? url : void 0;
@@ -24,19 +17,6 @@ function replacePart(part, text) {
24
17
  text
25
18
  });
26
19
  }
27
- function finalizePayload(result, payload, requestBytesExclusive) {
28
- const admitted = [];
29
- forEachUserContentPart(payload, (part) => {
30
- const videoUrl = partUrl(part, "video_url");
31
- const imageUrl = partUrl(part, "image_url");
32
- if (part.type === "video_url" && videoUrl?.startsWith(VIDEO_PREFIX)) admitted.push(part);
33
- else if (part.type === "video_url" || imageUrl?.startsWith("data:video/")) replacePart(part, VIDEO_OMISSION);
34
- });
35
- const isOversized = () => Buffer.byteLength(JSON.stringify(payload), "utf8") >= requestBytesExclusive;
36
- while (admitted.length > 0 && isOversized()) replacePart(admitted.pop(), "(video omitted: Moonshot request size limit)");
37
- if (isOversized()) throw new Error(`Moonshot request body must be smaller than ${requestBytesExclusive} bytes`);
38
- return result;
39
- }
40
20
  function wrapMoonshotStream(ctx, simple = false, requestBytesExclusive = MOONSHOT_REQUEST_BYTES_EXCLUSIVE) {
41
21
  const underlying = ctx.streamFn ?? streamSimple;
42
22
  if (simple && !isMoonshotAlwaysThinkingModelId(ctx.modelId)) return underlying;
@@ -47,7 +27,26 @@ function wrapMoonshotStream(ctx, simple = false, requestBytesExclusive = MOONSHO
47
27
  return createMoonshotThinkingWrapper(withVideoContext, resolveMoonshotThinkingType({
48
28
  configuredThinking: ctx.extraParams?.thinking,
49
29
  thinkingLevel: ctx.thinkingLevel
50
- }), resolveMoonshotThinkingKeep({ configuredThinking: ctx.extraParams?.thinking }), (result, payload) => finalizePayload(result, payload, requestBytesExclusive));
30
+ }), resolveMoonshotThinkingKeep({ configuredThinking: ctx.extraParams?.thinking }), (result, payload) => {
31
+ const admitted = [];
32
+ const messages = isRecord(payload) && Array.isArray(payload.messages) ? payload.messages : [];
33
+ for (const message of messages) {
34
+ if (!isRecord(message) || message.role !== "user" || !Array.isArray(message.content)) continue;
35
+ for (const part of message.content) {
36
+ if (!isRecord(part)) continue;
37
+ const videoUrl = partUrl(part, "video_url");
38
+ const imageUrl = partUrl(part, "image_url");
39
+ if (part.type === "video_url" && videoUrl?.startsWith(VIDEO_PREFIX)) admitted.push(part);
40
+ else if (part.type === "video_url" || imageUrl?.startsWith("data:video/")) replacePart(part, VIDEO_OMISSION);
41
+ }
42
+ }
43
+ while (Buffer.byteLength(JSON.stringify(payload), "utf8") >= requestBytesExclusive) {
44
+ const part = admitted.pop();
45
+ if (!part) throw new Error(`Moonshot request body must be smaller than ${requestBytesExclusive} bytes`);
46
+ replacePart(part, "(video omitted: Moonshot request size limit)");
47
+ }
48
+ return result;
49
+ });
51
50
  }
52
51
  //#endregion
53
52
  export { wrapMoonshotStream };
@@ -1,5 +1,5 @@
1
- import { t as openclaw_plugin_default } from "./.setup/openclaw.plugin-ByEFwJ6V.mjs";
2
1
  import { MOONSHOT_BASE_URL, MOONSHOT_CN_BASE_URL, isNativeMoonshotBaseUrl } from "./provider-policy-api.js";
2
+ import { t as openclaw_plugin_default } from "./.setup/openclaw.plugin-Bma3Qiyx.mjs";
3
3
  import { buildManifestModelProviderConfig, readManifestProviderDefaultModelRef } from "openclaw/plugin-sdk/provider-catalog-shared";
4
4
  //#region extensions/moonshot/provider-catalog.ts
5
5
  const MOONSHOT_DEFAULT_MODEL_REF = readManifestProviderDefaultModelRef(openclaw_plugin_default, "moonshot");
@@ -1,4 +1,4 @@
1
- import { t as openclaw_plugin_default } from "./.setup/openclaw.plugin-ByEFwJ6V.mjs";
1
+ import { t as openclaw_plugin_default } from "./.setup/openclaw.plugin-Bma3Qiyx.mjs";
2
2
  //#region extensions/moonshot/provider-contract-api.ts
3
3
  const noopAuth = async () => ({ profiles: [] });
4
4
  function createMoonshotProvider() {
@@ -1,3 +1,2 @@
1
- import { t as createKimiWebSearchProvider } from "./.setup/kimi-web-search-provider-DCbJoku0.mjs";
1
+ export { t as createKimiWebSearchProvider } from "./.setup/kimi-web-search-provider-Cj-AKDB0.mjs";
2
2
  import "./web-search-provider.js";
3
- export { createKimiWebSearchProvider };
@@ -1,2 +1 @@
1
- import { t as createKimiWebSearchProvider } from "./.setup/kimi-web-search-provider-DCbJoku0.mjs";
2
- export { createKimiWebSearchProvider };
1
+ export { t as createKimiWebSearchProvider } from "./.setup/kimi-web-search-provider-Cj-AKDB0.mjs";
@@ -61,6 +61,7 @@
61
61
  "baseUrl": "https://api.moonshot.ai/v1",
62
62
  "api": "openai-completions",
63
63
  "defaultModel": "kimi-k3",
64
+ "family": "moonshot",
64
65
  "models": [
65
66
  {
66
67
  "id": "kimi-k3",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/moonshot-provider",
3
- "version": "2026.11.3",
3
+ "version": "2026.11.5-beta.2",
4
4
  "description": "OpenClaw Moonshot provider plugin",
5
5
  "type": "module",
6
6
  "openclaw": {
@@ -14,10 +14,10 @@
14
14
  "minHostVersion": ">=2026.6.9"
15
15
  },
16
16
  "compat": {
17
- "pluginApi": ">=2026.11.3"
17
+ "pluginApi": ">=2026.11.5-beta.2"
18
18
  },
19
19
  "build": {
20
- "openclawVersion": "2026.11.3",
20
+ "openclawVersion": "2026.11.5-beta.2",
21
21
  "bundledDist": false
22
22
  },
23
23
  "release": {
@@ -40,7 +40,7 @@
40
40
  "assets/activity.svg"
41
41
  ],
42
42
  "peerDependencies": {
43
- "openclaw": ">=2026.11.3"
43
+ "openclaw": ">=2026.11.5-beta.2"
44
44
  },
45
45
  "peerDependenciesMeta": {
46
46
  "openclaw": {
@@ -1,29 +0,0 @@
1
- import { t as openclaw_plugin_default } from "./.setup/openclaw.plugin-ByEFwJ6V.mjs";
2
- import { MOONSHOT_BASE_URL } from "./provider-policy-api.js";
3
- import "./provider-catalog.js";
4
- import { describeOpenAiCompatibleVideo } from "openclaw/plugin-sdk/media-understanding";
5
- //#region extensions/moonshot/media-understanding-provider.ts
6
- const DEFAULT_MOONSHOT_IMAGE_MODEL = openclaw_plugin_default.mediaUnderstandingProviderMetadata.moonshot.defaultModels.image;
7
- const DEFAULT_MOONSHOT_VIDEO_MODEL = openclaw_plugin_default.mediaUnderstandingProviderMetadata.moonshot.defaultModels.video;
8
- const DEFAULT_MOONSHOT_VIDEO_PROMPT = "Describe the video.";
9
- const moonshotMediaUnderstandingProvider = {
10
- id: "moonshot",
11
- capabilities: ["image", "video"],
12
- defaultModels: {
13
- image: DEFAULT_MOONSHOT_IMAGE_MODEL,
14
- video: DEFAULT_MOONSHOT_VIDEO_MODEL
15
- },
16
- autoPriority: { video: 20 },
17
- describeImage: void 0,
18
- describeImages: void 0,
19
- describeVideo: async (params) => describeOpenAiCompatibleVideo({
20
- ...params,
21
- defaultBaseUrl: MOONSHOT_BASE_URL,
22
- defaultModel: DEFAULT_MOONSHOT_VIDEO_MODEL,
23
- defaultPrompt: DEFAULT_MOONSHOT_VIDEO_PROMPT,
24
- provider: "moonshot",
25
- providerLabel: "Moonshot"
26
- })
27
- };
28
- //#endregion
29
- export { moonshotMediaUnderstandingProvider };
package/dist/onboard.js DELETED
@@ -1,29 +0,0 @@
1
- import { MOONSHOT_BASE_URL, MOONSHOT_CN_BASE_URL } from "./provider-policy-api.js";
2
- import { MOONSHOT_DEFAULT_MODEL_ID, MOONSHOT_DEFAULT_MODEL_REF, buildMoonshotProvider } from "./provider-catalog.js";
3
- import { createDefaultModelsPresetAppliers } from "openclaw/plugin-sdk/provider-onboard";
4
- //#region extensions/moonshot/onboard.ts
5
- const moonshotPresetAppliers = createDefaultModelsPresetAppliers({
6
- primaryModelRef: MOONSHOT_DEFAULT_MODEL_REF,
7
- resolveParams: (cfg, baseUrl) => {
8
- const defaultModel = buildMoonshotProvider().models.find(({ id }) => id === MOONSHOT_DEFAULT_MODEL_ID);
9
- return defaultModel ? {
10
- providerId: "moonshot",
11
- api: "openai-completions",
12
- baseUrl,
13
- defaultModels: cfg.models?.mode === "replace" ? [defaultModel] : [],
14
- defaultModelId: MOONSHOT_DEFAULT_MODEL_ID,
15
- aliases: [{
16
- modelRef: MOONSHOT_DEFAULT_MODEL_REF,
17
- alias: "Kimi"
18
- }]
19
- } : null;
20
- }
21
- });
22
- function applyMoonshotConfig(cfg) {
23
- return moonshotPresetAppliers.applyConfig(cfg, MOONSHOT_BASE_URL);
24
- }
25
- function applyMoonshotConfigCn(cfg) {
26
- return moonshotPresetAppliers.applyConfig(cfg, MOONSHOT_CN_BASE_URL);
27
- }
28
- //#endregion
29
- export { applyMoonshotConfig, applyMoonshotConfigCn };