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 +377 -494
- package/agents.js +14 -0
- package/icons.js +11 -0
- package/index.js +16 -0
- package/package.json +9 -2
- package/sandbox.js +12 -0
- package/search.js +11 -0
- package/src/agents/agent.js +229 -0
- package/src/agents/index.js +212 -0
- package/src/agents/settings.js +100 -0
- package/src/agents/tools.js +155 -0
- package/src/icons/index.js +185 -0
- package/src/sandbox/index.js +185 -0
- package/src/sandbox/sandbox.js +124 -0
- package/src/search/index.js +191 -0
package/README.md
CHANGED
|
@@ -1,16 +1,6 @@
|
|
|
1
1
|
# Oblien Core SDK
|
|
2
2
|
|
|
3
|
-
|
|
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
|
-
|
|
40
|
-
|
|
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
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
|
|
41
|
+
---
|
|
86
42
|
|
|
87
|
-
|
|
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
|
-
|
|
45
|
+
### 🤖 Agents Module
|
|
115
46
|
|
|
116
|
-
|
|
47
|
+
Manage AI agents with settings, tools, and analytics.
|
|
117
48
|
|
|
118
49
|
```javascript
|
|
119
|
-
import {
|
|
120
|
-
|
|
121
|
-
const chat = new OblienChat(client);
|
|
50
|
+
import { OblienAgents } from 'oblien/agents';
|
|
122
51
|
|
|
123
|
-
|
|
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
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
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
|
-
|
|
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
|
-
|
|
150
|
-
-
|
|
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
|
-
|
|
73
|
+
// Get analytics
|
|
74
|
+
const overview = await agentInstance.getOverview({ days: 7 });
|
|
75
|
+
```
|
|
158
76
|
|
|
159
|
-
|
|
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
|
-
|
|
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
|
-
|
|
87
|
+
---
|
|
166
88
|
|
|
167
|
-
|
|
89
|
+
### 💬 Chat Module
|
|
168
90
|
|
|
169
|
-
|
|
91
|
+
Create and manage chat sessions with guest support.
|
|
170
92
|
|
|
171
93
|
```javascript
|
|
172
|
-
import {
|
|
94
|
+
import { OblienChat } from 'oblien/chat';
|
|
173
95
|
|
|
174
|
-
const
|
|
96
|
+
const chat = new OblienChat(client);
|
|
175
97
|
|
|
176
|
-
// Create
|
|
177
|
-
const
|
|
178
|
-
|
|
179
|
-
|
|
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
|
-
//
|
|
185
|
-
await
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
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
|
-
//
|
|
194
|
-
const
|
|
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
|
-
|
|
115
|
+
**Features:**
|
|
116
|
+
- ✅ Session management
|
|
117
|
+
- ✅ Guest sessions with fingerprint tracking
|
|
118
|
+
- ✅ Token generation
|
|
119
|
+
- ✅ Automatic guest ID generation
|
|
205
120
|
|
|
206
|
-
|
|
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
|
-
|
|
123
|
+
---
|
|
214
124
|
|
|
215
|
-
|
|
125
|
+
### 📦 Sandboxes Module
|
|
216
126
|
|
|
217
|
-
Manage
|
|
127
|
+
Manage cloud sandboxes (containerized environments).
|
|
218
128
|
|
|
219
129
|
```javascript
|
|
220
|
-
import {
|
|
130
|
+
import { OblienSandboxes } from 'oblien/sandbox';
|
|
221
131
|
|
|
222
|
-
const
|
|
132
|
+
const sandboxes = new OblienSandboxes(client);
|
|
223
133
|
|
|
224
|
-
//
|
|
225
|
-
const
|
|
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
|
-
//
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
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
|
-
//
|
|
236
|
-
|
|
148
|
+
// Control lifecycle
|
|
149
|
+
await sandboxes.stop(sandboxId);
|
|
150
|
+
await sandboxes.start(sandboxId);
|
|
151
|
+
await sandboxes.restart(sandboxId);
|
|
237
152
|
|
|
238
|
-
//
|
|
239
|
-
const
|
|
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
|
|
245
|
-
const
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
170
|
+
---
|
|
262
171
|
|
|
263
|
-
|
|
172
|
+
### 🗂️ Namespaces Module
|
|
264
173
|
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
Works out of the box - no setup needed:
|
|
174
|
+
Manage namespaces and service configurations.
|
|
268
175
|
|
|
269
176
|
```javascript
|
|
270
|
-
import {
|
|
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
|
-
|
|
280
|
-
import { OblienChat, NodeCacheStorage } from 'oblien/chat';
|
|
179
|
+
const namespaces = new OblienNamespaces(client);
|
|
281
180
|
|
|
282
|
-
|
|
181
|
+
// Create namespace
|
|
182
|
+
const namespace = await namespaces.create({
|
|
183
|
+
name: 'production',
|
|
184
|
+
slug: 'prod',
|
|
185
|
+
type: 'production'
|
|
186
|
+
});
|
|
283
187
|
|
|
284
|
-
|
|
285
|
-
|
|
188
|
+
// Configure services
|
|
189
|
+
await namespaces.configureService(namespaceId, {
|
|
190
|
+
service: 'ai',
|
|
191
|
+
enabled: true,
|
|
192
|
+
config: { /* ... */ }
|
|
286
193
|
});
|
|
287
194
|
|
|
288
|
-
// Get
|
|
289
|
-
|
|
195
|
+
// Get usage stats
|
|
196
|
+
const usage = await namespaces.getUsage(namespaceId);
|
|
290
197
|
```
|
|
291
198
|
|
|
292
|
-
|
|
199
|
+
**Features:**
|
|
200
|
+
- ✅ Namespace CRUD
|
|
201
|
+
- ✅ Service configuration
|
|
202
|
+
- ✅ Usage tracking
|
|
203
|
+
- ✅ Activity logs
|
|
293
204
|
|
|
294
|
-
|
|
295
|
-
import { createClient } from 'redis';
|
|
296
|
-
import { OblienChat, RedisStorage } from 'oblien/chat';
|
|
205
|
+
📖 [Documentation](./docs/NAMESPACES.md)
|
|
297
206
|
|
|
298
|
-
|
|
299
|
-
await redis.connect();
|
|
207
|
+
---
|
|
300
208
|
|
|
301
|
-
|
|
302
|
-
guestStorage: new RedisStorage(redis),
|
|
303
|
-
guestTTL: 86400, // 24 hours
|
|
304
|
-
});
|
|
305
|
-
```
|
|
209
|
+
### 🎨 Icons Module
|
|
306
210
|
|
|
307
|
-
|
|
211
|
+
Search and fetch icons, images, and videos using AI-powered semantic search.
|
|
308
212
|
|
|
309
213
|
```javascript
|
|
310
|
-
import {
|
|
311
|
-
|
|
312
|
-
const
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
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
|
-
|
|
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
|
-
|
|
249
|
+
📖 [Full Documentation](./docs/ICONS.md) | 💡 [Examples](./examples/icons-example.js)
|
|
321
250
|
|
|
322
|
-
|
|
251
|
+
---
|
|
323
252
|
|
|
324
|
-
|
|
325
|
-
const client = new OblienClient({
|
|
326
|
-
apiKey: string,
|
|
327
|
-
apiSecret?: string,
|
|
328
|
-
baseURL?: string,
|
|
329
|
-
});
|
|
330
|
-
```
|
|
253
|
+
### 💳 Credits Module
|
|
331
254
|
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
Session management:
|
|
255
|
+
Manage billing and credits.
|
|
335
256
|
|
|
336
257
|
```javascript
|
|
337
|
-
|
|
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
|
-
|
|
361
|
-
await chat.listSessions({ page?, limit? });
|
|
260
|
+
const credits = new OblienCredits(client);
|
|
362
261
|
|
|
363
|
-
//
|
|
364
|
-
await
|
|
262
|
+
// Get balance
|
|
263
|
+
const balance = await credits.getBalance();
|
|
365
264
|
|
|
366
|
-
//
|
|
367
|
-
await
|
|
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
|
-
|
|
373
|
-
|
|
374
|
-
|
|
269
|
+
**Features:**
|
|
270
|
+
- ✅ Balance checking
|
|
271
|
+
- ✅ Usage tracking
|
|
272
|
+
- ✅ Transaction history
|
|
375
273
|
|
|
376
|
-
|
|
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
|
-
|
|
404
|
-
import { OblienClient
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
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
|
|
285
|
+
// Initialize
|
|
410
286
|
const client = new OblienClient({
|
|
411
|
-
apiKey:
|
|
412
|
-
apiSecret:
|
|
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
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
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
|
-
|
|
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
|
-
|
|
475
|
-
|
|
476
|
-
|
|
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
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
320
|
+
// 3. Create chat session
|
|
321
|
+
const session = await chat.createSession({
|
|
322
|
+
agentId: agent.agentId,
|
|
323
|
+
namespace: 'production'
|
|
324
|
+
});
|
|
482
325
|
|
|
483
|
-
|
|
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
|
-
|
|
486
|
-
|
|
487
|
-
return res.status(405).json({ error: 'Method not allowed' });
|
|
488
|
-
}
|
|
332
|
+
main();
|
|
333
|
+
```
|
|
489
334
|
|
|
490
|
-
|
|
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
|
-
|
|
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
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
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
|
-
|
|
367
|
+
---
|
|
527
368
|
|
|
528
|
-
|
|
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
|
-
|
|
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
|
-
|
|
541
|
-
- **InMemory**: Development, testing, quick prototypes
|
|
542
|
-
- **Redis**: Distributed systems, > 1M guests/day, need persistence
|
|
379
|
+
---
|
|
543
380
|
|
|
544
|
-
##
|
|
381
|
+
## Authentication
|
|
545
382
|
|
|
546
|
-
|
|
383
|
+
All modules use client credentials authentication:
|
|
547
384
|
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
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
|
-
|
|
398
|
+
The SDK includes TypeScript definitions:
|
|
562
399
|
|
|
563
400
|
```typescript
|
|
564
|
-
import {
|
|
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
|
|
413
|
+
apiSecret: string
|
|
569
414
|
});
|
|
570
|
-
|
|
571
|
-
const chat: OblienChat = new OblienChat(client);
|
|
572
415
|
```
|
|
573
416
|
|
|
574
|
-
|
|
417
|
+
---
|
|
575
418
|
|
|
576
|
-
|
|
419
|
+
## Error Handling
|
|
577
420
|
|
|
578
|
-
|
|
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
|
-
|
|
437
|
+
---
|
|
581
438
|
|
|
582
|
-
|
|
583
|
-
- 100K tokens/day
|
|
584
|
-
- 50 messages/day
|
|
585
|
-
- 20 messages/hour
|
|
439
|
+
## Best Practices
|
|
586
440
|
|
|
587
|
-
|
|
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
|
-
|
|
448
|
+
---
|
|
449
|
+
|
|
450
|
+
## Examples
|
|
451
|
+
|
|
452
|
+
### Multi-Agent System
|
|
590
453
|
|
|
591
454
|
```javascript
|
|
592
|
-
//
|
|
593
|
-
await
|
|
594
|
-
|
|
595
|
-
|
|
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
|
-
|
|
600
|
-
|
|
601
|
-
|
|
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
|
-
//
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
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
|
-
|
|
471
|
+
await agents.agent(reviewer.agentId).settings.updateTools([
|
|
472
|
+
'code-analyzer', 'security-scanner'
|
|
473
|
+
]);
|
|
474
|
+
```
|
|
617
475
|
|
|
618
|
-
|
|
476
|
+
### Guest Chat System
|
|
619
477
|
|
|
620
478
|
```javascript
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
namespace: '
|
|
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
|
-
|
|
500
|
+
---
|
|
501
|
+
|
|
502
|
+
## Links
|
|
629
503
|
|
|
630
|
-
**
|
|
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
|
-
|
|
511
|
+
---
|
|
633
512
|
|
|
634
|
-
|
|
513
|
+
## License
|
|
635
514
|
|
|
636
|
-
-
|
|
637
|
-
- Guest lookup (cached): ~1ms
|
|
638
|
-
- Guest cleanup (1000 guests): ~100ms
|
|
515
|
+
MIT License - see LICENSE file for details
|
|
639
516
|
|
|
640
|
-
|
|
517
|
+
---
|
|
641
518
|
|
|
642
|
-
|
|
643
|
-
- `redis` - Optional, for distributed systems (peer dependency)
|
|
519
|
+
## Changelog
|
|
644
520
|
|
|
645
|
-
|
|
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
|
-
|
|
527
|
+
### v1.1.0
|
|
528
|
+
- ✅ Added Agents module
|
|
529
|
+
- ✅ Added Namespaces module
|
|
530
|
+
- ✅ Guest session support
|
|
648
531
|
|
|
649
|
-
|
|
532
|
+
### v1.0.0
|
|
533
|
+
- ✅ Initial release
|
|
534
|
+
- ✅ Chat module
|
|
535
|
+
- ✅ Credits module
|
|
536
|
+
|
|
537
|
+
---
|
|
650
538
|
|
|
651
|
-
|
|
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
|