@nevermined-io/openclaw-plugin 1.0.13 → 1.0.14
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/dist/config.d.ts +6 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -0
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -1
- package/dist/paid-endpoint.d.ts +20 -0
- package/dist/paid-endpoint.d.ts.map +1 -0
- package/dist/paid-endpoint.js +142 -0
- package/dist/paid-endpoint.js.map +1 -0
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +27 -2
- package/dist/tools.js.map +1 -1
- package/docs/commands.md +2 -0
- package/docs/getting-started.md +8 -3
- package/docs/guide.md +247 -0
- package/docs/setup.md +16 -7
- package/openclaw.plugin.json +10 -0
- package/package.json +1 -1
package/dist/config.d.ts
CHANGED
|
@@ -6,9 +6,13 @@ export declare const NeverminedPluginConfigSchema: z.ZodObject<{
|
|
|
6
6
|
planId: z.ZodOptional<z.ZodString>;
|
|
7
7
|
agentId: z.ZodOptional<z.ZodString>;
|
|
8
8
|
creditsPerRequest: z.ZodDefault<z.ZodNumber>;
|
|
9
|
+
enablePaidEndpoint: z.ZodDefault<z.ZodBoolean>;
|
|
10
|
+
agentEndpointPath: z.ZodDefault<z.ZodString>;
|
|
9
11
|
}, "strip", z.ZodTypeAny, {
|
|
10
12
|
environment: "sandbox" | "live";
|
|
11
13
|
creditsPerRequest: number;
|
|
14
|
+
enablePaidEndpoint: boolean;
|
|
15
|
+
agentEndpointPath: string;
|
|
12
16
|
nvmApiKey?: string | undefined;
|
|
13
17
|
planId?: string | undefined;
|
|
14
18
|
agentId?: string | undefined;
|
|
@@ -18,6 +22,8 @@ export declare const NeverminedPluginConfigSchema: z.ZodObject<{
|
|
|
18
22
|
planId?: string | undefined;
|
|
19
23
|
agentId?: string | undefined;
|
|
20
24
|
creditsPerRequest?: number | undefined;
|
|
25
|
+
enablePaidEndpoint?: boolean | undefined;
|
|
26
|
+
agentEndpointPath?: string | undefined;
|
|
21
27
|
}>;
|
|
22
28
|
export type NeverminedPluginConfig = z.infer<typeof NeverminedPluginConfigSchema>;
|
|
23
29
|
export declare function validateConfig(raw: unknown): NeverminedPluginConfig;
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAGlD,eAAO,MAAM,4BAA4B
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAGlD,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;EAQvC,CAAA;AAEF,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAA;AAEjF,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,sBAAsB,CAEnE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,sBAAsB,GAAG,MAAM,CAKpE;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,sBAAsB,GAAG,QAAQ,CAKjF"}
|
package/dist/config.js
CHANGED
|
@@ -6,6 +6,8 @@ export const NeverminedPluginConfigSchema = z.object({
|
|
|
6
6
|
planId: z.string().optional(),
|
|
7
7
|
agentId: z.string().optional(),
|
|
8
8
|
creditsPerRequest: z.number().int().positive().default(1),
|
|
9
|
+
enablePaidEndpoint: z.boolean().default(false),
|
|
10
|
+
agentEndpointPath: z.string().default('/nevermined/agent'),
|
|
9
11
|
});
|
|
10
12
|
export function validateConfig(raw) {
|
|
11
13
|
return NeverminedPluginConfigSchema.parse(raw);
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAGlD,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC,MAAM,CAAC;IACnD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;IAC3D,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAGlD,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC,MAAM,CAAC;IACnD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;IAC3D,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IACzD,kBAAkB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAC9C,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,mBAAmB,CAAC;CAC3D,CAAC,CAAA;AAIF,MAAM,UAAU,cAAc,CAAC,GAAY;IACzC,OAAO,4BAA4B,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;AAChD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAA8B;IAC1D,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAA;IACjF,CAAC;IACD,OAAO,MAAM,CAAC,SAAS,CAAA;AACzB,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,MAA8B;IACrE,OAAO,QAAQ,CAAC,WAAW,CAAC;QAC1B,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC;QAChC,WAAW,EAAE,MAAM,CAAC,WAA8B;KACnD,CAAC,CAAA;AACJ,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,24 @@
|
|
|
1
1
|
import { validateConfig, createPaymentsFromConfig, requireApiKey } from './config.js';
|
|
2
2
|
import { Payments } from '@nevermined-io/payments';
|
|
3
3
|
import type { NeverminedPluginConfig } from './config.js';
|
|
4
|
+
import type { AgentHandler } from './paid-endpoint.js';
|
|
4
5
|
export type { NeverminedPluginConfig };
|
|
6
|
+
export type { AgentHandler };
|
|
5
7
|
export { validateConfig, createPaymentsFromConfig, requireApiKey };
|
|
6
8
|
export { startLoginFlow, openBrowser } from './auth.js';
|
|
9
|
+
export { registerPaidEndpoint, mockWeatherHandler } from './paid-endpoint.js';
|
|
10
|
+
/**
|
|
11
|
+
* HTTP route handler signature used by OpenClaw's registerHttpRoute.
|
|
12
|
+
*/
|
|
13
|
+
export type HttpRouteHandler = (req: HttpIncomingMessage, res: HttpServerResponse) => void | Promise<void>;
|
|
14
|
+
export interface HttpIncomingMessage {
|
|
15
|
+
headers: Record<string, string | string[] | undefined>;
|
|
16
|
+
on(event: string, cb: (data?: unknown) => void): void;
|
|
17
|
+
}
|
|
18
|
+
export interface HttpServerResponse {
|
|
19
|
+
writeHead(statusCode: number, headers?: Record<string, string>): void;
|
|
20
|
+
end(body?: string): void;
|
|
21
|
+
}
|
|
7
22
|
/**
|
|
8
23
|
* Minimal subset of the OpenClaw Plugin API used by this plugin.
|
|
9
24
|
*/
|
|
@@ -28,6 +43,11 @@ export interface OpenClawPluginAPI {
|
|
|
28
43
|
handler: (ctx: CommandContext) => Promise<CommandResult> | CommandResult;
|
|
29
44
|
}): void;
|
|
30
45
|
registerGatewayMethod(method: string, handler: unknown): void;
|
|
46
|
+
registerHttpRoute?(route: {
|
|
47
|
+
path: string;
|
|
48
|
+
handler: HttpRouteHandler;
|
|
49
|
+
}): void;
|
|
50
|
+
on?(hookName: string, handler: (...args: unknown[]) => unknown): void;
|
|
31
51
|
}
|
|
32
52
|
export interface CommandContext {
|
|
33
53
|
senderId?: string;
|
|
@@ -42,6 +62,7 @@ export interface CommandResult {
|
|
|
42
62
|
}
|
|
43
63
|
export interface RegisterOptions {
|
|
44
64
|
paymentsFactory?: (config: NeverminedPluginConfig) => Payments;
|
|
65
|
+
agentHandler?: AgentHandler;
|
|
45
66
|
}
|
|
46
67
|
export interface ToolContext {
|
|
47
68
|
config?: Record<string, unknown>;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { validateConfig, createPaymentsFromConfig, requireApiKey } from './config.js';
|
|
2
2
|
import { createTools } from './tools.js';
|
|
3
3
|
import { startLoginFlow, looksLikeApiKey, getLoginUrl, getApiKeyUrl } from './auth.js';
|
|
4
|
+
import { registerPaidEndpoint } from './paid-endpoint.js';
|
|
4
5
|
export { validateConfig, createPaymentsFromConfig, requireApiKey };
|
|
5
6
|
export { startLoginFlow, openBrowser } from './auth.js';
|
|
7
|
+
export { registerPaidEndpoint, mockWeatherHandler } from './paid-endpoint.js';
|
|
6
8
|
/**
|
|
7
9
|
* OpenClaw plugin definition object.
|
|
8
10
|
* Exports id, name, description, and a register function.
|
|
@@ -37,6 +39,35 @@ const neverminedPlugin = {
|
|
|
37
39
|
];
|
|
38
40
|
api.registerTool((_ctx) => createTools(getPayments, config), { names: toolNames });
|
|
39
41
|
api.logger.info(`Registered ${toolNames.length} Nevermined payment tools`);
|
|
42
|
+
// --- Paid HTTP endpoint ---
|
|
43
|
+
if (config.enablePaidEndpoint && api.registerHttpRoute) {
|
|
44
|
+
registerPaidEndpoint(api, getPayments, config, options?.agentHandler);
|
|
45
|
+
}
|
|
46
|
+
// --- Credit balance injection into agent context ---
|
|
47
|
+
if (api.on) {
|
|
48
|
+
let cachedBalance = null;
|
|
49
|
+
const CACHE_TTL_MS = 60000;
|
|
50
|
+
api.on('before_prompt_build', async () => {
|
|
51
|
+
if (!config.nvmApiKey || !config.planId)
|
|
52
|
+
return undefined;
|
|
53
|
+
const now = Date.now();
|
|
54
|
+
if (cachedBalance && now - cachedBalance.fetchedAt < CACHE_TTL_MS) {
|
|
55
|
+
return { prependContext: formatBalanceContext(cachedBalance.balance, cachedBalance.planName) };
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
const result = await getPayments().plans.getPlanBalance(config.planId);
|
|
59
|
+
cachedBalance = {
|
|
60
|
+
balance: result.balance.toString(),
|
|
61
|
+
planName: result.planName ?? config.planId,
|
|
62
|
+
fetchedAt: now,
|
|
63
|
+
};
|
|
64
|
+
return { prependContext: formatBalanceContext(cachedBalance.balance, cachedBalance.planName) };
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
}
|
|
40
71
|
// --- Slash commands for chat channels ---
|
|
41
72
|
api.registerCommand({
|
|
42
73
|
name: 'nvm_login',
|
|
@@ -96,5 +127,10 @@ const neverminedPlugin = {
|
|
|
96
127
|
});
|
|
97
128
|
},
|
|
98
129
|
};
|
|
130
|
+
function formatBalanceContext(balance, planName) {
|
|
131
|
+
const num = Number(balance);
|
|
132
|
+
const warning = num > 0 && num <= 5 ? ' (LOW — consider ordering more credits)' : '';
|
|
133
|
+
return `[Nevermined] Credits remaining: ${balance} (plan: ${planName})${warning}`;
|
|
134
|
+
}
|
|
99
135
|
export default neverminedPlugin;
|
|
100
136
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AACrF,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Payments } from '@nevermined-io/payments';
|
|
2
|
+
import type { NeverminedPluginConfig } from './config.js';
|
|
3
|
+
import type { OpenClawPluginAPI } from './index.js';
|
|
4
|
+
export type AgentHandler = (body: {
|
|
5
|
+
prompt: string;
|
|
6
|
+
}) => Promise<unknown>;
|
|
7
|
+
/**
|
|
8
|
+
* Registers a paid HTTP endpoint on the OpenClaw gateway.
|
|
9
|
+
* The endpoint handles x402 payment verification, processes requests,
|
|
10
|
+
* and settles credits after successful processing.
|
|
11
|
+
*/
|
|
12
|
+
export declare function registerPaidEndpoint(api: OpenClawPluginAPI, getPayments: () => Payments, config: NeverminedPluginConfig, agentHandler?: AgentHandler): void;
|
|
13
|
+
/**
|
|
14
|
+
* Mock weather forecast handler for demonstration purposes.
|
|
15
|
+
* Returns simulated weather data based on the prompt.
|
|
16
|
+
*/
|
|
17
|
+
export declare function mockWeatherHandler(body: {
|
|
18
|
+
prompt: string;
|
|
19
|
+
}): Promise<unknown>;
|
|
20
|
+
//# sourceMappingURL=paid-endpoint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paid-endpoint.d.ts","sourceRoot":"","sources":["../src/paid-endpoint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAEvD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAoB,MAAM,YAAY,CAAA;AAErE,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;AAEzE;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,iBAAiB,EACtB,WAAW,EAAE,MAAM,QAAQ,EAC3B,MAAM,EAAE,sBAAsB,EAC9B,YAAY,CAAC,EAAE,YAAY,GAC1B,IAAI,CAoGN;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAUnF"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { buildPaymentRequired } from '@nevermined-io/payments';
|
|
2
|
+
/**
|
|
3
|
+
* Registers a paid HTTP endpoint on the OpenClaw gateway.
|
|
4
|
+
* The endpoint handles x402 payment verification, processes requests,
|
|
5
|
+
* and settles credits after successful processing.
|
|
6
|
+
*/
|
|
7
|
+
export function registerPaidEndpoint(api, getPayments, config, agentHandler) {
|
|
8
|
+
const path = config.agentEndpointPath ?? '/nevermined/agent';
|
|
9
|
+
const handler = agentHandler ?? mockWeatherHandler;
|
|
10
|
+
const routeHandler = async (req, res) => {
|
|
11
|
+
// 1. Extract payment signature
|
|
12
|
+
const accessToken = getHeader(req.headers, 'payment-signature') ??
|
|
13
|
+
getHeader(req.headers, 'PAYMENT-SIGNATURE');
|
|
14
|
+
if (!accessToken) {
|
|
15
|
+
res.writeHead(402, { 'Content-Type': 'application/json' });
|
|
16
|
+
res.end(JSON.stringify({ error: 'Payment required — missing payment-signature header' }));
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
// 2. Build payment required descriptor
|
|
20
|
+
const planId = config.planId;
|
|
21
|
+
if (!planId) {
|
|
22
|
+
res.writeHead(500, { 'Content-Type': 'application/json' });
|
|
23
|
+
res.end(JSON.stringify({ error: 'Server misconfigured — planId not set' }));
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const paymentRequired = buildPaymentRequired(planId, {
|
|
27
|
+
endpoint: path,
|
|
28
|
+
agentId: config.agentId,
|
|
29
|
+
httpVerb: 'POST',
|
|
30
|
+
});
|
|
31
|
+
const maxAmount = BigInt(config.creditsPerRequest ?? 1);
|
|
32
|
+
// 3. Verify permissions (check credits without burning)
|
|
33
|
+
try {
|
|
34
|
+
const verification = await getPayments().facilitator.verifyPermissions({
|
|
35
|
+
paymentRequired,
|
|
36
|
+
x402AccessToken: accessToken,
|
|
37
|
+
maxAmount,
|
|
38
|
+
});
|
|
39
|
+
if (!verification.isValid) {
|
|
40
|
+
res.writeHead(402, { 'Content-Type': 'application/json' });
|
|
41
|
+
res.end(JSON.stringify({
|
|
42
|
+
error: 'Insufficient credits — order the plan first',
|
|
43
|
+
details: verification,
|
|
44
|
+
}));
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
res.writeHead(402, { 'Content-Type': 'application/json' });
|
|
50
|
+
res.end(JSON.stringify({
|
|
51
|
+
error: 'Payment verification failed',
|
|
52
|
+
message: err instanceof Error ? err.message : String(err),
|
|
53
|
+
}));
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
// 4. Parse request body and process
|
|
57
|
+
const body = await parseBody(req);
|
|
58
|
+
const prompt = typeof body === 'object' && body !== null && 'prompt' in body
|
|
59
|
+
? body.prompt
|
|
60
|
+
: String(body);
|
|
61
|
+
let result;
|
|
62
|
+
try {
|
|
63
|
+
result = await handler({ prompt });
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
res.writeHead(500, { 'Content-Type': 'application/json' });
|
|
67
|
+
res.end(JSON.stringify({
|
|
68
|
+
error: 'Agent processing failed',
|
|
69
|
+
message: err instanceof Error ? err.message : String(err),
|
|
70
|
+
}));
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
// 5. Settle permissions (burn credits)
|
|
74
|
+
let settlement;
|
|
75
|
+
try {
|
|
76
|
+
settlement = await getPayments().facilitator.settlePermissions({
|
|
77
|
+
paymentRequired,
|
|
78
|
+
x402AccessToken: accessToken,
|
|
79
|
+
maxAmount,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
// Log settlement failure but still return the result — the agent already processed
|
|
84
|
+
api.logger.warn(`Credit settlement failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
85
|
+
settlement = { error: 'settlement_failed' };
|
|
86
|
+
}
|
|
87
|
+
// 6. Return response with payment-response header
|
|
88
|
+
const paymentResponse = Buffer.from(JSON.stringify(settlement)).toString('base64');
|
|
89
|
+
res.writeHead(200, {
|
|
90
|
+
'Content-Type': 'application/json',
|
|
91
|
+
'payment-response': paymentResponse,
|
|
92
|
+
});
|
|
93
|
+
res.end(JSON.stringify(result));
|
|
94
|
+
};
|
|
95
|
+
api.registerHttpRoute({ path, handler: routeHandler });
|
|
96
|
+
api.logger.info(`Registered paid endpoint at ${path}`);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Mock weather forecast handler for demonstration purposes.
|
|
100
|
+
* Returns simulated weather data based on the prompt.
|
|
101
|
+
*/
|
|
102
|
+
export async function mockWeatherHandler(body) {
|
|
103
|
+
const city = extractCity(body.prompt) ?? 'Unknown';
|
|
104
|
+
return {
|
|
105
|
+
city,
|
|
106
|
+
forecast: 'Partly cloudy with a chance of innovation',
|
|
107
|
+
temperature: Math.floor(Math.random() * 30) + 5,
|
|
108
|
+
unit: 'celsius',
|
|
109
|
+
humidity: Math.floor(Math.random() * 60) + 30,
|
|
110
|
+
source: 'Weather Oracle (Nevermined demo)',
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
function extractCity(prompt) {
|
|
114
|
+
// Simple heuristic: look for "in <City>" or "for <City>" patterns
|
|
115
|
+
// Use word boundary to avoid matching partial words
|
|
116
|
+
// Use a lookbehind for word boundary + space to avoid matching "at" inside "What"
|
|
117
|
+
const match = prompt.match(/(?:^|\s)(?:in|for|at)\s+([A-Z][a-zA-Z\s]{1,30}?)(?:\?|$|\.|\s*,)/);
|
|
118
|
+
return match ? match[1].trim() : undefined;
|
|
119
|
+
}
|
|
120
|
+
function getHeader(headers, name) {
|
|
121
|
+
const value = headers[name] ?? headers[name.toLowerCase()];
|
|
122
|
+
if (Array.isArray(value))
|
|
123
|
+
return value[0];
|
|
124
|
+
return value;
|
|
125
|
+
}
|
|
126
|
+
function parseBody(req) {
|
|
127
|
+
return new Promise((resolve, reject) => {
|
|
128
|
+
const chunks = [];
|
|
129
|
+
req.on('data', (chunk) => chunks.push(Buffer.from(chunk)));
|
|
130
|
+
req.on('end', () => {
|
|
131
|
+
const raw = Buffer.concat(chunks).toString('utf-8');
|
|
132
|
+
try {
|
|
133
|
+
resolve(raw ? JSON.parse(raw) : {});
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
resolve(raw);
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
req.on('error', reject);
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=paid-endpoint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paid-endpoint.js","sourceRoot":"","sources":["../src/paid-endpoint.ts"],"names":[],"mappings":"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"}
|
package/dist/tools.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AACvD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AACvD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAIzD;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,WAAW,EAAE,MAAM,QAAQ,EAC3B,MAAM,EAAE,sBAAsB,GAC7B,UAAU,EAAE,CAqQd;AAID,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACnC,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,UAAU,CAAC,CAAA;CAC/E;AAED,UAAU,UAAU;IAClB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC/C"}
|
package/dist/tools.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';
|
|
1
2
|
/**
|
|
2
3
|
* Creates all Nevermined payment tools for the OpenClaw plugin.
|
|
3
4
|
* Each tool is an object with { name, description, parameters, execute }
|
|
@@ -130,6 +131,7 @@ export function createTools(getPayments, config) {
|
|
|
130
131
|
priceAmounts: { type: 'string', description: 'Comma-separated price amounts in wei' },
|
|
131
132
|
priceReceivers: { type: 'string', description: 'Comma-separated receiver addresses' },
|
|
132
133
|
creditsAmount: { type: 'number', description: 'Number of credits in the plan' },
|
|
134
|
+
tokenAddress: { type: 'string', description: 'ERC20 token address (e.g. USDC). Omit for native token.' },
|
|
133
135
|
},
|
|
134
136
|
required: ['name', 'agentUrl', 'planName', 'priceAmounts', 'priceReceivers', 'creditsAmount'],
|
|
135
137
|
},
|
|
@@ -145,7 +147,18 @@ export function createTools(getPayments, config) {
|
|
|
145
147
|
.split(',')
|
|
146
148
|
.map((s) => s.trim());
|
|
147
149
|
const creditsAmount = Number(requireStr(params, 'creditsAmount'));
|
|
148
|
-
const
|
|
150
|
+
const tokenAddress = str(params, 'tokenAddress');
|
|
151
|
+
const priceConfig = {
|
|
152
|
+
amounts: priceAmounts,
|
|
153
|
+
receivers: priceReceivers,
|
|
154
|
+
isCrypto: true,
|
|
155
|
+
tokenAddress: tokenAddress ?? ZERO_ADDRESS,
|
|
156
|
+
contractAddress: ZERO_ADDRESS,
|
|
157
|
+
feeController: ZERO_ADDRESS,
|
|
158
|
+
externalPriceAddress: ZERO_ADDRESS,
|
|
159
|
+
templateAddress: ZERO_ADDRESS,
|
|
160
|
+
};
|
|
161
|
+
const res = await getPayments().agents.registerAgentAndPlan({ name, description }, { endpoints: [{ POST: agentUrl }], agentDefinitionUrl: agentUrl }, { name: planName }, priceConfig, {
|
|
149
162
|
isRedemptionAmountFixed: true,
|
|
150
163
|
redemptionType: 4,
|
|
151
164
|
proofRequired: false,
|
|
@@ -170,6 +183,7 @@ export function createTools(getPayments, config) {
|
|
|
170
183
|
priceReceivers: { type: 'string', description: 'Comma-separated receiver addresses' },
|
|
171
184
|
creditsAmount: { type: 'number', description: 'Number of credits in the plan' },
|
|
172
185
|
accessLimit: { type: 'string', description: '"credits" or "time" (default: credits)' },
|
|
186
|
+
tokenAddress: { type: 'string', description: 'ERC20 token address (e.g. USDC). Omit for native token.' },
|
|
173
187
|
},
|
|
174
188
|
required: ['name', 'priceAmounts', 'priceReceivers', 'creditsAmount'],
|
|
175
189
|
},
|
|
@@ -184,7 +198,18 @@ export function createTools(getPayments, config) {
|
|
|
184
198
|
.map((s) => s.trim());
|
|
185
199
|
const creditsAmount = Number(requireStr(params, 'creditsAmount'));
|
|
186
200
|
const accessLimit = (str(params, 'accessLimit') ?? 'credits');
|
|
187
|
-
const
|
|
201
|
+
const tokenAddress = str(params, 'tokenAddress');
|
|
202
|
+
const priceConfig = {
|
|
203
|
+
amounts: priceAmounts,
|
|
204
|
+
receivers: priceReceivers,
|
|
205
|
+
isCrypto: true,
|
|
206
|
+
tokenAddress: tokenAddress ?? ZERO_ADDRESS,
|
|
207
|
+
contractAddress: ZERO_ADDRESS,
|
|
208
|
+
feeController: ZERO_ADDRESS,
|
|
209
|
+
externalPriceAddress: ZERO_ADDRESS,
|
|
210
|
+
templateAddress: ZERO_ADDRESS,
|
|
211
|
+
};
|
|
212
|
+
const res = await getPayments().plans.registerPlan({ name, description, accessLimit }, priceConfig, {
|
|
188
213
|
isRedemptionAmountFixed: true,
|
|
189
214
|
redemptionType: 4,
|
|
190
215
|
proofRequired: false,
|
package/dist/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,MAAM,UAAU,WAAW,CACzB,WAA2B,EAC3B,MAA8B;IAE9B,OAAO;QACL,2BAA2B;QAC3B;YACE,IAAI,EAAE,yBAAyB;YAC/B,KAAK,EAAE,0BAA0B;YACjC,WAAW,EAAE,wDAAwD;YACrE,UAAU,EAAE;gBACV,IAAI,EAAE,QAAiB;gBACvB,UAAU,EAAE;oBACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sDAAsD,EAAE;iBAChG;aACF;YACD,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,MAA+B;gBACxD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,MAAM,CAAA;gBACrD,IAAI,CAAC,MAAM;oBAAE,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAA;gBAEtG,MAAM,OAAO,GAAG,MAAM,WAAW,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAA;gBAChE,OAAO,MAAM,CAAC;oBACZ,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ;oBAC1B,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE;oBACnC,YAAY,EAAE,OAAO,CAAC,YAAY;iBACnC,CAAC,CAAA;YACJ,CAAC;SACF;QAED;YACE,IAAI,EAAE,2BAA2B;YACjC,KAAK,EAAE,6BAA6B;YACpC,WAAW,EAAE,4EAA4E;YACzF,UAAU,EAAE;gBACV,IAAI,EAAE,QAAiB;gBACvB,UAAU,EAAE;oBACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,qBAAqB,EAAE;oBAC9D,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE;iBACzD;aACF;YACD,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,MAA+B;gBACxD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,MAAM,CAAA;gBACrD,IAAI,CAAC,MAAM;oBAAE,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAA;gBACtG,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAA;gBAExD,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;gBAC1E,OAAO,MAAM,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAA;YACnD,CAAC;SACF;QAED;YACE,IAAI,EAAE,sBAAsB;YAC5B,KAAK,EAAE,uBAAuB;YAC9B,WAAW,EAAE,4CAA4C;YACzD,UAAU,EAAE;gBACV,IAAI,EAAE,QAAiB;gBACvB,UAAU,EAAE;oBACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8BAA8B,EAAE;iBACxE;aACF;YACD,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,MAA+B;gBACxD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,MAAM,CAAA;gBACrD,IAAI,CAAC,MAAM;oBAAE,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAA;gBAEtG,MAAM,GAAG,GAAG,MAAM,WAAW,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;gBACvD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAA;YACpB,CAAC;SACF;QAED;YACE,IAAI,EAAE,uBAAuB;YAC7B,KAAK,EAAE,wBAAwB;YAC/B,WAAW,EACT,gIAAgI;YAClI,UAAU,EAAE;gBACV,IAAI,EAAE,QAAiB;gBACvB,UAAU,EAAE;oBACV,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+BAA+B,EAAE;oBAC1E,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,iCAAiC,EAAE;oBAC1E,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,qBAAqB,EAAE;oBAC9D,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE;oBACxD,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,6BAA6B,EAAE;iBACvE;gBACD,QAAQ,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC;aACjC;YACD,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,MAA+B;gBACxD,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;gBAC/C,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;gBAC3C,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,MAAM,CAAA;gBACrD,IAAI,CAAC,MAAM;oBAAE,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAA;gBACtG,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAA;gBACxD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAA;gBAE9C,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;gBAEpF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;oBACrC,MAAM;oBACN,OAAO,EAAE;wBACP,cAAc,EAAE,kBAAkB;wBAClC,mBAAmB,EAAE,WAAW;qBACjC;oBACD,IAAI,EAAE,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;iBAChE,CAAC,CAAA;gBAEF,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBAC5B,OAAO,MAAM,CAAC;wBACZ,KAAK,EAAE,2FAA2F;wBAClG,MAAM,EAAE,GAAG;qBACZ,CAAC,CAAA;gBACJ,CAAC;gBAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;oBACjB,OAAO,MAAM,CAAC;wBACZ,KAAK,EAAE,uBAAuB,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE;wBACvE,MAAM,EAAE,QAAQ,CAAC,MAAM;qBACxB,CAAC,CAAA;gBACJ,CAAC;gBAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;gBAClC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAA;YACrB,CAAC;SACF;QAED,wBAAwB;QAExB;YACE,IAAI,EAAE,0BAA0B;YAChC,KAAK,EAAE,2BAA2B;YAClC,WAAW,EAAE,uEAAuE;YACpF,UAAU,EAAE;gBACV,IAAI,EAAE,QAAiB;gBACvB,UAAU,EAAE;oBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE;oBACnD,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,mBAAmB,EAAE;oBACjE,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gCAAgC,EAAE;oBAC3E,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2BAA2B,EAAE;oBACtE,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sCAAsC,EAAE;oBACrF,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oCAAoC,EAAE;oBACrF,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+BAA+B,EAAE;
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
|
package/docs/commands.md
CHANGED
|
@@ -123,6 +123,7 @@ Register a new AI agent with an associated payment plan.
|
|
|
123
123
|
| `priceAmounts` | string | **Yes** | Comma-separated price amounts in wei |
|
|
124
124
|
| `priceReceivers` | string | **Yes** | Comma-separated receiver addresses |
|
|
125
125
|
| `creditsAmount` | number | **Yes** | Number of credits in the plan |
|
|
126
|
+
| `tokenAddress` | string | No | ERC20 token address (e.g. USDC). Omit for native token. |
|
|
126
127
|
|
|
127
128
|
**Returns:**
|
|
128
129
|
```json
|
|
@@ -147,6 +148,7 @@ Create a standalone payment plan (without an agent).
|
|
|
147
148
|
| `priceReceivers` | string | **Yes** | Comma-separated receiver addresses |
|
|
148
149
|
| `creditsAmount` | number | **Yes** | Number of credits in the plan |
|
|
149
150
|
| `accessLimit` | string | No | `"credits"` (default) or `"time"` |
|
|
151
|
+
| `tokenAddress` | string | No | ERC20 token address (e.g. USDC). Omit for native token. |
|
|
150
152
|
|
|
151
153
|
**Returns:**
|
|
152
154
|
```json
|
package/docs/getting-started.md
CHANGED
|
@@ -47,9 +47,14 @@ Add your API key directly to `openclaw.json`:
|
|
|
47
47
|
```json
|
|
48
48
|
{
|
|
49
49
|
"plugins": {
|
|
50
|
-
"
|
|
51
|
-
"
|
|
52
|
-
|
|
50
|
+
"entries": {
|
|
51
|
+
"nevermined": {
|
|
52
|
+
"enabled": true,
|
|
53
|
+
"config": {
|
|
54
|
+
"nvmApiKey": "sandbox:eyJhbG...",
|
|
55
|
+
"environment": "sandbox"
|
|
56
|
+
}
|
|
57
|
+
}
|
|
53
58
|
}
|
|
54
59
|
}
|
|
55
60
|
}
|
package/docs/guide.md
ADDED
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Building a Paid AI Agent with OpenClaw and Nevermined"
|
|
3
|
+
description: "Step-by-step guide to building, monetizing, and querying a paid AI agent using the Nevermined OpenClaw plugin"
|
|
4
|
+
icon: "book-open"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Building a Paid AI Agent with OpenClaw and Nevermined
|
|
8
|
+
|
|
9
|
+
The Nevermined OpenClaw plugin lets you monetize AI agents directly from chat channels. Subscribers pay per-request using the [x402 payment protocol](https://docs.nevermined.app/docs/api-reference/typescript/x402-protocol), and builders collect revenue automatically through on-chain payment plans.
|
|
10
|
+
|
|
11
|
+
This guide walks through building a **Weather Oracle** — a paid agent that serves weather forecasts and charges 1 credit per request.
|
|
12
|
+
|
|
13
|
+
## What You Get
|
|
14
|
+
|
|
15
|
+
The plugin adds 7 payment tools and 2 slash commands to your OpenClaw gateway:
|
|
16
|
+
|
|
17
|
+
**Subscriber tools** — for users who consume paid services:
|
|
18
|
+
|
|
19
|
+
| Tool | Purpose |
|
|
20
|
+
|------|---------|
|
|
21
|
+
| `nevermined_checkBalance` | Check remaining credits on a plan |
|
|
22
|
+
| `nevermined_getAccessToken` | Get an x402 token for authenticating requests |
|
|
23
|
+
| `nevermined_orderPlan` | Purchase a payment plan |
|
|
24
|
+
| `nevermined_queryAgent` | Send a paid query to an agent (end-to-end) |
|
|
25
|
+
|
|
26
|
+
**Builder tools** — for developers who create paid services:
|
|
27
|
+
|
|
28
|
+
| Tool | Purpose |
|
|
29
|
+
|------|---------|
|
|
30
|
+
| `nevermined_registerAgent` | Register an agent with a payment plan |
|
|
31
|
+
| `nevermined_createPlan` | Create a standalone payment plan |
|
|
32
|
+
| `nevermined_listPlans` | List your payment plans |
|
|
33
|
+
|
|
34
|
+
**Slash commands**: `/nvm_login` and `/nvm_logout` for authentication.
|
|
35
|
+
|
|
36
|
+
**Paid HTTP endpoint**: An x402-compatible endpoint on the gateway that handles payment verification, request processing, and credit settlement automatically.
|
|
37
|
+
|
|
38
|
+
## Prerequisites
|
|
39
|
+
|
|
40
|
+
- An [OpenClaw](https://openclaw.ai) gateway instance (v2026.2+)
|
|
41
|
+
- Node.js >= 18
|
|
42
|
+
- A [Nevermined account](https://nevermined.app) with an API key
|
|
43
|
+
|
|
44
|
+
## Step 1: Install the Plugin
|
|
45
|
+
|
|
46
|
+
From your OpenClaw gateway server:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
openclaw plugin install @nevermined-io/openclaw-plugin
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Or install manually by placing the package in `~/.openclaw/extensions/nevermined/`.
|
|
53
|
+
|
|
54
|
+
After installation, restart the gateway:
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
openclaw gateway restart
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
You should see in the logs:
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
Registered 7 Nevermined payment tools
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Step 2: Authenticate
|
|
67
|
+
|
|
68
|
+
Send `/nvm_login` from any connected chat channel (Telegram, Discord, etc.). The plugin supports two flows:
|
|
69
|
+
|
|
70
|
+
**Browser login** (if your server has a display):
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
/nvm_login
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
A browser window opens for Nevermined authentication. The API key is captured automatically.
|
|
77
|
+
|
|
78
|
+
**Manual login** (headless servers):
|
|
79
|
+
|
|
80
|
+
```
|
|
81
|
+
/nvm_login sandbox:eyJhbGciOiJFUzI1NksifQ...
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Paste your API key directly. Get one from [Nevermined App](https://nevermined.app) under Settings > API Keys.
|
|
85
|
+
|
|
86
|
+
Use `sandbox` for testing, `live` for production.
|
|
87
|
+
|
|
88
|
+
## Step 3: Register Your Agent and Payment Plan
|
|
89
|
+
|
|
90
|
+
Ask your Claw to register an agent. In any chat channel, send a message like:
|
|
91
|
+
|
|
92
|
+
> Register a Nevermined agent called "Weather Oracle" at URL `https://my-gateway.example.com/nevermined/agent` with a plan named "Weather Forecast" priced at 1000000 (1 USDC) to address `0xYourWalletAddress` with token `0x036CbD53842c5426634e7929541eC2318f3dCF7e` granting 5 credits.
|
|
93
|
+
|
|
94
|
+
The agent will call `nevermined_registerAgent` with these parameters:
|
|
95
|
+
|
|
96
|
+
| Parameter | Value | Description |
|
|
97
|
+
|-----------|-------|-------------|
|
|
98
|
+
| `name` | Weather Oracle | Display name on Nevermined |
|
|
99
|
+
| `agentUrl` | `https://my-gateway.example.com/nevermined/agent` | Public URL of your paid endpoint |
|
|
100
|
+
| `planName` | Weather Forecast | Name for the payment plan |
|
|
101
|
+
| `priceAmounts` | `1000000` | Price in token units (1 USDC = 1,000,000 wei) |
|
|
102
|
+
| `priceReceivers` | `0xYourWalletAddress` | Your wallet that receives payments |
|
|
103
|
+
| `creditsAmount` | `5` | Credits granted per purchase |
|
|
104
|
+
| `tokenAddress` | `0x036CbD53842c5426634e7929541eC2318f3dCF7e` | USDC on Base Sepolia. Omit for native token. |
|
|
105
|
+
|
|
106
|
+
The tool returns the `agentId` and `planId` — save these for the next step.
|
|
107
|
+
|
|
108
|
+
## Step 4: Enable the Paid Endpoint
|
|
109
|
+
|
|
110
|
+
Add the returned IDs and enable the paid endpoint in your gateway config (`~/.openclaw/openclaw.json`):
|
|
111
|
+
|
|
112
|
+
```json
|
|
113
|
+
{
|
|
114
|
+
"plugins": {
|
|
115
|
+
"entries": {
|
|
116
|
+
"nevermined": {
|
|
117
|
+
"enabled": true,
|
|
118
|
+
"config": {
|
|
119
|
+
"nvmApiKey": "sandbox:eyJhbG...",
|
|
120
|
+
"environment": "sandbox",
|
|
121
|
+
"planId": "<your-plan-id>",
|
|
122
|
+
"agentId": "<your-agent-id>",
|
|
123
|
+
"enablePaidEndpoint": true,
|
|
124
|
+
"agentEndpointPath": "/nevermined/agent",
|
|
125
|
+
"creditsPerRequest": 1
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Restart the gateway. You should see:
|
|
134
|
+
|
|
135
|
+
```
|
|
136
|
+
Registered 7 Nevermined payment tools
|
|
137
|
+
Registered paid endpoint at /nevermined/agent
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
The paid endpoint handles the full x402 lifecycle:
|
|
141
|
+
|
|
142
|
+
1. Extracts the `payment-signature` header from incoming requests
|
|
143
|
+
2. Calls `verifyPermissions` to check the subscriber has credits
|
|
144
|
+
3. Processes the request (runs your agent handler)
|
|
145
|
+
4. Calls `settlePermissions` to burn credits
|
|
146
|
+
5. Returns the response with a `payment-response` header
|
|
147
|
+
|
|
148
|
+
### Configuration Reference
|
|
149
|
+
|
|
150
|
+
| Field | Required | Default | Description |
|
|
151
|
+
|-------|----------|---------|-------------|
|
|
152
|
+
| `nvmApiKey` | No | — | API key (set via `/nvm_login` or config) |
|
|
153
|
+
| `environment` | No | `sandbox` | `sandbox` for testing, `live` for production |
|
|
154
|
+
| `planId` | No | — | Default plan ID for tools and the paid endpoint |
|
|
155
|
+
| `agentId` | No | — | Default agent ID |
|
|
156
|
+
| `creditsPerRequest` | No | `1` | Credits burned per request |
|
|
157
|
+
| `enablePaidEndpoint` | No | `false` | Enable the x402 paid HTTP endpoint |
|
|
158
|
+
| `agentEndpointPath` | No | `/nevermined/agent` | Path for the paid endpoint |
|
|
159
|
+
|
|
160
|
+
## Step 5: Test as a Subscriber
|
|
161
|
+
|
|
162
|
+
From the same gateway (or a different one with a subscriber API key), test the full flow:
|
|
163
|
+
|
|
164
|
+
### Order the plan
|
|
165
|
+
|
|
166
|
+
> Order the Weather Oracle plan `<plan-id>`
|
|
167
|
+
|
|
168
|
+
The Claw calls `nevermined_orderPlan`. You receive 5 credits.
|
|
169
|
+
|
|
170
|
+
### Check your balance
|
|
171
|
+
|
|
172
|
+
> Check my Nevermined balance for plan `<plan-id>`
|
|
173
|
+
|
|
174
|
+
Should show 5 credits.
|
|
175
|
+
|
|
176
|
+
### Query the agent
|
|
177
|
+
|
|
178
|
+
> Ask the Weather Oracle at `http://localhost:18789/nevermined/agent` about the weather in Barcelona
|
|
179
|
+
|
|
180
|
+
The Claw calls `nevermined_queryAgent`, which:
|
|
181
|
+
1. Acquires an x402 access token
|
|
182
|
+
2. Sends the prompt with a `PAYMENT-SIGNATURE` header
|
|
183
|
+
3. The paid endpoint verifies, processes, and settles
|
|
184
|
+
4. Returns the weather forecast
|
|
185
|
+
|
|
186
|
+
### Verify credit burn
|
|
187
|
+
|
|
188
|
+
> Check my balance again
|
|
189
|
+
|
|
190
|
+
Should show 4 credits — one was consumed.
|
|
191
|
+
|
|
192
|
+
## Custom Agent Handlers
|
|
193
|
+
|
|
194
|
+
The plugin includes a mock weather handler for demonstration. To use your own logic, pass a custom `agentHandler` when registering the plugin:
|
|
195
|
+
|
|
196
|
+
```typescript
|
|
197
|
+
import neverminedPlugin from '@nevermined-io/openclaw-plugin'
|
|
198
|
+
|
|
199
|
+
neverminedPlugin.register(api, {
|
|
200
|
+
agentHandler: async (body) => {
|
|
201
|
+
const response = await myAIModel.generate(body.prompt)
|
|
202
|
+
return { result: response }
|
|
203
|
+
},
|
|
204
|
+
})
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
The handler receives `{ prompt: string }` and returns any JSON-serializable object.
|
|
208
|
+
|
|
209
|
+
## Credit Balance Awareness
|
|
210
|
+
|
|
211
|
+
When the plugin is authenticated and a `planId` is configured, it automatically injects the current credit balance into the agent's context before each prompt. This means your Claw can proactively warn users when credits are running low:
|
|
212
|
+
|
|
213
|
+
> "You have 2 credits remaining on the Weather Forecast plan. Consider ordering more credits."
|
|
214
|
+
|
|
215
|
+
The balance is cached for 60 seconds to avoid excessive API calls.
|
|
216
|
+
|
|
217
|
+
## How It Works
|
|
218
|
+
|
|
219
|
+
The plugin implements the [x402 payment protocol](https://docs.nevermined.app/docs/api-reference/typescript/x402-protocol) for agent-to-agent payments:
|
|
220
|
+
|
|
221
|
+
```
|
|
222
|
+
Subscriber Claw Builder Claw (Gateway)
|
|
223
|
+
│ │
|
|
224
|
+
│ 1. getX402AccessToken(planId) │
|
|
225
|
+
│─────────────────────────────────────>│ Nevermined API
|
|
226
|
+
│<─────────────────────────────────────│ returns token
|
|
227
|
+
│ │
|
|
228
|
+
│ 2. POST /nevermined/agent │
|
|
229
|
+
│ Header: payment-signature: token │
|
|
230
|
+
│ Body: { prompt: "..." } │
|
|
231
|
+
│─────────────────────────────────────>│
|
|
232
|
+
│ │ 3. verifyPermissions()
|
|
233
|
+
│ │ 4. Process request
|
|
234
|
+
│ │ 5. settlePermissions()
|
|
235
|
+
│ 6. Response + payment-response hdr │
|
|
236
|
+
│<─────────────────────────────────────│
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
Credits are managed on-chain through the Nevermined Protocol. The `verifyPermissions` step checks the subscriber's balance without burning credits, and `settlePermissions` burns them only after successful processing.
|
|
240
|
+
|
|
241
|
+
## Next Steps
|
|
242
|
+
|
|
243
|
+
- [Commands Reference](./commands) — full parameter documentation for all tools
|
|
244
|
+
- [Setup Reference](./setup) — detailed configuration options
|
|
245
|
+
- [Nevermined Docs](https://docs.nevermined.app) — platform documentation
|
|
246
|
+
- [x402 Protocol](https://docs.nevermined.app/docs/api-reference/typescript/x402-protocol) — payment protocol specification
|
|
247
|
+
- [OpenClaw Plugin Development](https://docs.openclaw.ai/tools/plugin) — building OpenClaw plugins
|
package/docs/setup.md
CHANGED
|
@@ -13,12 +13,19 @@ The plugin reads its configuration from the `plugins.nevermined` section of your
|
|
|
13
13
|
```json
|
|
14
14
|
{
|
|
15
15
|
"plugins": {
|
|
16
|
-
"
|
|
17
|
-
"
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
16
|
+
"entries": {
|
|
17
|
+
"nevermined": {
|
|
18
|
+
"enabled": true,
|
|
19
|
+
"config": {
|
|
20
|
+
"nvmApiKey": "sandbox:eyJhbG...",
|
|
21
|
+
"environment": "sandbox",
|
|
22
|
+
"planId": "did:nv:abc123...",
|
|
23
|
+
"agentId": "did:nv:def456...",
|
|
24
|
+
"creditsPerRequest": 1,
|
|
25
|
+
"enablePaidEndpoint": false,
|
|
26
|
+
"agentEndpointPath": "/nevermined/agent"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
22
29
|
}
|
|
23
30
|
}
|
|
24
31
|
}
|
|
@@ -28,11 +35,13 @@ The plugin reads its configuration from the `plugins.nevermined` section of your
|
|
|
28
35
|
|
|
29
36
|
| Field | Required | Default | Description |
|
|
30
37
|
|-------|----------|---------|-------------|
|
|
31
|
-
| `nvmApiKey` | No | — | Your Nevermined API key. Can be set via `/
|
|
38
|
+
| `nvmApiKey` | No | — | Your Nevermined API key. Can be set via `/nvm_login` instead. |
|
|
32
39
|
| `environment` | No | `sandbox` | Target environment: `sandbox` for testing, `live` for production. |
|
|
33
40
|
| `planId` | No | — | Default payment plan ID. When set, subscriber tools use this plan automatically. |
|
|
34
41
|
| `agentId` | No | — | Default agent ID. Required for plans with multiple agents. |
|
|
35
42
|
| `creditsPerRequest` | No | `1` | Number of credits consumed per request. |
|
|
43
|
+
| `enablePaidEndpoint` | No | `false` | Enable the x402 paid HTTP endpoint on the gateway. |
|
|
44
|
+
| `agentEndpointPath` | No | `/nevermined/agent` | HTTP path for the paid agent endpoint. |
|
|
36
45
|
|
|
37
46
|
### Environment Details
|
|
38
47
|
|
package/openclaw.plugin.json
CHANGED
|
@@ -28,6 +28,16 @@
|
|
|
28
28
|
"type": "number",
|
|
29
29
|
"default": 1,
|
|
30
30
|
"description": "Number of credits consumed per request"
|
|
31
|
+
},
|
|
32
|
+
"enablePaidEndpoint": {
|
|
33
|
+
"type": "boolean",
|
|
34
|
+
"default": false,
|
|
35
|
+
"description": "Enable the paid HTTP endpoint on the gateway for receiving paid queries"
|
|
36
|
+
},
|
|
37
|
+
"agentEndpointPath": {
|
|
38
|
+
"type": "string",
|
|
39
|
+
"default": "/nevermined/agent",
|
|
40
|
+
"description": "HTTP path for the paid agent endpoint"
|
|
31
41
|
}
|
|
32
42
|
}
|
|
33
43
|
}
|
package/package.json
CHANGED