openkbs 0.0.64 → 0.0.66

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.
Files changed (41) hide show
  1. package/elastic/README.md +1150 -0
  2. package/elastic/functions.md +328 -0
  3. package/elastic/postgres.md +287 -0
  4. package/elastic/pulse.md +386 -0
  5. package/elastic/storage.md +291 -0
  6. package/package.json +1 -1
  7. package/src/actions.js +76 -92
  8. package/src/index.js +23 -10
  9. package/src/utils.js +8 -4
  10. package/templates/.claude/skills/openkbs/SKILL.md +184 -0
  11. package/templates/.claude/skills/openkbs/metadata.json +1 -0
  12. package/templates/.claude/skills/openkbs/reference/backend-sdk.md +428 -0
  13. package/templates/.claude/skills/openkbs/reference/commands.md +370 -0
  14. package/templates/.claude/skills/openkbs/reference/elastic-services.md +327 -0
  15. package/templates/.claude/skills/openkbs/reference/frontend-sdk.md +299 -0
  16. package/version.json +3 -3
  17. package/templates/.openkbs/knowledge/metadata.json +0 -3
  18. package/templates/CLAUDE.md +0 -655
  19. /package/templates/{.openkbs/knowledge → .claude/skills/openkbs}/examples/ai-copywriter-agent/app/icon.png +0 -0
  20. /package/templates/{.openkbs/knowledge → .claude/skills/openkbs}/examples/ai-copywriter-agent/app/instructions.txt +0 -0
  21. /package/templates/{.openkbs/knowledge → .claude/skills/openkbs}/examples/ai-copywriter-agent/app/settings.json +0 -0
  22. /package/templates/{.openkbs/knowledge → .claude/skills/openkbs}/examples/ai-copywriter-agent/scripts/run_job.js +0 -0
  23. /package/templates/{.openkbs/knowledge → .claude/skills/openkbs}/examples/ai-copywriter-agent/scripts/utils/agent_client.js +0 -0
  24. /package/templates/{.openkbs/knowledge → .claude/skills/openkbs}/examples/ai-copywriter-agent/src/Events/actions.js +0 -0
  25. /package/templates/{.openkbs/knowledge → .claude/skills/openkbs}/examples/ai-copywriter-agent/src/Events/handler.js +0 -0
  26. /package/templates/{.openkbs/knowledge → .claude/skills/openkbs}/examples/ai-copywriter-agent/src/Events/onRequest.js +0 -0
  27. /package/templates/{.openkbs/knowledge → .claude/skills/openkbs}/examples/ai-copywriter-agent/src/Events/onRequest.json +0 -0
  28. /package/templates/{.openkbs/knowledge → .claude/skills/openkbs}/examples/ai-copywriter-agent/src/Events/onResponse.js +0 -0
  29. /package/templates/{.openkbs/knowledge → .claude/skills/openkbs}/examples/ai-copywriter-agent/src/Events/onResponse.json +0 -0
  30. /package/templates/{.openkbs/knowledge → .claude/skills/openkbs}/examples/ai-copywriter-agent/src/Frontend/contentRender.js +0 -0
  31. /package/templates/{.openkbs/knowledge → .claude/skills/openkbs}/examples/ai-copywriter-agent/src/Frontend/contentRender.json +0 -0
  32. /package/templates/{.openkbs/knowledge → .claude/skills/openkbs}/examples/ai-marketing-agent/README.md +0 -0
  33. /package/templates/{.openkbs/knowledge → .claude/skills/openkbs}/examples/ai-marketing-agent/app/instructions.txt +0 -0
  34. /package/templates/{.openkbs/knowledge → .claude/skills/openkbs}/examples/ai-marketing-agent/app/settings.json +0 -0
  35. /package/templates/{.openkbs/knowledge → .claude/skills/openkbs}/examples/ai-marketing-agent/src/Events/actions.js +0 -0
  36. /package/templates/{.openkbs/knowledge → .claude/skills/openkbs}/examples/ai-marketing-agent/src/Events/onRequest.js +0 -0
  37. /package/templates/{.openkbs/knowledge → .claude/skills/openkbs}/examples/ai-marketing-agent/src/Events/onRequest.json +0 -0
  38. /package/templates/{.openkbs/knowledge → .claude/skills/openkbs}/examples/ai-marketing-agent/src/Events/onResponse.js +0 -0
  39. /package/templates/{.openkbs/knowledge → .claude/skills/openkbs}/examples/ai-marketing-agent/src/Events/onResponse.json +0 -0
  40. /package/templates/{.openkbs/knowledge → .claude/skills/openkbs}/examples/ai-marketing-agent/src/Frontend/contentRender.js +0 -0
  41. /package/templates/{.openkbs/knowledge → .claude/skills/openkbs}/examples/ai-marketing-agent/src/Frontend/contentRender.json +0 -0
@@ -0,0 +1,428 @@
1
+ # Backend SDK Reference
2
+
3
+ The `openkbs` object is available globally in all backend handlers (`onRequest.js`, `onResponse.js`, `actions.js`, `onCronjob.js`, `onPublicAPIRequest.js`).
4
+
5
+ ## Search & Content
6
+
7
+ ### googleSearch(query, options)
8
+
9
+ Search Google for information.
10
+
11
+ ```javascript
12
+ // Web search
13
+ const results = await openkbs.googleSearch('AI trends 2025');
14
+ // Returns: [{ title, link, snippet, pagemap }, ...]
15
+
16
+ // Image search
17
+ const images = await openkbs.googleSearch('sunset photography', { searchType: 'image' });
18
+ // pagemap.cse_image[0].src contains image URL
19
+ ```
20
+
21
+ ### webpageToText(url, options)
22
+
23
+ Extract text content from a webpage.
24
+
25
+ ```javascript
26
+ const content = await openkbs.webpageToText('https://example.com');
27
+ // Returns: { content: "page text..." }
28
+
29
+ // With price parsing (extracts structured price data)
30
+ const content = await openkbs.webpageToText('https://shop.com/product', { parsePrice: true });
31
+ ```
32
+
33
+ ## Image Generation
34
+
35
+ ### generateImage(prompt, options)
36
+
37
+ Generate AI images using Gemini or GPT.
38
+
39
+ ```javascript
40
+ // Gemini model (default) - supports reference images for editing
41
+ const images = await openkbs.generateImage('sunset over mountains', {
42
+ model: 'gemini-2.5-flash-image',
43
+ aspect_ratio: '16:9', // 1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9
44
+ n: 1,
45
+ imageUrls: ['reference.jpg'] // optional - for editing/variations
46
+ });
47
+
48
+ // GPT model - better for text in images
49
+ const images = await openkbs.generateImage('logo with text', {
50
+ model: 'gpt-image-1',
51
+ size: '1024x1024', // 1024x1024, 1536x1024, 1024x1536, auto
52
+ quality: 'high',
53
+ n: 1
54
+ });
55
+
56
+ // Returns: [{ b64_json: "base64..." }, ...]
57
+ ```
58
+
59
+ ### uploadImage(base64, filename, mimeType)
60
+
61
+ Upload image to permanent S3 storage.
62
+
63
+ ```javascript
64
+ const uploaded = await openkbs.uploadImage(
65
+ images[0].b64_json,
66
+ 'image.png',
67
+ 'image/png'
68
+ );
69
+ console.log(uploaded.url); // https://file.openkbs.com/files/.../image.png
70
+ ```
71
+
72
+ ## Video Generation
73
+
74
+ ### generateVideo(prompt, options)
75
+
76
+ Generate AI videos using Sora 2.
77
+
78
+ ```javascript
79
+ const video = await openkbs.generateVideo('cinematic sunset timelapse', {
80
+ video_model: 'sora-2', // or 'sora-2-pro' (higher quality)
81
+ seconds: 8, // 4, 8, or 12
82
+ size: '1280x720' // '1280x720' (landscape) or '720x1280' (portrait)
83
+ });
84
+
85
+ // With reference image
86
+ const video = await openkbs.generateVideo('animate this scene', {
87
+ video_model: 'sora-2',
88
+ seconds: 8,
89
+ input_reference_url: 'https://example.com/reference.jpg'
90
+ });
91
+
92
+ // Returns: [{ status: 'pending'|'completed', video_id: '...', video_url: '...' }]
93
+ ```
94
+
95
+ ### checkVideoStatus(videoId)
96
+
97
+ Poll for video generation completion.
98
+
99
+ ```javascript
100
+ const status = await openkbs.checkVideoStatus(videoId);
101
+
102
+ if (status[0].status === 'completed') {
103
+ console.log(status[0].video_url);
104
+ } else if (status[0].status === 'pending') {
105
+ // Continue polling
106
+ } else if (status[0].status === 'failed') {
107
+ // Handle error
108
+ }
109
+ ```
110
+
111
+ ## Memory System (CRUD)
112
+
113
+ ### createItem(params)
114
+
115
+ Create a new item.
116
+
117
+ ```javascript
118
+ await openkbs.createItem({
119
+ itemType: 'memory',
120
+ itemId: 'memory_user_name',
121
+ body: { value: 'John', updatedAt: new Date().toISOString() }
122
+ });
123
+ ```
124
+
125
+ ### updateItem(params)
126
+
127
+ Update an existing item.
128
+
129
+ ```javascript
130
+ await openkbs.updateItem({
131
+ itemType: 'memory',
132
+ itemId: 'memory_user_name',
133
+ body: { value: 'Jane', updatedAt: new Date().toISOString() }
134
+ });
135
+ ```
136
+
137
+ ### getItem(itemId)
138
+
139
+ Get a single item by ID.
140
+
141
+ ```javascript
142
+ const result = await openkbs.getItem('memory_user_name');
143
+ console.log(result.item.body.value); // 'Jane'
144
+ ```
145
+
146
+ ### fetchItems(params)
147
+
148
+ Fetch multiple items with filters.
149
+
150
+ ```javascript
151
+ const items = await openkbs.fetchItems({
152
+ itemType: 'memory',
153
+ beginsWith: 'memory_',
154
+ limit: 100
155
+ });
156
+
157
+ for (const { item, meta } of items.items) {
158
+ console.log(meta.itemId, item.body.value);
159
+ }
160
+ ```
161
+
162
+ ### deleteItem(itemId)
163
+
164
+ Delete an item.
165
+
166
+ ```javascript
167
+ await openkbs.deleteItem('memory_user_name');
168
+ ```
169
+
170
+ ### Upsert Pattern
171
+
172
+ Common pattern for create-or-update:
173
+
174
+ ```javascript
175
+ async function upsertItem(itemType, itemId, body) {
176
+ try {
177
+ await openkbs.updateItem({ itemType, itemId, body });
178
+ } catch (e) {
179
+ await openkbs.createItem({ itemType, itemId, body });
180
+ }
181
+ }
182
+ ```
183
+
184
+ ## Scheduling
185
+
186
+ ### Create Scheduled Task
187
+
188
+ ```javascript
189
+ await openkbs.kb({
190
+ action: 'createScheduledTask',
191
+ scheduledTime: Date.now() + 60 * 60 * 1000, // 1 hour from now
192
+ taskPayload: {
193
+ message: '[SCHEDULED_TASK] Reminder: Call mom',
194
+ createdAt: Date.now()
195
+ },
196
+ description: 'Call mom reminder'
197
+ });
198
+ ```
199
+
200
+ ### Get Scheduled Tasks
201
+
202
+ ```javascript
203
+ const tasks = await openkbs.kb({ action: 'getScheduledTasks' });
204
+ // Returns: [{ timestamp, description, taskPayload }, ...]
205
+ ```
206
+
207
+ ### Delete Scheduled Task
208
+
209
+ ```javascript
210
+ await openkbs.kb({
211
+ action: 'deleteScheduledTask',
212
+ timestamp: 1704067200000
213
+ });
214
+ ```
215
+
216
+ ## Deep Research (Async)
217
+
218
+ Autonomous research agent that searches the web and synthesizes reports. Takes 5-20 minutes.
219
+
220
+ ### Start Research
221
+
222
+ ```javascript
223
+ const researchData = await openkbs.deepResearch(query, params);
224
+
225
+ // query: string - The research topic
226
+ // params: object (optional)
227
+ // - previous_interaction_id: string - For follow-up questions on completed research
228
+
229
+ // Example:
230
+ const result = await openkbs.deepResearch('AI market trends 2025');
231
+
232
+ // With follow-up:
233
+ const followUp = await openkbs.deepResearch('What about healthcare?', {
234
+ previous_interaction_id: 'prev_interaction_id'
235
+ });
236
+
237
+ // Returns:
238
+ // - status: 'in_progress' | 'completed'
239
+ // - interaction_id: string
240
+ // - prepaid_credits: number (when in_progress)
241
+ // - output: string (when completed)
242
+ // - usage: { input_tokens, output_tokens } (when completed)
243
+ ```
244
+
245
+ ### Check Status
246
+
247
+ ```javascript
248
+ const status = await openkbs.checkDeepResearchStatus(interactionId, prepaidCredits);
249
+
250
+ // interactionId: string - From previous deepResearch call
251
+ // prepaidCredits: number - From previous response (for billing)
252
+
253
+ // Returns same structure as deepResearch
254
+ ```
255
+
256
+ ## MCP Integration
257
+
258
+ ### Call MCP Tool
259
+
260
+ ```javascript
261
+ const result = await openkbs.mcp.callTool('brave-search', 'brave_web_search', {
262
+ query: 'React tutorials',
263
+ count: 10
264
+ });
265
+ // Returns: { content: [...] }
266
+ ```
267
+
268
+ Available MCP servers:
269
+ - `brave-search` - Web search (requires `BRAVE_API_KEY` secret)
270
+ - `github` - Repository management (requires `GITHUB_PERSONAL_ACCESS_TOKEN`)
271
+ - `slack` - Messaging (requires `SLACK_BOT_TOKEN`, `SLACK_TEAM_ID`)
272
+
273
+ ## Chat Operations
274
+
275
+ ### Create New Chat
276
+
277
+ ```javascript
278
+ await openkbs.chats({
279
+ chatTitle: 'Morning Briefing',
280
+ message: '[SCHEDULED_TASK] Create morning summary'
281
+ });
282
+ ```
283
+
284
+ ## Communication
285
+
286
+ ### Send Email
287
+
288
+ ```javascript
289
+ await openkbs.sendMail(
290
+ 'user@example.com',
291
+ 'Subject Line',
292
+ '<h1>HTML Body</h1>'
293
+ );
294
+ ```
295
+
296
+ ### Text to Speech
297
+
298
+ ```javascript
299
+ const audio = await openkbs.textToSpeech('Hello world', {
300
+ voice: 'alloy',
301
+ model: 'tts-1'
302
+ });
303
+ ```
304
+
305
+ ### Translate
306
+
307
+ ```javascript
308
+ const translated = await openkbs.translate('Hello', 'es');
309
+ // Returns: "Hola"
310
+ ```
311
+
312
+ ## Encryption
313
+
314
+ ### Encrypt/Decrypt
315
+
316
+ ```javascript
317
+ const encrypted = await openkbs.encrypt({ sensitive: 'data' });
318
+ const decrypted = await openkbs.decrypt(encrypted);
319
+ ```
320
+
321
+ Note: Items with `encrypted: true` in itemTypes are automatically encrypted/decrypted.
322
+
323
+ ## Embeddings
324
+
325
+ ### Create Embeddings
326
+
327
+ ```javascript
328
+ const embedding = await openkbs.createEmbeddings(
329
+ 'text to embed',
330
+ 'text-embedding-3-large'
331
+ );
332
+ // Returns: [0.123, -0.456, ...] (3072 dimensions)
333
+ ```
334
+
335
+ ## File Upload (Presigned URLs)
336
+
337
+ ### createPresignedURL
338
+
339
+ Upload files directly to S3 storage.
340
+
341
+ ```javascript
342
+ // Get presigned URL for upload
343
+ const presignedUrl = await openkbs.kb({
344
+ action: 'createPresignedURL',
345
+ namespace: 'files',
346
+ fileName: 'document.pdf',
347
+ fileType: 'application/pdf',
348
+ presignedOperation: 'putObject'
349
+ });
350
+
351
+ // Upload using axios (globally available)
352
+ const fileBuffer = Buffer.from(content, 'utf8');
353
+ await axios.put(presignedUrl, fileBuffer, {
354
+ headers: {
355
+ 'Content-Type': 'application/pdf',
356
+ 'Content-Length': fileBuffer.length
357
+ }
358
+ });
359
+
360
+ // Public URL pattern
361
+ const publicUrl = `https://web.file.vpc1.us/files/${openkbs.kbId}/${fileName}`;
362
+ ```
363
+
364
+ ## VectorDB (Semantic Search)
365
+
366
+ ### items() - VectorDB Operations
367
+
368
+ Create and search items with embeddings for semantic search.
369
+
370
+ ```javascript
371
+ // Create embeddings first
372
+ const { embeddings, totalTokens } = await openkbs.createEmbeddings(
373
+ 'text to embed',
374
+ 'text-embedding-3-large' // 3072 dimensions
375
+ );
376
+
377
+ // Create item with embeddings
378
+ await openkbs.items({
379
+ action: 'createItem',
380
+ itemType: 'archive',
381
+ itemId: 'archive_doc_123',
382
+ attributes: [
383
+ { attrType: 'itemId', attrName: 'itemId', encrypted: false },
384
+ { attrType: 'body', attrName: 'body', encrypted: true }
385
+ ],
386
+ item: { body: await openkbs.encrypt(JSON.stringify(data)) },
387
+ totalTokens,
388
+ embeddings: embeddings.slice(0, 3072),
389
+ embeddingModel: 'text-embedding-3-large',
390
+ embeddingDimension: 3072
391
+ });
392
+
393
+ // Semantic search
394
+ const results = await openkbs.items({
395
+ action: 'searchVectorDBItems',
396
+ queryText: 'find similar documents',
397
+ topK: 10,
398
+ minScore: 0
399
+ });
400
+
401
+ // Results: { items: [{ itemId, body, score }, ...] }
402
+ // Note: body is encrypted, use openkbs.decrypt() to read
403
+ ```
404
+
405
+ ## Utilities
406
+
407
+ ### Parse JSON from Text
408
+
409
+ ```javascript
410
+ const data = openkbs.parseJSONFromText('Some text {"key": "value"} more text');
411
+ // Returns: { key: "value" }
412
+ ```
413
+
414
+ ### Get Exchange Rates
415
+
416
+ ```javascript
417
+ const rates = await openkbs.getExchangeRates('USD');
418
+ // Returns: { EUR: 0.92, GBP: 0.79, ... }
419
+ ```
420
+
421
+ ## Properties
422
+
423
+ ```javascript
424
+ openkbs.kbId // Current Knowledge Base ID
425
+ openkbs.clientHeaders // Request headers (IP, user-agent, etc.)
426
+ openkbs.AESKey // Encryption key
427
+ openkbs.chatJWT // Current chat JWT token
428
+ ```