From 0585d7d30fd0066ed93903b2b1eb5eea21d10d79 Mon Sep 17 00:00:00 2001 From: sinedied Date: Tue, 21 Nov 2023 10:34:31 +0100 Subject: [PATCH 1/4] chore(data): convert doc to pdf --- data/support.md | 307 ----------------------------------------------- data/support.pdf | Bin 0 -> 110662 bytes 2 files changed, 307 deletions(-) delete mode 100644 data/support.md create mode 100644 data/support.pdf diff --git a/data/support.md b/data/support.md deleted file mode 100644 index 166524c4..00000000 --- a/data/support.md +++ /dev/null @@ -1,307 +0,0 @@ -# Contoso Real Estate Customer Support Guide - -> This document contains information generated using a language model (Azure OpenAI). The information -> contained in this document is only for demonstration purposes and does not reflect the opinions or -> beliefs of Microsoft. Microsoft makes no representations or warranties of any kind, express or implied, -> about the completeness, accuracy, reliability, suitability or availability with respect to the information -> contained in this document. - -> All rights reserved to Microsoft - -## Customer Support Guide - -Welcome to Contoso Real Estate! We're delighted to have you as a part of our community of travelers and hosts. This comprehensive customer support guide will assist you in navigating various aspects of our platform, ensuring that your experience with us is smooth and enjoyable. - -## Table of Contents - -1. [How to Search and Book Rentals](#how-to-search-and-book-rentals) -2. [How to Cancel a Confirmed Booking](#how-to-cancel-a-confirmed-booking) -3. [How to Contact Customer Support](#how-to-contact-customer-support) -4. [How to Report a Problem with a Listing](#how-to-report-a-problem-with-a-listing) -5. [How to Report a Problem with a Guest or Host](#how-to-report-a-problem-with-a-guest-or-host) -6. [How to Report a Safety Issue](#how-to-report-a-safety-issue) -7. [How to Report a Payment or Refund Issue](#how-to-report-a-payment-or-refund-issue) -8. [Guest or Host Rule Violations](#guest-or-host-rule-violations) -9. [Compensation for Damage](#compensation-for-damage) -10. [Payment Error Resolution](#payment-error-resolution) - ---- - -## 1. How to Search and Book Rentals - -Contoso Real Estate offers a wide range of rental properties for your stay. Here's how to search and book rentals: - -1. **Search for Rentals:** - - - Enter your destination, check-in and check-out dates, and the number of guests. - - Apply filters such as price range, property type, and amenities to narrow down your options. - - Browse through the listings to find the perfect place for your stay. - -2. **View Listing Details:** - - - Click on a listing to view detailed information, including photos, property description, reviews, and host information. - -3. **Make a Booking:** - - - Click the "Book Now" button on the listing page. - - Review the booking details, including the total cost and house rules. - - Confirm your booking by providing payment information. - - Once the host accepts your booking, you'll receive a confirmation. - -4. **Payment:** - - - Contoso Real Estate handles the payment process securely. You'll only be charged once your booking is confirmed. - -5. **Communication:** - - You can communicate with the host through our messaging system for any questions or special requests. - ---- - -## 2. How to Cancel a Confirmed Booking - -Life happens, and sometimes you need to cancel a confirmed booking. Here's how to do it: - -1. **Log In:** - - - Log in to your Contoso Real Estate account. - -2. **Go to Your Bookings:** - - - Click on your profile picture and navigate to "Bookings." - -3. **Select the Booking to Cancel:** - - - Find the booking you want to cancel and click on it. - -4. **Cancel Reservation:** - - - Click on the "Cancel Reservation" button. - - Review the cancellation policy to understand any potential fees. - - Confirm the cancellation. - -5. **Cancellation Fees:** - - - Depending on the host's cancellation policy, you may be subject to cancellation fees. These fees will be clearly displayed during the cancellation process. - -6. **Refunds:** - - If eligible for a refund, it will be processed according to the cancellation policy. - ---- - -## 3. How to Contact Customer Support - -If you encounter any issues or have questions, our customer support team is here to assist you. Here's how to contact us: - -1. **Through the Website:** - - - Click on the "Help" or "Contact Us" option located in the website's navigation menu. - - Follow the prompts to describe your issue or question. - -2. **Via Email:** - - - Send an email to support@contosorealestate.com with your inquiry. - - Be sure to provide your booking ID if applicable. - -3. **Phone Support:** - - - Call our dedicated customer support hotline at +1 (800) 123-4567. - - Our support agents are available 24/7 to assist you. - -4. **In-App Messaging:** - - If you're logged into our mobile app, you can initiate a chat with our support team through the app's messaging feature. - -Our goal is to address your concerns promptly and efficiently. - ---- - -## 4. How to Report a Problem with a Listing - -If you encounter any issues with a listing you've booked or noticed inaccurate information, please report it. Here's how: - -1. **Log In:** - - - Log in to your Contoso Real Estate account. - -2. **Go to Your Bookings:** - - - Click on your profile picture and navigate to "Bookings." - -3. **Select the Booking with the Issue:** - - - Find the booking associated with the problematic listing and click on it. - -4. **Report a Problem:** - - - Click on the "Report a Problem" button. - - Describe the issue you've encountered with the listing in detail. - -5. **Submit the Report:** - - Once you've provided the necessary information, submit the report. - -Our team will investigate the issue and take appropriate action. - ---- - -## 5. How to Report a Problem with a Guest or Host - -If you have concerns about the behavior of a guest or host during your stay, please report it to us. Here's how: - -1. **Log In:** - - - Log in to your Contoso Real Estate account. - -2. **Go to Your Bookings:** - - - Click on your profile picture and navigate to "Bookings." - -3. **Select the Booking with the Issue:** - - - Find the booking associated with the problematic guest or host and click on it. - -4. **Report a Problem:** - - - Click on the "Report a Problem" button. - - Provide a detailed description of the issue, including any relevant evidence. - -5. **Submit the Report:** - - Once you've provided the necessary information, submit the report. - -We take such reports seriously and will investigate them thoroughly. - ---- - -## 6. How to Report a Safety Issue - -Your safety is our top priority. If you encounter any safety concerns during your stay, please report them immediately. Here's how: - -1. **Log In:** - - - Log in to your Contoso Real Estate account. - -2. **Go to Your Bookings:** - - - Click on your profile picture and navigate to "Bookings." - -3. **Select the Booking with the Safety Issue:** - - - Find the booking associated with the safety concern and click on it. - -4. **Report a Safety Issue:** - - - Click on the "Report a Safety Issue" button. - - Provide a detailed description of the safety concern. - -5. **Submit the Report:** - - Once you've provided the necessary information, submit the report. - -Our team will prioritize your safety and take appropriate action. - -## 7. How to Report a Payment or Refund Issue - -If you encounter any problems related to payments or refunds, such as issues with a guest or host requesting payments outside of our platform, please report it immediately. Here's how: - -1. **Log In:** - - - Log in to your Contoso Real Estate account. - -2. **Go to Your Bookings:** - - - Click on your profile picture and navigate to "Bookings." - -3. **Select the Booking with the Payment Issue:** - - - Find the booking associated with the payment or refund problem and click on it. - -4. **Report a Payment Issue:** - - - Click on the "Report a Payment Issue" button. - - Provide a detailed description of the payment or refund issue. - -5. **Submit the Report:** - - Once you've provided the necessary information, submit the report. - -Our financial support team will investigate the matter and work to resolve it promptly. - ---- - -## 8. Guest or Host Rule Violations - -At Contoso Real Estate, we expect all users to adhere to our community guidelines and rules. If you believe a guest or host has violated these rules, please report it to us. Here's how: - -1. **Log In:** - - - Log in to your Contoso Real Estate account. - -2. **Go to Your Bookings:** - - - Click on your profile picture and navigate to "Bookings." - -3. **Select the Booking with the Rule Violation:** - - - Find the booking associated with the rule violation and click on it. - -4. **Report a Rule Violation:** - - - Click on the "Report a Rule Violation" button. - - Describe the violation in detail and provide any relevant evidence. - -5. **Submit the Report:** - - Once you've provided the necessary information, submit the report. - -Our team will review the report and take appropriate action to maintain a safe and respectful community. - ---- - -## 9. Compensation for Damage - -Accidents can happen during a stay, and we have procedures in place to handle compensation for damage. Here's how it works: - -1. **Reporting Damage:** - - - If you, as a guest, notice damage during your stay or if you're a host and your property has been damaged, report it immediately through the platform. - -2. **Document Damage:** - - - Take photos or videos of the damage and provide a clear description. - -3. **Communication:** - - - Communicate with the other party to discuss the issue and attempt to reach a resolution. - -4. **Claim Resolution:** - - - If an agreement cannot be reached, you can file a damage claim through Contoso Real Estate, and our support team will assist in resolving the issue. - -5. **Resolution Timeline:** - - - Our team will work diligently to reach a resolution within a reasonable timeframe. - -6. **Insurance:** - - Contoso Real Estate may offer insurance options to provide coverage for certain types of damage. Review your options in your account settings. - ---- - -## 10. Payment Error Resolution - -In the rare event of a payment error, our team is here to help you resolve it. Here's what to do: - -1. **Payment Error Notification:** - - - If you receive a payment error notification, do not hesitate to contact our customer support immediately. - -2. **Contact Customer Support:** - - - Follow the steps outlined in Section 3, "How to Contact Customer Support," to reach our support team for payment-related issues. - -3. **Provide Details:** - - - Be prepared to provide details of the payment error, including any error messages or transaction IDs. - -4. **Resolution:** - - Our dedicated team will investigate the issue and work towards a swift resolution, ensuring your funds are handled correctly. - -We understand the importance of timely and accurate payments and will do our best to rectify any payment errors promptly. - ---- - -We hope this comprehensive customer support guide has been helpful in addressing your questions and concerns. Contoso Real Estate is committed to providing you with a safe and enjoyable experience. If you require further assistance, please don't hesitate to reach out to our customer support team using the methods outlined in Section 3. Your satisfaction is our priority! diff --git a/data/support.pdf b/data/support.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a67c7304b2ca192592b4dee4bd2f9c8d4e4e41fb GIT binary patch literal 110662 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≺yVh3-dABgI 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 L6_tdNB*OmzW~rcG literal 0 HcmV?d00001 From 672a5c7c4c7b92672319a4e6cbad3990dd65af45 Mon Sep 17 00:00:00 2001 From: sinedied Date: Tue, 21 Nov 2023 10:35:02 +0100 Subject: [PATCH 2/4] chore(scripts): index all files in data folder --- scripts/index-data.ps1 | 2 +- scripts/index-data.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/index-data.ps1 b/scripts/index-data.ps1 index 23cc9c24..78d90608 100644 --- a/scripts/index-data.ps1 +++ b/scripts/index-data.ps1 @@ -19,5 +19,5 @@ npm ci npm run build --workspace=indexer Write-Host 'Running "index-files" CLI tool' -$files = Get-Item "data/*.md" +$files = Get-Item "data/*.*" npx index-files --wait --indexer-url "$env:INDEXER_API_URI" --index-name "$env:AZURE_SEARCH_INDEX" $files diff --git a/scripts/index-data.sh b/scripts/index-data.sh index 3e68eea4..71bb1cc2 100755 --- a/scripts/index-data.sh +++ b/scripts/index-data.sh @@ -13,4 +13,4 @@ npx index-files \ --wait \ --indexer-url "${INDEXER_API_URI}" \ --index-name "${AZURE_SEARCH_INDEX}" \ - ./data/*.md + ./data/*.* From 56d5ac44b45e8e174ed60e7f8962de9e542e10d9 Mon Sep 17 00:00:00 2001 From: sinedied Date: Tue, 21 Nov 2023 13:41:06 +0100 Subject: [PATCH 3/4] feat(indexer): add pdf support (closes #90) --- package-lock.json | 369 ++++++++++++++++-- packages/indexer/package.json | 3 +- .../indexer/src/lib/document-processor.ts | 81 ++-- packages/indexer/src/lib/document.ts | 26 ++ packages/indexer/src/lib/formats/index.ts | 1 + packages/indexer/src/lib/formats/pdf.ts | 33 ++ packages/indexer/src/lib/index.ts | 1 + packages/indexer/src/lib/indexer.ts | 3 +- packages/indexer/test.http | 24 +- 9 files changed, 465 insertions(+), 76 deletions(-) create mode 100644 packages/indexer/src/lib/document.ts create mode 100644 packages/indexer/src/lib/formats/index.ts create mode 100644 packages/indexer/src/lib/formats/pdf.ts diff --git a/package-lock.json b/package-lock.json index 1cf28bcc..b2fb6cc7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2073,6 +2073,223 @@ "node": ">=8" } }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "optional": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "optional": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "optional": true + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "optional": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "optional": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "optional": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "optional": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "optional": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "optional": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "optional": true, + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "optional": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "optional": true + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "optional": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "optional": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@microsoft/load-themed-styles": { "version": "1.10.295", "resolved": "https://registry.npmjs.org/@microsoft/load-themed-styles/-/load-themed-styles-1.10.295.tgz", @@ -3954,7 +4171,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true + "devOptional": true }, "node_modules/abort-controller": { "version": "3.0.0", @@ -4141,7 +4358,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true + "devOptional": true }, "node_modules/archy": { "version": "1.0.0", @@ -4773,6 +4990,21 @@ } ] }, + "node_modules/canvas": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.2.tgz", + "integrity": "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.0", + "nan": "^2.17.0", + "simple-get": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -4841,7 +5073,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, + "devOptional": true, "engines": { "node": ">=10" } @@ -5056,7 +5288,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true, + "devOptional": true, "bin": { "color-support": "bin.js" } @@ -5126,7 +5358,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true + "devOptional": true }, "node_modules/content-disposition": { "version": "0.5.4", @@ -5242,6 +5474,18 @@ "node": ">=0.10.0" } }, + "node_modules/decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "optional": true, + "dependencies": { + "mimic-response": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -5299,7 +5543,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true + "devOptional": true }, "node_modules/depd": { "version": "2.0.0", @@ -5318,6 +5562,15 @@ "node": ">=6" } }, + "node_modules/detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "optional": true, + "engines": { + "node": ">=8" + } + }, "node_modules/diff": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", @@ -7224,7 +7477,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true + "devOptional": true }, "node_modules/help-me": { "version": "4.2.0", @@ -9328,6 +9581,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "optional": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/min-indent": { "version": "1.0.1", "license": "MIT", @@ -9507,7 +9772,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, + "devOptional": true, "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -9520,7 +9785,7 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, + "devOptional": true, "dependencies": { "yallist": "^4.0.0" }, @@ -9601,6 +9866,12 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/nan": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz", + "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==", + "optional": true + }, "node_modules/nanoid": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", @@ -9984,7 +10255,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -10466,6 +10736,27 @@ "node": ">=8" } }, + "node_modules/path2d-polyfill": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path2d-polyfill/-/path2d-polyfill-2.0.1.tgz", + "integrity": "sha512-ad/3bsalbbWhmBo0D6FZ4RNMwsLsPpL6gnvhuSaU5Vm7b06Kr5ubSltQQ0T7YKsiJQO+g22zJ4dJKNTXIyOXtA==", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pdfjs-dist": { + "version": "4.0.189", + "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-4.0.189.tgz", + "integrity": "sha512-5IWbLRJjQJhk3cu3nNFAvIYoSzT8xRYlRkFCIV1tn7hK1eq9H+6vOP0ytJhZz9YI35IXlu33uQspvmYO6Oir4g==", + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "canvas": "^2.11.2", + "path2d-polyfill": "^2.0.1" + } + }, "node_modules/pg-int8": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", @@ -11691,7 +11982,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true + "devOptional": true }, "node_modules/set-cookie-parser": { "version": "2.6.0", @@ -11791,6 +12082,37 @@ "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true + }, + "node_modules/simple-get": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", + "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", + "optional": true, + "dependencies": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "node_modules/simple-git-hooks": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/simple-git-hooks/-/simple-git-hooks-2.9.0.tgz", @@ -12350,7 +12672,7 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", - "dev": true, + "devOptional": true, "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -12367,7 +12689,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, + "devOptional": true, "dependencies": { "minipass": "^3.0.0" }, @@ -12379,7 +12701,7 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, + "devOptional": true, "dependencies": { "yallist": "^4.0.0" }, @@ -12391,7 +12713,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, + "devOptional": true, "engines": { "node": ">=8" } @@ -12400,7 +12722,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, + "devOptional": true, "bin": { "mkdirp": "bin/cmd.js" }, @@ -13185,7 +13507,7 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, + "devOptional": true, "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } @@ -13194,7 +13516,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, + "devOptional": true, "engines": { "node": ">=8" } @@ -13203,13 +13525,13 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "devOptional": true }, "node_modules/wide-align/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, + "devOptional": true, "engines": { "node": ">=8" } @@ -13218,7 +13540,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, + "devOptional": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -13232,7 +13554,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, + "devOptional": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -13603,7 +13925,8 @@ "fastify-cli": "^5.7.0", "fastify-plugin": "^4.0.0", "mime": "^3.0.0", - "openai": "^4.4.0" + "openai": "^4.4.0", + "pdfjs-dist": "^4.0.189" }, "bin": { "index-files": "bin/index-files.js" diff --git a/packages/indexer/package.json b/packages/indexer/package.json index 46879ff9..71ff6ec6 100644 --- a/packages/indexer/package.json +++ b/packages/indexer/package.json @@ -40,7 +40,8 @@ "fastify-cli": "^5.7.0", "fastify-plugin": "^4.0.0", "mime": "^3.0.0", - "openai": "^4.4.0" + "openai": "^4.4.0", + "pdfjs-dist": "^4.0.189" }, "devDependencies": { "@types/mime": "^3.0.1", diff --git a/packages/indexer/src/lib/document-processor.ts b/packages/indexer/src/lib/document-processor.ts index fcecd896..be6fce46 100644 --- a/packages/indexer/src/lib/document-processor.ts +++ b/packages/indexer/src/lib/document-processor.ts @@ -1,33 +1,10 @@ import { type BaseLogger } from 'pino'; import { getBlobNameFromFile } from './blob-storage.js'; +import { type ContentPage, type ContentSection, type Section } from './document.js'; +import { extractTextFromPdf } from './formats/index.js'; -export interface Document { - filename: string; - type: string; - category: string; - sections: Section[]; -} - -export interface Section { - id: string; - content: string; - category: string; - sourcepage: string; - sourcefile: string; - embedding?: number[]; -} - -export interface ContentPage { - content: string; - offset: number; - page: number; -} - -export interface ContentSection { - content: string; - page: number; -} - +const SENTENCE_ENDINGS = new Set(['.', '!', '?']); +const WORD_BREAKS = new Set([',', ';', ':', ' ', '(', ')', '[', ']', '{', '}', '\t', '\n']); const MAX_SECTION_LENGTH = 1000; const SENTENCE_SEARCH_LIMIT = 100; const SECTION_OVERLAP = 100; @@ -37,7 +14,7 @@ export class DocumentProcessor { async createDocumentFromFile(filename: string, data: Buffer, type: string, category: string) { const pages = await this.extractText(data, type); - const contentSections = this.splitText(filename, pages); + const contentSections = this.splitPages(filename, pages); const sections = await this.createSections(filename, contentSections, category); return { filename, type, category, sections }; } @@ -47,8 +24,11 @@ export class DocumentProcessor { if (type === 'text/plain' || type === 'text/markdown') { const text = data.toString('utf8'); pages.push({ content: text, offset: 0, page: 0 }); + } else if (type === 'application/pdf') { + const pdfContent = await extractTextFromPdf(data); + pages.push(...pdfContent); } else { - // TODO: support other file types (PDF...) + // You can add support for other file types here throw new Error(`Unsupported file type: ${type}`); } @@ -59,9 +39,9 @@ export class DocumentProcessor { const fileId = filenameToId(filename); const sections: Section[] = []; - for (const [index, { content }] of contentSections.entries()) { + for (const [index, { content, page }] of contentSections.entries()) { const section: Section = { - id: `${fileId}-section-${index}`, + id: `${fileId}-page-${page}-section-${index}`, content, category: category, sourcepage: getBlobNameFromFile(filename), @@ -73,24 +53,25 @@ export class DocumentProcessor { return sections; } - // TODO: use langchain splitters: https://js.langchain.com/docs/modules/data_connection/document_transformers/text_splitters/code_splitter - private splitText(filename: string, pages: ContentPage[]) { - const SENTENCE_ENDINGS = new Set(['.', '!', '?']); - const WORDS_BREAKS = new Set([',', ';', ':', ' ', '(', ')', '[', ']', '{', '}', '\t', '\n']); - + private splitPages(filename: string, pages: ContentPage[]): ContentSection[] { this.logger.debug(`Splitting '${filename}' into sections`); - const findPage = (pages: ContentPage[], offset: number) => - pages.findIndex((page, index, array) => { - const nextPage = array[index + 1]; - return !nextPage || (offset >= page.offset && offset < nextPage.offset); - }); + const findPage = (offset: number): number => { + const pageCount = pages.length; + for (let i = 0; i < pageCount - 1; i++) { + if (offset >= pages[i].offset && offset < pages[i + 1].offset) { + return pages[i].page; + } + } + return pages[pageCount - 1].page; + }; const contentSections: ContentSection[] = []; - const allText = pages.map((p) => p.content).join(''); + const allText = pages.map((page) => page.content).join(''); const length = allText.length; let start = 0; let end = length; + while (start + SECTION_OVERLAP < length) { let lastWord = -1; end = start + MAX_SECTION_LENGTH; @@ -104,7 +85,7 @@ export class DocumentProcessor { end - start - MAX_SECTION_LENGTH < SENTENCE_SEARCH_LIMIT && !SENTENCE_ENDINGS.has(allText[end]) ) { - if (WORDS_BREAKS.has(allText[end])) { + if (WORD_BREAKS.has(allText[end])) { lastWord = end; } end += 1; @@ -112,9 +93,9 @@ export class DocumentProcessor { if (end < length && !SENTENCE_ENDINGS.has(allText[end]) && lastWord > 0) { end = lastWord; // Fall back to at least keeping a whole word } - } - if (end < length) { - end += 1; + if (end < length) { + end += 1; + } } // Try to find the start of the sentence or at least a whole word boundary @@ -124,7 +105,7 @@ export class DocumentProcessor { start > end - MAX_SECTION_LENGTH - 2 * SENTENCE_SEARCH_LIMIT && !SENTENCE_ENDINGS.has(allText[start]) ) { - if (WORDS_BREAKS.has(allText[start])) { + if (WORD_BREAKS.has(allText[start])) { lastWord = start; } start -= 1; @@ -137,14 +118,14 @@ export class DocumentProcessor { } const sectionText = allText.slice(start, end); - contentSections.push({ content: sectionText, page: findPage(pages, start) }); + contentSections.push({ page: findPage(start), content: sectionText }); const lastTableStart = sectionText.lastIndexOf(' 2 * SENTENCE_SEARCH_LIMIT && lastTableStart > sectionText.lastIndexOf(' { + const pages: ContentPage[] = []; + const pdf = await pdfjs.getDocument(new Uint8Array(data)).promise; + let offset = 0; + + for (let i = 1; i <= pdf.numPages; i++) { + const page = await pdf.getPage(i); + const textContent = await page.getTextContent(); + let previousY = 0; + const text = textContent.items + .filter((item) => 'str' in item) + .map((item) => { + const textItem = item as TextItem; + const y = textItem.transform[5]; + let textContent = textItem.str; + if (y !== previousY && previousY !== 0) { + // If the Y coordinate changes, we're on a new line + textContent = '\n' + textContent; + } + previousY = y; + return textContent; + }) + .join(''); + + pages.push({ content: text + '\n', offset, page: i }); + offset += text.length; + } + return pages; +} diff --git a/packages/indexer/src/lib/index.ts b/packages/indexer/src/lib/index.ts index 580f1d59..7e3f5dd3 100644 --- a/packages/indexer/src/lib/index.ts +++ b/packages/indexer/src/lib/index.ts @@ -2,5 +2,6 @@ export * from './util/index.js'; export * from './cli.js'; export * from './blob-storage.js'; export * from './document-processor.js'; +export * from './document.js'; export * from './indexer.js'; export * from './model-limits.js'; diff --git a/packages/indexer/src/lib/indexer.ts b/packages/indexer/src/lib/indexer.ts index ffe7165e..af9f4354 100644 --- a/packages/indexer/src/lib/indexer.ts +++ b/packages/indexer/src/lib/indexer.ts @@ -4,9 +4,10 @@ import { encoding_for_model, type TiktokenModel } from '@dqbd/tiktoken'; import { type AzureClients } from '../plugins/azure.js'; import { type OpenAiService } from '../plugins/openai.js'; import { wait } from './util/index.js'; -import { DocumentProcessor, type Section } from './document-processor.js'; +import { DocumentProcessor } from './document-processor.js'; import { MODELS_SUPPORTED_BATCH_SIZE } from './model-limits.js'; import { BlobStorage } from './blob-storage.js'; +import { type Section } from './document.js'; export interface IndexFileOptions { useVectors?: boolean; diff --git a/packages/indexer/test.http b/packages/indexer/test.http index ec74e80e..2bd1c03d 100644 --- a/packages/indexer/test.http +++ b/packages/indexer/test.http @@ -20,7 +20,7 @@ DELETE {{api_host}}/indexes/test ### -# Index a file +# Index a text file POST {{api_host}}/indexes/test/files Accept: */* Content-Type: multipart/form-data; boundary=Boundary @@ -43,5 +43,27 @@ Content-Disposition: form-data; name="options" ### +# Index a pdf file +POST {{api_host}}/indexes/test/files +Accept: */* +Content-Type: multipart/form-data; boundary=Boundary + +--Boundary +Content-Disposition: form-data; name="file"; filename="test.pdf" +Content-Type: application/pdf + +< ../../data/support.pdf +--Boundary +Content-Disposition: form-data; name="options" + +{ + "category": "test-category", + "wait": true, + "useVectors": true +} +--Boundary-- + +### + # Delete a file DELETE {{api_host}}/indexes/test/files/sample.txt From 77af43d2393766b6fddc429e6d8c80fd287f02c6 Mon Sep 17 00:00:00 2001 From: sinedied Date: Mon, 11 Dec 2023 17:11:03 +0100 Subject: [PATCH 4/4] refactor(indexer): add format handler facilities --- .../indexer/src/lib/document-processor.ts | 28 ++++++++++++------- packages/indexer/src/lib/formats/index.ts | 1 + packages/indexer/src/lib/formats/text.ts | 6 ++++ 3 files changed, 25 insertions(+), 10 deletions(-) create mode 100644 packages/indexer/src/lib/formats/text.ts diff --git a/packages/indexer/src/lib/document-processor.ts b/packages/indexer/src/lib/document-processor.ts index be6fce46..f5ee7a25 100644 --- a/packages/indexer/src/lib/document-processor.ts +++ b/packages/indexer/src/lib/document-processor.ts @@ -1,7 +1,7 @@ import { type BaseLogger } from 'pino'; import { getBlobNameFromFile } from './blob-storage.js'; import { type ContentPage, type ContentSection, type Section } from './document.js'; -import { extractTextFromPdf } from './formats/index.js'; +import { extractText, extractTextFromPdf } from './formats/index.js'; const SENTENCE_ENDINGS = new Set(['.', '!', '?']); const WORD_BREAKS = new Set([',', ';', ':', ' ', '(', ')', '[', ']', '{', '}', '\t', '\n']); @@ -10,7 +10,13 @@ const SENTENCE_SEARCH_LIMIT = 100; const SECTION_OVERLAP = 100; export class DocumentProcessor { - constructor(private logger: BaseLogger) {} + formatHandlers = new Map Promise>(); + + constructor(private logger: BaseLogger) { + this.registerFormatHandler('text/plain', extractText); + this.registerFormatHandler('text/markdown', extractText); + this.registerFormatHandler('application/pdf', extractTextFromPdf); + } async createDocumentFromFile(filename: string, data: Buffer, type: string, category: string) { const pages = await this.extractText(data, type); @@ -19,19 +25,21 @@ export class DocumentProcessor { return { filename, type, category, sections }; } + private registerFormatHandler(type: string, handler: (data: Buffer) => Promise) { + this.formatHandlers.set(type, handler); + } + private async extractText(data: Buffer, type: string): Promise { const pages: ContentPage[] = []; - if (type === 'text/plain' || type === 'text/markdown') { - const text = data.toString('utf8'); - pages.push({ content: text, offset: 0, page: 0 }); - } else if (type === 'application/pdf') { - const pdfContent = await extractTextFromPdf(data); - pages.push(...pdfContent); - } else { - // You can add support for other file types here + + const formatHandler = this.formatHandlers.get(type); + if (!formatHandler) { throw new Error(`Unsupported file type: ${type}`); } + const contentPages = await formatHandler(data); + pages.push(...contentPages); + return pages; } diff --git a/packages/indexer/src/lib/formats/index.ts b/packages/indexer/src/lib/formats/index.ts index ce20a117..9015d7f3 100644 --- a/packages/indexer/src/lib/formats/index.ts +++ b/packages/indexer/src/lib/formats/index.ts @@ -1 +1,2 @@ export * from './pdf.js'; +export * from './text.js'; diff --git a/packages/indexer/src/lib/formats/text.ts b/packages/indexer/src/lib/formats/text.ts new file mode 100644 index 00000000..81298559 --- /dev/null +++ b/packages/indexer/src/lib/formats/text.ts @@ -0,0 +1,6 @@ +import { type ContentPage } from '../document.js'; + +export async function extractText(data: Buffer): Promise { + const text = data.toString('utf8'); + return [{ content: text, offset: 0, page: 0 }]; +}