academic-refchecker 2.0.7__py3-none-any.whl → 2.0.9__py3-none-any.whl

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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: academic-refchecker
3
- Version: 2.0.7
3
+ Version: 2.0.9
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
@@ -315,6 +315,8 @@ python run_refchecker.py --paper https://arxiv.org/abs/1706.03762 \
315
315
 
316
316
  #### Google Gemini
317
317
 
318
+ With `GOOGLE_API_KEY` environment variable:
319
+
318
320
  ```bash
319
321
  python run_refchecker.py --paper paper.tex \
320
322
  --llm-provider google \
@@ -323,6 +325,8 @@ python run_refchecker.py --paper paper.tex \
323
325
 
324
326
  #### Azure OpenAI
325
327
 
328
+ With `AZURE_OPENAI_API_KEY` environment variable:
329
+
326
330
  ```bash
327
331
  python run_refchecker.py --paper paper.txt \
328
332
  --llm-provider azure \
@@ -1,12 +1,12 @@
1
- academic_refchecker-2.0.7.dist-info/licenses/LICENSE,sha256=Kwrx3fePVCeEFDCZvCW4OuoTNBiSoYbpGBI6qzGhWF0,1067
1
+ academic_refchecker-2.0.9.dist-info/licenses/LICENSE,sha256=Kwrx3fePVCeEFDCZvCW4OuoTNBiSoYbpGBI6qzGhWF0,1067
2
2
  backend/__init__.py,sha256=TFVkOx5tSp3abty15RzUbaSwQ9ZD0kfUn7PDh63xkYY,521
3
3
  backend/__main__.py,sha256=74V7yUMsRSZaaRyXYm-rZVc3TVUcUgwsoTQTUbV5EqM,211
4
4
  backend/cli.py,sha256=xV3l9M5OdNQQYOcrzj2d_7RmCgj7CXP_1oi0TPe6zNo,1672
5
5
  backend/concurrency.py,sha256=2KY9I_8dDkyl_HTGx27ZxU4rFXx2vqbGOlo5RrRbPjA,3223
6
6
  backend/database.py,sha256=1jLP1m9vNk5sEs4bh_xmX0T5ilZkUTX1c7nOVz5XnNc,30681
7
- backend/main.py,sha256=ntz5PbEfG65ENFTHVQlY-c8hP5UPM_hdFjl60YMNh78,54371
7
+ backend/main.py,sha256=cenE0Vxleh1LP45EOUqh4FTCXCS0OXbPOYWxaOLMfGE,54778
8
8
  backend/models.py,sha256=El2F-RTHgxQ7-WODmiYCpjsTFDpjwF9PBt-JDa_XipE,2591
9
- backend/refchecker_wrapper.py,sha256=cgJpPFNGAKHaNKxnLY3r3RxlJVT-yRyr3rJFeMxoxAo,51873
9
+ backend/refchecker_wrapper.py,sha256=ZOg5Rc0Mgac3ALwxA55pTCeqCL06AWOBZLQeTeZEJcY,52038
10
10
  backend/thumbnail.py,sha256=wPFXp3RlmcL9jVKZmSBRB7Pfy9Ti7nCnzNtL4osfNtM,17618
11
11
  backend/websocket_manager.py,sha256=l-Wou-rKV6n7t6Gcf5fR6s_4G-mssSrba0davNnYS70,4247
12
12
  backend/static/favicon.svg,sha256=R0oQauh16Uy0D7JlT27k-zdjJtrvfPKOe9La5vKYwuM,395
@@ -16,7 +16,7 @@ backend/static/assets/index-2P6L_39v.css,sha256=KC3Wa6jfD1qwmEoVpqTovlzf8fsn5oHY
16
16
  backend/static/assets/index-hk21nqxR.js,sha256=z2agP8ZFYw4AfYi-GJ5E_8_k-lPF-frXOJtPk-I0hDs,369533
17
17
  refchecker/__init__.py,sha256=Pg5MrtLxDBRcNYcI02N-bv3tzURVd1S3nQ8IyF7Zw7E,322
18
18
  refchecker/__main__.py,sha256=agBbT9iKN0g2xXtRNCoh29Nr7z2n5vU-r0MCVJKi4tI,232
19
- refchecker/__version__.py,sha256=xuLub_DO4RmCl3zDtU20SXDlj6XT8dJRz8nB_qv8LRo,65
19
+ refchecker/__version__.py,sha256=ugKN8_10wI8itlDZWhgoU5ai_eY4_wQpctK9TchHkyw,65
20
20
  refchecker/checkers/__init__.py,sha256=T0PAHTFt6UiGvn-WGoJU8CdhXNmf6zaHmcGVoWHhmJQ,533
21
21
  refchecker/checkers/crossref.py,sha256=88moAyTudBqf9SKqTQkNAq1yyuRe95f8r4EpmJznupQ,20937
22
22
  refchecker/checkers/enhanced_hybrid_checker.py,sha256=2jIeUX7hankPok3M4de9o2bsJZ17ZomuLkdfdr9EV0s,28671
@@ -57,8 +57,8 @@ refchecker/utils/mock_objects.py,sha256=QxU-UXyHSY27IZYN8Sb8ei0JtNkpGSdMXoErrRLH
57
57
  refchecker/utils/text_utils.py,sha256=v5beDt_fyx4ETfTXLYrDMp3CuUGoDoLs7-d1H2GdySE,228585
58
58
  refchecker/utils/unicode_utils.py,sha256=-WBKarXO756p7fd7gCeNsMag4ztDNURwFX5IVniOtwY,10366
59
59
  refchecker/utils/url_utils.py,sha256=7b0rWCQJSajzqOvD7ghsBZPejiq6mUIz6SGhvU_WGDs,9441
60
- academic_refchecker-2.0.7.dist-info/METADATA,sha256=weaQGma4FfzxrEhRbcbJYz9OcAdygsrDHGVYmkf4uc4,26477
61
- academic_refchecker-2.0.7.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
62
- academic_refchecker-2.0.7.dist-info/entry_points.txt,sha256=9cREsaKwlp05Ql0CBIjKrNHk5IG2cHY5LvJPsV2-SxA,108
63
- academic_refchecker-2.0.7.dist-info/top_level.txt,sha256=FfNvrvpj25gfpUBjW0epvz7Qrdejhups5Za_DBiSRu4,19
64
- academic_refchecker-2.0.7.dist-info/RECORD,,
60
+ academic_refchecker-2.0.9.dist-info/METADATA,sha256=3DZILgc7Vki2u9vVYH-aUimyId4lNcjmhE0Hac1KhbI,26575
61
+ academic_refchecker-2.0.9.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
62
+ academic_refchecker-2.0.9.dist-info/entry_points.txt,sha256=9cREsaKwlp05Ql0CBIjKrNHk5IG2cHY5LvJPsV2-SxA,108
63
+ academic_refchecker-2.0.9.dist-info/top_level.txt,sha256=FfNvrvpj25gfpUBjW0epvz7Qrdejhups5Za_DBiSRu4,19
64
+ academic_refchecker-2.0.9.dist-info/RECORD,,
backend/main.py CHANGED
@@ -13,6 +13,7 @@ from fastapi.responses import FileResponse, HTMLResponse
13
13
  from fastapi.staticfiles import StaticFiles
14
14
  from pydantic import BaseModel
15
15
  import logging
16
+ from refchecker.__version__ import __version__
16
17
 
17
18
  import aiosqlite
18
19
  from .database import db
@@ -136,6 +137,12 @@ async def health():
136
137
  return {"status": "healthy"}
137
138
 
138
139
 
140
+ @app.get("/api/version")
141
+ async def version():
142
+ """Return server/CLI version from refchecker package."""
143
+ return {"version": __version__}
144
+
145
+
139
146
  @app.websocket("/api/ws/{session_id}")
140
147
  async def websocket_endpoint(websocket: WebSocket, session_id: str):
141
148
  """WebSocket endpoint for real-time updates"""
@@ -183,10 +190,12 @@ async def start_check(
183
190
 
184
191
  # Retrieve API key from config if config_id provided
185
192
  api_key = None
193
+ endpoint = None
186
194
  if llm_config_id and use_llm:
187
195
  config = await db.get_llm_config_by_id(llm_config_id)
188
196
  if config:
189
197
  api_key = config.get('api_key')
198
+ endpoint = config.get('endpoint')
190
199
  llm_provider = config.get('provider', llm_provider)
191
200
  llm_model = config.get('model') or llm_model
192
201
  logger.info(f"Using LLM config {llm_config_id}: {llm_provider}/{llm_model}")
@@ -238,7 +247,7 @@ async def start_check(
238
247
  # Start check in background
239
248
  cancel_event = asyncio.Event()
240
249
  task = asyncio.create_task(
241
- run_check(session_id, check_id, paper_source, source_type, llm_provider, llm_model, api_key, use_llm, cancel_event)
250
+ run_check(session_id, check_id, paper_source, source_type, llm_provider, llm_model, api_key, endpoint, use_llm, cancel_event)
242
251
  )
243
252
  active_checks[session_id] = {"task": task, "cancel_event": cancel_event, "check_id": check_id}
244
253
 
@@ -262,6 +271,7 @@ async def run_check(
262
271
  llm_provider: str,
263
272
  llm_model: Optional[str],
264
273
  api_key: Optional[str],
274
+ endpoint: Optional[str],
265
275
  use_llm: bool,
266
276
  cancel_event: asyncio.Event
267
277
  ):
@@ -349,6 +359,7 @@ async def run_check(
349
359
  llm_provider=llm_provider,
350
360
  llm_model=llm_model,
351
361
  api_key=api_key,
362
+ endpoint=endpoint,
352
363
  use_llm=use_llm,
353
364
  progress_callback=progress_callback,
354
365
  cancel_event=cancel_event,
@@ -829,6 +840,7 @@ async def recheck(check_id: int):
829
840
  llm_provider,
830
841
  llm_model,
831
842
  None, # API key will need to be retrieved separately
843
+ None, # Endpoint will need to be retrieved separately
832
844
  True,
833
845
  cancel_event
834
846
  )
@@ -82,6 +82,7 @@ class ProgressRefChecker:
82
82
  llm_provider: Optional[str] = None,
83
83
  llm_model: Optional[str] = None,
84
84
  api_key: Optional[str] = None,
85
+ endpoint: Optional[str] = None,
85
86
  use_llm: bool = True,
86
87
  progress_callback: Optional[Callable] = None,
87
88
  cancel_event: Optional[asyncio.Event] = None,
@@ -104,6 +105,7 @@ class ProgressRefChecker:
104
105
  self.llm_provider = llm_provider
105
106
  self.llm_model = llm_model
106
107
  self.api_key = api_key
108
+ self.endpoint = endpoint
107
109
  self.use_llm = use_llm
108
110
  self.progress_callback = progress_callback
109
111
  self.cancel_event = cancel_event
@@ -121,6 +123,8 @@ class ProgressRefChecker:
121
123
  llm_config['model'] = llm_model
122
124
  if api_key:
123
125
  llm_config['api_key'] = api_key
126
+ if endpoint:
127
+ llm_config['endpoint'] = endpoint
124
128
  self.llm = create_llm_provider(
125
129
  provider_name=llm_provider,
126
130
  config=llm_config
refchecker/__version__.py CHANGED
@@ -1,3 +1,3 @@
1
1
  """Version information for RefChecker."""
2
2
 
3
- __version__ = "2.0.7"
3
+ __version__ = "2.0.9"