@openclaw/featherless-provider 0.0.0 → 2026.7.1-beta.5

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/README.md CHANGED
@@ -1,4 +1,12 @@
1
- # @openclaw/featherless-provider
1
+ # OpenClaw Featherless AI Provider
2
2
 
3
- Bootstrap reservation for the OpenClaw Featherless AI provider package. The
4
- production package is published by the OpenClaw release workflow.
3
+ Official OpenClaw provider plugin for Featherless AI's OpenAI-compatible API.
4
+
5
+ Install from OpenClaw:
6
+
7
+ ```bash
8
+ openclaw plugins install @openclaw/featherless-provider
9
+ openclaw gateway restart
10
+ ```
11
+
12
+ See <https://docs.openclaw.ai/providers/featherless> for setup and configuration.
package/dist/api.js ADDED
@@ -0,0 +1,4 @@
1
+ import { a as FEATHERLESS_DEFAULT_MODEL_REF, c as FEATHERLESS_DYNAMIC_MAX_TOKENS, i as FEATHERLESS_DEFAULT_MODEL_ID, l as buildFeatherlessCatalogModels, n as FEATHERLESS_DEFAULT_CONTEXT_WINDOW, r as FEATHERLESS_DEFAULT_MAX_TOKENS, s as FEATHERLESS_DYNAMIC_CONTEXT_WINDOW, t as FEATHERLESS_BASE_URL, u as isFeatherlessCatalogModelId } from "./models-BNULEvRK.js";
2
+ import { applyFeatherlessConfig } from "./onboard.js";
3
+ import { buildFeatherlessProvider } from "./provider-catalog.js";
4
+ export { FEATHERLESS_BASE_URL, FEATHERLESS_DEFAULT_CONTEXT_WINDOW, FEATHERLESS_DEFAULT_MAX_TOKENS, FEATHERLESS_DEFAULT_MODEL_ID, FEATHERLESS_DEFAULT_MODEL_REF, FEATHERLESS_DYNAMIC_CONTEXT_WINDOW, FEATHERLESS_DYNAMIC_MAX_TOKENS, applyFeatherlessConfig, buildFeatherlessCatalogModels, buildFeatherlessProvider, isFeatherlessCatalogModelId };
package/dist/index.js ADDED
@@ -0,0 +1,95 @@
1
+ import { a as FEATHERLESS_DEFAULT_MODEL_REF, o as FEATHERLESS_DYNAMIC_COMPAT, t as FEATHERLESS_BASE_URL, u as isFeatherlessCatalogModelId } from "./models-BNULEvRK.js";
2
+ import { applyFeatherlessConfig } from "./onboard.js";
3
+ import { buildFeatherlessProvider } from "./provider-catalog.js";
4
+ import { readConfiguredProviderCatalogEntries } from "openclaw/plugin-sdk/provider-catalog-shared";
5
+ import { defineSingleProviderPluginEntry } from "openclaw/plugin-sdk/provider-entry";
6
+ import { buildProviderReplayFamilyHooks, cloneFirstTemplateModel, normalizeModelCompat } from "openclaw/plugin-sdk/provider-model-shared";
7
+ import { buildProviderToolCompatFamilyHooks } from "openclaw/plugin-sdk/provider-tools";
8
+ //#region extensions/featherless/index.ts
9
+ const PROVIDER_ID = "featherless";
10
+ function resolveFeatherlessDynamicModel(ctx) {
11
+ const modelId = ctx.modelId.trim();
12
+ if (!modelId || isFeatherlessCatalogModelId(modelId)) return;
13
+ return cloneFirstTemplateModel({
14
+ providerId: PROVIDER_ID,
15
+ modelId,
16
+ templateIds: ["Qwen/Qwen3-32B"],
17
+ ctx,
18
+ patch: {
19
+ provider: PROVIDER_ID,
20
+ reasoning: false,
21
+ input: ["text"],
22
+ contextWindow: 4096,
23
+ maxTokens: 1024,
24
+ compat: FEATHERLESS_DYNAMIC_COMPAT
25
+ }
26
+ }) ?? normalizeModelCompat({
27
+ id: modelId,
28
+ name: modelId,
29
+ provider: PROVIDER_ID,
30
+ api: "openai-completions",
31
+ baseUrl: FEATHERLESS_BASE_URL,
32
+ reasoning: false,
33
+ input: ["text"],
34
+ cost: {
35
+ input: 0,
36
+ output: 0,
37
+ cacheRead: 0,
38
+ cacheWrite: 0
39
+ },
40
+ contextWindow: 4096,
41
+ maxTokens: 1024,
42
+ compat: FEATHERLESS_DYNAMIC_COMPAT
43
+ });
44
+ }
45
+ function normalizeFeatherlessResolvedModel(model) {
46
+ return {
47
+ ...model,
48
+ compat: {
49
+ ...FEATHERLESS_DYNAMIC_COMPAT,
50
+ ...model.compat
51
+ }
52
+ };
53
+ }
54
+ var featherless_default = defineSingleProviderPluginEntry({
55
+ id: PROVIDER_ID,
56
+ name: "Featherless AI Provider",
57
+ description: "Featherless AI provider plugin",
58
+ provider: {
59
+ label: "Featherless AI",
60
+ docsPath: "/providers/featherless",
61
+ envVars: ["FEATHERLESS_API_KEY"],
62
+ auth: [{
63
+ methodId: "api-key",
64
+ label: "Featherless AI API key",
65
+ hint: "OpenAI-compatible access to open models",
66
+ optionKey: "featherlessApiKey",
67
+ flagName: "--featherless-api-key",
68
+ envVar: "FEATHERLESS_API_KEY",
69
+ promptMessage: "Enter Featherless AI API key",
70
+ defaultModel: FEATHERLESS_DEFAULT_MODEL_REF,
71
+ applyConfig: (cfg) => applyFeatherlessConfig(cfg),
72
+ noteTitle: "Featherless AI",
73
+ noteMessage: ["Featherless AI serves open models through an OpenAI-compatible API.", "Create an API key at: https://featherless.ai/account/api-keys"].join("\n")
74
+ }],
75
+ catalog: {
76
+ buildProvider: buildFeatherlessProvider,
77
+ buildStaticProvider: buildFeatherlessProvider,
78
+ allowExplicitBaseUrl: true
79
+ },
80
+ augmentModelCatalog: ({ config }) => readConfiguredProviderCatalogEntries({
81
+ config,
82
+ providerId: PROVIDER_ID
83
+ }),
84
+ normalizeResolvedModel: ({ model }) => normalizeFeatherlessResolvedModel(model),
85
+ ...buildProviderReplayFamilyHooks({
86
+ family: "openai-compatible",
87
+ dropReasoningFromHistory: false
88
+ }),
89
+ ...buildProviderToolCompatFamilyHooks("openai"),
90
+ resolveDynamicModel: (ctx) => resolveFeatherlessDynamicModel(ctx),
91
+ isModernModelRef: () => true
92
+ }
93
+ });
94
+ //#endregion
95
+ export { featherless_default as default };
@@ -0,0 +1,63 @@
1
+ import { buildManifestModelProviderConfig } from "openclaw/plugin-sdk/provider-catalog-shared";
2
+ //#region extensions/featherless/openclaw.plugin.json
3
+ var modelCatalog = {
4
+ "providers": { "featherless": {
5
+ "baseUrl": "https://api.featherless.ai/v1",
6
+ "api": "openai-completions",
7
+ "models": [{
8
+ "id": "Qwen/Qwen3-32B",
9
+ "name": "Qwen3 32B",
10
+ "reasoning": true,
11
+ "input": ["text"],
12
+ "contextWindow": 32768,
13
+ "maxTokens": 4096,
14
+ "cost": {
15
+ "input": 0,
16
+ "output": 0,
17
+ "cacheRead": 0,
18
+ "cacheWrite": 0
19
+ },
20
+ "compat": {
21
+ "supportsStore": false,
22
+ "supportsDeveloperRole": false,
23
+ "supportsReasoningEffort": false,
24
+ "supportsUsageInStreaming": false,
25
+ "maxTokensField": "max_tokens",
26
+ "thinkingFormat": "qwen-chat-template",
27
+ "supportsStrictMode": false
28
+ }
29
+ }]
30
+ } },
31
+ "discovery": { "featherless": "static" }
32
+ };
33
+ //#endregion
34
+ //#region extensions/featherless/models.ts
35
+ const FEATHERLESS_MANIFEST_PROVIDER = buildManifestModelProviderConfig({
36
+ providerId: "featherless",
37
+ catalog: modelCatalog.providers.featherless
38
+ });
39
+ const FEATHERLESS_BASE_URL = FEATHERLESS_MANIFEST_PROVIDER.baseUrl;
40
+ const FEATHERLESS_DEFAULT_MODEL_ID = "Qwen/Qwen3-32B";
41
+ const FEATHERLESS_DEFAULT_MODEL_REF = `featherless/${FEATHERLESS_DEFAULT_MODEL_ID}`;
42
+ const FEATHERLESS_DYNAMIC_CONTEXT_WINDOW = 4096;
43
+ const FEATHERLESS_DYNAMIC_MAX_TOKENS = 1024;
44
+ function requireFeatherlessManifestModel(id) {
45
+ const model = FEATHERLESS_MANIFEST_PROVIDER.models.find((entry) => entry.id === id);
46
+ if (!model) throw new Error(`Missing Featherless modelCatalog row ${id}`);
47
+ return model;
48
+ }
49
+ const FEATHERLESS_DEFAULT_MODEL = requireFeatherlessManifestModel(FEATHERLESS_DEFAULT_MODEL_ID);
50
+ const FEATHERLESS_DEFAULT_CONTEXT_WINDOW = FEATHERLESS_DEFAULT_MODEL.contextWindow;
51
+ const FEATHERLESS_DEFAULT_MAX_TOKENS = FEATHERLESS_DEFAULT_MODEL.maxTokens;
52
+ const FEATHERLESS_DYNAMIC_COMPAT = {
53
+ ...FEATHERLESS_DEFAULT_MODEL.compat,
54
+ thinkingFormat: "openai"
55
+ };
56
+ function isFeatherlessCatalogModelId(modelId) {
57
+ return FEATHERLESS_MANIFEST_PROVIDER.models.some((model) => model.id === modelId);
58
+ }
59
+ function buildFeatherlessCatalogModels() {
60
+ return FEATHERLESS_MANIFEST_PROVIDER.models.map((model) => structuredClone(model));
61
+ }
62
+ //#endregion
63
+ export { FEATHERLESS_DEFAULT_MODEL_REF as a, FEATHERLESS_DYNAMIC_MAX_TOKENS as c, modelCatalog as d, FEATHERLESS_DEFAULT_MODEL_ID as i, buildFeatherlessCatalogModels as l, FEATHERLESS_DEFAULT_CONTEXT_WINDOW as n, FEATHERLESS_DYNAMIC_COMPAT as o, FEATHERLESS_DEFAULT_MAX_TOKENS as r, FEATHERLESS_DYNAMIC_CONTEXT_WINDOW as s, FEATHERLESS_BASE_URL as t, isFeatherlessCatalogModelId as u };
package/dist/models.js ADDED
@@ -0,0 +1,2 @@
1
+ import { a as FEATHERLESS_DEFAULT_MODEL_REF, c as FEATHERLESS_DYNAMIC_MAX_TOKENS, i as FEATHERLESS_DEFAULT_MODEL_ID, l as buildFeatherlessCatalogModels, n as FEATHERLESS_DEFAULT_CONTEXT_WINDOW, o as FEATHERLESS_DYNAMIC_COMPAT, r as FEATHERLESS_DEFAULT_MAX_TOKENS, s as FEATHERLESS_DYNAMIC_CONTEXT_WINDOW, t as FEATHERLESS_BASE_URL, u as isFeatherlessCatalogModelId } from "./models-BNULEvRK.js";
2
+ export { FEATHERLESS_BASE_URL, FEATHERLESS_DEFAULT_CONTEXT_WINDOW, FEATHERLESS_DEFAULT_MAX_TOKENS, FEATHERLESS_DEFAULT_MODEL_ID, FEATHERLESS_DEFAULT_MODEL_REF, FEATHERLESS_DYNAMIC_COMPAT, FEATHERLESS_DYNAMIC_CONTEXT_WINDOW, FEATHERLESS_DYNAMIC_MAX_TOKENS, buildFeatherlessCatalogModels, isFeatherlessCatalogModelId };
@@ -0,0 +1,21 @@
1
+ import { a as FEATHERLESS_DEFAULT_MODEL_REF, l as buildFeatherlessCatalogModels, t as FEATHERLESS_BASE_URL } from "./models-BNULEvRK.js";
2
+ import { createModelCatalogPresetAppliers } from "openclaw/plugin-sdk/provider-onboard";
3
+ //#region extensions/featherless/onboard.ts
4
+ const featherlessPresetAppliers = createModelCatalogPresetAppliers({
5
+ primaryModelRef: FEATHERLESS_DEFAULT_MODEL_REF,
6
+ resolveParams: (_cfg) => ({
7
+ providerId: "featherless",
8
+ api: "openai-completions",
9
+ baseUrl: FEATHERLESS_BASE_URL,
10
+ catalogModels: buildFeatherlessCatalogModels(),
11
+ aliases: [{
12
+ modelRef: FEATHERLESS_DEFAULT_MODEL_REF,
13
+ alias: "Qwen3 32B"
14
+ }]
15
+ })
16
+ });
17
+ function applyFeatherlessConfig(cfg) {
18
+ return featherlessPresetAppliers.applyConfig(cfg);
19
+ }
20
+ //#endregion
21
+ export { FEATHERLESS_DEFAULT_MODEL_REF, applyFeatherlessConfig };
@@ -0,0 +1,11 @@
1
+ import { c as FEATHERLESS_DYNAMIC_MAX_TOKENS, d as modelCatalog, i as FEATHERLESS_DEFAULT_MODEL_ID, n as FEATHERLESS_DEFAULT_CONTEXT_WINDOW, o as FEATHERLESS_DYNAMIC_COMPAT, r as FEATHERLESS_DEFAULT_MAX_TOKENS, s as FEATHERLESS_DYNAMIC_CONTEXT_WINDOW, t as FEATHERLESS_BASE_URL, u as isFeatherlessCatalogModelId } from "./models-BNULEvRK.js";
2
+ import { buildManifestModelProviderConfig } from "openclaw/plugin-sdk/provider-catalog-shared";
3
+ //#region extensions/featherless/provider-catalog.ts
4
+ function buildFeatherlessProvider() {
5
+ return buildManifestModelProviderConfig({
6
+ providerId: "featherless",
7
+ catalog: modelCatalog.providers.featherless
8
+ });
9
+ }
10
+ //#endregion
11
+ export { FEATHERLESS_BASE_URL, FEATHERLESS_DEFAULT_CONTEXT_WINDOW, FEATHERLESS_DEFAULT_MAX_TOKENS, FEATHERLESS_DEFAULT_MODEL_ID, FEATHERLESS_DYNAMIC_COMPAT, FEATHERLESS_DYNAMIC_CONTEXT_WINDOW, FEATHERLESS_DYNAMIC_MAX_TOKENS, buildFeatherlessProvider, isFeatherlessCatalogModelId };
@@ -0,0 +1,12 @@
1
+ {
2
+ "name": "@openclaw/featherless-provider",
3
+ "version": "2026.7.1-beta.5",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "@openclaw/featherless-provider",
9
+ "version": "2026.7.1-beta.5"
10
+ }
11
+ }
12
+ }
@@ -0,0 +1,83 @@
1
+ {
2
+ "id": "featherless",
3
+ "name": "Featherless AI",
4
+ "description": "OpenClaw Featherless AI provider plugin.",
5
+ "activation": {
6
+ "onStartup": false
7
+ },
8
+ "enabledByDefault": true,
9
+ "providers": ["featherless"],
10
+ "providerRequest": {
11
+ "providers": {
12
+ "featherless": {
13
+ "family": "featherless"
14
+ }
15
+ }
16
+ },
17
+ "setup": {
18
+ "providers": [
19
+ {
20
+ "id": "featherless",
21
+ "envVars": ["FEATHERLESS_API_KEY"]
22
+ }
23
+ ]
24
+ },
25
+ "providerAuthChoices": [
26
+ {
27
+ "provider": "featherless",
28
+ "method": "api-key",
29
+ "choiceId": "featherless-api-key",
30
+ "appGuidedSecret": true,
31
+ "choiceLabel": "Featherless AI API key",
32
+ "choiceHint": "OpenAI-compatible access to open models",
33
+ "groupId": "featherless",
34
+ "groupLabel": "Featherless AI",
35
+ "groupHint": "OpenAI-compatible access to open models",
36
+ "optionKey": "featherlessApiKey",
37
+ "cliFlag": "--featherless-api-key",
38
+ "cliOption": "--featherless-api-key <key>",
39
+ "cliDescription": "Featherless AI API key"
40
+ }
41
+ ],
42
+ "modelCatalog": {
43
+ "providers": {
44
+ "featherless": {
45
+ "baseUrl": "https://api.featherless.ai/v1",
46
+ "api": "openai-completions",
47
+ "models": [
48
+ {
49
+ "id": "Qwen/Qwen3-32B",
50
+ "name": "Qwen3 32B",
51
+ "reasoning": true,
52
+ "input": ["text"],
53
+ "contextWindow": 32768,
54
+ "maxTokens": 4096,
55
+ "cost": {
56
+ "input": 0,
57
+ "output": 0,
58
+ "cacheRead": 0,
59
+ "cacheWrite": 0
60
+ },
61
+ "compat": {
62
+ "supportsStore": false,
63
+ "supportsDeveloperRole": false,
64
+ "supportsReasoningEffort": false,
65
+ "supportsUsageInStreaming": false,
66
+ "maxTokensField": "max_tokens",
67
+ "thinkingFormat": "qwen-chat-template",
68
+ "supportsStrictMode": false
69
+ }
70
+ }
71
+ ]
72
+ }
73
+ },
74
+ "discovery": {
75
+ "featherless": "static"
76
+ }
77
+ },
78
+ "configSchema": {
79
+ "type": "object",
80
+ "additionalProperties": false,
81
+ "properties": {}
82
+ }
83
+ }
package/package.json CHANGED
@@ -1,12 +1,50 @@
1
1
  {
2
2
  "name": "@openclaw/featherless-provider",
3
- "version": "0.0.0",
4
- "description": "Bootstrap reservation for the OpenClaw Featherless AI provider package.",
5
- "license": "MIT",
3
+ "version": "2026.7.1-beta.5",
4
+ "description": "OpenClaw Featherless AI provider plugin.",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/openclaw/openclaw"
8
+ },
9
+ "type": "module",
10
+ "openclaw": {
11
+ "extensions": [
12
+ "./index.ts"
13
+ ],
14
+ "install": {
15
+ "clawhubSpec": "clawhub:@openclaw/featherless-provider",
16
+ "npmSpec": "@openclaw/featherless-provider",
17
+ "defaultChoice": "npm",
18
+ "minHostVersion": ">=2026.6.11"
19
+ },
20
+ "compat": {
21
+ "pluginApi": ">=2026.7.1-beta.5"
22
+ },
23
+ "build": {
24
+ "openclawVersion": "2026.7.1-beta.5",
25
+ "bundledDist": false
26
+ },
27
+ "release": {
28
+ "publishToClawHub": true,
29
+ "publishToNpm": true
30
+ },
31
+ "runtimeExtensions": [
32
+ "./dist/index.js"
33
+ ]
34
+ },
6
35
  "files": [
36
+ "dist/**",
37
+ "openclaw.plugin.json",
38
+ "npm-shrinkwrap.json",
7
39
  "README.md"
8
40
  ],
9
- "publishConfig": {
10
- "access": "public"
11
- }
41
+ "peerDependencies": {
42
+ "openclaw": ">=2026.7.1-beta.5"
43
+ },
44
+ "peerDependenciesMeta": {
45
+ "openclaw": {
46
+ "optional": true
47
+ }
48
+ },
49
+ "bundledDependencies": []
12
50
  }