academic-refchecker 1.2.65__tar.gz → 1.2.67__tar.gz

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.
Files changed (75) hide show
  1. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/MANIFEST.in +12 -0
  2. {academic_refchecker-1.2.65/src/academic_refchecker.egg-info → academic_refchecker-1.2.67}/PKG-INFO +72 -7
  3. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/README.md +61 -6
  4. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67/academic_refchecker.egg-info}/PKG-INFO +72 -7
  5. {academic_refchecker-1.2.65/src → academic_refchecker-1.2.67}/academic_refchecker.egg-info/SOURCES.txt +21 -6
  6. {academic_refchecker-1.2.65/src → academic_refchecker-1.2.67}/academic_refchecker.egg-info/entry_points.txt +1 -0
  7. {academic_refchecker-1.2.65/src → academic_refchecker-1.2.67}/academic_refchecker.egg-info/requires.txt +11 -0
  8. {academic_refchecker-1.2.65/src → academic_refchecker-1.2.67}/academic_refchecker.egg-info/top_level.txt +1 -0
  9. academic_refchecker-1.2.67/backend/__init__.py +21 -0
  10. academic_refchecker-1.2.67/backend/__main__.py +11 -0
  11. academic_refchecker-1.2.67/backend/cli.py +64 -0
  12. academic_refchecker-1.2.67/backend/concurrency.py +100 -0
  13. academic_refchecker-1.2.67/backend/database.py +711 -0
  14. academic_refchecker-1.2.67/backend/main.py +1367 -0
  15. academic_refchecker-1.2.67/backend/models.py +99 -0
  16. academic_refchecker-1.2.67/backend/refchecker_wrapper.py +1126 -0
  17. academic_refchecker-1.2.67/backend/static/assets/index-2P6L_39v.css +1 -0
  18. academic_refchecker-1.2.67/backend/static/assets/index-hk21nqxR.js +25 -0
  19. academic_refchecker-1.2.67/backend/static/favicon.svg +6 -0
  20. academic_refchecker-1.2.67/backend/static/index.html +15 -0
  21. academic_refchecker-1.2.67/backend/static/vite.svg +1 -0
  22. academic_refchecker-1.2.67/backend/thumbnail.py +517 -0
  23. academic_refchecker-1.2.67/backend/websocket_manager.py +104 -0
  24. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/pyproject.toml +15 -2
  25. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/requirements.txt +10 -0
  26. academic_refchecker-1.2.67/src/refchecker/__version__.py +5 -0
  27. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/src/refchecker/checkers/crossref.py +15 -6
  28. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/src/refchecker/checkers/enhanced_hybrid_checker.py +18 -4
  29. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/src/refchecker/checkers/local_semantic_scholar.py +2 -2
  30. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/src/refchecker/checkers/openalex.py +15 -6
  31. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/src/refchecker/checkers/semantic_scholar.py +15 -6
  32. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/src/refchecker/core/refchecker.py +17 -6
  33. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/src/refchecker/utils/__init__.py +2 -1
  34. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/src/refchecker/utils/arxiv_utils.py +18 -60
  35. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/src/refchecker/utils/doi_utils.py +32 -1
  36. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/src/refchecker/utils/error_utils.py +20 -9
  37. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/src/refchecker/utils/text_utils.py +143 -27
  38. academic_refchecker-1.2.65/src/refchecker/__version__.py +0 -5
  39. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/LICENSE +0 -0
  40. {academic_refchecker-1.2.65/src → academic_refchecker-1.2.67}/academic_refchecker.egg-info/dependency_links.txt +0 -0
  41. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/scripts/download_db.py +0 -0
  42. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/scripts/run_tests.py +0 -0
  43. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/scripts/start_vllm_server.py +0 -0
  44. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/setup.cfg +0 -0
  45. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/src/refchecker/__init__.py +0 -0
  46. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/src/refchecker/__main__.py +0 -0
  47. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/src/refchecker/checkers/__init__.py +0 -0
  48. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/src/refchecker/checkers/github_checker.py +0 -0
  49. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/src/refchecker/checkers/openreview_checker.py +0 -0
  50. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/src/refchecker/checkers/pdf_paper_checker.py +0 -0
  51. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/src/refchecker/checkers/webpage_checker.py +0 -0
  52. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/src/refchecker/config/__init__.py +0 -0
  53. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/src/refchecker/config/logging.conf +0 -0
  54. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/src/refchecker/config/settings.py +0 -0
  55. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/src/refchecker/core/__init__.py +0 -0
  56. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/src/refchecker/core/db_connection_pool.py +0 -0
  57. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/src/refchecker/core/parallel_processor.py +0 -0
  58. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/src/refchecker/database/__init__.py +0 -0
  59. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/src/refchecker/database/download_semantic_scholar_db.py +0 -0
  60. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/src/refchecker/llm/__init__.py +0 -0
  61. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/src/refchecker/llm/base.py +0 -0
  62. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/src/refchecker/llm/providers.py +0 -0
  63. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/src/refchecker/scripts/__init__.py +0 -0
  64. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/src/refchecker/scripts/start_vllm_server.py +0 -0
  65. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/src/refchecker/services/__init__.py +0 -0
  66. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/src/refchecker/services/pdf_processor.py +0 -0
  67. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/src/refchecker/utils/author_utils.py +0 -0
  68. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/src/refchecker/utils/biblatex_parser.py +0 -0
  69. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/src/refchecker/utils/bibliography_utils.py +0 -0
  70. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/src/refchecker/utils/bibtex_parser.py +0 -0
  71. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/src/refchecker/utils/config_validator.py +0 -0
  72. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/src/refchecker/utils/db_utils.py +0 -0
  73. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/src/refchecker/utils/mock_objects.py +0 -0
  74. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/src/refchecker/utils/unicode_utils.py +0 -0
  75. {academic_refchecker-1.2.65 → academic_refchecker-1.2.67}/src/refchecker/utils/url_utils.py +0 -0
@@ -10,6 +10,12 @@ recursive-include config *.conf *.py
10
10
  # Include source code
11
11
  recursive-include src *.py
12
12
 
13
+ # Include backend code
14
+ recursive-include backend *.py
15
+
16
+ # Include web UI frontend (built assets)
17
+ recursive-include backend/static *
18
+
13
19
  # Include scripts
14
20
  recursive-include scripts *.py
15
21
 
@@ -36,3 +42,9 @@ prune .claude
36
42
  exclude .gitignore
37
43
  exclude Makefile
38
44
  exclude reference_errors.txt
45
+
46
+ # Exclude backend runtime files (databases, logs, uploads)
47
+ prune backend/uploads
48
+ exclude backend/*.db
49
+ exclude backend/*.log
50
+ exclude backend/.encryption_key
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: academic-refchecker
3
- Version: 1.2.65
3
+ Version: 1.2.67
4
4
  Summary: A comprehensive tool for validating reference accuracy in academic papers
5
5
  Author-email: Mark Russinovich <markrussinovich@hotmail.com>
6
6
  License-Expression: MIT
@@ -57,6 +57,16 @@ Provides-Extra: vllm
57
57
  Requires-Dist: vllm>=0.3.0; extra == "vllm"
58
58
  Requires-Dist: huggingface_hub>=0.17.0; extra == "vllm"
59
59
  Requires-Dist: torch>=2.0.0; extra == "vllm"
60
+ Provides-Extra: webui
61
+ Requires-Dist: fastapi>=0.100.0; extra == "webui"
62
+ Requires-Dist: uvicorn[standard]>=0.22.0; extra == "webui"
63
+ Requires-Dist: pydantic>=2.0.0; extra == "webui"
64
+ Requires-Dist: aiosqlite>=0.19.0; extra == "webui"
65
+ Requires-Dist: httpx>=0.24.0; extra == "webui"
66
+ Requires-Dist: cryptography>=42.0.0; extra == "webui"
67
+ Requires-Dist: pymupdf>=1.23.0; extra == "webui"
68
+ Requires-Dist: Pillow>=9.0.0; extra == "webui"
69
+ Requires-Dist: python-multipart>=0.0.6; extra == "webui"
60
70
  Dynamic: license-file
61
71
 
62
72
  # 📚 Academic Paper Reference Checker
@@ -176,9 +186,18 @@ Learn about RefChecker's design philosophy and development process in this detai
176
186
 
177
187
  RefChecker also includes a modern web interface with real-time progress updates, check history, and export options.
178
188
 
189
+ ### Prerequisites
190
+
191
+ - **Python 3.8+** with RefChecker installed (`pip install academic-refchecker[webui]`)
192
+ - **Node.js 18+** and npm
193
+
179
194
  ### Quick Start (Web UI)
180
195
 
181
196
  ```bash
197
+ # Install Python dependencies (if not already done)
198
+ pip install academic-refchecker[llm,webui]
199
+
200
+ # Install Node.js dependencies
182
201
  cd web-ui
183
202
  npm install # First time only
184
203
  npm start # Starts both backend and frontend
@@ -186,6 +205,20 @@ npm start # Starts both backend and frontend
186
205
 
187
206
  Then open **http://localhost:5173** in your browser.
188
207
 
208
+ ### Alternative: Start Servers Separately
209
+
210
+ **Terminal 1 - Backend:**
211
+ ```bash
212
+ refchecker-webui --port 8000
213
+ # Or: python -m uvicorn backend.main:app --port 8000
214
+ ```
215
+
216
+ **Terminal 2 - Frontend:**
217
+ ```bash
218
+ cd web-ui
219
+ npm run dev
220
+ ```
221
+
189
222
  ### Features
190
223
 
191
224
  - ✨ Real-time validation with live progress updates
@@ -284,24 +317,33 @@ You can debug vllm server issues by running refchecker with the `--debug` flag.
284
317
 
285
318
  ## 📦 Installation
286
319
 
320
+ ### Prerequisites
321
+
322
+ - **Python 3.8+** (3.10+ recommended)
323
+ - **Node.js 18+** and npm (only required for Web UI)
324
+
287
325
  ### Option 1: Install from PyPI (Recommended)
288
326
 
289
327
  For the latest stable release with all features:
290
328
 
291
329
  ```bash
292
- pip install academic-refchecker[llm,dev,optional]
330
+ pip install academic-refchecker[llm,webui]
293
331
  ```
294
332
 
295
333
  This installs RefChecker with:
296
334
  - **llm**: Support for OpenAI, Anthropic, Google, Azure, and vLLM providers
297
- - **dev**: Development tools (pytest, black, flake8, mypy)
298
- - **optional**: Enhanced features (lxml, selenium, pikepdf, nltk, scikit-learn)
335
+ - **webui**: Web interface dependencies (FastAPI, uvicorn, etc.)
299
336
 
300
- For a minimal installation:
337
+ For a minimal installation (CLI only, no LLM or Web UI):
301
338
  ```bash
302
339
  pip install academic-refchecker
303
340
  ```
304
341
 
342
+ Other optional extras:
343
+ - **dev**: Development tools (pytest, black, flake8, mypy)
344
+ - **optional**: Enhanced features (lxml, selenium, pikepdf, nltk, scikit-learn)
345
+ - **vllm**: Local model inference with vLLM
346
+
305
347
  ### Option 2: Install from Source
306
348
 
307
349
  #### 1. Clone the Repository
@@ -311,13 +353,27 @@ git clone https://github.com/markrussinovich/refchecker.git
311
353
  cd refchecker
312
354
  ```
313
355
 
314
- #### 2. Install Dependencies
356
+ #### 2. Create and Activate Virtual Environment (Recommended)
357
+
358
+ ```bash
359
+ python -m venv .venv
360
+ # On Windows:
361
+ .venv\Scripts\activate
362
+ # On macOS/Linux:
363
+ source .venv/bin/activate
364
+ ```
365
+
366
+ #### 3. Install Dependencies
315
367
 
316
368
  ```bash
369
+ # Install all dependencies including LLM and Web UI support
370
+ pip install -e ".[llm,webui]"
371
+
372
+ # Or install from requirements.txt
317
373
  pip install -r requirements.txt
318
374
  ```
319
375
 
320
- #### 3. (Optional) Install Additional Dependencies
376
+ #### 4. (Optional) Install Additional Dependencies
321
377
 
322
378
  For enhanced performance and LLM support, you can install optional dependencies:
323
379
 
@@ -337,6 +393,15 @@ pip install selenium
337
393
  pip install pikepdf
338
394
  ```
339
395
 
396
+ ### Web UI Installation
397
+
398
+ The Web UI requires Node.js 18+ in addition to the Python dependencies:
399
+
400
+ ```bash
401
+ cd web-ui
402
+ npm install
403
+ ```
404
+
340
405
  ## 📖 Usage
341
406
 
342
407
  Check papers in various formats and online locations:
@@ -115,9 +115,18 @@ Learn about RefChecker's design philosophy and development process in this detai
115
115
 
116
116
  RefChecker also includes a modern web interface with real-time progress updates, check history, and export options.
117
117
 
118
+ ### Prerequisites
119
+
120
+ - **Python 3.8+** with RefChecker installed (`pip install academic-refchecker[webui]`)
121
+ - **Node.js 18+** and npm
122
+
118
123
  ### Quick Start (Web UI)
119
124
 
120
125
  ```bash
126
+ # Install Python dependencies (if not already done)
127
+ pip install academic-refchecker[llm,webui]
128
+
129
+ # Install Node.js dependencies
121
130
  cd web-ui
122
131
  npm install # First time only
123
132
  npm start # Starts both backend and frontend
@@ -125,6 +134,20 @@ npm start # Starts both backend and frontend
125
134
 
126
135
  Then open **http://localhost:5173** in your browser.
127
136
 
137
+ ### Alternative: Start Servers Separately
138
+
139
+ **Terminal 1 - Backend:**
140
+ ```bash
141
+ refchecker-webui --port 8000
142
+ # Or: python -m uvicorn backend.main:app --port 8000
143
+ ```
144
+
145
+ **Terminal 2 - Frontend:**
146
+ ```bash
147
+ cd web-ui
148
+ npm run dev
149
+ ```
150
+
128
151
  ### Features
129
152
 
130
153
  - ✨ Real-time validation with live progress updates
@@ -223,24 +246,33 @@ You can debug vllm server issues by running refchecker with the `--debug` flag.
223
246
 
224
247
  ## 📦 Installation
225
248
 
249
+ ### Prerequisites
250
+
251
+ - **Python 3.8+** (3.10+ recommended)
252
+ - **Node.js 18+** and npm (only required for Web UI)
253
+
226
254
  ### Option 1: Install from PyPI (Recommended)
227
255
 
228
256
  For the latest stable release with all features:
229
257
 
230
258
  ```bash
231
- pip install academic-refchecker[llm,dev,optional]
259
+ pip install academic-refchecker[llm,webui]
232
260
  ```
233
261
 
234
262
  This installs RefChecker with:
235
263
  - **llm**: Support for OpenAI, Anthropic, Google, Azure, and vLLM providers
236
- - **dev**: Development tools (pytest, black, flake8, mypy)
237
- - **optional**: Enhanced features (lxml, selenium, pikepdf, nltk, scikit-learn)
264
+ - **webui**: Web interface dependencies (FastAPI, uvicorn, etc.)
238
265
 
239
- For a minimal installation:
266
+ For a minimal installation (CLI only, no LLM or Web UI):
240
267
  ```bash
241
268
  pip install academic-refchecker
242
269
  ```
243
270
 
271
+ Other optional extras:
272
+ - **dev**: Development tools (pytest, black, flake8, mypy)
273
+ - **optional**: Enhanced features (lxml, selenium, pikepdf, nltk, scikit-learn)
274
+ - **vllm**: Local model inference with vLLM
275
+
244
276
  ### Option 2: Install from Source
245
277
 
246
278
  #### 1. Clone the Repository
@@ -250,13 +282,27 @@ git clone https://github.com/markrussinovich/refchecker.git
250
282
  cd refchecker
251
283
  ```
252
284
 
253
- #### 2. Install Dependencies
285
+ #### 2. Create and Activate Virtual Environment (Recommended)
286
+
287
+ ```bash
288
+ python -m venv .venv
289
+ # On Windows:
290
+ .venv\Scripts\activate
291
+ # On macOS/Linux:
292
+ source .venv/bin/activate
293
+ ```
294
+
295
+ #### 3. Install Dependencies
254
296
 
255
297
  ```bash
298
+ # Install all dependencies including LLM and Web UI support
299
+ pip install -e ".[llm,webui]"
300
+
301
+ # Or install from requirements.txt
256
302
  pip install -r requirements.txt
257
303
  ```
258
304
 
259
- #### 3. (Optional) Install Additional Dependencies
305
+ #### 4. (Optional) Install Additional Dependencies
260
306
 
261
307
  For enhanced performance and LLM support, you can install optional dependencies:
262
308
 
@@ -276,6 +322,15 @@ pip install selenium
276
322
  pip install pikepdf
277
323
  ```
278
324
 
325
+ ### Web UI Installation
326
+
327
+ The Web UI requires Node.js 18+ in addition to the Python dependencies:
328
+
329
+ ```bash
330
+ cd web-ui
331
+ npm install
332
+ ```
333
+
279
334
  ## 📖 Usage
280
335
 
281
336
  Check papers in various formats and online locations:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: academic-refchecker
3
- Version: 1.2.65
3
+ Version: 1.2.67
4
4
  Summary: A comprehensive tool for validating reference accuracy in academic papers
5
5
  Author-email: Mark Russinovich <markrussinovich@hotmail.com>
6
6
  License-Expression: MIT
@@ -57,6 +57,16 @@ Provides-Extra: vllm
57
57
  Requires-Dist: vllm>=0.3.0; extra == "vllm"
58
58
  Requires-Dist: huggingface_hub>=0.17.0; extra == "vllm"
59
59
  Requires-Dist: torch>=2.0.0; extra == "vllm"
60
+ Provides-Extra: webui
61
+ Requires-Dist: fastapi>=0.100.0; extra == "webui"
62
+ Requires-Dist: uvicorn[standard]>=0.22.0; extra == "webui"
63
+ Requires-Dist: pydantic>=2.0.0; extra == "webui"
64
+ Requires-Dist: aiosqlite>=0.19.0; extra == "webui"
65
+ Requires-Dist: httpx>=0.24.0; extra == "webui"
66
+ Requires-Dist: cryptography>=42.0.0; extra == "webui"
67
+ Requires-Dist: pymupdf>=1.23.0; extra == "webui"
68
+ Requires-Dist: Pillow>=9.0.0; extra == "webui"
69
+ Requires-Dist: python-multipart>=0.0.6; extra == "webui"
60
70
  Dynamic: license-file
61
71
 
62
72
  # 📚 Academic Paper Reference Checker
@@ -176,9 +186,18 @@ Learn about RefChecker's design philosophy and development process in this detai
176
186
 
177
187
  RefChecker also includes a modern web interface with real-time progress updates, check history, and export options.
178
188
 
189
+ ### Prerequisites
190
+
191
+ - **Python 3.8+** with RefChecker installed (`pip install academic-refchecker[webui]`)
192
+ - **Node.js 18+** and npm
193
+
179
194
  ### Quick Start (Web UI)
180
195
 
181
196
  ```bash
197
+ # Install Python dependencies (if not already done)
198
+ pip install academic-refchecker[llm,webui]
199
+
200
+ # Install Node.js dependencies
182
201
  cd web-ui
183
202
  npm install # First time only
184
203
  npm start # Starts both backend and frontend
@@ -186,6 +205,20 @@ npm start # Starts both backend and frontend
186
205
 
187
206
  Then open **http://localhost:5173** in your browser.
188
207
 
208
+ ### Alternative: Start Servers Separately
209
+
210
+ **Terminal 1 - Backend:**
211
+ ```bash
212
+ refchecker-webui --port 8000
213
+ # Or: python -m uvicorn backend.main:app --port 8000
214
+ ```
215
+
216
+ **Terminal 2 - Frontend:**
217
+ ```bash
218
+ cd web-ui
219
+ npm run dev
220
+ ```
221
+
189
222
  ### Features
190
223
 
191
224
  - ✨ Real-time validation with live progress updates
@@ -284,24 +317,33 @@ You can debug vllm server issues by running refchecker with the `--debug` flag.
284
317
 
285
318
  ## 📦 Installation
286
319
 
320
+ ### Prerequisites
321
+
322
+ - **Python 3.8+** (3.10+ recommended)
323
+ - **Node.js 18+** and npm (only required for Web UI)
324
+
287
325
  ### Option 1: Install from PyPI (Recommended)
288
326
 
289
327
  For the latest stable release with all features:
290
328
 
291
329
  ```bash
292
- pip install academic-refchecker[llm,dev,optional]
330
+ pip install academic-refchecker[llm,webui]
293
331
  ```
294
332
 
295
333
  This installs RefChecker with:
296
334
  - **llm**: Support for OpenAI, Anthropic, Google, Azure, and vLLM providers
297
- - **dev**: Development tools (pytest, black, flake8, mypy)
298
- - **optional**: Enhanced features (lxml, selenium, pikepdf, nltk, scikit-learn)
335
+ - **webui**: Web interface dependencies (FastAPI, uvicorn, etc.)
299
336
 
300
- For a minimal installation:
337
+ For a minimal installation (CLI only, no LLM or Web UI):
301
338
  ```bash
302
339
  pip install academic-refchecker
303
340
  ```
304
341
 
342
+ Other optional extras:
343
+ - **dev**: Development tools (pytest, black, flake8, mypy)
344
+ - **optional**: Enhanced features (lxml, selenium, pikepdf, nltk, scikit-learn)
345
+ - **vllm**: Local model inference with vLLM
346
+
305
347
  ### Option 2: Install from Source
306
348
 
307
349
  #### 1. Clone the Repository
@@ -311,13 +353,27 @@ git clone https://github.com/markrussinovich/refchecker.git
311
353
  cd refchecker
312
354
  ```
313
355
 
314
- #### 2. Install Dependencies
356
+ #### 2. Create and Activate Virtual Environment (Recommended)
357
+
358
+ ```bash
359
+ python -m venv .venv
360
+ # On Windows:
361
+ .venv\Scripts\activate
362
+ # On macOS/Linux:
363
+ source .venv/bin/activate
364
+ ```
365
+
366
+ #### 3. Install Dependencies
315
367
 
316
368
  ```bash
369
+ # Install all dependencies including LLM and Web UI support
370
+ pip install -e ".[llm,webui]"
371
+
372
+ # Or install from requirements.txt
317
373
  pip install -r requirements.txt
318
374
  ```
319
375
 
320
- #### 3. (Optional) Install Additional Dependencies
376
+ #### 4. (Optional) Install Additional Dependencies
321
377
 
322
378
  For enhanced performance and LLM support, you can install optional dependencies:
323
379
 
@@ -337,6 +393,15 @@ pip install selenium
337
393
  pip install pikepdf
338
394
  ```
339
395
 
396
+ ### Web UI Installation
397
+
398
+ The Web UI requires Node.js 18+ in addition to the Python dependencies:
399
+
400
+ ```bash
401
+ cd web-ui
402
+ npm install
403
+ ```
404
+
340
405
  ## 📖 Usage
341
406
 
342
407
  Check papers in various formats and online locations:
@@ -3,15 +3,30 @@ MANIFEST.in
3
3
  README.md
4
4
  pyproject.toml
5
5
  requirements.txt
6
+ academic_refchecker.egg-info/PKG-INFO
7
+ academic_refchecker.egg-info/SOURCES.txt
8
+ academic_refchecker.egg-info/dependency_links.txt
9
+ academic_refchecker.egg-info/entry_points.txt
10
+ academic_refchecker.egg-info/requires.txt
11
+ academic_refchecker.egg-info/top_level.txt
12
+ backend/__init__.py
13
+ backend/__main__.py
14
+ backend/cli.py
15
+ backend/concurrency.py
16
+ backend/database.py
17
+ backend/main.py
18
+ backend/models.py
19
+ backend/refchecker_wrapper.py
20
+ backend/thumbnail.py
21
+ backend/websocket_manager.py
22
+ backend/static/favicon.svg
23
+ backend/static/index.html
24
+ backend/static/vite.svg
25
+ backend/static/assets/index-2P6L_39v.css
26
+ backend/static/assets/index-hk21nqxR.js
6
27
  scripts/download_db.py
7
28
  scripts/run_tests.py
8
29
  scripts/start_vllm_server.py
9
- src/academic_refchecker.egg-info/PKG-INFO
10
- src/academic_refchecker.egg-info/SOURCES.txt
11
- src/academic_refchecker.egg-info/dependency_links.txt
12
- src/academic_refchecker.egg-info/entry_points.txt
13
- src/academic_refchecker.egg-info/requires.txt
14
- src/academic_refchecker.egg-info/top_level.txt
15
30
  src/refchecker/__init__.py
16
31
  src/refchecker/__main__.py
17
32
  src/refchecker/__version__.py
@@ -1,2 +1,3 @@
1
1
  [console_scripts]
2
2
  academic-refchecker = refchecker.core.refchecker:main
3
+ refchecker-webui = backend.cli:main
@@ -40,3 +40,14 @@ joblib>=1.1.0
40
40
  vllm>=0.3.0
41
41
  huggingface_hub>=0.17.0
42
42
  torch>=2.0.0
43
+
44
+ [webui]
45
+ fastapi>=0.100.0
46
+ uvicorn[standard]>=0.22.0
47
+ pydantic>=2.0.0
48
+ aiosqlite>=0.19.0
49
+ httpx>=0.24.0
50
+ cryptography>=42.0.0
51
+ pymupdf>=1.23.0
52
+ Pillow>=9.0.0
53
+ python-multipart>=0.0.6
@@ -0,0 +1,21 @@
1
+ # Backend package for RefChecker Web UI
2
+ """
3
+ RefChecker Web UI Backend
4
+
5
+ This package provides the FastAPI backend for the RefChecker Web UI,
6
+ including WebSocket support for real-time progress updates.
7
+
8
+ Usage:
9
+ # As a command line tool (after pip install):
10
+ refchecker-webui --host 0.0.0.0 --port 8000
11
+
12
+ # As a Python module:
13
+ python -m backend --host 0.0.0.0 --port 8000
14
+
15
+ # With uvicorn directly:
16
+ uvicorn backend.main:app --host 0.0.0.0 --port 8000
17
+ """
18
+
19
+ from .main import app
20
+
21
+ __all__ = ["app"]
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Allow running backend as a module: python -m backend
4
+
5
+ This provides a clean entry point for the WebUI backend server.
6
+ """
7
+
8
+ from .cli import main
9
+
10
+ if __name__ == "__main__":
11
+ main()
@@ -0,0 +1,64 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ CLI entry point for RefChecker Web UI backend server.
4
+
5
+ This module provides the console script entry point for the refchecker-webui command.
6
+ """
7
+
8
+ import sys
9
+ import argparse
10
+ from pathlib import Path
11
+
12
+
13
+ def main():
14
+ """Main entry point for the refchecker-webui command."""
15
+ parser = argparse.ArgumentParser(
16
+ description="Start the RefChecker Web UI server"
17
+ )
18
+ parser.add_argument(
19
+ "--host",
20
+ default="0.0.0.0",
21
+ help="Host to bind to (default: 0.0.0.0)"
22
+ )
23
+ parser.add_argument(
24
+ "--port",
25
+ type=int,
26
+ default=8000,
27
+ help="Port to listen on (default: 8000)"
28
+ )
29
+ parser.add_argument(
30
+ "--reload",
31
+ action="store_true",
32
+ help="Enable auto-reload for development"
33
+ )
34
+
35
+ args = parser.parse_args()
36
+
37
+ try:
38
+ import uvicorn
39
+ except ImportError:
40
+ print("Error: uvicorn is not installed.")
41
+ print("Install it with: pip install 'academic-refchecker[webui]'")
42
+ sys.exit(1)
43
+
44
+ # Check if static frontend is bundled
45
+ static_dir = Path(__file__).parent / "static"
46
+ has_frontend = static_dir.exists() and (static_dir / "index.html").exists()
47
+
48
+ print(f"Starting RefChecker Web UI on http://{args.host}:{args.port}")
49
+ if has_frontend:
50
+ print(f"Open http://localhost:{args.port} in your browser")
51
+ else:
52
+ print("Note: Frontend not bundled. Start it separately: cd web-ui && npm run dev")
53
+ print()
54
+
55
+ uvicorn.run(
56
+ "backend.main:app",
57
+ host=args.host,
58
+ port=args.port,
59
+ reload=args.reload
60
+ )
61
+
62
+
63
+ if __name__ == "__main__":
64
+ main()
@@ -0,0 +1,100 @@
1
+ """
2
+ Global concurrency limiter for reference checking across all papers.
3
+
4
+ This module provides a system-wide semaphore that limits the total number
5
+ of concurrent reference checks, regardless of how many papers are being
6
+ checked simultaneously.
7
+ """
8
+ import asyncio
9
+ from typing import Optional
10
+ import logging
11
+
12
+ logger = logging.getLogger(__name__)
13
+
14
+ # Default max concurrent reference checks
15
+ DEFAULT_MAX_CONCURRENT = 6
16
+
17
+ class GlobalConcurrencyLimiter:
18
+ """
19
+ System-wide concurrency limiter for reference checks.
20
+
21
+ Uses a semaphore to limit total concurrent operations across
22
+ all paper checks.
23
+ """
24
+
25
+ def __init__(self, max_concurrent: int = DEFAULT_MAX_CONCURRENT):
26
+ self._max_concurrent = max_concurrent
27
+ self._semaphore = asyncio.Semaphore(max_concurrent)
28
+ self._active_count = 0
29
+ self._lock = asyncio.Lock()
30
+
31
+ @property
32
+ def max_concurrent(self) -> int:
33
+ return self._max_concurrent
34
+
35
+ @property
36
+ def active_count(self) -> int:
37
+ return self._active_count
38
+
39
+ async def set_max_concurrent(self, value: int):
40
+ """
41
+ Update the max concurrent limit.
42
+
43
+ Note: This recreates the semaphore, so it should only be called
44
+ when no operations are in progress, or the caller should be aware
45
+ that current limits may temporarily exceed the new value.
46
+ """
47
+ if value < 1:
48
+ value = 1
49
+ if value > 50:
50
+ value = 50
51
+
52
+ async with self._lock:
53
+ old_value = self._max_concurrent
54
+ self._max_concurrent = value
55
+ self._semaphore = asyncio.Semaphore(value)
56
+ logger.info(f"Global concurrency limit changed from {old_value} to {value}")
57
+
58
+ async def acquire(self):
59
+ """Acquire a slot in the concurrency pool."""
60
+ await self._semaphore.acquire()
61
+ async with self._lock:
62
+ self._active_count += 1
63
+ logger.debug(f"Acquired slot, active: {self._active_count}/{self._max_concurrent}")
64
+
65
+ def release(self):
66
+ """Release a slot back to the concurrency pool."""
67
+ self._semaphore.release()
68
+ # Note: can't use async lock in sync context, so we do best-effort count
69
+ self._active_count = max(0, self._active_count - 1)
70
+ logger.debug(f"Released slot, active: {self._active_count}/{self._max_concurrent}")
71
+
72
+ async def __aenter__(self):
73
+ await self.acquire()
74
+ return self
75
+
76
+ async def __aexit__(self, exc_type, exc_val, exc_tb):
77
+ self.release()
78
+ return False
79
+
80
+
81
+ # Global singleton instance
82
+ _limiter: Optional[GlobalConcurrencyLimiter] = None
83
+
84
+
85
+ def get_limiter() -> GlobalConcurrencyLimiter:
86
+ """Get the global concurrency limiter instance."""
87
+ global _limiter
88
+ if _limiter is None:
89
+ _limiter = GlobalConcurrencyLimiter()
90
+ return _limiter
91
+
92
+
93
+ async def init_limiter(max_concurrent: int = DEFAULT_MAX_CONCURRENT):
94
+ """Initialize or reinitialize the global limiter with a specific limit."""
95
+ global _limiter
96
+ if _limiter is None:
97
+ _limiter = GlobalConcurrencyLimiter(max_concurrent)
98
+ else:
99
+ await _limiter.set_max_concurrent(max_concurrent)
100
+ return _limiter