@amirdaraee/namewise 0.4.0 → 0.5.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/.github/workflows/build.yml +6 -0
- package/.github/workflows/publish.yml +59 -11
- package/.github/workflows/test.yml +1 -0
- package/CHANGELOG.md +102 -0
- package/RELEASE.md +15 -3
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +14 -7
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/rename.js +1 -1
- package/dist/cli/rename.js.map +1 -1
- package/dist/parsers/factory.d.ts +2 -1
- package/dist/parsers/factory.d.ts.map +1 -1
- package/dist/parsers/factory.js +9 -6
- package/dist/parsers/factory.js.map +1 -1
- package/dist/parsers/pdf-parser.d.ts +1 -0
- package/dist/parsers/pdf-parser.d.ts.map +1 -1
- package/dist/parsers/pdf-parser.js +20 -1
- package/dist/parsers/pdf-parser.js.map +1 -1
- package/dist/services/claude-service.d.ts.map +1 -1
- package/dist/services/claude-service.js +59 -65
- package/dist/services/claude-service.js.map +1 -1
- package/dist/services/lmstudio-service.d.ts.map +1 -1
- package/dist/services/lmstudio-service.js +16 -19
- package/dist/services/lmstudio-service.js.map +1 -1
- package/dist/services/ollama-service.d.ts +1 -0
- package/dist/services/ollama-service.d.ts.map +1 -1
- package/dist/services/ollama-service.js +61 -32
- package/dist/services/ollama-service.js.map +1 -1
- package/dist/services/openai-service.d.ts.map +1 -1
- package/dist/services/openai-service.js +59 -66
- package/dist/services/openai-service.js.map +1 -1
- package/dist/utils/ai-prompts.d.ts +20 -0
- package/dist/utils/ai-prompts.d.ts.map +1 -0
- package/dist/utils/ai-prompts.js +71 -0
- package/dist/utils/ai-prompts.js.map +1 -0
- package/dist/utils/pdf-to-image.d.ts +11 -0
- package/dist/utils/pdf-to-image.d.ts.map +1 -0
- package/dist/utils/pdf-to-image.js +91 -0
- package/dist/utils/pdf-to-image.js.map +1 -0
- package/eng.traineddata +0 -0
- package/package.json +5 -2
- package/src/cli/commands.ts +14 -7
- package/src/cli/rename.ts +1 -1
- package/src/parsers/factory.ts +11 -7
- package/src/parsers/pdf-parser.ts +22 -1
- package/src/services/claude-service.ts +63 -58
- package/src/services/lmstudio-service.ts +20 -20
- package/src/services/ollama-service.ts +75 -31
- package/src/services/openai-service.ts +63 -59
- package/src/utils/ai-prompts.ts +76 -0
- package/src/utils/pdf-to-image.ts +124 -0
- package/tests/integration/ai-prompting.test.ts +386 -0
- package/tests/integration/end-to-end.test.ts +9 -9
- package/tests/integration/person-name-extraction.test.ts +440 -0
- package/tests/unit/cli/commands.test.ts +9 -3
- package/tests/unit/services/lmstudio-service.test.ts +4 -4
- package/tests/unit/services/ollama-service.test.ts +4 -4
- package/tests/unit/utils/ai-prompts.test.ts +213 -0
- package/tests/unit/utils/pdf-to-image.test.ts +127 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-service.js","sourceRoot":"","sources":["../../src/services/claude-service.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAE1C,OAAO,EAAE,qBAAqB,
|
|
1
|
+
{"version":3,"file":"claude-service.js","sourceRoot":"","sources":["../../src/services/claude-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lmstudio-service.d.ts","sourceRoot":"","sources":["../../src/services/lmstudio-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"lmstudio-service.d.ts","sourceRoot":"","sources":["../../src/services/lmstudio-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAgCzD,qBAAa,eAAgB,YAAW,UAAU;IAChD,IAAI,SAAc;IAClB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAS;gBAGpB,OAAO,SAA0B,EACjC,KAAK,SAAgB;IAMjB,gBAAgB,CACpB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,gBAAgB,SAAe,EAC/B,QAAQ,SAAY,EACpB,QAAQ,CAAC,EAAE,QAAQ,GAClB,OAAO,CAAC,MAAM,CAAC;IAyClB,OAAO,CAAC,WAAW;IAgBnB,OAAO,CAAC,gBAAgB;YAUV,WAAW;IAqBnB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAU/B,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAWtC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { buildFileNamePrompt, AI_SYSTEM_PROMPT } from '../utils/ai-prompts.js';
|
|
1
2
|
export class LMStudioService {
|
|
2
3
|
name = 'LMStudio';
|
|
3
4
|
baseUrl;
|
|
@@ -8,13 +9,20 @@ export class LMStudioService {
|
|
|
8
9
|
}
|
|
9
10
|
async generateFileName(content, originalName, namingConvention = 'kebab-case', category = 'general', fileInfo) {
|
|
10
11
|
try {
|
|
12
|
+
// Check if this is a scanned PDF image
|
|
13
|
+
const isScannedPDF = content.startsWith('[SCANNED_PDF_IMAGE]:');
|
|
14
|
+
if (isScannedPDF) {
|
|
15
|
+
// LM Studio has limited vision support, so we'll fall back to using the original filename
|
|
16
|
+
console.log('⚠️ Scanned PDF detected but LMStudio has limited vision support. Using original filename.');
|
|
17
|
+
return this.sanitizeFilename(originalName);
|
|
18
|
+
}
|
|
11
19
|
const prompt = this.buildPrompt(content, originalName, namingConvention, category, fileInfo);
|
|
12
20
|
const response = await this.makeRequest('/v1/chat/completions', {
|
|
13
21
|
model: this.model,
|
|
14
22
|
messages: [
|
|
15
23
|
{
|
|
16
24
|
role: 'system',
|
|
17
|
-
content:
|
|
25
|
+
content: AI_SYSTEM_PROMPT
|
|
18
26
|
},
|
|
19
27
|
{
|
|
20
28
|
role: 'user',
|
|
@@ -38,24 +46,13 @@ export class LMStudioService {
|
|
|
38
46
|
}
|
|
39
47
|
}
|
|
40
48
|
buildPrompt(content, originalName, namingConvention, category, fileInfo) {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
prompt += `Author: "${meta.author}". `;
|
|
49
|
-
if (meta.subject)
|
|
50
|
-
prompt += `Subject: "${meta.subject}". `;
|
|
51
|
-
}
|
|
52
|
-
if (fileInfo?.parentFolder && fileInfo.parentFolder !== '.') {
|
|
53
|
-
prompt += `Located in folder: "${fileInfo.parentFolder}". `;
|
|
54
|
-
}
|
|
55
|
-
prompt += `\nOriginal filename: ${originalName}\n`;
|
|
56
|
-
prompt += `\nDocument content (first 2000 characters):\n${content.substring(0, 2000)}`;
|
|
57
|
-
prompt += `\n\nGenerate ONLY a descriptive filename (without extension) using ${namingConvention} format. Do not include any explanation or additional text.`;
|
|
58
|
-
return prompt;
|
|
49
|
+
return buildFileNamePrompt({
|
|
50
|
+
content,
|
|
51
|
+
originalName,
|
|
52
|
+
namingConvention: namingConvention,
|
|
53
|
+
category: category,
|
|
54
|
+
fileInfo
|
|
55
|
+
});
|
|
59
56
|
}
|
|
60
57
|
sanitizeFilename(filename) {
|
|
61
58
|
return filename
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lmstudio-service.js","sourceRoot":"","sources":["../../src/services/lmstudio-service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"lmstudio-service.js","sourceRoot":"","sources":["../../src/services/lmstudio-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AA+B/E,MAAM,OAAO,eAAe;IAC1B,IAAI,GAAG,UAAU,CAAC;IACV,OAAO,CAAS;IAChB,KAAK,CAAS;IAEtB,YACE,OAAO,GAAG,uBAAuB,EACjC,KAAK,GAAG,aAAa;QAErB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,gBAAgB,CACpB,OAAe,EACf,YAAoB,EACpB,gBAAgB,GAAG,YAAY,EAC/B,QAAQ,GAAG,SAAS,EACpB,QAAmB;QAEnB,IAAI,CAAC;YACH,uCAAuC;YACvC,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,sBAAsB,CAAC,CAAC;YAEhE,IAAI,YAAY,EAAE,CAAC;gBACjB,0FAA0F;gBAC1F,OAAO,CAAC,GAAG,CAAC,2FAA2F,CAAC,CAAC;gBACzG,OAAO,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;YAC7C,CAAC;YAED,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAE7F,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,sBAAsB,EAAE;gBAC9D,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,QAAQ;wBACd,OAAO,EAAE,gBAAgB;qBAC1B;oBACD;wBACE,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE,MAAM;qBAChB;iBACiB;gBACpB,WAAW,EAAE,GAAG;gBAChB,UAAU,EAAE,GAAG;gBACf,MAAM,EAAE,KAAK;aACd,CAAC,CAAC;YAEH,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;gBAC5C,OAAO,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACpE,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,4BAA4B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QAC1G,CAAC;IACH,CAAC;IAEO,WAAW,CACjB,OAAe,EACf,YAAoB,EACpB,gBAAwB,EACxB,QAAgB,EAChB,QAAmB;QAEnB,OAAO,mBAAmB,CAAC;YACzB,OAAO;YACP,YAAY;YACZ,gBAAgB,EAAE,gBAAoC;YACtD,QAAQ,EAAE,QAAwB;YAClC,QAAQ;SACT,CAAC,CAAC;IACL,CAAC;IAEO,gBAAgB,CAAC,QAAgB;QACvC,OAAO,QAAQ;aACZ,IAAI,EAAE;aACN,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,gBAAgB;aAC5C,OAAO,CAAC,kCAAkC,EAAE,EAAE,CAAC,CAAC,oBAAoB;aACpE,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC,6BAA6B;aAC3D,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,8BAA8B;aACnD,WAAW,EAAE,CAAC;IACnB,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,QAAgB,EAAE,OAAY;QACtD,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,QAAQ,EAAE,CAAC;QAEzC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;SAC9B,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,gCAAgC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,MAAM,SAAS,EAAE,CAAC,CAAC;QAC3G,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,OAAO,IAAgC,CAAC;IAC1C,CAAC;IAED,mDAAmD;IACnD,KAAK,CAAC,WAAW;QACf,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,YAAY,CAAC,CAAC;YAC1D,OAAO,QAAQ,CAAC,EAAE,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,kCAAkC;IAClC,KAAK,CAAC,UAAU;QACd,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,YAAY,CAAC,CAAC;YAC1D,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAAE,OAAO,EAAE,CAAC;YAE5B,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,KAAgB,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QAC9D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;CACF"}
|
|
@@ -6,6 +6,7 @@ export declare class OllamaService implements AIProvider {
|
|
|
6
6
|
constructor(baseUrl?: string, model?: string);
|
|
7
7
|
generateFileName(content: string, originalName: string, namingConvention?: string, category?: string, fileInfo?: FileInfo): Promise<string>;
|
|
8
8
|
private buildPrompt;
|
|
9
|
+
private getVisionModel;
|
|
9
10
|
private sanitizeFilename;
|
|
10
11
|
private makeRequest;
|
|
11
12
|
isAvailable(): Promise<boolean>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ollama-service.d.ts","sourceRoot":"","sources":["../../src/services/ollama-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"ollama-service.d.ts","sourceRoot":"","sources":["../../src/services/ollama-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAqBzD,qBAAa,aAAc,YAAW,UAAU;IAC9C,IAAI,SAAY;IAChB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAS;gBAGpB,OAAO,SAA2B,EAClC,KAAK,SAAa;IAMd,gBAAgB,CACpB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,gBAAgB,SAAe,EAC/B,QAAQ,SAAY,EACpB,QAAQ,CAAC,EAAE,QAAQ,GAClB,OAAO,CAAC,MAAM,CAAC;IAqElB,OAAO,CAAC,WAAW;IAgBnB,OAAO,CAAC,cAAc;IAatB,OAAO,CAAC,gBAAgB;YAUV,WAAW;IAqBnB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAU/B,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAWtC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { buildFileNamePrompt, AI_SYSTEM_PROMPT } from '../utils/ai-prompts.js';
|
|
1
2
|
export class OllamaService {
|
|
2
3
|
name = 'Ollama';
|
|
3
4
|
baseUrl;
|
|
@@ -8,21 +9,50 @@ export class OllamaService {
|
|
|
8
9
|
}
|
|
9
10
|
async generateFileName(content, originalName, namingConvention = 'kebab-case', category = 'general', fileInfo) {
|
|
10
11
|
try {
|
|
11
|
-
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
12
|
+
// Check if this is a scanned PDF image
|
|
13
|
+
const isScannedPDF = content.startsWith('[SCANNED_PDF_IMAGE]:');
|
|
14
|
+
let response;
|
|
15
|
+
if (isScannedPDF) {
|
|
16
|
+
// Extract base64 image data and use a vision model
|
|
17
|
+
const imageBase64 = content.replace('[SCANNED_PDF_IMAGE]:', '');
|
|
18
|
+
const imageData = imageBase64.split(',')[1]; // Remove data:image/format;base64, prefix
|
|
19
|
+
const prompt = this.buildPrompt('This is a scanned PDF document converted to an image. Please analyze the image and extract the main content to generate an appropriate filename.', originalName, namingConvention, category, fileInfo);
|
|
20
|
+
// Use LLaVA model for vision capabilities
|
|
21
|
+
const visionModel = this.getVisionModel();
|
|
22
|
+
response = await this.makeRequest('/api/chat', {
|
|
23
|
+
model: visionModel,
|
|
24
|
+
messages: [
|
|
25
|
+
{
|
|
26
|
+
role: 'system',
|
|
27
|
+
content: AI_SYSTEM_PROMPT
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
role: 'user',
|
|
31
|
+
content: prompt,
|
|
32
|
+
images: [imageData]
|
|
33
|
+
}
|
|
34
|
+
],
|
|
35
|
+
stream: false
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
// Standard text processing
|
|
40
|
+
const prompt = this.buildPrompt(content, originalName, namingConvention, category, fileInfo);
|
|
41
|
+
response = await this.makeRequest('/api/chat', {
|
|
42
|
+
model: this.model,
|
|
43
|
+
messages: [
|
|
44
|
+
{
|
|
45
|
+
role: 'system',
|
|
46
|
+
content: AI_SYSTEM_PROMPT
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
role: 'user',
|
|
50
|
+
content: prompt
|
|
51
|
+
}
|
|
52
|
+
],
|
|
53
|
+
stream: false
|
|
54
|
+
});
|
|
55
|
+
}
|
|
26
56
|
if (response.message?.content) {
|
|
27
57
|
return this.sanitizeFilename(response.message.content);
|
|
28
58
|
}
|
|
@@ -36,24 +66,23 @@ export class OllamaService {
|
|
|
36
66
|
}
|
|
37
67
|
}
|
|
38
68
|
buildPrompt(content, originalName, namingConvention, category, fileInfo) {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
69
|
+
return buildFileNamePrompt({
|
|
70
|
+
content,
|
|
71
|
+
originalName,
|
|
72
|
+
namingConvention: namingConvention,
|
|
73
|
+
category: category,
|
|
74
|
+
fileInfo
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
getVisionModel() {
|
|
78
|
+
// Try to use a vision-capable model, fallback to default if not specified
|
|
79
|
+
const visionModels = ['llava', 'llava:7b', 'llava:13b', 'llava:34b', 'llama3.2-vision', 'qwen2-vl'];
|
|
80
|
+
// If the current model is already a vision model, use it
|
|
81
|
+
if (visionModels.some(vm => this.model.toLowerCase().includes(vm.split(':')[0]))) {
|
|
82
|
+
return this.model;
|
|
52
83
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
prompt += `\n\nGenerate ONLY a descriptive filename (without extension) using ${namingConvention} format. Do not include any explanation or additional text.`;
|
|
56
|
-
return prompt;
|
|
84
|
+
// Otherwise, default to llava (most common vision model in Ollama)
|
|
85
|
+
return 'llava';
|
|
57
86
|
}
|
|
58
87
|
sanitizeFilename(filename) {
|
|
59
88
|
return filename
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ollama-service.js","sourceRoot":"","sources":["../../src/services/ollama-service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ollama-service.js","sourceRoot":"","sources":["../../src/services/ollama-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-service.d.ts","sourceRoot":"","sources":["../../src/services/openai-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"openai-service.d.ts","sourceRoot":"","sources":["../../src/services/openai-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAKzD,qBAAa,aAAc,YAAW,UAAU;IAC9C,IAAI,SAAY;IAChB,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,MAAM;IAMpB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,gBAAgB,GAAE,MAAqB,EAAE,QAAQ,GAAE,MAAkB,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;IA6E1K,OAAO,CAAC,gBAAgB;CAuBzB"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import OpenAI from 'openai';
|
|
2
|
-
import { applyNamingConvention
|
|
3
|
-
import {
|
|
2
|
+
import { applyNamingConvention } from '../utils/naming-conventions.js';
|
|
3
|
+
import { buildFileNamePrompt } from '../utils/ai-prompts.js';
|
|
4
4
|
export class OpenAIService {
|
|
5
5
|
name = 'OpenAI';
|
|
6
6
|
client;
|
|
@@ -12,71 +12,64 @@ export class OpenAIService {
|
|
|
12
12
|
async generateFileName(content, originalName, namingConvention = 'kebab-case', category = 'general', fileInfo) {
|
|
13
13
|
const convention = namingConvention;
|
|
14
14
|
const fileCategory = category;
|
|
15
|
-
|
|
16
|
-
const
|
|
17
|
-
// Build comprehensive context from all metadata
|
|
18
|
-
let metadataContext = '';
|
|
19
|
-
if (fileInfo) {
|
|
20
|
-
metadataContext += `File Information:
|
|
21
|
-
- Original filename: ${originalName}
|
|
22
|
-
- File size: ${Math.round(fileInfo.size / 1024)}KB
|
|
23
|
-
- Created: ${fileInfo.createdAt.toLocaleDateString()}
|
|
24
|
-
- Modified: ${fileInfo.modifiedAt.toLocaleDateString()}
|
|
25
|
-
- Parent folder: ${fileInfo.parentFolder}
|
|
26
|
-
- Folder path: ${fileInfo.folderPath.join(' > ')}`;
|
|
27
|
-
if (fileInfo.documentMetadata) {
|
|
28
|
-
const meta = fileInfo.documentMetadata;
|
|
29
|
-
metadataContext += `
|
|
30
|
-
Document Properties:`;
|
|
31
|
-
if (meta.title)
|
|
32
|
-
metadataContext += `\n- Title: ${meta.title}`;
|
|
33
|
-
if (meta.author)
|
|
34
|
-
metadataContext += `\n- Author: ${meta.author}`;
|
|
35
|
-
if (meta.creator)
|
|
36
|
-
metadataContext += `\n- Creator: ${meta.creator}`;
|
|
37
|
-
if (meta.subject)
|
|
38
|
-
metadataContext += `\n- Subject: ${meta.subject}`;
|
|
39
|
-
if (meta.keywords?.length)
|
|
40
|
-
metadataContext += `\n- Keywords: ${meta.keywords.join(', ')}`;
|
|
41
|
-
if (meta.creationDate)
|
|
42
|
-
metadataContext += `\n- Created: ${meta.creationDate.toLocaleDateString()}`;
|
|
43
|
-
if (meta.modificationDate)
|
|
44
|
-
metadataContext += `\n- Modified: ${meta.modificationDate.toLocaleDateString()}`;
|
|
45
|
-
if (meta.pages)
|
|
46
|
-
metadataContext += `\n- Pages: ${meta.pages}`;
|
|
47
|
-
if (meta.wordCount)
|
|
48
|
-
metadataContext += `\n- Word count: ${meta.wordCount}`;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
const prompt = `Based on the following document information, generate a descriptive filename that captures the main topic/purpose of the document. The filename should be:
|
|
52
|
-
- Descriptive and meaningful
|
|
53
|
-
- Professional and clean
|
|
54
|
-
- Between 3-8 words
|
|
55
|
-
- ${namingInstructions}
|
|
56
|
-
- ${templateInstructions}
|
|
57
|
-
- Do not include file extension
|
|
58
|
-
- Do not include personal names, dates, or template variables - just the core content description
|
|
59
|
-
- Only use letters, numbers, and appropriate separators for the naming convention
|
|
60
|
-
- Use all available context (metadata, folder context, document properties) to create the most accurate filename
|
|
61
|
-
|
|
62
|
-
${metadataContext}
|
|
63
|
-
|
|
64
|
-
Document content (first 2000 characters):
|
|
65
|
-
${content.substring(0, 2000)}
|
|
66
|
-
|
|
67
|
-
Respond with only the core filename (without personal info or dates) using the specified naming convention, no explanation.`;
|
|
15
|
+
// Check if this is a scanned PDF image
|
|
16
|
+
const isScannedPDF = content.startsWith('[SCANNED_PDF_IMAGE]:');
|
|
68
17
|
try {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
18
|
+
let response;
|
|
19
|
+
if (isScannedPDF) {
|
|
20
|
+
// Extract base64 image data
|
|
21
|
+
const imageBase64 = content.replace('[SCANNED_PDF_IMAGE]:', '');
|
|
22
|
+
const prompt = buildFileNamePrompt({
|
|
23
|
+
content: 'This is a scanned PDF document converted to an image. Please analyze the image and extract the main content to generate an appropriate filename.',
|
|
24
|
+
originalName,
|
|
25
|
+
namingConvention: convention,
|
|
26
|
+
category: fileCategory,
|
|
27
|
+
fileInfo
|
|
28
|
+
});
|
|
29
|
+
response = await this.client.chat.completions.create({
|
|
30
|
+
model: 'gpt-4o', // Use GPT-4 with vision capabilities
|
|
31
|
+
messages: [
|
|
32
|
+
{
|
|
33
|
+
role: 'user',
|
|
34
|
+
content: [
|
|
35
|
+
{
|
|
36
|
+
type: 'text',
|
|
37
|
+
text: prompt
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
type: 'image_url',
|
|
41
|
+
image_url: {
|
|
42
|
+
url: imageBase64
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
]
|
|
46
|
+
}
|
|
47
|
+
],
|
|
48
|
+
max_tokens: 100,
|
|
49
|
+
temperature: 0.3
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
// Standard text processing
|
|
54
|
+
const prompt = buildFileNamePrompt({
|
|
55
|
+
content,
|
|
56
|
+
originalName,
|
|
57
|
+
namingConvention: convention,
|
|
58
|
+
category: fileCategory,
|
|
59
|
+
fileInfo
|
|
60
|
+
});
|
|
61
|
+
response = await this.client.chat.completions.create({
|
|
62
|
+
model: 'gpt-3.5-turbo',
|
|
63
|
+
messages: [
|
|
64
|
+
{
|
|
65
|
+
role: 'user',
|
|
66
|
+
content: prompt
|
|
67
|
+
}
|
|
68
|
+
],
|
|
69
|
+
max_tokens: 100,
|
|
70
|
+
temperature: 0.3
|
|
71
|
+
});
|
|
72
|
+
}
|
|
80
73
|
const suggestedName = response.choices[0]?.message?.content?.trim() || 'untitled-document';
|
|
81
74
|
// Clean and validate the suggested name
|
|
82
75
|
return this.sanitizeFileName(suggestedName, convention);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-service.js","sourceRoot":"","sources":["../../src/services/openai-service.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,OAAO,EAAE,qBAAqB,
|
|
1
|
+
{"version":3,"file":"openai-service.js","sourceRoot":"","sources":["../../src/services/openai-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { FileInfo } from '../types/index.js';
|
|
2
|
+
import { NamingConvention } from './naming-conventions.js';
|
|
3
|
+
import { FileCategory } from './file-templates.js';
|
|
4
|
+
export interface PromptContext {
|
|
5
|
+
content: string;
|
|
6
|
+
originalName: string;
|
|
7
|
+
namingConvention: NamingConvention;
|
|
8
|
+
category: FileCategory;
|
|
9
|
+
fileInfo?: FileInfo;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Builds a standardized prompt for AI filename generation
|
|
13
|
+
* This prompt is used across all AI providers (Claude, OpenAI, LMStudio, Ollama)
|
|
14
|
+
*/
|
|
15
|
+
export declare function buildFileNamePrompt(context: PromptContext): string;
|
|
16
|
+
/**
|
|
17
|
+
* System prompt for AI models that need a separate system message
|
|
18
|
+
*/
|
|
19
|
+
export declare const AI_SYSTEM_PROMPT = "You are a helpful assistant that generates descriptive filenames based on document content. Always respond with just the filename, no explanation or additional text.";
|
|
20
|
+
//# sourceMappingURL=ai-prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-prompts.d.ts","sourceRoot":"","sources":["../../src/utils/ai-prompts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAyB,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAClF,OAAO,EAA2B,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE5E,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,QAAQ,EAAE,YAAY,CAAC;IACvB,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAsDlE;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,0KAA0K,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { getNamingInstructions } from './naming-conventions.js';
|
|
2
|
+
import { getTemplateInstructions } from './file-templates.js';
|
|
3
|
+
/**
|
|
4
|
+
* Builds a standardized prompt for AI filename generation
|
|
5
|
+
* This prompt is used across all AI providers (Claude, OpenAI, LMStudio, Ollama)
|
|
6
|
+
*/
|
|
7
|
+
export function buildFileNamePrompt(context) {
|
|
8
|
+
const { content, originalName, namingConvention, category, fileInfo } = context;
|
|
9
|
+
const namingInstructions = getNamingInstructions(namingConvention);
|
|
10
|
+
const templateInstructions = getTemplateInstructions(category);
|
|
11
|
+
// Build comprehensive context from all metadata
|
|
12
|
+
let metadataContext = '';
|
|
13
|
+
if (fileInfo) {
|
|
14
|
+
metadataContext += `File Information:
|
|
15
|
+
- Original filename: ${originalName}
|
|
16
|
+
- File size: ${Math.round(fileInfo.size / 1024)}KB
|
|
17
|
+
- Created: ${fileInfo.createdAt.toLocaleDateString()}
|
|
18
|
+
- Modified: ${fileInfo.modifiedAt.toLocaleDateString()}
|
|
19
|
+
- Parent folder: ${fileInfo.parentFolder}
|
|
20
|
+
- Folder path: ${fileInfo.folderPath.join(' > ')}`;
|
|
21
|
+
if (fileInfo.documentMetadata) {
|
|
22
|
+
const meta = fileInfo.documentMetadata;
|
|
23
|
+
metadataContext += `
|
|
24
|
+
Document Properties:`;
|
|
25
|
+
if (meta.title)
|
|
26
|
+
metadataContext += `\n- Title: ${meta.title}`;
|
|
27
|
+
if (meta.author)
|
|
28
|
+
metadataContext += `\n- Author: ${meta.author}`;
|
|
29
|
+
if (meta.creator)
|
|
30
|
+
metadataContext += `\n- Creator: ${meta.creator}`;
|
|
31
|
+
if (meta.subject)
|
|
32
|
+
metadataContext += `\n- Subject: ${meta.subject}`;
|
|
33
|
+
if (meta.keywords?.length)
|
|
34
|
+
metadataContext += `\n- Keywords: ${meta.keywords.join(', ')}`;
|
|
35
|
+
if (meta.creationDate)
|
|
36
|
+
metadataContext += `\n- Created: ${meta.creationDate.toLocaleDateString()}`;
|
|
37
|
+
if (meta.modificationDate)
|
|
38
|
+
metadataContext += `\n- Modified: ${meta.modificationDate.toLocaleDateString()}`;
|
|
39
|
+
if (meta.pages)
|
|
40
|
+
metadataContext += `\n- Pages: ${meta.pages}`;
|
|
41
|
+
if (meta.wordCount)
|
|
42
|
+
metadataContext += `\n- Word count: ${meta.wordCount}`;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return `Based on the following document information, generate a descriptive filename that captures the main topic/purpose of the document. The filename should be:
|
|
46
|
+
- Descriptive and meaningful
|
|
47
|
+
- Professional and clean
|
|
48
|
+
- Between 3-10 words
|
|
49
|
+
- ${namingInstructions}
|
|
50
|
+
- ${templateInstructions}
|
|
51
|
+
- Do not include file extension
|
|
52
|
+
- If the document is specifically for/about a person (based on content), include their name at the beginning
|
|
53
|
+
- Include dates only if they are essential to the document's identity (e.g., contracts, certificates)
|
|
54
|
+
- Ignore irrelevant folder names that don't describe the document content
|
|
55
|
+
- Only use letters, numbers, and appropriate separators for the naming convention
|
|
56
|
+
- Focus on the document's actual content and purpose, not just metadata
|
|
57
|
+
|
|
58
|
+
${metadataContext}
|
|
59
|
+
|
|
60
|
+
Document content (first 2000 characters):
|
|
61
|
+
${content.substring(0, 2000)}
|
|
62
|
+
|
|
63
|
+
Important: If this document is specifically for or about a particular person mentioned in the content, start the filename with their name. Otherwise, focus on the document's main purpose and content.
|
|
64
|
+
|
|
65
|
+
Respond with only the filename using the specified naming convention, no explanation.`;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* System prompt for AI models that need a separate system message
|
|
69
|
+
*/
|
|
70
|
+
export const AI_SYSTEM_PROMPT = 'You are a helpful assistant that generates descriptive filenames based on document content. Always respond with just the filename, no explanation or additional text.';
|
|
71
|
+
//# sourceMappingURL=ai-prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-prompts.js","sourceRoot":"","sources":["../../src/utils/ai-prompts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAoB,MAAM,yBAAyB,CAAC;AAClF,OAAO,EAAE,uBAAuB,EAAgB,MAAM,qBAAqB,CAAC;AAU5E;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAsB;IACxD,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAEhF,MAAM,kBAAkB,GAAG,qBAAqB,CAAC,gBAAgB,CAAC,CAAC;IACnE,MAAM,oBAAoB,GAAG,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IAE/D,gDAAgD;IAChD,IAAI,eAAe,GAAG,EAAE,CAAC;IACzB,IAAI,QAAQ,EAAE,CAAC;QACb,eAAe,IAAI;uBACA,YAAY;eACpB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;aAClC,QAAQ,CAAC,SAAS,CAAC,kBAAkB,EAAE;cACtC,QAAQ,CAAC,UAAU,CAAC,kBAAkB,EAAE;mBACnC,QAAQ,CAAC,YAAY;iBACvB,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAE/C,IAAI,QAAQ,CAAC,gBAAgB,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,QAAQ,CAAC,gBAAgB,CAAC;YACvC,eAAe,IAAI;qBACJ,CAAC;YAChB,IAAI,IAAI,CAAC,KAAK;gBAAE,eAAe,IAAI,cAAc,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9D,IAAI,IAAI,CAAC,MAAM;gBAAE,eAAe,IAAI,eAAe,IAAI,CAAC,MAAM,EAAE,CAAC;YACjE,IAAI,IAAI,CAAC,OAAO;gBAAE,eAAe,IAAI,gBAAgB,IAAI,CAAC,OAAO,EAAE,CAAC;YACpE,IAAI,IAAI,CAAC,OAAO;gBAAE,eAAe,IAAI,gBAAgB,IAAI,CAAC,OAAO,EAAE,CAAC;YACpE,IAAI,IAAI,CAAC,QAAQ,EAAE,MAAM;gBAAE,eAAe,IAAI,iBAAiB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1F,IAAI,IAAI,CAAC,YAAY;gBAAE,eAAe,IAAI,gBAAgB,IAAI,CAAC,YAAY,CAAC,kBAAkB,EAAE,EAAE,CAAC;YACnG,IAAI,IAAI,CAAC,gBAAgB;gBAAE,eAAe,IAAI,iBAAiB,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,EAAE,CAAC;YAC5G,IAAI,IAAI,CAAC,KAAK;gBAAE,eAAe,IAAI,cAAc,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9D,IAAI,IAAI,CAAC,SAAS;gBAAE,eAAe,IAAI,mBAAmB,IAAI,CAAC,SAAS,EAAE,CAAC;QAC7E,CAAC;IACH,CAAC;IAED,OAAO;;;;IAIL,kBAAkB;IAClB,oBAAoB;;;;;;;;EAQtB,eAAe;;;EAGf,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC;;;;sFAI0D,CAAC;AACvF,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,uKAAuK,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface PDFToImageOptions {
|
|
2
|
+
scale?: number;
|
|
3
|
+
format?: 'png' | 'jpeg';
|
|
4
|
+
firstPageOnly?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare class PDFToImageConverter {
|
|
7
|
+
private static readonly MAX_IMAGE_SIZE_BYTES;
|
|
8
|
+
static convertFirstPageToBase64(pdfBuffer: Buffer, options?: PDFToImageOptions): Promise<string>;
|
|
9
|
+
static isScannedPDF(extractedText: string): boolean;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=pdf-to-image.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-to-image.d.ts","sourceRoot":"","sources":["../../src/utils/pdf-to-image.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,qBAAa,mBAAmB;IAE9B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAmB;WAElD,wBAAwB,CACnC,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,MAAM,CAAC;IAyFlB,MAAM,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO;CAapD"}
|