@skillzmarket/sdk 0.1.2 → 0.1.3
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 +143 -14
- package/dist/bin/init.js +0 -0
- package/dist/creator/init.d.ts.map +1 -1
- package/dist/creator/init.js +55 -11
- package/dist/creator/init.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -10,6 +10,7 @@ SDK for discovering and calling paid AI skills with automatic x402 crypto paymen
|
|
|
10
10
|
- **Discover skills** - Search and explore the Skillz Market registry
|
|
11
11
|
- **Automatic payments** - x402 protocol handles USDC payments seamlessly
|
|
12
12
|
- **Create skills** - Monetize your AI services with zero crypto knowledge
|
|
13
|
+
- **Simple auth** - API key authentication (no wallet signing on each start)
|
|
13
14
|
- **Type-safe** - Full TypeScript support with comprehensive types
|
|
14
15
|
- **Base network** - Fast, low-cost transactions on Base mainnet
|
|
15
16
|
|
|
@@ -23,22 +24,44 @@ pnpm add @skillzmarket/sdk viem
|
|
|
23
24
|
|
|
24
25
|
## Quick Start
|
|
25
26
|
|
|
26
|
-
###
|
|
27
|
+
### Creator: Monetize Your Skills
|
|
27
28
|
|
|
28
|
-
|
|
29
|
-
import { SkillzMarket } from '@skillzmarket/sdk';
|
|
29
|
+
The fastest way to get started is with the interactive setup:
|
|
30
30
|
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
```bash
|
|
32
|
+
npx @skillzmarket/sdk init
|
|
33
33
|
```
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
This will:
|
|
36
|
+
1. Guide you through getting an API key from the dashboard
|
|
37
|
+
2. Configure your wallet address for receiving payments
|
|
38
|
+
3. Save configuration to `.env`
|
|
39
|
+
|
|
40
|
+
Then create your skills:
|
|
36
41
|
|
|
37
42
|
```typescript
|
|
38
43
|
import { skill, serve } from '@skillzmarket/sdk/creator';
|
|
39
44
|
|
|
40
|
-
const echo = skill({
|
|
41
|
-
|
|
45
|
+
const echo = skill({
|
|
46
|
+
price: '$0.001',
|
|
47
|
+
description: 'Echoes input back',
|
|
48
|
+
}, async (input) => ({ echo: input }));
|
|
49
|
+
|
|
50
|
+
serve({ echo }, {
|
|
51
|
+
register: {
|
|
52
|
+
endpoint: 'https://your-server.com',
|
|
53
|
+
enabled: true,
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Consumer: Call Paid Skills
|
|
59
|
+
|
|
60
|
+
```typescript
|
|
61
|
+
import { SkillzMarket } from '@skillzmarket/sdk';
|
|
62
|
+
|
|
63
|
+
const market = new SkillzMarket({ wallet: '0x...' });
|
|
64
|
+
const result = await market.call('text-to-image', { prompt: 'A sunset' });
|
|
42
65
|
```
|
|
43
66
|
|
|
44
67
|
## Documentation
|
|
@@ -145,6 +168,37 @@ Payments use the [x402 protocol](https://x402.org):
|
|
|
145
168
|
|
|
146
169
|
The creator API lets you monetize your AI skills.
|
|
147
170
|
|
|
171
|
+
### Getting Started
|
|
172
|
+
|
|
173
|
+
#### 1. Interactive Setup (Recommended)
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
npx @skillzmarket/sdk init
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
This guides you through:
|
|
180
|
+
- Getting an API key from [skillz.market/dashboard](https://skillz.market/dashboard)
|
|
181
|
+
- Configuring your wallet address
|
|
182
|
+
- Saving to `.env`
|
|
183
|
+
|
|
184
|
+
#### 2. Manual Setup
|
|
185
|
+
|
|
186
|
+
Set environment variables:
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
export SKILLZ_API_KEY="sk_..." # API key from dashboard
|
|
190
|
+
export SKILLZ_WALLET_ADDRESS="0x..." # Your wallet address
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
Or pass them directly:
|
|
194
|
+
|
|
195
|
+
```typescript
|
|
196
|
+
serve({ echo }, {
|
|
197
|
+
apiKey: 'sk_...',
|
|
198
|
+
wallet: '0x...',
|
|
199
|
+
});
|
|
200
|
+
```
|
|
201
|
+
|
|
148
202
|
### Functions
|
|
149
203
|
|
|
150
204
|
| Function | Description |
|
|
@@ -152,6 +206,8 @@ The creator API lets you monetize your AI skills.
|
|
|
152
206
|
| `skill(options, handler)` | Define a monetized skill |
|
|
153
207
|
| `serve(skills, options?)` | Start the skill server |
|
|
154
208
|
| `register(skills, options)` | Register skills with marketplace |
|
|
209
|
+
| `init()` | Interactive CLI setup |
|
|
210
|
+
| `checkConfig()` | Validate SDK configuration |
|
|
155
211
|
|
|
156
212
|
### Example
|
|
157
213
|
|
|
@@ -189,6 +245,45 @@ serve({ summarize, translate }, {
|
|
|
189
245
|
});
|
|
190
246
|
```
|
|
191
247
|
|
|
248
|
+
### Configuration Helpers
|
|
249
|
+
|
|
250
|
+
#### init()
|
|
251
|
+
|
|
252
|
+
Interactive CLI setup that guides you through configuration:
|
|
253
|
+
|
|
254
|
+
```typescript
|
|
255
|
+
import { init } from '@skillzmarket/sdk/creator';
|
|
256
|
+
|
|
257
|
+
await init();
|
|
258
|
+
// Prompts for API key, wallet address, saves to .env
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
Or run directly:
|
|
262
|
+
|
|
263
|
+
```bash
|
|
264
|
+
npx @skillzmarket/sdk init
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
#### checkConfig()
|
|
268
|
+
|
|
269
|
+
Validate that required configuration is present:
|
|
270
|
+
|
|
271
|
+
```typescript
|
|
272
|
+
import { checkConfig } from '@skillzmarket/sdk/creator';
|
|
273
|
+
|
|
274
|
+
const config = checkConfig();
|
|
275
|
+
|
|
276
|
+
if (!config.configured) {
|
|
277
|
+
console.error('Configuration issues:');
|
|
278
|
+
config.issues.forEach(issue => console.error(` - ${issue}`));
|
|
279
|
+
process.exit(1);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
// config.apiKey - boolean, true if SKILLZ_API_KEY is valid
|
|
283
|
+
// config.walletAddress - boolean, true if wallet is configured
|
|
284
|
+
// config.issues - string[], list of configuration problems
|
|
285
|
+
```
|
|
286
|
+
|
|
192
287
|
### Price Formats
|
|
193
288
|
|
|
194
289
|
Creators can specify prices in multiple formats:
|
|
@@ -216,7 +311,10 @@ interface SkillOptions {
|
|
|
216
311
|
```typescript
|
|
217
312
|
interface ServeOptions {
|
|
218
313
|
port?: number; // Port to listen on (default: 3002)
|
|
219
|
-
wallet?:
|
|
314
|
+
wallet?: string; // Wallet address (42-char) or private key (66-char)
|
|
315
|
+
// Falls back to SKILLZ_WALLET_ADDRESS or SKILLZ_WALLET_KEY env
|
|
316
|
+
apiKey?: string; // API key for registration
|
|
317
|
+
// Falls back to SKILLZ_API_KEY env
|
|
220
318
|
network?: string; // Network (default: 'eip155:8453')
|
|
221
319
|
register?: {
|
|
222
320
|
endpoint: string; // Your public server URL
|
|
@@ -230,13 +328,30 @@ interface ServeOptions {
|
|
|
230
328
|
|
|
231
329
|
---
|
|
232
330
|
|
|
331
|
+
## Authentication Flow
|
|
332
|
+
|
|
333
|
+
The SDK uses API key authentication for skill registration:
|
|
334
|
+
|
|
335
|
+
1. **One-time setup**: Sign with your wallet on [skillz.market/dashboard](https://skillz.market/dashboard) to create your account
|
|
336
|
+
2. **Get API key**: Create an API key in the dashboard's "API Keys" section
|
|
337
|
+
3. **Use in SDK**: The API key authenticates registration requests - no signing required
|
|
338
|
+
|
|
339
|
+
Benefits over wallet signing on every start:
|
|
340
|
+
- No private key needed in your skill server
|
|
341
|
+
- Can rotate/revoke keys without changing wallet
|
|
342
|
+
- Same security (wallet verified at account creation)
|
|
343
|
+
|
|
344
|
+
---
|
|
345
|
+
|
|
233
346
|
## Environment Variables
|
|
234
347
|
|
|
235
348
|
| Variable | Description | Required |
|
|
236
349
|
|----------|-------------|----------|
|
|
237
|
-
| `
|
|
350
|
+
| `SKILLZ_API_KEY` | API key for registration | Yes (creator) |
|
|
351
|
+
| `SKILLZ_WALLET_ADDRESS` | Wallet address for receiving payments | Yes (creator) |
|
|
352
|
+
| `SKILLZ_WALLET_KEY` | Private key (legacy, address is derived) | No* |
|
|
238
353
|
|
|
239
|
-
|
|
354
|
+
*`SKILLZ_WALLET_KEY` is supported for backwards compatibility but `SKILLZ_WALLET_ADDRESS` is preferred since you don't need the private key for serving skills.
|
|
240
355
|
|
|
241
356
|
## Security Considerations
|
|
242
357
|
|
|
@@ -246,9 +361,16 @@ All API URLs must use HTTPS. The SDK rejects HTTP URLs (except localhost for dev
|
|
|
246
361
|
|
|
247
362
|
### Wallet Security
|
|
248
363
|
|
|
249
|
-
|
|
250
|
-
-
|
|
251
|
-
-
|
|
364
|
+
With API key authentication, your skill server only needs a wallet **address** (not private key) for receiving payments. The private key is only used when:
|
|
365
|
+
- Creating your account (one-time signature in dashboard)
|
|
366
|
+
- Making payments as a consumer
|
|
367
|
+
|
|
368
|
+
### API Key Security
|
|
369
|
+
|
|
370
|
+
- Store API keys securely (environment variables, secrets manager)
|
|
371
|
+
- Never commit API keys to source control
|
|
372
|
+
- Rotate keys if compromised via the dashboard
|
|
373
|
+
- Use separate keys for development/production
|
|
252
374
|
|
|
253
375
|
### Error Handling
|
|
254
376
|
|
|
@@ -299,6 +421,13 @@ interface ParsedPrice {
|
|
|
299
421
|
amount: string;
|
|
300
422
|
currency: 'USDC';
|
|
301
423
|
}
|
|
424
|
+
|
|
425
|
+
interface RegistrationResult {
|
|
426
|
+
name: string;
|
|
427
|
+
success: boolean;
|
|
428
|
+
slug?: string;
|
|
429
|
+
error?: string;
|
|
430
|
+
}
|
|
302
431
|
```
|
|
303
432
|
|
|
304
433
|
---
|
package/dist/bin/init.js
CHANGED
|
File without changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/creator/init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/creator/init.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;;GAWG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAiN1C;AAED;;;GAGG;AACH,wBAAgB,WAAW,IAAI;IAC7B,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAwBA"}
|
package/dist/creator/init.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as fs from 'fs';
|
|
2
2
|
import * as path from 'path';
|
|
3
3
|
import * as readline from 'readline';
|
|
4
|
+
import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts';
|
|
4
5
|
const DASHBOARD_URL = 'https://skillz.market/dashboard';
|
|
5
6
|
/**
|
|
6
7
|
* Interactive setup for Skillz Market SDK.
|
|
@@ -71,19 +72,54 @@ export async function init() {
|
|
|
71
72
|
console.log(' The key you entered might be invalid.');
|
|
72
73
|
console.log('');
|
|
73
74
|
}
|
|
74
|
-
// Ask
|
|
75
|
-
console.log('');
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
75
|
+
// Ask about wallet setup
|
|
76
|
+
console.log('');
|
|
77
|
+
let walletAddress;
|
|
78
|
+
let generatedPrivateKey = null;
|
|
79
|
+
const hasWallet = await question('Do you have a wallet set up to receive payments? (y/N): ');
|
|
80
|
+
if (hasWallet.toLowerCase() === 'y') {
|
|
81
|
+
// User has existing wallet
|
|
82
|
+
const inputAddress = await question('Enter your wallet address (0x...): ');
|
|
83
|
+
if (!inputAddress) {
|
|
84
|
+
console.log('');
|
|
85
|
+
console.log('No wallet address provided. Setup cancelled.');
|
|
86
|
+
rl.close();
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
if (!inputAddress.startsWith('0x') || inputAddress.length !== 42) {
|
|
90
|
+
console.log('');
|
|
91
|
+
console.log('⚠️ Warning: Wallet address should be 42 characters starting with "0x"');
|
|
92
|
+
console.log('');
|
|
93
|
+
}
|
|
94
|
+
walletAddress = inputAddress;
|
|
82
95
|
}
|
|
83
|
-
|
|
96
|
+
else {
|
|
97
|
+
// User doesn't have a wallet
|
|
98
|
+
console.log('');
|
|
99
|
+
const generateWallet = await question('Would you like to generate a new wallet? (y/N): ');
|
|
100
|
+
if (generateWallet.toLowerCase() !== 'y') {
|
|
101
|
+
console.log('');
|
|
102
|
+
console.log('You need a wallet to receive payments for your skills.');
|
|
103
|
+
console.log('Run this setup again when you have a wallet ready.');
|
|
104
|
+
rl.close();
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
// Generate new wallet
|
|
108
|
+
generatedPrivateKey = generatePrivateKey();
|
|
109
|
+
const account = privateKeyToAccount(generatedPrivateKey);
|
|
110
|
+
walletAddress = account.address;
|
|
111
|
+
console.log('');
|
|
112
|
+
console.log('╔════════════════════════════════════════════════════════════════╗');
|
|
113
|
+
console.log('║ ⚠️ IMPORTANT: SAVE YOUR PRIVATE KEY NOW! ║');
|
|
114
|
+
console.log('║ ║');
|
|
115
|
+
console.log('║ You will NOT be able to retrieve it later. ║');
|
|
116
|
+
console.log('║ Store it securely (password manager, hardware wallet). ║');
|
|
117
|
+
console.log('╚════════════════════════════════════════════════════════════════╝');
|
|
84
118
|
console.log('');
|
|
85
|
-
console.log(
|
|
119
|
+
console.log(` Private Key: ${generatedPrivateKey}`);
|
|
120
|
+
console.log(` Wallet Address: ${walletAddress}`);
|
|
86
121
|
console.log('');
|
|
122
|
+
await question('Press Enter once you have saved your private key...');
|
|
87
123
|
}
|
|
88
124
|
// Ask where to save
|
|
89
125
|
console.log('');
|
|
@@ -105,7 +141,9 @@ export async function init() {
|
|
|
105
141
|
// Remove existing SKILLZ_ variables
|
|
106
142
|
envContent = envContent
|
|
107
143
|
.split('\n')
|
|
108
|
-
.filter((line) => !line.startsWith('SKILLZ_API_KEY=') &&
|
|
144
|
+
.filter((line) => !line.startsWith('SKILLZ_API_KEY=') &&
|
|
145
|
+
!line.startsWith('SKILLZ_WALLET_ADDRESS=') &&
|
|
146
|
+
!line.startsWith('SKILLZ_WALLET_KEY='))
|
|
109
147
|
.join('\n');
|
|
110
148
|
if (envContent && !envContent.endsWith('\n')) {
|
|
111
149
|
envContent += '\n';
|
|
@@ -115,6 +153,9 @@ export async function init() {
|
|
|
115
153
|
envContent += `\n# Skillz Market SDK Configuration\n`;
|
|
116
154
|
envContent += `SKILLZ_API_KEY=${apiKey}\n`;
|
|
117
155
|
envContent += `SKILLZ_WALLET_ADDRESS=${walletAddress}\n`;
|
|
156
|
+
if (generatedPrivateKey) {
|
|
157
|
+
envContent += `SKILLZ_WALLET_KEY=${generatedPrivateKey}\n`;
|
|
158
|
+
}
|
|
118
159
|
fs.writeFileSync(envPath, envContent);
|
|
119
160
|
console.log('✓ Configuration saved to .env');
|
|
120
161
|
console.log('');
|
|
@@ -125,6 +166,9 @@ export async function init() {
|
|
|
125
166
|
console.log('');
|
|
126
167
|
console.log(` export SKILLZ_API_KEY="${apiKey}"`);
|
|
127
168
|
console.log(` export SKILLZ_WALLET_ADDRESS="${walletAddress}"`);
|
|
169
|
+
if (generatedPrivateKey) {
|
|
170
|
+
console.log(` export SKILLZ_WALLET_KEY="${generatedPrivateKey}"`);
|
|
171
|
+
}
|
|
128
172
|
console.log('');
|
|
129
173
|
console.log('Or add to your shell profile (~/.bashrc, ~/.zshrc, etc.)');
|
|
130
174
|
}
|
package/dist/creator/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/creator/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/creator/init.ts"],"names":[],"mappings":"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"}
|