leap360 1.0.0
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/auth.d.ts +34 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +74 -0
- package/dist/auth.js.map +1 -0
- package/dist/cli.d.ts +12 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +102 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +17 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +13 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/sdk.d.ts +155 -0
- package/dist/sdk.d.ts.map +1 -0
- package/dist/sdk.js +351 -0
- package/dist/sdk.js.map +1 -0
- package/package.json +52 -0
package/dist/auth.d.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* leap360-sdk — auth helpers
|
|
3
|
+
* Implements the Device Authorization Grant flow for CLI login.
|
|
4
|
+
*
|
|
5
|
+
* Flow:
|
|
6
|
+
* 1. startDeviceAuth() → get deviceCode + verificationUrl from cloud API
|
|
7
|
+
* 2. (CLI opens browser with verificationUrl)
|
|
8
|
+
* 3. pollForApproval() → poll cloud API until user approves in browser
|
|
9
|
+
* 4. saveCredentials() → write apiKey to ~/.leap360/config.json
|
|
10
|
+
*/
|
|
11
|
+
import { type Credentials } from './config.js';
|
|
12
|
+
export interface DeviceAuthResponse {
|
|
13
|
+
deviceCode: string;
|
|
14
|
+
userCode: string;
|
|
15
|
+
verificationUrl: string;
|
|
16
|
+
expiresIn: number;
|
|
17
|
+
}
|
|
18
|
+
export interface PollResponse {
|
|
19
|
+
status: 'pending' | 'approved' | 'expired';
|
|
20
|
+
apiKey?: string;
|
|
21
|
+
userId?: string;
|
|
22
|
+
email?: string;
|
|
23
|
+
}
|
|
24
|
+
/** Step 1: Ask the cloud API to create a device auth session */
|
|
25
|
+
export declare function startDeviceAuth(): Promise<DeviceAuthResponse>;
|
|
26
|
+
/** Step 3: Poll until the user approves or the session expires */
|
|
27
|
+
export declare function pollForApproval(deviceCode: string, intervalMs?: number, timeoutMs?: number): Promise<PollResponse>;
|
|
28
|
+
/** Save credentials to ~/.leap360/config.json */
|
|
29
|
+
export declare function saveCredentials(creds: Omit<Credentials, 'savedAt'>): void;
|
|
30
|
+
/** Load credentials from ~/.leap360/config.json, or null if not found */
|
|
31
|
+
export declare function loadCredentials(): Credentials | null;
|
|
32
|
+
/** Delete saved credentials */
|
|
33
|
+
export declare function clearCredentials(): void;
|
|
34
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EAAmC,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAIhF,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,gEAAgE;AAChE,wBAAsB,eAAe,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAanE;AAED,kEAAkE;AAClE,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAClB,UAAU,SAAO,EACjB,SAAS,SAAW,GACnB,OAAO,CAAC,YAAY,CAAC,CAcvB;AAID,iDAAiD;AACjD,wBAAgB,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,GAAG,IAAI,CAMzE;AAED,yEAAyE;AACzE,wBAAgB,eAAe,IAAI,WAAW,GAAG,IAAI,CAUpD;AAED,+BAA+B;AAC/B,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
|
package/dist/auth.js
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* leap360-sdk — auth helpers
|
|
3
|
+
* Implements the Device Authorization Grant flow for CLI login.
|
|
4
|
+
*
|
|
5
|
+
* Flow:
|
|
6
|
+
* 1. startDeviceAuth() → get deviceCode + verificationUrl from cloud API
|
|
7
|
+
* 2. (CLI opens browser with verificationUrl)
|
|
8
|
+
* 3. pollForApproval() → poll cloud API until user approves in browser
|
|
9
|
+
* 4. saveCredentials() → write apiKey to ~/.leap360/config.json
|
|
10
|
+
*/
|
|
11
|
+
import * as fs from 'fs';
|
|
12
|
+
import * as path from 'path';
|
|
13
|
+
import { CLOUD_API_URL, CREDENTIALS_PATH } from './config.js';
|
|
14
|
+
/** Step 1: Ask the cloud API to create a device auth session */
|
|
15
|
+
export async function startDeviceAuth() {
|
|
16
|
+
const res = await fetch(`${CLOUD_API_URL}/v1/auth/device/start`, {
|
|
17
|
+
method: 'POST',
|
|
18
|
+
headers: { 'Content-Type': 'application/json' },
|
|
19
|
+
body: JSON.stringify({}),
|
|
20
|
+
});
|
|
21
|
+
if (!res.ok) {
|
|
22
|
+
const err = await res.text();
|
|
23
|
+
throw new Error(`Failed to start device auth: ${res.status} — ${err}`);
|
|
24
|
+
}
|
|
25
|
+
return res.json();
|
|
26
|
+
}
|
|
27
|
+
/** Step 3: Poll until the user approves or the session expires */
|
|
28
|
+
export async function pollForApproval(deviceCode, intervalMs = 3000, timeoutMs = 600_000) {
|
|
29
|
+
const deadline = Date.now() + timeoutMs;
|
|
30
|
+
while (Date.now() < deadline) {
|
|
31
|
+
await sleep(intervalMs);
|
|
32
|
+
const res = await fetch(`${CLOUD_API_URL}/v1/auth/device/poll?deviceCode=${encodeURIComponent(deviceCode)}`);
|
|
33
|
+
if (!res.ok)
|
|
34
|
+
continue;
|
|
35
|
+
const data = (await res.json());
|
|
36
|
+
if (data.status !== 'pending')
|
|
37
|
+
return data;
|
|
38
|
+
}
|
|
39
|
+
return { status: 'expired' };
|
|
40
|
+
}
|
|
41
|
+
// ─── Credentials ─────────────────────────────────────────────────────────
|
|
42
|
+
/** Save credentials to ~/.leap360/config.json */
|
|
43
|
+
export function saveCredentials(creds) {
|
|
44
|
+
const dir = path.dirname(CREDENTIALS_PATH);
|
|
45
|
+
if (!fs.existsSync(dir))
|
|
46
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
47
|
+
const full = { ...creds, savedAt: new Date().toISOString() };
|
|
48
|
+
fs.writeFileSync(CREDENTIALS_PATH, JSON.stringify(full, null, 2), { mode: 0o600 });
|
|
49
|
+
}
|
|
50
|
+
/** Load credentials from ~/.leap360/config.json, or null if not found */
|
|
51
|
+
export function loadCredentials() {
|
|
52
|
+
try {
|
|
53
|
+
if (!fs.existsSync(CREDENTIALS_PATH))
|
|
54
|
+
return null;
|
|
55
|
+
const raw = fs.readFileSync(CREDENTIALS_PATH, 'utf-8');
|
|
56
|
+
const data = JSON.parse(raw);
|
|
57
|
+
if (!data.apiKey || !data.userId)
|
|
58
|
+
return null;
|
|
59
|
+
return data;
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/** Delete saved credentials */
|
|
66
|
+
export function clearCredentials() {
|
|
67
|
+
if (fs.existsSync(CREDENTIALS_PATH))
|
|
68
|
+
fs.unlinkSync(CREDENTIALS_PATH);
|
|
69
|
+
}
|
|
70
|
+
// ─── Utility ─────────────────────────────────────────────────────────────
|
|
71
|
+
function sleep(ms) {
|
|
72
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* leap360-sdk — CLI entry point
|
|
4
|
+
*
|
|
5
|
+
* Commands:
|
|
6
|
+
* leap360 login — authenticate via your Leap360 dashboard (browser-based)
|
|
7
|
+
* leap360 logout — remove saved credentials
|
|
8
|
+
* leap360 status — show current login status
|
|
9
|
+
* leap360 --version
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* leap360-sdk — CLI entry point
|
|
4
|
+
*
|
|
5
|
+
* Commands:
|
|
6
|
+
* leap360 login — authenticate via your Leap360 dashboard (browser-based)
|
|
7
|
+
* leap360 logout — remove saved credentials
|
|
8
|
+
* leap360 status — show current login status
|
|
9
|
+
* leap360 --version
|
|
10
|
+
*/
|
|
11
|
+
import { Command } from 'commander';
|
|
12
|
+
import { startDeviceAuth, pollForApproval, saveCredentials, loadCredentials, clearCredentials } from './auth.js';
|
|
13
|
+
const program = new Command();
|
|
14
|
+
program
|
|
15
|
+
.name('leap360')
|
|
16
|
+
.description('Leap360 AI Governance SDK CLI')
|
|
17
|
+
.version('1.0.0');
|
|
18
|
+
// ─── Command: login ────────────────────────────────────────────────────────
|
|
19
|
+
program
|
|
20
|
+
.command('login')
|
|
21
|
+
.description('Log in to Leap360 and save your API key locally')
|
|
22
|
+
.action(async () => {
|
|
23
|
+
console.log('\n🔐 Leap360 Login\n');
|
|
24
|
+
// 1. Start device auth session
|
|
25
|
+
let session;
|
|
26
|
+
try {
|
|
27
|
+
session = await startDeviceAuth();
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
31
|
+
console.error(`\n❌ Could not reach the Leap360 cloud API.\n ${msg}`);
|
|
32
|
+
console.error('\n Make sure LEAP360_API_URL is set (see README).\n');
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
// 2. Show user code & open browser
|
|
36
|
+
const verificationUrl = `https://leap360.ai/login/?deviceCode=${session.deviceCode}`;
|
|
37
|
+
console.log(` Opening your browser to:\n`);
|
|
38
|
+
console.log(` ${verificationUrl}\n`);
|
|
39
|
+
console.log(` Your verification code: \x1b[1;33m${session.userCode}\x1b[0m`);
|
|
40
|
+
console.log('\n (Waiting for you to approve in the browser…)\n');
|
|
41
|
+
// Dynamically import `open` (ESM package)
|
|
42
|
+
try {
|
|
43
|
+
const open = (await import('open')).default;
|
|
44
|
+
await open(verificationUrl);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
console.log(' [Could not open browser automatically — please paste the URL above manually]\n');
|
|
48
|
+
}
|
|
49
|
+
// 3. Poll for approval
|
|
50
|
+
const result = await pollForApproval(session.deviceCode);
|
|
51
|
+
if (result.status === 'approved' && result.apiKey) {
|
|
52
|
+
saveCredentials({
|
|
53
|
+
apiKey: result.apiKey,
|
|
54
|
+
userId: result.userId,
|
|
55
|
+
email: result.email,
|
|
56
|
+
});
|
|
57
|
+
console.log(`✅ Logged in as \x1b[1;32m${result.email}\x1b[0m`);
|
|
58
|
+
console.log(` API key saved to ~/.leap360/config.json\n`);
|
|
59
|
+
console.log(' You can now use the SDK in your AI application:\n');
|
|
60
|
+
console.log(' \x1b[36mimport { Leap360Client } from \'leap360-sdk\';\x1b[0m');
|
|
61
|
+
console.log(' \x1b[36mconst leap = new Leap360Client();\x1b[0m\n');
|
|
62
|
+
}
|
|
63
|
+
else if (result.status === 'expired') {
|
|
64
|
+
console.error('❌ Login timed out (10 minutes). Run `leap360 login` again.\n');
|
|
65
|
+
process.exit(1);
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
console.error('❌ Login was not approved. Try again.\n');
|
|
69
|
+
process.exit(1);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
// ─── Command: logout ───────────────────────────────────────────────────────
|
|
73
|
+
program
|
|
74
|
+
.command('logout')
|
|
75
|
+
.description('Remove saved Leap360 credentials from this machine')
|
|
76
|
+
.action(() => {
|
|
77
|
+
const creds = loadCredentials();
|
|
78
|
+
if (!creds) {
|
|
79
|
+
console.log('\n⚠️ You are not logged in.\n');
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
clearCredentials();
|
|
83
|
+
console.log(`\n✅ Logged out (removed credentials for ${creds.email}).\n`);
|
|
84
|
+
});
|
|
85
|
+
// ─── Command: status ───────────────────────────────────────────────────────
|
|
86
|
+
program
|
|
87
|
+
.command('status')
|
|
88
|
+
.description('Show your current Leap360 login status')
|
|
89
|
+
.action(() => {
|
|
90
|
+
const creds = loadCredentials();
|
|
91
|
+
if (!creds) {
|
|
92
|
+
console.log('\n⚠️ Not logged in. Run: \x1b[36mleap360 login\x1b[0m\n');
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
console.log('\n✅ Logged in to Leap360\n');
|
|
96
|
+
console.log(` Email: ${creds.email}`);
|
|
97
|
+
console.log(` User ID: ${creds.userId}`);
|
|
98
|
+
console.log(` API Key: ${creds.apiKey.substring(0, 16)}…`);
|
|
99
|
+
console.log(` Saved: ${creds.savedAt}\n`);
|
|
100
|
+
});
|
|
101
|
+
program.parse(process.argv);
|
|
102
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* leap360-sdk — shared config
|
|
3
|
+
*
|
|
4
|
+
* The CLOUD_API_URL will be updated after your first `sam deploy` run.
|
|
5
|
+
* You can also override it via the LEAP360_API_URL environment variable.
|
|
6
|
+
*/
|
|
7
|
+
/** The deployed Cloud API URL — override with LEAP360_API_URL env var if needed */
|
|
8
|
+
export declare const CLOUD_API_URL: string;
|
|
9
|
+
/** Path to the local credentials file */
|
|
10
|
+
export declare const CREDENTIALS_PATH: string;
|
|
11
|
+
export interface Credentials {
|
|
12
|
+
apiKey: string;
|
|
13
|
+
userId: string;
|
|
14
|
+
email: string;
|
|
15
|
+
savedAt: string;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,mFAAmF;AACnF,eAAO,MAAM,aAAa,QAA6F,CAAC;AAExH,yCAAyC;AACzC,eAAO,MAAM,gBAAgB,QAAqD,CAAC;AAEnF,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* leap360-sdk — shared config
|
|
3
|
+
*
|
|
4
|
+
* The CLOUD_API_URL will be updated after your first `sam deploy` run.
|
|
5
|
+
* You can also override it via the LEAP360_API_URL environment variable.
|
|
6
|
+
*/
|
|
7
|
+
import * as os from 'os';
|
|
8
|
+
import * as path from 'path';
|
|
9
|
+
/** The deployed Cloud API URL — override with LEAP360_API_URL env var if needed */
|
|
10
|
+
export const CLOUD_API_URL = process.env['LEAP360_API_URL'] || 'https://b0vyk178b7.execute-api.us-east-1.amazonaws.com';
|
|
11
|
+
/** Path to the local credentials file */
|
|
12
|
+
export const CREDENTIALS_PATH = path.join(os.homedir(), '.leap360', 'config.json');
|
|
13
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,mFAAmF;AACnF,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,wDAAwD,CAAC;AAExH,yCAAyC;AACzC,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* leap360-sdk — public API
|
|
3
|
+
*
|
|
4
|
+
* ── Auto-wrap style (recommended) ──────────────────────────────────────────
|
|
5
|
+
* import { Leap360 } from 'leap360-sdk';
|
|
6
|
+
*
|
|
7
|
+
* const leap = new Leap360({ apiKey: 'lp360_...', projectId: 'my-app', serviceName: 'chat-bot' });
|
|
8
|
+
* const openai = leap.wrapOpenAI(new OpenAI()); // OpenAI auto-traced
|
|
9
|
+
* const genAI = leap.wrapGemini(new GoogleGenerativeAI(key)); // Gemini auto-traced
|
|
10
|
+
*
|
|
11
|
+
* const agent = leap.createAgent({ name: 'Support Bot' });
|
|
12
|
+
* await agent.run(async (client) => {
|
|
13
|
+
* await client.chat.completions.create({ ... });
|
|
14
|
+
* });
|
|
15
|
+
*
|
|
16
|
+
* ── Manual style (max flexibility) ─────────────────────────────────────────
|
|
17
|
+
* import { Leap360Client } from 'leap360-sdk';
|
|
18
|
+
* const leap = new Leap360Client(); // reads from ~/.leap360/config.json
|
|
19
|
+
*
|
|
20
|
+
* const result = await leap.traceCall({
|
|
21
|
+
* agentName: 'My Bot',
|
|
22
|
+
* provider: 'openai',
|
|
23
|
+
* model: 'gpt-4o',
|
|
24
|
+
* fn: () => myLLMCall(prompt),
|
|
25
|
+
* });
|
|
26
|
+
*/
|
|
27
|
+
export { Leap360, Leap360Client } from './sdk.js';
|
|
28
|
+
export type { Leap360Config, TracePayload, TraceCallOptions, Leap360ClientOptions } from './sdk.js';
|
|
29
|
+
export { loadCredentials, clearCredentials, saveCredentials } from './auth.js';
|
|
30
|
+
export { CLOUD_API_URL, CREDENTIALS_PATH } from './config.js';
|
|
31
|
+
export type { Credentials } from './config.js';
|
|
32
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAuC,UAAU,CAAC;AACnF,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AACpG,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAY,WAAW,CAAC;AACrF,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAA8B,aAAa,CAAC;AACtF,YAAY,EAAE,WAAW,EAAE,MAA8C,aAAa,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* leap360-sdk — public API
|
|
3
|
+
*
|
|
4
|
+
* ── Auto-wrap style (recommended) ──────────────────────────────────────────
|
|
5
|
+
* import { Leap360 } from 'leap360-sdk';
|
|
6
|
+
*
|
|
7
|
+
* const leap = new Leap360({ apiKey: 'lp360_...', projectId: 'my-app', serviceName: 'chat-bot' });
|
|
8
|
+
* const openai = leap.wrapOpenAI(new OpenAI()); // OpenAI auto-traced
|
|
9
|
+
* const genAI = leap.wrapGemini(new GoogleGenerativeAI(key)); // Gemini auto-traced
|
|
10
|
+
*
|
|
11
|
+
* const agent = leap.createAgent({ name: 'Support Bot' });
|
|
12
|
+
* await agent.run(async (client) => {
|
|
13
|
+
* await client.chat.completions.create({ ... });
|
|
14
|
+
* });
|
|
15
|
+
*
|
|
16
|
+
* ── Manual style (max flexibility) ─────────────────────────────────────────
|
|
17
|
+
* import { Leap360Client } from 'leap360-sdk';
|
|
18
|
+
* const leap = new Leap360Client(); // reads from ~/.leap360/config.json
|
|
19
|
+
*
|
|
20
|
+
* const result = await leap.traceCall({
|
|
21
|
+
* agentName: 'My Bot',
|
|
22
|
+
* provider: 'openai',
|
|
23
|
+
* model: 'gpt-4o',
|
|
24
|
+
* fn: () => myLLMCall(prompt),
|
|
25
|
+
* });
|
|
26
|
+
*/
|
|
27
|
+
export { Leap360, Leap360Client } from './sdk.js';
|
|
28
|
+
export { loadCredentials, clearCredentials, saveCredentials } from './auth.js';
|
|
29
|
+
export { CLOUD_API_URL, CREDENTIALS_PATH } from './config.js';
|
|
30
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAuC,UAAU,CAAC;AAEnF,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAY,WAAW,CAAC;AACrF,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAA8B,aAAa,CAAC"}
|
package/dist/sdk.d.ts
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* leap360-sdk — Leap360Client + Leap360 (auto-wrap) class
|
|
3
|
+
*
|
|
4
|
+
* Two usage styles:
|
|
5
|
+
*
|
|
6
|
+
* ── Style 1: Auto-wrap (mirrors the GitHub reference SDK) ─────────────────
|
|
7
|
+
* import { Leap360 } from 'leap360-sdk';
|
|
8
|
+
*
|
|
9
|
+
* const leap = new Leap360({ apiKey: '...', projectId: 'my-app', serviceName: 'chat-bot' });
|
|
10
|
+
*
|
|
11
|
+
* // Wrap OpenAI client — every call is traced automatically
|
|
12
|
+
* const openai = leap.wrapOpenAI(new OpenAI());
|
|
13
|
+
*
|
|
14
|
+
* // Wrap Google Gemini client
|
|
15
|
+
* leap.wrapGemini(genAI); // wraps genAI.getGenerativeModel(...)
|
|
16
|
+
*
|
|
17
|
+
* // Group calls into a named agent run
|
|
18
|
+
* const agent = leap.createAgent({ name: 'Support Bot' });
|
|
19
|
+
* await agent.run(async (client) => {
|
|
20
|
+
* await client.chat.completions.create({ ... });
|
|
21
|
+
* });
|
|
22
|
+
*
|
|
23
|
+
* ── Style 2: Manual trace (maximum flexibility) ────────────────────────────
|
|
24
|
+
* import { Leap360Client } from 'leap360-sdk';
|
|
25
|
+
* const leap = new Leap360Client(); // reads from ~/.leap360/config.json
|
|
26
|
+
*
|
|
27
|
+
* const result = await leap.traceCall({
|
|
28
|
+
* agentName: 'My Bot',
|
|
29
|
+
* provider: 'openai',
|
|
30
|
+
* model: 'gpt-4o',
|
|
31
|
+
* fn: () => openai.chat.completions.create({ ... }),
|
|
32
|
+
* });
|
|
33
|
+
*/
|
|
34
|
+
export interface TracePayload {
|
|
35
|
+
/** Display name of your agent */
|
|
36
|
+
agentName?: string;
|
|
37
|
+
/** The service or app this agent belongs to */
|
|
38
|
+
serviceName?: string;
|
|
39
|
+
/** Group multiple calls belonging to the same run */
|
|
40
|
+
runId?: string;
|
|
41
|
+
/** e.g. 'openai', 'google', 'anthropic', 'mistral' */
|
|
42
|
+
provider: string;
|
|
43
|
+
/** e.g. 'gpt-4o', 'gemini-2.0-flash', 'claude-3-sonnet' */
|
|
44
|
+
model: string;
|
|
45
|
+
/** The input sent to the model — can be anything JSON-serializable */
|
|
46
|
+
request?: Record<string, unknown>;
|
|
47
|
+
/** The output from the model */
|
|
48
|
+
response?: Record<string, unknown>;
|
|
49
|
+
/** Call duration in milliseconds */
|
|
50
|
+
latencyMs?: number;
|
|
51
|
+
/** Token usage */
|
|
52
|
+
usage?: {
|
|
53
|
+
prompt_tokens: number;
|
|
54
|
+
completion_tokens: number;
|
|
55
|
+
total_tokens: number;
|
|
56
|
+
};
|
|
57
|
+
/** ISO timestamp — defaults to now */
|
|
58
|
+
timestamp?: string;
|
|
59
|
+
/** Error message if the call failed */
|
|
60
|
+
error?: string | null;
|
|
61
|
+
}
|
|
62
|
+
export interface TraceCallOptions<T> {
|
|
63
|
+
agentName?: string;
|
|
64
|
+
serviceName?: string;
|
|
65
|
+
runId?: string;
|
|
66
|
+
provider: string;
|
|
67
|
+
model: string;
|
|
68
|
+
/** The async function that calls your LLM — its return value is passed through */
|
|
69
|
+
fn: () => Promise<T>;
|
|
70
|
+
/**
|
|
71
|
+
* Optional: extract token usage from the LLM response.
|
|
72
|
+
*/
|
|
73
|
+
extractUsage?: (result: T) => {
|
|
74
|
+
prompt_tokens: number;
|
|
75
|
+
completion_tokens: number;
|
|
76
|
+
total_tokens: number;
|
|
77
|
+
};
|
|
78
|
+
extractRequest?: (result: T) => Record<string, unknown>;
|
|
79
|
+
extractResponse?: (result: T) => Record<string, unknown>;
|
|
80
|
+
/** Extra context you want attached to the trace */
|
|
81
|
+
metadata?: Record<string, unknown>;
|
|
82
|
+
}
|
|
83
|
+
export interface Leap360ClientOptions {
|
|
84
|
+
/** Override the API key (defaults to reading from ~/.leap360/config.json) */
|
|
85
|
+
apiKey?: string;
|
|
86
|
+
/** Override the Cloud API URL */
|
|
87
|
+
apiUrl?: string;
|
|
88
|
+
/** If true, won't throw when the API is unreachable — just logs a warning */
|
|
89
|
+
silent?: boolean;
|
|
90
|
+
/** Project label — defaults to 'default' */
|
|
91
|
+
projectId?: string;
|
|
92
|
+
}
|
|
93
|
+
export type Leap360Config = {
|
|
94
|
+
apiKey: string;
|
|
95
|
+
projectId: string;
|
|
96
|
+
serviceName: string;
|
|
97
|
+
/** Override the base URL (defaults to the deployed cloud API) */
|
|
98
|
+
baseUrl?: string;
|
|
99
|
+
};
|
|
100
|
+
export declare class Leap360 {
|
|
101
|
+
private config;
|
|
102
|
+
private wrappedOpenAIClient;
|
|
103
|
+
constructor(config: Leap360Config);
|
|
104
|
+
/**
|
|
105
|
+
* Wraps an OpenAI client so every `chat.completions.create` call is
|
|
106
|
+
* automatically traced and sent to Leap360.
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* import OpenAI from 'openai';
|
|
110
|
+
* const openai = leap.wrapOpenAI(new OpenAI());
|
|
111
|
+
* const res = await openai.chat.completions.create({ model: 'gpt-4o', ... });
|
|
112
|
+
*/
|
|
113
|
+
wrapOpenAI<OpenAIClient>(client: OpenAIClient): OpenAIClient;
|
|
114
|
+
/**
|
|
115
|
+
* Wraps a `@google/generative-ai` GoogleGenerativeAI instance so every
|
|
116
|
+
* `generateContent` / `generateContentStream` call is traced automatically.
|
|
117
|
+
*
|
|
118
|
+
* @example
|
|
119
|
+
* import { GoogleGenerativeAI } from '@google/generative-ai';
|
|
120
|
+
* const genAI = leap.wrapGemini(new GoogleGenerativeAI(apiKey));
|
|
121
|
+
* const model = genAI.getGenerativeModel({ model: 'gemini-2.0-flash' });
|
|
122
|
+
* const res = await model.generateContent('Hello!');
|
|
123
|
+
*/
|
|
124
|
+
wrapGemini<GeminiClient>(client: GeminiClient): GeminiClient;
|
|
125
|
+
/**
|
|
126
|
+
* Creates a named agent context. All LLM calls made inside `agent.run(...)`
|
|
127
|
+
* will be tagged with the agent name and a shared run ID in Leap360.
|
|
128
|
+
*
|
|
129
|
+
* @example
|
|
130
|
+
* const agent = leap.createAgent({ name: 'Support Bot' });
|
|
131
|
+
* await agent.run(async (client) => {
|
|
132
|
+
* await client.chat.completions.create({ model: 'gpt-4o', messages: [...] });
|
|
133
|
+
* });
|
|
134
|
+
*/
|
|
135
|
+
createAgent(opts: {
|
|
136
|
+
name: string;
|
|
137
|
+
}): {
|
|
138
|
+
run: <T>(fn: (client: unknown) => Promise<T>) => Promise<T>;
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
export declare class Leap360Client {
|
|
142
|
+
private apiKey;
|
|
143
|
+
private apiUrl;
|
|
144
|
+
private silent;
|
|
145
|
+
private projectId;
|
|
146
|
+
constructor(options?: Leap360ClientOptions);
|
|
147
|
+
/**
|
|
148
|
+
* Wrap any async LLM call — automatically records latency, errors, and usage.
|
|
149
|
+
* Returns the original result of `options.fn()` unchanged.
|
|
150
|
+
*/
|
|
151
|
+
traceCall<T>(options: TraceCallOptions<T>): Promise<T>;
|
|
152
|
+
/** Send a fully-built trace payload to the Leap360 Cloud API */
|
|
153
|
+
sendTrace(payload: TracePayload): Promise<void>;
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=sdk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"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"}
|
package/dist/sdk.js
ADDED
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* leap360-sdk — Leap360Client + Leap360 (auto-wrap) class
|
|
3
|
+
*
|
|
4
|
+
* Two usage styles:
|
|
5
|
+
*
|
|
6
|
+
* ── Style 1: Auto-wrap (mirrors the GitHub reference SDK) ─────────────────
|
|
7
|
+
* import { Leap360 } from 'leap360-sdk';
|
|
8
|
+
*
|
|
9
|
+
* const leap = new Leap360({ apiKey: '...', projectId: 'my-app', serviceName: 'chat-bot' });
|
|
10
|
+
*
|
|
11
|
+
* // Wrap OpenAI client — every call is traced automatically
|
|
12
|
+
* const openai = leap.wrapOpenAI(new OpenAI());
|
|
13
|
+
*
|
|
14
|
+
* // Wrap Google Gemini client
|
|
15
|
+
* leap.wrapGemini(genAI); // wraps genAI.getGenerativeModel(...)
|
|
16
|
+
*
|
|
17
|
+
* // Group calls into a named agent run
|
|
18
|
+
* const agent = leap.createAgent({ name: 'Support Bot' });
|
|
19
|
+
* await agent.run(async (client) => {
|
|
20
|
+
* await client.chat.completions.create({ ... });
|
|
21
|
+
* });
|
|
22
|
+
*
|
|
23
|
+
* ── Style 2: Manual trace (maximum flexibility) ────────────────────────────
|
|
24
|
+
* import { Leap360Client } from 'leap360-sdk';
|
|
25
|
+
* const leap = new Leap360Client(); // reads from ~/.leap360/config.json
|
|
26
|
+
*
|
|
27
|
+
* const result = await leap.traceCall({
|
|
28
|
+
* agentName: 'My Bot',
|
|
29
|
+
* provider: 'openai',
|
|
30
|
+
* model: 'gpt-4o',
|
|
31
|
+
* fn: () => openai.chat.completions.create({ ... }),
|
|
32
|
+
* });
|
|
33
|
+
*/
|
|
34
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
35
|
+
import * as crypto from 'node:crypto';
|
|
36
|
+
import { loadCredentials } from './auth.js';
|
|
37
|
+
import { CLOUD_API_URL } from './config.js';
|
|
38
|
+
const runContextStorage = new AsyncLocalStorage();
|
|
39
|
+
// ─── Shared send logic ────────────────────────────────────────────────────
|
|
40
|
+
function buildTraceBody(opts) {
|
|
41
|
+
return {
|
|
42
|
+
project_id: opts.projectId,
|
|
43
|
+
service_name: opts.serviceName,
|
|
44
|
+
agent_name: opts.agentName ?? null,
|
|
45
|
+
run_id: opts.runId ?? crypto.randomUUID(),
|
|
46
|
+
provider: opts.provider,
|
|
47
|
+
model: opts.model,
|
|
48
|
+
request: opts.request ?? {},
|
|
49
|
+
response: opts.response ?? null,
|
|
50
|
+
latency_ms: opts.latencyMs,
|
|
51
|
+
usage: opts.usage,
|
|
52
|
+
timestamp: opts.timestamp,
|
|
53
|
+
error: opts.error,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
async function postTrace(url, apiKey, body, silent) {
|
|
57
|
+
try {
|
|
58
|
+
const res = await fetch(`${url.replace(/\/$/, '')}/v1/traces`, {
|
|
59
|
+
method: 'POST',
|
|
60
|
+
headers: {
|
|
61
|
+
'Content-Type': 'application/json',
|
|
62
|
+
'x-leap360-key': apiKey,
|
|
63
|
+
},
|
|
64
|
+
body: JSON.stringify(body),
|
|
65
|
+
});
|
|
66
|
+
if (!res.ok && !silent) {
|
|
67
|
+
const text = await res.text();
|
|
68
|
+
console.warn(`[Leap360] Trace rejected (${res.status}): ${text}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
if (!silent) {
|
|
73
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
74
|
+
console.warn(`[Leap360] Failed to send trace: ${msg}`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
79
|
+
// CLASS 1: Leap360 — auto-wrap style (matches GitHub reference SDK)
|
|
80
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
81
|
+
export class Leap360 {
|
|
82
|
+
config;
|
|
83
|
+
wrappedOpenAIClient = null;
|
|
84
|
+
constructor(config) {
|
|
85
|
+
this.config = {
|
|
86
|
+
...config,
|
|
87
|
+
baseUrl: config.baseUrl || CLOUD_API_URL,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
// ── OpenAI auto-wrap ────────────────────────────────────────────────────
|
|
91
|
+
/**
|
|
92
|
+
* Wraps an OpenAI client so every `chat.completions.create` call is
|
|
93
|
+
* automatically traced and sent to Leap360.
|
|
94
|
+
*
|
|
95
|
+
* @example
|
|
96
|
+
* import OpenAI from 'openai';
|
|
97
|
+
* const openai = leap.wrapOpenAI(new OpenAI());
|
|
98
|
+
* const res = await openai.chat.completions.create({ model: 'gpt-4o', ... });
|
|
99
|
+
*/
|
|
100
|
+
wrapOpenAI(client) {
|
|
101
|
+
const self = this;
|
|
102
|
+
const originalCreate = client.chat.completions.create.bind(client.chat.completions);
|
|
103
|
+
client.chat.completions.create = async (body, options) => {
|
|
104
|
+
const startTime = Date.now();
|
|
105
|
+
const runCtx = runContextStorage.getStore();
|
|
106
|
+
let response = null;
|
|
107
|
+
let error = null;
|
|
108
|
+
try {
|
|
109
|
+
response = await originalCreate(body, options);
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
error = err;
|
|
113
|
+
throw err;
|
|
114
|
+
}
|
|
115
|
+
finally {
|
|
116
|
+
const latencyMs = Date.now() - startTime;
|
|
117
|
+
const model = (response?.model ?? body?.model ?? 'unknown');
|
|
118
|
+
const usage = response?.usage;
|
|
119
|
+
const traceBody = buildTraceBody({
|
|
120
|
+
projectId: self.config.projectId,
|
|
121
|
+
serviceName: self.config.serviceName,
|
|
122
|
+
agentName: runCtx?.agentName ?? null,
|
|
123
|
+
runId: runCtx?.runId,
|
|
124
|
+
provider: 'openai',
|
|
125
|
+
model,
|
|
126
|
+
request: typeof body === 'object' ? body : { content: body },
|
|
127
|
+
response: response ?? undefined,
|
|
128
|
+
latencyMs,
|
|
129
|
+
usage: usage ?? { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 },
|
|
130
|
+
timestamp: new Date(startTime).toISOString(),
|
|
131
|
+
error: error ? (error instanceof Error ? error.message : String(error)) : null,
|
|
132
|
+
});
|
|
133
|
+
postTrace(self.config.baseUrl, self.config.apiKey, traceBody, false)
|
|
134
|
+
.catch(e => console.error('[Leap360]', e));
|
|
135
|
+
}
|
|
136
|
+
return response;
|
|
137
|
+
};
|
|
138
|
+
this.wrappedOpenAIClient = client;
|
|
139
|
+
return client;
|
|
140
|
+
}
|
|
141
|
+
// ── Google Gemini auto-wrap ─────────────────────────────────────────────
|
|
142
|
+
/**
|
|
143
|
+
* Wraps a `@google/generative-ai` GoogleGenerativeAI instance so every
|
|
144
|
+
* `generateContent` / `generateContentStream` call is traced automatically.
|
|
145
|
+
*
|
|
146
|
+
* @example
|
|
147
|
+
* import { GoogleGenerativeAI } from '@google/generative-ai';
|
|
148
|
+
* const genAI = leap.wrapGemini(new GoogleGenerativeAI(apiKey));
|
|
149
|
+
* const model = genAI.getGenerativeModel({ model: 'gemini-2.0-flash' });
|
|
150
|
+
* const res = await model.generateContent('Hello!');
|
|
151
|
+
*/
|
|
152
|
+
wrapGemini(client) {
|
|
153
|
+
const self = this;
|
|
154
|
+
const c = client;
|
|
155
|
+
const originalGetModel = c.getGenerativeModel.bind(c);
|
|
156
|
+
c.getGenerativeModel = (opts, ...args) => {
|
|
157
|
+
const model = originalGetModel(opts, ...args);
|
|
158
|
+
const modelName = (opts?.model ?? 'gemini');
|
|
159
|
+
// Wrap generateContent
|
|
160
|
+
const origGenContent = model.generateContent.bind(model);
|
|
161
|
+
model.generateContent = async (...callArgs) => {
|
|
162
|
+
const startTime = Date.now();
|
|
163
|
+
const runCtx = runContextStorage.getStore();
|
|
164
|
+
let response = null;
|
|
165
|
+
let error = null;
|
|
166
|
+
try {
|
|
167
|
+
response = await origGenContent(...callArgs);
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
error = err;
|
|
171
|
+
throw err;
|
|
172
|
+
}
|
|
173
|
+
finally {
|
|
174
|
+
const latencyMs = Date.now() - startTime;
|
|
175
|
+
const usageMetadata = response?.response?.usageMetadata;
|
|
176
|
+
const usage = usageMetadata
|
|
177
|
+
? { prompt_tokens: usageMetadata['promptTokenCount'] ?? 0, completion_tokens: usageMetadata['candidatesTokenCount'] ?? 0, total_tokens: usageMetadata['totalTokenCount'] ?? 0 }
|
|
178
|
+
: { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 };
|
|
179
|
+
const traceBody = buildTraceBody({
|
|
180
|
+
projectId: self.config.projectId,
|
|
181
|
+
serviceName: self.config.serviceName,
|
|
182
|
+
agentName: runCtx?.agentName ?? null,
|
|
183
|
+
runId: runCtx?.runId,
|
|
184
|
+
provider: 'google',
|
|
185
|
+
model: modelName,
|
|
186
|
+
request: { prompt: callArgs[0] },
|
|
187
|
+
response: response ?? undefined,
|
|
188
|
+
latencyMs,
|
|
189
|
+
usage,
|
|
190
|
+
timestamp: new Date(startTime).toISOString(),
|
|
191
|
+
error: error ? (error instanceof Error ? error.message : String(error)) : null,
|
|
192
|
+
});
|
|
193
|
+
postTrace(self.config.baseUrl, self.config.apiKey, traceBody, false)
|
|
194
|
+
.catch(e => console.error('[Leap360]', e));
|
|
195
|
+
}
|
|
196
|
+
return response;
|
|
197
|
+
};
|
|
198
|
+
// Wrap generateContentStream (fire-and-forget trace after stream ends)
|
|
199
|
+
const origStream = model.generateContentStream.bind(model);
|
|
200
|
+
model.generateContentStream = async (...callArgs) => {
|
|
201
|
+
const startTime = Date.now();
|
|
202
|
+
const runCtx = runContextStorage.getStore();
|
|
203
|
+
let error = null;
|
|
204
|
+
let result = null;
|
|
205
|
+
try {
|
|
206
|
+
result = await origStream(...callArgs);
|
|
207
|
+
}
|
|
208
|
+
catch (err) {
|
|
209
|
+
error = err;
|
|
210
|
+
throw err;
|
|
211
|
+
}
|
|
212
|
+
finally {
|
|
213
|
+
const latencyMs = Date.now() - startTime;
|
|
214
|
+
const traceBody = buildTraceBody({
|
|
215
|
+
projectId: self.config.projectId,
|
|
216
|
+
serviceName: self.config.serviceName,
|
|
217
|
+
agentName: runCtx?.agentName ?? null,
|
|
218
|
+
runId: runCtx?.runId,
|
|
219
|
+
provider: 'google',
|
|
220
|
+
model: modelName,
|
|
221
|
+
request: { prompt: callArgs[0] },
|
|
222
|
+
response: null,
|
|
223
|
+
latencyMs,
|
|
224
|
+
usage: { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 },
|
|
225
|
+
timestamp: new Date(startTime).toISOString(),
|
|
226
|
+
error: error ? (error instanceof Error ? error.message : String(error)) : null,
|
|
227
|
+
});
|
|
228
|
+
postTrace(self.config.baseUrl, self.config.apiKey, traceBody, false)
|
|
229
|
+
.catch(e => console.error('[Leap360]', e));
|
|
230
|
+
}
|
|
231
|
+
return result;
|
|
232
|
+
};
|
|
233
|
+
return model;
|
|
234
|
+
};
|
|
235
|
+
return client;
|
|
236
|
+
}
|
|
237
|
+
// ── createAgent ─────────────────────────────────────────────────────────
|
|
238
|
+
/**
|
|
239
|
+
* Creates a named agent context. All LLM calls made inside `agent.run(...)`
|
|
240
|
+
* will be tagged with the agent name and a shared run ID in Leap360.
|
|
241
|
+
*
|
|
242
|
+
* @example
|
|
243
|
+
* const agent = leap.createAgent({ name: 'Support Bot' });
|
|
244
|
+
* await agent.run(async (client) => {
|
|
245
|
+
* await client.chat.completions.create({ model: 'gpt-4o', messages: [...] });
|
|
246
|
+
* });
|
|
247
|
+
*/
|
|
248
|
+
createAgent(opts) {
|
|
249
|
+
return {
|
|
250
|
+
run: async (fn) => {
|
|
251
|
+
const runId = crypto.randomUUID();
|
|
252
|
+
return runContextStorage.run({ runId, agentName: opts.name }, async () => {
|
|
253
|
+
return fn(this.wrappedOpenAIClient);
|
|
254
|
+
});
|
|
255
|
+
},
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
260
|
+
// CLASS 2: Leap360Client — manual trace style (CLI-auth based)
|
|
261
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
262
|
+
export class Leap360Client {
|
|
263
|
+
apiKey;
|
|
264
|
+
apiUrl;
|
|
265
|
+
silent;
|
|
266
|
+
projectId;
|
|
267
|
+
constructor(options = {}) {
|
|
268
|
+
this.apiUrl = options.apiUrl || CLOUD_API_URL;
|
|
269
|
+
this.silent = options.silent ?? true;
|
|
270
|
+
this.projectId = options.projectId || 'default';
|
|
271
|
+
if (options.apiKey) {
|
|
272
|
+
this.apiKey = options.apiKey;
|
|
273
|
+
}
|
|
274
|
+
else if (process.env['LEAP360_API_KEY']) {
|
|
275
|
+
this.apiKey = process.env['LEAP360_API_KEY'];
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
const creds = loadCredentials();
|
|
279
|
+
if (!creds) {
|
|
280
|
+
const msg = '[Leap360] Not authenticated. Run `leap360 login` or set LEAP360_API_KEY.';
|
|
281
|
+
if (!this.silent)
|
|
282
|
+
throw new Error(msg);
|
|
283
|
+
console.warn(msg);
|
|
284
|
+
this.apiKey = '';
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
this.apiKey = creds.apiKey;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Wrap any async LLM call — automatically records latency, errors, and usage.
|
|
293
|
+
* Returns the original result of `options.fn()` unchanged.
|
|
294
|
+
*/
|
|
295
|
+
async traceCall(options) {
|
|
296
|
+
const start = Date.now();
|
|
297
|
+
let result;
|
|
298
|
+
let error = null;
|
|
299
|
+
try {
|
|
300
|
+
result = await options.fn();
|
|
301
|
+
}
|
|
302
|
+
catch (err) {
|
|
303
|
+
error = err instanceof Error ? err.message : String(err);
|
|
304
|
+
await this.sendTrace({
|
|
305
|
+
agentName: options.agentName,
|
|
306
|
+
serviceName: options.serviceName || 'default',
|
|
307
|
+
runId: options.runId,
|
|
308
|
+
provider: options.provider,
|
|
309
|
+
model: options.model,
|
|
310
|
+
request: options.metadata ?? {},
|
|
311
|
+
latencyMs: Date.now() - start,
|
|
312
|
+
error,
|
|
313
|
+
});
|
|
314
|
+
throw err;
|
|
315
|
+
}
|
|
316
|
+
await this.sendTrace({
|
|
317
|
+
agentName: options.agentName,
|
|
318
|
+
serviceName: options.serviceName || 'default',
|
|
319
|
+
runId: options.runId,
|
|
320
|
+
provider: options.provider,
|
|
321
|
+
model: options.model,
|
|
322
|
+
request: options.extractRequest?.(result) ?? options.metadata ?? {},
|
|
323
|
+
response: options.extractResponse?.(result) ?? {},
|
|
324
|
+
latencyMs: Date.now() - start,
|
|
325
|
+
usage: options.extractUsage?.(result),
|
|
326
|
+
error: null,
|
|
327
|
+
});
|
|
328
|
+
return result;
|
|
329
|
+
}
|
|
330
|
+
/** Send a fully-built trace payload to the Leap360 Cloud API */
|
|
331
|
+
async sendTrace(payload) {
|
|
332
|
+
if (!this.apiKey)
|
|
333
|
+
return;
|
|
334
|
+
const body = buildTraceBody({
|
|
335
|
+
projectId: this.projectId,
|
|
336
|
+
serviceName: payload.serviceName ?? 'default',
|
|
337
|
+
agentName: payload.agentName ?? null,
|
|
338
|
+
runId: payload.runId,
|
|
339
|
+
provider: payload.provider,
|
|
340
|
+
model: payload.model,
|
|
341
|
+
request: payload.request ?? {},
|
|
342
|
+
response: payload.response ?? null,
|
|
343
|
+
latencyMs: payload.latencyMs ?? 0,
|
|
344
|
+
usage: payload.usage ?? { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 },
|
|
345
|
+
timestamp: payload.timestamp ?? new Date().toISOString(),
|
|
346
|
+
error: payload.error ?? null,
|
|
347
|
+
});
|
|
348
|
+
await postTrace(this.apiUrl, this.apiKey, body, this.silent);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
//# sourceMappingURL=sdk.js.map
|
package/dist/sdk.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdk.js","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "leap360",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Leap360 AI Governance SDK — monitor, trace, and govern your AI agents in real-time",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"bin": {
|
|
15
|
+
"leap360": "./dist/cli.js"
|
|
16
|
+
},
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "tsc && node scripts/make-executable.js",
|
|
19
|
+
"build:watch": "tsc --watch",
|
|
20
|
+
"prepublishOnly": "npm run build",
|
|
21
|
+
"test": "node dist/cli.js --version"
|
|
22
|
+
},
|
|
23
|
+
"keywords": [
|
|
24
|
+
"ai",
|
|
25
|
+
"governance",
|
|
26
|
+
"monitoring",
|
|
27
|
+
"tracing",
|
|
28
|
+
"llm",
|
|
29
|
+
"agents",
|
|
30
|
+
"observability",
|
|
31
|
+
"openai",
|
|
32
|
+
"gemini",
|
|
33
|
+
"leap360"
|
|
34
|
+
],
|
|
35
|
+
"author": "Leap360",
|
|
36
|
+
"license": "MIT",
|
|
37
|
+
"dependencies": {
|
|
38
|
+
"commander": "^12.0.0",
|
|
39
|
+
"open": "^10.0.0"
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"@types/node": "^20.0.0",
|
|
43
|
+
"typescript": "^5.3.3"
|
|
44
|
+
},
|
|
45
|
+
"engines": {
|
|
46
|
+
"node": ">=18.0.0"
|
|
47
|
+
},
|
|
48
|
+
"files": [
|
|
49
|
+
"dist",
|
|
50
|
+
"README.md"
|
|
51
|
+
]
|
|
52
|
+
}
|