oblien 1.1.0 → 1.1.1

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 CHANGED
@@ -1,16 +1,6 @@
1
1
  # Oblien Core SDK
2
2
 
3
- Server-side SDK for building AI-powered applications with Oblien platform.
4
-
5
- ## Features
6
-
7
- - 🔐 **Direct header authentication** - Uses `x-client-id` and `x-client-secret` headers
8
- - 👤 **Dual-layer guest identification** - IP + fingerprint for better guest tracking
9
- - 🔄 **Smart guest matching** - Detects same guest even when IP or fingerprint changes
10
- - 📊 **Namespace management** - Multi-tenant workspaces with service configurations
11
- - ⚡ **Automatic rate limiting** - Built-in limits for guest sessions
12
- - 💾 **Flexible storage** - NodeCache (default), Redis, or custom adapters
13
- - 🎯 **Complete usage tracking** - Monitor credits, quotas, and activity
3
+ Complete Node.js SDK for the Oblien AI Platform. Manage agents, chat sessions, sandboxes, namespaces, and more.
14
4
 
15
5
  ## Installation
16
6
 
@@ -18,639 +8,532 @@ Server-side SDK for building AI-powered applications with Oblien platform.
18
8
  npm install oblien
19
9
  ```
20
10
 
21
- ## What This SDK Does
22
-
23
- **Server-Side Only** - This SDK is for creating and managing chat sessions on your server. It **does not** handle actual messaging - that happens client-side in the browser using the tokens this SDK generates.
24
-
25
- ### Workflow:
26
-
27
- 1. **Server:** Create session using this SDK → Get token
28
- 2. **Server:** Send token to client (browser)
29
- 3. **Client:** Use token to chat directly with Oblien API
30
- 4. **Client:** Use [react-chat-agent](https://npmjs.com/package/react-chat-agent) or your own implementation
31
-
32
11
  ## Quick Start
33
12
 
34
- ### 1. Initialize Client
35
-
36
13
  ```javascript
14
+ // Import client
37
15
  import { OblienClient } from 'oblien';
38
16
 
39
- const client = new OblienClient({
40
- apiKey: 'your-client-id', // Your Oblien Client ID
41
- apiSecret: 'your-client-secret', // Your Oblien Client Secret (required)
42
- });
43
- ```
44
-
45
- ### 2. Create Chat Session
46
-
47
- ```javascript
17
+ // Import modules (tree-shakeable)
18
+ import { OblienAgents } from 'oblien/agents';
48
19
  import { OblienChat } from 'oblien/chat';
20
+ import { OblienSandboxes } from 'oblien/sandbox';
21
+ import { OblienSearch } from 'oblien/search';
22
+ import { OblienIcons } from 'oblien/icons';
23
+ import { OblienNamespaces } from 'oblien/namespaces';
24
+ import { OblienCredits } from 'oblien/credits';
49
25
 
50
- const chat = new OblienChat(client);
51
-
52
- // Create session for authenticated user
53
- const session = await chat.createSession({
54
- agentId: 'your-agent-id',
55
- namespace: 'user_123', // Optional: User ID for rate limiting/tracking
56
- // workflowId: 'workflow-id', // Optional
57
- // workspace: {}, // Optional
26
+ // Initialize client
27
+ const client = new OblienClient({
28
+ apiKey: 'your-client-id',
29
+ apiSecret: 'your-client-secret',
30
+ baseURL: 'https://api.oblien.com' // Optional
58
31
  });
59
32
 
60
- console.log(session);
61
- // {
62
- // sessionId: 'session-xxx',
63
- // token: 'jwt-token-for-client',
64
- // agentId: 'agent-id',
65
- // namespace: 'user_123'
66
- // }
67
- ```
68
-
69
- ### 3. Send Token to Client
70
-
71
- ```javascript
72
- // Express example
73
- app.post('/api/create-session', async (req, res) => {
74
- const session = await chat.createSession({
75
- agentId: req.body.agentId,
76
- });
77
-
78
- res.json({
79
- sessionId: session.sessionId,
80
- token: session.token, // Client uses this to chat
81
- });
82
- });
33
+ // Use modules
34
+ const agents = new OblienAgents(client);
35
+ const chat = new OblienChat(client);
36
+ const sandboxes = new OblienSandboxes(client);
37
+ const search = new OblienSearch(client);
38
+ const icons = new OblienIcons(client);
83
39
  ```
84
40
 
85
- ### 4. Client Uses Token
41
+ ---
86
42
 
87
- ```javascript
88
- // In browser (using react-chat-agent)
89
- import { ChatProvider } from 'react-chat-agent';
90
-
91
- function App() {
92
- const [sessionToken, setSessionToken] = useState(null);
93
-
94
- useEffect(() => {
95
- // Get token from your server
96
- fetch('/api/create-session', {
97
- method: 'POST',
98
- body: JSON.stringify({ agentId: 'agent-id' }),
99
- })
100
- .then(r => r.json())
101
- .then(data => setSessionToken(data.token));
102
- }, []);
103
-
104
- if (!sessionToken) return <div>Loading...</div>;
105
-
106
- return (
107
- <ChatProvider token={sessionToken}>
108
- <ChatPanel />
109
- </ChatProvider>
110
- );
111
- }
112
- ```
43
+ ## Modules Overview
113
44
 
114
- ## Guest Sessions (Rate Limited)
45
+ ### 🤖 Agents Module
115
46
 
116
- For anonymous users, create guest sessions with **dual-layer identification** using IP + fingerprint:
47
+ Manage AI agents with settings, tools, and analytics.
117
48
 
118
49
  ```javascript
119
- import { OblienChat } from 'oblien/chat';
120
-
121
- const chat = new OblienChat(client);
50
+ import { OblienAgents } from 'oblien/agents';
122
51
 
123
- // Express route
124
- app.post('/api/guest-session', async (req, res) => {
125
- const ip = req.ip || req.headers['x-forwarded-for'];
126
- const fingerprint = req.body.fingerprint; // Browser fingerprint
127
-
128
- const session = await chat.createGuestSession({
129
- ip,
130
- fingerprint, // NEW: Enables dual-layer identification
131
- agentId: 'your-agent-id',
132
- metadata: {
133
- userAgent: req.headers['user-agent'],
134
- referrer: req.headers['referer'],
135
- },
136
- });
52
+ const agents = new OblienAgents(client);
137
53
 
138
- res.json({
139
- sessionId: session.sessionId,
140
- token: session.token,
141
- guest: session.guest,
142
- // Guest sessions are rate-limited automatically
143
- });
54
+ // Create agent
55
+ const agent = await agents.create({
56
+ name: 'Support Agent',
57
+ namespace: 'production',
58
+ prompts: {
59
+ identity: 'You are a helpful assistant.'
60
+ }
144
61
  });
145
- ```
146
62
 
147
- ### Guest Features:
63
+ // Configure settings
64
+ const agentInstance = agents.agent(agent.agentId);
65
+ await agentInstance.settings.updateModelConfig({
66
+ model: 'oblien-master',
67
+ temperature: 0.8
68
+ });
148
69
 
149
- - **Dual-layer identification**: IP + fingerprint for better guest tracking
150
- - ✅ **Smart guest matching**: Same guest detected even if IP or fingerprint changes
151
- - ✅ Automatic rate limiting (100K tokens/day, 50 messages/day)
152
- - ✅ Privacy-friendly (IP masked, fingerprint hashed)
153
- - ✅ Auto-expiring sessions (24h TTL)
154
- - ✅ Built-in caching with `node-cache` (no Redis required!)
155
- - ✅ Optional Redis support for distributed systems
70
+ // Assign tools
71
+ await agentInstance.settings.updateTools(['web-search', 'calculator']);
156
72
 
157
- ### How Dual-Layer Identification Works:
73
+ // Get analytics
74
+ const overview = await agentInstance.getOverview({ days: 7 });
75
+ ```
158
76
 
159
- The package automatically tracks guests using both IP and fingerprint:
77
+ **Features:**
78
+ - ✅ CRUD operations (create, read, update, delete)
79
+ - ✅ Settings management (5 sections: switches, model, tools, guest limits, context)
80
+ - ✅ Tools management (list, search, create, validate)
81
+ - ✅ Analytics & monitoring
82
+ - ✅ Namespace support
83
+ - ✅ User management
160
84
 
161
- - **Fingerprint changes, IP stays** → Same guest detected ✅
162
- - **IP changes, fingerprint stays** → Same guest detected ✅
163
- - **Both change** → New guest created
85
+ 📖 [Full Documentation](./docs/AGENTS_COMPLETE.md) | 💡 [Examples](./examples/agents-complete-example.js)
164
86
 
165
- This provides better continuity for users on mobile networks or using VPNs.
87
+ ---
166
88
 
167
- ## Namespace Management
89
+ ### 💬 Chat Module
168
90
 
169
- Manage multi-tenant workspaces with service configurations, usage tracking, and quotas.
91
+ Create and manage chat sessions with guest support.
170
92
 
171
93
  ```javascript
172
- import { OblienNamespaces } from 'oblien/namespaces';
94
+ import { OblienChat } from 'oblien/chat';
173
95
 
174
- const namespaces = new OblienNamespaces(client);
96
+ const chat = new OblienChat(client);
175
97
 
176
- // Create a namespace
177
- const namespace = await namespaces.create({
178
- name: 'Production Environment',
179
- type: 'production',
180
- metadata: { region: 'us-east-1' },
181
- tags: ['production', 'critical'],
98
+ // Create session
99
+ const session = await chat.createSession({
100
+ agentId: 'agent-id',
101
+ namespace: 'production'
182
102
  });
183
103
 
184
- // Configure services
185
- await namespaces.configureService(namespace.id, {
186
- service: 'ai',
187
- enabled: true,
188
- config: { model: 'gpt-4', maxTokens: 4000 },
189
- rateLimitRequests: 1000,
190
- rateLimitPeriod: 'hour',
104
+ // Create guest session
105
+ const guestSession = await chat.createGuestSession({
106
+ ip: '192.168.1.1',
107
+ fingerprint: 'abc123',
108
+ agentId: 'agent-id'
191
109
  });
192
110
 
193
- // Get usage statistics
194
- const usage = await namespaces.getUsage(namespace.id, { days: 30 });
195
- console.log(usage.summary); // Credits, tokens, requests per service
196
-
197
- // List all namespaces
198
- const result = await namespaces.list({
199
- status: 'active',
200
- type: 'production',
201
- });
111
+ // List sessions
112
+ const sessions = await chat.listSessions({ limit: 20 });
202
113
  ```
203
114
 
204
- ### Namespace Features:
115
+ **Features:**
116
+ - ✅ Session management
117
+ - ✅ Guest sessions with fingerprint tracking
118
+ - ✅ Token generation
119
+ - ✅ Automatic guest ID generation
205
120
 
206
- - **Full CRUD** - Create, read, update, delete namespaces
207
- - ✅ **Service configuration** - Enable/disable services per namespace
208
- - ✅ **Usage tracking** - Monitor credits, tokens, and requests
209
- - ✅ **Quota management** - Set limits per service
210
- - ✅ **Activity logging** - Complete audit trail
211
- - ✅ **Rich metadata** - Custom fields and tags
121
+ 📖 [Documentation](./docs/CHAT.md) | 💡 [Examples](./examples/chat-example.js)
212
122
 
213
- [📖 Full Namespaces Documentation](./docs/NAMESPACES.md)
123
+ ---
214
124
 
215
- ## Credits Management
125
+ ### 📦 Sandboxes Module
216
126
 
217
- Manage credits, quotas, usage tracking, and purchases.
127
+ Manage cloud sandboxes (containerized environments).
218
128
 
219
129
  ```javascript
220
- import { OblienCredits } from 'oblien/credits';
130
+ import { OblienSandboxes } from 'oblien/sandbox';
221
131
 
222
- const credits = new OblienCredits(client);
132
+ const sandboxes = new OblienSandboxes(client);
223
133
 
224
- // Get balance
225
- const balance = await credits.getBalance();
134
+ // Create sandbox
135
+ const sandbox = await sandboxes.create({
136
+ name: 'my-dev-env',
137
+ region: 'us-east-1',
138
+ template: 'node-20',
139
+ autoStart: true
140
+ });
226
141
 
227
- // Set namespace quota
228
- await credits.setQuota({
229
- namespace: 'production',
230
- service: 'ai',
231
- quotaLimit: 10000,
232
- period: 'monthly',
142
+ // Use sandbox
143
+ const { url, token } = sandbox.sandbox;
144
+ const response = await fetch(`${url}/files/list`, {
145
+ headers: { 'Authorization': `Bearer ${token}` }
233
146
  });
234
147
 
235
- // Get usage statistics
236
- const stats = await credits.getUsageStats({ days: 7 });
148
+ // Control lifecycle
149
+ await sandboxes.stop(sandboxId);
150
+ await sandboxes.start(sandboxId);
151
+ await sandboxes.restart(sandboxId);
237
152
 
238
- // Purchase credits
239
- const checkout = await credits.createCheckout({
240
- packageId: 'pro',
241
- });
242
- console.log('Checkout URL:', checkout.checkoutUrl);
153
+ // Regenerate token (1h expiry)
154
+ const newToken = await sandboxes.regenerateToken(sandboxId);
243
155
 
244
- // Get transaction history
245
- const history = await credits.getHistory({
246
- namespace: 'production',
247
- service: 'ai',
248
- limit: 50,
249
- });
156
+ // Get metrics
157
+ const metrics = await sandboxes.getMetrics(sandboxId);
250
158
  ```
251
159
 
252
- ### Credits Features:
160
+ **Features:**
161
+ - ✅ Create, start, stop, restart, delete sandboxes
162
+ - ✅ Auto-start option
163
+ - ✅ Token management (1h JWT)
164
+ - ✅ Resource metrics
165
+ - ✅ Multiple templates & regions
166
+ - ✅ Platform statistics
253
167
 
254
- - **Balance management** - Check and add credits
255
- - ✅ **Quota system** - Set limits per namespace and service
256
- - ✅ **Usage tracking** - Complete transaction history
257
- - ✅ **Statistics** - Daily/monthly aggregated data
258
- - ✅ **Purchase integration** - Stripe checkout for buying credits
259
- - ✅ **Package management** - Predefined credit packages
168
+ 📖 [Full Documentation](./docs/SANDBOXES.md) | 💡 [Examples](./examples/sandbox-example.js)
260
169
 
261
- [📖 Full Credits Documentation](./docs/CREDITS.md)
170
+ ---
262
171
 
263
- ## Guest Storage Options
172
+ ### 🗂️ Namespaces Module
264
173
 
265
- ### Default: NodeCache (Recommended)
266
-
267
- Works out of the box - no setup needed:
174
+ Manage namespaces and service configurations.
268
175
 
269
176
  ```javascript
270
- import { OblienChat } from 'oblien/chat';
271
-
272
- const chat = new OblienChat(client);
273
- // Uses NodeCacheStorage by default
274
- // Automatic expiration, memory management, and cleanup
275
- ```
276
-
277
- ### Option 1: Custom NodeCache Settings
177
+ import { OblienNamespaces } from 'oblien/namespaces';
278
178
 
279
- ```javascript
280
- import { OblienChat, NodeCacheStorage } from 'oblien/chat';
179
+ const namespaces = new OblienNamespaces(client);
281
180
 
282
- const storage = new NodeCacheStorage(86400); // 24 hours TTL
181
+ // Create namespace
182
+ const namespace = await namespaces.create({
183
+ name: 'production',
184
+ slug: 'prod',
185
+ type: 'production'
186
+ });
283
187
 
284
- const chat = new OblienChat(client, {
285
- guestStorage: storage,
188
+ // Configure services
189
+ await namespaces.configureService(namespaceId, {
190
+ service: 'ai',
191
+ enabled: true,
192
+ config: { /* ... */ }
286
193
  });
287
194
 
288
- // Get cache stats
289
- console.log(storage.getStats());
195
+ // Get usage stats
196
+ const usage = await namespaces.getUsage(namespaceId);
290
197
  ```
291
198
 
292
- ### Option 2: Redis (For Distributed Systems)
199
+ **Features:**
200
+ - ✅ Namespace CRUD
201
+ - ✅ Service configuration
202
+ - ✅ Usage tracking
203
+ - ✅ Activity logs
293
204
 
294
- ```javascript
295
- import { createClient } from 'redis';
296
- import { OblienChat, RedisStorage } from 'oblien/chat';
205
+ 📖 [Documentation](./docs/NAMESPACES.md)
297
206
 
298
- const redis = createClient();
299
- await redis.connect();
207
+ ---
300
208
 
301
- const chat = new OblienChat(client, {
302
- guestStorage: new RedisStorage(redis),
303
- guestTTL: 86400, // 24 hours
304
- });
305
- ```
209
+ ### 🎨 Icons Module
306
210
 
307
- ### Option 3: Simple In-Memory (Dev Only)
211
+ Search and fetch icons, images, and videos using AI-powered semantic search.
308
212
 
309
213
  ```javascript
310
- import { OblienChat, InMemoryStorage } from 'oblien/chat';
311
-
312
- const chat = new OblienChat(client, {
313
- guestStorage: new InMemoryStorage(),
314
- });
315
- // Note: Basic Map storage, no advanced features
214
+ import { OblienIcons } from 'oblien/icons';
215
+
216
+ const icons = new OblienIcons(client);
217
+
218
+ // Search for icons
219
+ const results = await icons.search('home', { limit: 20 });
220
+
221
+ // Fetch specific icons
222
+ const icon = await icons.fetchIcon('settings gear');
223
+
224
+ // Fetch multiple icons at once
225
+ const iconSet = await icons.fetchIcons([
226
+ 'home',
227
+ 'user profile',
228
+ 'settings',
229
+ 'notification bell'
230
+ ]);
231
+
232
+ // Fetch mixed media (icons, images, videos)
233
+ const media = await icons.fetch([
234
+ { type: 'icon', description: 'user avatar' },
235
+ { type: 'image', description: 'mountain landscape' },
236
+ { type: 'video', description: 'product demo' }
237
+ ]);
316
238
  ```
317
239
 
318
- ## API Reference
240
+ **Features:**
241
+ - ✅ Semantic icon search with AI embeddings
242
+ - ✅ Fetch icons, images, and videos
243
+ - ✅ Relevance scoring
244
+ - ✅ Multiple icon styles (Outline, Filled, etc.)
245
+ - ✅ Batch fetching
246
+ - ✅ Pagination support
247
+ - ✅ CDN-hosted assets
319
248
 
320
- ### `OblienClient`
249
+ 📖 [Full Documentation](./docs/ICONS.md) | 💡 [Examples](./examples/icons-example.js)
321
250
 
322
- Main client for authentication:
251
+ ---
323
252
 
324
- ```javascript
325
- const client = new OblienClient({
326
- apiKey: string,
327
- apiSecret?: string,
328
- baseURL?: string,
329
- });
330
- ```
253
+ ### 💳 Credits Module
331
254
 
332
- ### `OblienChat`
333
-
334
- Session management:
255
+ Manage billing and credits.
335
256
 
336
257
  ```javascript
337
- const chat = new OblienChat(client, options?);
338
-
339
- // Create regular session (authenticated users)
340
- await chat.createSession({
341
- agentId,
342
- namespace?, // Optional: user_id for tracking
343
- workflowId?,
344
- workspace?
345
- });
346
-
347
- // Create guest session (with dual-layer identification)
348
- await chat.createGuestSession({
349
- ip,
350
- fingerprint?, // NEW: Browser fingerprint for better tracking
351
- agentId,
352
- workflowId?,
353
- metadata?,
354
- workspace?
355
- });
356
-
357
- // Get session info
358
- await chat.getSession(sessionId);
258
+ import { OblienCredits } from 'oblien/credits';
359
259
 
360
- // List sessions
361
- await chat.listSessions({ page?, limit? });
260
+ const credits = new OblienCredits(client);
362
261
 
363
- // Delete session
364
- await chat.deleteSession(sessionId);
262
+ // Get balance
263
+ const balance = await credits.getBalance();
365
264
 
366
- // Guest management
367
- await chat.getGuest(ip, fingerprint?); // NEW: Unified function for IP and/or fingerprint lookup
368
- await chat.getAllGuests(); // Admin only
369
- await chat.cleanupGuests(); // Clean expired
265
+ // Get usage
266
+ const usage = await credits.getUsage({ period: 'monthly' });
370
267
  ```
371
268
 
372
- ### `GuestManager`
373
-
374
- Manual guest management:
269
+ **Features:**
270
+ - ✅ Balance checking
271
+ - Usage tracking
272
+ - ✅ Transaction history
375
273
 
376
- ```javascript
377
- import { GuestManager } from 'oblien/chat';
378
-
379
- const guestManager = new GuestManager({
380
- storage?: StorageAdapter,
381
- ttl?: number, // seconds
382
- onGuestCreated?: (guest) => void,
383
- });
384
-
385
- // With dual-layer identification
386
- await guestManager.getOrCreateGuest(ip, fingerprint?, metadata?);
387
-
388
- // Find existing guest by IP and/or fingerprint
389
- await guestManager.findExistingGuest(fingerprint, ip);
390
-
391
- await guestManager.getGuest(guestId);
392
- await guestManager.updateGuest(guestId, updates);
393
- await guestManager.deleteGuest(guestId);
394
- await guestManager.getAllGuests();
395
- await guestManager.cleanup();
396
- ```
274
+ ---
397
275
 
398
276
  ## Complete Example
399
277
 
400
- ### Express Server
401
-
402
278
  ```javascript
403
- import express from 'express';
404
- import { OblienClient, OblienChat } from 'oblien';
405
-
406
- const app = express();
407
- app.use(express.json());
279
+ // Import client and modules
280
+ import { OblienClient } from 'oblien';
281
+ import { OblienAgents } from 'oblien/agents';
282
+ import { OblienChat } from 'oblien/chat';
283
+ import { OblienSandboxes } from 'oblien/sandbox';
408
284
 
409
- // Initialize Oblien
285
+ // Initialize
410
286
  const client = new OblienClient({
411
- apiKey: process.env.OBLIEN_API_KEY,
412
- apiSecret: process.env.OBLIEN_API_SECRET,
287
+ apiKey: 'your-client-id',
288
+ apiSecret: 'your-client-secret'
413
289
  });
414
290
 
291
+ const agents = new OblienAgents(client);
415
292
  const chat = new OblienChat(client);
416
-
417
- // Create authenticated session
418
- app.post('/api/session', async (req, res) => {
419
- try {
420
- const session = await chat.createSession({
421
- agentId: req.body.agentId,
422
- namespace: req.user.id, // Pass user ID as namespace
423
- });
424
-
425
- res.json(session);
426
- } catch (error) {
427
- res.status(500).json({ error: error.message });
428
- }
429
- });
430
-
431
- // Create guest session with dual-layer identification
432
- app.post('/api/guest-session', async (req, res) => {
433
- try {
434
- const ip = req.ip || req.headers['x-forwarded-for'];
435
- const fingerprint = req.body.fingerprint; // From client
436
-
437
- // Check for existing guest first
438
- const existingGuest = await chat.getGuest(ip, fingerprint);
439
-
440
- if (existingGuest && existingGuest.sessions.length > 0) {
441
- // Return existing session if available
442
- const latestSession = existingGuest.sessions[existingGuest.sessions.length - 1];
443
- const sessionDetails = await chat.getSession(latestSession);
444
-
445
- if (sessionDetails?.token) {
446
- return res.json({
447
- ...sessionDetails,
448
- isExisting: true,
449
- });
450
- }
293
+ const sandboxes = new OblienSandboxes(client);
294
+
295
+ async function main() {
296
+ // 1. Create agent with tools
297
+ const agent = await agents.create({
298
+ name: 'Code Assistant',
299
+ namespace: 'production',
300
+ prompts: {
301
+ identity: 'You are a coding assistant.'
451
302
  }
452
-
453
- // Create new guest session
454
- const session = await chat.createGuestSession({
455
- ip,
456
- fingerprint,
457
- agentId: req.body.agentId,
458
- metadata: {
459
- userAgent: req.headers['user-agent'],
460
- },
461
- });
462
-
463
- res.json(session);
464
- } catch (error) {
465
- res.status(500).json({ error: error.message });
466
- }
467
- });
468
-
469
- app.listen(3000);
470
- ```
303
+ });
471
304
 
472
- ### Next.js API Route
305
+ // Configure agent
306
+ const agentInstance = agents.agent(agent.agentId);
307
+ await agentInstance.settings.updateTools(['web-search', 'calculator']);
308
+ await agentInstance.settings.updateModelConfig({
309
+ temperature: 0.7,
310
+ max_tokens: 3000
311
+ });
473
312
 
474
- ```javascript
475
- // pages/api/session.js
476
- import { OblienClient, OblienChat } from 'oblien';
313
+ // 2. Create sandbox for code execution
314
+ const sandbox = await sandboxes.create({
315
+ name: 'code-env',
316
+ template: 'node-20',
317
+ autoStart: true
318
+ });
477
319
 
478
- const client = new OblienClient({
479
- apiKey: process.env.OBLIEN_API_KEY,
480
- apiSecret: process.env.OBLIEN_API_SECRET,
481
- });
320
+ // 3. Create chat session
321
+ const session = await chat.createSession({
322
+ agentId: agent.agentId,
323
+ namespace: 'production'
324
+ });
482
325
 
483
- const chat = new OblienChat(client);
326
+ console.log('Setup complete!');
327
+ console.log('- Agent ID:', agent.agentId);
328
+ console.log('- Sandbox URL:', sandbox.sandbox.url);
329
+ console.log('- Session ID:', session.sessionId);
330
+ }
484
331
 
485
- export default async function handler(req, res) {
486
- if (req.method !== 'POST') {
487
- return res.status(405).json({ error: 'Method not allowed' });
488
- }
332
+ main();
333
+ ```
489
334
 
490
- try {
491
- // For guests
492
- if (!req.headers.authorization) {
493
- const ip = req.headers['x-forwarded-for'] || req.socket.remoteAddress;
494
- const fingerprint = req.body.fingerprint;
495
-
496
- const session = await chat.createGuestSession({
497
- ip,
498
- fingerprint, // Dual-layer identification
499
- agentId: req.body.agentId,
500
- });
501
-
502
- return res.json(session);
503
- }
335
+ ---
504
336
 
505
- // For authenticated users
506
- const session = await chat.createSession({
507
- agentId: req.body.agentId,
508
- namespace: req.user.id, // User ID for tracking
509
- });
337
+ ## Module Structure
510
338
 
511
- res.json(session);
512
- } catch (error) {
513
- res.status(500).json({ error: error.message });
514
- }
515
- }
516
339
  ```
517
-
518
- ## Environment Variables
519
-
520
- ```bash
521
- OBLIEN_API_KEY=your-api-key
522
- OBLIEN_API_SECRET=your-api-secret
523
- OBLIEN_BASE_URL=https://api.oblien.com # Optional
340
+ oblien/
341
+ ├── src/
342
+ │ ├── agents/ # Agents management
343
+ │ │ ├── index.js # OblienAgents class
344
+ │ │ ├── agent.js # Agent instance
345
+ │ │ ├── settings.js # AgentSettings class
346
+ │ │ └── tools.js # Tools class
347
+ │ ├── chat/ # Chat sessions
348
+ │ │ ├── index.js # OblienChat class
349
+ │ │ └── session.js # ChatSession class
350
+ │ ├── sandbox/ # Sandboxes management
351
+ │ │ ├── index.js # OblienSandboxes class
352
+ │ │ └── sandbox.js # Sandbox instance
353
+ │ ├── namespaces/ # Namespaces management
354
+ │ ├── credits/ # Credits & billing
355
+ │ └── client.js # OblienClient (base)
356
+ ├── docs/ # Documentation
357
+ │ ├── AGENTS_COMPLETE.md
358
+ │ ├── SANDBOXES.md
359
+ │ ├── CHAT.md
360
+ │ └── NAMESPACES.md
361
+ └── examples/ # Usage examples
362
+ ├── agents-complete-example.js
363
+ ├── sandbox-example.js
364
+ └── chat-example.js
524
365
  ```
525
366
 
526
- ## Storage Comparison
367
+ ---
527
368
 
528
- | Feature | NodeCache (Default) | InMemory | Redis |
529
- |---------|-------------------|----------|-------|
530
- | **Setup** | ✅ Zero config | ✅ Zero config | ⚠️ Requires Redis |
531
- | **Auto-expiry** | ✅ Yes | ✅ Manual | ✅ Yes |
532
- | **Memory limit** | ✅ Configurable | ❌ No | ✅ Configurable |
533
- | **Statistics** | ✅ Yes | ❌ No | ⚠️ Via Redis |
534
- | **Distributed** | ❌ Single instance | ❌ Single instance | ✅ Multi-server |
535
- | **Persistence** | ❌ Memory only | ❌ Memory only | ✅ Disk backup |
536
- | **Production** | ✅ Recommended | ❌ Dev only | ✅ High-traffic |
369
+ ## API Endpoints
537
370
 
538
- ### When to Use What:
371
+ | Module | Base Path | Operations |
372
+ |--------|-----------|------------|
373
+ | **Agents** | `/ai/agents` | CRUD, settings, tools, analytics |
374
+ | **Chat** | `/ai/session` | Create, list, history |
375
+ | **Sandboxes** | `/sandbox` | CRUD, start/stop/restart, metrics |
376
+ | **Tools** | `/ai/tools` | List, search, create |
377
+ | **Namespaces** | `/namespaces` | CRUD, services, usage |
539
378
 
540
- - **NodeCache**: Most applications, single server, < 100K guests/day ✅ Recommended
541
- - **InMemory**: Development, testing, quick prototypes
542
- - **Redis**: Distributed systems, > 1M guests/day, need persistence
379
+ ---
543
380
 
544
- ## Examples
381
+ ## Authentication
545
382
 
546
- Check the `/examples` folder for complete examples:
383
+ All modules use client credentials authentication:
547
384
 
548
- - `raw.js` - Complete test suite demonstrating all features
549
- - `express-server.js` - Full Express.js implementation
550
- - `nextjs-api-route.js` - Next.js API routes (App Router & Pages Router)
551
- - `with-redis.js` - Production setup with Redis
552
-
553
- Run the test example:
554
- ```bash
555
- cd node_modules/oblien
556
- node examples/raw.js
385
+ ```javascript
386
+ const client = new OblienClient({
387
+ apiKey: 'your-client-id', // X-Client-ID header
388
+ apiSecret: 'your-client-secret' // X-Client-Secret header
389
+ });
557
390
  ```
558
391
 
392
+ Get your credentials from the [Oblien Dashboard](https://dashboard.oblien.com).
393
+
394
+ ---
395
+
559
396
  ## TypeScript Support
560
397
 
561
- Full TypeScript definitions included:
398
+ The SDK includes TypeScript definitions:
562
399
 
563
400
  ```typescript
564
- import { OblienClient, OblienChat } from 'oblien';
401
+ import {
402
+ OblienClient,
403
+ OblienAgents,
404
+ Agent,
405
+ AgentSettings,
406
+ Tools,
407
+ OblienSandboxes,
408
+ Sandbox
409
+ } from 'oblien';
565
410
 
566
411
  const client: OblienClient = new OblienClient({
567
412
  apiKey: string,
568
- apiSecret?: string,
413
+ apiSecret: string
569
414
  });
570
-
571
- const chat: OblienChat = new OblienChat(client);
572
415
  ```
573
416
 
574
- ## FAQ
417
+ ---
575
418
 
576
- ### Q: Do I need Redis?
419
+ ## Error Handling
577
420
 
578
- **A:** No! NodeCache works great for most applications. Use Redis only if you need multi-server support or very high traffic.
421
+ ```javascript
422
+ try {
423
+ const agent = await agents.create({ /* ... */ });
424
+ } catch (error) {
425
+ console.error('Error:', error.message);
426
+
427
+ if (error.message.includes('401')) {
428
+ // Authentication failed
429
+ } else if (error.message.includes('404')) {
430
+ // Resource not found
431
+ } else if (error.message.includes('429')) {
432
+ // Rate limit exceeded
433
+ }
434
+ }
435
+ ```
579
436
 
580
- ### Q: How does guest rate limiting work?
437
+ ---
581
438
 
582
- **A:** Guest sessions are automatically rate-limited by the Oblien API based on the `namespace` (guest ID). Limits:
583
- - 100K tokens/day
584
- - 50 messages/day
585
- - 20 messages/hour
439
+ ## Best Practices
586
440
 
587
- ### Q: How does dual-layer identification work?
441
+ 1. **Reuse Client**: Create one client instance and share across modules
442
+ 2. **Error Handling**: Always wrap API calls in try-catch
443
+ 3. **Token Management**: For sandboxes, refresh tokens before 1h expiry
444
+ 4. **Resource Cleanup**: Stop/delete unused sandboxes and sessions
445
+ 5. **Namespace Organization**: Use namespaces to separate environments
446
+ 6. **Tool Validation**: Validate tools before assigning to agents
588
447
 
589
- **A:** The package tracks guests using both IP address and browser fingerprint:
448
+ ---
449
+
450
+ ## Examples
451
+
452
+ ### Multi-Agent System
590
453
 
591
454
  ```javascript
592
- // First visit: Creates guest with IP + fingerprint
593
- await chat.createGuestSession({
594
- ip: '1.2.3.4',
595
- fingerprint: 'abc123',
596
- agentId: 'agent-id',
455
+ // Create specialized agents
456
+ const coder = await agents.create({
457
+ name: 'Coder',
458
+ prompts: { identity: 'Expert coder' }
597
459
  });
598
460
 
599
- // Same user, different IP (e.g., mobile network)
600
- // → Same guest detected by fingerprint ✅
601
- await chat.createGuestSession({
602
- ip: '5.6.7.8', // Different IP
603
- fingerprint: 'abc123', // Same fingerprint
604
- agentId: 'agent-id',
461
+ const reviewer = await agents.create({
462
+ name: 'Reviewer',
463
+ prompts: { identity: 'Code reviewer' }
605
464
  });
606
465
 
607
- // Same user, different fingerprint (e.g., cleared browser data)
608
- // → Same guest detected by IP ✅
609
- await chat.createGuestSession({
610
- ip: '1.2.3.4', // Same IP
611
- fingerprint: 'xyz789', // Different fingerprint
612
- agentId: 'agent-id',
613
- });
614
- ```
466
+ // Configure each with specific tools
467
+ await agents.agent(coder.agentId).settings.updateTools([
468
+ 'web-search', 'code-interpreter'
469
+ ]);
615
470
 
616
- ### Q: Can I use custom guest IDs instead of IP?
471
+ await agents.agent(reviewer.agentId).settings.updateTools([
472
+ 'code-analyzer', 'security-scanner'
473
+ ]);
474
+ ```
617
475
 
618
- **A:** Yes! Pass it as the `namespace`:
476
+ ### Guest Chat System
619
477
 
620
478
  ```javascript
621
- await chat.createSession({
622
- agentId: 'agent-id',
623
- isGuest: true,
624
- namespace: 'custom-guest-id',
479
+ // Create agent for customer support
480
+ const supportAgent = await agents.create({
481
+ name: 'Support Bot',
482
+ namespace: 'production'
483
+ });
484
+
485
+ // Set guest limits
486
+ await agents.agent(supportAgent.agentId).settings.updateGuestLimits({
487
+ enabled: true,
488
+ max_messages_per_day: 100,
489
+ max_total_tokens_per_day: 50000
490
+ });
491
+
492
+ // Create guest session
493
+ const session = await chat.createGuestSession({
494
+ ip: req.ip,
495
+ fingerprint: req.headers['x-fingerprint'],
496
+ agentId: supportAgent.agentId
625
497
  });
626
498
  ```
627
499
 
628
- ### Q: How do I clean up expired guests?
500
+ ---
501
+
502
+ ## Links
629
503
 
630
- **A:** Call `chat.cleanupGuests()` periodically (e.g., cron job or `setInterval`).
504
+ - **Website**: https://oblien.com
505
+ - **Documentation**: https://docs.oblien.com
506
+ - **Dashboard**: https://dashboard.oblien.com
507
+ - **API Reference**: https://api.oblien.com/docs
508
+ - **Support**: support@oblien.com
509
+ - **GitHub**: https://github.com/oblien/oblien
631
510
 
632
- ## Performance
511
+ ---
633
512
 
634
- Benchmarks on standard server:
513
+ ## License
635
514
 
636
- - Session creation: ~50ms
637
- - Guest lookup (cached): ~1ms
638
- - Guest cleanup (1000 guests): ~100ms
515
+ MIT License - see LICENSE file for details
639
516
 
640
- ## Dependencies
517
+ ---
641
518
 
642
- - `node-cache` - Built-in caching (included)
643
- - `redis` - Optional, for distributed systems (peer dependency)
519
+ ## Changelog
644
520
 
645
- ## License
521
+ ### v1.2.0
522
+ - ✅ Added Sandboxes module
523
+ - ✅ Enhanced Agents module with proper settings sections
524
+ - ✅ Added Tools management
525
+ - ✅ Improved documentation
646
526
 
647
- MIT
527
+ ### v1.1.0
528
+ - ✅ Added Agents module
529
+ - ✅ Added Namespaces module
530
+ - ✅ Guest session support
648
531
 
649
- ## Links
532
+ ### v1.0.0
533
+ - ✅ Initial release
534
+ - ✅ Chat module
535
+ - ✅ Credits module
536
+
537
+ ---
650
538
 
651
- - [Documentation](https://oblien.com/docs/core-sdk)
652
- - [GitHub](https://github.com/oblien/oblien)
653
- - [Website](https://oblien.com)
654
- - [React Chat Agent](https://npmjs.com/package/react-chat-agent) - Client-side chat component
655
- - [Agent Sandbox](https://npmjs.com/package/agent-sandbox) - Sandbox SDK
656
- - [AI smart assets fetch](https://npmjs.com/package/assets-ai) - Assets AI
539
+ Made with ❤️ by the Oblien Team