Repository Analysis

Future-House/paper-qa

High accuracy RAG for answering questions from scientific documents with citations

5.1 Low AI signal View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of Future-House/paper-qa, a Python project with 8,866 GitHub stars. SynthScan v2.0 examined 79,463 lines of code across 146 source files, recording 368 pattern matches distributed across 15 syntactic categories. The overall adjusted score of 5.1 places this repository in the Low AI signal band.

The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).

5.1
Adjusted Score
5.1
Raw Score
100%
Time Factor
2026-06-29
Last Push
8.9K
Stars
Python
Language
79.5K
Lines of Code
146
Files
368
Pattern Hits
2026-07-14
Scan Date
0.05
HC Hit Rate

What These Metrics Mean

Adjusted Score
Primary synthetic code indicator. Raw score normalised per 1,000 lines of code and multiplied by the temporal discount factor. This is the definitive comparative metric — use it to rank repositories by AI authorship density.
Raw Score
The unmodified sum of all severity-weighted, context-multiplied pattern match scores before temporal discounting. Reflects the absolute signal strength independent of when the repository was last active.
Time Factor
The temporal discount multiplier (0–100%) applied to the raw score. Repositories last updated before ChatGPT's launch (Nov 2022) receive a 5% factor. Full signal is only assigned to repositories active in the post-adoption era (Jan 2024+).
Pattern Hits
Total count of individual pattern matches across all files and categories. A high hit count with a low score may indicate a very large codebase with isolated AI snippets; a low count with a high score indicates dense, concentrated AI signatures.
HC Hit Rate
High+Critical pattern hits per file, averaged across the repository. This orthogonal signal catches repositories where a few files are densely packed with high-severity AI tells — a strong indicator even when the normalised score appears moderate due to codebase size.
Lines of Code / Files
Total lines and files analysed. The scanner examines 94 file extensions. These denominators are used to normalise the score, enabling fair comparison between repositories of vastly different sizes.

Score History

This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.

Severity Breakdown

Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.

CRITICAL 0HIGH 7MEDIUM 11LOW 350

Directory Score Breakdown

This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.

Pattern Findings

The scanner identified 368 distinct pattern matches across 15 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.

Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.

Hyper-Verbose Identifiers175 hits · 164 pts
SeverityFileLineSnippetContext
LOWtests/test_configs.py27def test_prompt_settings_validation() -> None:CODE
LOWtests/test_configs.py40def test_get_formatted_variables() -> None:CODE
LOWtests/test_configs.py53def test_get_settings_with_valid_config(value: MaybeSettings) -> None:CODE
LOWtests/test_configs.py58def test_get_settings_missing_file() -> None:CODE
LOWtests/test_configs.py69def test_settings_default_instantiation(tmpdir, subtests: SubTests) -> None:CODE
LOWtests/test_configs.py106def test_router_kwargs_present_in_models() -> None:CODE
LOWtests/test_configs.py204def test_matches_filter_criteria(doc_class, doc_data, filter_criteria, expected_result):CODE
LOWtests/test_configs.py209def test_citation_prompt_current_year():CODE
LOWtests/test_configs.py218def test_validity_of_bundled_configs(subtests: SubTests) -> None:CODE
LOWtests/test_configs.py230def test_readme_settings_cheatsheet_accuracy(subtests: SubTests) -> None:CODE
LOWtests/test_utils.py4def test_citation_to_docname_acronym_title() -> None:CODE
LOWtests/test_utils.py9def test_citation_to_docname_non_text_fallback_is_deterministic() -> None:CODE
LOWtests/conftest.py56def _defeat_litellm_callbacks() -> None:CODE
LOWtests/conftest.py61def _patch_litellm_logging_worker_for_race_condition() -> Iterator[None]:CODE
LOWtests/conftest.py92 def ensure_initialized_and_enqueue(self, async_coroutine: Coroutine) -> None:CODE
LOWtests/conftest.py184def stub_data_dir_w_near_dupes(stub_data_dir: Path, tmp_path: Path) -> Iterator[Path]:CODE
LOWtests/conftest.py219async def _vcr_handle_async_request(CODE
LOWtests/conftest.py245def _build_response_with_raw_headers(vcr_request, vcr_response, history):CODE
LOWtests/test_paperqa.py146def test_citations_with_pages() -> None:CODE
LOWtests/test_paperqa.py151def test_citations_without_space() -> None:CODE
LOWtests/test_paperqa.py156def test_citations_with_commas() -> None:CODE
LOWtests/test_paperqa.py3197 def test_basic_json_extraction(self, input_text: str) -> None:CODE
LOWtests/test_paperqa.py3260 def test_relevance_score_parsing(self, input_text: str) -> None:CODE
LOWtests/test_paperqa.py3338 def test_json_broken_formatting(self, input_text: str) -> None:CODE
LOWtests/test_paperqa.py3366 def test_llm_parse_json_with_escaped_characters(self, input_text, expected_output):CODE
LOWtests/test_paperqa.py181def test_citations_with_special_characters() -> None:CODE
LOWtests/test_paperqa.py186def test_citations_with_nonstandard_chars() -> None:CODE
LOWtests/test_paperqa.py816 async def acompletion_that_breaks_first_context(*args, **kwargs):CODE
LOWtests/test_paperqa.py844async def test_nonduplicate_contexts() -> None:CODE
LOWtests/test_paperqa.py899 async def acompletion_that_breaks_first_context(*args, **kwargs):CODE
LOWtests/test_paperqa.py1018async def test_custom_context_str_fn(docs_fixture) -> None:CODE
LOWtests/test_paperqa.py1043async def test_aquery_groups_contexts_by_question(docs_fixture) -> None:CODE
LOWtests/test_paperqa.py1118async def test_query_with_iteration(docs_fixture) -> None:CODE
LOWtests/test_paperqa.py1253async def test_docs_with_custom_embedding(CODE
LOWtests/test_paperqa.py1386async def test_custom_llm_custom_media(stub_data_dir: Path) -> None:CODE
LOWtests/test_paperqa.py1565async def test_pdf_reader_w_no_match_doc_details(stub_data_dir: Path) -> None:CODE
LOWtests/test_paperqa.py1584async def test_pdf_reader_w_no_chunks(stub_data_dir: Path) -> None:CODE
LOWtests/test_paperqa.py1605async def test_partly_embedded_texts(defer_embeddings: bool) -> None:CODE
LOWtests/test_paperqa.py1651async def test_pdf_reader_match_doc_details(stub_data_dir: Path) -> None:CODE
LOWtests/test_paperqa.py1793async def test_chunk_metadata_reader(CODE
LOWtests/test_paperqa.py1916def test_parsed_media_data_or_url() -> None:CODE
LOWtests/test_paperqa.py1942def test_parsed_media_url_only_hash_eq() -> None:CODE
LOWtests/test_paperqa.py2000async def test_read_doc_images_metadata(stub_data_dir: Path) -> None:CODE
LOWtests/test_paperqa.py2052async def test_read_doc_images_concurrency(stub_data_dir: Path) -> None:CODE
LOWtests/test_paperqa.py2114 def test_should_parse_and_enrich_media(CODE
LOWtests/test_paperqa.py2136async def test_image_enrichment_normal_use(stub_data_dir: Path) -> None:CODE
LOWtests/test_paperqa.py2266async def test_image_enrichment_invalid_image(caplog) -> None:CODE
LOWtests/test_paperqa.py2287async def test_image_enrichment_with_oversized_image(caplog) -> None:CODE
LOWtests/test_paperqa.py2425async def test_duplicate_media_context_creation(stub_data_dir: Path) -> None:CODE
LOWtests/test_paperqa.py2563def test_missing_page_doesnt_crash_us() -> None:CODE
LOWtests/test_paperqa.py2676async def test_context_inner_outer_prompt(stub_data_dir: Path) -> None:CODE
LOWtests/test_paperqa.py2717def test_get_index_name_uniqueness(CODE
LOWtests/test_paperqa.py2731def test_case_insensitive_matching():CODE
LOWtests/test_paperqa.py2752def test_dois_resolve_to_correct_journals(doi_journals):CODE
LOWtests/test_paperqa.py2765def test_docdetails_merge_with_non_list_fields() -> None:CODE
LOWtests/test_paperqa.py2799def test_docdetails_merge_with_list_fields() -> None:CODE
LOWtests/test_paperqa.py2833def test_docdetails_deserialization(tmp_path) -> None:CODE
LOWtests/test_paperqa.py2892def test_docdetails_doc_id_roundtrip() -> None:CODE
LOWtests/test_paperqa.py3048async def test_partitioning_fn_docs(use_partition: bool) -> None:CODE
LOWtests/test_paperqa.py3378 def test_llm_subquotes_and_newlines(self, input_text: str) -> None:CODE
115 more matches not shown…
Unused Imports66 hits · 64 pts
SeverityFileLineSnippetContext
LOWtests/conftest.py1CODE
LOWtests/test_paperqa.py12CODE
LOWtests/test_clients.py1CODE
LOWtests/test_clients.py7CODE
LOWtests/test_clients.py7CODE
LOWtests/test_clients.py24CODE
LOWtests/test_clients.py24CODE
LOWtests/test_agents.py1CODE
LOW…kages/paper-qa-docling/src/paperqa_docling/__init__.py3CODE
LOWpackages/paper-qa-docling/src/paperqa_docling/reader.py30CODE
LOW…kages/paper-qa-pymupdf/src/paperqa_pymupdf/__init__.py1CODE
LOW…kages/paper-qa-pymupdf/src/paperqa_pymupdf/__init__.py1CODE
LOW…kages/paper-qa-pymupdf/src/paperqa_pymupdf/__init__.py1CODE
LOWpackages/paper-qa-pypdf/src/paperqa_pypdf/__init__.py1CODE
LOWpackages/paper-qa-pypdf/src/paperqa_pypdf/reader.py27CODE
LOW…ges/paper-qa-nemotron/src/paperqa_nemotron/__init__.py3CODE
LOWpackages/paper-qa-nemotron/src/paperqa_nemotron/api.py59CODE
LOWpackages/paper-qa-nemotron/src/paperqa_nemotron/api.py60CODE
LOWsrc/paperqa/readers.py1CODE
LOWsrc/paperqa/__init__.py1CODE
LOWsrc/paperqa/__init__.py1CODE
LOWsrc/paperqa/__init__.py1CODE
LOWsrc/paperqa/__init__.py1CODE
LOWsrc/paperqa/__init__.py1CODE
LOWsrc/paperqa/__init__.py1CODE
LOWsrc/paperqa/__init__.py1CODE
LOWsrc/paperqa/__init__.py1CODE
LOWsrc/paperqa/__init__.py1CODE
LOWsrc/paperqa/__init__.py13CODE
LOWsrc/paperqa/__init__.py14CODE
LOWsrc/paperqa/__init__.py15CODE
LOWsrc/paperqa/__init__.py15CODE
LOWsrc/paperqa/__init__.py16CODE
LOWsrc/paperqa/__init__.py16CODE
LOWsrc/paperqa/__init__.py16CODE
LOWsrc/paperqa/__init__.py21CODE
LOWsrc/paperqa/__init__.py21CODE
LOWsrc/paperqa/__init__.py22CODE
LOWsrc/paperqa/__init__.py22CODE
LOWsrc/paperqa/__init__.py22CODE
LOWsrc/paperqa/__init__.py22CODE
LOWsrc/paperqa/__init__.py23CODE
LOWsrc/paperqa/docs.py1CODE
LOWsrc/paperqa/types.py1CODE
LOWsrc/paperqa/_ldp_shims.py33CODE
LOWsrc/paperqa/_ldp_shims.py33CODE
LOWsrc/paperqa/settings.py49CODE
LOWsrc/paperqa/llms.py7CODE
LOWsrc/paperqa/clients/unpaywall.py1CODE
LOWsrc/paperqa/clients/journal_quality.py1CODE
LOWsrc/paperqa/clients/retractions.py1CODE
LOWsrc/paperqa/clients/__init__.py1CODE
LOWsrc/paperqa/clients/__init__.py5CODE
LOWsrc/paperqa/clients/client_models.py1CODE
LOWsrc/paperqa/clients/semantic_scholar.py1CODE
LOWsrc/paperqa/clients/openalex.py1CODE
LOWsrc/paperqa/clients/crossref.py1CODE
LOWsrc/paperqa/agents/models.py1CODE
LOWsrc/paperqa/agents/__init__.py1CODE
LOWsrc/paperqa/agents/search.py1CODE
6 more matches not shown…
Fake / Example Data38 hits · 40 pts
SeverityFileLineSnippetContext
LOWtests/test_paperqa.py3168 '{\n"summary": "Lorem Ipsum",\n"relevance_score": 8\n}'CODE
LOWtests/test_paperqa.py3174 '```json\n{\n"summary": "Lorem Ipsum",\n"relevance_score": 8\n}\n```'CODE
LOWtests/test_paperqa.py3180 '```json { "summary": "Lorem Ipsum", "relevance_ score": 8 } ```',CODE
LOWtests/test_paperqa.py3185 '{ "summary": "Lorem Ipsum", "relevance_score": 8 }'CODE
LOWtests/test_paperqa.py3191 '{\n "summary": "Lorem Ipsum",\n "relevance_score": "8" \n}'CODE
LOWtests/test_paperqa.py3198 output = {"summary": "Lorem Ipsum", "relevance_score": 8}CODE
LOWtests/test_paperqa.py3206 ' Ipsum\n\ndolor sit amet",\n"relevance_score": 8\n}\nHope this helps!',CODE
LOWtests/test_paperqa.py3212 output = {"summary": "Lorem Ipsum\n\ndolor sit amet", "relevance_score": 8}CODE
LOWtests/test_paperqa.py3212 output = {"summary": "Lorem Ipsum\n\ndolor sit amet", "relevance_score": 8}CODE
LOWtests/test_paperqa.py3221 '```json { "summary": "Lorem Ipsum", "relevance_score": 7.6 } ```'CODE
LOWtests/test_paperqa.py3228 '```json { "summary": "Lorem Ipsum", "relevance_score": "8" } ```'CODE
LOWtests/test_paperqa.py3234 ' "Lorem Ipsum", "relevance_score": "8/10" } ```Hope this helps!',CODE
LOWtests/test_paperqa.py3240 '```json { "summary": "Lorem Ipsum", "relevance_score": "4/5" } ```'CODE
LOWtests/test_paperqa.py3247 '```json { "summary": "Lorem Ipsum", "relevance_score": 8/10 } ```'CODE
LOWtests/test_paperqa.py3254 '```json { "summary": "Lorem Ipsum", "relevance_score": 4/5 } ```'CODE
LOWtests/test_paperqa.py3261 output = {"summary": "Lorem Ipsum", "relevance_score": 8}CODE
LOWtests/test_paperqa.py3270 '```json { "summary": "Lorem Ipsum", "relevance-score": 8 } ```'CODE
LOWtests/test_paperqa.py3277 '```json { "summary": "Lorem Ipsum", "relevance_ score": 8 } ```'CODE
LOWtests/test_paperqa.py3284 '```json { "summary": "Lorem Ipsum", "score": 8 } ```'CODE
LOWtests/test_paperqa.py3291 '```json { "summary": "Lorem Ipsum", "relevance score": 8 } ```'CODE
LOWtests/test_paperqa.py3298 '```json { "summary": "Lorem Ipsum", "relevance": 8 } ```'CODE
LOWtests/test_paperqa.py3305 output = {"summary": "Lorem Ipsum", "relevance_score": 8}CODE
LOWtests/test_paperqa.py3314 '{ "summary": "Lorem Ipsum", "relevance_score": 8, }'CODE
LOWtests/test_paperqa.py3321 '{ "summary": "Lorem Ipsum", , "relevance_score": 8 }'CODE
LOWtests/test_paperqa.py3328 '{ , "summary": "Lorem Ipsum", "relevance_score": 8 }'CODE
LOWtests/test_paperqa.py3333 '{ "summary": "Lorem Ipsum" "relevance_score": 8 }',CODE
LOWtests/test_paperqa.py3339 output = {"summary": "Lorem Ipsum", "relevance_score": 8}CODE
LOWtests/test_paperqa.py3346 "<think> Thinking </think>Lorem Ipsum. Hope this helps!",CODE
LOWtests/test_paperqa.py3350 "Lorem Ipsum. Hope this helps!",CODE
LOWtests/test_paperqa.py3356 output = {"summary": "Lorem Ipsum. Hope this helps!"}CODE
LOWtests/test_paperqa.py3894 author_name="John Doe",CODE
LOWtests/test_paperqa.py3902 author_name="John Doe",CODE
LOWtests/test_paperqa.py3940 author_name="John Doe",CODE
LOWtests/test_paperqa.py3957 author_name="John Doe", # Reversed order from context_with_extrasCODE
LOWtests/test_clients.py380 assert not await client.query(doi="placeholder")CODE
LOWtests/test_clients.py759 ("Doe, John", "John Doe"),CODE
LOWtests/test_clients.py762 ("Doe, Jane", "Jane Doe"),CODE
LOWtests/test_clients.py767 ("Jane Doe", "Jane Doe"),CODE
Modern Structural Boilerplate32 hits · 32 pts
SeverityFileLineSnippetContext
LOWtests/conftest.py43def _setup_default_logs() -> None:CODE
LOW…kages/paper-qa-docling/src/paperqa_docling/__init__.py5__all__ = ["parse_pdf_to_pages"]CODE
LOW…kages/paper-qa-pymupdf/src/paperqa_pymupdf/__init__.py3__all__ = [CODE
LOWpackages/paper-qa-pypdf/src/paperqa_pypdf/__init__.py3__all__ = [CODE
LOW…ges/paper-qa-nemotron/src/paperqa_nemotron/__init__.py5__all__ = ["parse_pdf_to_pages"]CODE
LOWpackages/paper-qa-nemotron/src/paperqa_nemotron/api.py62logger = logging.getLogger(__name__)CODE
LOW…kages/paper-qa-nemotron/src/paperqa_nemotron/reader.py36logger = logging.getLogger(__name__)CODE
LOWsrc/paperqa/__init__.py25__all__ = [CODE
LOWsrc/paperqa/docs.py42logger = logging.getLogger(__name__)CODE
LOWsrc/paperqa/core.py16logger = logging.getLogger(__name__)CODE
LOWsrc/paperqa/types.py56logger = logging.getLogger(__name__)CODE
LOWsrc/paperqa/_ldp_shims.py3__all__ = [CODE
LOWsrc/paperqa/utils.py33logger = logging.getLogger(__name__)CODE
LOWsrc/paperqa/settings.py86logger = logging.getLogger(__name__)CODE
LOWsrc/paperqa/llms.py47logger = logging.getLogger(__name__)CODE
LOWsrc/paperqa/clients/journal_quality.py28logger = logging.getLogger(__name__)CODE
LOWsrc/paperqa/clients/retractions.py15logger = logging.getLogger(__name__)CODE
LOWsrc/paperqa/clients/__init__.py23logger = logging.getLogger(__name__)CODE
LOWsrc/paperqa/clients/client_models.py24logger = logging.getLogger(__name__)CODE
LOWsrc/paperqa/clients/semantic_scholar.py30logger = logging.getLogger(__name__)CODE
LOWsrc/paperqa/clients/openalex.py31logger = logging.getLogger(__name__)CODE
LOWsrc/paperqa/clients/crossref.py38logger = logging.getLogger(__name__)CODE
LOWsrc/paperqa/agents/env.py42logger = logging.getLogger(__name__)CODE
LOWsrc/paperqa/agents/models.py18logger = logging.getLogger(__name__)CODE
LOWsrc/paperqa/agents/tools.py24logger = logging.getLogger(__name__)CODE
LOWsrc/paperqa/agents/__init__.py22logger = logging.getLogger(__name__)CODE
LOWsrc/paperqa/agents/search.py56logger = logging.getLogger(__name__)CODE
LOWsrc/paperqa/agents/main.py48logger = logging.getLogger(__name__)CODE
LOWsrc/paperqa/agents/helpers.py17logger = logging.getLogger(__name__)CODE
LOWsrc/paperqa/contrib/openreview_paper_helper.py21logger = logging.getLogger(__name__)CODE
LOWsrc/paperqa/contrib/__init__.py3__all__ = ["ZoteroDB"]CODE
LOWsrc/paperqa/sources/clinical_trials.py23logger = logging.getLogger(__name__)CODE
Cross-File Repetition4 hits · 20 pts
SeverityFileLineSnippetContext
HIGHpackages/paper-qa-docling/tests/test_paperqa_docling.py0<html> <head><title>404 not found</title></head> <body> <center><h1>404 not found</h1></center> <hr><center>nginx</centeSTRING
HIGHpackages/paper-qa-pymupdf/tests/test_paperqa_pymupdf.py0<html> <head><title>404 not found</title></head> <body> <center><h1>404 not found</h1></center> <hr><center>nginx</centeSTRING
HIGHpackages/paper-qa-pypdf/tests/test_paperqa_pypdf.py0<html> <head><title>404 not found</title></head> <body> <center><h1>404 not found</h1></center> <hr><center>nginx</centeSTRING
HIGH…kages/paper-qa-nemotron/tests/test_paperqa_nemotron.py0<html> <head><title>404 not found</title></head> <body> <center><h1>404 not found</h1></center> <hr><center>nginx</centeSTRING
Deep Nesting18 hits · 18 pts
SeverityFileLineSnippetContext
LOWtests/test_agents.py68CODE
LOWpackages/paper-qa-docling/src/paperqa_docling/reader.py38CODE
LOWpackages/paper-qa-pymupdf/src/paperqa_pymupdf/reader.py127CODE
LOWpackages/paper-qa-pypdf/src/paperqa_pypdf/reader.py56CODE
LOWpackages/paper-qa-nemotron/src/paperqa_nemotron/api.py464CODE
LOWpackages/paper-qa-nemotron/src/paperqa_nemotron/api.py603CODE
LOWsrc/paperqa/readers.py203CODE
LOWsrc/paperqa/readers.py426CODE
LOWsrc/paperqa/core.py178CODE
LOWsrc/paperqa/types.py474CODE
LOWsrc/paperqa/types.py983CODE
LOWsrc/paperqa/types.py1267CODE
LOWsrc/paperqa/utils.py314CODE
LOWsrc/paperqa/utils.py589CODE
LOWsrc/paperqa/clients/crossref.py167CODE
LOWsrc/paperqa/agents/env.py47CODE
LOWsrc/paperqa/agents/search.py186CODE
LOWsrc/paperqa/contrib/zotero.py147CODE
Modern AI Meta-Vocabulary6 hits · 16 pts
SeverityFileLineSnippetContext
MEDIUMREADME.md36 - [Agentic Adding/Querying Documents](#agentic-addingquerying-documents)CODE
MEDIUMtests/test_paperqa.py1590 settings.summary_llm = "gpt-4o-mini" # context window needs to fit our one chunkCODE
MEDIUMtests/test_agents.py463 # https://docs.anthropic.com/en/docs/build-with-claude/tool-use#chain-of-thoughtCOMMENT
MEDIUMdocs/tutorials/where_do_I_get_papers.md20# 1Mil context window helps to suggest papers. These settings are not required, but useful for an initial setup.COMMENT
MEDIUMsrc/paperqa/llms.py551 # Recursively create each component embedding modelCOMMENT
MEDIUMsrc/paperqa/sources/clinical_trials.py294 # for embedding model context windows, we truncate at TRIAL_CHAR_TRUNCATION_SIZECOMMENT
Docstring Block Structure3 hits · 15 pts
SeverityFileLineSnippetContext
HIGHpackages/paper-qa-pymupdf/src/paperqa_pymupdf/reader.py49Load a PDF page and extract its text. Args: file: An open (assumed) PyMuPDF document. page_num: ZerSTRING
HIGHsrc/paperqa/clients/openalex.py74Get paper details from OpenAlex given a DOI or paper title. Args: client: Async HTTP client for any requestSTRING
HIGHsrc/paperqa/agents/tools.py474Search for clinical trials, with support for repeated calls and concurrent execution. Will add new clinical triSTRING
Excessive Try-Catch Wrapping11 hits · 13 pts
SeverityFileLineSnippetContext
LOWsrc/paperqa/readers.py77 except Exception as exc:CODE
LOWsrc/paperqa/types.py1128 except Exception:CODE
LOWsrc/paperqa/utils.py328 except Exception:CODE
MEDIUMsrc/paperqa/utils.py227def get_loop() -> asyncio.AbstractEventLoop:CODE
LOWsrc/paperqa/llms.py297 except Exception as e:CODE
LOWsrc/paperqa/agents/search.py252 except Exception:CODE
LOWsrc/paperqa/agents/search.py477 except Exception:CODE
LOWsrc/paperqa/agents/search.py531 except Exception as e:CODE
MEDIUMsrc/paperqa/agents/search.py367def save_index(self) -> None:CODE
LOWsrc/paperqa/agents/main.py164 except Exception:CODE
LOWsrc/paperqa/sources/clinical_trials.py275 except Exception as e:CODE
Self-Referential Comments3 hits · 9 pts
SeverityFileLineSnippetContext
MEDIUMsrc/paperqa/readers.py228 # Create a ParsedMedia objectCOMMENT
MEDIUMsrc/paperqa/settings.py1248 # Create a section with a question headingCOMMENT
MEDIUMsrc/paperqa/llms.py346 # Create a new event loop in a new thread to avoid nested loop issuesCOMMENT
AI Structural Patterns5 hits · 5 pts
SeverityFileLineSnippetContext
LOWpackages/paper-qa-pymupdf/src/paperqa_pymupdf/reader.py127CODE
LOW…kages/paper-qa-nemotron/src/paperqa_nemotron/reader.py136CODE
LOWsrc/paperqa/docs.py93CODE
LOWsrc/paperqa/docs.py156CODE
LOWsrc/paperqa/contrib/zotero.py147CODE
AI Slop Vocabulary2 hits · 3 pts
SeverityFileLineSnippetContext
LOWpackages/paper-qa-nemotron/src/paperqa_nemotron/api.py635 # We just use aiobotocore directly hereCOMMENT
LOWsrc/paperqa/clients/__init__.py253 # if we can't get metadata, just return the doc, but don't overwrite any fieldsCOMMENT
Redundant / Tautological Comments2 hits · 2 pts
SeverityFileLineSnippetContext
LOWpyproject.toml324# Set true to activate the evaluation score.COMMENT
LOWsrc/paperqa/utils.py89 # Check if the entropy is within a reasonable range for textSTRING
Over-Commented Block2 hits · 2 pts
SeverityFileLineSnippetContext
LOWpyproject.toml181mypy_path = "$MYPY_CONFIG_FILE_DIR/src,$MYPY_CONFIG_FILE_DIR/packages/paper-qa-pypdf/src,$MYPY_CONFIG_FILE_DIR/packages/COMMENT
LOWsrc/paperqa/settings.py1141 media.info["is_irrelevant"],COMMENT
Verbosity Indicators1 hit · 2 pts
SeverityFileLineSnippetContext
LOWtests/test_paperqa.py1304 # For QdrantVectorStore, we need to check if collection exists and has pointsCOMMENT