leap360 1.2.3 → 1.3.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/cli.js +183 -3
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -14,7 +14,7 @@ const program = new Command();
|
|
|
14
14
|
program
|
|
15
15
|
.name('leap360')
|
|
16
16
|
.description('Leap360 AI Governance SDK CLI')
|
|
17
|
-
.version('1.
|
|
17
|
+
.version('1.3.0');
|
|
18
18
|
// ─── Command: setup ────────────────────────────────────────────────────────
|
|
19
19
|
program
|
|
20
20
|
.command('setup')
|
|
@@ -22,7 +22,7 @@ program
|
|
|
22
22
|
.action(async () => {
|
|
23
23
|
console.log('\n🔐 Leap360 Setup\n');
|
|
24
24
|
console.log(' Welcome! Let\'s configure your API key.\n');
|
|
25
|
-
console.log(' Get your API key from:
|
|
25
|
+
console.log(' Get your API key from: \x1b[1m\x1b[34mhttps://leap360.ai/dashboard/\x1b[0m → Settings\n');
|
|
26
26
|
const rl = readline.createInterface({
|
|
27
27
|
input: process.stdin,
|
|
28
28
|
output: process.stdout
|
|
@@ -79,7 +79,187 @@ program
|
|
|
79
79
|
console.log('\n✅ Configuration saved!\n');
|
|
80
80
|
console.log(` → ~/.leap360/config.json (SDK config)`);
|
|
81
81
|
console.log(` → ${envPath} (environment variables)\n`);
|
|
82
|
-
|
|
82
|
+
// ── Generate .leap360/ folder with integration guides ──────────────
|
|
83
|
+
const guideDir = path.join(process.cwd(), '.leap360');
|
|
84
|
+
try {
|
|
85
|
+
fs.mkdirSync(guideDir, { recursive: true });
|
|
86
|
+
}
|
|
87
|
+
catch { /* exists */ }
|
|
88
|
+
// README.md — main guide
|
|
89
|
+
const readme = `# Leap360 AI Governance — Integration Guide
|
|
90
|
+
|
|
91
|
+
Your project is connected to Leap360. Every AI call is now traced, governed,
|
|
92
|
+
and monitored in real time.
|
|
93
|
+
|
|
94
|
+
Dashboard: https://leap360.ai/dashboard/
|
|
95
|
+
API Key: ${apiKey.substring(0, 20)}...
|
|
96
|
+
Project: ${projectId}
|
|
97
|
+
Service: ${serviceName}
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## 1. Node.js / TypeScript (OpenAI)
|
|
102
|
+
|
|
103
|
+
\`\`\`typescript
|
|
104
|
+
import { Leap360 } from 'leap360';
|
|
105
|
+
import OpenAI from 'openai';
|
|
106
|
+
|
|
107
|
+
// One line — wraps ALL OpenAI calls automatically
|
|
108
|
+
Leap360.autoInit({
|
|
109
|
+
apiKey: process.env.LEAP360_API_KEY,
|
|
110
|
+
projectId: '${projectId}',
|
|
111
|
+
serviceName: '${serviceName}',
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
const openai = new OpenAI();
|
|
115
|
+
|
|
116
|
+
const res = await openai.chat.completions.create({
|
|
117
|
+
model: 'gpt-4o',
|
|
118
|
+
messages: [{ role: 'user', content: 'Hello!' }],
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
// ↑ This call is automatically traced, governed, and visible on your dashboard.
|
|
122
|
+
// If a policy is violated → SDK throws before the call reaches OpenAI.
|
|
123
|
+
// If kill switch is active → SDK throws GOVERNANCE_HALT immediately.
|
|
124
|
+
\`\`\`
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## 2. Python
|
|
129
|
+
|
|
130
|
+
\`\`\`python
|
|
131
|
+
from leap360 import Leap360
|
|
132
|
+
from openai import OpenAI
|
|
133
|
+
|
|
134
|
+
# Initialise — wraps the OpenAI client
|
|
135
|
+
leap = Leap360(
|
|
136
|
+
api_key="${apiKey.substring(0, 20)}...",
|
|
137
|
+
project_id="${projectId}",
|
|
138
|
+
service_name="${serviceName}",
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
client = leap.wrap_openai(OpenAI())
|
|
142
|
+
|
|
143
|
+
response = client.chat.completions.create(
|
|
144
|
+
model="gpt-4o",
|
|
145
|
+
messages=[{"role": "user", "content": "Hello!"}],
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
# Every call is traced. Violations are blocked before they reach OpenAI.
|
|
149
|
+
\`\`\`
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## 3. Manual trace (any language / any model)
|
|
154
|
+
|
|
155
|
+
\`\`\`typescript
|
|
156
|
+
import { Leap360 } from 'leap360';
|
|
157
|
+
|
|
158
|
+
const leap = new Leap360({
|
|
159
|
+
apiKey: process.env.LEAP360_API_KEY,
|
|
160
|
+
projectId: '${projectId}',
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
const result = await leap.traceCall({
|
|
164
|
+
agentName: 'my-agent',
|
|
165
|
+
provider: 'anthropic',
|
|
166
|
+
model: 'claude-3-5-sonnet',
|
|
167
|
+
fn: () => anthropic.messages.create({ ... }),
|
|
168
|
+
});
|
|
169
|
+
\`\`\`
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## 4. Kill Switch (emergency stop)
|
|
174
|
+
|
|
175
|
+
Via dashboard: Settings → Danger Zone → Suspend All Agents
|
|
176
|
+
|
|
177
|
+
Via API:
|
|
178
|
+
\`\`\`bash
|
|
179
|
+
curl -X POST https://b0vyk178b7.execute-api.us-east-1.amazonaws.com/v1/projects/${projectId}/status \\
|
|
180
|
+
-H "x-api-key: ${apiKey}" \\
|
|
181
|
+
-H "Content-Type: application/json" \\
|
|
182
|
+
-d '{"status":"SUSPENDED"}'
|
|
183
|
+
\`\`\`
|
|
184
|
+
|
|
185
|
+
Resume:
|
|
186
|
+
\`\`\`bash
|
|
187
|
+
curl -X POST https://b0vyk178b7.execute-api.us-east-1.amazonaws.com/v1/projects/${projectId}/status \\
|
|
188
|
+
-H "x-api-key: ${apiKey}" \\
|
|
189
|
+
-H "Content-Type: application/json" \\
|
|
190
|
+
-d '{"status":"ACTIVE"}'
|
|
191
|
+
\`\`\`
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## 5. Policy enforcement
|
|
196
|
+
|
|
197
|
+
Create a policy on the dashboard (Policies & Rules page), then every agent
|
|
198
|
+
response is evaluated by the LLM Judge. Actions:
|
|
199
|
+
|
|
200
|
+
- warn → logs the violation, allows the response through
|
|
201
|
+
- ask_admin → flags for human review in the Approval Queue
|
|
202
|
+
- block → hard-rejects the response, SDK receives POLICY_VIOLATION_BLOCKED
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
Generated by \`npx leap360 setup\` on ${new Date().toISOString().split('T')[0]}
|
|
207
|
+
`;
|
|
208
|
+
// sample-node.ts
|
|
209
|
+
const sampleNode = `import { Leap360 } from 'leap360';
|
|
210
|
+
import OpenAI from 'openai';
|
|
211
|
+
|
|
212
|
+
Leap360.autoInit({
|
|
213
|
+
apiKey: process.env.LEAP360_API_KEY!,
|
|
214
|
+
projectId: '${projectId}',
|
|
215
|
+
serviceName: '${serviceName}',
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
const openai = new OpenAI();
|
|
219
|
+
|
|
220
|
+
async function main() {
|
|
221
|
+
const res = await openai.chat.completions.create({
|
|
222
|
+
model: 'gpt-4o',
|
|
223
|
+
messages: [{ role: 'user', content: 'What is the capital of France?' }],
|
|
224
|
+
});
|
|
225
|
+
console.log(res.choices[0].message.content);
|
|
226
|
+
// Check your dashboard: https://leap360.ai/dashboard/
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
main();
|
|
230
|
+
`;
|
|
231
|
+
// sample-python.py
|
|
232
|
+
const samplePython = `from leap360 import Leap360
|
|
233
|
+
from openai import OpenAI
|
|
234
|
+
import os
|
|
235
|
+
|
|
236
|
+
leap = Leap360(
|
|
237
|
+
api_key=os.environ["LEAP360_API_KEY"],
|
|
238
|
+
project_id="${projectId}",
|
|
239
|
+
service_name="${serviceName}",
|
|
240
|
+
)
|
|
241
|
+
|
|
242
|
+
client = leap.wrap_openai(OpenAI())
|
|
243
|
+
|
|
244
|
+
response = client.chat.completions.create(
|
|
245
|
+
model="gpt-4o",
|
|
246
|
+
messages=[{"role": "user", "content": "What is the capital of France?"}],
|
|
247
|
+
)
|
|
248
|
+
|
|
249
|
+
print(response.choices[0].message.content)
|
|
250
|
+
# Check your dashboard: https://leap360.ai/dashboard/
|
|
251
|
+
`;
|
|
252
|
+
try {
|
|
253
|
+
fs.writeFileSync(path.join(guideDir, 'README.md'), readme.trim() + '\n');
|
|
254
|
+
fs.writeFileSync(path.join(guideDir, 'sample-node.ts'), sampleNode.trim() + '\n');
|
|
255
|
+
fs.writeFileSync(path.join(guideDir, 'sample-python.py'), samplePython.trim() + '\n');
|
|
256
|
+
console.log(` → .leap360/README.md (integration guide)`);
|
|
257
|
+
console.log(` → .leap360/sample-node.ts (Node.js / TypeScript sample)`);
|
|
258
|
+
console.log(` → .leap360/sample-python.py (Python sample)\n`);
|
|
259
|
+
}
|
|
260
|
+
catch { /* ignore write errors */ }
|
|
261
|
+
console.log(' \x1b[36mSetup complete! Open your dashboard:\x1b[0m');
|
|
262
|
+
console.log(' \x1b[1m\x1b[34m https://leap360.ai/dashboard/\x1b[0m\n');
|
|
83
263
|
}
|
|
84
264
|
catch (err) {
|
|
85
265
|
console.error('\n❌ Setup failed:', err.message);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC/E,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AAErC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,+BAA+B,CAAC;KAC5C,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,8EAA8E;AAC9E,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,mDAAmD,CAAC;KAChE,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|