Spaces:
Runtime error
Runtime error
Removing chat with document feature
Browse files- README.md +2 -22
- requirements.txt +0 -1
- src/services/docling_chat.py +0 -29
- src/ui/ui.py +35 -62
README.md
CHANGED
|
@@ -137,13 +137,6 @@ build:
|
|
| 137 |
6. Navigate through pages using the navigation buttons for multi-page documents
|
| 138 |
7. Download the converted content in your selected format
|
| 139 |
|
| 140 |
-
### Document Chat
|
| 141 |
-
1. After converting a document, switch to the "Chat with Document" tab
|
| 142 |
-
2. Type your questions about the document content
|
| 143 |
-
3. The AI will analyze the document and provide context-aware responses
|
| 144 |
-
4. Use the conversation history to track your Q&A session
|
| 145 |
-
5. Click "Clear" to start a new conversation
|
| 146 |
-
|
| 147 |
## Troubleshooting
|
| 148 |
|
| 149 |
### OCR Issues
|
|
@@ -201,20 +194,7 @@ markit/
|
|
| 201 |
β β βββ __init__.py # Package initialization
|
| 202 |
β β βββ ui.py # Gradio UI implementation
|
| 203 |
β βββ services/ # External services
|
| 204 |
-
β
|
| 205 |
-
β βββ docling_chat.py # Chat service
|
| 206 |
βββ tests/ # Tests
|
| 207 |
βββ __init__.py # Package initialization
|
| 208 |
-
```
|
| 209 |
-
|
| 210 |
-
### Adding a New Parser
|
| 211 |
-
1. Create a new parser class implementing the `DocumentParser` interface
|
| 212 |
-
2. Register the parser with the `ParserRegistry`
|
| 213 |
-
3. Implement the required methods: `get_name()`, `get_supported_ocr_methods()`, and `parse()`
|
| 214 |
-
4. Add your parser to the imports in `src/parsers/__init__.py`
|
| 215 |
-
|
| 216 |
-
## Contributing
|
| 217 |
-
Contributions are welcome! Please feel free to submit a Pull Request.
|
| 218 |
-
|
| 219 |
-
## License
|
| 220 |
-
This project is open source and available under the MIT License.
|
|
|
|
| 137 |
6. Navigate through pages using the navigation buttons for multi-page documents
|
| 138 |
7. Download the converted content in your selected format
|
| 139 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 140 |
## Troubleshooting
|
| 141 |
|
| 142 |
### OCR Issues
|
|
|
|
| 194 |
β β βββ __init__.py # Package initialization
|
| 195 |
β β βββ ui.py # Gradio UI implementation
|
| 196 |
β βββ services/ # External services
|
| 197 |
+
β βββ __init__.py # Package initialization
|
|
|
|
| 198 |
βββ tests/ # Tests
|
| 199 |
βββ __init__.py # Package initialization
|
| 200 |
+
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
requirements.txt
CHANGED
|
@@ -4,7 +4,6 @@ grpcio-status==1.70.0
|
|
| 4 |
markdown==3.7
|
| 5 |
marker-pdf==1.3.5
|
| 6 |
multiprocess==0.70.16
|
| 7 |
-
openai==1.61.1
|
| 8 |
pipdeptree==2.25.0
|
| 9 |
pytesseract==0.3.13
|
| 10 |
semchunk==2.2.2
|
|
|
|
| 4 |
markdown==3.7
|
| 5 |
marker-pdf==1.3.5
|
| 6 |
multiprocess==0.70.16
|
|
|
|
| 7 |
pipdeptree==2.25.0
|
| 8 |
pytesseract==0.3.13
|
| 9 |
semchunk==2.2.2
|
src/services/docling_chat.py
DELETED
|
@@ -1,29 +0,0 @@
|
|
| 1 |
-
import openai
|
| 2 |
-
import os
|
| 3 |
-
|
| 4 |
-
# Load API key from environment variable
|
| 5 |
-
openai.api_key = os.getenv("OPENAI_API_KEY")
|
| 6 |
-
|
| 7 |
-
# Check if API key is available and print a message if not
|
| 8 |
-
if not openai.api_key:
|
| 9 |
-
print("Warning: OPENAI_API_KEY environment variable not found. Chat functionality may not work.")
|
| 10 |
-
|
| 11 |
-
def chat_with_document(message, history, document_text_state):
|
| 12 |
-
history = history or []
|
| 13 |
-
history.append({"role": "user", "content": message})
|
| 14 |
-
|
| 15 |
-
context = f"Document: {document_text_state}\n\nUser: {message}"
|
| 16 |
-
|
| 17 |
-
# Add error handling for API calls
|
| 18 |
-
try:
|
| 19 |
-
response = openai.chat.completions.create(
|
| 20 |
-
model="gpt-4o-2024-08-06",
|
| 21 |
-
messages=[{"role": "system", "content": context}] + history
|
| 22 |
-
)
|
| 23 |
-
reply = response.choices[0].message.content
|
| 24 |
-
except Exception as e:
|
| 25 |
-
reply = f"Error: Could not generate response. Please check your OpenAI API key. Details: {str(e)}"
|
| 26 |
-
print(f"OpenAI API error: {str(e)}")
|
| 27 |
-
|
| 28 |
-
history.append({"role": "assistant", "content": reply})
|
| 29 |
-
return history, history
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
src/ui/ui.py
CHANGED
|
@@ -5,7 +5,6 @@ import time
|
|
| 5 |
import logging
|
| 6 |
from pathlib import Path
|
| 7 |
from src.core.converter import convert_file, set_cancellation_flag, is_conversion_in_progress
|
| 8 |
-
from src.services.docling_chat import chat_with_document
|
| 9 |
from src.parsers.parser_registry import ParserRegistry
|
| 10 |
|
| 11 |
# Configure logging
|
|
@@ -169,52 +168,44 @@ def create_ui():
|
|
| 169 |
# State to store the output format (fixed to Markdown)
|
| 170 |
output_format_state = gr.State("Markdown")
|
| 171 |
|
| 172 |
-
|
| 173 |
-
|
| 174 |
-
|
| 175 |
-
|
| 176 |
-
|
| 177 |
-
|
| 178 |
-
|
| 179 |
-
|
| 180 |
-
parser_names = ParserRegistry.get_parser_names()
|
| 181 |
-
default_parser = parser_names[0] if parser_names else "PyPdfium"
|
| 182 |
-
|
| 183 |
-
provider_dropdown = gr.Dropdown(
|
| 184 |
-
label="Provider",
|
| 185 |
-
choices=parser_names,
|
| 186 |
-
value=default_parser,
|
| 187 |
-
interactive=True
|
| 188 |
-
)
|
| 189 |
-
with gr.Column(scale=1):
|
| 190 |
-
default_ocr_options = ParserRegistry.get_ocr_options(default_parser)
|
| 191 |
-
default_ocr = default_ocr_options[0] if default_ocr_options else "No OCR"
|
| 192 |
-
|
| 193 |
-
ocr_dropdown = gr.Dropdown(
|
| 194 |
-
label="OCR Options",
|
| 195 |
-
choices=default_ocr_options,
|
| 196 |
-
value=default_ocr,
|
| 197 |
-
interactive=True
|
| 198 |
-
)
|
| 199 |
|
| 200 |
-
|
| 201 |
-
|
| 202 |
-
|
| 203 |
-
|
|
|
|
| 204 |
)
|
|
|
|
|
|
|
|
|
|
| 205 |
|
| 206 |
-
|
| 207 |
-
|
| 208 |
-
|
| 209 |
-
|
| 210 |
-
|
| 211 |
-
|
| 212 |
-
|
| 213 |
-
|
| 214 |
-
|
| 215 |
-
|
| 216 |
-
|
| 217 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 218 |
|
| 219 |
# Event handlers
|
| 220 |
provider_dropdown.change(
|
|
@@ -269,24 +260,6 @@ def create_ui():
|
|
| 269 |
queue=False # Execute immediately
|
| 270 |
)
|
| 271 |
|
| 272 |
-
file_display.change(
|
| 273 |
-
lambda text: text,
|
| 274 |
-
inputs=[file_display],
|
| 275 |
-
outputs=[document_text_state]
|
| 276 |
-
)
|
| 277 |
-
|
| 278 |
-
text_input.submit(
|
| 279 |
-
fn=chat_with_document,
|
| 280 |
-
inputs=[text_input, chatbot, document_text_state],
|
| 281 |
-
outputs=[chatbot, chatbot]
|
| 282 |
-
)
|
| 283 |
-
|
| 284 |
-
clear_btn.click(
|
| 285 |
-
lambda: ([], []),
|
| 286 |
-
None,
|
| 287 |
-
[chatbot, chatbot]
|
| 288 |
-
)
|
| 289 |
-
|
| 290 |
return demo
|
| 291 |
|
| 292 |
|
|
|
|
| 5 |
import logging
|
| 6 |
from pathlib import Path
|
| 7 |
from src.core.converter import convert_file, set_cancellation_flag, is_conversion_in_progress
|
|
|
|
| 8 |
from src.parsers.parser_registry import ParserRegistry
|
| 9 |
|
| 10 |
# Configure logging
|
|
|
|
| 168 |
# State to store the output format (fixed to Markdown)
|
| 169 |
output_format_state = gr.State("Markdown")
|
| 170 |
|
| 171 |
+
# File input first
|
| 172 |
+
file_input = gr.File(label="Upload PDF", type="filepath")
|
| 173 |
+
|
| 174 |
+
# Provider and OCR options below the file input
|
| 175 |
+
with gr.Row(elem_classes=["provider-options-row"]):
|
| 176 |
+
with gr.Column(scale=1):
|
| 177 |
+
parser_names = ParserRegistry.get_parser_names()
|
| 178 |
+
default_parser = parser_names[0] if parser_names else "PyPdfium"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 179 |
|
| 180 |
+
provider_dropdown = gr.Dropdown(
|
| 181 |
+
label="Provider",
|
| 182 |
+
choices=parser_names,
|
| 183 |
+
value=default_parser,
|
| 184 |
+
interactive=True
|
| 185 |
)
|
| 186 |
+
with gr.Column(scale=1):
|
| 187 |
+
default_ocr_options = ParserRegistry.get_ocr_options(default_parser)
|
| 188 |
+
default_ocr = default_ocr_options[0] if default_ocr_options else "No OCR"
|
| 189 |
|
| 190 |
+
ocr_dropdown = gr.Dropdown(
|
| 191 |
+
label="OCR Options",
|
| 192 |
+
choices=default_ocr_options,
|
| 193 |
+
value=default_ocr,
|
| 194 |
+
interactive=True
|
| 195 |
+
)
|
| 196 |
+
|
| 197 |
+
# Simple output container with just one scrollbar
|
| 198 |
+
file_display = gr.HTML(
|
| 199 |
+
value="<div class='output-container'></div>",
|
| 200 |
+
label="Converted Content"
|
| 201 |
+
)
|
| 202 |
+
|
| 203 |
+
file_download = gr.File(label="Download File")
|
| 204 |
+
|
| 205 |
+
# Processing controls row
|
| 206 |
+
with gr.Row(elem_classes=["processing-controls"]):
|
| 207 |
+
convert_button = gr.Button("Convert", variant="primary")
|
| 208 |
+
cancel_button = gr.Button("Cancel", variant="stop", visible=False)
|
| 209 |
|
| 210 |
# Event handlers
|
| 211 |
provider_dropdown.change(
|
|
|
|
| 260 |
queue=False # Execute immediately
|
| 261 |
)
|
| 262 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 263 |
return demo
|
| 264 |
|
| 265 |
|