@purplesquirrel/watsonx-mcp-server 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/dependabot.yml +21 -0
- package/.github/workflows/ci.yml +36 -0
- package/LICENSE +21 -0
- package/README.md +245 -0
- package/TROUBLESHOOTING.md +176 -0
- package/batch-processor.js +345 -0
- package/batch-results/classify-1765765720041.json +106 -0
- package/batch-results/full-analysis-1765765676586.json +193 -0
- package/docs/index.html +572 -0
- package/docs/specs.html +613 -0
- package/document-analyzer.js +353 -0
- package/embedding-index.js +318 -0
- package/embeddings-index.json +38761 -0
- package/index.js +551 -0
- package/linkedin-post.md +92 -0
- package/package.json +28 -0
- package/test-watsonx.js +29 -0
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* watsonx Batch Document Processor
|
|
4
|
+
* Process multiple documents from external drive with watsonx.ai
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { WatsonXAI } from "@ibm-cloud/watsonx-ai";
|
|
8
|
+
import { IamAuthenticator } from "ibm-cloud-sdk-core";
|
|
9
|
+
import fs from "fs/promises";
|
|
10
|
+
import path from "path";
|
|
11
|
+
|
|
12
|
+
// Configuration
|
|
13
|
+
const WATSONX_API_KEY = process.env.WATSONX_API_KEY;
|
|
14
|
+
const WATSONX_URL = process.env.WATSONX_URL || "https://us-south.ml.cloud.ibm.com";
|
|
15
|
+
const WATSONX_SPACE_ID = process.env.WATSONX_SPACE_ID;
|
|
16
|
+
|
|
17
|
+
// Paths
|
|
18
|
+
const EXTERNAL_DRIVE = "/Volumes/Virtual Server/_NEW";
|
|
19
|
+
const DOCUMENTS_PATH = `${EXTERNAL_DRIVE}/Documents`;
|
|
20
|
+
const OUTPUT_PATH = "/Users/matthewkarsten/watsonx-mcp-server/batch-results";
|
|
21
|
+
|
|
22
|
+
let client = null;
|
|
23
|
+
|
|
24
|
+
function getClient() {
|
|
25
|
+
if (!client && WATSONX_API_KEY) {
|
|
26
|
+
client = WatsonXAI.newInstance({
|
|
27
|
+
version: "2024-05-31",
|
|
28
|
+
serviceUrl: WATSONX_URL,
|
|
29
|
+
authenticator: new IamAuthenticator({
|
|
30
|
+
apikey: WATSONX_API_KEY,
|
|
31
|
+
}),
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
return client;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Classify a document
|
|
39
|
+
*/
|
|
40
|
+
async function classifyDocument(text) {
|
|
41
|
+
const watsonx = getClient();
|
|
42
|
+
const truncated = text.substring(0, 2000);
|
|
43
|
+
|
|
44
|
+
const response = await watsonx.generateText({
|
|
45
|
+
modelId: "ibm/granite-3-3-8b-instruct",
|
|
46
|
+
spaceId: WATSONX_SPACE_ID,
|
|
47
|
+
input: `Classify this document into exactly one category. Reply with ONLY the category name, nothing else.
|
|
48
|
+
|
|
49
|
+
Categories: technical, business, creative, personal, code, legal, marketing, educational, other
|
|
50
|
+
|
|
51
|
+
Document:
|
|
52
|
+
${truncated}
|
|
53
|
+
|
|
54
|
+
Category:`,
|
|
55
|
+
parameters: {
|
|
56
|
+
max_new_tokens: 10,
|
|
57
|
+
temperature: 0.1,
|
|
58
|
+
stop_sequences: ["\n", ".", ","],
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
const raw = response.result.results?.[0]?.generated_text?.trim().toLowerCase() || "other";
|
|
63
|
+
// Extract just the first word
|
|
64
|
+
const category = raw.split(/\s+/)[0].replace(/[^a-z]/g, '');
|
|
65
|
+
const validCategories = ['technical', 'business', 'creative', 'personal', 'code', 'legal', 'marketing', 'educational', 'other'];
|
|
66
|
+
return validCategories.includes(category) ? category : 'other';
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Extract key topics from a document
|
|
71
|
+
*/
|
|
72
|
+
async function extractTopics(text) {
|
|
73
|
+
const watsonx = getClient();
|
|
74
|
+
const truncated = text.substring(0, 2000);
|
|
75
|
+
|
|
76
|
+
const response = await watsonx.generateText({
|
|
77
|
+
modelId: "ibm/granite-3-3-8b-instruct",
|
|
78
|
+
spaceId: WATSONX_SPACE_ID,
|
|
79
|
+
input: `Extract 3-5 key topics from this document. Return only a comma-separated list.
|
|
80
|
+
|
|
81
|
+
Document:
|
|
82
|
+
${truncated}
|
|
83
|
+
|
|
84
|
+
Topics:`,
|
|
85
|
+
parameters: {
|
|
86
|
+
max_new_tokens: 100,
|
|
87
|
+
temperature: 0.2,
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
const topicsText = response.result.results?.[0]?.generated_text?.trim() || "";
|
|
92
|
+
return topicsText.split(",").map(t => t.trim()).filter(t => t.length > 0);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Generate a one-line summary
|
|
97
|
+
*/
|
|
98
|
+
async function generateOneliner(text) {
|
|
99
|
+
const watsonx = getClient();
|
|
100
|
+
const truncated = text.substring(0, 2000);
|
|
101
|
+
|
|
102
|
+
const response = await watsonx.generateText({
|
|
103
|
+
modelId: "ibm/granite-3-3-8b-instruct",
|
|
104
|
+
spaceId: WATSONX_SPACE_ID,
|
|
105
|
+
input: `Summarize this document in exactly one sentence (max 20 words).
|
|
106
|
+
|
|
107
|
+
Document:
|
|
108
|
+
${truncated}
|
|
109
|
+
|
|
110
|
+
One-line summary:`,
|
|
111
|
+
parameters: {
|
|
112
|
+
max_new_tokens: 50,
|
|
113
|
+
temperature: 0.3,
|
|
114
|
+
},
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
return response.result.results?.[0]?.generated_text?.trim() || "";
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Process a batch of documents
|
|
122
|
+
*/
|
|
123
|
+
async function processBatch(files, options = {}) {
|
|
124
|
+
const results = [];
|
|
125
|
+
const startTime = Date.now();
|
|
126
|
+
|
|
127
|
+
for (let i = 0; i < files.length; i++) {
|
|
128
|
+
const file = files[i];
|
|
129
|
+
console.log(` [${i + 1}/${files.length}] Processing: ${file.name}`);
|
|
130
|
+
|
|
131
|
+
try {
|
|
132
|
+
const content = await fs.readFile(file.path, "utf-8");
|
|
133
|
+
|
|
134
|
+
const result = {
|
|
135
|
+
filename: file.name,
|
|
136
|
+
path: file.path,
|
|
137
|
+
size: content.length,
|
|
138
|
+
processed_at: new Date().toISOString(),
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
if (options.classify) {
|
|
142
|
+
result.category = await classifyDocument(content);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
if (options.topics) {
|
|
146
|
+
result.topics = await extractTopics(content);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
if (options.summarize) {
|
|
150
|
+
result.summary = await generateOneliner(content);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
results.push(result);
|
|
154
|
+
} catch (err) {
|
|
155
|
+
results.push({
|
|
156
|
+
filename: file.name,
|
|
157
|
+
error: err.message,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
const elapsed = ((Date.now() - startTime) / 1000).toFixed(2);
|
|
163
|
+
return { results, elapsed, count: results.length };
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Generate batch report
|
|
168
|
+
*/
|
|
169
|
+
function generateReport(batchResults) {
|
|
170
|
+
const { results, elapsed, count } = batchResults;
|
|
171
|
+
|
|
172
|
+
// Category distribution
|
|
173
|
+
const categories = {};
|
|
174
|
+
results.forEach(r => {
|
|
175
|
+
if (r.category) {
|
|
176
|
+
categories[r.category] = (categories[r.category] || 0) + 1;
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
// All topics
|
|
181
|
+
const allTopics = {};
|
|
182
|
+
results.forEach(r => {
|
|
183
|
+
(r.topics || []).forEach(t => {
|
|
184
|
+
allTopics[t] = (allTopics[t] || 0) + 1;
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
const topTopics = Object.entries(allTopics)
|
|
189
|
+
.sort((a, b) => b[1] - a[1])
|
|
190
|
+
.slice(0, 10);
|
|
191
|
+
|
|
192
|
+
return {
|
|
193
|
+
summary: {
|
|
194
|
+
total_documents: count,
|
|
195
|
+
processing_time: `${elapsed}s`,
|
|
196
|
+
avg_time_per_doc: `${(elapsed / count).toFixed(2)}s`,
|
|
197
|
+
},
|
|
198
|
+
category_distribution: categories,
|
|
199
|
+
top_topics: topTopics.map(([topic, count]) => ({ topic, count })),
|
|
200
|
+
documents: results,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Read documents from a directory
|
|
206
|
+
*/
|
|
207
|
+
async function getDocuments(dir, pattern = ".txt", limit = 20) {
|
|
208
|
+
const files = await fs.readdir(dir);
|
|
209
|
+
const matching = files.filter(f => f.endsWith(pattern)).slice(0, limit);
|
|
210
|
+
return matching.map(name => ({
|
|
211
|
+
name,
|
|
212
|
+
path: `${dir}/${name}`,
|
|
213
|
+
}));
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// Main
|
|
217
|
+
async function main() {
|
|
218
|
+
const command = process.argv[2];
|
|
219
|
+
const arg = process.argv[3];
|
|
220
|
+
|
|
221
|
+
console.log("╔══════════════════════════════════════════════════════════════╗");
|
|
222
|
+
console.log("║ watsonx Batch Document Processor ║");
|
|
223
|
+
console.log("║ Powered by IBM Granite 3.3 ║");
|
|
224
|
+
console.log("╚══════════════════════════════════════════════════════════════╝");
|
|
225
|
+
console.log("");
|
|
226
|
+
|
|
227
|
+
if (!WATSONX_API_KEY || !WATSONX_SPACE_ID) {
|
|
228
|
+
console.error("Error: WATSONX_API_KEY and WATSONX_SPACE_ID must be set");
|
|
229
|
+
process.exit(1);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// Ensure output directory exists
|
|
233
|
+
await fs.mkdir(OUTPUT_PATH, { recursive: true });
|
|
234
|
+
|
|
235
|
+
switch (command) {
|
|
236
|
+
case "classify": {
|
|
237
|
+
const count = parseInt(arg) || 10;
|
|
238
|
+
console.log(`📋 Classifying ${count} documents...\n`);
|
|
239
|
+
|
|
240
|
+
const docs = await getDocuments(DOCUMENTS_PATH, ".txt", count);
|
|
241
|
+
const batch = await processBatch(docs, { classify: true });
|
|
242
|
+
const report = generateReport(batch);
|
|
243
|
+
|
|
244
|
+
console.log("\n📊 Category Distribution:");
|
|
245
|
+
Object.entries(report.category_distribution).forEach(([cat, cnt]) => {
|
|
246
|
+
console.log(` ${cat}: ${cnt}`);
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
const outFile = `${OUTPUT_PATH}/classify-${Date.now()}.json`;
|
|
250
|
+
await fs.writeFile(outFile, JSON.stringify(report, null, 2));
|
|
251
|
+
console.log(`\n✅ Results saved to: ${outFile}`);
|
|
252
|
+
break;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
case "topics": {
|
|
256
|
+
const count = parseInt(arg) || 10;
|
|
257
|
+
console.log(`🏷️ Extracting topics from ${count} documents...\n`);
|
|
258
|
+
|
|
259
|
+
const docs = await getDocuments(DOCUMENTS_PATH, ".txt", count);
|
|
260
|
+
const batch = await processBatch(docs, { topics: true });
|
|
261
|
+
const report = generateReport(batch);
|
|
262
|
+
|
|
263
|
+
console.log("\n📊 Top Topics:");
|
|
264
|
+
report.top_topics.forEach(({ topic, count }, i) => {
|
|
265
|
+
console.log(` ${i + 1}. ${topic} (${count})`);
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
const outFile = `${OUTPUT_PATH}/topics-${Date.now()}.json`;
|
|
269
|
+
await fs.writeFile(outFile, JSON.stringify(report, null, 2));
|
|
270
|
+
console.log(`\n✅ Results saved to: ${outFile}`);
|
|
271
|
+
break;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
case "summarize": {
|
|
275
|
+
const count = parseInt(arg) || 10;
|
|
276
|
+
console.log(`📝 Summarizing ${count} documents...\n`);
|
|
277
|
+
|
|
278
|
+
const docs = await getDocuments(DOCUMENTS_PATH, ".txt", count);
|
|
279
|
+
const batch = await processBatch(docs, { summarize: true });
|
|
280
|
+
|
|
281
|
+
console.log("\n📋 Summaries:");
|
|
282
|
+
batch.results.forEach(r => {
|
|
283
|
+
if (r.summary) {
|
|
284
|
+
console.log(` 📄 ${r.filename}`);
|
|
285
|
+
console.log(` ${r.summary}\n`);
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
|
|
289
|
+
const outFile = `${OUTPUT_PATH}/summaries-${Date.now()}.json`;
|
|
290
|
+
await fs.writeFile(outFile, JSON.stringify(batch, null, 2));
|
|
291
|
+
console.log(`✅ Results saved to: ${outFile}`);
|
|
292
|
+
break;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
case "full": {
|
|
296
|
+
const count = parseInt(arg) || 10;
|
|
297
|
+
console.log(`🔬 Full analysis of ${count} documents...\n`);
|
|
298
|
+
|
|
299
|
+
const docs = await getDocuments(DOCUMENTS_PATH, ".txt", count);
|
|
300
|
+
const batch = await processBatch(docs, { classify: true, topics: true, summarize: true });
|
|
301
|
+
const report = generateReport(batch);
|
|
302
|
+
|
|
303
|
+
console.log("\n" + "═".repeat(60));
|
|
304
|
+
console.log("📊 BATCH ANALYSIS REPORT");
|
|
305
|
+
console.log("═".repeat(60));
|
|
306
|
+
|
|
307
|
+
console.log(`\n📈 Summary:`);
|
|
308
|
+
console.log(` Documents: ${report.summary.total_documents}`);
|
|
309
|
+
console.log(` Processing time: ${report.summary.processing_time}`);
|
|
310
|
+
console.log(` Avg per doc: ${report.summary.avg_time_per_doc}`);
|
|
311
|
+
|
|
312
|
+
console.log(`\n📂 Categories:`);
|
|
313
|
+
Object.entries(report.category_distribution).forEach(([cat, cnt]) => {
|
|
314
|
+
const pct = ((cnt / report.summary.total_documents) * 100).toFixed(1);
|
|
315
|
+
console.log(` ${cat}: ${cnt} (${pct}%)`);
|
|
316
|
+
});
|
|
317
|
+
|
|
318
|
+
console.log(`\n🏷️ Top Topics:`);
|
|
319
|
+
report.top_topics.slice(0, 5).forEach(({ topic, count }, i) => {
|
|
320
|
+
console.log(` ${i + 1}. ${topic} (${count})`);
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
const outFile = `${OUTPUT_PATH}/full-analysis-${Date.now()}.json`;
|
|
324
|
+
await fs.writeFile(outFile, JSON.stringify(report, null, 2));
|
|
325
|
+
console.log(`\n✅ Full report saved to: ${outFile}`);
|
|
326
|
+
break;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
default:
|
|
330
|
+
console.log("Usage: batch-processor.js <command> [count]");
|
|
331
|
+
console.log("");
|
|
332
|
+
console.log("Commands:");
|
|
333
|
+
console.log(" classify [n] - Classify n documents into categories");
|
|
334
|
+
console.log(" topics [n] - Extract topics from n documents");
|
|
335
|
+
console.log(" summarize [n] - Generate one-line summaries for n docs");
|
|
336
|
+
console.log(" full [n] - Full analysis (classify + topics + summary)");
|
|
337
|
+
console.log("");
|
|
338
|
+
console.log("Examples:");
|
|
339
|
+
console.log(" batch-processor.js classify 20");
|
|
340
|
+
console.log(" batch-processor.js topics 15");
|
|
341
|
+
console.log(" batch-processor.js full 10");
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
main().catch(console.error);
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
{
|
|
2
|
+
"summary": {
|
|
3
|
+
"total_documents": 15,
|
|
4
|
+
"processing_time": "5.36s",
|
|
5
|
+
"avg_time_per_doc": "0.36s"
|
|
6
|
+
},
|
|
7
|
+
"category_distribution": {
|
|
8
|
+
"technical": 3,
|
|
9
|
+
"marketing": 5,
|
|
10
|
+
"legal": 1,
|
|
11
|
+
"other": 1
|
|
12
|
+
},
|
|
13
|
+
"top_topics": [],
|
|
14
|
+
"documents": [
|
|
15
|
+
{
|
|
16
|
+
"filename": "-2yzXSIuC8o.txt",
|
|
17
|
+
"path": "/Volumes/Virtual Server/_NEW/Documents/-2yzXSIuC8o.txt",
|
|
18
|
+
"size": 39082,
|
|
19
|
+
"processed_at": "2025-12-15T02:28:34.685Z",
|
|
20
|
+
"category": "technical"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"filename": "01-starfall-1978.txt",
|
|
24
|
+
"path": "/Volumes/Virtual Server/_NEW/Documents/01-starfall-1978.txt",
|
|
25
|
+
"size": 1455,
|
|
26
|
+
"processed_at": "2025-12-15T02:28:35.792Z",
|
|
27
|
+
"category": "marketing"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"filename": "02-starfall-ii-the-void-1980.txt",
|
|
31
|
+
"path": "/Volumes/Virtual Server/_NEW/Documents/02-starfall-ii-the-void-1980.txt",
|
|
32
|
+
"size": 1521,
|
|
33
|
+
"processed_at": "2025-12-15T02:28:36.191Z",
|
|
34
|
+
"category": "marketing"
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"filename": "03-starfall-iii-empire-of-dust-1982.txt",
|
|
38
|
+
"path": "/Volumes/Virtual Server/_NEW/Documents/03-starfall-iii-empire-of-dust-1982.txt",
|
|
39
|
+
"size": 1464,
|
|
40
|
+
"processed_at": "2025-12-15T02:28:36.665Z",
|
|
41
|
+
"category": "marketing"
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"filename": "04-starfall-iv-genesis-1984.txt",
|
|
45
|
+
"path": "/Volumes/Virtual Server/_NEW/Documents/04-starfall-iv-genesis-1984.txt",
|
|
46
|
+
"size": 1488,
|
|
47
|
+
"processed_at": "2025-12-15T02:28:37.099Z",
|
|
48
|
+
"category": "marketing"
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"filename": "05-starfall-v-the-last-light-1986.txt",
|
|
52
|
+
"path": "/Volumes/Virtual Server/_NEW/Documents/05-starfall-v-the-last-light-1986.txt",
|
|
53
|
+
"size": 1547,
|
|
54
|
+
"processed_at": "2025-12-15T02:28:37.577Z",
|
|
55
|
+
"category": "marketing"
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"filename": "1002519.txt",
|
|
59
|
+
"path": "/Volumes/Virtual Server/_NEW/Documents/1002519.txt",
|
|
60
|
+
"size": 8341,
|
|
61
|
+
"processed_at": "2025-12-15T02:28:38.014Z",
|
|
62
|
+
"category": "technical"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"filename": "1002520.txt",
|
|
66
|
+
"error": "Rate limit of 2 requests per 1s was reached for instance id b0c2aa31-3746-4ffa-a43e-813254c610a8 (user RedHat-53978672, plan 3f6acf43-ede8-413a-ac69-f8af3bb0cbfe)"
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"filename": "1002521.txt",
|
|
70
|
+
"path": "/Volumes/Virtual Server/_NEW/Documents/1002521.txt",
|
|
71
|
+
"size": 5755,
|
|
72
|
+
"processed_at": "2025-12-15T02:28:38.488Z",
|
|
73
|
+
"category": "technical"
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"filename": "1011109.txt",
|
|
77
|
+
"error": "Rate limit of 2 requests per 1s was reached for instance id b0c2aa31-3746-4ffa-a43e-813254c610a8 (user RedHat-53978672, plan 3f6acf43-ede8-413a-ac69-f8af3bb0cbfe)"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"filename": "1013662.txt",
|
|
81
|
+
"path": "/Volumes/Virtual Server/_NEW/Documents/1013662.txt",
|
|
82
|
+
"size": 57738,
|
|
83
|
+
"processed_at": "2025-12-15T02:28:38.998Z",
|
|
84
|
+
"category": "legal"
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"filename": "1013665.txt",
|
|
88
|
+
"error": "Rate limit of 2 requests per 1s was reached for instance id b0c2aa31-3746-4ffa-a43e-813254c610a8 (user RedHat-53978672, plan 3f6acf43-ede8-413a-ac69-f8af3bb0cbfe)"
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"filename": "1013666.txt",
|
|
92
|
+
"error": "Rate limit of 2 requests per 1s was reached for instance id b0c2aa31-3746-4ffa-a43e-813254c610a8 (user RedHat-53978672, plan 3f6acf43-ede8-413a-ac69-f8af3bb0cbfe)"
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"filename": "1013667.txt",
|
|
96
|
+
"path": "/Volumes/Virtual Server/_NEW/Documents/1013667.txt",
|
|
97
|
+
"size": 39433,
|
|
98
|
+
"processed_at": "2025-12-15T02:28:39.551Z",
|
|
99
|
+
"category": "other"
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"filename": "1013668.txt",
|
|
103
|
+
"error": "Rate limit of 2 requests per 1s was reached for instance id b0c2aa31-3746-4ffa-a43e-813254c610a8 (user RedHat-53978672, plan 3f6acf43-ede8-413a-ac69-f8af3bb0cbfe)"
|
|
104
|
+
}
|
|
105
|
+
]
|
|
106
|
+
}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
{
|
|
2
|
+
"summary": {
|
|
3
|
+
"total_documents": 10,
|
|
4
|
+
"processing_time": "30.00s",
|
|
5
|
+
"avg_time_per_doc": "3.00s"
|
|
6
|
+
},
|
|
7
|
+
"category_distribution": {
|
|
8
|
+
"technical_documentationexplanationthedocumentisatranscriptofavideotutorialondeploying": 1,
|
|
9
|
+
"creative_writingexplanationthedocumentprovideddescribesaconceptfora": 1,
|
|
10
|
+
"creative_writingexplanationthedocumentprovidesdetailedpromptsforcreatinga": 1,
|
|
11
|
+
"creative_writingexplanationthedocumentprovidedappearstobeadetaileddescription": 1,
|
|
12
|
+
"creative_writingexplanationthedocumentdescribesamovieposterconceptfora": 1,
|
|
13
|
+
"creative_writingexplanationthedocumentprovidedisadetaileddescriptionandpromp": 1,
|
|
14
|
+
"technical_documentationexplanationthedocumentprovidesdetailedinstructionsonhowtoautomatethesetupofan": 1,
|
|
15
|
+
"technical_documentationexplanationthedocumentprovidesstepbystepinstructionsforautomatingthe": 1,
|
|
16
|
+
"technical_documentationexplanationthedocumentprovidesstepbystepinstructionsonhowtoadd": 1,
|
|
17
|
+
"business_documentexplanationthedocumentdescribesaprojectcalledcandypocket": 1
|
|
18
|
+
},
|
|
19
|
+
"top_topics": [
|
|
20
|
+
{
|
|
21
|
+
"topic": "1. Importance of IT monitoring",
|
|
22
|
+
"count": 1
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"topic": "2. Introduction to WhatsApp Gold as an IT monitoring tool",
|
|
26
|
+
"count": 1
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"topic": "3. Preparing systems for monitoring",
|
|
30
|
+
"count": 1
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"topic": "4. Basic monitoring aspects",
|
|
34
|
+
"count": 1
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"topic": "5. Alerts and dashboards in IT monitoring.",
|
|
38
|
+
"count": 1
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"topic": "1970s sci-fi movie poster",
|
|
42
|
+
"count": 1
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"topic": "lone astronaut",
|
|
46
|
+
"count": 1
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"topic": "massive derelict alien spacecraft",
|
|
50
|
+
"count": 1
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"topic": "barren planet",
|
|
54
|
+
"count": 1
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"topic": "orange and teal color palette",
|
|
58
|
+
"count": 1
|
|
59
|
+
}
|
|
60
|
+
],
|
|
61
|
+
"documents": [
|
|
62
|
+
{
|
|
63
|
+
"filename": "-2yzXSIuC8o.txt",
|
|
64
|
+
"path": "/Volumes/Virtual Server/_NEW/Documents/-2yzXSIuC8o.txt",
|
|
65
|
+
"size": 39082,
|
|
66
|
+
"processed_at": "2025-12-15T02:27:26.588Z",
|
|
67
|
+
"category": "technical_documentationexplanationthedocumentisatranscriptofavideotutorialondeploying",
|
|
68
|
+
"topics": [
|
|
69
|
+
"1. Importance of IT monitoring",
|
|
70
|
+
"2. Introduction to WhatsApp Gold as an IT monitoring tool",
|
|
71
|
+
"3. Preparing systems for monitoring",
|
|
72
|
+
"4. Basic monitoring aspects",
|
|
73
|
+
"5. Alerts and dashboards in IT monitoring."
|
|
74
|
+
],
|
|
75
|
+
"summary": "This document is a tutorial on deploying a comprehensive IT monitoring system, specifically highlighting WhatsApp Gold's free version, to track various devices and receive alerts, aiming to alleviate stress and gain full network visibility.\n\n(Note: Although"
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"filename": "01-starfall-1978.txt",
|
|
79
|
+
"path": "/Volumes/Virtual Server/_NEW/Documents/01-starfall-1978.txt",
|
|
80
|
+
"size": 1455,
|
|
81
|
+
"processed_at": "2025-12-15T02:27:29.588Z",
|
|
82
|
+
"category": "creative_writingexplanationthedocumentprovideddescribesaconceptfora",
|
|
83
|
+
"topics": [
|
|
84
|
+
"1970s sci-fi movie poster",
|
|
85
|
+
"lone astronaut",
|
|
86
|
+
"massive derelict alien spacecraft",
|
|
87
|
+
"barren planet",
|
|
88
|
+
"orange and teal color palette",
|
|
89
|
+
"painted illustration style",
|
|
90
|
+
"Drew Struzan inspired",
|
|
91
|
+
"cinematic composition",
|
|
92
|
+
"vintage film grain",
|
|
93
|
+
"24x36 poster aspect ratio",
|
|
94
|
+
"STARFALL",
|
|
95
|
+
"In space",
|
|
96
|
+
"hope dies first.\n\n\nKey Topics: 1970s sci-fi"
|
|
97
|
+
],
|
|
98
|
+
"summary": "A 1970s sci-fi movie poster illustration depicts a lone astronaut before a colossal derelict alien spacecraft on a barren planet, inspired by Drew Struzan"
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"filename": "02-starfall-ii-the-void-1980.txt",
|
|
102
|
+
"path": "/Volumes/Virtual Server/_NEW/Documents/02-starfall-ii-the-void-1980.txt",
|
|
103
|
+
"size": 1521,
|
|
104
|
+
"processed_at": "2025-12-15T02:27:32.177Z",
|
|
105
|
+
"category": "creative_writingexplanationthedocumentprovidesdetailedpromptsforcreatinga",
|
|
106
|
+
"topics": [
|
|
107
|
+
"1. 1980 sci-fi horror movie poster\n2. Spaceship corridor\n3. Shadowy alien creature silhouette\n4. Retro airbrush illustration\n5. VHS cover aesthetic\n6. Alien movie inspired atmosphere\n7. Vintage poster art\n8. Title: STARFALL II: THE VOID\n9. Tagline: They thought they escaped. They were wrong.\n1"
|
|
108
|
+
],
|
|
109
|
+
"summary": "\"1980 sci-fi horror movie poster for STARFALL II: THE VOID, featuring a terrified crew in a dark spaceship corridor, with a shadowy alien creature lurking,"
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"filename": "03-starfall-iii-empire-of-dust-1982.txt",
|
|
113
|
+
"path": "/Volumes/Virtual Server/_NEW/Documents/03-starfall-iii-empire-of-dust-1982.txt",
|
|
114
|
+
"size": 1464,
|
|
115
|
+
"processed_at": "2025-12-15T02:27:34.804Z",
|
|
116
|
+
"category": "creative_writingexplanationthedocumentprovidedappearstobeadetaileddescription",
|
|
117
|
+
"topics": [
|
|
118
|
+
"1. STARFALL III: EMPIRE OF DUST (movie title)\n2. Early 1980s space opera\n3. Rebel spacecraft fleet\n4. Imperial space station\n5. Epic cinematic scale\n6. John Berkey painting style\n7. Colorful laser beams and explosions\n8. Warm amber and cool blue tones\n9. Heroic composition\n10. Vint"
|
|
119
|
+
],
|
|
120
|
+
"summary": "\"STARFALL III: EMPIRE OF DUST\" (1982) is an epic space opera movie poster depicting a rebel fleet charging towards a massive imperial space station, in the style"
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
"filename": "04-starfall-iv-genesis-1984.txt",
|
|
124
|
+
"path": "/Volumes/Virtual Server/_NEW/Documents/04-starfall-iv-genesis-1984.txt",
|
|
125
|
+
"size": 1488,
|
|
126
|
+
"processed_at": "2025-12-15T02:27:37.438Z",
|
|
127
|
+
"category": "creative_writingexplanationthedocumentdescribesamovieposterconceptfora",
|
|
128
|
+
"topics": [
|
|
129
|
+
"1. 1984 sci-fi movie poster\n2. Ancient alien artifact discovery\n3. Underground cavern setting\n4. Spielberg-esque sense of wonder and mystery\n5. Retro painted illustration style\n6. Golden light emanating from artifact\n7. Lens flares\n8. Awe-inspiring atmosphere\n9. Movie title placement\n10. Vertical poster format\n11"
|
|
130
|
+
],
|
|
131
|
+
"summary": "\"In 1984, scientists discover an ancient alien artifact in an underground cavern, evoking a Spielberg-esque sense of wonder and mystery, with glowing symbols and gold"
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
"filename": "05-starfall-v-the-last-light-1986.txt",
|
|
135
|
+
"path": "/Volumes/Virtual Server/_NEW/Documents/05-starfall-v-the-last-light-1986.txt",
|
|
136
|
+
"size": 1547,
|
|
137
|
+
"processed_at": "2025-12-15T02:27:40.139Z",
|
|
138
|
+
"category": "creative_writingexplanationthedocumentprovidedisadetaileddescriptionandpromp",
|
|
139
|
+
"topics": [
|
|
140
|
+
"1. Starfall V: The Last Light (1986)\n2. 1986 sci-fi action movie\n3. Heroic space warrior\n4. Futuristic armor\n5. Glowing energy weapon\n6. Massive explosions\n7. Spacecraft battle\n8. Neon pink and electric blue color scheme\n9. 80s aesthetic\n10. Chrome and metallic textures"
|
|
141
|
+
],
|
|
142
|
+
"summary": "\"STARFALL V: THE LAST LIGHT\" (1986) is an 80s sci-fi action movie, featuring a heroic space warrior battling in a futuristic epic finale with ne"
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
"filename": "1002519.txt",
|
|
146
|
+
"path": "/Volumes/Virtual Server/_NEW/Documents/1002519.txt",
|
|
147
|
+
"size": 8341,
|
|
148
|
+
"processed_at": "2025-12-15T02:27:42.516Z",
|
|
149
|
+
"category": "technical_documentationexplanationthedocumentprovidesdetailedinstructionsonhowtoautomatethesetupofan",
|
|
150
|
+
"topics": [
|
|
151
|
+
"1. IBM Cloud Satellite setup\n2. Automating AWS location setup with Schematics template\n3. IBM Cloud IAM API key creation\n4. AWS account credentials setup\n5. Reviewing and editing Satellite location details\n6. Cost estimate for location provisioning\n7. Monitoring provisioning progress (optional)"
|
|
152
|
+
],
|
|
153
|
+
"summary": "This document provides a step-by-step guide on automating AWS location setup for IBM Cloud Satellite using Schematics templates, including IAM permissions, AWS account setup, and location creation via the Satellite console.\n\n(19"
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
"filename": "1002520.txt",
|
|
157
|
+
"path": "/Volumes/Virtual Server/_NEW/Documents/1002520.txt",
|
|
158
|
+
"size": 10054,
|
|
159
|
+
"processed_at": "2025-12-15T02:27:44.515Z",
|
|
160
|
+
"category": "technical_documentationexplanationthedocumentprovidesstepbystepinstructionsforautomatingthe",
|
|
161
|
+
"topics": [
|
|
162
|
+
"1. IBM Cloud Satellite",
|
|
163
|
+
"2. Automating Azure setup with Schematics templates",
|
|
164
|
+
"3. Setting up Azure account credentials",
|
|
165
|
+
"4. Creating a service principal identity with Contributor role",
|
|
166
|
+
"5. Configuring Azure credentials in IBM Cloud Satellite."
|
|
167
|
+
],
|
|
168
|
+
"summary": "This document explains how to automate Azure setup using IBM Cloud Schematics for creating a Satellite location, provisioning hosts, and setting up the control plane, requiring Azure account credentials and service principal creation for IBM Cloud Satellite access.\n\n["
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
"filename": "1002521.txt",
|
|
172
|
+
"path": "/Volumes/Virtual Server/_NEW/Documents/1002521.txt",
|
|
173
|
+
"size": 5755,
|
|
174
|
+
"processed_at": "2025-12-15T02:27:46.667Z",
|
|
175
|
+
"category": "technical_documentationexplanationthedocumentprovidesstepbystepinstructionsonhowtoadd",
|
|
176
|
+
"topics": [
|
|
177
|
+
"1. IBM Cloud Satellite\n2. Adding GCP hosts to Satellite\n3. Host requirements for GCP hosts\n4. Creating a Satellite location\n5. Downloading and modifying host registration script for GCP hosts\n6. Creating an instance template in GCP Compute Engine for GCP hosts\n7. Enabling GCP RHEL package updates using subscription-manager\n8. Configuring machine configuration in GCP Compute Engine for instance template\n9. Overview of available options"
|
|
178
|
+
],
|
|
179
|
+
"summary": "This document explains how to add Google Cloud Platform (GCP) hosts to an IBM Cloud Satellite location, including prerequisites, downloading the host registration script, and configuring the instance template in GCP Compute Engine."
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
"filename": "1011109.txt",
|
|
183
|
+
"path": "/Volumes/Virtual Server/_NEW/Documents/1011109.txt",
|
|
184
|
+
"size": 3764,
|
|
185
|
+
"processed_at": "2025-12-15T02:27:54.195Z",
|
|
186
|
+
"category": "business_documentexplanationthedocumentdescribesaprojectcalledcandypocket",
|
|
187
|
+
"topics": [
|
|
188
|
+
"1. CandyPocket Web3 Wallet\n2. Dappstore and Community Features\n3. Candy Token Distribution and Earning Models\n4. Road Map and Phases of Development\n5. NFT Mining and C2C Trading\n\n\n##\n\nTopics:\n1. CandyPocket Web3 Wallet\n2. Dappstore and Community Features\n3. Candy Token Distribution and Earning Models\n4. Road Map and Phases of Development"
|
|
189
|
+
],
|
|
190
|
+
"summary": "CandyPocket is a user-friendly web3 wallet with a dappstore and community, offering low-cost payment solutions, token earnings through various models, and exclusive community access for users in the Third World.\n\n## Instruction"
|
|
191
|
+
}
|
|
192
|
+
]
|
|
193
|
+
}
|