From 1b7fb0c64b370121a385cbd1917869d3f7e93933 Mon Sep 17 00:00:00 2001 From: boladeE Date: Mon, 28 Apr 2025 22:00:47 +0100 Subject: [PATCH] Using tika to support multiple file formats --- app.log | 32 +++++++++++++++++++++++++++ data/9.confidentiality agreement.pdf | Bin 0 -> 23143 bytes requirements.txt | 3 ++- src/file_reader.py | 26 ++++++++++++++++++++++ src/services/config.py | 2 +- src/services/document_processor.py | 14 +++++++----- 6 files changed, 69 insertions(+), 8 deletions(-) create mode 100644 data/9.confidentiality agreement.pdf create mode 100644 src/file_reader.py diff --git a/app.log b/app.log index 1089802..c0e0073 100644 --- a/app.log +++ b/app.log @@ -862,3 +862,35 @@ sqlite3.OperationalError: table analysis has no column named issues_and_recommen 2025-04-22 11:55:33,740 - root - INFO - Stored embedding for document 9dc21524-8c93-427b-a6cc-04b7585a9545 2025-04-22 11:56:27,580 - root - INFO - Document 9dc21524-8c93-427b-a6cc-04b7585a9545 processed successfully 2025-04-22 11:56:27,588 - root - INFO - Document 9dc21524-8c93-427b-a6cc-04b7585a9545 processed successfully +2025-04-23 22:03:47,212 - root - INFO - Processing upload for document ID: 65dd5884-72ef-4eb4-bb03-b9fad0886da4 +2025-04-23 22:03:47,215 - root - INFO - File saved to data/uploads/65dd5884-72ef-4eb4-bb03-b9fad0886da4_3.Bill of Quantities.docx +2025-04-23 22:03:47,260 - root - INFO - Document 65dd5884-72ef-4eb4-bb03-b9fad0886da4 upload initiated successfully +2025-04-23 22:03:47,905 - root - INFO - Processing document 65dd5884-72ef-4eb4-bb03-b9fad0886da4 with content length: 2057 +2025-04-23 22:03:48,399 - httpx - INFO - HTTP Request: POST https://api.cohere.com/v1/embed "HTTP/1.1 200 OK" +2025-04-23 22:03:49,194 - root - INFO - Stored embedding for document 65dd5884-72ef-4eb4-bb03-b9fad0886da4 in namespace '' +2025-04-23 22:04:54,737 - root - INFO - Document 65dd5884-72ef-4eb4-bb03-b9fad0886da4 processed successfully +2025-04-23 22:08:00,451 - root - INFO - Processing upload for document ID: 74bcb446-dccb-4707-afb3-dbd45abba9a2 +2025-04-23 22:08:00,455 - root - INFO - File saved to data/uploads/74bcb446-dccb-4707-afb3-dbd45abba9a2_8.form of tender.docx +2025-04-23 22:08:00,522 - root - INFO - Document 74bcb446-dccb-4707-afb3-dbd45abba9a2 upload initiated successfully +2025-04-23 22:08:01,027 - root - INFO - Processing document 74bcb446-dccb-4707-afb3-dbd45abba9a2 with content length: 523 +2025-04-23 22:08:01,262 - httpx - INFO - HTTP Request: POST https://api.cohere.com/v1/embed "HTTP/1.1 200 OK" +2025-04-23 22:08:01,797 - root - INFO - Stored embedding for document 74bcb446-dccb-4707-afb3-dbd45abba9a2 in namespace 'gcp-starter' +2025-04-23 22:08:46,050 - root - INFO - Document 74bcb446-dccb-4707-afb3-dbd45abba9a2 processed successfully +2025-04-28 21:04:14,200 - root - INFO - Processing upload for document ID: de1e735c-15a7-4d03-9fbf-92e8acc822fd +2025-04-28 21:04:14,200 - root - INFO - File saved to data/uploads/de1e735c-15a7-4d03-9fbf-92e8acc822fd_2.Tender Specifications.docx +2025-04-28 21:04:14,215 - root - INFO - Document de1e735c-15a7-4d03-9fbf-92e8acc822fd upload initiated successfully +2025-04-28 21:04:16,258 - tika.tika - INFO - Retrieving http://search.maven.org/remotecontent?filepath=org/apache/tika/tika-server-standard/3.1.0/tika-server-standard-3.1.0.jar to C:\Users\babaw\AppData\Local\Temp\tika-server.jar. +2025-04-28 21:04:52,162 - tika.tika - INFO - Retrieving http://search.maven.org/remotecontent?filepath=org/apache/tika/tika-server-standard/3.1.0/tika-server-standard-3.1.0.jar.md5 to C:\Users\babaw\AppData\Local\Temp\tika-server.jar.md5. +2025-04-28 21:04:53,338 - tika.tika - WARNING - Failed to see startup log message; retrying... +2025-04-28 21:04:58,353 - tika.tika - WARNING - Failed to see startup log message; retrying... +2025-04-28 21:05:03,354 - tika.tika - WARNING - Failed to see startup log message; retrying... +2025-04-28 21:05:08,367 - tika.tika - ERROR - Tika startup log message not received after 3 tries. +2025-04-28 21:05:08,367 - tika.tika - ERROR - Failed to receive startup confirmation from startServer. +2025-04-28 21:05:08,367 - root - ERROR - Error parsing document with Tika: Unable to start Tika server. +2025-04-28 21:05:08,369 - root - INFO - Processing document de1e735c-15a7-4d03-9fbf-92e8acc822fd with content length: 0 +2025-04-28 21:05:19,572 - root - ERROR - Error processing document de1e735c-15a7-4d03-9fbf-92e8acc822fd: [Errno 11001] getaddrinfo failed +2025-04-28 21:53:58,710 - root - INFO - Processing upload for document ID: c7b13f74-699b-4735-b9bc-a3c2e66545a6 +2025-04-28 21:53:58,715 - root - INFO - File saved to data/uploads/c7b13f74-699b-4735-b9bc-a3c2e66545a6_9.confidentiality agreement.pdf +2025-04-28 21:53:58,731 - root - INFO - Document c7b13f74-699b-4735-b9bc-a3c2e66545a6 upload initiated successfully +2025-04-28 21:53:59,507 - root - INFO - Processing document c7b13f74-699b-4735-b9bc-a3c2e66545a6 with content length: 217 +2025-04-28 21:54:10,920 - root - ERROR - Error processing document c7b13f74-699b-4735-b9bc-a3c2e66545a6: [Errno 11001] getaddrinfo failed diff --git a/data/9.confidentiality agreement.pdf b/data/9.confidentiality agreement.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f59dfa0115eb54ff0a331505f94170d7d6e53638 GIT binary patch literal 23143 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