@iicp/client 0.5.3 → 0.5.4

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/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export declare function main(argv?: string[]): Promise<number>;
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AA8HA,wBAAsB,IAAI,CAAC,IAAI,GAAE,MAAM,EAA0B,GAAG,OAAO,CAAC,MAAM,CAAC,CAyDlF"}
package/dist/cli.js ADDED
@@ -0,0 +1,166 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.main = main;
5
+ // SPDX-License-Identifier: Apache-2.0
6
+ /**
7
+ * iicp-node — turn @iicp/client into a runnable provider node.
8
+ *
9
+ * Usage:
10
+ * iicp-node serve --model qwen2.5:0.5b --backend-url http://localhost:11434
11
+ *
12
+ * All flags also read from env (IICP_BACKEND_URL, IICP_BACKEND_MODEL,
13
+ * IICP_PUBLIC_ENDPOINT, IICP_DIRECTORY_URL, IICP_REGION,
14
+ * IICP_MAX_CONCURRENT, IICP_NODE_ID, IICP_INTENT, IICP_PORT, IICP_HOST).
15
+ *
16
+ * Mirrors iicp_client.cli (Python) so operators choosing TypeScript get the
17
+ * same one-liner setup path.
18
+ */
19
+ const node_util_1 = require("node:util");
20
+ const node_crypto_1 = require("node:crypto");
21
+ const node_js_1 = require("./node.js");
22
+ const openai_compat_js_1 = require("./backends/openai_compat.js");
23
+ function envOr(name, fallback) {
24
+ const v = process.env[name];
25
+ return v ?? fallback;
26
+ }
27
+ function envInt(name, fallback) {
28
+ const v = process.env[name];
29
+ if (!v)
30
+ return fallback;
31
+ const n = parseInt(v, 10);
32
+ return Number.isFinite(n) ? n : fallback;
33
+ }
34
+ function printHelp() {
35
+ process.stdout.write(`usage: iicp-node serve [options]\n\n` +
36
+ `Run an IICP provider node backed by an OpenAI-compatible server.\n\n` +
37
+ `Required (flag or env):\n` +
38
+ ` --backend-url URL IICP_BACKEND_URL — Ollama / vLLM / LM Studio endpoint\n` +
39
+ ` --model NAME IICP_BACKEND_MODEL — model name (e.g. qwen2.5:0.5b)\n\n` +
40
+ `Optional:\n` +
41
+ ` --public-endpoint URL IICP_PUBLIC_ENDPOINT — externally reachable URL of this node\n` +
42
+ ` --directory-url URL IICP_DIRECTORY_URL (default https://iicp.network/api)\n` +
43
+ ` --region REGION IICP_REGION (default eu-central)\n` +
44
+ ` --intent URN IICP_INTENT (default urn:iicp:intent:llm:chat:v1)\n` +
45
+ ` --max-concurrent N IICP_MAX_CONCURRENT (default 4)\n` +
46
+ ` --node-id ID IICP_NODE_ID (auto-generated if absent)\n` +
47
+ ` --port N IICP_PORT (default 8020)\n` +
48
+ ` --host HOST IICP_HOST (default 0.0.0.0)\n` +
49
+ ` --skip-registration IICP_SKIP_REGISTRATION — register-free dev mode\n`);
50
+ }
51
+ async function runServe(opts) {
52
+ if (!opts.backendUrl || !opts.model) {
53
+ process.stderr.write("ERROR: --backend-url and --model are required (or IICP_BACKEND_URL / IICP_BACKEND_MODEL).\n");
54
+ return 2;
55
+ }
56
+ const nodeId = opts.nodeId ||
57
+ `sdk-${opts.model.replace(/:/g, "-")}-${(0, node_crypto_1.randomBytes)(4).toString("hex")}`;
58
+ const publicEndpoint = opts.publicEndpoint || `http://localhost:${opts.port}`;
59
+ const node = new node_js_1.IicpNode({
60
+ nodeId,
61
+ endpoint: publicEndpoint,
62
+ intent: opts.intent,
63
+ model: opts.model,
64
+ region: opts.region,
65
+ directoryUrl: opts.directoryUrl,
66
+ maxConcurrent: opts.maxConcurrent,
67
+ });
68
+ const handler = (0, openai_compat_js_1.openaiCompatHandler)({
69
+ baseUrl: opts.backendUrl,
70
+ model: opts.model,
71
+ });
72
+ let token;
73
+ if (!opts.skipRegistration) {
74
+ try {
75
+ token = await node.register();
76
+ // eslint-disable-next-line no-console
77
+ console.log(`[iicp-node] registered as ${nodeId} (token=${(token ?? "").slice(0, 8)}…)`);
78
+ }
79
+ catch (exc) {
80
+ const msg = exc instanceof Error ? exc.message : String(exc);
81
+ // eslint-disable-next-line no-console
82
+ console.warn(`[iicp-node] registration failed: ${msg} — continuing without heartbeat`);
83
+ }
84
+ }
85
+ // eslint-disable-next-line no-console
86
+ console.log(`[iicp-node] serving ${opts.intent} on ${opts.host}:${opts.port} — ` +
87
+ `backend ${opts.backendUrl} (model=${opts.model}, max_concurrent=${opts.maxConcurrent})`);
88
+ // serve() returns a stop() handle but never resolves on its own; we wait for
89
+ // SIGINT/SIGTERM to terminate.
90
+ const stop = node.serve(handler, { host: opts.host, port: opts.port, nodeToken: token });
91
+ await new Promise((resolve) => {
92
+ const shutdown = (sig) => {
93
+ // eslint-disable-next-line no-console
94
+ console.log(`[iicp-node] ${sig} received — shutting down`);
95
+ stop();
96
+ resolve();
97
+ };
98
+ process.once("SIGINT", () => shutdown("SIGINT"));
99
+ process.once("SIGTERM", () => shutdown("SIGTERM"));
100
+ });
101
+ return 0;
102
+ }
103
+ async function main(argv = process.argv.slice(2)) {
104
+ if (argv.length === 0 || argv[0] === "--help" || argv[0] === "-h") {
105
+ printHelp();
106
+ return argv.length === 0 ? 2 : 0;
107
+ }
108
+ if (argv[0] !== "serve") {
109
+ process.stderr.write(`unknown command: ${argv[0]}\n`);
110
+ printHelp();
111
+ return 2;
112
+ }
113
+ const { values } = (0, node_util_1.parseArgs)({
114
+ args: argv.slice(1),
115
+ options: {
116
+ "backend-url": { type: "string" },
117
+ model: { type: "string" },
118
+ "public-endpoint": { type: "string" },
119
+ "directory-url": { type: "string" },
120
+ region: { type: "string" },
121
+ intent: { type: "string" },
122
+ "max-concurrent": { type: "string" },
123
+ "node-id": { type: "string" },
124
+ port: { type: "string" },
125
+ host: { type: "string" },
126
+ "skip-registration": { type: "boolean" },
127
+ help: { type: "boolean", short: "h" },
128
+ },
129
+ allowPositionals: false,
130
+ });
131
+ if (values.help) {
132
+ printHelp();
133
+ return 0;
134
+ }
135
+ const opts = {
136
+ backendUrl: values["backend-url"] ?? envOr("IICP_BACKEND_URL") ?? "",
137
+ model: values.model ?? envOr("IICP_BACKEND_MODEL") ?? "",
138
+ publicEndpoint: values["public-endpoint"] ?? envOr("IICP_PUBLIC_ENDPOINT") ?? "",
139
+ directoryUrl: values["directory-url"] ??
140
+ envOr("IICP_DIRECTORY_URL", "https://iicp.network/api"),
141
+ region: values.region ?? envOr("IICP_REGION", "eu-central"),
142
+ intent: values.intent ?? envOr("IICP_INTENT", "urn:iicp:intent:llm:chat:v1"),
143
+ maxConcurrent: values["max-concurrent"] !== undefined
144
+ ? parseInt(values["max-concurrent"], 10)
145
+ : envInt("IICP_MAX_CONCURRENT", 4),
146
+ nodeId: values["node-id"] ?? envOr("IICP_NODE_ID") ?? "",
147
+ port: values.port !== undefined
148
+ ? parseInt(values.port, 10)
149
+ : envInt("IICP_PORT", 8020),
150
+ host: values.host ?? envOr("IICP_HOST", "0.0.0.0"),
151
+ skipRegistration: Boolean(values["skip-registration"]) ||
152
+ (envOr("IICP_SKIP_REGISTRATION", "false") ?? "").toLowerCase() === "true",
153
+ };
154
+ return runServe(opts);
155
+ }
156
+ // Direct invocation (node dist/cli.js or via the bin shim)
157
+ if (require.main === module) {
158
+ main()
159
+ .then((code) => process.exit(code))
160
+ .catch((err) => {
161
+ // eslint-disable-next-line no-console
162
+ console.error(err);
163
+ process.exit(1);
164
+ });
165
+ }
166
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,13 +1,20 @@
1
1
  {
2
2
  "name": "@iicp/client",
3
- "version": "0.5.3",
3
+ "version": "0.5.4",
4
4
  "description": "Official TypeScript/JavaScript SDK for the IICP protocol (ADR-016)",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
+ "bin": {
8
+ "iicp-node": "./dist/cli.js"
9
+ },
7
10
  "exports": {
8
11
  ".": {
9
12
  "require": "./dist/index.js",
10
13
  "types": "./dist/index.d.ts"
14
+ },
15
+ "./cli": {
16
+ "require": "./dist/cli.js",
17
+ "types": "./dist/cli.d.ts"
11
18
  }
12
19
  },
13
20
  "scripts": {