@openclaw/deepinfra-provider 2026.9.5 → 2026.9.7

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.
package/assets/icon.png CHANGED
Binary file
@@ -0,0 +1,272 @@
1
+ //#region extensions/deepinfra/openclaw.plugin.json
2
+ var openclaw_plugin_default = {
3
+ id: "deepinfra",
4
+ categories: ["models"],
5
+ capabilityCatalogEntry: "./capability-catalog.ts",
6
+ doctorContract: { "configRepair": true },
7
+ activation: { "onStartup": false },
8
+ enabledByDefault: true,
9
+ providers: ["deepinfra"],
10
+ providerCatalogEntry: "./provider-discovery.ts",
11
+ providerEndpoints: [{
12
+ "endpointClass": "deepinfra-native",
13
+ "hosts": ["api.deepinfra.com"]
14
+ }],
15
+ providerRequest: { "providers": { "deepinfra": { "family": "deepinfra" } } },
16
+ setup: { "providers": [{
17
+ "id": "deepinfra",
18
+ "authMethods": ["api-key"],
19
+ "envVars": ["DEEPINFRA_API_KEY"]
20
+ }] },
21
+ modelCatalog: {
22
+ "modelsDev": { "deepinfra": "deepinfra" },
23
+ "providers": { "deepinfra": {
24
+ "baseUrl": "https://api.deepinfra.com/v1/openai",
25
+ "api": "openai-completions",
26
+ "models": [
27
+ {
28
+ "id": "deepseek-ai/DeepSeek-V4-Flash",
29
+ "name": "DeepSeek V4 Flash",
30
+ "reasoning": true,
31
+ "input": ["text"],
32
+ "contextWindow": 1048576,
33
+ "maxTokens": 1048576,
34
+ "cost": {
35
+ "input": .09,
36
+ "output": .18,
37
+ "cacheRead": .018,
38
+ "cacheWrite": 0
39
+ },
40
+ "compat": {
41
+ "supportsUsageInStreaming": true,
42
+ "codeMode": "capable"
43
+ }
44
+ },
45
+ {
46
+ "id": "deepseek-ai/DeepSeek-V4-Pro",
47
+ "name": "DeepSeek V4 Pro",
48
+ "reasoning": true,
49
+ "input": ["text"],
50
+ "contextWindow": 1048576,
51
+ "maxTokens": 1048576,
52
+ "cost": {
53
+ "input": 1.3,
54
+ "output": 2.6,
55
+ "cacheRead": .1,
56
+ "cacheWrite": 0
57
+ },
58
+ "compat": {
59
+ "supportsUsageInStreaming": true,
60
+ "codeMode": "capable"
61
+ }
62
+ },
63
+ {
64
+ "id": "zai-org/GLM-5.2",
65
+ "name": "GLM-5.2",
66
+ "reasoning": true,
67
+ "input": ["text"],
68
+ "contextWindow": 1048576,
69
+ "maxTokens": 1048576,
70
+ "cost": {
71
+ "input": .4875,
72
+ "output": 1.56,
73
+ "cacheRead": .091000001625,
74
+ "cacheWrite": 0
75
+ },
76
+ "compat": {
77
+ "supportsUsageInStreaming": true,
78
+ "codeMode": "capable"
79
+ }
80
+ },
81
+ {
82
+ "id": "stepfun-ai/Step-3.7-Flash",
83
+ "name": "Step 3.7 Flash",
84
+ "reasoning": true,
85
+ "input": ["text", "image"],
86
+ "contextWindow": 262144,
87
+ "maxTokens": 262144,
88
+ "cost": {
89
+ "input": .2,
90
+ "output": 1.15,
91
+ "cacheRead": .04,
92
+ "cacheWrite": 0
93
+ },
94
+ "compat": { "supportsUsageInStreaming": true }
95
+ },
96
+ {
97
+ "id": "moonshotai/Kimi-K2.7-Code",
98
+ "name": "Kimi K2.7 Code",
99
+ "reasoning": true,
100
+ "input": ["text", "image"],
101
+ "contextWindow": 262144,
102
+ "maxTokens": 262144,
103
+ "cost": {
104
+ "input": .68,
105
+ "output": 3.4,
106
+ "cacheRead": .136,
107
+ "cacheWrite": 0
108
+ },
109
+ "compat": { "supportsUsageInStreaming": true }
110
+ },
111
+ {
112
+ "id": "moonshotai/Kimi-K2.6",
113
+ "name": "Kimi K2.6",
114
+ "reasoning": true,
115
+ "input": ["text", "image"],
116
+ "contextWindow": 262144,
117
+ "maxTokens": 262144,
118
+ "cost": {
119
+ "input": .75,
120
+ "output": 3.5,
121
+ "cacheRead": .15,
122
+ "cacheWrite": 0
123
+ },
124
+ "compat": { "supportsUsageInStreaming": true }
125
+ },
126
+ {
127
+ "id": "nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B",
128
+ "name": "NVIDIA Nemotron 3 Ultra 550B A55B",
129
+ "reasoning": true,
130
+ "input": ["text", "image"],
131
+ "contextWindow": 262144,
132
+ "maxTokens": 262144,
133
+ "cost": {
134
+ "input": .5,
135
+ "output": 2.2,
136
+ "cacheRead": .1,
137
+ "cacheWrite": 0
138
+ },
139
+ "compat": { "supportsUsageInStreaming": true }
140
+ },
141
+ {
142
+ "id": "nvidia/NVIDIA-Nemotron-3-Super-120B-A12B",
143
+ "name": "NVIDIA Nemotron 3 Super 120B A12B",
144
+ "reasoning": true,
145
+ "input": ["text"],
146
+ "contextWindow": 262144,
147
+ "maxTokens": 262144,
148
+ "cost": {
149
+ "input": .085,
150
+ "output": .4,
151
+ "cacheRead": 0,
152
+ "cacheWrite": 0
153
+ },
154
+ "compat": { "supportsUsageInStreaming": true }
155
+ },
156
+ {
157
+ "id": "deepseek-ai/DeepSeek-V3.2",
158
+ "name": "DeepSeek V3.2",
159
+ "status": "deprecated",
160
+ "replacedBy": "deepseek-ai/DeepSeek-V4-Pro",
161
+ "reasoning": false,
162
+ "input": ["text"],
163
+ "contextWindow": 163840,
164
+ "maxTokens": 163840,
165
+ "cost": {
166
+ "input": .26,
167
+ "output": .38,
168
+ "cacheRead": .13,
169
+ "cacheWrite": 0
170
+ },
171
+ "compat": { "supportsUsageInStreaming": true }
172
+ },
173
+ {
174
+ "id": "zai-org/GLM-5.1",
175
+ "name": "GLM-5.1",
176
+ "status": "deprecated",
177
+ "replacedBy": "zai-org/GLM-5.2",
178
+ "reasoning": true,
179
+ "input": ["text"],
180
+ "contextWindow": 202752,
181
+ "maxTokens": 202752,
182
+ "cost": {
183
+ "input": 1.05,
184
+ "output": 3.5,
185
+ "cacheRead": .205000005,
186
+ "cacheWrite": 0
187
+ },
188
+ "compat": {
189
+ "supportsUsageInStreaming": true,
190
+ "codeMode": "capable"
191
+ }
192
+ },
193
+ {
194
+ "id": "stepfun-ai/Step-3.5-Flash",
195
+ "name": "Step 3.5 Flash",
196
+ "status": "deprecated",
197
+ "replacedBy": "stepfun-ai/Step-3.7-Flash",
198
+ "reasoning": true,
199
+ "input": ["text"],
200
+ "contextWindow": 262144,
201
+ "maxTokens": 262144,
202
+ "cost": {
203
+ "input": .09,
204
+ "output": .3,
205
+ "cacheRead": .0199999998,
206
+ "cacheWrite": 0
207
+ },
208
+ "compat": { "supportsUsageInStreaming": true }
209
+ },
210
+ {
211
+ "id": "moonshotai/Kimi-K2.5",
212
+ "name": "Kimi K2.5",
213
+ "status": "deprecated",
214
+ "replacedBy": "moonshotai/Kimi-K2.6",
215
+ "reasoning": true,
216
+ "input": ["text", "image"],
217
+ "contextWindow": 262144,
218
+ "maxTokens": 262144,
219
+ "cost": {
220
+ "input": .45,
221
+ "output": 2.25,
222
+ "cacheRead": .070000002,
223
+ "cacheWrite": 0
224
+ },
225
+ "compat": { "supportsUsageInStreaming": true }
226
+ }
227
+ ]
228
+ } },
229
+ "discovery": { "deepinfra": "refreshable" }
230
+ },
231
+ modelPricing: { "providers": { "deepinfra": { "deepinfra": { "provider": "deepinfra" } } } },
232
+ providerAuthChoices: [{
233
+ "provider": "deepinfra",
234
+ "method": "api-key",
235
+ "choiceId": "deepinfra-api-key",
236
+ "appGuidedSecret": true,
237
+ "choiceLabel": "DeepInfra API key",
238
+ "choiceHint": "Unified API for open source models",
239
+ "groupId": "deepinfra",
240
+ "groupLabel": "DeepInfra",
241
+ "groupHint": "Unified API for open source models",
242
+ "optionKey": "deepinfraApiKey",
243
+ "cliFlag": "--deepinfra-api-key",
244
+ "cliOption": "--deepinfra-api-key <key>",
245
+ "cliDescription": "DeepInfra API key"
246
+ }],
247
+ contracts: {
248
+ "mediaUnderstandingProviders": ["deepinfra"],
249
+ "embeddingProviders": ["deepinfra"],
250
+ "imageGenerationProviders": ["deepinfra"],
251
+ "speechProviders": ["deepinfra"],
252
+ "videoGenerationProviders": ["deepinfra"]
253
+ },
254
+ mediaUnderstandingProviderMetadata: { "deepinfra": {
255
+ "capabilities": ["image", "audio"],
256
+ "defaultModels": {
257
+ "image": "moonshotai/Kimi-K2.5",
258
+ "audio": "openai/whisper-large-v3-turbo"
259
+ },
260
+ "autoPriority": {
261
+ "image": 45,
262
+ "audio": 45
263
+ }
264
+ } },
265
+ configSchema: {
266
+ "type": "object",
267
+ "additionalProperties": false,
268
+ "properties": {}
269
+ }
270
+ };
271
+ //#endregion
272
+ export { openclaw_plugin_default as t };
@@ -1,10 +1,192 @@
1
- import { t as modelCatalog } from "./.setup/openclaw.plugin-BRaVociw.mjs";
2
- import { asObjectRecord } from "openclaw/plugin-sdk/runtime-doctor-migrations";
1
+ import { t as openclaw_plugin_default } from "./.setup/openclaw.plugin-D7BLeoIa.mjs";
2
+ //#region \0rolldown/runtime.js
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __exportAll = (all, no_symbols) => {
8
+ let target = {};
9
+ for (var name in all) __defProp(target, name, {
10
+ get: all[name],
11
+ enumerable: true
12
+ });
13
+ if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
14
+ return target;
15
+ };
16
+ var __copyProps = (to, from, except, desc) => {
17
+ if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
18
+ key = keys[i];
19
+ if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
20
+ get: ((k) => from[k]).bind(null, key),
21
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
22
+ });
23
+ }
24
+ return to;
25
+ };
26
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
27
+ //#endregion
28
+ //#region packages/normalization-core/src/record-coerce.ts
29
+ /** Type guard for non-array object records at browser-safe boundaries. */
30
+ function isRecord(value) {
31
+ return value !== null && typeof value === "object" && !Array.isArray(value);
32
+ }
33
+ /** Returns a non-array record or null. */
34
+ function asNullableRecord(value) {
35
+ return isRecord(value) ? value : null;
36
+ }
37
+ //#endregion
38
+ //#region src/config/channel-config-normalization.ts
39
+ /** Applies one channel-specific doctor migration to every object-shaped account. */
40
+ function normalizeChannelAccounts(params) {
41
+ const rawAccounts = asNullableRecord(params.entry.accounts);
42
+ if (!rawAccounts) return {
43
+ entry: params.entry,
44
+ changed: false
45
+ };
46
+ let changed = false;
47
+ const accounts = { ...rawAccounts };
48
+ for (const [accountId, value] of Object.entries(rawAccounts)) {
49
+ const account = asNullableRecord(value);
50
+ if (!account) continue;
51
+ const normalized = params.normalizeAccount({
52
+ account,
53
+ accountId,
54
+ pathPrefix: `${params.pathPrefix}.accounts.${accountId}`,
55
+ changes: params.changes
56
+ });
57
+ if (normalized.changed) {
58
+ accounts[accountId] = normalized.entry;
59
+ changed = true;
60
+ }
61
+ }
62
+ return changed ? {
63
+ entry: {
64
+ ...params.entry,
65
+ accounts
66
+ },
67
+ changed: true
68
+ } : {
69
+ entry: params.entry,
70
+ changed: false
71
+ };
72
+ }
73
+ /** Applies the same channel-specific doctor migration at root and account scope. */
74
+ function normalizeChannelConfigEntries(params) {
75
+ const changes = params.changes ?? [];
76
+ const channels = params.cfg.channels;
77
+ const entry = asNullableRecord(channels?.[params.channelId]);
78
+ if (!entry) return {
79
+ config: params.cfg,
80
+ changes
81
+ };
82
+ const channelPath = `channels.${params.channelId}`;
83
+ const root = params.normalizeEntry({
84
+ entry,
85
+ pathPrefix: channelPath,
86
+ changes
87
+ });
88
+ const accounts = normalizeChannelAccounts({
89
+ entry: root.entry,
90
+ pathPrefix: channelPath,
91
+ changes,
92
+ normalizeAccount: (accountParams) => params.normalizeEntry({
93
+ entry: accountParams.account,
94
+ accountId: accountParams.accountId,
95
+ pathPrefix: accountParams.pathPrefix,
96
+ changes: accountParams.changes
97
+ })
98
+ });
99
+ if (!root.changed && !accounts.changed) return {
100
+ config: params.cfg,
101
+ changes
102
+ };
103
+ return {
104
+ config: {
105
+ ...params.cfg,
106
+ channels: {
107
+ ...channels,
108
+ [params.channelId]: accounts.entry
109
+ }
110
+ },
111
+ changes
112
+ };
113
+ }
114
+ //#endregion
115
+ //#region src/plugin-sdk/legacy-webhook-listener-migration.ts
116
+ /** Preserve explicitly configured webhook listeners while moving ingress onto Gateway routes. */
117
+ function createLegacyWebhookListenerDoctorContract(params) {
118
+ const portKey = params.portKey ?? "webhookPort";
119
+ const hostKey = params.hostKey === void 0 ? "webhookHost" : params.hostKey;
120
+ const source = (entry) => params.webhookKey ? asNullableRecord(entry[params.webhookKey]) : entry;
121
+ const hasLegacy = (value) => {
122
+ const entry = asNullableRecord(value);
123
+ const listener = entry && source(entry);
124
+ return Boolean(listener && (Object.hasOwn(listener, portKey) || hostKey && Object.hasOwn(listener, hostKey)));
125
+ };
126
+ const prefix = `channels.${params.channelKey}`;
127
+ return {
128
+ legacyConfigRules: [{
129
+ path: ["channels", params.channelKey],
130
+ message: `${prefix} webhook listeners moved to Gateway routes. Run "openclaw doctor --fix" to preserve explicitly configured listener settings as legacyWebhook.`,
131
+ match: (value) => {
132
+ const accounts = asNullableRecord(asNullableRecord(value)?.accounts);
133
+ return hasLegacy(value) || Object.values(accounts ?? {}).some(hasLegacy);
134
+ }
135
+ }],
136
+ normalizeCompatibilityConfig: ({ cfg }) => {
137
+ const root = asNullableRecord(asNullableRecord(cfg.channels)?.[params.channelKey]);
138
+ const inherited = root && source(root);
139
+ const canonicalRoot = asNullableRecord(root?.legacyWebhook);
140
+ return normalizeChannelConfigEntries({
141
+ cfg,
142
+ channelId: params.channelKey,
143
+ normalizeEntry: ({ entry, accountId, pathPrefix, changes }) => {
144
+ const listener = source(entry);
145
+ if (!listener || !hasLegacy(entry)) return {
146
+ entry,
147
+ changed: false
148
+ };
149
+ const next = { ...entry };
150
+ const port = Object.hasOwn(listener, portKey) ? listener[portKey] : (accountId ? canonicalRoot?.port ?? inherited?.[portKey] : void 0) ?? params.defaultPort;
151
+ const inheritedHost = accountId ? canonicalRoot ? canonicalRoot.host : (hostKey ? inherited?.[hostKey] : void 0) ?? params.defaultHost : params.defaultHost;
152
+ const host = hostKey ? listener[hostKey] ?? inheritedHost : inheritedHost;
153
+ const legacyPath = [pathPrefix, params.webhookKey].filter(Boolean).join(".");
154
+ if (Object.hasOwn(entry, "legacyWebhook")) changes.push(`Removed ${legacyPath} legacy listener keys; ${pathPrefix}.legacyWebhook is already configured.`);
155
+ else if (accountId && root?.legacyWebhook === false) changes.push(`Removed ${legacyPath} legacy listener keys; ${prefix}.legacyWebhook: false keeps this account's inherited listener disabled.`);
156
+ else {
157
+ next.legacyWebhook = {
158
+ port,
159
+ ...host !== void 0 ? { host } : {}
160
+ };
161
+ changes.push(`Moved ${legacyPath} listener settings to ${pathPrefix}.legacyWebhook. Point the external callback or reverse proxy at the Gateway port and webhook path, verify delivery, then set legacyWebhook: false to disable legacy forwarding.`);
162
+ }
163
+ const updated = params.webhookKey ? { ...listener } : next;
164
+ delete updated[portKey];
165
+ if (hostKey) delete updated[hostKey];
166
+ if (params.webhookKey) {
167
+ if (Object.keys(updated).length) next[params.webhookKey] = updated;
168
+ else delete next[params.webhookKey];
169
+ }
170
+ return {
171
+ entry: next,
172
+ changed: true
173
+ };
174
+ }
175
+ });
176
+ }
177
+ };
178
+ }
179
+ //#endregion
180
+ //#region \0openclaw:bundled-sdk:openclaw/plugin-sdk/runtime-doctor-migrations
181
+ var runtime_doctor_migrations_exports = /* @__PURE__ */ __exportAll({ createLegacyWebhookListenerDoctorContract: () => createLegacyWebhookListenerDoctorContract });
182
+ import * as import_openclaw_plugin_sdk_runtime_doctor_migrations from "openclaw/plugin-sdk/runtime-doctor-migrations";
183
+ __reExport(runtime_doctor_migrations_exports, import_openclaw_plugin_sdk_runtime_doctor_migrations);
184
+ //#endregion
3
185
  //#region extensions/deepinfra/doctor-contract-api.ts
4
186
  const PROVIDER_PATH = "models.providers.deepinfra";
5
187
  const NATIVE_INFERENCE_PATH = "/v1/inference";
6
188
  const OPENAI_COMPAT_PATH = "/v1/openai";
7
- const CANONICAL_BASE_URL = modelCatalog.providers.deepinfra.baseUrl;
189
+ const CANONICAL_BASE_URL = openclaw_plugin_default.modelCatalog.providers.deepinfra.baseUrl;
8
190
  const FIX_HINT = `Run "openclaw doctor --fix" (api.deepinfra.com endpoints migrate automatically; custom hosts must set ${PROVIDER_PATH}.baseUrl to an OpenAI-compatible videos endpoint manually).`;
9
191
  const legacyConfigRules = [{
10
192
  path: [
@@ -45,7 +227,7 @@ function normalizeCompatibilityConfig({ cfg }) {
45
227
  changes: []
46
228
  };
47
229
  const changes = [];
48
- const providerRecord = asObjectRecord(provider) ?? {};
230
+ const providerRecord = (0, runtime_doctor_migrations_exports.asObjectRecord)(provider) ?? {};
49
231
  const { nativeBaseUrl, ...providerWithoutLegacyNativeBaseUrl } = providerRecord;
50
232
  const next = {
51
233
  ...providerWithoutLegacyNativeBaseUrl,
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { createDeepInfraAnthropicCacheWrapper } from "./cache-wrapper.js";
2
+ import { t as openclaw_plugin_default } from "./.setup/openclaw.plugin-D7BLeoIa.mjs";
2
3
  import { buildDeepInfraEmbeddingAdapter } from "./embedding-adapter.js";
3
4
  import { buildDeepInfraImageGenerationProvider } from "./image-generation-provider.js";
4
5
  import { buildDeepInfraMediaUnderstandingProvider } from "./media-understanding-provider.js";
@@ -18,33 +19,19 @@ var deepinfra_default = defineSingleProviderPluginEntry({
18
19
  id: PROVIDER_ID,
19
20
  name: "DeepInfra Provider",
20
21
  description: "Bundled DeepInfra provider plugin",
22
+ manifest: openclaw_plugin_default,
21
23
  provider: {
22
24
  label: "DeepInfra",
23
25
  docsPath: "/providers/deepinfra",
24
- auth: [{
25
- methodId: "api-key",
26
- label: "DeepInfra API key",
27
- hint: "Unified API for open source models",
28
- optionKey: "deepinfraApiKey",
29
- flagName: "--deepinfra-api-key",
30
- envVar: "DEEPINFRA_API_KEY",
31
- promptMessage: "Enter DeepInfra API key",
26
+ manifestAuth: {
32
27
  noteTitle: "DeepInfra",
33
28
  noteMessage: ["DeepInfra provides an OpenAI-compatible API for open source and frontier models.", "Get your API key at: https://deepinfra.com/dash/api_keys"].join("\n"),
34
29
  defaultModel: DEEPINFRA_DEFAULT_MODEL_REF,
35
- applyConfig: (cfg) => applyDeepInfraConfig(cfg),
36
- wizard: {
37
- choiceId: "deepinfra-api-key",
38
- choiceLabel: "DeepInfra API key",
39
- choiceHint: "Unified API for open source models",
40
- groupId: PROVIDER_ID,
41
- groupLabel: "DeepInfra",
42
- groupHint: "Unified API for open source models"
43
- }
44
- }],
30
+ applyConfig: applyDeepInfraConfig
31
+ },
45
32
  catalog: {
46
33
  order: "simple",
47
- run: (ctx) => buildDeepInfraApiKeyCatalog(ctx),
34
+ run: buildDeepInfraApiKeyCatalog,
48
35
  staticRun: async () => ({ provider: buildStaticDeepInfraProvider() })
49
36
  },
50
37
  normalizeConfig: ({ providerConfig }) => providerConfig,
@@ -1,7 +1,7 @@
1
- import { t as modelCatalog } from "./.setup/openclaw.plugin-BRaVociw.mjs";
1
+ import { t as openclaw_plugin_default } from "./.setup/openclaw.plugin-D7BLeoIa.mjs";
2
2
  import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
3
3
  //#region extensions/deepinfra/media-models.ts
4
- const DEEPINFRA_BASE_URL = modelCatalog.providers.deepinfra.baseUrl;
4
+ const DEEPINFRA_BASE_URL = openclaw_plugin_default.modelCatalog.providers.deepinfra.baseUrl;
5
5
  const DEFAULT_DEEPINFRA_IMAGE_SIZE = "1024x1024";
6
6
  const DEFAULT_DEEPINFRA_TTS_VOICE = "af_bella";
7
7
  const DEEPINFRA_VIDEO_ASPECT_RATIOS = [
@@ -1,4 +1,4 @@
1
- import { t as modelCatalog } from "./.setup/openclaw.plugin-BRaVociw.mjs";
1
+ import { t as openclaw_plugin_default } from "./.setup/openclaw.plugin-D7BLeoIa.mjs";
2
2
  import { DEEPINFRA_BASE_URL, DEEPINFRA_TTS_FALLBACK_CATALOG } from "./media-models.js";
3
3
  import { DEEPINFRA_MODEL_CATALOG, buildDeepInfraModelDefinition } from "./provider-static-catalog.js";
4
4
  import { parseDeepInfraPricingCatalog } from "./pricing-api.js";
@@ -149,14 +149,11 @@ const STATIC_NON_CHAT_FALLBACK = [
149
149
  contextWindow: 8192
150
150
  }
151
151
  ];
152
- function manifestFallbackCatalog() {
153
- const catalog = bucketBySurface([...(modelCatalog.providers.deepinfra.models ?? []).map(manifestChatEntryToSurfaceModel), ...STATIC_NON_CHAT_FALLBACK]);
152
+ function getDeepInfraSurfaceFallbackCatalog() {
153
+ const catalog = bucketBySurface([...(openclaw_plugin_default.modelCatalog.providers.deepinfra.models ?? []).map(manifestChatEntryToSurfaceModel), ...STATIC_NON_CHAT_FALLBACK]);
154
154
  catalog.live = false;
155
155
  return catalog;
156
156
  }
157
- function getDeepInfraSurfaceFallbackCatalog() {
158
- return manifestFallbackCatalog();
159
- }
160
157
  function chatSurfaceModelToModelDefinition(model) {
161
158
  const manifestModel = DEEPINFRA_MODEL_CATALOG.find((entry) => entry.id === model.id);
162
159
  const input = model.tags.includes("vlm") ? ["text", "image"] : ["text"];
@@ -185,7 +182,7 @@ async function discoverDeepInfraSurfaces(options) {
185
182
  } catch (error) {
186
183
  log.warn(`Model metadata discovery unavailable: ${String(error)}`);
187
184
  }
188
- return manifestFallbackCatalog();
185
+ return getDeepInfraSurfaceFallbackCatalog();
189
186
  }
190
187
  async function loadDeepInfraSurfaces() {
191
188
  return getCachedLiveCatalogValue({
@@ -1,10 +1,10 @@
1
- import { t as modelCatalog } from "./.setup/openclaw.plugin-BRaVociw.mjs";
1
+ import { t as openclaw_plugin_default } from "./.setup/openclaw.plugin-D7BLeoIa.mjs";
2
2
  import { DEEPINFRA_BASE_URL } from "./media-models.js";
3
3
  import { buildManifestModelProviderConfig } from "openclaw/plugin-sdk/provider-model-metadata";
4
4
  //#region extensions/deepinfra/provider-static-catalog.ts
5
5
  const DEEPINFRA_MANIFEST_PROVIDER = buildManifestModelProviderConfig({
6
6
  providerId: "deepinfra",
7
- catalog: modelCatalog.providers.deepinfra
7
+ catalog: openclaw_plugin_default.modelCatalog.providers.deepinfra
8
8
  });
9
9
  const DEEPINFRA_DEFAULT_MODEL_REF = `deepinfra/deepseek-ai/DeepSeek-V4-Flash`;
10
10
  const DEEPINFRA_MODEL_CATALOG = DEEPINFRA_MANIFEST_PROVIDER.models;
@@ -67,4 +67,4 @@ async function resolveDeepInfraVideoModelCapabilities(ctx) {
67
67
  return catalog.videoGen.find((m) => m.id === normalized) ?? catalog.videoGen.find((m) => m.id === rawId) ? buildDeepInfraVideoModelCapabilities() : void 0;
68
68
  }
69
69
  //#endregion
70
- export { listDeepInfraImageGenCatalog, listDeepInfraVideoGenCatalog, resolveDeepInfraVideoModelCapabilities };
70
+ export { buildDeepInfraVideoModelCapabilities, listDeepInfraImageGenCatalog, listDeepInfraVideoGenCatalog, resolveDeepInfraVideoModelCapabilities };
@@ -1,5 +1,5 @@
1
- import { DEEPINFRA_BASE_URL, DEEPINFRA_VIDEO_ASPECT_RATIOS, DEEPINFRA_VIDEO_DURATIONS, DEEPINFRA_VIDEO_FALLBACK_MODELS, normalizeDeepInfraBaseUrl, normalizeDeepInfraModelRef } from "./media-models.js";
2
- import { resolveDeepInfraVideoModelCapabilities } from "./surface-model-catalogs.js";
1
+ import { DEEPINFRA_BASE_URL, DEEPINFRA_VIDEO_FALLBACK_MODELS, normalizeDeepInfraBaseUrl, normalizeDeepInfraModelRef } from "./media-models.js";
2
+ import { buildDeepInfraVideoModelCapabilities, resolveDeepInfraVideoModelCapabilities } from "./surface-model-catalogs.js";
3
3
  import { asSafeIntegerInRange, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
4
4
  import { isProviderApiKeyConfigured } from "openclaw/plugin-sdk/provider-auth";
5
5
  import { resolveGeneratedMediaMaxBytes } from "openclaw/plugin-sdk/media-generation-runtime";
@@ -39,12 +39,6 @@ function resolveDurationSeconds(value) {
39
39
  if (typeof value !== "number" || !Number.isFinite(value)) return;
40
40
  return value <= 6.5 ? 5 : 8;
41
41
  }
42
- function resolveSeed(value) {
43
- return asSafeIntegerInRange(value, {
44
- min: 0,
45
- max: 4294967295
46
- });
47
- }
48
42
  function buildDeepInfraVideoBody(req, model) {
49
43
  const options = req.providerOptions ?? {};
50
44
  const body = {
@@ -55,7 +49,10 @@ function buildDeepInfraVideoBody(req, model) {
55
49
  if (aspectRatio) body.aspect_ratio = aspectRatio;
56
50
  const duration = resolveDurationSeconds(req.durationSeconds);
57
51
  if (duration) body.seconds = duration;
58
- const seed = resolveSeed(options.seed);
52
+ const seed = asSafeIntegerInRange(options.seed, {
53
+ min: 0,
54
+ max: 4294967295
55
+ });
59
56
  if (seed != null) body.seed = seed;
60
57
  const negativePrompt = normalizeOptionalString(options.negative_prompt) ?? normalizeOptionalString(options.negativePrompt);
61
58
  if (negativePrompt) body.negative_prompt = negativePrompt;
@@ -90,6 +87,7 @@ function resolveDeepInfraVideoBaseUrl(req) {
90
87
  function buildDeepInfraVideoGenerationProvider(options) {
91
88
  const ids = options?.videoGenModels && options.videoGenModels.length > 0 ? options.videoGenModels.map((model) => model.id) : [...DEEPINFRA_VIDEO_FALLBACK_MODELS];
92
89
  const defaultModel = ids[0] ?? DEEPINFRA_VIDEO_FALLBACK_MODELS[0];
90
+ const { providerOptions, ...capabilities } = buildDeepInfraVideoModelCapabilities();
93
91
  return {
94
92
  id: "deepinfra",
95
93
  label: "DeepInfra",
@@ -101,21 +99,11 @@ function buildDeepInfraVideoGenerationProvider(options) {
101
99
  ...ctx
102
100
  }),
103
101
  capabilities: {
102
+ ...capabilities,
104
103
  generate: {
105
- maxVideos: 1,
106
- maxDurationSeconds: 8,
107
- supportedDurationSeconds: [...DEEPINFRA_VIDEO_DURATIONS],
108
- supportsAspectRatio: true,
109
- aspectRatios: [...DEEPINFRA_VIDEO_ASPECT_RATIOS],
110
- providerOptions: {
111
- seed: "number",
112
- negative_prompt: "string",
113
- negativePrompt: "string",
114
- style: "string"
115
- }
116
- },
117
- imageToVideo: { enabled: false },
118
- videoToVideo: { enabled: false }
104
+ ...capabilities.generate,
105
+ providerOptions
106
+ }
119
107
  },
120
108
  async generateVideo(req) {
121
109
  if ((req.inputImages?.length ?? 0) > 0) throw new Error("DeepInfra video generation currently supports text-to-video only.");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/deepinfra-provider",
3
- "version": "2026.9.5",
3
+ "version": "2026.9.7",
4
4
  "description": "OpenClaw DeepInfra provider plugin.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -18,10 +18,10 @@
18
18
  "minHostVersion": ">=2026.6.8"
19
19
  },
20
20
  "compat": {
21
- "pluginApi": ">=2026.9.5"
21
+ "pluginApi": ">=2026.9.7"
22
22
  },
23
23
  "build": {
24
- "openclawVersion": "2026.9.5",
24
+ "openclawVersion": "2026.9.7",
25
25
  "bundledDist": false
26
26
  },
27
27
  "release": {
@@ -40,7 +40,7 @@
40
40
  "assets/activity.svg"
41
41
  ],
42
42
  "peerDependencies": {
43
- "openclaw": ">=2026.9.5"
43
+ "openclaw": ">=2026.9.7"
44
44
  },
45
45
  "peerDependenciesMeta": {
46
46
  "openclaw": {
@@ -1,213 +0,0 @@
1
- //#region extensions/deepinfra/openclaw.plugin.json
2
- var modelCatalog = {
3
- "modelsDev": { "deepinfra": "deepinfra" },
4
- "providers": { "deepinfra": {
5
- "baseUrl": "https://api.deepinfra.com/v1/openai",
6
- "api": "openai-completions",
7
- "models": [
8
- {
9
- "id": "deepseek-ai/DeepSeek-V4-Flash",
10
- "name": "DeepSeek V4 Flash",
11
- "reasoning": true,
12
- "input": ["text"],
13
- "contextWindow": 1048576,
14
- "maxTokens": 1048576,
15
- "cost": {
16
- "input": .09,
17
- "output": .18,
18
- "cacheRead": .018,
19
- "cacheWrite": 0
20
- },
21
- "compat": {
22
- "supportsUsageInStreaming": true,
23
- "codeMode": "capable"
24
- }
25
- },
26
- {
27
- "id": "deepseek-ai/DeepSeek-V4-Pro",
28
- "name": "DeepSeek V4 Pro",
29
- "reasoning": true,
30
- "input": ["text"],
31
- "contextWindow": 1048576,
32
- "maxTokens": 1048576,
33
- "cost": {
34
- "input": 1.3,
35
- "output": 2.6,
36
- "cacheRead": .1,
37
- "cacheWrite": 0
38
- },
39
- "compat": {
40
- "supportsUsageInStreaming": true,
41
- "codeMode": "capable"
42
- }
43
- },
44
- {
45
- "id": "zai-org/GLM-5.2",
46
- "name": "GLM-5.2",
47
- "reasoning": true,
48
- "input": ["text"],
49
- "contextWindow": 1048576,
50
- "maxTokens": 1048576,
51
- "cost": {
52
- "input": .4875,
53
- "output": 1.56,
54
- "cacheRead": .091000001625,
55
- "cacheWrite": 0
56
- },
57
- "compat": {
58
- "supportsUsageInStreaming": true,
59
- "codeMode": "capable"
60
- }
61
- },
62
- {
63
- "id": "stepfun-ai/Step-3.7-Flash",
64
- "name": "Step 3.7 Flash",
65
- "reasoning": true,
66
- "input": ["text", "image"],
67
- "contextWindow": 262144,
68
- "maxTokens": 262144,
69
- "cost": {
70
- "input": .2,
71
- "output": 1.15,
72
- "cacheRead": .04,
73
- "cacheWrite": 0
74
- },
75
- "compat": { "supportsUsageInStreaming": true }
76
- },
77
- {
78
- "id": "moonshotai/Kimi-K2.7-Code",
79
- "name": "Kimi K2.7 Code",
80
- "reasoning": true,
81
- "input": ["text", "image"],
82
- "contextWindow": 262144,
83
- "maxTokens": 262144,
84
- "cost": {
85
- "input": .68,
86
- "output": 3.4,
87
- "cacheRead": .136,
88
- "cacheWrite": 0
89
- },
90
- "compat": { "supportsUsageInStreaming": true }
91
- },
92
- {
93
- "id": "moonshotai/Kimi-K2.6",
94
- "name": "Kimi K2.6",
95
- "reasoning": true,
96
- "input": ["text", "image"],
97
- "contextWindow": 262144,
98
- "maxTokens": 262144,
99
- "cost": {
100
- "input": .75,
101
- "output": 3.5,
102
- "cacheRead": .15,
103
- "cacheWrite": 0
104
- },
105
- "compat": { "supportsUsageInStreaming": true }
106
- },
107
- {
108
- "id": "nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B",
109
- "name": "NVIDIA Nemotron 3 Ultra 550B A55B",
110
- "reasoning": true,
111
- "input": ["text", "image"],
112
- "contextWindow": 262144,
113
- "maxTokens": 262144,
114
- "cost": {
115
- "input": .5,
116
- "output": 2.2,
117
- "cacheRead": .1,
118
- "cacheWrite": 0
119
- },
120
- "compat": { "supportsUsageInStreaming": true }
121
- },
122
- {
123
- "id": "nvidia/NVIDIA-Nemotron-3-Super-120B-A12B",
124
- "name": "NVIDIA Nemotron 3 Super 120B A12B",
125
- "reasoning": true,
126
- "input": ["text"],
127
- "contextWindow": 262144,
128
- "maxTokens": 262144,
129
- "cost": {
130
- "input": .085,
131
- "output": .4,
132
- "cacheRead": 0,
133
- "cacheWrite": 0
134
- },
135
- "compat": { "supportsUsageInStreaming": true }
136
- },
137
- {
138
- "id": "deepseek-ai/DeepSeek-V3.2",
139
- "name": "DeepSeek V3.2",
140
- "status": "deprecated",
141
- "replacedBy": "deepseek-ai/DeepSeek-V4-Pro",
142
- "reasoning": false,
143
- "input": ["text"],
144
- "contextWindow": 163840,
145
- "maxTokens": 163840,
146
- "cost": {
147
- "input": .26,
148
- "output": .38,
149
- "cacheRead": .13,
150
- "cacheWrite": 0
151
- },
152
- "compat": { "supportsUsageInStreaming": true }
153
- },
154
- {
155
- "id": "zai-org/GLM-5.1",
156
- "name": "GLM-5.1",
157
- "status": "deprecated",
158
- "replacedBy": "zai-org/GLM-5.2",
159
- "reasoning": true,
160
- "input": ["text"],
161
- "contextWindow": 202752,
162
- "maxTokens": 202752,
163
- "cost": {
164
- "input": 1.05,
165
- "output": 3.5,
166
- "cacheRead": .205000005,
167
- "cacheWrite": 0
168
- },
169
- "compat": {
170
- "supportsUsageInStreaming": true,
171
- "codeMode": "capable"
172
- }
173
- },
174
- {
175
- "id": "stepfun-ai/Step-3.5-Flash",
176
- "name": "Step 3.5 Flash",
177
- "status": "deprecated",
178
- "replacedBy": "stepfun-ai/Step-3.7-Flash",
179
- "reasoning": true,
180
- "input": ["text"],
181
- "contextWindow": 262144,
182
- "maxTokens": 262144,
183
- "cost": {
184
- "input": .09,
185
- "output": .3,
186
- "cacheRead": .0199999998,
187
- "cacheWrite": 0
188
- },
189
- "compat": { "supportsUsageInStreaming": true }
190
- },
191
- {
192
- "id": "moonshotai/Kimi-K2.5",
193
- "name": "Kimi K2.5",
194
- "status": "deprecated",
195
- "replacedBy": "moonshotai/Kimi-K2.6",
196
- "reasoning": true,
197
- "input": ["text", "image"],
198
- "contextWindow": 262144,
199
- "maxTokens": 262144,
200
- "cost": {
201
- "input": .45,
202
- "output": 2.25,
203
- "cacheRead": .070000002,
204
- "cacheWrite": 0
205
- },
206
- "compat": { "supportsUsageInStreaming": true }
207
- }
208
- ]
209
- } },
210
- "discovery": { "deepinfra": "refreshable" }
211
- };
212
- //#endregion
213
- export { modelCatalog as t };