From 3df4e67c42e431603d60f00d0a91867df7d0e2a6 Mon Sep 17 00:00:00 2001
From: bobzel <zzzman@gmail.com>
Date: Wed, 11 Jun 2025 12:36:08 -0400
Subject: don't recompute tags_chat for PDF and videos.  Don't block within
 loop for getting pdf text.

---
 src/client/views/nodes/PDFBox.tsx | 63 ++++++++++++++++-----------------------
 1 file changed, 26 insertions(+), 37 deletions(-)

(limited to 'src/client/views/nodes/PDFBox.tsx')

diff --git a/src/client/views/nodes/PDFBox.tsx b/src/client/views/nodes/PDFBox.tsx
index a0c7d8d22..5501f0a31 100644
--- a/src/client/views/nodes/PDFBox.tsx
+++ b/src/client/views/nodes/PDFBox.tsx
@@ -81,46 +81,35 @@ export class PDFBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
         }
     }
 
-     autoTag = async () => {
-     try {
-        if (!this._pdf) {
-            throw new Error('PDF not loaded');
-        }
-
-        // 1) Extract text from the first few pages (e.g., first 2 pages)
-        const maxPages = Math.min(2, this._pdf.numPages);
-        let textContent = '';
-        for (let pageNum = 1; pageNum <= maxPages; pageNum++) {
-            const page = await this._pdf.getPage(pageNum);
-            const text = await page.getTextContent();
-            const pageText = text.items.map(item => ('str' in item ? item.str : '')).join(' ');
-            textContent += ` ${pageText}`;
-        }
-
-        if (!textContent.trim()) {
-            throw new Error('No text found in PDF');
-        }
-
-        // 2) Ask GPT to classify and provide descriptive tags
-        const raw = await gptAPICall(
-            `"${textContent.trim().slice(0, 2000)}"`, 
-            GPTCallType.CLASSIFYTEXTFULL
-        );
-
-        // 3) Normalize and store the labels
-        const label = raw.trim().toUpperCase();
+    autoTag = async () => {
+        if (!this.Document.$tags_chat && this._pdf) {
+            if (!this.dataDoc.text) {
+                // 1) Extract text from the first few pages (e.g., first 2 pages)
+                const maxPages = Math.min(2, this._pdf.numPages);
+                const promises: Promise<string>[] = [];
+                for (let pageNum = 1; pageNum <= maxPages; pageNum++) {
+                    promises.push(
+                        this._pdf
+                            .getPage(pageNum)
+                            .then(page => page.getTextContent())
+                            .then(content => content.items.map(item => ('str' in item ? item.str : '')).join(' '))
+                    );
+                }
+                this.dataDoc.text = (await Promise.all(promises)).join(' ');
+            }
 
-        const tokens = label.split(/\s+/);
-        this.Document.$tags_chat = new List<string>();
-        tokens.forEach(tok => (this.Document.$tags_chat as List<string>).push(tok));
+            const text = StrCast(this.dataDoc.text).trim().slice(0, 2000);
+            if (text) {
+                // 2) Ask GPT to classify and provide descriptive tags, then normalize the results
+                const label = await gptAPICall(`"${text}"`, GPTCallType.CLASSIFYTEXTFULL).then(raw => raw.trim().toUpperCase());
 
-        // 4) Show tags in layout
-        this.Document._layout_showTags = true;
+                this.Document.$tags_chat = new List<string>(label.split(/\s+/));
 
-    } catch (err) {
-        console.error('PDF autoTag failed:', err);
-    }
-};
+                // 4) Show tags in layout
+                this.Document._layout_showTags = true;
+            }
+        }
+    };
 
     replaceCanvases = (oldDiv: HTMLElement, newDiv: HTMLElement) => {
         if (oldDiv.childNodes) {
-- 
cgit v1.2.3-70-g09d2

