Copy disabled (too large)
Download .txt
Showing preview only (16,604K chars total). Download the full file to get everything.
Repository: Future-House/paper-qa
Branch: main
Commit: d2c3c698fdf0
Files: 177
Total size: 15.8 MB
Directory structure:
gitextract_rgxqts__/
├── .gitattributes
├── .github/
│ ├── renovate.json5
│ └── workflows/
│ ├── build.yml
│ └── tests.yml
├── .gitignore
├── .mailmap
├── .pre-commit-config.yaml
├── .python-version
├── CITATION.cff
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── docs/
│ ├── 2024-10-16_litqa2-splits.json5
│ └── tutorials/
│ ├── querying_with_clinical_trials.md
│ ├── running_on_lfrqa.ipynb
│ ├── running_on_lfrqa.md
│ ├── settings_tutorial.ipynb
│ ├── settings_tutorial.md
│ └── where_do_I_get_papers.md
├── packages/
│ ├── paper-qa-docling/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── pyproject.toml
│ │ ├── src/
│ │ │ └── paperqa_docling/
│ │ │ ├── __init__.py
│ │ │ ├── py.typed
│ │ │ └── reader.py
│ │ └── tests/
│ │ └── test_paperqa_docling.py
│ ├── paper-qa-nemotron/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── pyproject.toml
│ │ ├── src/
│ │ │ └── paperqa_nemotron/
│ │ │ ├── __init__.py
│ │ │ ├── api.py
│ │ │ ├── py.typed
│ │ │ └── reader.py
│ │ └── tests/
│ │ ├── cassettes/
│ │ │ ├── TestNvidiaAPI.test_detection_only[0].yaml
│ │ │ ├── TestNvidiaAPI.test_detection_only[1].yaml
│ │ │ ├── TestNvidiaAPI.test_markdown_bbox[0].yaml
│ │ │ ├── TestNvidiaAPI.test_markdown_bbox[1].yaml
│ │ │ ├── TestNvidiaAPI.test_markdown_no_bbox[0].yaml
│ │ │ └── TestNvidiaAPI.test_markdown_no_bbox[1].yaml
│ │ ├── conftest.py
│ │ ├── test_api.py
│ │ └── test_paperqa_nemotron.py
│ ├── paper-qa-pymupdf/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── pyproject.toml
│ │ ├── src/
│ │ │ └── paperqa_pymupdf/
│ │ │ ├── __init__.py
│ │ │ ├── py.typed
│ │ │ └── reader.py
│ │ └── tests/
│ │ └── test_paperqa_pymupdf.py
│ └── paper-qa-pypdf/
│ ├── LICENSE
│ ├── README.md
│ ├── pyproject.toml
│ ├── src/
│ │ └── paperqa_pypdf/
│ │ ├── __init__.py
│ │ ├── py.typed
│ │ ├── reader.py
│ │ └── utils.py
│ └── tests/
│ ├── test_paperqa_pypdf.py
│ └── test_utils.py
├── pyproject.toml
├── src/
│ └── paperqa/
│ ├── __init__.py
│ ├── _ldp_shims.py
│ ├── agents/
│ │ ├── __init__.py
│ │ ├── env.py
│ │ ├── helpers.py
│ │ ├── main.py
│ │ ├── models.py
│ │ ├── search.py
│ │ └── tools.py
│ ├── clients/
│ │ ├── __init__.py
│ │ ├── client_data/
│ │ │ └── journal_quality.csv
│ │ ├── client_models.py
│ │ ├── crossref.py
│ │ ├── exceptions.py
│ │ ├── journal_quality.py
│ │ ├── openalex.py
│ │ ├── retractions.py
│ │ ├── semantic_scholar.py
│ │ └── unpaywall.py
│ ├── configs/
│ │ ├── clinical_trials.json
│ │ ├── contracrow.json
│ │ ├── debug.json
│ │ ├── fast.json
│ │ ├── high_quality.json
│ │ ├── openreview.json
│ │ ├── search_only_clinical_trials.json
│ │ ├── tier1_limits.json
│ │ ├── tier2_limits.json
│ │ ├── tier3_limits.json
│ │ ├── tier4_limits.json
│ │ ├── tier5_limits.json
│ │ └── wikicrow.json
│ ├── contrib/
│ │ ├── __init__.py
│ │ ├── openreview_paper_helper.py
│ │ └── zotero.py
│ ├── core.py
│ ├── docs.py
│ ├── llms.py
│ ├── paths.py
│ ├── prompts.py
│ ├── py.typed
│ ├── readers.py
│ ├── settings.py
│ ├── sources/
│ │ ├── __init__.py
│ │ └── clinical_trials.py
│ ├── types.py
│ └── utils.py
└── tests/
├── __init__.py
├── cassettes/
│ ├── test_arxiv_doi_is_used_when_available.yaml
│ ├── test_author_matching.yaml
│ ├── test_bad_dois.yaml
│ ├── test_bad_titles.yaml
│ ├── test_bulk_doi_search.yaml
│ ├── test_bulk_title_search.yaml
│ ├── test_crossref_journalquality_fields_filtering.yaml
│ ├── test_crossref_retraction_status.yaml
│ ├── test_docs_lifecycle.yaml
│ ├── test_does_openalex_work[not-in-openalex].yaml
│ ├── test_does_openalex_work[not-oa-in-openalex].yaml
│ ├── test_does_openalex_work[oa-in-openalex1].yaml
│ ├── test_does_openalex_work[oa-in-openalex2].yaml
│ ├── test_doi_search[paper_attributes0].yaml
│ ├── test_doi_search[paper_attributes1].yaml
│ ├── test_doi_search[paper_attributes2].yaml
│ ├── test_doi_search[paper_attributes3].yaml
│ ├── test_doi_search[paper_attributes4].yaml
│ ├── test_ensure_sequential_run.yaml
│ ├── test_ensure_sequential_run_early_stop.yaml
│ ├── test_equations[docling].yaml
│ ├── test_equations[nemotron].yaml
│ ├── test_equations[pymupdf].yaml
│ ├── test_get_reasoning[deepseek-reasoner].yaml
│ ├── test_get_reasoning[openrouter-deepseek].yaml
│ ├── test_image_enrichment_invalid_image.yaml
│ ├── test_image_enrichment_normal_use.yaml
│ ├── test_maybe_is_text.yaml
│ ├── test_minimal_fields_filtering.yaml
│ ├── test_nonduplicate_contexts.yaml
│ ├── test_odd_client_requests.yaml
│ ├── test_partitioning_fn_docs[False].yaml
│ ├── test_partitioning_fn_docs[True].yaml
│ ├── test_partly_embedded_texts[False].yaml
│ ├── test_partly_embedded_texts[True].yaml
│ ├── test_pdf_reader_match_doc_details.yaml
│ ├── test_s2_only_fields_filtering.yaml
│ ├── test_s2_title_search_empty_data.yaml
│ ├── test_title_search[paper_attributes0].yaml
│ ├── test_title_search[paper_attributes1].yaml
│ ├── test_title_search[paper_attributes2].yaml
│ ├── test_tricky_journal_quality_results[10.1016-j.bbcan.2023.188947-1].yaml
│ ├── test_tricky_journal_quality_results[10.1016-j.semcdb.2016.08.024-1].yaml
│ ├── test_tricky_journal_quality_results[10.1038-s41598-018-27044-6-1].yaml
│ ├── test_tricky_journal_quality_results[10.1073-pnas.1205508109-3].yaml
│ ├── test_tricky_journal_quality_results[10.1146-annurev.pathol.4.110807.092311-2].yaml
│ └── test_tricky_journal_quality_results[10.1186-1471-2148-11-4-2].yaml
├── conftest.py
├── duplicate_media_template.md
├── stub_data/
│ ├── .DS_Store
│ ├── bates.txt
│ ├── dummy.docx
│ ├── dummy.pptx
│ ├── dummy.xlsx
│ ├── dummy_jap.docx
│ ├── empty.txt
│ ├── flag_day.html
│ ├── gravity_hill.md
│ ├── obama.txt
│ ├── py.typed
│ ├── stub_manifest.csv
│ ├── stub_manifest_nocitation.csv
│ └── stub_retractions.csv
├── test_agents.py
├── test_cli.py
├── test_clients.py
├── test_clinical_trials.py
├── test_configs.py
├── test_paperqa.py
└── test_utils.py
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitattributes
================================================
tests/cassettes/* linguist-generated=true
================================================
FILE: .github/renovate.json5
================================================
{
$schema: "https://docs.renovatebot.com/renovate-schema.json",
extends: [
"config:recommended",
"group:allNonMajor", // Rely on config:recommended for major version updates
":automergeMinor",
],
schedule: ["* 2 1-7 * 1"],
prHourlyLimit: 4,
timezone: "America/Los_Angeles",
rangeStrategy: "widen",
lockFileMaintenance: {
enabled: true,
schedule: ["* 2 1-7 * 1"], // Work around https://github.com/renovatebot/renovate/discussions/33152
},
minimumReleaseAge: "2 weeks",
"pre-commit": { enabled: true },
packageRules: [
{
// TODO: remove after fhaviary supports Python 3.14
matchPackageNames: ["python"],
allowedVersions: "<=3.13",
},
],
}
================================================
FILE: .github/workflows/build.yml
================================================
name: Publish
on:
release:
types: [created]
workflow_dispatch:
jobs:
publish:
runs-on: ubuntu-latest
env:
UV_VENV_CLEAR: 1 # Work around https://github.com/hynek/build-and-inspect-python-package/issues/174
steps:
- uses: actions/checkout@v6
- id: build-paper-qa-pymupdf
uses: hynek/build-and-inspect-python-package@v2
with:
path: packages/paper-qa-pymupdf
upload-name-suffix: -paper-qa-pymupdf
- name: Download built paper-qa-pymupdf artifact to dist/
uses: actions/download-artifact@v8
with:
name: ${{ steps.build-paper-qa-pymupdf.outputs.artifact-name }}
path: dist
- name: Clean up paper-qa-pymupdf build # Work around https://github.com/hynek/build-and-inspect-python-package/issues/174
run: rm -r ${{ steps.build-paper-qa-pymupdf.outputs.dist }}
- id: build-paper-qa-pypdf
uses: hynek/build-and-inspect-python-package@v2
with:
path: packages/paper-qa-pypdf
upload-name-suffix: -paper-qa-pypdf
- name: Download built paper-qa-pypdf artifact to dist/
uses: actions/download-artifact@v8
with:
name: ${{ steps.build-paper-qa-pypdf.outputs.artifact-name }}
path: dist
- name: Clean up paper-qa-pypdf build # Work around https://github.com/hynek/build-and-inspect-python-package/issues/174
run: rm -r ${{ steps.build-paper-qa-pypdf.outputs.dist }}
- id: build-paper-qa-docling
uses: hynek/build-and-inspect-python-package@v2
with:
path: packages/paper-qa-docling
upload-name-suffix: -paper-qa-docling
- name: Download built paper-qa-docling artifact to dist/
uses: actions/download-artifact@v8
with:
name: ${{ steps.build-paper-qa-docling.outputs.artifact-name }}
path: dist
- name: Clean up paper-qa-docling build # Work around https://github.com/hynek/build-and-inspect-python-package/issues/174
run: rm -r ${{ steps.build-paper-qa-docling.outputs.dist }}
- id: build-paper-qa-nemotron
uses: hynek/build-and-inspect-python-package@v2
with:
path: packages/paper-qa-nemotron
upload-name-suffix: -paper-qa-nemotron
- name: Download built paper-qa-nemotron artifact to dist/
uses: actions/download-artifact@v8
with:
name: ${{ steps.build-paper-qa-nemotron.outputs.artifact-name }}
path: dist
- name: Clean up paper-qa-nemotron build # Work around https://github.com/hynek/build-and-inspect-python-package/issues/174
run: rm -r ${{ steps.build-paper-qa-nemotron.outputs.dist }}
- id: build-paper-qa
uses: hynek/build-and-inspect-python-package@v2
with:
upload-name-suffix: -paper-qa
- name: Download built paper-qa artifact to dist/
uses: actions/download-artifact@v8
with:
name: ${{ steps.build-paper-qa.outputs.artifact-name }}
path: dist
- name: Clean up paper-qa build # Work around https://github.com/hynek/build-and-inspect-python-package/issues/174
run: rm -r ${{ steps.build-paper-qa.outputs.dist }}
- uses: pypa/gh-action-pypi-publish@release/v1
with:
password: ${{ secrets.PYPI_API_TOKEN }}
================================================
FILE: .github/workflows/tests.yml
================================================
name: Lint and Test
on:
push:
branches: [main]
pull_request:
workflow_dispatch:
jobs:
pre-commit:
runs-on: ubuntu-latest
if: github.event_name == 'pull_request' # pre-commit-ci/lite-action only runs here
strategy:
matrix:
python-version: [3.11, 3.13] # Our min and max supported Python versions
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0 # For setuptools-scm, replace with fetch-tags after https://github.com/actions/checkout/issues/1471
- uses: astral-sh/setup-uv@v7
with:
enable-cache: true
python-version: ${{ matrix.python-version }}
activate-environment: true # Activate for simple `uv sync` below
- run: uv sync
- uses: j178/prek-action@v1
with:
prek-version: 0.2.14 # Downpin for https://github.com/j178/prek/issues/1104
- uses: pre-commit-ci/lite-action@v1.1.0
if: always()
lint:
runs-on: ubuntu-latest
env:
UV_VENV_CLEAR: 1 # Work around https://github.com/hynek/build-and-inspect-python-package/issues/174
strategy:
matrix:
python-version: [3.11] # Our min supported Python version
steps:
- uses: actions/checkout@v6
- uses: astral-sh/setup-uv@v7
with:
enable-cache: true
cache-local-path: /tmp/baipp-uv_cache_dir # Work around https://github.com/hynek/build-and-inspect-python-package/issues/181
python-version: ${{ matrix.python-version }}
- name: Check paper-qa-pymupdf build
id: build-paper-qa-pymupdf
if: matrix.python-version == '3.11'
uses: hynek/build-and-inspect-python-package@v2
with:
path: packages/paper-qa-pymupdf
upload-name-suffix: -paper-qa-pymupdf
- name: Clean up paper-qa-pymupdf build # Work around https://github.com/hynek/build-and-inspect-python-package/issues/174
if: matrix.python-version == '3.11'
run: rm -r ${{ steps.build-paper-qa-pymupdf.outputs.dist }}
- name: Check paper-qa-pypdf build
id: build-paper-qa-pypdf
if: matrix.python-version == '3.11'
uses: hynek/build-and-inspect-python-package@v2
with:
path: packages/paper-qa-pypdf
upload-name-suffix: -paper-qa-pypdf
- name: Clean up paper-qa-pymupdf build # Work around https://github.com/hynek/build-and-inspect-python-package/issues/174
if: matrix.python-version == '3.11'
run: rm -r ${{ steps.build-paper-qa-pypdf.outputs.dist }}
- name: Check paper-qa-docling build
id: build-paper-qa-docling
if: matrix.python-version == '3.11'
uses: hynek/build-and-inspect-python-package@v2
with:
path: packages/paper-qa-docling
upload-name-suffix: -paper-qa-docling
- name: Clean up paper-qa-docling build # Work around https://github.com/hynek/build-and-inspect-python-package/issues/174
if: matrix.python-version == '3.11'
run: rm -r ${{ steps.build-paper-qa-docling.outputs.dist }}
- name: Check paper-qa-nemotron build
id: build-paper-qa-nemotron
if: matrix.python-version == '3.11'
uses: hynek/build-and-inspect-python-package@v2
with:
path: packages/paper-qa-nemotron
upload-name-suffix: -paper-qa-nemotron
- name: Clean up paper-qa-nemotron build # Work around https://github.com/hynek/build-and-inspect-python-package/issues/174
if: matrix.python-version == '3.11'
run: rm -r ${{ steps.build-paper-qa-nemotron.outputs.dist }}
- name: Check paper-qa build
id: build-paper-qa
if: matrix.python-version == '3.11'
uses: hynek/build-and-inspect-python-package@v2
with:
upload-name-suffix: -paper-qa
- name: Clean up paper-qa build # Work around https://github.com/hynek/build-and-inspect-python-package/issues/174
if: matrix.python-version == '3.11'
run: rm -r ${{ steps.build-paper-qa.outputs.dist }}
- run: uv sync
- run: uv run pylint src packages
- run: uv run refurb .
- uses: suzuki-shunsuke/github-action-renovate-config-validator@v2.1.0
test-src:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
python-version: [3.11, 3.13] # Our min and max supported Python versions
steps:
- uses: actions/checkout@v6
- uses: astral-sh/setup-uv@v7
with:
enable-cache: true
python-version: ${{ matrix.python-version }}
- run: uv sync
- name: Cache Docling models
id: cache-models
uses: actions/cache@v5
with:
path: &docling-cache-dir ~/.cache/docling
key: &docling-cache-key ${{ runner.os }}-docling-${{ hashFiles('uv.lock') }}
restore-keys: &docling-cache-restore-keys ${{ runner.os }}-docling-
- name: Pre-download Docling models # Avoid HuggingFace Hub requests during VCR cassette playback
if: steps.cache-models.outputs.cache-hit != 'true'
# RapidOCR is used for PDF pipeline's OCR, layout for layout analysis,
# tableformer for table structure
run: uv run docling-tools models download layout tableformer
- run: uv run pytest -n auto tests
env:
DOCLING_ARTIFACTS_PATH: &docling-artifacts-path ~/.cache/docling/models
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
SEMANTIC_SCHOLAR_API_KEY: ${{ secrets.SEMANTIC_SCHOLAR_API_KEY }}
CROSSREF_API_KEY: ${{ secrets.CROSSREF_API_KEY }}
NVIDIA_API_KEY: ${{ secrets.NVIDIA_API_KEY }}
test-packages:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
python-version: [3.12, 3.13] # Our min and max supported Python versions, skipping 3.11 to avoid https://github.com/BerriAI/litellm/issues/16518
steps:
- uses: actions/checkout@v6
- uses: astral-sh/setup-uv@v7
with:
enable-cache: true
python-version: ${{ matrix.python-version }}
- run: uv sync
- name: Cache Docling models
id: cache-models
uses: actions/cache@v5
with:
path: *docling-cache-dir
key: *docling-cache-key
restore-keys: *docling-cache-restore-keys
- name: Pre-download Docling models # Avoid CI race conditions in filesystem on model download
if: steps.cache-models.outputs.cache-hit != 'true'
# RapidOCR is used for PDF pipeline's OCR, layout for layout analysis,
# tableformer for table structure
run: uv run docling-tools models download rapidocr layout tableformer
- run: uv run pytest -n auto packages
env:
DOCLING_ARTIFACTS_PATH: *docling-artifacts-path # Work around https://github.com/docling-project/docling/issues/2500
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
SEMANTIC_SCHOLAR_API_KEY: ${{ secrets.SEMANTIC_SCHOLAR_API_KEY }}
CROSSREF_API_KEY: ${{ secrets.CROSSREF_API_KEY }}
NVIDIA_API_KEY: ${{ secrets.NVIDIA_API_KEY }}
================================================
FILE: .gitignore
================================================
# Swap
[._]*.s[a-v][a-z]
!*.svg # comment out if you don't need vector files
[._]*.sw[a-p]
[._]s[a-rt-v][a-z]
[._]ss[a-gi-z]
[._]sw[a-p]
# Session
Session.vim
Sessionx.vim
# Temporary
.netrwhist
*~
# Auto-generated tag files
tags
# Persistent undo
[._]*.un~
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/**/usage.statistics.xml
.idea/**/dictionaries
.idea/**/shelf
# AWS User-specific
.idea/**/aws.xml
# Generated files
.idea/**/contentModel.xml
# Sensitive or high-churn files
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
.idea/**/dbnavigator.xml
# Gradle
.idea/**/gradle.xml
.idea/**/libraries
# Gradle and Maven with auto-import
# When using Gradle or Maven with auto-import, you should exclude module files,
# since they will be recreated, and may cause churn. Uncomment if using
# auto-import.
# .idea/artifacts
# .idea/compiler.xml
# .idea/jarRepositories.xml
# .idea/modules.xml
# .idea/*.iml
# .idea/modules
# *.iml
# *.ipr
# CMake
cmake-build-*/
# Mongo Explorer plugin
.idea/**/mongoSettings.xml
# File-based project format
*.iws
# IntelliJ
out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Cursive Clojure plugin
.idea/replstate.xml
# SonarLint plugin
.idea/sonarlint/
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties
# Editor-based Rest Client
.idea/httpRequests
# Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
!.vscode/*.code-snippets
.vscode
# Local History for Visual Studio Code
.history/
# Built Visual Studio Code Extensions
*.vsix
# General
.DS_Store
.AppleDouble
.LSOverride
# Icon must end with two \r
Icon[\r]
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
cover/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
.pybuilder/
target/
# Jupyter Notebook
.ipynb_checkpoints
# IPython
profile_default/
ipython_config.py
# pyenv
# For a library or package, you might want to ignore these files since the code is
# intended to run in multiple environments; otherwise, check them in:
# .python-version
# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
#Pipfile.lock
# poetry
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
# This is especially recommended for binary packages to ensure reproducibility, and is more
# commonly ignored for libraries.
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
#poetry.lock
# pdm
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
#pdm.lock
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
# in version control.
# https://pdm.fming.dev/latest/usage/project/#working-with-version-control
.pdm.toml
.pdm-python
.pdm-build/
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
__pypackages__/
# Celery stuff
celerybeat-schedule
celerybeat.pid
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Data directories
data/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
# pytype static type analyzer
.pytype/
# Cython debug symbols
cython_debug/
# PyCharm
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
.idea/
# Version files made by setuptools_scm
**/version.py
# Tests
tests/*txt
tests/*html
tests/test_index/*
tests/example.*
tests/example2.*
!tests/stub_data/.DS_Store
# Client data
src/paperqa/clients/client_data/retractions.csv
================================================
FILE: .mailmap
================================================
Andrew White <andrew@futurehouse.org> <white.d.andrew@gmail.com>
Ahmet Celebi <59479833+AmT42@users.noreply.github.com> At4 <59479833+AmT42@users.noreply.github.com>
Anush008 <anushshetty90@gmail.com> Anush <anushshetty90@gmail.com>
Dmitrii Magas <eamagea123@gmail.com> eamag
Geemi Wellawatte <geemi@futurehouse.org> <gwellawatte@gmail.com>
Geemi Wellawatte <geemi@futurehouse.org> <49410838+geemi725@users.noreply.github.com>
Harry Vu <harry@futurehouse.org> <harryvu-futurehouse@users.noreply.github.com>
Harry Vu <harry@futurehouse.org> harryvu-futurehouse
James Braza <james@futurehouse.org> <jamesbraza@gmail.com>
Mayk Caldas <mayk@futurehouse.org> maykcaldas
Mayk Caldas <mayk@futurehouse.org> <maykcaldas@gmail.com>
Michael Skarlinski <mskarlinski@futurehouse.org> mskarlin <12701035+mskarlin@users.noreply.github.com>
Odhran O'Donoghue <odhran.r.odonoghue@gmail.com> odhran-o-d <odhran.r.odonoghue@gmail.com>
Odhran O'Donoghue <odhran.r.odonoghue@gmail.com> <39832722+odhran-o-d@users.noreply.github.com>
Samantha Cox <samc@futurehouse.org> <swrig30@ur.rochester.edu>
takeru fukushima <takeru.f.2004@gmail.com><100330935+takeruhukushima@users.noreply.github.com>
================================================
FILE: .pre-commit-config.yaml
================================================
default_language_version:
python: python3
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v6.0.0
hooks:
- id: check-added-large-files
exclude: |
(?x)^(
packages/paper-qa-nemotron/tests/cassettes.*|
src/paperqa/clients/client_data.*|
tests/stub_data.*|
tests/cassettes.*|
uv\.lock
)$
- id: check-case-conflict
- id: check-merge-conflict
- id: check-shebang-scripts-are-executable
- id: check-symlinks
- id: check-toml
- id: check-yaml
- id: debug-statements
- id: detect-private-key
- id: end-of-file-fixer
- id: fix-byte-order-marker
- id: mixed-line-ending
- id: trailing-whitespace
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.14.4
hooks:
- id: ruff-check
args: [--fix, --exit-non-zero-on-fix]
- repo: https://github.com/psf/black-pre-commit-mirror
rev: 26.1.0
hooks:
- id: black-jupyter
- repo: https://github.com/rbubley/mirrors-prettier
rev: v3.6.2
hooks:
- id: prettier
exclude: ^docs/.*\.md$
- repo: https://github.com/pappasam/toml-sort
rev: v0.24.3
hooks:
- id: toml-sort-fix
- repo: https://github.com/codespell-project/codespell
rev: v2.4.1
hooks:
- id: codespell
additional_dependencies: [".[toml]"]
- repo: https://github.com/crate-ci/typos
rev: v1.39.0
hooks:
- id: typos
- repo: https://github.com/jumanjihouse/pre-commit-hooks
rev: 3.0.0
hooks:
- id: check-mailmap
- repo: https://github.com/henryiii/validate-pyproject-schema-store
rev: 2025.11.04
hooks:
- id: validate-pyproject
- repo: https://github.com/astral-sh/uv-pre-commit
rev: 0.9.8
hooks:
- id: uv-lock
- repo: https://github.com/adamchainz/blacken-docs
rev: 1.20.0
hooks:
- id: blacken-docs
exclude: \.md$ # The generated markdown files are being blackened by jupytext
- repo: https://github.com/srstevenson/nb-clean
rev: 4.0.1
hooks:
- id: nb-clean
args: [--preserve-cell-outputs, --remove-empty-cells]
- repo: https://github.com/jackdewinter/pymarkdown
rev: v0.9.33
hooks:
- id: pymarkdown
exclude: docs/tutorials/
- repo: https://github.com/mwouts/jupytext
rev: v1.18.1
hooks:
- id: jupytext
# SEE: https://github.com/mwouts/jupytext/issues/1467
args: [--to, md, --pipe-fmt, ipynb, --pipe, "black {}"]
additional_dependencies: [black]
files: ^docs/.*\.ipynb$
- repo: https://github.com/jsh9/markdown-toc-creator
rev: 0.1.3
hooks:
- id: markdown-toc-creator
- repo: local # Use local so we can inspect paperqa.version
hooks:
- id: mypy
name: mypy
entry: uv run --frozen mypy # Use --frozen to avoid mutating local venv
language: system
types_or: [python, pyi]
================================================
FILE: .python-version
================================================
3.13
================================================
FILE: CITATION.cff
================================================
---
cff-version: 1.2.0
message: >-
If you use this software, please cite it using the
metadata from this file.
authors:
- family-names: Skarlinski
given-names: Michael D.
- family-names: Cox
given-names: Sam
- family-names: Laurent
given-names: Jon M.
- family-names: Braza
given-names: James D.
- family-names: Hinks
given-names: Michaela
- family-names: Hammerling
given-names: Michael J.
- family-names: Ponnapati
given-names: Manvitha
- family-names: Rodriques
given-names: Samuel G.
- family-names: White
given-names: Andrew D.
title: "Language agents achieve superhuman synthesis of scientific knowledge"
identifiers:
- type: doi
value: 10.48550/arXiv.2409.13740
description: ArXiv DOI
- type: url
value: https://arxiv.org/abs/2409.13740
description: ArXiv abstract
repository-code: https://github.com/Future-House/paper-qa
keywords:
- Artificial Intelligence
- Computation and Language
- Machine Learning
license: Apache-2.0
preferred-citation:
authors:
- family-names: Skarlinski
given-names: Michael D.
- family-names: Cox
given-names: Sam
- family-names: Laurent
given-names: Jon M.
- family-names: Braza
given-names: James D.
- family-names: Hinks
given-names: Michaela
- family-names: Hammerling
given-names: Michael J.
- family-names: Ponnapati
given-names: Manvitha
- family-names: Rodriques
given-names: Samuel G.
- family-names: White
given-names: Andrew D.
date-published: 2024-09-10
doi: 10.48550/arXiv.2409.13740
journal: preprint
title: "Language agents achieve superhuman synthesis of scientific knowledge"
type: article
url: https://arxiv.org/abs/2409.13740
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to PaperQA
Thank you for your interest in contributing to PaperQA!
Here are some guidelines to help you get started.
## Setting up the development environment
We use [`uv`](https://github.com/astral-sh/uv) for our local development.
1. Install `uv` by following the instructions on the [uv website](https://astral.sh/uv/).
2. Run the following command to install all dependencies and set up the development environment:
```bash
uv sync
```
## Installing the package for development
If you prefer to use `pip` for installing the package in development mode, you can do so by running:
```bash
pip install -e ".[dev]"
```
Where the `dev` extra includes development dependencies such as `pytest`.
## Running tests and other tooling
Use the following commands:
- Run tests (requires an OpenAI key in your environment)
```bash
pytest
# or for multiprocessing based parallelism
pytest -n auto
```
- Run `pre-commit` for formatting and type checking
```bash
pre-commit run --all-files
```
- Run `mypy`, `refurb`, or `pylint` directly:
```bash
mypy paperqa
# or
refurb paperqa
# or
pylint paperqa
```
See our GitHub Actions [`tests.yml`](.github/workflows/tests.yml) for further reference.
## Using `pytest-recording` and VCR cassettes
We use the [`pytest-recording`](https://github.com/kiwicom/pytest-recording) plugin
to create VCR cassettes to cache HTTP requests,
making our unit tests more deterministic.
To record a new VCR cassette:
```bash
uv run pytest --record-mode=once tests/desired_test_module.py
```
And the new cassette(s) should appear in [`tests/cassettes`](tests/cassettes).
Our configuration for `pytest-recording` can be found in [`tests/conftest.py`](tests/conftest.py).
This includes header removals (e.g. OpenAI `authorization` key)
from responses to ensure sensitive information is excluded from the cassettes.
Please ensure cassettes are less than 1 MB
to keep tests loading quickly.
Happy coding!
================================================
FILE: LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright 2024 FutureHouse
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: README.md
================================================
# PaperQA2
<!-- pyml disable-num-lines 6 line-length -->
[](https://github.com/Future-House/paper-qa)
[](https://badge.fury.io/py/paper-qa)
[](https://github.com/Future-House/paper-qa)


PaperQA2 is a package for doing high-accuracy retrieval augmented generation (RAG) on PDFs, text files, Microsoft Office documents, and source code files,
with a focus on the scientific literature.
See our [recent 2024 paper](https://paper.wikicrow.ai)
to see examples of PaperQA2's superhuman performance in scientific tasks like
question answering, summarization, and contradiction detection.
<!--TOC-->
---
**Table of Contents**
- [Quickstart](#quickstart)
- [Example Output](#example-output)
- [What is PaperQA2](#what-is-paperqa2)
- [PaperQA2 vs PaperQA](#paperqa2-vs-paperqa)
- [PaperQA2 Goes CalVer in December 2025](#paperqa2-goes-calver-in-december-2025)
- [What's New in Version 5 (aka PaperQA2)?](#whats-new-in-version-5-aka-paperqa2)
- [What's New in December 2025?](#whats-new-in-december-2025)
- [PaperQA2 Algorithm](#paperqa2-algorithm)
- [Installation](#installation)
- [CLI Usage](#cli-usage)
- [Bundled Settings](#bundled-settings)
- [Rate Limits](#rate-limits)
- [Library Usage](#library-usage)
- [Agentic Adding/Querying Documents](#agentic-addingquerying-documents)
- [Manual (No Agent) Adding/Querying Documents](#manual-no-agent-addingquerying-documents)
- [Async](#async)
- [Choosing Model](#choosing-model)
- [Locally Hosted](#locally-hosted)
- [Embedding Model](#embedding-model)
- [Specifying the Embedding Model](#specifying-the-embedding-model)
- [Local Embedding Models (Sentence Transformers)](#local-embedding-models-sentence-transformers)
- [Adjusting number of sources](#adjusting-number-of-sources)
- [Using Code or HTML](#using-code-or-html)
- [Multimodal Support](#multimodal-support)
- [Using External DB/Vector DB and Caching](#using-external-dbvector-db-and-caching)
- [Creating Index](#creating-index)
- [Manifest Files](#manifest-files)
- [Reusing Index](#reusing-index)
- [Using Clients Directly](#using-clients-directly)
- [Settings Cheatsheet](#settings-cheatsheet)
- [Where do I get papers?](#where-do-i-get-papers)
- [Callbacks](#callbacks)
- [Caching Embeddings](#caching-embeddings)
- [Customizing Prompts](#customizing-prompts)
- [Pre and Post Prompts](#pre-and-post-prompts)
- [FAQ](#faq)
- [How come I get different results than your papers?](#how-come-i-get-different-results-than-your-papers)
- [How is this different from LlamaIndex or LangChain?](#how-is-this-different-from-llamaindex-or-langchain)
- [Can I save or load?](#can-i-save-or-load)
- [Reproduction](#reproduction)
- [Citation](#citation)
---
<!--TOC-->
## Quickstart
In this example we take a folder of research paper PDFs,
magically get their metadata - including citation counts with a retraction check,
then parse and cache PDFs into a full-text search index,
and finally answer the user question with an LLM agent.
```bash
pip install paper-qa
mkdir my_papers
curl -o my_papers/PaperQA2.pdf https://arxiv.org/pdf/2409.13740
cd my_papers
pqa ask 'What is PaperQA2?'
```
### Example Output
Question: Has anyone designed neural networks that compute with proteins or DNA?
> The claim that neural networks have been designed to compute with DNA is supported by multiple sources.
> The work by Qian, Winfree, and Bruck demonstrates the use of DNA strand displacement cascades
> to construct neural network components, such as artificial neurons and associative memories,
> using a DNA-based system (Qian2011Neural pages 1-2, Qian2011Neural pages 15-16, Qian2011Neural pages 54-56).
> This research includes the implementation of a 3-bit XOR gate and a four-neuron Hopfield associative memory,
> showcasing the potential of DNA for neural network computation.
> Additionally, the application of deep learning techniques to genomics,
> which involves computing with DNA sequences, is well-documented.
> Studies have applied convolutional neural networks (CNNs) to predict genomic features such as
> transcription factor binding and DNA accessibility (Eraslan2019Deep pages 4-5, Eraslan2019Deep pages 5-6).
> These models leverage DNA sequences as input data,
> effectively using neural networks to compute with DNA.
> While the provided excerpts do not explicitly mention protein-based neural network computation,
> they do highlight the use of neural networks in tasks related to protein sequences,
> such as predicting DNA-protein binding (Zeng2016Convolutional pages 1-2).
> However, the primary focus remains on DNA-based computation.
## What is PaperQA2
PaperQA2 is engineered to be the best agentic RAG model for working with scientific papers.
Here are some features:
- A simple interface to get good answers with grounded responses containing in-text citations.
- State-of-the-art implementation including document metadata-awareness
in embeddings and LLM-based re-ranking and contextual summarization (RCS).
- Support for agentic RAG, where a language agent can iteratively refine queries and answers.
- Automatic redundant fetching of paper metadata,
including citation and journal quality data from multiple providers.
- A usable full-text search engine for a local repository of PDF/text files.
- A robust interface for customization, with default support for all [LiteLLM][LiteLLM providers] models.
[LiteLLM providers]: https://docs.litellm.ai/docs/providers
[LiteLLM general docs]: https://docs.litellm.ai/docs/
By default, it uses [OpenAI embeddings](https://platform.openai.com/docs/guides/embeddings)
and [models](https://platform.openai.com/docs/models) with a Numpy vector DB to embed and search documents.
However, you can easily use other closed-source, open-source models or embeddings (see details below).
PaperQA2 depends on some awesome libraries/APIs that make our repo possible.
Here are some in no particular order:
1. [Semantic Scholar](https://www.semanticscholar.org/)
2. [Crossref](https://www.crossref.org/)
3. [Unpaywall](https://unpaywall.org/)
4. [Pydantic](https://docs.pydantic.dev/latest/)
5. [tantivy](https://github.com/quickwit-oss/tantivy)
6. [LiteLLM][LiteLLM general docs]
7. [pybtex](https://pybtex.org/)
### PaperQA2 vs PaperQA
We've been working hard on fundamental upgrades for a while
and mostly followed [SemVer](https://semver.org/), until [December 2025](#paperqa2-goes-calver-in-december-2025).
Meaning we've incremented the major version number on each breaking change.
This brings us to the current major version number v5.
So why call is the repo now called PaperQA2?
We wanted to remark on the fact though that we've
exceeded human performance on [many important metrics](https://paper.wikicrow.ai).
So we arbitrarily call version 5 and onward PaperQA2,
and versions before it as PaperQA1 to denote the significant change in performance.
We recognize that we are challenged at naming and counting at FutureHouse,
so we reserve the right at any time to arbitrarily change the name to PaperCrow.
### PaperQA2 Goes CalVer in December 2025
Prior to December 2025 we used [semantic versioning](https://semver.org/).
This eventually led to confusion in two ways:
1. Developers: should we major version bump based on
settings or fundamental system capabilities?
What if a bug fix requires breaking changes to the agent's behaviors?
2. Speaking: should one use terminology from our publications
(e.g. [PaperQA1](https://arxiv.org/abs/2312.07559),
[PaperQA2](https://arxiv.org/abs/2409.13740))
or the Git tags (e.g. v5) from this repo/package?
When someone says "PaperQA" -- what version do they mean?
To resolve these confusions, in December 2025,
we moved to [calendar versioning](https://calver.org/).
The developer burden is diminished because
we're basically removing guarantees of backwards compatibility across releases
(as CalVer is [ZeroVer](https://0ver.org/) bound to dates).
It solves the "speaking" issue because Git tags are now
quite different from publication terminology (e.g. PaperQA2 vs `v2025.12.17`).
When someone says "PaperQA" it will just refer to the system,
not a particular snapshot of agentic behaviors.
When someone says "PaperQA2" it will refer to `paper-qa>=5`,
which applies to both SemVer tags `v5.0.0` and the new CalVer tags `v2025.12.17`.
This switch is backwards compatible for version 5's SemVer,
as the year 2025 is strictly greater than major version 5.
### What's New in Version 5 (aka PaperQA2)?
Version 5 added:
- A CLI `pqa`
- Agentic workflows invoking tools for
paper search, gathering evidence, and generating an answer
- Removed much of the statefulness from the `Docs` object
- A migration to LiteLLM for compatibility with many LLM providers
as well as centralized rate limits and cost tracking
- A bundled set of configurations (read [this section here](#bundled-settings)))
containing known-good hyperparameters
Note that `Docs` objects pickled from prior versions of `PaperQA` are incompatible with version 5,
and will need to be rebuilt.
Also, our minimum Python version was increased to Python 3.11.
### What's New in December 2025?
The last four months since version `5.29.1` have seen many changes:
- New modalities: tables, figures, non-English languages, math equations
- More and better readers
- Two new _model-based_ PDF readers: [Docling](packages/paper-qa-docling)
and [Nvidia nemotron-parse](packages/paper-qa-nemotron)
- All PDF readers now can parse images and tables, report page numbers,
support DPI
- A reader for Microsoft Office data types
- Multimodal contextual summarization
- Media objects are also passed to the `summary_llm` during creation
- Media objects' embedding space is enhanced using an `enrichment_llm` prompt
- Simpler and performant HTTP stack
- Consolidation from `aiohttp` and `httpx` to just `httpx`
- Integration with [`httpx-aiohttp`](https://github.com/karpetrosyan/httpx-aiohttp) for performance
- `Context` relevance is simplified and some assumptions were removed
- Many minor features such as
retrying `Context` creation upon invalid JSON,
compatibility with fall 2025's frontier LLMs,
and improved prompt templates
- Multiple fixes in metadata processing via Semantic Scholar and OpenAlex,
and metadata processing
(e.g. incorrectly inferring identical document IDs for main text and SI)
- Completed the deprecations accrued over the past year
### PaperQA2 Algorithm
To understand PaperQA2, let's start with the pieces of the underlying algorithm.
The default workflow of PaperQA2 is as follows:
| Phase | PaperQA2 Actions |
| ---------------------- | ------------------------------------------------------------------------- |
| **1. Paper Search** | - Get candidate papers from LLM-generated keyword query |
| | - Chunk, embed, and add candidate papers to state |
| **2. Gather Evidence** | - Embed query into vector |
| | - Rank top _k_ document chunks in current state |
| | - Create scored summary of each chunk in the context of the current query |
| | - Use LLM to re-score and select most relevant summaries |
| **3. Generate Answer** | - Put best summaries into prompt with context |
| | - Generate answer with prompt |
The tools can be invoked in any order by a language agent.
For example, an LLM agent might do a narrow and broad search,
or using different phrasing for the gather evidence step from the generate answer step.
## Installation
For a non-development setup,
install PaperQA2 (aka version 5) from [PyPI](https://pypi.org/project/paper-qa/).
Note version 5 requires Python 3.11+.
```bash
pip install paper-qa>=5
```
For development setup,
please refer to the [CONTRIBUTING.md](CONTRIBUTING.md) file.
PaperQA2 uses an LLM to operate,
so you'll need to either set an appropriate [API key environment variable][LiteLLM providers]
(i.e. `export OPENAI_API_KEY=sk-...`)
or set up an open source LLM server (i.e. using [llamafile](https://github.com/Mozilla-Ocho/llamafile).
Any LiteLLM compatible model can be configured to use with PaperQA2.
If you need to index a large set of papers (100+),
you will likely want an API key for both
[Crossref](https://www.crossref.org/documentation/metadata-plus/metadata-plus-keys/)
and [Semantic Scholar](https://www.semanticscholar.org/product/api#api-key),
which will allow you to avoid hitting public rate limits using these metadata services.
Those can be exported as `CROSSREF_API_KEY` and `SEMANTIC_SCHOLAR_API_KEY` variables.
## CLI Usage
The fastest way to test PaperQA2 is via the CLI. First navigate to a directory with some papers and use the `pqa` cli:
```bash
pqa ask 'What is PaperQA2?'
```
You will see PaperQA2 index your local PDF files,
gathering the necessary metadata for each of them
(using [Crossref](https://www.crossref.org/) and [Semantic Scholar](https://www.semanticscholar.org/)),
search over that index, then break the files into chunked evidence contexts,
rank them, and ultimately generate an answer.
The next time this directory is queried,
your index will already be built (save for any differences detected, like new added papers),
so it will skip the indexing and chunking steps.
All prior answers will be indexed and stored,
you can view them by querying via the `search` subcommand,
or access them yourself in your `PQA_HOME` directory,
which defaults to `~/.pqa/`.
```bash
pqa -i 'answers' search 'ranking and contextual summarization'
```
PaperQA2 is highly configurable, when running from the command line,
`pqa --help` shows all options and short descriptions.
For example to run with a higher temperature:
```bash
pqa --temperature 0.5 ask 'What is PaperQA2?'
```
You can view all settings with `pqa view`.
Another useful thing is to change to other templated settings - for example
`fast` is a setting that answers more quickly
and you can see it with `pqa -s fast view`
Maybe you have some new settings you want to save? You can do that with
```bash
pqa -s my_new_settings --temperature 0.5 --llm foo-bar-5 save
```
and then you can use it with
```bash
pqa -s my_new_settings ask 'What is PaperQA2?'
```
If you run `pqa` with a command which requires a new indexing,
say if you change the default chunk_size,
a new index will automatically be created for you.
```bash
pqa --parsing.chunk_size 5000 ask 'What is PaperQA2?'
```
You can also use `pqa` to do full-text search with use of LLMs view the search command.
For example, let's save the index from a directory and give it a name:
```bash
pqa -i nanomaterials index
```
Now I can search for papers about thermoelectrics:
```bash
pqa -i nanomaterials search thermoelectrics
```
or I can use the normal ask
```bash
pqa -i nanomaterials ask 'Are there nm scale features in thermoelectric materials?'
```
Both the CLI and module have pre-configured settings based on prior performance and our publications,
they can be invoked as follows:
```bash
pqa --settings <setting name> \
ask 'Are there nm scale features in thermoelectric materials?'
```
### Bundled Settings
Inside [`src/paperqa/configs`](src/paperqa/configs) we bundle known useful settings:
| Setting Name | Description |
| ------------ | ---------------------------------------------------------------------------------------------------------------------------- |
| high_quality | Highly performant, relatively expensive (due to having `evidence_k` = 15) query using a `ToolSelector` agent. |
| fast | Setting to get answers cheaply and quickly. |
| wikicrow | Setting to emulate the Wikipedia article writing used in our WikiCrow publication. |
| contracrow | Setting to find contradictions in papers, your query should be a claim that needs to be flagged as a contradiction (or not). |
| debug | Setting useful solely for debugging, but not in any actual application beyond debugging. |
| tier1_limits | Settings that match OpenAI rate limits for each tier, you can use `tier<1-5>_limits` to specify the tier. |
### Rate Limits
If you are hitting rate limits, say with the OpenAI Tier 1 plan, you can add them into PaperQA2.
For each OpenAI tier, a pre-built setting exists to limit usage.
```bash
pqa --settings 'tier1_limits' ask 'What is PaperQA2?'
```
This will limit your system to use the [tier1_limits](src/paperqa/configs/tier1_limits.json),
and slow down your queries to accommodate.
You can also specify them manually with any rate limit string that matches the specification in
the [limits](https://limits.readthedocs.io/en/stable/quickstart.html#rate-limit-string-notation) module:
```bash
pqa --summary_llm_config '{"rate_limit": {"gpt-4o-2024-11-20": "30000 per 1 minute"}}' \
ask 'What is PaperQA2?'
```
Or by adding into a `Settings` object, if calling imperatively:
```python
from paperqa import Settings, ask
answer_response = ask(
"What is PaperQA2?",
settings=Settings(
llm_config={"rate_limit": {"gpt-4o-2024-11-20": "30000 per 1 minute"}},
summary_llm_config={"rate_limit": {"gpt-4o-2024-11-20": "30000 per 1 minute"}},
),
)
```
## Library Usage
PaperQA2's full workflow can be accessed via Python directly:
```python
from paperqa import Settings, ask
answer_response = ask(
"What is PaperQA2?",
settings=Settings(temperature=0.5, paper_directory="my_papers"),
)
```
Please see our [installation docs](#installation) for how to install the package from PyPI.
### Agentic Adding/Querying Documents
The answer object has the following attributes:
`formatted_answer`, `answer` (answer alone), `question` , and `context` (the summaries of passages found for answer).
`ask` will use the `SearchPapers` tool, which will query a local index of files,
you can specify this location via the `Settings` object:
```python
from paperqa import Settings, ask
answer_response = ask(
"What is PaperQA2?",
settings=Settings(
temperature=0.5, agent={"index": {"paper_directory": "my_papers"}}
),
)
```
`ask` is just a convenience wrapper around the real entrypoint,
which can be accessed if you'd like to run concurrent asynchronous workloads:
```python
from paperqa import Settings, agent_query
answer_response = await agent_query(
query="What is PaperQA2?",
settings=Settings(
temperature=0.5, agent={"index": {"paper_directory": "my_papers"}}
),
)
```
The default agent will use an LLM based agent,
but you can also specify a `"fake"` agent to use a hard coded call path of
search -> gather evidence -> answer to reduce token usage.
### Manual (No Agent) Adding/Querying Documents
Normally via agent execution, the agent invokes the search tool,
which adds documents to the `Docs` object for you behind the scenes.
However, if you prefer fine-grained control,
you can directly interact with the `Docs` object.
Note that manually adding and querying `Docs` does not impact performance.
It just removes the automation associated with an agent picking the documents to add.
```python
from paperqa import Docs, Settings
# valid extensions include .pdf, .txt, .md, .html, .docx, .xlsx, .pptx, and code files (e.g., .py, .ts, .yaml)
doc_paths = ("myfile.pdf", "myotherfile.pdf")
# Prepare the Docs object by adding a bunch of documents
docs = Docs()
for doc_path in doc_paths:
await docs.aadd(doc_path)
# Set up how we want to query the Docs object
settings = Settings()
settings.llm = "claude-3-5-sonnet-20240620"
settings.answer.answer_max_sources = 3
# Query the Docs object to get an answer
session = await docs.aquery("What is PaperQA2?", settings=settings)
print(session)
```
### Async
PaperQA2 is written to be used asynchronously.
The synchronous API is just a wrapper around the async.
Here are the methods and their `async` equivalents:
| Sync | Async |
| ------------------- | -------------------- |
| `Docs.add` | `Docs.aadd` |
| `Docs.add_file` | `Docs.aadd_file` |
| `Docs.add_url` | `Docs.aadd_url` |
| `Docs.get_evidence` | `Docs.aget_evidence` |
| `Docs.query` | `Docs.aquery` |
The synchronous version just calls the async version in a loop.
Most modern python environments support `async` natively (including Jupyter notebooks!).
So you can do this in a Jupyter Notebook:
```python
import asyncio
from paperqa import Docs
async def main() -> None:
docs = Docs()
# valid extensions include .pdf, .txt, .md, .html, .docx, .xlsx, .pptx, and code files (e.g., .py, .ts, .yaml)
for doc in ("myfile.pdf", "myotherfile.pdf"):
await docs.aadd(doc)
session = await docs.aquery("What is PaperQA2?")
print(session)
asyncio.run(main())
```
### Choosing Model
By default, PaperQA2 uses OpenAI's `gpt-4o-2024-11-20` model for the
`summary_llm`, `llm`, and `agent_llm`.
Please see the [Settings Cheatsheet](#settings-cheatsheet)
for more information on these settings.
PaperQA2 also defaults to using OpenAI's `text-embedding-3-small` model for the `embedding` setting.
If you don't have an OpenAI API key, you can use a different embedding model.
More information about embedding models can be found [in the "Embedding Model" section](#embedding-model).
We use the [`lmi`](https://github.com/Future-House/ldp/tree/main/packages/lmi) package for our LLM interface,
which in turn uses `litellm` to support many LLM providers.
You can adjust this easily to use any model supported by `litellm`:
```python
from paperqa import Settings, ask
answer_response = ask(
"What is PaperQA2?",
settings=Settings(
llm="gpt-4o-mini", summary_llm="gpt-4o-mini", agent={"index": {"paper_directory": "my_papers"}}
),
)
```
To use Claude, make sure you set the `ANTHROPIC_API_KEY` environment variable.
In this example, we also use a different embedding model.
Please make sure to `pip install paper-qa[local]` to use a local embedding model.
```python
from paperqa import Settings, ask
from paperqa.settings import AgentSettings
answer_response = ask(
"What is PaperQA2?",
settings=Settings(
llm="claude-3-5-sonnet-20240620",
summary_llm="claude-3-5-sonnet-20240620",
agent=AgentSettings(agent_llm="claude-3-5-sonnet-20240620"),
# SEE: https://huggingface.co/sentence-transformers/multi-qa-MiniLM-L6-cos-v1
embedding="st-multi-qa-MiniLM-L6-cos-v1",
),
)
```
Or Gemini, by setting the `GEMINI_API_KEY` from Google AI Studio
```python
from paperqa import Settings, ask
from paperqa.settings import AgentSettings
answer_response = ask(
"What is PaperQA2?",
settings=Settings(
llm="gemini/gemini-2.0-flash",
summary_llm="gemini/gemini-2.0-flash",
agent=AgentSettings(agent_llm="gemini/gemini-2.0-flash"),
embedding="gemini/text-embedding-004",
),
)
```
#### Locally Hosted
You can use llama.cpp to be the LLM.
Note that you should be using relatively large models,
because PaperQA2 requires following a lot of instructions.
You won't get good performance with 7B models.
The easiest way to get set-up is to download a [llama file](https://github.com/Mozilla-Ocho/llamafile)
and execute it with `-cb -np 4 -a my-llm-model --embedding`
which will enable continuous batching and embeddings.
```python
from paperqa import Settings, ask
local_llm_config = dict(
model_list=[
dict(
model_name="my_llm_model",
litellm_params=dict(
model="my-llm-model",
api_base="http://localhost:8080/v1",
api_key="sk-no-key-required",
temperature=0.1,
frequency_penalty=1.5,
max_tokens=512,
),
)
]
)
answer_response = ask(
"What is PaperQA2?",
settings=Settings(
llm="my-llm-model",
llm_config=local_llm_config,
summary_llm="my-llm-model",
summary_llm_config=local_llm_config,
),
)
```
Models hosted with `ollama` are also supported.
To run the example below make sure you have downloaded llama3.2 and mxbai-embed-large via ollama.
```python
from paperqa import Settings, ask
local_llm_config = {
"model_list": [
{
"model_name": "ollama/llama3.2",
"litellm_params": {
"model": "ollama/llama3.2",
"api_base": "http://localhost:11434",
},
}
]
}
answer_response = ask(
"What is PaperQA2?",
settings=Settings(
llm="ollama/llama3.2",
llm_config=local_llm_config,
summary_llm="ollama/llama3.2",
summary_llm_config=local_llm_config,
embedding="ollama/mxbai-embed-large",
),
)
```
### Embedding Model
Embeddings are used to retrieve k texts (where k is specified via `Settings.answer.evidence_k`)
for re-ranking and contextual summarization.
If you don't want to use embeddings, but instead just fetch all chunks,
disable "evidence retrieval" via the `Settings.answer.evidence_retrieval` setting.
PaperQA2 defaults to using OpenAI (`text-embedding-3-small`) embeddings,
but has flexible options for both vector stores and embedding choices.
#### Specifying the Embedding Model
The simplest way to specify the embedding model is via `Settings.embedding`:
```python
from paperqa import Settings, ask
answer_response = ask(
"What is PaperQA2?",
settings=Settings(embedding="text-embedding-3-large"),
)
```
`embedding` accepts any embedding model name supported by litellm.
PaperQA2 also supports an embedding input of `"hybrid-<model_name>"`
i.e. `"hybrid-text-embedding-3-small"` to use a hybrid sparse keyword (based on a token modulo embedding)
and dense vector embedding, where any litellm model can be used in the dense model name.
`"sparse"` can be used to use a sparse keyword embedding only.
Embedding models are used to create PaperQA2's index of the full-text embedding vectors (`texts_index` argument).
The embedding model can be specified as a setting when you are adding new papers to the `Docs` object:
```python
from paperqa import Docs, Settings
docs = Docs()
for doc in ("myfile.pdf", "myotherfile.pdf"):
await docs.aadd(doc, settings=Settings(embedding="text-embedding-large-3"))
```
Note that PaperQA2 uses Numpy as a dense vector store.
Its design of using a keyword search initially reduces the number of chunks
needed for each answer to a relatively small number < 1k.
Therefore, `NumpyVectorStore` is a good place to start, it's a simple in-memory store, without an index.
However, if a larger-than-memory vector store is needed,
you can an external vector database like [Qdrant](https://qdrant.tech/) via the `QdrantVectorStore` class.
The hybrid embeddings can be customized:
```python
from paperqa import (
Docs,
HybridEmbeddingModel,
SparseEmbeddingModel,
LiteLLMEmbeddingModel,
)
model = HybridEmbeddingModel(
models=[LiteLLMEmbeddingModel(), SparseEmbeddingModel(ndim=1024)]
)
docs = Docs()
for doc in ("myfile.pdf", "myotherfile.pdf"):
await docs.aadd(doc, embedding_model=model)
```
The sparse embedding (keyword) models default to having 256 dimensions,
but this can be specified via the `ndim` argument.
#### Local Embedding Models (Sentence Transformers)
You can use a `SentenceTransformerEmbeddingModel` model if you install `sentence-transformers`,
which is [a local embedding library](https://sbert.net/) with support for HuggingFace models and more.
You can install it by adding the `local` extras.
```sh
pip install paper-qa[local]
```
and then prefix embedding model names with `st-`:
```python
from paperqa import Settings, ask
answer_response = ask(
"What is PaperQA2?",
settings=Settings(embedding="st-multi-qa-MiniLM-L6-cos-v1"),
)
```
or with a hybrid model
```python
from paperqa import Settings, ask
answer_response = ask(
"What is PaperQA2?",
settings=Settings(embedding="hybrid-st-multi-qa-MiniLM-L6-cos-v1"),
)
```
### Adjusting number of sources
You can adjust the numbers of sources (passages of text) to reduce token usage or add more context.
`k` refers to the top k most relevant and diverse (may from different sources) passages.
Each passage is sent to the LLM to summarize, or determine if it is irrelevant.
After this step, a limit of `max_sources` is applied so that the final answer can fit into the LLM context window.
Thus, `k` > `max_sources` and `max_sources` is the number of sources used in the final answer.
```python
from paperqa import Settings
settings = Settings()
settings.answer.answer_max_sources = 3
settings.answer.evidence_k = 5
await docs.aquery(
"What is PaperQA2?",
settings=settings,
)
```
### Using Code or HTML
You do not need to use papers -- you can use code or raw HTML.
Note that this tool is focused on answering questions,
so it won't do well at writing code.
One note is that the tool cannot infer citations from code,
so you will need to provide them yourself.
```python
import glob
import os
from paperqa import Docs
source_files = glob.glob("**/*.js")
docs = Docs()
for f in source_files:
# this assumes the file names are unique in code
await docs.aadd(
f, citation="File " + os.path.basename(f), docname=os.path.basename(f)
)
session = await docs.aquery("Where is the search bar in the header defined?")
print(session)
```
### Multimodal Support
Multimodal support centers on:
- Standalone images
- Images or tables in PDFs
The `Docs` object stores media via a `ParsedMedia` object.
When chunking a document, media are not split at chunk boundaries,
so it's possible 2+ chunks can correspond with the same media.
This means within PaperQA each chunk
has a one-to-many relationship between `ParsedMedia` and chunks.
Depending on the source document, the same image can appear multiple times
(e.g. each page of a PDF has a logo in the margins).
Thus, clients should consider media databases
to have a many-to-many relationship with chunks.
Since PaperQA's evidence gathering process centers on text-based retrieval,
it's possible relevant image(s) or table(s) aren't retrieved
because their associated text content is irrelevant.
For a concrete example, imagine the figure in a paper has a terse caption
and is placed one page after relevant main-text discussion.
To solve this problem, PaperQA supports media enrichment at document read-time.
Basically after reading in the PDF,
the `parsing.enrichment_llm` is given the `parsing.enrichment_prompt`
and co-located text to generate a synthetic caption for every image/table.
The synthetic captions are used to shift the embeddings of each text chunk,
but are kept separate from the actual source text.
This way evidence gathering can fetch relevant images/tables
without risk of polluting contextual summaries with LLM-generated captions.
If you want multimodal PDF reading, but do not want enrichment
(since adds one LLM prompt/media at read-time),
enrichment can be disabled by setting `parsing.multimodal` to `ON_WITHOUT_ENRICHMENT`.
When creating contextual summaries on a given chunk (a `Text`),
the summary LLM is passed both the chunk's text and the chunk's associated media,
but the output contextual summary itself remains text-only.
If you would like,
specifying the prompt `paperqa.prompts.summary_json_multimodal_system_prompt`
to the setting `prompt.summary_json_system`
will include a `used_images` flag attributing
usage of images in any contextual summarizations.
### Using External DB/Vector DB and Caching
You may want to cache parsed texts and embeddings in an external database or file.
You can then build a Docs object from those directly:
```python
from paperqa import Docs, Doc, Text
docs = Docs()
for ... in my_docs:
doc = Doc(docname=..., citation=..., dockey=..., citation=...)
texts = [Text(text=..., name=..., doc=doc) for ... in my_texts]
docs.add_texts(texts, doc)
```
### Creating Index
Indexes will be placed in the [home directory][home dir] by default.
This can be controlled via the `PQA_HOME` environment variable.
Indexes are made by reading files in the `IndexSettings.paper_directory`.
By default, we recursively read from subdirectories of the paper directory,
unless disabled using `IndexSettings.recurse_subdirectories`.
The paper directory is not modified in any way, it's just read from.
[home dir]: https://docs.python.org/3/library/pathlib.html#pathlib.Path.home
#### Manifest Files
The indexing process attempts to infer paper metadata like title and DOI
using LLM-powered text processing.
You can avoid this point of uncertainty using a "manifest" file,
which is a CSV containing `DocDetails` fields (order doesn't matter).
For example:
- `file_location`: relative path to the paper's PDF within the index directory
- `doi`: DOI of the paper
- `title`: title of the paper
By providing this information,
we ensure queries to metadata providers like Crossref are accurate.
To ease creating a manifest, there is a helper class method `Doc.to_csv`,
which also works when called on `DocDetails`.
### Reusing Index
The local search indexes are built based on a hash of the current `Settings` object.
So make sure you properly specify the `paper_directory` to your `IndexSettings` object.
In general, it's advisable to:
1. Pre-build an index given a folder of papers (can take several minutes)
2. Reuse the index to perform many queries
```python
import os
from paperqa import Settings
from paperqa.agents.main import agent_query
from paperqa.agents.search import get_directory_index
async def amain(folder_of_papers: str | os.PathLike) -> None:
settings = Settings(agent={"index": {"paper_directory": folder_of_papers}})
# 1. Build the index. Note an index name is autogenerated when unspecified
built_index = await get_directory_index(settings=settings)
print(settings.get_index_name()) # Display the autogenerated index name
print(await built_index.index_files) # Display the index contents
# 2. Use the settings as many times as you want with ask
answer_response_1 = await agent_query(
query="What is a cool retrieval augmented generation technique?",
settings=settings,
)
answer_response_2 = await agent_query(
query="What is PaperQA2?",
settings=settings,
)
```
### Using Clients Directly
One of the most powerful features of PaperQA2 is its ability to combine data from multiple metadata sources.
For example, [Unpaywall](https://unpaywall.org/) can provide open access status/direct links to PDFs,
[Crossref](https://www.crossref.org/) can provide bibtex,
and [Semantic Scholar](https://www.semanticscholar.org/) can provide citation licenses.
Here's a short demo of how to do this:
```python
from paperqa.clients import DocMetadataClient, ALL_CLIENTS
client = DocMetadataClient(metadata_clients=ALL_CLIENTS)
details = await client.query(title="Augmenting language models with chemistry tools")
print(details.formatted_citation)
# Andres M. Bran, Sam Cox, Oliver Schilter, Carlo Baldassari,
# Andrew D. White, and Philippe Schwaller.
# Augmenting large language models with chemistry tools. Nature Machine Intelligence,
# 6:525-535, May 2024. URL: https://doi.org/10.1038/s42256-024-00832-8,
# doi:10.1038/s42256-024-00832-8.
# This article has 243 citations and is from a domain leading peer-reviewed journal.
print(details.citation_count)
# 243
print(details.license)
# cc-by
print(details.pdf_url)
# https://www.nature.com/articles/s42256-024-00832-8.pdf
```
the `client.query` is meant to check for exact matches of title.
It's a bit robust (like to casing, missing a word).
There are duplicates for titles though - so you can also add authors to disambiguate.
Or you can provide a doi directly `client.query(doi="10.1038/s42256-024-00832-8")`.
If you're doing this at a large scale,
you may not want to use `ALL_CLIENTS` (just omit the argument)
and you can specify which specific fields you want to speed up queries.
For example:
```python
details = await client.query(
title="Augmenting large language models with chemistry tools",
authors=["Andres M. Bran", "Sam Cox"],
fields=["title", "doi"],
)
```
will return much faster than the first query and we'll be certain the authors match.
## Settings Cheatsheet
| Setting | Default | Description |
| -------------------------------------------- | -------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- |
| `llm` | `"gpt-4o-2024-11-20"` | LLM for general use including metadata inference (see Docs.aadd) and answer generation (see Docs.aquery and gen_answer tool). |
| `llm_config` | `None` | Optional configuration for `llm`. |
| `summary_llm` | `"gpt-4o-2024-11-20"` | LLM for creating contextual summaries (see Docs.aget_evidence and gather_evidence tool). |
| `summary_llm_config` | `None` | Optional configuration for `summary_llm`. |
| `embedding` | `"text-embedding-3-small"` | Embedding model for embedding text chunks when adding papers. |
| `embedding_config` | `None` | Optional configuration for `embedding`. |
| `temperature` | `0.0` | Temperature for LLMs. |
| `batch_size` | `1` | Batch size for calling LLMs. |
| `texts_index_mmr_lambda` | `1.0` | Lambda for MMR in text index. |
| `verbosity` | `0` | Integer verbosity level for logging (0-3). 3 = all LLM/Embeddings calls logged. |
| `custom_context_serializer` | `None` | Custom async function (see typing for signature) to override the default answer context serialization. |
| `answer.evidence_k` | `10` | Number of evidence pieces to retrieve. |
| `answer.evidence_retrieval` | `True` | Use retrieval vs processing all docs. |
| `answer.evidence_summary_length` | `"about 100 words"` | Length of evidence summary. |
| `answer.evidence_skip_summary` | `False` | Whether to skip summarization. |
| `answer.evidence_text_only_fallback` | `False` | Whether to allow context creation to retry without media present. |
| `answer.answer_max_sources` | `5` | Max number of sources for an answer. |
| `answer.max_answer_attempts` | `None` | Max attempts to generate an answer. |
| `answer.answer_length` | `"about 200 words, but can be longer"` | Length of final answer. |
| `answer.max_concurrent_requests` | `4` | Max concurrent requests to LLMs. |
| `answer.answer_filter_extra_background` | `False` | Whether to cite background info from model. |
| `answer.get_evidence_if_no_contexts` | `True` | Allow lazy evidence gathering. |
| `answer.group_contexts_by_question` | `False` | Groups the final contexts by the underlying `gather_evidence` question in the final context prompt. |
| `answer.evidence_relevance_score_cutoff` | `1` | Cutoff evidence relevance score to include in the answer context (inclusive) |
| `answer.skip_evidence_citation_strip` | `False` | Skip removal of citations from the `gather_evidence` contexts |
| `parsing.page_size_limit` | `1,280,000` | Character limit per page. |
| `parsing.use_doc_details` | `True` | Whether to get metadata details for docs. |
| `parsing.reader_config` | `dict` | Optional keyword arguments for the document reader. |
| `parsing.multimodal` | `True` | Control to parse both text and media from applicable documents, as well as potentially enriching them with text descriptions. |
| `parsing.defer_embedding` | `False` | Whether to defer embedding until summarization. |
| `parsing.parse_pdf` | `paperqa_pypdf.parse_pdf_to_pages` | Function to parse PDF files. |
| `parsing.configure_pdf_parser` | No-op | Callable to configure the PDF parser within `parse_pdf`, useful for behaviors such as enabling logging. |
| `parsing.doc_filters` | `None` | Optional filters for allowed documents. |
| `parsing.use_human_readable_clinical_trials` | `False` | Parse clinical trial JSONs into readable text. |
| `parsing.enrichment_llm` | `"gpt-4o-2024-11-20"` | LLM for media enrichment. |
| `parsing.enrichment_llm_config` | `None` | Optional configuration for `enrichment_llm`. |
| `parsing.enrichment_page_radius` | `1` | Page radius for context text in enrichment. |
| `parsing.enrichment_prompt` | `image_enrichment_prompt_template` | Prompt template for enriching media. |
| `parsing.citation_prompt` | `citation_prompt` | Prompt to create citation from peeking one chunk. |
| `parsing.structured_citation_prompt` | `structured_citation_prompt` | Prompt to create a citation (in JSON) from peeking one chunk. |
| `parsing.disable_doc_valid_check` | `False` | Flag to disable checking if a document looks like text (was parsed correctly). |
| `prompts.summary` | `summary_prompt` | Template for summarizing text, must contain variables matching `summary_prompt`. |
| `prompts.qa` | `qa_prompt` | Template for QA, must contain variables matching `qa_prompt`. |
| `prompts.select` | `select_paper_prompt` | Template for selecting papers, must contain variables matching `select_paper_prompt`. |
| `prompts.pre` | `None` | Optional pre-prompt templated with just the original question to append information before a qa prompt. |
| `prompts.post` | `None` | Optional post-processing prompt that can access PQASession fields. |
| `prompts.system` | `default_system_prompt` | System prompt for the model. |
| `prompts.use_json` | `True` | Whether to use JSON formatting. |
| `prompts.summary_json` | `summary_json_prompt` | JSON-specific summary prompt. |
| `prompts.summary_json_system` | `summary_json_system_prompt` | System prompt for JSON summaries. |
| `prompts.context_outer` | `CONTEXT_OUTER_PROMPT` | Prompt for how to format all contexts in generate answer. |
| `prompts.context_inner` | `CONTEXT_INNER_PROMPT` | Prompt for how to format a single context in generate answer. Must contain 'name' and 'text' variables. |
| `prompts.answer_iteration_prompt` | `answer_iteration_prompt_template` | Prompt to inject existing prior answers to allow iteration. Default injects no prior answers. |
| `agent.agent_llm` | `"gpt-4o-2024-11-20"` | LLM inside the agent making tool selections. |
| `agent.agent_llm_config` | `None` | Optional configuration for `agent_llm`. |
| `agent.agent_type` | `"ToolSelector"` | Type of agent to use. |
| `agent.agent_config` | `None` | Optional kwarg for AGENT constructor. |
| `agent.agent_system_prompt` | `env_system_prompt` | Optional system prompt message. |
| `agent.agent_prompt` | `env_reset_prompt` | Agent prompt. |
| `agent.return_paper_metadata` | `False` | Whether to include paper title/year in search tool results. |
| `agent.search_count` | `8` | Search count. |
| `agent.timeout` | `500.0` | Timeout on agent execution (seconds). |
| `agent.tool_names` | `None` | Optional override on tools to provide the agent. |
| `agent.max_timesteps` | `None` | Optional upper limit on environment steps. |
| `agent.agent_evidence_n` | `1` | Top n ranked evidences shown to the agent after gathering evidence. |
| `agent.rebuild_index` | `True` | Flag to rebuild the index at the start of agent runners. |
| `agent.callbacks` | `{}` | Named lists of callables to be invoked with environment state. |
| `agent.index.name` | `None` | Optional name of the index. |
| `agent.index.paper_directory` | `Current working directory` | Directory containing papers to be indexed. |
| `agent.index.manifest_file` | `None` | Path to manifest CSV with document attributes. |
| `agent.index.index_directory` | `pqa_directory("indexes")` | Directory to store PQA indexes. |
| `agent.index.use_absolute_paper_directory` | `False` | Whether to use absolute paper directory path. |
| `agent.index.recurse_subdirectories` | `True` | Whether to recurse into subdirectories when indexing. |
| `agent.index.concurrency` | `5` | Number of concurrent filesystem reads. |
| `agent.index.sync_with_paper_directory` | `True` | Whether to sync index with paper directory on load. |
| `agent.index.batch_size` | `1` | Number of files to process before committing to the index. |
| `agent.index.files_filter` | `lambda f: f.suffix in {...}` | Filter function to mark files in the paper directory to index. |
## Where do I get papers?
Well that's a really good question!
It's probably best to just download PDFs of papers you think will help answer your question and start from there.
See detailed docs [about zotero, openreview and parsing](docs/tutorials/where_do_I_get_papers.md)
## Callbacks
To execute a function on each chunk of LLM completions,
you need to provide a function that can be executed on each chunk.
For example, to get a typewriter view of the completions, you can do:
```python
from paperqa import Docs
def typewriter(chunk: str) -> None:
print(chunk, end="")
docs = Docs()
# add some docs...
await docs.aquery("What is PaperQA2?", callbacks=[typewriter])
```
### Caching Embeddings
In general, embeddings are cached when you pickle a `Docs` regardless of what vector store you use.
So as long as you save your underlying `Docs` object,
you should be able to avoid re-embedding your documents.
## Customizing Prompts
You can customize any of the prompts using settings.
```python
from paperqa import Docs, Settings
my_qa_prompt = (
"Answer the question '{question}'\n"
"Use the context below if helpful. "
"You can cite the context using the key like (pqac-abcd1234). "
"If there is insufficient context, write a poem "
"about how you cannot answer.\n\n"
"Context: {context}"
)
docs = Docs()
settings = Settings()
settings.prompts.qa = my_qa_prompt
await docs.aquery("What is PaperQA2?", settings=settings)
```
### Pre and Post Prompts
Following the syntax above, you can also include prompts that
are executed after the query and before the query.
For example, you can use this to critique the answer.
## FAQ
### How come I get different results than your papers?
Internally at FutureHouse, we have a slightly different set of tools.
We're trying to get some of them, like citation traversal, into this repo.
However, we have APIs and licenses to access research papers that we cannot share openly.
Similarly, in our research papers' results we do not start with the known relevant PDFs.
Our agent has to identify them using keyword search over all papers, rather than just a subset.
We're gradually aligning these two versions of PaperQA,
but until there is an open-source way to freely access papers (even just open source papers)
you will need to provide PDFs yourself.
### How is this different from LlamaIndex or LangChain?
[LangChain](https://github.com/langchain-ai/langchain)
and [LlamaIndex](https://github.com/run-llama/llama_index)
are both frameworks for working with LLM applications,
with abstractions made for agentic workflows and retrieval augmented generation.
Over time, the PaperQA team over time chose to become framework-agnostic,
instead outsourcing LLM drivers to [LiteLLM][LiteLLM general docs]
and no framework besides Pydantic for its tools.
PaperQA focuses on scientific papers and their metadata.
PaperQA can be reimplemented using either LlamaIndex or LangChain.
For example, our `GatherEvidence` tool can be reimplemented
as a retriever with an LLM-based re-ranking and contextual summary.
There is similar work with the tree response method in LlamaIndex.
### Can I save or load?
The `Docs` class can be pickled and unpickled.
This is useful if you want to save the embeddings of the documents and then load them later.
```python
import pickle
# save
with open("my_docs.pkl", "wb") as f:
pickle.dump(docs, f)
# load
with open("my_docs.pkl", "rb") as f:
docs = pickle.load(f)
```
## Reproduction
Contained in [docs/2024-10-16_litqa2-splits.json5](docs/2024-10-16_litqa2-splits.json5)
are the question IDs used in train, evaluation, and test splits,
as well as paper DOIs used to build the splits' indexes.
- Train and eval splits: question IDs come from
[LAB-Bench's LitQA2 question IDs](https://github.com/Future-House/LAB-Bench/blob/main/LitQA2/litqa-v2-public.jsonl).
- Test split: questions IDs come from
[aviary-paper-data's LitQA2 question IDs](https://huggingface.co/datasets/futurehouse/aviary-paper-data).
There are multiple papers slowly building PaperQA, shown below in [Citation](#citation).
To reproduce:
- `skarlinski2024language`: train and eval splits are applicable.
The test split remains held out.
- `narayanan2024aviarytraininglanguageagents`: train, eval, and test splits are applicable.
Example on how to use LitQA for evaluation can be found in
[aviary.litqa](https://github.com/Future-House/aviary/tree/main/packages/litqa#running-litqa).
## Citation
Please read and cite the following papers if you use this software:
```bibtex
@article{narayanan2024aviarytraininglanguageagents,
title = {Aviary: training language agents on challenging scientific tasks},
author = {
Siddharth Narayanan and
James D. Braza and
Ryan-Rhys Griffiths and
Manu Ponnapati and
Albert Bou and
Jon Laurent and
Ori Kabeli and
Geemi Wellawatte and
Sam Cox and
Samuel G. Rodriques and
Andrew D. White},
journal = {arXiv preprent arXiv:2412.21154},
year = {2024},
url = {https://doi.org/10.48550/arXiv.2412.21154},
}
```
```bibtex
@article{skarlinski2024language,
title = {Language agents achieve superhuman synthesis of scientific knowledge},
author = {
Michael D. Skarlinski and
Sam Cox and
Jon M. Laurent and
James D. Braza and
Michaela Hinks and
Michael J. Hammerling and
Manvitha Ponnapati and
Samuel G. Rodriques and
Andrew D. White},
journal = {arXiv preprent arXiv:2409.13740},
year = {2024},
url = {https://doi.org/10.48550/arXiv.2409.13740}
}
```
```bibtex
@article{lala2023paperqa,
title = {PaperQA: Retrieval-Augmented Generative Agent for Scientific Research},
author = {
Jakub Lála and
Odhran O'Donoghue and
Aleksandar Shtedritski and
Sam Cox and
Samuel G. Rodriques and
Andrew D. White},
journal = {arXiv preprint arXiv:2312.07559},
year = {2023},
url = {https://doi.org/10.48550/arXiv.2312.07559}
}
```
================================================
FILE: docs/2024-10-16_litqa2-splits.json5
================================================
// Train, evaluation, and test DOIs here were generated from historical data
// aggregated across many runs made while writing DOI 10.48550/arXiv.2409.13740
{
train: {
question_ids: [
"04dbe07d-8b2c-4daf-b5b2-ef0e93f1fd2a",
"0708b62f-9652-49eb-8ba6-28878afa7445",
"0a9d6516-95ef-4d7b-a28d-d7cde27b7b55",
"0bac8974-554c-439a-a9a2-22fa509c8d5d",
"0d5cf8a7-a240-4a8f-be4e-c16712f90d79",
"0eeb7ea9-fc80-4dee-9418-1c328c3ab653",
"0eede7a8-fe1f-42d3-a2c6-478083648644",
"10cece36-a507-4a93-9600-13f3e0e677f8",
"12a20d8d-cd49-47eb-9a19-6a38519ee3dc",
"14fd2b75-76fb-4c29-a21d-c557b2bcf2ff",
"178a5e56-340f-4ba8-a3e5-f024ca016f40",
"1e5f5199-84f4-4133-ab87-2372fa6ca722",
"1f1b07d7-39ce-4665-9b70-4ab77e3c87aa",
"1ff2b2e4-492e-4e35-bf33-f0fb53ab938c",
"20980744-f9ff-4e39-a08d-106eada6900c",
"22306bd7-7e84-415d-aebb-11c6312eb081",
"224efcd7-3652-47f8-84dd-15b4c6fafae2",
"230dec20-cd02-4613-a7b1-e28058ed46fe",
"247eeb85-a552-4b87-b83e-327538fcb8a9",
"24fae97b-03f3-48b8-b623-abf07faee02e",
"255fd5fb-9623-4030-8bf2-253247df7c82",
"25a9cf59-1c28-4ddf-b797-f43efb9349e6",
"26691c84-514b-4712-a43e-09705d681e45",
"27234279-f50c-4cfc-86e2-af68364a8f94",
"2c05315d-6898-4667-b454-d99b7381bedb",
"2c262f91-52b6-421d-8341-8748f923459e",
"2c3ba95c-47d5-4798-9911-ffdb11c940e4",
"2dc20a2f-de54-4bfe-a34f-1ba395f342cf",
"322454df-45a8-41b3-9b0a-4e808144023c",
"37a4d007-793e-4a89-922a-c1b05f4f82c1",
"39129e1c-096f-4414-bf4f-37fadbbe364c",
"398ebac1-fd2d-45b1-9415-d82db4b4d83c",
"39c985ce-70e8-48e4-bd76-744cd07cb56a",
"3c9f23e2-fdd0-431b-aca7-4f9556c78f1f",
"3d3fea17-c8ee-4005-94cb-d8798be696c3",
"3d40f373-59d3-4666-87bd-6db64fd7b4fb",
"3f5bae15-bd5d-43e3-8e5e-944b1e533529",
"400786c1-e6c6-4f46-a501-86fdd048ed88",
"462a9f38-7cbe-4e12-a6e2-b1d7028c3a8b",
"487539f9-2f17-4009-aa4a-c41322445f11",
"4949fc05-5f78-4dd0-8d9c-3dbb6004740a",
"4a6705b5-85e5-44c1-8444-65be30192802",
"4bb69c9d-2485-42d2-b8aa-aa647b407ca4",
"4d11258d-ee8c-4bc7-91a8-613c7a41f139",
"4d4cb121-9525-499a-9475-9b212465c72d",
"5049c648-b1bb-4624-8824-9d93dfb04e51",
"517e7cf8-c5d2-4391-9e2a-235b79d93050",
"55668039-396e-488a-b2c3-bbe840550433",
"564e715f-8d30-410b-bdb5-0dc5206589a7",
"58950824-2665-445d-939b-9512d5d01a2b",
"58b39fab-337b-452d-b74f-84f9a188ce88",
"5966d3db-5a23-4ea7-a719-2472019d94a6",
"59745f75-52bf-4815-905c-3dfad1ef8923",
"5a2128ad-3127-4595-b810-db128d1a2335",
"5a9c6697-a65c-49c0-9e02-38b2a276fde7",
"5b3b7d05-9e54-445c-b374-d4c6b60923b4",
"5b6d6f82-a585-4aa8-9fe6-e7d35f7cb2ae",
"5c4c602c-9624-4eae-ac44-efe4c0dd10e6",
"5c808548-92c4-4ae7-990c-e2df81e3c2ae",
"5e20e26d-6192-4563-abb3-a4857e3dbc7c",
"623a831f-41ee-4e0e-936a-87f93d96369e",
"634f6745-f3b3-4cb1-9859-96ffb954b98a",
"653635b7-3bc6-4a7b-98c7-c02038c0e928",
"658f7050-d137-477e-8693-26609080cecd",
"6f8a51e2-f7ad-4033-b43d-370348e4809f",
"6fff0994-6d02-470a-9d61-8e35420412b6",
"720e20c2-9ad1-4d98-9f01-8b7fb3782a46",
"745f5a0d-5f8f-405e-bb46-f37b3d1f0678",
"76bcaeeb-93bd-4951-99b9-cf4613de1a37",
"77a41274-cd9c-48bc-a347-e0746907840d",
"78a2c1d2-f035-4c7d-a7ee-40dfd95ca88a",
"7975ddb0-a784-4f85-a297-c80e1cb5dcf2",
"7a42c784-7ae0-48fe-a71f-0a547b8fabb3",
"7cf0fcde-fea8-420c-8531-2f2fe9e38980",
"7d2c8d44-ecf3-40d2-ab69-b6195c46ffe9",
"7d71dffb-b591-4b88-b0c6-e125a1b083b4",
"7d805bb8-4c7c-431f-b068-acf5e5459985",
"7e7150d6-bc73-4a29-a5b3-4ef8399ed947",
"80e6571e-8f5d-496a-8ba3-9c9f5b783f5d",
"8266ac61-92d6-423d-8e7a-fe47b3a7e885",
"82de3e92-abe2-46ac-ad17-23417b9c4da7",
"837b2489-723a-4099-9b68-c2a9ea688f4d",
"850f86d3-0139-43df-89fd-e606c30aaa8b",
"85c67ef3-322c-42b4-b745-c05e07e7b8ac",
"8696273a-7fea-411a-b6c6-0e826e1e02b5",
"86f111e5-402b-4ef5-b101-8be1bf5be7c6",
"8ade3e3a-4792-4965-b9d9-05e528ebbfa0",
"8b665114-7729-4dac-a64f-4862a5397b82",
"8c833521-56c4-458d-8c65-2bbf66190cae",
"8d61a14b-60ef-43b0-8003-b60cb6657428",
"8d7fa642-ee46-4a13-8ea9-61cc2d4f4ddd",
"9088251a-99fe-4b91-b6a9-375154ec4f58",
"91387526-9268-4a3c-9abe-73819707d0b0",
"925ffe20-b8a9-4ac4-943c-7a16966f4a4b",
"941c04dc-c89d-4a90-87b0-930625268a38",
"983f1ef5-fc7d-4f4a-8f48-e704641eae12",
"99713efa-d1b1-4fc5-a4b1-cbae2b3a5798",
"9a0b82cb-6a99-4e50-83fc-3ef2ebd277cc",
"9f797d29-9f3a-481d-b2fe-326cbc686273",
"a18883e9-218a-4719-8d2c-cf94d740de1a",
"a1d01019-d2b1-4619-92ec-7ea38578819f",
"a214f5f8-0de8-43cf-82e0-7930003e4a0c",
"a43e5166-d0e8-48f8-a113-648acac7ed59",
"a45c277e-55d9-4e7f-b1de-37fc2e19daf6",
"a6622141-68d6-418f-8e30-7a5eff3d4fa8",
"a8aa19cc-e4d1-4aa1-8c4e-2a518b4c99d6",
"aa1835b2-2b1c-4986-b7af-e174da0124b0",
"aaa85379-1e4b-4642-9ec4-e1a6d6c29c3b",
"ab58e166-f0b5-49ae-ac56-c38b5d6e8aad",
"ab5eb050-d134-4445-9307-6faa08be7474",
"ade96656-7ed1-4e21-b009-b7a73e13bff5",
"b1d5a5f5-6e89-4dfb-b60d-5a9824b015f3",
"b2a0249b-2850-4576-8b78-8408c1e47324",
"b331480e-dfc7-4e92-931a-c71f491c4795",
"b8ec372b-ae29-473e-96bc-86ff1ead24ea",
"bace5737-ba26-422a-8706-0fb1e92b689f",
"bca1be77-208b-4d57-ac29-05aa6d58bdbf",
"bcd2f213-c6c6-4660-af35-a7bd1c6a1170",
"c246753c-27d2-4ae4-8630-b9b4077ba6f6",
"c33446f6-fbff-4186-8a51-28a17f68bd40",
"c3816cb5-8c87-4946-b133-43f415ab6b2a",
"c624ed31-214f-4c80-9544-5514a096b1d3",
"c758f685-ba4a-4bf0-bd85-567c60ff1508",
"c7b36a1c-ea80-4ae5-b2f1-3932cb16c3cf",
"c9baf8e0-c4c7-4ba3-b5c4-18e9af8b2df1",
"c9bdb9b5-28c1-44da-93b6-b1fc9d8bf369",
"ca4c9d21-b842-4875-9a6a-bcb9f6c55073",
"cb710074-73a8-4407-b0c7-7dc868f1bc76",
"cbe93a43-09cd-4cb4-9edd-f22fe8c28415",
"cdc80639-dc21-4337-bccc-d61d9aec6560",
"ce6dd5f7-0706-41dd-a383-9b0d22ef00a1",
"cff68274-4bbe-4fa0-a181-36a9af3cc0f1",
"d0f69626-66ee-4807-937d-c3a024441812",
"d1307e50-3c03-4c76-81ee-2decb5de5f14",
"d1eabedb-656f-4f89-a65f-4ed89478ba9f",
"d2860d38-dfb9-4b80-905f-812c32573915",
"d65103ae-c881-4116-a0a7-1b233eb6275a",
"da5b2a8f-ba08-4692-851f-2e0bf142a02f",
"dbb51a1c-f9a2-4960-a93c-118957659790",
"dbfbae3d-62f6-4710-8d13-8ce4c8485567",
"df061613-2591-4faa-be03-791c76375cb5",
"e2fb56b7-08cd-4dc0-bc63-b45931a74fc9",
"e3b5a4af-41d9-48db-becf-29a08d0ad28e",
"e6b0f9e5-e976-47dc-b839-0b2fca967e9e",
"e763edaa-b112-460a-a564-d58a6685e639",
"e820cbcf-6df1-4c1c-b985-c02f39f52781",
"e90ea0fc-4659-4b20-acae-75dc4b97a101",
"e9f142f0-8ef6-47cd-b846-7283a93308d4",
"ea4ce240-2864-4ee5-9ffc-2dbda0f8f550",
"ebe57888-662f-488f-ade1-c0aaffe638b1",
"eda34fde-798e-43a1-a9d3-a804d3d8ee4e",
"f0b6cea0-e005-47bc-be0d-9a10b219cae6",
"f5a4b449-e647-4ae0-8419-c221792482c9",
"f5a84803-3917-43eb-801b-8dc0c5400da1",
"f7346ea0-5f1b-45e9-a1d6-493c754159c1",
"fca26d7c-05cf-40b0-9fd6-a63ed7950909",
"fd54d745-447c-4fcd-80de-463fcd3de6a4",
"fd60a0e7-ba64-49a9-843a-6f5cb17c5fa9",
"fe074387-3765-4020-8f5d-e395d1094121",
],
dois: [
"10.1001/archopht.117.5.670",
"10.1001/archpediatrics.2011.153",
"10.1001/jama.1989.03430170057028",
"10.1001/jama.1994.03510360033032",
"10.1001/jama.2009.1754",
"10.1001/jama.299.20.2450-a",
"10.1001/jamacardio.2020.1017",
"10.1001/jamanetworkopen.2022.50965",
"10.1001/jamaophthalmol.2018.6902",
"10.1001/jamapsychiatry.2013.266",
"10.1002/(sici)1096-9136(199807)15:7<539::aid-dia668>3.0.co;2-s",
"10.1002/(sici)1096-9861(19960429)368:2<304::aid-cne10>3.0.co;2-h",
"10.1002/(sici)1096-9861(19970407)380:2<230::aid-cne6>3.0.co;2-4",
"10.1002/(sici)1096-9861(19970616)382:4<499::aid-cne6>3.0.co;2-y",
"10.1002/(sici)1096-9861(19980222)391:4<444::aid-cne3>3.0.co;2-0",
"10.1002/(sici)1096-9861(19980406)393:2<169::aid-cne3>3.0.co;2-0",
"10.1002/(sici)1096-9861(19980928)399:3<306::aid-cne2>3.0.co;2-4",
"10.1002/(sici)1096-9861(19990201)404:1<97::aid-cne8>3.0.co;2-1",
"10.1002/(sici)1096-9861(19990913)412:1<95::aid-cne7>3.0.co;2-y",
"10.1002/(sici)1097-0061(199911)15:15<1681::aid-yea486>3.0.co;2-a",
"10.1002/(sici)1097-0061(20000115)16:1<11::aid-yea502>3.0.co;2-k",
"10.1002/(sici)1097-0134(199705)28:1<72::aid-prot7>3.0.co;2-l",
"10.1002/(sici)1097-0177(200006)218:2<235::aid-dvdy2>3.0.co;2-g",
"10.1002/(sici)1097-4547(20000401)60:1<37::aid-jnr4>3.0.co;2-w",
"10.1002/(sici)1097-4644(20000701)78:1<24::aid-jcb3>3.0.co;2-2",
"10.1002/(sici)1097-4652(199908)180:2<271::aid-jcp15>3.0.co;2-d",
"10.1002/(sici)1097-4652(200003)182:3<311::aid-jcp1>3.0.co;2-9",
"10.1002/(sici)1097-4652(200007)184:1<1::aid-jcp1>3.0.co;2-7",
"10.1002/(sici)1098-1128(200003)20:2<103::aid-med1>3.0.co;2-x",
"10.1002/0471142727.mb0117s79",
"10.1002/0471142727.mb2129s109",
"10.1002/0471142735.im2001s108",
"10.1002/0471142735.im22f05s104",
"10.1002/0471250953.bi0410s25",
"10.1002/0471250953.bi1110s43",
"10.1002/1096-9861(20001002)425:4<479::aid-cne2>3.0.co;2-3",
"10.1002/1096-9861(20001211)428:2<240::aid-cne4>3.0.co;2-q",
"10.1002/1097-0142(19900815)66:4<740::aid-cncr2820660423>3.0.co;2-h",
"10.1002/1097-4547(20010215)63:4<313::aid-jnr1025>3.0.co;2-4",
"10.1002/1097-4644(20001201)79:3<407::aid-jcb60>3.0.co;2-8",
"10.1002/1097-4687(200010)246:1<1::aid-jmor1>3.0.co;2-d",
"10.1002/1098-1128(200103)21:2<105::aid-med1002>3.0.co;2-u",
"10.1002/1521-4141(200211)32:11<3315::aid-immu3315>3.0.co;2-h",
"10.1002/1873-3468.12826",
"10.1002/1873-3468.13106",
"10.1002/1873-3468.13205",
"10.1002/1873-3468.13316",
"10.1002/1873-3468.13502",
"10.1002/1873-3468.13844",
"10.1002/1873-3468.13961",
"10.1002/1873-3468.14006",
"10.1002/1878-0261.12407",
"10.1002/1878-0261.12872",
"10.1002/1878-0261.12917",
"10.1002/1878-0261.13083",
"10.1002/2050-7038.12014",
"10.1002/2211-5463.12255",
"10.1002/2211-5463.12266",
"10.1002/2211-5463.12710",
"10.1002/9780470057414",
"10.1002/9780470758472",
"10.1002/9780470960707",
"10.1002/9780470976623.ch11",
"10.1002/9780470999554",
"10.1002/9781118675014.ch18",
"10.1002/9781118924853.ch8",
"10.1002/9781118971758.ch40",
"10.1002/9781119023647.ch1",
"10.1002/9781119043553.ch8",
"10.1002/9781119143505.ch13",
"10.1002/9781119179320.ch5",
"10.1002/9781119380924.ch1",
"10.1002/9781119409144.ch81",
"10.1002/9781119593058.ch6",
"10.1002/9781444316070.ch6",
"10.1002/9781444316070.ch7",
"10.1002/9783527611614.ch11",
"10.1002/9783527699261.ch18",
"10.1002/9783527818242.ch9",
"10.1002/acg2.10",
"10.1002/acn3.16",
"10.1002/acn3.50822",
"10.1002/acn3.50960",
"10.1002/adbi.201800335",
"10.1002/adbi.201900237",
"10.1002/adem.202100696",
"10.1002/adfm.200600441",
"10.1002/adfm.201910250",
"10.1002/adfm.202008400",
"10.1002/adfm.202105749",
"10.1002/adfm.202301017",
"10.1002/adhm.201200195",
"10.1002/adhm.201400842",
"10.1002/adhm.201701067",
"10.1002/adhm.201701175",
"10.1002/adhm.201800490",
"10.1002/adhm.201801471",
"10.1002/adhm.201801578",
"10.1002/adhm.202202147",
"10.1002/adma.201502403",
"10.1002/adma.201502454",
"10.1002/adma.201702057",
"10.1002/adma.201703002",
"10.1002/adma.201703838",
"10.1002/adma.201705322",
"10.1002/adma.201803309",
"10.1002/adma.201804041",
"10.1002/adma.201806158",
"10.1002/adma.202102580",
"10.1002/adma.202103923",
"10.1002/admi.202000112",
"10.1002/admi.202000966",
"10.1002/adsc.201100412",
"10.1002/adsc.201300568",
"10.1002/adsc.201701005",
"10.1002/adtp.201900136",
"10.1002/adtp.202000230",
"10.1002/adtp.202100035",
"10.1002/advs.201901222",
"10.1002/advs.202003572",
"10.1002/advs.202102778",
"10.1002/aenm.201401401",
"10.1002/ajb2.1136",
"10.1002/ajhb.22243",
"10.1002/ajmg.a.30621",
"10.1002/ajmg.a.36751",
"10.1002/ajmg.a.37107",
"10.1002/ajmg.a.38718",
"10.1002/ajmg.a.61063",
"10.1002/ajmg.b.32755",
"10.1002/ajoc.201900618",
"10.1002/ajpa.10018",
"10.1002/alz.038589",
"10.1002/alz.12419",
"10.1002/ame2.12032",
"10.1002/ana.10262",
"10.1002/ana.20315",
"10.1002/ana.21788",
"10.1002/ana.24357",
"10.1002/ana.24362",
"10.1002/ana.24494",
"10.1002/ana.25488",
"10.1002/ana.25832",
"10.1002/anbr.202000068",
"10.1002/anbr.202000077",
"10.1002/ange.201501204",
"10.1002/ange.202103696",
"10.1002/anie.196204761",
"10.1002/anie.200200565",
"10.1002/anie.200390233",
"10.1002/anie.200400618",
"10.1002/anie.201410180",
"10.1002/anie.201501204",
"10.1002/anie.201510610",
"10.1002/anie.201601233",
"10.1002/anie.201703028",
"10.1002/anie.201708233",
"10.1002/anie.201709542",
"10.1002/anie.201900585",
"10.1002/anie.201903264",
"10.1002/anie.202106147",
"10.1002/anie.202110819",
"10.1002/anie.202112232",
"10.1002/ar.a.20253",
"10.1002/arch.10053",
"10.1002/arch.10061",
"10.1002/art.23404",
"10.1002/art.39481",
"10.1002/art.39699",
"10.1002/aur.188",
"10.1002/bab.1137",
"10.1002/bab.1617",
"10.1002/bdr2.1416",
"10.1002/bdrb.20090",
"10.1002/bies.10068",
"10.1002/bies.200900155",
"10.1002/bies.201200043",
"10.1002/bies.201300104",
"10.1002/bies.201400122",
"10.1002/bies.201400162",
"10.1002/bies.201600203",
"10.1002/bies.201670906",
"10.1002/bies.201700001",
"10.1002/bies.201700086",
"10.1002/bies.201900171",
"10.1002/bies.20198",
"10.1002/bies.202000114",
"10.1002/bies.202000288",
"10.1002/bies.20353",
"10.1002/bies.20447",
"10.1002/bies.20692",
"10.1002/biof.1114",
"10.1002/biot.201200120",
"10.1002/biot.201900228",
"10.1002/biot.202000087",
"10.1002/biot.202300353",
"10.1002/bip.10221",
"10.1002/bip.21345",
"10.1002/bip.22314",
"10.1002/bit.10771",
"10.1002/bit.24513",
"10.1002/bit.24942",
"10.1002/bit.26069",
"10.1002/brb3.1089",
"10.1002/brb3.1591",
"10.1002/btm2.10110",
"10.1002/btpr.2522",
"10.1002/btpr.3008",
"10.1002/btpr.486",
"10.1002/cam4.2397",
"10.1002/cam4.2834",
"10.1002/cbf.1467",
"10.1002/cbf.3267",
"10.1002/cbf.3497",
"10.1002/cbic.201100784",
"10.1002/cbic.201500084",
"10.1002/cbic.201700648",
"10.1002/cbic.201800665",
"10.1002/cbic.201900101",
"10.1002/cbic.202300480",
"10.1002/cbin.11300",
"10.1002/chem.200800478",
"10.1002/chem.201700698",
"10.1002/chem.201902113",
"10.1002/chin.200745258",
"10.1002/cm.970170204",
"10.1002/cm.970220304",
"10.1002/cmdc.201300422",
"10.1002/cmdc.201500485",
"10.1002/cmdc.201700118",
"10.1002/cmdc.202000271",
"10.1002/cmdc.202000466",
"10.1002/cncr.22023",
"10.1002/cncr.30659",
"10.1002/cncr.31136",
"10.1002/cne.10100",
"10.1002/cne.10234",
"10.1002/cne.10239",
"10.1002/cne.1040",
"10.1002/cne.10421",
"10.1002/cne.10628",
"10.1002/cne.10675",
"10.1002/cne.10681",
"10.1002/cne.10874",
"10.1002/cne.1183",
"10.1002/cne.20300",
"10.1002/cne.20385",
"10.1002/cne.20469",
"10.1002/cne.20481",
"10.1002/cne.20512",
"10.1002/cne.20528",
"10.1002/cne.20738",
"10.1002/cne.20853",
"10.1002/cne.21219",
"10.1002/cne.21238",
"10.1002/cne.21266",
"10.1002/cne.21352",
"10.1002/cne.21646",
"10.1002/cne.21669",
"10.1002/cne.21684",
"10.1002/cne.21889",
"10.1002/cne.22295",
"10.1002/cne.22301",
"10.1002/cne.22489",
"10.1002/cne.22527",
"10.1002/cne.22532",
"10.1002/cne.22547",
"10.1002/cne.22563",
"10.1002/cne.22578",
"10.1002/cne.23144",
"10.1002/cne.23414",
"10.1002/cne.23458",
"10.1002/cne.23476",
"10.1002/cne.23661",
"10.1002/cne.23769",
"10.1002/cne.23787",
"10.1002/cne.23802",
"10.1002/cne.23875",
"10.1002/cne.23896",
"10.1002/cne.24078",
"10.1002/cne.24114",
"10.1002/cne.24360",
"10.1002/cne.24427",
"10.1002/cne.24481",
"10.1002/cne.24499",
"10.1002/cne.24674",
"10.1002/cne.24685",
"10.1002/cne.24746",
"10.1002/cne.24757",
"10.1002/cne.24792",
"10.1002/cne.24818",
"10.1002/cne.25163",
"10.1002/cne.25232",
"10.1002/cne.901240303",
"10.1002/cne.901370404",
"10.1002/cne.901450305",
"10.1002/cne.901520202",
"10.1002/cne.901590202",
"10.1002/cne.901810310",
"10.1002/cne.902030412",
"10.1002/cne.902340303",
"10.1002/cne.902530303",
"10.1002/cne.902580406",
"10.1002/cne.902640107",
"10.1002/cne.902730110",
"10.1002/cne.902790202",
"10.1002/cne.902860404",
"10.1002/cne.902910105",
"10.1002/cne.903200102",
"10.1002/cne.903350410",
"10.1002/cne.903390304",
"10.1002/cne.903390402",
"10.1002/cphc.201701175",
"10.1002/cphy.c120035",
"10.1002/cphy.c170048",
"10.1002/cphy.c200027",
"10.1002/cpt.698",
"10.1002/cpz1.244",
"10.1002/cti2.1129",
"10.1002/cti2.1144",
"10.1002/cti2.1336",
"10.1002/cyto.990140205",
"10.1002/cyto.a.20493",
"10.1002/cyto.a.20920",
"10.1002/cyto.a.23953",
"10.1002/ddr.10366",
"10.1002/dmr.5610020301",
"10.1002/dneu.20399",
"10.1002/dneu.20543",
"10.1002/dneu.20622",
"10.1002/dneu.20875",
"10.1002/dneu.22014",
"10.1002/dneu.22022",
"10.1002/dneu.22028",
"10.1002/dneu.22132",
"10.1002/dneu.22143",
"10.1002/dneu.22700",
"10.1002/dneu.22777",
"10.1002/dneu.22814",
"10.1002/dneu.22849",
"10.1002/dvdy.21773",
"10.1002/dvdy.22259",
"10.1002/dvdy.24110",
"10.1002/dvdy.24167",
"10.1002/dvdy.24414",
"10.1002/dvdy.24612",
"10.1002/dvdy.79",
"10.1002/dvdy.94",
"10.1002/dvg.23399",
"10.1002/ece3.1720",
"10.1002/ece3.3309",
"10.1002/eji.1830190712",
"10.1002/eji.1830230929",
"10.1002/eji.1830260421",
"10.1002/eji.1830270725",
"10.1002/eji.200425139",
"10.1002/eji.200425332",
"10.1002/eji.200425463",
"10.1002/eji.200425538",
"10.1002/eji.200737157",
"10.1002/eji.200738060",
"10.1002/eji.200738078",
"10.1002/eji.200838283",
"10.1002/eji.201040440",
"10.1002/eji.201041105",
"10.1002/eji.201041117",
"10.1002/eji.201141670",
"10.1002/eji.201141717",
"10.1002/eji.201142298",
"10.1002/eji.201242433",
"10.1002/eji.201343349",
"10.1002/eji.201343381",
"10.1002/eji.201343509",
"10.1002/eji.201343579",
"10.1002/eji.201343751",
"10.1002/eji.201344203",
"10.1002/eji.201344269",
"10.1002/eji.201444467",
"10.1002/eji.201444540",
"10.1002/eji.201444806",
"10.1002/eji.201444902",
"10.1002/eji.201445284",
"10.1002/eji.201445295",
"10.1002/eji.201545749",
"10.1002/eji.201546094",
"10.1002/eji.201646399",
"10.1002/eji.201747208",
"10.1002/eji.201847659",
"10.1002/eji.201847868",
"10.1002/eji.201948405",
"10.1002/eji.202048655",
"10.1002/eji.202048769",
"10.1002/eji.202048992",
"10.1002/ejoc.201901108",
"10.1002/elps.1150181505",
"10.1002/elps.200305601",
"10.1002/elps.200305844",
"10.1002/elps.200410423",
"10.1002/elps.201900030",
"10.1002/em.21892",
"10.1002/emmm.200900018",
"10.1002/emmm.201100626",
"10.1002/emmm.201201717",
"10.1002/etc.3670",
"10.1002/gcc.20636",
"10.1002/gene.10024",
"10.1002/gene.10204",
"10.1002/glia.10337",
"10.1002/glia.20407",
"10.1002/glia.20565",
"10.1002/glia.20622",
"10.1002/glia.20863",
"10.1002/glia.21089",
"10.1002/glia.21247",
"10.1002/glia.22661",
"10.1002/glia.22727",
"10.1002/glia.22836",
"10.1002/glia.22898",
"10.1002/glia.22899",
"10.1002/glia.23176",
"10.1002/glia.23311",
"10.1002/glia.23458",
"10.1002/glia.23592",
"10.1002/glia.23695",
"10.1002/glia.23740",
"10.1002/glia.23753",
"10.1002/glia.23780",
"10.1002/glia.23815",
"10.1002/glia.24053",
"10.1002/glia.24105",
"10.1002/glia.24144",
"10.1002/glia.440070105",
"10.1002/hbm.22896",
"10.1002/hbm.25001",
"10.1002/hep.22468",
"10.1002/hep.24570",
"10.1002/hep.29242",
"10.1002/hep.29681",
"10.1002/hep.29778",
"10.1002/hep.31875",
"10.1002/hep.32349",
"10.1002/hep.510230113",
"10.1002/hep.510310237",
"10.1002/hep4.1045",
"10.1002/hipo.20151",
"10.1002/hipo.20529",
"10.1002/hipo.20577",
"10.1002/hipo.20594",
"10.1002/hipo.20762",
"10.1002/hipo.20845",
"10.1002/hipo.23291",
"10.1002/hipo.23568",
"10.1002/hon.2251",
"10.1002/hon.2437_68",
"10.1002/humu.10277",
"10.1002/humu.21110",
"10.1002/humu.23191",
"10.1002/humu.23706",
"10.1002/humu.23760",
"10.1002/humu.23995",
"10.1002/ibd.20805",
"10.1002/iid3.136",
"10.1002/iid3.71",
"10.1002/ijc.1196",
"10.1002/ijc.1477",
"10.1002/ijc.21731",
"10.1002/ijc.24788",
"10.1002/ijc.29301",
"10.1002/ijc.31313",
"10.1002/ijc.31985",
"10.1002/ijc.32084",
"10.1002/ijc.33131",
"10.1002/ijc.33382",
"10.1002/iub.1601",
"10.1002/iub.1612",
"10.1002/iub.217",
"10.1002/iub.2278",
"10.1002/iub.530",
"10.1002/iub.608",
"10.1002/j.1460-2075.1987.tb04817.x",
"10.1002/j.1460-2075.1994.tb06274.x",
"10.1002/j.1460-2075.1995.tb06994.x",
"10.1002/jat.3451",
"10.1002/jbm.a.31019",
"10.1002/jbm.a.37093",
"10.1002/jbmr.1857",
"10.1002/jbmr.1989",
"10.1002/jbt.22626",
"10.1002/jcb.10205",
"10.1002/jcb.22155",
"10.1002/jcb.23287",
"10.1002/jcb.240560903",
"10.1002/jcb.25114",
"10.1002/jcb.25895",
"10.1002/jcb.25971",
"10.1002/jcb.26005",
"10.1002/jcc.20084",
"10.1002/jcc.20290",
"10.1002/jcc.20291",
"10.1002/jcc.20895",
"10.1002/jcc.21334",
"10.1002/jcc.21367",
"10.1002/jcc.25802",
"10.1002/jcc.25837",
"10.1002/jcc.26189",
"10.1002/jcc.540130805",
"10.1002/jcp.1040760202",
"10.1002/jcp.1112",
"10.1002/jcp.21732",
"10.1002/jcp.22153",
"10.1002/jcp.24157",
"10.1002/jcp.24854",
"10.1002/jcp.26031",
"10.1002/jcp.26291",
"10.1002/jcp.26461",
"10.1002/jcp.26765",
"10.1002/jcp.26931",
"10.1002/jcp.26956",
"10.1002/jcp.28859",
"10.1002/jcp.29486",
"10.1002/jcp.29638",
"10.1002/jcp.30064",
"10.1002/jemt.20338",
"10.1002/jemt.20441",
"10.1002/jemt.20500",
"10.1002/jev2.12116",
"10.1002/jex2.40",
"10.1002/jez.1402520507",
"10.1002/jez.2542",
"10.1002/jgm.1415",
"10.1002/jgm.1548",
"10.1002/jgm.3107",
"10.1002/jgm.3382",
"10.1002/jhm.877",
"10.1002/jib.104",
"10.1002/jib.303",
"10.1002/jimd.12249",
"10.1002/jlb.1ma0520-016r",
"10.1002/jlb.1ma1118-428r",
"10.1002/jlb.2a0817-341rr",
"10.1002/jlb.2ri0717-278r",
"10.1002/jlb.3mir0817-346rrr",
"10.1002/jlb.3mr0218-079r",
"10.1002/jlb.3ta0517-192r",
"10.1002/jlb.4a1221-678rr",
"10.1002/jlb.53.3.309",
"10.1002/jlb.5ma0717-282r",
"10.1002/jlb.5mir0420-055r",
"10.1002/jlb.5mr1020-057rr",
"10.1002/jlb.64.1.33",
"10.1002/jlb.66.4.575",
"10.1002/jlb.mr0318-095rr",
"10.1002/jmor.1051900303",
"10.1002/jmor.1052140206",
"10.1002/jmor.10707",
"10.1002/jmor.20871",
"10.1002/jmr.2219",
"10.1002/jmr.747",
"10.1002/jmri.21604",
"10.1002/jmv.1890270210",
"10.1002/jmv.27601",
"10.1002/jmv.27927",
"10.1002/jmv.28407",
"10.1002/jnr.10646",
"10.1002/jnr.20678",
"10.1002/jnr.22199",
"10.1002/jnr.22411",
"10.1002/jnr.24214",
"10.1002/jnr.24687",
"10.1002/jnr.24735",
"10.1002/jnr.24842",
"10.1002/jnr.24922",
"10.1002/jobm.201300434",
"10.1002/jobm.201300622",
"10.1002/jps.22276",
"10.1002/jsfa.8261",
"10.1002/jts.20231",
"10.1002/lno.10203",
"10.1002/lom3.10162",
"10.1002/lom3.10426",
"10.1002/mabi.201000206",
"10.1002/mabi.201700018",
"10.1002/mabi.201700095",
"10.1002/mas.10017",
"10.1002/mas.21649",
"10.1002/mbo3.345",
"10.1002/mbo3.629",
"10.1002/mbo3.740",
"10.1002/mc.23212",
"10.1002/mco2.6",
"10.1002/mds.23774",
"10.1002/med.20106",
"10.1002/med.20216",
"10.1002/med.21284",
"10.1002/med.21324",
"10.1002/med.21409",
"10.1002/med.21456",
"10.1002/med.21517",
"10.1002/med.21575",
"10.1002/med.21765",
"10.1002/med.21787",
"10.1002/med.21851",
"10.1002/minf.201400088",
"10.1002/mnfr.201000221",
"10.1002/mrd.20961",
"10.1002/mrd.21057",
"10.1002/mrd.22024",
"10.1002/mrd.22223",
"10.1002/mrd.23476",
"10.1002/mrm.1155",
"10.1002/mrm.26781",
"10.1002/nbm.2987",
"10.1002/path.1027",
"10.1002/path.1662",
"10.1002/path.2440",
"10.1002/path.2638",
"10.1002/path.4239",
"10.1002/path.4878",
"10.1002/path.5271",
"10.1002/pmic.200601020",
"10.1002/pmic.200900840",
"10.1002/pmic.201000419",
"10.1002/pmic.201100043",
"10.1002/pmic.201100397",
"10.1002/pmic.201100544",
"10.1002/pmic.201200112",
"10.1002/pmic.201400619",
"10.1002/ppap.201700228",
"10.1002/ppul.21424",
"10.1002/prca.201800186",
"10.1002/pro.109",
"10.1002/pro.2230",
"10.1002/pro.2330",
"10.1002/pro.242",
"10.1002/pro.246",
"10.1002/pro.2610",
"10.1002/pro.2803",
"10.1002/pro.3",
"10.1002/pro.3072",
"10.1002/pro.324",
"10.1002/pro.3313",
"10.1002/pro.3642",
"10.1002/pro.3715",
"10.1002/pro.3943",
"10.1002/pro.3974",
"10.1002/pro.3978",
"10.1002/pro.4653",
"10.1002/pro.4713",
"10.1002/pro.4851",
"10.1002/pro.5034",
"10.1002/pro.580",
"10.1002/pro.666",
"10.1002/pros.10126",
"10.1002/pros.23213",
"10.1002/pros.23909",
"10.1002/prot.10064",
"10.1002/prot.20792",
"10.1002/prot.21060",
"10.1002/prot.21499",
"10.1002/prot.21683",
"10.1002/prot.23082",
"10.1002/prot.24283",
"10.1002/prot.24703",
"10.1002/prot.24741",
"10.1002/prot.24761",
"10.1002/prot.25033",
"10.1002/prot.25415",
"10.1002/prot.25823",
"10.1002/prot.25855",
"10.1002/prot.25870",
"10.1002/prot.26042",
"10.1002/prot.26078",
"10.1002/prot.26172",
"10.1002/prot.26194",
"10.1002/prot.26197",
"10.1002/prot.26235",
"10.1002/prot.26237",
"10.1002/prot.26474",
"10.1002/prot.340220306",
"10.1002/prot.340230412",
"10.1002/ps.2050",
"10.1002/ps.3506",
"10.1002/ps.3585",
"10.1002/ps.4527",
"10.1002/ps.4837",
"10.1002/ps.5652",
"10.1002/ps.5697",
"10.1002/psc.803",
"10.1002/qua.26086",
"10.1002/reg2.38",
"10.1002/rmb2.12333",
"10.1002/rmv.1845",
"10.1002/rmv.1966",
"10.1002/rmv.2231",
"10.1002/rmv.2346",
"10.1002/sctm.16-0158",
"10.1002/sctm.19-0123",
"10.1002/sctm.20-0351",
"10.1002/smll.201400863",
"10.1002/smll.201901459",
"10.1002/smll.202003981",
"10.1002/smll.202005222",
"10.1002/smll.202304378",
"10.1002/smtd.201900514",
"10.1002/spe.4380211102",
"10.1002/stem.1249",
"10.1002/stem.1349",
"10.1002/stem.1704",
"10.1002/stem.1815",
"10.1002/stem.2346",
"10.1002/stem.2489",
"10.1002/stem.3025",
"10.1002/stem.3175",
"10.1002/stem.684",
"10.1002/syn.20711",
"10.1002/syn.20768",
"10.1002/syn.21909",
"10.1002/syn.22072",
"10.1002/term.1727",
"10.1002/term.2958",
"10.1002/wcms.1448",
"10.1002/wdev.151",
"10.1002/wdev.167",
"10.1002/wdev.192",
"10.1002/wdev.248",
"10.1002/wdev.290",
"10.1002/wdev.376",
"10.1002/wdev.65",
"10.1002/wrna.1158",
"10.1002/wrna.1161",
"10.1002/wrna.1165",
"10.1002/wrna.117",
"10.1002/wrna.1226",
"10.1002/wrna.1269",
"10.1002/wrna.1336",
"10.1002/wrna.1474",
"10.1002/wrna.1595",
"10.1002/wrna.1597",
"10.1002/wrna.1651",
"10.1002/wrna.1665",
"10.1002/wrna.57",
"10.1002/wsbm.1352",
"10.1002/wsbm.1413",
"10.1002/yea.1502",
"10.1002/yea.1644",
"10.1002/yea.1803",
"10.1002/yea.1843",
"10.1002/yea.320080602",
"10.1002/yea.991",
"10.1002/zamm.201400045",
"10.1006/bbrc.2000.2702",
"10.1006/biol.2001.0305",
"10.1006/cyto.1998.0426",
"10.1006/dbio.2000.0146",
"10.1006/dbio.2002.0602",
"10.1006/dbio.2002.0613",
"10.1006/dbio.2002.0780",
"10.1006/excr.1999.4688",
"10.1006/excr.2000.4875",
"10.1006/excr.2001.5334",
"10.1006/excr.2002.5485",
"10.1006/exnr.2001.7768",
"10.1006/exnr.2002.7876",
"10.1006/exnr.2002.7882",
"10.1006/jmbi.1996.0847",
"10.1006/jmbi.1998.2530",
"10.1006/jmbi.1999.2700",
"10.1006/jmbi.1999.3088",
"10.1006/jmbi.1999.3091",
"10.1006/jmbi.1999.3392",
"10.1006/jmbi.2000.4042",
"10.1006/jmbi.2000.4158",
"10.1006/jmbi.2000.4315",
"10.1006/jmbi.2001.4780",
"10.1006/jmbi.2001.5077",
"10.1006/jsbi.1996.0013",
"10.1006/mcne.2000.0869",
"10.1006/meth.2001.1262",
"10.1006/mpev.2001.1008",
"10.1006/nbdi.2002.0536",
"10.1006/nimg.2001.1031",
"10.1006/pest.1999.2406",
"10.1006/prep.2001.1564",
"10.1006/taap.1999.8769",
"10.1006/viro.1999.9659",
"10.1006/viro.2000.0679",
"10.1007/0-306-48173-1_2",
"10.1007/0-387-25515-x_12",
"10.1007/0-387-30746-x_27",
"10.1007/1-4020-4303-1_14",
"10.1007/10_2014_300",
"10.1007/124_2020_38",
"10.1007/128_2014_601",
"10.1007/12_2018_45",
"10.1007/164_2017_69",
"10.1007/164_2017_75",
"10.1007/164_2018_97",
"10.1007/164_2019_333",
"10.1007/3-540-45300-8_7",
"10.1007/4735_104",
"10.1007/4735_96",
"10.1007/5584_2018_306",
"10.1007/5584_2021_618",
"10.1007/7355_2014_75",
"10.1007/7355_2023_161",
"10.1007/7651_2018_196",
"10.1007/7653_2015_55",
"10.1007/82_2011_169",
"10.1007/82_2014_414",
"10.1007/82_2015_479",
"10.1007/82_2018_144",
"10.1007/8415_2011_79",
"10.1007/8904_2014_383",
"10.1007/978-0-306-48568-8",
"10.1007/978-0-387-68945-6_1",
"10.1007/978-0-387-77863-1",
"10.1007/978-0-387-77863-1_9",
"10.1007/978-0-387-77944-7_2",
"10.1007/978-0-387-89781-3_4",
"10.1007/978-1-0716-0884-5_13",
"10.1007/978-1-0716-1190-6_2",
"10.1007/978-1-0716-1190-6_23",
"10.1007/978-1-0716-1472-3_19",
"10.1007/978-1-0716-1601-7_16",
"10.1007/978-1-0716-2501-9_9",
"10.1007/978-1-4020-3166-3_8",
"10.1007/978-1-4020-3286-8_38",
"10.1007/978-1-4020-6635-1_78",
"10.1007/978-1-4020-6754-9_11454",
"10.1007/978-1-4020-6776-1_8",
"10.1007/978-1-4020-8247-4_7",
"10.1007/978-1-4020-8837-7_1",
"10.1007/978-1-4020-9741-6_13",
"10.1007/978-1-4419-1170-4_8",
"10.1007/978-1-4419-5774-0_19",
"10.1007/978-1-4419-7002-2_10",
"10.1007/978-1-4419-7692-5_16",
"10.1007/978-1-4471-1300-3_1",
"10.1007/978-1-4471-4372-7_10",
"10.1007/978-1-4612-3292-6_9",
"10.1007/978-1-4613-0135-6",
"10.1007/978-1-4613-3421-7_10",
"10.1007/978-1-4614-0323-4_1",
"10.1007/978-1-4614-1247-2_4",
"10.1007/978-1-4614-3997-4",
"10.1007/978-1-4614-5203-4_20",
"10.1007/978-1-4614-5966-8_3",
"10.1007/978-1-4614-6438-9_101689-1",
"10.1007/978-1-4614-7876-8_24",
"10.1007/978-1-4614-9563-5_10",
"10.1007/978-1-4615-9221-1_1",
"10.1007/978-1-4757-2312-0",
"10.1007/978-1-4899-3553-3_8",
"10.1007/978-1-4939-1136-3_1",
"10.1007/978-1-4939-1242-1_16",
"10.1007/978-1-4939-1292-6_37",
"10.1007/978-1-4939-1311-4",
"10.1007/978-1-4939-1862-1_10",
"10.1007/978-1-4939-1862-1_4",
"10.1007/978-1-4939-2498-1_3",
"10.1007/978-1-4939-2709-8_13",
"10.1007/978-1-4939-2815-6_2",
"10.1007/978-1-4939-2929-0_6",
"10.1007/978-1-4939-7033-9_13",
"10.1007/978-1-4939-7474-0_7",
"10.1007/978-1-4939-7493-1_12",
"10.1007/978-1-4939-7759-8_30",
"10.1007/978-1-4939-7774-1_2",
"10.1007/978-1-4939-7837-3_12",
"10.1007/978-1-4939-8873-0_21",
"10.1007/978-1-4939-9118-1_18",
"10.1007/978-1-4939-9148-8_5",
"10.1007/978-1-4939-9195-2_17",
"10.1007/978-1-4939-9220-1_11",
"10.1007/978-1-59745-396-7_15",
"10.1007/978-1-61779-201-4",
"10.1007/978-1-61779-433-9_17",
"10.1007/978-1-62703-646-7_17",
"10.1007/978-1-62703-694-8_7",
"10.1007/978-1-62703-761-7_8",
"10.1007/978-1-62703-791-4_1",
"10.1007/978-2-287-72615-6_27",
"10.1007/978-3-030-06115-9_4",
"10.1007/978-3-030-15308-3_8",
"10.1007/978-3-030-19103-0_5",
"10.1007/978-3-030-19404-8",
"10.1007/978-3-030-27378-1_12",
"10.1007/978-3-030-28102-1_142",
"10.1007/978-3-030-28102-1_143",
"10.1007/978-3-030-28102-1_144",
"10.1007/978-3-030-28102-1_151",
"10.1007/978-3-030-28102-1_152",
"10.1007/978-3-030-28102-1_159",
"10.1007/978-3-030-28102-1_160",
"10.1007/978-3-030-28102-1_177",
"10.1007/978-3-030-28102-1_178",
"10.1007/978-3-030-28102-1_19",
"10.1007/978-3-030-28102-1_23",
"10.1007/978-3-030-28102-1_26",
"10.1007/978-3-030-28102-1_27",
"10.1007/978-3-030-28102-1_28",
"10.1007/978-3-030-28102-1_32",
"10.1007/978-3-030-28102-1_58",
"10.1007/978-3-030-29654-4_3",
"10.1007/978-3-030-29654-4_4",
"10.1007/978-3-030-31897-0_2",
"10.1007/978-3-030-33308-9_1",
"10.1007/978-3-030-33308-9_26",
"10.1007/978-3-030-40870-1",
"10.1007/978-3-030-41283-8_7",
"10.1007/978-3-030-51849-3_19",
"10.1007/978-3-030-51849-3_5",
"10.1007/978-3-030-61149-1",
"10.1007/978-3-030-61286-3_7",
"10.1007/978-3-030-68321-4_3",
"10.1007/978-3-030-68321-4_6",
"10.1007/978-3-030-68321-4_7",
"10.1007/978-3-030-68748-9_10",
"10.1007/978-3-030-69507-1_8",
"10.1007/978-3-030-72515-0",
"10.1007/978-3-030-73147-2_57",
"10.1007/978-3-030-76571-2_2",
"10.1007/978-3-030-90383-1_13",
"10.1007/978-3-031-11623-0_4",
"10.1007/978-3-031-17157-4_4",
"10.1007/978-3-031-23104-9_3",
"10.1007/978-3-031-37196-7_9",
"10.1007/978-3-319-07911-0_10",
"10.1007/978-3-319-07911-0_9",
"10.1007/978-3-319-08825-9_25",
"10.1007/978-3-319-09287-4_9",
"10.1007/978-3-319-09662-9_19",
"10.1007/978-3-319-09988-0",
"10.1007/978-3-319-10320-4_1",
"10.1007/978-3-319-11280-0_1",
"10.1007/978-3-319-13725-4_1",
"10.1007/978-3-319-15630-9_13",
"10.1007/978-3-319-18102-8",
"10.1007/978-3-319-18102-8_6",
"10.1007/978-3-319-22708-5",
"10.1007/978-3-319-23371-0_10",
"10.1007/978-3-319-25304-6_14",
"10.1007/978-3-319-28495-8_9",
"10.1007/978-3-319-31215-6_38-1",
"10.1007/978-3-319-41559-8_8",
"10.1007/978-3-319-42118-6_12",
"10.1007/978-3-319-43624-1_9",
"10.1007/978-3-319-44081-1_13",
"10.1007/978-3-319-56970-3_21",
"10.1007/978-3-319-59749-2_3",
"10.1007/978-3-319-61343-7_12",
"10.1007/978-3-319-65795-0_6",
"10.1007/978-3-319-67577-0_4",
"10.1007/978-3-319-72093-7_14",
"10.1007/978-3-319-72093-7_8",
"10.1007/978-3-319-74491-9",
"10.1007/978-3-319-76162-6_5",
"10.1007/978-3-319-90808-3",
"10.1007/978-3-319-90808-3_6",
"10.1007/978-3-319-91944-7_11",
"10.1007/978-3-319-95228-4_32",
"10.1007/978-3-319-96842-1_2",
"10.1007/978-3-540-71329-6_13",
"10.1007/978-3-540-89615-9_15",
"10.1007/978-3-642-01144-3_15",
"10.1007/978-3-642-04898-2_634",
"10.1007/978-3-642-10589-0_14",
"10.1007/978-3-642-11633-9_18",
"10.1007/978-3-642-12340-5_2",
"10.1007/978-3-642-13443-2_6",
"10.1007/978-3-642-17214-4_15",
"10.1007/978-3-642-20036-6_6",
"10.1007/978-3-642-20447-0_3",
"10.1007/978-3-642-29627-7_7",
"10.1007/978-3-642-30406-4_8",
"10.1007/978-3-642-30406-4_9",
"10.1007/978-3-642-31878-8_3",
"10.1007/978-3-642-59794-7_7",
"10.1007/978-3-642-60861-2",
"10.1007/978-3-7091-0215-2_9",
"10.1007/978-3-7091-1065-2_1",
"10.1007/978-3-7091-1065-2_16",
"10.1007/978-3-7091-1160-4_18",
"10.1007/978-3-7091-1806-1",
"10.1007/978-3-7091-1806-1_1",
"10.1007/978-3-7091-1806-1_2",
"10.1007/978-4-431-53945-2",
"10.1007/978-4-431-54276-6_10",
"10.1007/978-4-431-55642-8_7",
"10.1007/978-4-431-56582-6_18",
"10.1007/978-81-322-2283-5_7",
"10.1007/978-90-481-3144-0_6",
"10.1007/978-90-481-9069-0_7",
"10.1007/978-90-481-9485-8_18",
"10.1007/978-90-481-9735-4_4",
"10.1007/978-94-007-0782-5_2",
"10.1007/978-94-007-1217-1_9",
"10.1007/978-94-007-1333-8_5",
"10.1007/978-94-007-1333-8_9",
"10.1007/978-94-007-2004-6_3",
"10.1007/978-94-007-4525-4_15",
"10.1007/978-94-007-5561-1_13",
"10.1007/978-94-007-5917-6_4",
"10.1007/978-94-007-7832-0_5",
"10.1007/978-94-009-1189-5_2",
"10.1007/978-94-011-7680-4",
"10.1007/978-94-011-7852-5_6",
"10.1007/978-94-017-7417-8_4",
"10.1007/978-94-017-7741-4",
"10.1007/978-94-017-9294-3",
"10.1007/978-94-017-9294-3_2",
"10.1007/978-94-017-9424-4_2",
"10.1007/978-94-017-9861-7_15",
"10.1007/978-94-024-0921-5_3",
"10.1007/978-981-10-3292-9_8",
"10.1007/978-981-10-3707-8",
"10.1007/978-981-10-3707-8_8",
"10.1007/978-981-10-5203-3_10",
"10.1007/978-981-10-5254-5_8",
"10.1007/978-981-10-6955-0_14",
"10.1007/978-981-10-7101-0_6",
"10.1007/978-981-10-7230-7_22",
"10.1007/978-981-13-1002-7_15",
"10.1007/978-981-13-2242-6_1",
"10.1007/978-981-13-7318-3_6",
"10.1007/978-981-15-1671-9_24",
"10.1007/978-981-15-2696-1_39",
"10.1007/978-981-15-4423-1",
"10.1007/978-981-15-4423-1_1",
"10.1007/978-981-16-0691-5_17",
"10.1007/978-981-16-6170-9_7",
"10.1007/978-981-32-9449-3_2",
"10.1007/b105433",
"10.1007/b106370",
"10.1007/bf00001659",
"10.1007/bf00126376",
"10.1007/bf00199769",
"10.1007/bf00205197",
"10.1007/bf00227942",
"10.1007/bf00264448",
"10.1007/bf00267823",
"10.1007/bf00269438",
"10.1007/bf00380118",
"10.1007/bf00502969",
"10.1007/bf00611101",
"10.1007/bf00620055",
"10.1007/bf01054970",
"10.1007/bf02736761",
"10.1007/bf02818801",
"10.1007/bf02981319",
"10.1007/bf02994009",
"10.1007/bf03322542",
"10.1007/pl00001690",
"10.1007/pl00005684",
"10.1007/pl00021694",
"10.1007/s00005-006-0017-z",
"10.1007/s00005-014-0322-x",
"10.1007/s00011-008-8013-x",
"10.1007/s00011-016-1000-8",
"10.1007/s00011-017-1052-4",
"10.1007/s00011-017-1092-9",
"10.1007/s00011-020-01378-2",
"10.1007/s00011-022-01624-9",
"10.1007/s00018-003-3020-0",
"10.1007/s00018-003-3168-7",
"10.1007/s00018-004-4130-z",
"10.1007/s00018-005-5589-y",
"10.1007/s00018-007-7044-8",
"10.1007/s00018-007-7067-1",
"10.1007/s00018-008-8027-0",
"10.1007/s00018-008-8067-5",
"10.1007/s00018-008-8263-3",
"10.1007/s00018-008-8322-9",
"10.1007/s00018-009-0120-5",
"10.1007/s00018-010-0538-9",
"10.1007/s00018-010-0598-x",
"10.1007/s00018-011-0702-x",
"10.1007/s00018-012-0990-9",
"10.1007/s00018-012-1019-0",
"10.1007/s00018-012-1243-7",
"10.1007/s00018-013-1359-4",
"10.1007/s00018-013-1468-0",
"10.1007/s00018-013-1513-z",
"10.1007/s00018-014-1799-5",
"10.1007/s00018-014-1812-z",
"10.1007/s00018-015-1847-9",
"10.1007/s00018-015-1886-2",
"10.1007/s00018-016-2357-0",
"10.1007/s00018-016-2450-4",
"10.1007/s00018-017-2469-1",
"10.1007/s00018-017-2598-6",
"10.1007/s00018-018-2856-2",
"10.1007/s00018-018-2940-7",
"10.1007/s00018-018-2976-8",
"10.1007/s00018-019-03104-6",
"10.1007/s00018-019-03111-7",
"10.1007/s00018-019-03288-x",
"10.1007/s00018-019-03351-7",
"10.1007/s00018-020-03460-8",
"10.1007/s00018-020-03488-w",
"10.1007/s00018-020-03581-0",
"10.1007/s00018-020-03654-0",
"10.1007/s00018-021-03903-w",
"10.1007/s00018-021-04008-0",
"10.1007/s00018-021-04010-6",
"10.1007/s00018-021-04029-9",
"10.1007/s00018-021-04112-1",
"10.1007/s00018-022-04148-x",
"10.1007/s00018-022-04377-0",
"10.1007/s00018-022-04481-1",
"10.1007/s00018-023-04919-0",
"10.1007/s000180050042",
"10.1007/s000180050147",
"10.1007/s000180300022",
"10.1007/s00044-011-9740-z",
"10.1007/s00044-015-1491-9",
"10.1007/s00109-007-0228-8",
"10.1007/s00109-015-1252-8",
"10.1007/s00109-017-1536-2",
"10.1007/s00109-021-02100-3",
"10.1007/s00114-004-0502-3",
"10.1007/s00114-009-0604-z",
"10.1007/s00114-012-1004-3",
"10.1007/s00114-019-1601-5",
"10.1007/s00120-014-3748-1",
"10.1007/s00120-020-01127-7",
"10.1007/s00122-003-1382-1",
"10.1007/s00122-006-0255-9",
"10.1007/s00122-009-1170-7",
"10.1007/s00122-020-03548-6",
"10.1007/s001220051263",
"10.1007/s00125-006-0542-7",
"10.1007/s00125-007-0646-8",
"10.1007/s00125-008-0923-1",
"10.1007/s00125-011-2428-6",
"10.1007/s00125-012-2644-8",
"10.1007/s00125-013-3075-x",
"10.1007/s00125-016-3964-x",
"10.1007/s00125-024-06103-w",
"10.1007/s001250051289",
"10.1007/s001250100530",
"10.1007/s00129-017-4085-4",
"10.1007/s00202-007-0062-6",
"10.1007/s00203-017-1432-8",
"10.1007/s00203-018-1482-6",
"10.1007/s00204-005-0040-6",
"10.1007/s00204-010-0606-9",
"10.1007/s00204-018-2180-5",
"10.1007/s00204-019-02549-9",
"10.1007/s00204-021-03110-3",
"10.1007/s00210-011-0709-8",
"10.1007/s00213-016-4218-9",
"10.1007/s00214-017-2190-z",
"10.1007/s00216-007-1486-6",
"10.1007/s00216-018-0861-9",
"10.1007/s00221-005-0233-5",
"10.1007/s00221-009-1948-5",
"10.1007/s00227-009-1362-3",
"10.1007/s00232-008-9112-x",
"10.1007/s00232-010-9241-x",
"10.1007/s00232-021-00184-z",
"10.1007/s00234-002-0783-1",
"10.1007/s00239-004-0046-3",
"10.1007/s00239-004-2605-z",
"10.1007/s00239-005-0046-y",
"10.1007/s00239-006-0211-y",
"10.1007/s00239-009-9306-6",
"10.1007/s00239-010-9352-0",
"10.1007/s00239-011-9462-3",
"10.1007/s00239-012-9524-1",
"10.1007/s00239-015-9672-1",
"10.1007/s00239-017-9781-0",
"10.1007/s002390010093",
"10.1007/s00248-010-9717-3",
"10.1007/s00248-013-0226-z",
"10.1007/s00248-017-1036-5",
"10.1007/s00248-024-02357-4",
"10.1007/s00249-011-0730-3",
"10.1007/s00249-012-0841-5",
"10.1007/s00249-016-1168-4",
"10.1007/s002490050213",
"10.1007/s00251-005-0781-7",
"10.1007/s002510000234",
"10.1007/s00253-007-1209-0",
"10.1007/s00253-010-2447-0",
"10.1007/s00253-010-2486-6",
"10.1007/s00253-010-2696-y",
"10.1007/s00253-010-2843-5",
"10.1007/s00253-012-4190-1",
"10.1007/s00253-014-5546-5",
"10.1007/s00253-014-5806-4",
"10.1007/s00253-015-6439-y",
"10.1007/s00253-015-7027-x",
"10.1007/s00253-016-7344-8",
"10.1007/s00253-016-7724-0",
"10.1007/s00253-017-8209-5",
"10.1007/s00253-017-8224-6",
"10.1007/s00253-017-8433-z",
"10.1007/s00253-017-8567-z",
"10.1007/s00253-017-8727-1",
"10.1007/s00253-018-9242-8",
"10.1007/s00253-019-09885-x",
"10.1007/s00253-019-10021-y",
"10.1007/s00253-019-10317-z",
"10.1007/s00253-020-10501-6",
"10.1007/s00253-020-10531-0",
"10.1007/s00253-021-11626-y",
"10.1007/s00253-022-11920-3",
"10.1007/s00253-024-13056-y",
"10.1007/s00262-001-0235-5",
"10.1007/s00262-007-0394-0",
"10.1007/s00262-007-0425-x",
"10.1007/s00262-009-0728-1",
"10.1007/s00262-014-1563-6",
"10.1007/s00262-020-02572-1",
"10.1007/s00262-020-02583-y",
"10.1007/s00262-020-02598-5",
"10.1007/s00262-021-02949-w",
"10.1007/s00262-021-03007-1",
"10.1007/s00262-023-03495-3",
"10.1007/s00262-024-03742-1",
"10.1007/s00265-016-2071-9",
"10.1007/s00267-014-0252-8",
"10.1007/s00277-005-0021-0",
"10.1007/s00277-017-3142-3",
"10.1007/s00281-011-0295-3",
"10.1007/s00281-012-0310-3",
"10.1007/s00281-013-0388-2",
"10.1007/s00281-013-0414-4",
"10.1007/s00281-014-0452-6",
"10.1007/s00281-015-0505-5",
"10.1007/s00281-019-00742-7",
"10.1007/s00281-022-00927-7",
"10.1007/s00284-011-9890-8",
"10.1007/s00284-015-0785-y",
"10.1007/s00284-017-1418-4",
"10.1007/s00284-021-02435-7",
"10.1007/s00284-021-02724-1",
"10.1007/s00285-003-0232-8",
"10.1007/s00294-004-0487-7",
"10.1007/s00294-004-0504-x",
"10.1007/s00294-005-0022-5",
"10.1007/s00294-016-0600-8",
"10.1007/s00294-016-0670-7",
"10.1007/s00294-017-0753-0",
"10.1007/s00294-018-0855-3",
"10.1007/s00294-018-0873-1",
"10.1007/s00294-019-00999-3",
"10.1007/s00294-020-01120-9",
"10.1007/s00294-020-01127-2",
"10.1007/s00299-007-0317-8",
"10.1007/s00330-014-3492-3",
"10.1007/s00330-019-06544-7",
"10.1007/s00330-023-10483-9",
"10.1007/s00335-001-1003-8",
"10.1007/s00335-007-9036-2",
"10.1007/s00335-015-9603-x",
"10.1007/s00344-014-9464-7",
"10.1007/s00348-020-03027-0",
"10.1007/s00359-004-0540-5",
"10.1007/s00359-004-0565-9",
"10.1007/s00360-018-1199-5",
"10.1007/s00360-022-01471-4",
"10.1007/s00394-021-02677-y",
"10.1007/s00395-011-0213-9",
"10.1007/s00395-018-0686-x",
"10.1007/s00395-019-0766-6",
"10.1007/s00401-005-0991-y",
"10.1007/s00401-005-1070-0",
"10.1007/s00401-006-0038-z",
"10.1007/s00401-009-0590-4",
"10.1007/s00401-011-0843-x",
"10.1007/s00401-011-0891-2",
"10.1007/s00401-013-1155-0",
"10.1007/s00401-013-1173-y",
"10.1007/s00401-015-1413-4",
"10.1007/s00401-018-1829-8",
"10.1007/s00401-019-01980-7",
"10.1007/s00401-019-01993-2",
"10.1007/s00401-019-02000-4",
"10.1007/s00401-021-02333-z",
"10.1007/s00401-022-02488-3",
"10.1007/s00401-023-02565-1",
"10.1007/s00401-023-02601-0",
"10.1007/s004010000275",
"10.1007/s004010100392",
"10.1007/s00404-012-2279-5",
"10.1007/s00404-023-07225-z",
"10.1007/s00412-003-0237-5",
"10.1007/s00412-007-0124-6",
"10.1007/s00412-009-0226-4",
"10.1007/s00412-013-0436-7",
"10.1007/s00412-014-0463-z",
"10.1007/s00412-015-0516-y",
"10.1007/s00412-015-0543-8",
"10.1007/s00412-017-0631-z",
"10.1007/s00412-019-00714-8",
"10.1007/s00412-020-00734-9",
"10.1007/s00412-021-00763-y",
"10.1007/s00417-002-0429-3",
"10.1007/s00417-015-3024-0",
"10.1007/s00418-011-0897-9",
"10.1007/s00418-016-1445-4",
"10.1007/s00418-016-1520-x",
"10.1007/s00418-017-1604-2",
"10.1007/s00418-018-1677-6",
"10.1007/s00418-018-1732-3",
"10.1007/s00418-020-01930-5",
"10.1007/s00418-023-02251-z",
"10.1007/s00421-016-3413-z",
"10.1007/s00424-005-0030-9",
"10.1007/s00424-006-0112-3",
"10.1007/s00424-011-1044-0",
"10.1007/s00424-016-1865-y",
"10.1007/s00424-021-02562-x",
"10.1007/s00424-023-02853-5",
"10.1007/s00425-010-1179-9",
"10.1007/s00425-012-1782-z",
"10.1007/s00425-017-2727-3",
"10.1007/s00425-019-03173-8",
"10.1007/s00425-019-03283-3",
"10.1007/s00425-020-03415-0",
"10.1007/s00428-005-0003-6",
"10.1007/s00428-019-02579-9",
"10.1007/s00429-003-0338-1",
"10.1007/s00429-004-0384-3",
"10.1007/s00429-010-0245-1",
"10.1007/s00429-010-0254-0",
"10.1007/s00429-010-0265-x",
"10.1007/s00429-011-0322-0",
"10.1007/s00429-012-0493-3",
"10.1007/s00429-013-0531-9",
"10.1007/s00429-013-0660-1",
"10.1007/s00429-014-0796-7",
"10.1007/s00429-014-0848-z",
"10.1007/s00429-014-0853-2",
"10.1007/s00429-016-1284-z",
"10.1007/s00429-016-1354-2",
"10.1007/s00429-017-1436-9",
"10.1007/s00429-018-1692-3",
"10.1007/s00429-018-1710-5",
"10.1007/s00429-018-1744-8",
"10.1007/s00429-018-1806-y",
"10.1007/s00429-019-01860-6",
"10.1007/s00429-019-02023-3",
"10.1007/s00429-020-02025-6",
"10.1007/s00429-022-02458-1",
"10.1007/s00429-023-02644-9",
"10.1007/s00432-014-1738-8",
"10.1007/s00432-019-02909-z",
"10.1007/s00432-020-03349-w",
"10.1007/s00432-021-03787-0",
"10.1007/s00432-024-05737-y",
"10.1007/s00435-007-0034-4",
"10.1007/s00435-019-00462-4",
"10.1007/s00436-012-3004-9",
"10.1007/s00436-015-4507-y",
"10.1007/s00436-015-4803-6",
"10.1007/s00436-019-06332-8",
"10.1007/s00436-020-06822-0",
"10.1007/s00438-002-0787-x",
"10.1007/s00438-008-0389-3",
"10.1007/s00438-011-0658-4",
"10.1007/s00438-012-0695-7",
"10.1007/s00438-016-1198-8",
"10.1007/s00438-017-1350-0",
"10.1007/s00438-017-1370-9",
"10.1007/s00438-020-01662-0",
"10.1007/s00438-021-01762-5",
"10.1007/s004380051039",
"10.1007/s00439-010-0914-4",
"10.1007/s00439-012-1154-6",
"10.1007/s00439-017-1837-0",
"10.1007/s00439-019-02073-x",
"10.1007/s00439-020-02138-2",
"10.1007/s00439-021-02411-y",
"10.1007/s004390050443",
"10.1007/s00441-007-0432-4",
"10.1007/s00441-007-0478-3",
"10.1007/s00441-007-0536-x",
"10.1007/s00441-011-1196-4",
"10.1007/s00441-011-1200-z",
"10.1007/s00441-011-1228-0",
"10.1007/s00441-013-1612-z",
"10.1007/s00441-014-1895-8",
"10.1007/s00441-017-2704-y",
"10.1007/s00441-017-2735-4",
"10.1007/s00441-019-03076-w",
"10.1007/s00441-021-03486-9",
"10.1007/s004410000306",
"10.1007/s00442-017-3866-8",
"10.1007/s00497-022-00445-4",
"10.1007/s00572-020-00987-3",
"10.1007/s00592-017-1021-y",
"10.1007/s00702-008-0032-9",
"10.1007/s00702-017-1745-4",
"10.1007/s00705-012-1391-y",
"10.1007/s00709-016-1060-1",
"10.1007/s00709-020-01590-1",
"10.1007/s00726-010-0575-6",
"10.1007/s00726-014-1775-2",
"10.1007/s00726-015-2087-x",
"10.1007/s00726-020-02937-x",
"10.1007/s00775-007-0205-2",
"10.1007/s00787-017-0959-1",
"10.1007/s00795-015-0109-0",
"10.1007/s00894-012-1489-x",
"10.1007/s00894-015-2799-6",
"10.1007/s00894-017-3258-3",
"10.1007/s00894-020-4289-8",
"10.1007/s00894-021-04779-0",
"10.1007/s00894-023-05802-2",
"10.1007/s10014-007-0225-1",
"10.1007/s10038-008-0271-5",
"10.1007/s10059-010-0009-z",
"10.1007/s10067-016-3202-4",
"10.1007/s10072-016-2802-8",
"10.1007/s10096-005-1278-x",
"10.1007/s10096-023-04548-2",
"10.1007/s10096-023-04677-8",
"10.1007/s100960000315",
"10.1007/s10103-010-0761-5",
"10.1007/s10103-017-2317-4",
"10.1007/s10120-021-01180-x",
"10.1007/s10123-023-00389-3",
"10.1007/s10126-019-09942-6",
"10.1007/s101260000026",
"10.1007/s10142-002-0059-1",
"10.1007/s10142-017-0572-x",
"10.1007/s10142-021-00815-7",
"10.1007/s10142-023-01037-9",
"10.1007/s10147-008-0770-6",
"10.1007/s10147-021-01892-1",
"10.1007/s10162-021-00794-3",
"10.1007/s10237-012-0381-z",
"10.1007/s10237-020-01374-9",
"10.1007/s10238-011-0153-6",
"10.1007/s10238-023-01121-1",
"10.1007/s10254-005-0041-0",
"10.1007/s10265-011-0431-0",
"10.1007/s10265-021-01294-4",
"10.1007/s10334-013-0394-3",
"10.1007/s10340-018-0966-0",
"10.1007/s10388-023-01006-y",
"10.1007/s10393-020-01504-w",
"10.1007/s10409-017-0677-4",
"10.1007/s10439-010-0192-2",
"10.1007/s10439-017-1827-3",
"10.1007/s10439-017-1967-5",
"10.1007/s10456-013-9365-6",
"10.1007/s10456-013-9404-3",
"10.1007/s10456-013-9407-0",
"10.1007/s10456-020-09722-0",
"10.1007/s10456-021-09785-7",
"10.1007/s10456-021-09792-8",
"10.1007/s10456-024-09917-9",
"10.1007/s10456-024-09929-5",
"10.1007/s10495-014-1005-0",
"10.1007/s10495-020-01629-x",
"10.1007/s10522-008-9204-0",
"10.1007/s10522-018-9753-9",
"10.1007/s10529-015-1765-9",
"10.1007/s10534-005-4452-9",
"10.1007/s10534-008-9202-3",
"10.1007/s10534-010-9373-6",
"10.1007/s10539-014-9469-4",
"10.1007/s10541-005-0076-5",
"10.1007/s10549-017-4570-4",
"10.1007/s10549-019-05252-6",
"10.1007/s10549-020-05682-7",
"10.1007/s10549-020-05991-x",
"10.1007/s10552-016-0753-2",
"10.1007/s10555-005-5865-1",
"10.1007/s10555-008-9127-x",
"10.1007/s10555-010-9222-7",
"10.1007/s10555-016-9628-y",
"10.1007/s10555-017-9725-6",
"10.1007/s10555-020-09911-9",
"10.1007/s10555-020-09920-8",
"10.1007/s10555-021-09990-2",
"10.1007/s10555-021-09997-9",
"10.1007/s10557-020-07007-8",
"10.1007/s10565-018-9428-y",
"10.1007/s10571-011-9670-9",
"10.1007/s10571-021-01058-7",
"10.1007/s10577-015-9499-z",
"10.1007/s10577-016-9544-6",
"10.1007/s10577-017-9570-z",
"10.1007/s10577-018-9571-6",
"10.1007/s10577-018-9594-z",
"10.1007/s10585-010-9312-5",
"10.1007/s10585-011-9406-8",
"10.1007/s10585-022-10185-4",
"10.1007/s10616-007-9093-0",
"10.1007/s10620-014-3297-x",
"10.1007/s10620-014-3372-3",
"10.1007/s10620-017-4603-1",
"10.1007/s10646-019-02047-9",
"10.1007/s10658-007-9162-4",
"10.1007/s10658-007-9204-y",
"10.1007/s10658-013-0199-2",
"10.1007/s10658-018-1556-y",
"10.1007/s10683-017-9528-1",
"10.1007/s10695-018-0552-7",
"10.1007/s10695-018-0567-0",
"10.1007/s10711-012-9705-5",
"10.1007/s10719-007-9042-3",
"10.1007/s10719-008-9116-x",
"10.1007/s10719-018-9842-7",
"10.1007/s10719-021-10007-x",
"10.1007/s10722-010-9533-0",
"10.1007/s10725-010-9497-2",
"10.1007/s10725-018-0472-7",
"10.1007/s10735-014-9575-2",
"10.1007/s10750-006-0440-5",
"10.1007/s10750-015-2417-8",
"10.1007/s10750-019-03973-9",
"10.1007/s10750-020-04210-4",
"10.1007/s10750-020-04251-9",
"10.1007/s10753-013-9621-3",
"10.1007/s10753-014-0068-y",
"10.1007/s10753-016-0431-2",
"10.1007/s10753-016-0470-8",
"10.1007/s10787-019-00661-x",
"10.1007/s10815-010-9473-9",
"10.1007/s10815-014-0185-4",
"10.1007/s10815-014-0230-3",
"10.1007/s10815-016-0738-9",
"10.1007/s10815-020-01925-0",
"10.1007/s10822-014-9779-2",
"10.1007/s10822-017-0029-2",
"10.1007/s10822-017-0066-x",
"10.1007/s10822-018-0111-4",
"10.1007/s10822-019-00212-0",
"10.1007/s10847-009-9593-y",
"10.1007/s10863-013-9510-3",
"10.1007/s10867-020-09548-3",
"10.1007/s10875-007-9084-0",
"10.1007/s10875-009-9357-x",
"10.1007/s10875-016-0245-x",
"10.1007/s10875-017-0433-3",
"10.1007/s10875-018-0525-8",
"10.1007/s10875-020-00745-2",
"10.1007/s10875-020-00817-3",
"10.1007/s10875-022-01289-3",
"10.1007/s10886-006-9094-z",
"10.1007/s10895-007-0225-x",
"10.1007/s10930-019-09845-4",
"10.1007/s10955-007-9470-2",
"10.1007/s10969-009-9060-4",
"10.1007/s10974-019-09559-1",
"10.1007/s11010-005-3078-0",
"10.1007/s11010-009-0289-9",
"10.1007/s11010-010-0485-7",
"10.1007/s11010-012-1390-z",
"10.1007/s11010-014-2079-2",
"10.1007/s11011-014-9512-9",
"10.1007/s11030-022-10570-x",
"10.1007/s11032-009-9367-7",
"10.1007/s11032-011-9576-8",
"10.1007/s11033-011-1338-5",
"10.1007/s11033-018-4262-0",
"10.1007/s11033-019-05150-6",
"10.1007/s11033-019-05167-x",
"10.1007/s11033-020-05930-5",
"10.1007/s11033-021-06648-8",
"10.1007/s11033-021-06819-7",
"10.1007/s11055-016-0374-y",
"10.1007/s11064-007-9366-1",
"10.1007/s11064-008-9678-9",
"10.1007/s11064-009-9963-2",
"10.1007/s11064-015-1615-0",
"10.1007/s11064-017-2307-8",
"10.1007/s11064-019-02844-y",
"10.1007/s11071-011-9993-6",
"10.1007/s11095-006-9224-x",
"10.1007/s11095-016-1939-8",
"10.1007/s11095-018-2564-5",
"10.1007/s11101-006-9035-z",
"10.1007/s11101-020-09682-9",
"10.1007/s11103-004-0274-3",
"10.1007/s11103-005-4477-z",
"10.1007/s11103-007-9145-z",
"10.1007/s11103-020-01103-x",
"10.1007/s11103-021-01125-z",
"10.1007/s11103-021-01126-y",
"10.1007/s11103-023-01398-6",
"10.1007/s11105-013-0597-9",
"10.1007/s11105-013-0642-8",
"10.1007/s11105-018-1111-1",
"10.1007/s11119-018-9573-6",
"10.1007/s11120-016-0284-4",
"10.1007/s11120-022-00925-8",
"10.1007/s11136-024-03701-4",
"10.1007/s11154-010-9147-z",
"10.1007/s11154-012-9221-9",
"10.1007/s11240-014-0551-z",
"10.1007/s11259-021-09796-1",
"10.1007/s11262-010-0505-4",
"10.1007/s11262-012-0809-7",
"10.1007/s11274-021-03195-z",
"10.1007/s11295-012-0499-2",
"10.1007/s11295-014-0780-7",
"10.1007/s11295-014-0811-4",
"10.1007/s11295-016-1034-7",
"10.1007/s11295-018-1257-x",
"10.1007/s11295-021-01528-5",
"10.1007/s11302-009-9140-8",
"10.1007/s11302-010-9187-6",
"10.1007/s11302-012-9294-7",
"10.1007/s11302-016-9529-0",
"10.1007/s11302-022-09910-1",
"10.1007/s11302-023-09925-2",
"10.1007/s11332-020-00714-7",
"10.1007/s11356-014-3887-3",
"10.1007/s11356-016-7003-8",
"10.1007/s11356-020-11620-3",
"10.1007/s11356-021-14023-0",
"10.1007/s11356-022-24663-5",
"10.1007/s11357-005-4004-9",
"10.1007/s11357-020-00183-3",
"10.1007/s11357-020-00317-7",
"10.1007/s11357-021-00335-z",
"10.1007/s11357-021-00358-6",
"10.1007/s11416-020-00374-8",
"10.1007/s11427-009-0152-y",
"10.1007/s11427-018-9402-9",
"10.1007/s11427-020-1702-x",
"10.1007/s11427-022-2147-2",
"10.1007/s11427-022-2209-3",
"10.1007/s11427-023-2481-3",
"10.1007/s11434-012-5461-z",
"10.1007/s11434-015-0905-x",
"10.1007/s11481-009-9164-4",
"10.1007/s11481-010-9205-z",
"10.1007/s11481-011-9265-8",
"10.1007/s11481-011-9299-y",
"10.1007/s11481-018-9786-5",
"10.1007/s11481-020-09959-y",
"10.1007/s11523-021-00819-0",
"10.1007/s11538-014-9986-y",
"10.1007/s11596-019-2117-0",
"10.1007/s11689-010-9055-2",
"10.1007/s11693-011-9076-5",
"10.1007/s11743-015-1686-6",
"10.1007/s11831-022-09811-x",
"10.1007/s11882-011-0179-6",
"10.1007/s11892-005-0005-4",
"10.1007/s11899-018-0463-9",
"10.1007/s11899-019-00521-z",
"10.1007/s11910-015-0588-3",
"10.1007/s11914-019-00503-3",
"10.1007/s11920-020-01148-1",
"10.1007/s11926-020-00944-1",
"10.1007/s12010-010-9037-6",
"10.1007/s12010-014-1014-z",
"10.1007/s12010-016-2114-8",
"10.1007/s12010-019-02998-z",
"10.1007/s12011-017-1020-4",
"10.1007/s12015-014-9567-3",
"10.1007/s12015-015-9598-4",
"10.1007/s12015-016-9703-3",
"10.1007/s12015-017-9767-8",
"10.1007/s12015-018-9811-3",
"10.1007/s12015-018-9847-4",
"10.1007/s12015-019-09920-4",
"10.1007/s12015-021-10135-9",
"10.1007/s12015-023-10610-5",
"10.1007/s12017-019-08532-y",
"10.1007/s12021-016-9315-8",
"10.1007/s12021-023-09644-4",
"10.1007/s12026-009-8160-3",
"10.1007/s12026-011-8205-2",
"10.1007/s12029-009-9125-4",
"10.1007/s12029-020-00386-z",
"10.1007/s12031-008-9114-2",
"10.1007/s12031-008-9118-y",
"10.1007/s12031-010-9329-x",
"10.1007/s12031-018-1214-z",
"10.1007/s12031-018-1226-8",
"10.1007/s12031-023-02123-0",
"10.1007/s12032-015-0624-9",
"10.1007/s12032-018-1084-9",
"10.1007/s12033-009-9239-8",
"10.1007/s12035-012-8339-9",
"10.1007/s12035-013-8405-y",
"10.1007/s12035-014-9034-9",
"10.1007/s12035-016-9742-4",
"10.1007/s12035-017-0405-x",
"10.1007/s12035-017-0815-9",
"10.1007/s12035-018-0951-x",
"10.1007/s12035-018-1458-1",
"10.1007/s12035-019-01701-x",
"10.1007/s12035-019-01727-1",
"10.1007/s12035-020-02144-5",
"10.1007/s12035-023-03261-7",
"10.1007/s12038-018-9768-z",
"10.1007/s12038-021-00138-6",
"10.1007/s12039-019-1646-1",
"10.1007/s12079-020-00596-x",
"10.1007/s12094-020-02420-9",
"10.1007/s12104-018-9810-y",
"10.1007/s12185-011-0872-1",
"10.1007/s12185-016-1984-4",
"10.1007/s12192-010-0179-9",
"10.1007/s12192-016-0710-8",
"10.1007/s12195-008-0004-z",
"10.1007/s12195-015-0415-6",
"10.1007/s12206-012-1002-6",
"10.1007/s12223-012-0195-5",
"10.1007/s12264-017-0166-6",
"10.1007/s12264-020-00615-2",
"10.1007/s12264-021-00796-4",
"10.1007/s12268-017-0812-6",
"10.1007/s12272-020-01247-w",
"10.1007/s12272-023-01473-y",
"10.1007/s12275-008-0308-7",
"10.1007/s12275-012-2468-8",
"10.1007/s12275-014-4112-2",
"10.1007/s12275-015-5308-9",
"10.1007/s12275-016-6175-8",
"10.1007/s12281-009-0021-y",
"10.1007/s12307-009-0030-y",
"10.1007/s12307-010-0043-6",
"10.1007/s12307-011-0069-4",
"10.1007/s12307-012-0126-7",
"10.1007/s12308-009-0021-4",
"10.1007/s12311-010-0208-3",
"10.1007/s12311-010-0226-1",
"10.1007/s12311-014-0548-5",
"10.1007/s12311-014-0618-8",
"10.1007/s12311-015-0724-2",
"10.1007/s12311-018-0952-3",
"10.1007/s12325-020-01287-0",
"10.1007/s12374-016-0463-z",
"10.1007/s12539-016-0150-2",
"10.1007/s12539-018-0298-z",
"10.1007/s12551-020-00680-x",
"10.1007/s12551-023-01054-9",
"10.1007/s12560-021-09483-z",
"10.1007/s12565-015-0317-7",
"10.1007/s12565-017-0419-5",
"10.1007/s12565-023-00743-5",
"10.1007/s12600-023-01063-0",
"10.1007/s12640-012-9355-2",
"10.1007/s12640-016-9687-4",
"10.1007/s12668-015-0189-2",
"10.1007/s12672-022-00550-w",
"10.1007/s12975-020-00857-2",
"10.1007/s13105-024-01020-3",
"10.1007/s13131-012-0182-3",
"10.1007/s13197-013-1010-2",
"10.1007/s13199-009-0020-3",
"10.1007/s13199-022-00854-z",
"10.1007/s13205-013-0144-2",
"10.1007/s13205-023-03569-0",
"10.1007/s13238-011-1079-1",
"10.1007/s13238-017-0450-2",
"10.1007/s13238-018-0518-7",
"10.1007/s13238-018-0563-2",
"10.1007/s13238-018-0576-x",
"10.1007/s13238-019-0623-2",
"10.1007/s13238-019-0638-8",
"10.1007/s13238-020-00819-2",
"10.1007/s13246-016-0475-5",
"10.1007/s13258-020-01031-6",
"10.1007/s13277-016-5112-0",
"10.1007/s13353-011-0057-x",
"10.1007/s13361-018-1911-4",
"10.1007/s13365-017-0584-2",
"10.1007/s13402-019-00453-z",
"10.1007/s13402-020-00561-1",
"10.1007/s13577-015-0110-x",
"10.1007/s13577-016-0144-8",
"10.1007/s13577-019-00242-8",
"10.1007/s13592-015-0389-3",
"10.1007/s13592-019-00647-2",
"10.1007/s13593-012-0105-x",
"10.1007/s13593-023-00915-7",
"10.1007/s13744-020-00777-8",
"10.1007/s13760-021-01612-6",
"10.1007/s13770-022-00443-7",
"10.1007/s15010-021-01644-3",
"10.1007/s40121-022-00606-y",
"10.1007/s40123-023-00729-6",
"10.1007/s40200-022-01019-x",
"10.1007/s40259-018-0303-4",
"10.1007/s40259-020-00465-4",
"10.1007/s40259-023-00635-0",
"10.1007/s40263-019-00657-9",
"10.1007/s40268-021-00357-0",
"10.1007/s40273-018-0734-2",
"10.1007/s40279-019-01070-4",
"10.1007/s40291-018-0355-7",
"10.1007/s40291-022-00634-x",
"10.1007/s40484-019-0154-0",
"10.1007/s40484-019-0172-y",
"10.1007/s40544-022-0653-2",
"10.1007/s40572-017-0142-3",
"10.1007/s40588-015-0015-1",
"10.1007/s40778-018-0128-6",
"10.1007/s40778-020-00177-z",
"10.1007/s40778-021-00193-7",
"10.1007/s41365-019-0683-2",
"10.1007/s42452-020-2498-5",
"10.1007/s42764-020-00017-8",
"10.1007/s42764-020-00022-x",
"10.1007/s42770-022-00743-z",
"10.1007/s42995-021-00118-7",
"10.1007/s43440-021-00344-x",
"10.1007/s43630-023-00437-x",
"10.1016/0003-2697(83)90418-9",
"10.1016/0006-291x(90)90827-a",
"10.1016/0006-2952(89)90176-7",
"10.1016/0006-2952(95)00052-2",
"10.1016/0006-8993(79)90485-2",
"10.1016/0006-8993(82)91250-1",
"10.1016/0008-8749(84)90251-x",
"10.1016/0008-8749(91)90347-e",
"10.1016/0012-1606(77)90158-0",
"10.1016/0012-1606(83)90201-4",
"10.1016/0014-4827(65)90211-9",
"10.1016/0014-4886(61)90055-3",
"10.1016/0014-5793(90)81005-9",
"10.1016/0014-5793(95)00728-r",
"10.1016/0014-5793(96)00334-1",
"10.1016/0020-0190(93)90155-3",
"10.1016/0021-9991(77)90098-5",
"10.1016/0021-9991(83)90014-1",
"10.1016/0022-1910(72)90030-3",
"10.1016/0022-1910(73)90049-8",
"10.1016/0022-1910(80)90104-3",
"10.1016/0022-1910(88)90127-8",
"10.1016/0022-1910(89)90023-1",
"10.1016/0022-1910(89)90131-5",
"10.1016/0022-1910(90)90110-2",
"10.1016/0022-1910(92)90113-r",
"10.1016/0022-2836(75)90089-3",
"10.1016/0022-2836(77)90038-9",
"10.1016/0022-2836(80)90304-6",
"10.1016/0022-2836(83)90049-9",
"10.1016/0035-9203(71)90036-8",
"10.1016/0035-9203(81)90019-5",
"10.1016/0035-9203(84)90114-7",
"10.1016/0038-0717(76)90003-1",
"10.1016/0040-8166(88)90076-6",
"10.1016/0092-8674(81)90502-x",
"10.1016/0092-8674(83)90015-6",
"10.1016/0092-8674(83)90056-9",
"10.1016/0092-8674(86)90515-5",
"10.1016/0092-8674(86)90762-2",
"10.1016/0092-8674(90)90186-i",
"10.1016/0092-8674(90)90385-r",
"10.1016/0092-8674(90)90397-w",
"10.1016/0092-8674(91)90036-x",
"10.1016/0092-8674(91)90098-j",
"10.1016/0092-8674(91)90369-a",
"10.1016/0092-8674(91)90637-e",
"10.1016/0092-8674(91)90639-g",
"10.1016/0092-8674(92)90562-q",
"10.1016/0092-8674(93)80067-o",
"10.1016/0092-8674(93)90383-2",
"10.1016/0092-8674(93)90626-2",
"10.1016/0092-8674(94)90169-4",
"10.1016/0092-8674(94)90197-x",
"10.1016/0092-8674(94)90200-3",
"10.1016/0092-8674(94)90334-4",
"10.1016/0092-8674(94)90396-4",
"10.1016/0092-8674(95)90298-8",
"10.1016/0140-6736(92)91958-b",
"10.1016/0140-6736(93)90416-e",
"10.1016/0165-0270(91)90128-m",
"10.1016/0165-3806(85)90021-5",
"10.1016/0165-7992(93)90015-n",
"10.1016/0166-2236(96)10049-7",
"10.1016/0166-3542(91)90068-3",
"10.1016/0167-0115(90)90001-d",
"10.1016/0167-5699(93)90198-t",
"10.1016/0167-8817(85)90018-5",
"10.1016/0168-9525(93)90209-z",
"10.1016/0197-0186(86)90021-5",
"10.1016/0263-7855(96)00018-5",
"10.1016/0272-7714(87)90059-x",
"10.1016/0300-9084(96)82192-4",
"10.1016/0304-3940(95)11637-c",
"10.1016/0304-3959(96)03021-7",
"10.1016/0304-4157(82)90009-0",
"10.1016/0304-4165(78)90456-7",
"10.1016/0305-0491(92)90427-s",
"10.1016/0306-4522(86)90074-6",
"10.1016/0306-4522(93)90335-d",
"10.1016/0306-4522(94)90293-3",
"10.1016/0378-1119(82)90083-x",
"10.1016/0378-1119(89)90332-6",
"10.1016/0378-1119(91)90434-d",
"10.1016/0378-1119(92)90627-2",
"10.1016/0896-6273(90)90136-4",
"10.1016/0896-6273(91)90374-9",
"10.1016/0921-8777(91)90065-w",
"10.1016/0925-4773(96)00527-8",
"10.1016/0960-0760(92)90108-u",
"10.1016/0960-0760(93)90291-4",
"10.1016/0962-8924(93)90066-a",
"10.1016/0968-0004(94)90115-5",
"10.1016/1044-0305(94)80016-2",
"10.1016/b0-443-07287-6/50065-5",
"10.1016/b978-0-12-374145-5.00091-7",
"10.1016/b978-0-12-374546-0.00029-8",
"10.1016/b978-0-12-384747-8.10011-x",
"10.1016/b978-0-12-394389-7.00001-6",
"10.1016/b978-0-12-394802-1.00009-1",
"10.1016/b978-0-12-397265-1.00098-8",
"10.1016/b978-0-12-398312-1.00013-5",
"10.1016/b978-0-12-407190-2.00001-0",
"10.1016/b978-0-12-411552-1.00002-8",
"10.1016/b978-0-12-416008-8.00022-x",
"10.1016/b978-0-12-417028-5.00010-7",
"10.1016/b978-0-12-800101-1.00012-0",
"10.1016/b978-0-12-800259-9.00001-9",
"10.1016/b978-0-12-801393-9.00014-1",
"10.1016/b978-0-12-802002-9.00010-8",
"10.1016/b978-0-12-809633-8.20106-4",
"10.1016/b978-0-12-811060-7.00013-9",
"10.1016/b978-0-12-813187-9.00018-4",
"10.1016/b978-0-12-814405-3.00006-0",
"10.1016/b978-0-12-814405-3.00019-9",
"10.1016/b978-0-12-814407-7.00016-x",
"10.1016/b978-0-12-816137-1.00028-3",
"10.1016/b978-0-12-816228-6.00011-8",
"10.1016/b978-0-12-817558-3.00016-0",
"10.1016/b978-0-12-818882-8.00004-8",
"10.1016/b978-0-12-820018-6.00008-9",
"10.1016/b978-0-12-820084-1.00012-0",
"10.1016/b978-0-12-824048-9.00020-1",
"10.1016/b978-0-12-849870-5.00018-5",
"10.1016/b978-0-444-62604-2.00022-8",
"10.1016/b978-0-444-63956-1.00003-5",
"10.1016/b978-0-444-64239-4.00014-x",
"10.1016/b978-0-7020-6896-6.00027-2",
"10.1016/b978-008055232-3.60073-x",
"10.1016/b978-012053641-2/50002-2",
"10.1016/b978-012426260-7.50008-2",
"10.1016/bs.aambs.2014.09.001",
"10.1016/bs.abr.2016.01.004",
"10.1016/bs.abr.2018.09.001",
"10.1016/bs.acc.2019.07.001",
"10.1016/bs.accb.2018.09.001",
"10.1016/bs.acr.2018.02.004",
"10.1016/bs.acr.2021.02.002",
"10.1016/bs.ai.2018.04.002",
"10.1016/bs.ai.2022.07.001",
"10.1016/bs.ai.2023.03.002",
"10.1016/bs.aiip.2015.06.002",
"10.1016/bs.aiip.2017.03.001",
"10.1016/bs.aiip.2019.01.006",
"10.1016/bs.aiip.2020.03.001",
"10.1016/bs.aivir.2020.01.002",
"10.1016/bs.ant.2017.07.001",
"10.1016/bs.ant.2018.10.007",
"10.1016/bs.apcsb.2017.04.008",
"10.1016/bs.apcsb.2018.10.001",
"10.1016/bs.apcsb.2019.08.007",
"10.1016/bs.apcsb.2020.09.004",
"10.1016/bs.apha.2016.07.001",
"10.1016/bs.ctdb.2016.01.005",
"10.1016/bs.ctdb.2016.09.003",
"10.1016/bs.ctdb.2017.10.009",
"10.1016/bs.ctdb.2017.11.004",
"10.1016/bs.ctdb.2019.01.006",
"10.1016/bs.ctdb.2019.10.002",
"10.1016/bs.ctdb.2019.11.002",
"10.1016/bs.ctm.2016.07.003",
"10.1016/bs.enz.2017.03.006",
"10.1016/bs.enz.2017.03.007",
"10.1016/bs.enz.2017.03.008",
"10.1016/bs.enz.2019.07.001",
"10.1016/bs.enz.2020.06.009",
"10.1016/bs.ircmb.2018.05.007",
"10.1016/bs.ircmb.2019.12.002",
"10.1016/bs.mie.2014.11.046",
"10.1016/bs.mie.2015.03.002",
"10.1016/bs.mie.2018.07.005",
"10.1016/bs.pbr.2016.04.012",
"10.1016/bs.pbr.2019.08.001",
"10.1016/bs.pmbts.2015.04.010",
"10.1016/bs.pmbts.2016.05.009",
"10.1016/bs.pmbts.2017.12.004",
"10.1016/bs.pmch.2018.01.002",
"10.1016/j.ab.2015.02.006",
"10.1016/j.ab.2018.07.017",
"10.1016/j.ab.2022.114546",
"10.1016/j.abb.2005.01.018",
"10.1016/j.abb.2009.01.001",
"10.1016/j.abb.2012.04.018",
"10.1016/j.abb.2014.07.026",
"10.1016/j.abb.2015.12.012",
"10.1016/j.abb.2016.04.004",
"10.1016/j.abb.2016.10.016",
"10.1016/j.abb.2019.01.011",
"10.1016/j.abb.2019.04.002",
"10.1016/j.acra.2021.02.009",
"10.1016/j.actao.2014.06.004",
"10.1016/j.actatropica.2005.04.014",
"10.1016/j.actatropica.2008.10.010",
"10.1016/j.actatropica.2021.106070",
"10.1016/j.actbio.2007.04.002",
"10.1016/j.actbio.2010.05.025",
"10.1016/j.actbio.2013.06.016",
"10.1016/j.actbio.2015.03.007",
"10.1016/j.actbio.2016.11.054",
"10.1016/j.actbio.2016.12.034",
"10.1016/j.actbio.2017.04.018",
"10.1016/j.actbio.2017.11.037",
"10.1016/j.actbio.2018.08.005",
"10.1016/j.actbio.2020.09.038",
"10.1016/j.actbio.2020.11.044",
"10.1016/j.actbio.2021.04.052",
"10.1016/j.acthis.2008.05.002",
"10.1016/j.acthis.2015.01.003",
"10.1016/j.addr.2010.05.009",
"10.1016/j.addr.2012.09.019",
"10.1016/j.addr.2017.04.010",
"10.1016/j.addr.2018.06.010",
"10.1016/j.addr.2019.11.005",
"10.1016/j.addr.2022.114416",
"10.1016/j.advenzreg.2008.12.003",
"10.1016/j.aiopen.2021.01.001",
"10.1016/j.ajhg.2009.03.010",
"10.1016/j.ajhg.2011.10.008",
"10.1016/j.ajhg.2012.05.013",
"10.1016/j.ajhg.2013.06.001",
"10.1016/j.ajhg.2015.03.002",
"10.1016/j.ajhg.2016.10.002",
"10.1016/j.ajhg.2017.06.010",
"10.1016/j.ajhg.2019.05.016",
"10.1016/j.ajic.2015.12.012",
"10.1016/j.ajme.2015.06.002",
"10.1016/j.ajpath.2011.01.035",
"10.1016/j.ajpath.2015.05.006",
"10.1016/j.ajpath.2016.05.011",
"10.1016/j.ajpath.2016.06.020",
"10.1016/j.algal.2016.06.025",
"10.1016/j.algal.2017.04.033",
"10.1016/j.algal.2020.101943",
"10.1016/j.alit.2017.08.004",
"10.1016/j.amjmed.2006.05.030",
"10.1016/j.amjms.2017.06.007",
"10.1016/j.anai.2016.01.003",
"10.1016/j.antiviral.2017.11.001",
"10.1016/j.apjtm.2016.03.013",
"10.1016/j.apsb.2017.05.001",
"10.1016/j.apsb.2020.04.004",
"10.1016/j.apsb.2020.07.006",
"10.1016/j.apsusc.2017.08.150",
"10.1016/j.apsusc.2019.144285",
"10.1016/j.aquaculture.2020.735731",
"10.1016/j.aquatox.2011.07.005",
"10.1016/j.aquatox.2013.11.017",
"10.1016/j.aquatox.2017.11.003",
"10.1016/j.aquatox.2020.105449",
"10.1016/j.arr.2009.10.003",
"10.1016/j.arr.2014.11.005",
"10.1016/j.arr.2019.05.002",
"10.1016/j.arr.2020.101251",
"10.1016/j.arr.2021.101343",
"10.1016/j.asd.2013.04.005",
"10.1016/j.asd.2018.05.004",
"10.1016/j.aspen.2015.12.009",
"10.1016/j.autrev.2017.05.024",
"10.1016/j.autrev.2020.102468",
"10.1016/j.autrev.2021.102761",
"10.1016/j.bbabio.2009.09.005",
"10.1016/j.bbabio.2010.08.010",
"10.1016/j.bbabio.2013.10.014",
"10.1016/j.bbabio.2013.11.005",
"10.1016/j.bbabio.2014.11.011",
"10.1016/j.bbabio.2020.148349",
"10.1016/j.bbadis.2004.08.010",
"10.1016/j.bbadis.2012.06.013",
"10.1016/j.bbadis.2012.11.022",
"10.1016/j.bbadis.2014.04.030",
"10.1016/j.bbadis.2018.01.013",
"10.1016/j.bbadis.2018.04.020",
"10.1016/j.bbadis.2020.165959",
"10.1016/j.bbadis.2021.166155",
"10.1016/j.bbagen.2009.07.027",
"10.1016/j.bbagen.2012.07.005",
"10.1016/j.bbagen.2012.09.002",
"10.1016/j.bbagen.2014.06.006",
"10.1016/j.bbagen.2015.08.013",
"10.1016/j.bbagen.2016.05.021",
"10.1016/j.bbagen.2017.02.009",
"10.1016/j.bbagen.2017.12.002",
"10.1016/j.bbagen.2018.06.001",
"10.1016/j.bbagen.2018.09.009",
"10.1016/j.bbagen.2020.129631",
"10.1016/j.bbagrm.2010.02.003",
"10.1016/j.bbagrm.2012.11.001",
"10.1016/j.bbagrm.2013.03.007",
"10.1016/j.bbagrm.2014.02.015",
"10.1016/j.bbagrm.2014.10.007",
"10.1016/j.bbagrm.2015.04.003",
"10.1016/j.bbagrm.2018.11.009",
"10.1016/j.bbagrm.2019.07.006",
"10.1016/j.bbagrm.2019.194407",
"10.1016/j.bbagrm.2020.194515",
"10.1016/j.bbalip.2014.06.007",
"10.1016/j.bbamcr.2005.03.014",
"10.1016/j.bbamcr.2006.11.010",
"10.1016/j.bbamcr.2009.10.009",
"10.1016/j.bbamcr.2010.09.010",
"10.1016/j.bbamcr.2011.01.003",
"10.1016/j.bbamcr.2012.02.011",
"10.1016/j.bbamcr.2012.04.009",
"10.1016/j.bbamcr.2013.02.026",
"10.1016/j.bbamcr.2013.04.007",
"10.1016/j.bbamcr.2013.07.007",
"10.1016/j.bbamcr.2013.11.018",
"10.1016/j.bbamcr.2015.01.015",
"10.1016/j.bbamcr.2016.04.001",
"10.1016/j.bbamcr.2017.03.008",
"10.1016/j.bbamcr.2019.118570",
"10.1016/j.bbamcr.2020.118727",
"10.1016/j.bbamcr.2020.118786",
"10.1016/j.bbamcr.2020.118889",
"10.1016/j.bbamem.2008.03.017",
"10.1016/j.bbamem.2010.02.004",
"10.1016/j.bbamem.2010.07.010",
"10.1016/j.bbamem.2010.12.017",
"10.1016/j.bbamem.2013.04.011",
"10.1016/j.bbamem.2014.01.031",
"10.1016/j.bbamem.2015.03.021",
"10.1016/j.bbamem.2017.10.033",
"10.1016/j.bbamem.2020.183317",
"10.1016/j.bbapap.2007.08.006",
"10.1016/j.bbapap.2012.03.003",
"10.1016/j.bbapap.2015.04.015",
"10.1016/j.bbapap.2018.04.010",
"10.1016/j.bbapap.2018.10.010",
"10.1016/j.bbcan.2007.05.003",
"10.1016/j.bbcan.2010.11.001",
"10.1016/j.bbcan.2013.10.004",
"10.1016/j.bbcan.2014.07.005",
"10.1016/j.bbcan.2016.06.004",
"10.1016/j.bbcan.2017.09.006",
"10.1016/j.bbcan.2018.01.001",
"10.1016/j.bbi.2010.10.015",
"10.1016/j.bbi.2012.11.013",
"10.1016/j.bbi.2013.10.029",
"10.1016/j.bbi.2014.12.008",
"10.1016/j.bbi.2015.06.008",
"10.1016/j.bbi.2015.09.015",
"10.1016/j.bbi.2015.09.017",
"10.1016/j.bbi.2016.06.006",
"10.1016/j.bbi.2017.05.015",
"10.1016/j.bbi.2017.06.008",
"10.1016/j.bbi.2018.03.005",
"10.1016/j.bbi.2018.06.001",
"10.1016/j.bbi.2018.09.005",
"10.1016/j.bbi.2019.01.013",
"10.1016/j.bbi.2019.05.028",
"10.1016/j.bbi.2019.06.030",
"10.1016/j.bbi.2020.07.015",
"10.1016/j.bbi.2021.04.016",
"10.1016/j.bbi.2021.07.022",
"10.1016/j.bbi.2021.08.223",
"10.1016/j.bbi.2024.01.114",
"10.1016/j.bbih.2020.100077",
"10.1016/j.bbih.2021.100227",
"10.1016/j.bbih.2021.100301",
"10.1016/j.bbmt.2015.04.010",
"10.1016/j.bbmt.2019.08.008",
"10.1016/j.bbr.2007.11.026",
"10.1016/j.bbr.2010.10.030",
"10.1016/j.bbr.2011.06.024",
"10.1016/j.bbr.2013.04.010",
"10.1016/j.bbr.2015.06.017",
"10.1016/j.bbr.2016.12.020",
"10.1016/j.bbr.2017.09.050",
"10.1016/j.bbr.2018.06.025",
"10.1016/j.bbr.2019.111932",
"10.1016/j.bbr.2019.112036",
"10.1016/j.bbrc.2004.01.151",
"10.1016/j.bbrc.2004.09.017",
"10.1016/j.bbrc.2006.08.186",
"10.1016/j.bbrc.2006.09.098",
"10.1016/j.bbrc.2007.11.071",
"10.1016/j.bbrc.2008.05.180",
"10.1016/j.bbrc.2009.03.113",
"10.1016/j.bbrc.2010.07.092",
"10.1016/j.bbrc.2011.06.024",
"10.1016/j.bbrc.2011.06.070",
"10.1016/j.bbrc.2012.06.019",
"10.1016/j.bbrc.2013.05.023",
"10.1016/j.bbrc.2014.05.043",
"10.1016/j.bbrc.2014.05.111",
"10.1016/j.bbrc.2015.02.169",
"10.1016/j.bbrc.2016.05.112",
"10.1016/j.bbrc.2016.09.149",
"10.1016/j.bbrc.2017.03.002",
"10.1016/j.bbrc.2017.04.074",
"10.1016/j.bbrc.2018.10.058",
"10.1016/j.bbrc.2018.12.167",
"10.1016/j.bbrc.2019.03.199",
"10.1016/j.bbrc.2019.06.057",
"10.1016/j.bbrc.2019.11.045",
"10.1016/j.bbrc.2020.03.008",
"10.1016/j.bbrc.2020.08.066",
"10.1016/j.bbrc.2020.11.026",
"10.1016/j.bbrc.2021.01.025",
"10.1016/j.bbrc.2021.04.027",
"10.1016/j.bbrc.2021.09.005",
"10.1016/j.bbrep.2018.11.011",
"10.1016/j.bcmd.2007.05.003",
"10.1016/j.bcmd.2007.10.064",
"10.1016/j.bcmd.2013.07.010",
"10.1016/j.bcp.2009.08.032",
"10.1016/j.bcp.2010.04.027",
"10.1016/j.bcp.2011.06.017",
"10.1016/j.bcp.2013.03.005",
"10.1016/j.bcp.2016.03.009",
"10.1016/j.bcp.2018.01.008",
"10.1016/j.bcp.2018.11.014",
"10.1016/j.bcp.2018.12.010",
"10.1016/j.bcp.2019.06.024",
"10.1016/j.bcp.2020.113905",
"10.1016/j.bcp.2020.114280",
"10.1016/j.bcp.2022.115401",
"10.1016/j.beem.2023.101761",
"10.1016/j.bej.2009.11.007",
"10.1016/j.bej.2021.108124",
"10.1016/j.bioactmat.2021.02.022",
"10.1016/j.biocel.2003.11.009",
"10.1016/j.biocel.2008.06.017",
"10.1016/j.biocel.2019.105589",
"10.1016/j.biochi.2006.07.021",
"10.1016/j.biochi.2011.06.006",
"10.1016/j.biochi.2011.08.021",
"10.1016/j.biochi.2012.02.001",
"10.1016/j.biochi.2014.11.019",
"10.1016/j.biochi.2015.05.020",
"10.1016/j.biochi.2019.02.007",
"10.1016/j.biochi.2021.02.014",
"10.1016/j.bioelechem.2017.09.004",
"10.1016/j.bioelechem.2019.05.010",
"10.1016/j.bioeng.2007.02.009",
"10.1016/j.biologicals.2009.04.004",
"10.1016/j.biomaterials.2005.03.030",
"10.1016/j.biomaterials.2011.01.062",
"10.1016/j.biomaterials.2012.09.062",
"10.1016/j.biomaterials.2012.09.078",
"10.1016/j.biomaterials.2013.06.002",
"10.1016/j.biomaterials.2014.01.056",
"10.1016/j.biomaterials.2014.03.078",
"10.1016/j.biomaterials.2014.04.022",
"10.1016/j.biomaterials.2014.10.043",
"10.1016/j.biomaterials.2014.11.046",
"10.1016/j.biomaterials.2015.01.023",
"10.1016/j.biomaterials.2017.05.007",
"10.1016/j.biomaterials.2019.119464",
"10.1016/j.biomaterials.2020.120057",
"10.1016/j.biomaterials.2020.120595",
"10.1016/j.biomaterials.2021.120903",
"10.1016/j.biomaterials.2021.120919",
"10.1016/j.bioorg.2011.11.001",
"10.1016/j.bioorg.2021.105110",
"10.1016/j.biopha.2015.07.025",
"10.1016/j.biopha.2016.11.127",
"10.1016/j.biopha.2017.09.036",
"10.1016/j.biopha.2018.03.078",
"10.1016/j.biopha.2019.108790",
"10.1016/j.biopha.2020.110956",
"10.1016/j.biopsych.2007.07.018",
"10.1016/j.biopsych.2008.05.034",
"10.1016/j.biopsych.2009.05.009",
"10.1016/j.biopsych.2009.11.016",
"10.1016/j.biopsych.2012.03.007",
"10.1016/j.biopsych.2013.05.036",
"10.1016/j.biopsych.2014.08.001",
"10.1016/j.biopsych.2017.10.030",
"10.1016/j.biopsych.2018.08.008",
"10.1016/j.biopsych.2018.08.018",
"10.1016/j.biopsych.2019.08.022",
"10.1016/j.biopsych.2019.10.021",
"10.1016/j.biopsych.2020.02.354",
"10.1016/j.biortech.2017.05.060",
"10.1016/j.bios.2004.07.021",
"10.1016/j.bios.2013.05.024",
"10.1016/j.bios.2015.12.058",
"10.1016/j.bios.2018.12.040",
"10.1016/j.bios.2019.01.015",
"10.1016/j.bios.2020.112872",
"10.1016/j.biosystems.2013.05.012",
"10.1016/j.biosystems.2015.02.003",
"10.1016/j.biotechadv.2011.09.011",
"10.1016/j.biotechadv.2017.03.003",
"10.1016/j.biotechadv.2020.107630",
"10.1016/j.bj.2021.04.012",
"10.1016/j.blre.2016.10.001",
"10.1016/j.blre.2018.11.003",
"10.1016/j.bmc.2016.12.014",
"10.1016/j.bmc.2018.03.028",
"10.1016/j.bmc.2020.115379",
"10.1016/j.bmc.2021.116162",
"10.1016/j.bmcl.2006.02.022",
"10.1016/j.bmcl.2009.01.038",
"10.1016/j.bone.2004.04.022",
"10.1016/j.bone.2010.03.021",
"10.1016/j.bone.2012.07.015",
"10.1016/j.bone.2015.02.008",
"10.1016/j.bone.2015.05.029",
"10.1016/j.bone.2020.115665",
"10.1016/j.bone.2021.116072",
"10.1016/j.bone.2022.116525",
"10.1016/j.bpc.2007.01.006",
"10.1016/j.bpc.2011.03.010",
"10.1016/j.bpc.2013.09.003",
"10.1016/j.bpj.2008.12.3811",
"10.1016/j.bpj.2009.11.002",
"10.1016/j.bpj.2009.11.039",
"10.1016/j.bpj.2009.12.4332",
"10.1016/j.bpj.2010.05.020",
"10.1016/j.bpj.2011.05.071",
"10.1016/j.bpj.2012.12.003",
"10.1016/j.bpj.2013.05.032",
"10.1016/j.bpj.2013.11.3018",
"10.1016/j.bpj.2013.11.4460",
"10.1016/j.bpj.2014.03.002",
"10.1016/j.bpj.2014.03.014",
"10.1016/j.bpj.2015.06.043",
"10.1016/j.bpj.2015.07.025",
"10.1016/j.bpj.2015.11.369",
"10.1016/j.bpj.2016.02.003",
"10.1016/j.bpj.2016.02.017",
"10.1016/j.bpj.2016.08.016",
"10.1016/j.bpj.2016.11.1827",
"10.1016/j.bpj.2016.11.1918",
"10.1016/j.bpj.2016.11.894",
"10.1016/j.bpj.2017.01.023",
"10.1016/j.bpj.2017.11.2344",
"10.1016/j.bpj.2018.04.038",
"10.1016/j.bpj.2018.08.024",
"10.1016/j.bpj.2018.11.186",
"10.1016/j.bpj.2018.11.3144",
"10.1016/j.bpj.2018.11.322",
"10.1016/j.bpj.2019.12.036",
"10.1016/j.bpj.2020.03.006",
"10.1016/j.bpj.2020.06.014",
"10.1016/j.bpj.2020.06.021",
"10.1016/j.bpj.2020.11.393",
"10.1016/j.bpj.2021.11.1119",
"10.1016/j.bpj.2022.02.026",
"10.1016/j.bpj.2024.03.034",
"10.1016/j.bpsc.2019.12.004",
"10.1016/j.braindev.2015.10.008",
"10.1016/j.braindev.2017.12.002",
"10.1016/j.brainres.2004.01.011",
"10.1016/j.brainres.2004.05.039",
"10.1016/j.brainres.2004.06.075",
"10.1016/j.brainres.2004.09.056",
"10.1016/j.brainres.2005.01.098",
"10.1016/j.brainres.2006.01.125",
"10.1016/j.brainres.2006.03.075",
"10.1016/j.brainres.2006.05.068",
"10.1016/j.brainres.2006.05.105",
"10.1016/j.brainres.2006.07.106",
"10.1016/j.brainres.2006.08.084",
"10.1016/j.brainres.2007.06.037",
"10.1016/j.brainres.2009.09.097",
"10.1016/j.brainres.2009.11.009",
"10.1016/j.brainres.2010.02.075",
"10.1016/j.brainres.2010.05.061",
"10.1016/j.brainres.2012.08.005",
"10.1016/j.brainres.2013.04.049",
"10.1016/j.brainres.2015.12.031",
"10.1016/j.brainres.2016.04.042",
"10.1016/j.brainres.2016.05.015",
"10.1016/j.brainres.2016.12.022",
"10.1016/j.brainres.2018.02.005",
"10.1016/j.brainres.2018.09.034",
"10.1016/j.brainres.2019.146358",
"10.1016/j.brainresbull.2009.08.026",
"10.1016/j.brainresbull.2014.10.008",
"10.1016/j.brainresbull.2021.05.015",
"10.1016/j.brainresrev.2009.12.006",
"10.1016/j.brainresrev.2010.09.008",
"10.1016/j.brainresrev.2010.10.001",
"10.1016/j.breast.2015.12.001",
"10.1016/j.breast.2017.03.010",
"10.1016/j.breast.2017.07.005",
"10.1016/j.brs.2014.11.010",
"10.1016/j.brs.2015.01.415",
"10.1016/j.bsheal.2021.08.003",
"10.1016/j.bsheal.2021.09.001",
"10.1016/j.cair.2004.08.002",
"10.1016/j.canlet.2013.03.031",
"10.1016/j.canlet.2015.01.010",
"10.1016/j.canlet.2015.06.001",
"10.1016/j.canlet.2015.07.040",
"10.1016/j.canlet.2016.02.022",
"10.1016/j.canlet.2017.03.001",
"10.1016/j.canlet.2018.05.018",
"10.1016/j.canlet.2018.05.024",
"10.1016/j.canlet.2018.10.013",
"10.1016/j.canlet.2019.05.030",
"10.1016/j.canlet.2019.06.002",
"10.1016/j.canlet.2019.10.016",
"10.1016/j.canlet.2019.11.009",
"10.1016/j.canlet.2020.08.020",
"10.1016/j.canlet.2021.01.018",
"10.1016/j.carbon.2013.11.067",
"10.1016/j.carbpol.2015.03.008",
"10.1016/j.cardiores.2003.12.005",
"10.1016/j.cardiores.2006.09.003",
"10.1016/j.cbi.2016.04.016",
"10.1016/j.cbi.2019.108762",
"10.1016/j.cbi.2021.109452",
"10.1016/j.cbi.2021.109574",
"10.1016/j.cbpa.2006.02.030",
"10.1016/j.cbpa.2013.02.012",
"10.1016/j.cbpa.2017.10.002",
"10.1016/j.cbpa.2018.11.022",
"10.1016/j.cbpa.2021.01.001",
"10.1016/j.cbpb.2008.06.001",
"10.1016/j.ccell.2015.04.006",
"10.1016/j.ccell.2015.11.011",
"10.1016/j.ccell.2016.03.006",
"10.1016/j.ccell.2016.05.016",
"10.1016/j.ccell.2016.06.005",
"10.1016/j.ccell.2017.01.004",
"10.1016/j.ccell.2017.06.003",
"10.1016/j.ccell.2018.02.005",
"10.1016/j.ccell.2018.08.018",
"10.1016/j.ccell.2019.01.003",
"10.1016/j.ccell.2019.01.019",
"10.1016/j.ccell.2019.07.008",
"10.1016/j.ccell.2019.12.001",
"10.1016/j.ccell.2020.03.015",
"10.1016/j.ccell.2020.06.001",
"10.1016/j.ccell.2021.02.009",
"10.1016/j.ccell.2021.05.002",
"10.1016/j.ccell.2022.07.005",
"10.1016/j.ccell.2024.03.013",
"10.1016/j.cclet.2021.07.064",
"10.1016/j.ccr.2005.03.003",
"10.1016/j.ccr.2006.10.003",
"10.1016/j.ccr.2006.11.020",
"10.1016/j.ccr.2007.07.003",
"10.1016/j.ccr.2007.07.004",
"10.1016/j.ccr.2007.08.033",
"10.1016/j.ccr.2008.03.004",
"10.1016/j.ccr.2008.07.003",
"10.1016/j.ccr.2008.07.005",
"10.1016/j.ccr.2009.06.018",
"10.1016/j.ccr.2009.09.024",
"10.1016/j.ccr.2010.03.018",
"10.1016/j.ccr.2012.04.025",
"10.1016/j.ccr.2012.05.019",
"10.1016/j.ccr.2013.11.007",
"10.1016/j.ccr.2013.12.009",
"10.1016/j.ccr.2020.213242",
"10.1016/j.ceb.2005.04.014",
"10.1016/j.ceb.2008.09.007",
"10.1016/j.ceb.2010.02.001",
"10.1016/j.ceb.2013.02.005",
"10.1016/j.ceb.2017.02.010",
"10.1016/j.ceb.2018.02.011",
"10.1016/j.ceb.2019.04.002",
"10.1016/j.ceb.2019.06.008",
"10.1016/j.ceb.2020.08.004",
"10.1016/j.ceb.2020.08.012",
"10.1016/j.cell.2004.08.015",
"10.1016/j.cell.2004.08.028",
"10.1016/j.cell.2004.09.029",
"10.1016/j.cell.2004.09.030",
"10.1016/j.cell.2004.12.012",
"10.1016/j.cell.2005.02.003",
"10.1016/j.cell.2005.03.027",
"10.1016/j.cell.2005.06.026",
"10.1016/j.cell.2005.06.044",
"10.1016/j.cell.2005.08.020",
"10.1016/j.cell.2005.08.029",
"10.1016/j.cell.2005.09.034",
"10.1016/j.cell.2005.10.042",
"10.1016/j.cell.2006.02.015",
"10.1016/j.cell.2006.03.022",
"10.1016/j.cell.2006.06.052",
"10.1016/j.cell.2006.06.057",
"10.1016/j.cell.2006.07.024",
"10.1016/j.cell.2006.11.050",
"10.1016/j.cell.2007.01.043",
"10.1016/j.cell.2007.05.022",
"10.1016/j.cell.2007.05.042",
"10.1016/j.cell.2007.05.043",
"10.1016/j.cell.2007.10.036",
"10.1016/j.cell.2007.12.005",
"10.1016/j.cell.2007.12.030",
"10.1016/j.cell.2007.12.032",
"10.1016/j.cell.2008.02.007",
"10.1016/j.cell.2008.06.037",
"10.1016/j.cell.2008.08.032",
"10.1016/j.cell.2008.08.037",
"10.1016/j.cell.2008.09.015",
"10.1016/j.cell.2008.10.049",
"10.1016/j.cell.2008.11.014",
"10.1016/j.cell.2009.02.024",
"10.1016/j.cell.2009.04.037",
"10.1016/j.cell.2010.01.044",
"10.1016/j.cell.2010.03.014",
"10.1016/j.cell.2010.04.010",
"10.1016/j.cell.2010.05.021",
"10.1016/j.cell.2010.05.037",
"10.1016/j.cell.2010.09.012",
"10.1016/j.cell.2011.02.013",
"10.1016/j.cell.2011.02.026",
"10.1016/j.cell.2011.02.031",
"10.1016/j.cell.2011.03.022",
"10.1016/j.cell.2011.03.041",
"10.1016/j.cell.2011.03.051",
"10.1016/j.cell.2011.05.019",
"10.1016/j.cell.2011.06.030",
"10.1016/j.cell.2011.07.034",
"10.1016/j.cell.2011.08.017",
"10.1016/j.cell.2011.10.002",
"10.1016/j.cell.2011.10.038",
"10.1016/j.cell.2011.12.014",
"10.1016/j.cell.2012.01.010",
"10.1016/j.cell.2012.01.052",
"10.1016/j.cell.2012.02.018",
"10.1016/j.cell.2012.03.051",
"10.1016/j.cell.2012.04.012",
"10.1016/j.cell.2012.06.041",
"10.1016/j.cell.2012.08.033",
"10.1016/j.cell.2012.09.016",
"10.1016/j.cell.2012.12.018",
"10.1016/j.cell.2013.02.053",
"10.1016/j.cell.2013.03.030",
"10.1016/j.cell.2013.03.035",
"10.1016/j.cell.2013.04.016",
"10.1016/j.cell.2013.04.034",
"10.1016/j.cell.2013.04.037",
"10.1016/j.cell.2013.04.053",
"10.1016/j.cell.2013.05.002",
"10.1016/j.cell.2013.05.049",
"10.1016/j.cell.2013.06.044",
"10.1016/j.cell.2013.07.018",
"10.1016/j.cell.2013.10.056",
"10.1016/j.cell.2013.12.001",
"10.1016/j.cell.2014.01.044",
"10.1016/j.cell.2014.02.001",
"10.1016/j.cell.2014.02.019",
"10.1016/j.cell.2014.02.023",
"10.1016/j.cell.2014.03.025",
"10.1016/j.cell.2014.05.010",
"10.1016/j.cell.2014.05.018",
"10.1016/j.cell.2014.08.028",
"10.1016/j.cell.2014.09.029",
"10.1016/j.cell.2014.09.030",
"10.1016/j.cell.2014.11.018",
"10.1016/j.cell.2014.11.021",
"10.1016/j.cell.2014.11.024",
"10.1016/j.cell.2014.11.039",
"10.1016/j.cell.2015.03.003",
"10.1016/j.cell.2015.03.031",
"10.1016/j.cell.2015.03.051",
"10.1016/j.cell.2015.04.004",
"10.1016/j.cell.2015.04.044",
"10.1016/j.cell.2015.04.049",
"10.1016/j.cell.2015.05.002",
"10.1016/j.cell.2015.05.041",
"10.1016/j.cell.2015.06.017",
"10.1016/j.cell.2015.06.023",
"10.1016/j.cell.2015.07.043",
"10.1016/j.cell.2015.07.047",
"10.1016/j.cell.2015.08.007",
"10.1016/j.cell.2015.08.052",
"10.1016/j.cell.2015.09.015",
"10.1016/j.cell.2015.09.029",
"10.1016/j.cell.2015.09.038",
"10.1016/j.cell.2015.11.059",
"10.1016/j.cell.2015.12.039",
"10.1016/j.cell.2015.12.056",
"10.1016/j.cell.2016.01.004",
"10.1016/j.cell.2016.01.011",
"10.1016/j.cell.2016.01.039",
"10.1016/j.cell.2016.01.047",
"10.1016/j.cell.2016.03.023",
"10.1016/j.cell.2016.04.003",
"10.1016/j.cell.2016.04.032",
"10.1016/j.cell.2016.04.044",
"10.1016/j.cell.2016.07.012",
"10.1016/j.cell.2016.08.020",
"10.1016/j.cell.2016.08.024",
"10.1016/j.cell.2016.09.006",
"10.1016/j.cell.2016.09.011",
"10.1016/j.cell.2016.09.018",
"10.1016/j.cell.2016.09.037",
"10.1016/j.cell.2016.10.025",
"10.1016/j.cell.2016.11.005",
"10.1016/j.cell.2016.11.020",
"10.1016/j.cell.2017.01.042",
"10.1016/j.cell.2017.02.005",
"10.1016/j.cell.2017.04.011",
"10.1016/j.cell.2017.04.016",
"10.1016/j.cell.2017.04.023",
"10.1016/j.cell.2017.05.004",
"10.1016/j.cell.2017.05.018",
"10.1016/j.cell.2017.05.045",
"10.1016/j.cell.2017.06.009",
"10.1016/j.cell.2017.08.002",
"10.1016/j.cell.2017.09.020",
"10.1016/j.cell.2017.09.026",
"10.1016/j.cell.2017.09.030",
"10.1016/j.cell.2017.09.043",
"10.1016/j.cell.2017.09.044",
"10.1016/j.cell.2017.10.020",
"10.1016/j.cell.2017.10.044",
"10.1016/j.cell.2017.11.008",
"10.1016/j.cell.2017.11.023",
"10.1016/j.cell.2017.11.032",
"10.1016/j.cell.2017.12.005",
"10.1016/j.cell.2017.12.007",
"10.1016/j.cell.2017.12.033",
"10.1016/j.cell.2018.01.029",
"10.1016/j.cell.2018.05.013",
"10.1016/j.cell.2018.06.035",
"10.1016/j.cell.2018.07.028",
"10.1016/j.cell.2018.08.005",
"10.1016/j.cell.2018.08.057",
"10.1016/j.cell.2018.09.009",
"10.1016/j.cell.2018.09.042",
"10.1016/j.cell.2018.09.057",
"10.1016/j.cell.2018.10.021",
"10.1016/j.cell.2018.12.018",
"10.1016/j.cell.2018.12.019",
"10.1016/j.cell.2019.02.027",
"10.1016/j.cell.2019.02.031",
"10.1016/j.cell.2019.05.003",
"10.1016/j.cell.2019.05.006",
"10.1016/j.cell.2019.05.041",
"10.1016/j.cell.2019.06.007",
"10.1016/j.cell.2019.07.049",
"10.1016/j.cell.2019.09.003",
"10.1016/j.cell.2019.09.023",
"10.1016/j.cell.2019.09.029",
"10.1016/j.cell.2019.10.009",
"10.1016/j.cell.2019.11.031",
"10.1016/j.cell.2019.12.023",
"10.1016/j.cell.2020.02.002",
"10.1016/j.cell.2020.02.008",
"10.1016/j.cell.2020.02.031",
"10.1016/j.cell.2020.02.052",
"10.1016/j.cell.2020.02.058",
"10.1016/j.cell.2020.03.045",
"10.1016/j.cell.2020.03.050",
"10.1016/j.cell.2020.04.007",
"10.1016/j.cell.2020.04.031",
"10.1016/j.cell.2020.04.055",
"10.1016/j.cell.2020.05.007",
"10.1016/j.cell.2020.05.034",
"10.1016/j.cell.2020.05.054",
"10.1016/j.cell.2020.06.038",
"10.1016/j.cell.2020.06.043",
"10.1016/j.cell.2020.07.009",
"10.1016/j.cell.2020.08.040",
"10.1016/j.cell.2020.09.037",
"10.1016/j.cell.2020.09.047",
"10.1016/j.cell.2020.09.060",
"10.1016/j.cell.2020.11.024",
"10.1016/j.cell.2020.12.020",
"10.1016/j.cell.2021.01.037",
"10.1016/j.cell.2021.04.023",
"10.1016/j.cell.2021.04.048",
"10.1016/j.cell.2021.06.024",
"10.1016/j.cell.2021.06.028",
"10.1016/j.cell.2021.07.016",
"10.1016/j.cell.2021.09.018",
"10.1016/j.cell.2022.05.018",
"10.1016/j.cell.2022.11.026",
"10.1016/j.cell.2023.03.035",
"10.1016/j.cell.2023.04.016",
"10.1016/j.cell.2023.05.041",
"10.1016/j.cell.2023.11.007",
"10.1016/j.cell.2024.01.027",
"10.1016/j.cell.2024.02.016",
"10.1016/j.cell.2024.04.015",
"10.1016/j.cell.2024.04.029",
"10.1016/j.cellimm.2011.10.001",
"10.1016/j.cellimm.2015.01.018",
"10.1016/j.cellimm.2015.05.001",
"10.1016/j.cellimm.2017.07.010",
"10.1016/j.cellimm.2018.03.008",
"10.1016/j.cellimm.2021.104379",
"10.1016/j.cellsig.2006.09.008",
"10.1016/j.cellsig.2009.02.024",
"10.1016/j.cellsig.2010.03.017",
"10.1016/j.cellsig.2012.11.001",
"10.1016/j.cellsig.2013.04.003",
"10.1016/j.cellsig.2013.08.014",
"10.1016/j.cellsig.2014.11.036",
"10.1016/j.cellsig.2016.02.002",
"10.1016/j.cellsig.2018.03.004",
"10.1016/j.cellsig.2020.109628",
"10.1016/j.celrep.2012.03.011",
"10.1016/j.celrep.2012.07.013",
"10.1016/j.celrep.2013.02.0
gitextract_rgxqts__/
├── .gitattributes
├── .github/
│ ├── renovate.json5
│ └── workflows/
│ ├── build.yml
│ └── tests.yml
├── .gitignore
├── .mailmap
├── .pre-commit-config.yaml
├── .python-version
├── CITATION.cff
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── docs/
│ ├── 2024-10-16_litqa2-splits.json5
│ └── tutorials/
│ ├── querying_with_clinical_trials.md
│ ├── running_on_lfrqa.ipynb
│ ├── running_on_lfrqa.md
│ ├── settings_tutorial.ipynb
│ ├── settings_tutorial.md
│ └── where_do_I_get_papers.md
├── packages/
│ ├── paper-qa-docling/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── pyproject.toml
│ │ ├── src/
│ │ │ └── paperqa_docling/
│ │ │ ├── __init__.py
│ │ │ ├── py.typed
│ │ │ └── reader.py
│ │ └── tests/
│ │ └── test_paperqa_docling.py
│ ├── paper-qa-nemotron/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── pyproject.toml
│ │ ├── src/
│ │ │ └── paperqa_nemotron/
│ │ │ ├── __init__.py
│ │ │ ├── api.py
│ │ │ ├── py.typed
│ │ │ └── reader.py
│ │ └── tests/
│ │ ├── cassettes/
│ │ │ ├── TestNvidiaAPI.test_detection_only[0].yaml
│ │ │ ├── TestNvidiaAPI.test_detection_only[1].yaml
│ │ │ ├── TestNvidiaAPI.test_markdown_bbox[0].yaml
│ │ │ ├── TestNvidiaAPI.test_markdown_bbox[1].yaml
│ │ │ ├── TestNvidiaAPI.test_markdown_no_bbox[0].yaml
│ │ │ └── TestNvidiaAPI.test_markdown_no_bbox[1].yaml
│ │ ├── conftest.py
│ │ ├── test_api.py
│ │ └── test_paperqa_nemotron.py
│ ├── paper-qa-pymupdf/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── pyproject.toml
│ │ ├── src/
│ │ │ └── paperqa_pymupdf/
│ │ │ ├── __init__.py
│ │ │ ├── py.typed
│ │ │ └── reader.py
│ │ └── tests/
│ │ └── test_paperqa_pymupdf.py
│ └── paper-qa-pypdf/
│ ├── LICENSE
│ ├── README.md
│ ├── pyproject.toml
│ ├── src/
│ │ └── paperqa_pypdf/
│ │ ├── __init__.py
│ │ ├── py.typed
│ │ ├── reader.py
│ │ └── utils.py
│ └── tests/
│ ├── test_paperqa_pypdf.py
│ └── test_utils.py
├── pyproject.toml
├── src/
│ └── paperqa/
│ ├── __init__.py
│ ├── _ldp_shims.py
│ ├── agents/
│ │ ├── __init__.py
│ │ ├── env.py
│ │ ├── helpers.py
│ │ ├── main.py
│ │ ├── models.py
│ │ ├── search.py
│ │ └── tools.py
│ ├── clients/
│ │ ├── __init__.py
│ │ ├── client_data/
│ │ │ └── journal_quality.csv
│ │ ├── client_models.py
│ │ ├── crossref.py
│ │ ├── exceptions.py
│ │ ├── journal_quality.py
│ │ ├── openalex.py
│ │ ├── retractions.py
│ │ ├── semantic_scholar.py
│ │ └── unpaywall.py
│ ├── configs/
│ │ ├── clinical_trials.json
│ │ ├── contracrow.json
│ │ ├── debug.json
│ │ ├── fast.json
│ │ ├── high_quality.json
│ │ ├── openreview.json
│ │ ├── search_only_clinical_trials.json
│ │ ├── tier1_limits.json
│ │ ├── tier2_limits.json
│ │ ├── tier3_limits.json
│ │ ├── tier4_limits.json
│ │ ├── tier5_limits.json
│ │ └── wikicrow.json
│ ├── contrib/
│ │ ├── __init__.py
│ │ ├── openreview_paper_helper.py
│ │ └── zotero.py
│ ├── core.py
│ ├── docs.py
│ ├── llms.py
│ ├── paths.py
│ ├── prompts.py
│ ├── py.typed
│ ├── readers.py
│ ├── settings.py
│ ├── sources/
│ │ ├── __init__.py
│ │ └── clinical_trials.py
│ ├── types.py
│ └── utils.py
└── tests/
├── __init__.py
├── cassettes/
│ ├── test_arxiv_doi_is_used_when_available.yaml
│ ├── test_author_matching.yaml
│ ├── test_bad_dois.yaml
│ ├── test_bad_titles.yaml
│ ├── test_bulk_doi_search.yaml
│ ├── test_bulk_title_search.yaml
│ ├── test_crossref_journalquality_fields_filtering.yaml
│ ├── test_crossref_retraction_status.yaml
│ ├── test_docs_lifecycle.yaml
│ ├── test_does_openalex_work[not-in-openalex].yaml
│ ├── test_does_openalex_work[not-oa-in-openalex].yaml
│ ├── test_does_openalex_work[oa-in-openalex1].yaml
│ ├── test_does_openalex_work[oa-in-openalex2].yaml
│ ├── test_doi_search[paper_attributes0].yaml
│ ├── test_doi_search[paper_attributes1].yaml
│ ├── test_doi_search[paper_attributes2].yaml
│ ├── test_doi_search[paper_attributes3].yaml
│ ├── test_doi_search[paper_attributes4].yaml
│ ├── test_ensure_sequential_run.yaml
│ ├── test_ensure_sequential_run_early_stop.yaml
│ ├── test_equations[docling].yaml
│ ├── test_equations[nemotron].yaml
│ ├── test_equations[pymupdf].yaml
│ ├── test_get_reasoning[deepseek-reasoner].yaml
│ ├── test_get_reasoning[openrouter-deepseek].yaml
│ ├── test_image_enrichment_invalid_image.yaml
│ ├── test_image_enrichment_normal_use.yaml
│ ├── test_maybe_is_text.yaml
│ ├── test_minimal_fields_filtering.yaml
│ ├── test_nonduplicate_contexts.yaml
│ ├── test_odd_client_requests.yaml
│ ├── test_partitioning_fn_docs[False].yaml
│ ├── test_partitioning_fn_docs[True].yaml
│ ├── test_partly_embedded_texts[False].yaml
│ ├── test_partly_embedded_texts[True].yaml
│ ├── test_pdf_reader_match_doc_details.yaml
│ ├── test_s2_only_fields_filtering.yaml
│ ├── test_s2_title_search_empty_data.yaml
│ ├── test_title_search[paper_attributes0].yaml
│ ├── test_title_search[paper_attributes1].yaml
│ ├── test_title_search[paper_attributes2].yaml
│ ├── test_tricky_journal_quality_results[10.1016-j.bbcan.2023.188947-1].yaml
│ ├── test_tricky_journal_quality_results[10.1016-j.semcdb.2016.08.024-1].yaml
│ ├── test_tricky_journal_quality_results[10.1038-s41598-018-27044-6-1].yaml
│ ├── test_tricky_journal_quality_results[10.1073-pnas.1205508109-3].yaml
│ ├── test_tricky_journal_quality_results[10.1146-annurev.pathol.4.110807.092311-2].yaml
│ └── test_tricky_journal_quality_results[10.1186-1471-2148-11-4-2].yaml
├── conftest.py
├── duplicate_media_template.md
├── stub_data/
│ ├── .DS_Store
│ ├── bates.txt
│ ├── dummy.docx
│ ├── dummy.pptx
│ ├── dummy.xlsx
│ ├── dummy_jap.docx
│ ├── empty.txt
│ ├── flag_day.html
│ ├── gravity_hill.md
│ ├── obama.txt
│ ├── py.typed
│ ├── stub_manifest.csv
│ ├── stub_manifest_nocitation.csv
│ └── stub_retractions.csv
├── test_agents.py
├── test_cli.py
├── test_clients.py
├── test_clinical_trials.py
├── test_configs.py
├── test_paperqa.py
└── test_utils.py
SYMBOL INDEX (745 symbols across 48 files)
FILE: packages/paper-qa-docling/src/paperqa_docling/reader.py
function parse_pdf_to_pages (line 38) | def parse_pdf_to_pages( # noqa: PLR0912
FILE: packages/paper-qa-docling/tests/test_paperqa_docling.py
function test_parse_pdf_to_pages (line 23) | async def test_parse_pdf_to_pages() -> None:
function test_page_range (line 174) | def test_page_range() -> None:
function test_media_deduplication (line 199) | def test_media_deduplication() -> None:
function test_page_size_limit_denial (line 221) | def test_page_size_limit_denial() -> None:
function test_invalid_pdf_is_denied (line 226) | def test_invalid_pdf_is_denied(tmp_path) -> None:
function test_nonexistent_file_failure (line 245) | def test_nonexistent_file_failure() -> None:
function test_table_parsing (line 251) | def test_table_parsing() -> None:
function test_document_timeout_denial (line 273) | def test_document_timeout_denial() -> None:
function test_equation_parsing (line 287) | def test_equation_parsing() -> None:
FILE: packages/paper-qa-nemotron/src/paperqa_nemotron/api.py
class NemotronLengthError (line 69) | class NemotronLengthError(ValueError):
class NemotronBBoxError (line 82) | class NemotronBBoxError(ValueError):
class NemotronParseBBox (line 95) | class NemotronParseBBox(BaseModel):
method validate_min_less_than_max (line 104) | def validate_min_less_than_max(v: float, info: ValidationInfo) -> float:
method from_coordinates (line 148) | def from_coordinates(
method to_page_coordinates (line 154) | def to_page_coordinates(
method iou (line 164) | def iou(self, other: "NemotronParseBBox") -> float:
method union (line 186) | def union(self, other: "NemotronParseBBox") -> Self:
class NemotronParseClassification (line 204) | class NemotronParseClassification(StrEnum):
class NemotronParseAnnotatedBBox (line 234) | class NemotronParseAnnotatedBBox(BaseModel):
class NemotronParseMarkdown (line 243) | class NemotronParseMarkdown(BaseModel):
class NemotronParseMarkdownBBox (line 249) | class NemotronParseMarkdownBBox(NemotronParseAnnotatedBBox, NemotronPars...
method merge_with_detection (line 257) | def merge_with_detection(
function _is_litellm_timeout_with_408 (line 324) | def _is_litellm_timeout_with_408(exc: BaseException) -> bool:
function _wait_exponential_for_nvidia_api_retry (line 335) | def _wait_exponential_for_nvidia_api_retry(retry_state: RetryCallState) ...
function _call_nvidia_api (line 354) | async def _call_nvidia_api(
function _call_nvidia_api (line 365) | async def _call_nvidia_api(
function _call_nvidia_api (line 376) | async def _call_nvidia_api(
function _call_nvidia_api (line 396) | async def _call_nvidia_api(
function _call_sagemaker_api (line 498) | async def _call_sagemaker_api(
function _call_sagemaker_api (line 509) | async def _call_sagemaker_api(
function _call_sagemaker_api (line 520) | async def _call_sagemaker_api(
function _call_sagemaker_api (line 535) | async def _call_sagemaker_api(
FILE: packages/paper-qa-nemotron/src/paperqa_nemotron/reader.py
function pad_image_with_border (line 46) | def pad_image_with_border(
function _render_page (line 80) | def _render_page(
function parse_pdf_to_pages (line 136) | async def parse_pdf_to_pages(
FILE: packages/paper-qa-nemotron/tests/conftest.py
function fixture_vcr_config (line 21) | def fixture_vcr_config() -> dict[str, Any]:
class PreReadCompatibleAiohttpResponseStream (line 36) | class PreReadCompatibleAiohttpResponseStream(
method __aiter__ (line 41) | async def __aiter__(self) -> AsyncIterator[bytes]:
function _vcr_handle_async_request (line 54) | async def _vcr_handle_async_request(
FILE: packages/paper-qa-nemotron/tests/test_api.py
class TestNemotronParseBBox (line 26) | class TestNemotronParseBBox:
method test_bbox_validation (line 27) | def test_bbox_validation(self) -> None:
method test_bbox_to_page_coordinates (line 76) | def test_bbox_to_page_coordinates(self) -> None:
method test_iou (line 98) | def test_iou(
method test_union (line 108) | def test_union(self) -> None:
class TestMergeWithDetection (line 120) | class TestMergeWithDetection:
method test_merge_empty_inputs (line 121) | def test_merge_empty_inputs(self) -> None:
method test_merge_unmatched_detection (line 149) | def test_merge_unmatched_detection(self) -> None:
method test_merge_matched_detection (line 196) | def test_merge_matched_detection(self) -> None:
method test_merge_multiple_items (line 227) | def test_merge_multiple_items(self) -> None:
function test_wait_exponential_for_nvidia_api_retry (line 293) | def test_wait_exponential_for_nvidia_api_retry(
function fixture_pdf_page_np (line 316) | def fixture_pdf_page_np() -> np.ndarray:
class TestNvidiaAPI (line 325) | class TestNvidiaAPI:
method test_markdown_bbox (line 330) | async def test_markdown_bbox(
method test_markdown_no_bbox (line 346) | async def test_markdown_no_bbox(
method test_detection_only (line 360) | async def test_detection_only(
class TestSageMakerAPI (line 374) | class TestSageMakerAPI:
method test_markdown_bbox (line 379) | async def test_markdown_bbox(
method test_markdown_no_bbox (line 394) | async def test_markdown_no_bbox(
method test_detection_only (line 407) | async def test_detection_only(
FILE: packages/paper-qa-nemotron/tests/test_paperqa_nemotron.py
function test_parse_pdf_to_pages (line 36) | async def test_parse_pdf_to_pages(api_params_base: dict[str, Any]) -> None:
function test_page_range (line 230) | async def test_page_range() -> None:
function test_media_deduplication (line 257) | async def test_media_deduplication() -> None:
function test_page_size_limit_denial (line 285) | async def test_page_size_limit_denial() -> None:
function test_invalid_pdf_is_denied (line 293) | async def test_invalid_pdf_is_denied(tmp_path) -> None:
function test_nonexistent_file_failure (line 313) | async def test_nonexistent_file_failure() -> None:
function test_table_parsing (line 320) | async def test_table_parsing() -> None:
function test_equation_parsing (line 339) | async def test_equation_parsing() -> None:
function test_pad_image_with_border (line 352) | def test_pad_image_with_border(subtests: pytest.Subtests) -> None:
function test_media_enrichment_filters_irrelevant (line 394) | async def test_media_enrichment_filters_irrelevant() -> None:
function test_render_page (line 456) | def test_render_page(subtests: pytest.Subtests) -> None:
function _wrap_into_retry_error (line 488) | def _wrap_into_retry_error(exception: Exception) -> RetryError:
function test_failover_on_error (line 514) | async def test_failover_on_error(error: Exception) -> None:
FILE: packages/paper-qa-pymupdf/src/paperqa_pymupdf/reader.py
function setup_pymupdf_python_logging (line 13) | def setup_pymupdf_python_logging() -> None:
function _extract_page_text (line 42) | def _extract_page_text(
function _parse_single_page_screenshot (line 100) | def _parse_single_page_screenshot(
function parse_pdf_to_pages (line 127) | def parse_pdf_to_pages(
FILE: packages/paper-qa-pymupdf/tests/test_paperqa_pymupdf.py
function test_parse_pdf_to_pages (line 22) | async def test_parse_pdf_to_pages() -> None:
function test_page_range (line 176) | def test_page_range() -> None:
function test_page_size_limit_denial (line 201) | def test_page_size_limit_denial() -> None:
function test_invalid_pdf_is_denied (line 207) | async def test_invalid_pdf_is_denied(tmp_path) -> None:
function test_nonexistent_file_failure (line 234) | def test_nonexistent_file_failure() -> None:
function test_table_parsing (line 240) | def test_table_parsing() -> None:
function test_table_parsing_orphaned_surrogate (line 300) | def test_table_parsing_orphaned_surrogate() -> None:
function test_equation_parsing (line 329) | def test_equation_parsing() -> None:
FILE: packages/paper-qa-pypdf/src/paperqa_pypdf/reader.py
class MediaMode (line 31) | class MediaMode(StrEnum):
method __str__ (line 41) | def __str__(self) -> str:
method metadata_value (line 45) | def metadata_value(self) -> str:
function parse_pdf_to_pages (line 56) | def parse_pdf_to_pages( # noqa: PLR0912
FILE: packages/paper-qa-pypdf/src/paperqa_pypdf/utils.py
function cluster_bboxes (line 4) | def cluster_bboxes(
FILE: packages/paper-qa-pypdf/tests/test_paperqa_pypdf.py
function test_parse_pdf_to_pages (line 27) | async def test_parse_pdf_to_pages() -> None:
function test_page_range (line 184) | def test_page_range() -> None:
function test_page_size_limit_denial (line 209) | def test_page_size_limit_denial() -> None:
function test_invalid_pdf_is_denied (line 214) | def test_invalid_pdf_is_denied(tmp_path) -> None:
function test_nonexistent_file_failure (line 233) | def test_nonexistent_file_failure() -> None:
function test_table_parsing (line 239) | def test_table_parsing() -> None:
function test_table_parsing_orphaned_surrogate (line 257) | def test_table_parsing_orphaned_surrogate() -> None:
function test_media_deduplication (line 276) | def test_media_deduplication() -> None:
function test_equation_parsing (line 291) | def test_equation_parsing() -> None:
function test_clustering (line 304) | def test_clustering() -> None:
function test_individual_mode_outputs_png (line 355) | def test_individual_mode_outputs_png(
class TestMediaMode (line 387) | class TestMediaMode:
method test_same_member_is_equal (line 389) | def test_same_member_is_equal(self) -> None:
method test_individual_with_and_without_clustering (line 395) | def test_individual_with_and_without_clustering(self) -> None:
method test_different_members_different_values_are_not_equal (line 411) | def test_different_members_different_values_are_not_equal(self) -> None:
FILE: packages/paper-qa-pypdf/tests/test_utils.py
function test_cluster_bboxes_empty (line 6) | def test_cluster_bboxes_empty() -> None:
function test_cluster_bboxes_single (line 10) | def test_cluster_bboxes_single() -> None:
function test_cluster_bboxes_no_overlap_far_apart (line 17) | def test_cluster_bboxes_no_overlap_far_apart() -> None:
function test_cluster_bboxes_overlapping (line 25) | def test_cluster_bboxes_overlapping() -> None:
function test_cluster_bboxes_within_tolerance (line 33) | def test_cluster_bboxes_within_tolerance() -> None:
function test_cluster_bboxes_outside_tolerance (line 41) | def test_cluster_bboxes_outside_tolerance() -> None:
function test_cluster_bboxes_chain_clustering (line 48) | def test_cluster_bboxes_chain_clustering() -> None:
function test_cluster_bboxes_multiple_clusters (line 57) | def test_cluster_bboxes_multiple_clusters() -> None:
function test_cluster_bboxes_vertical_proximity (line 73) | def test_cluster_bboxes_vertical_proximity() -> None:
function test_cluster_bboxes_diagonal_proximity (line 81) | def test_cluster_bboxes_diagonal_proximity() -> None:
function test_cluster_bboxes_zero_tolerance (line 89) | def test_cluster_bboxes_zero_tolerance() -> None:
function test_cluster_bboxes_zero_tolerance_float (line 101) | def test_cluster_bboxes_zero_tolerance_float() -> None:
FILE: src/paperqa/_ldp_shims.py
class ComputeTrajectoryMetricsMixin (line 49) | class ComputeTrajectoryMetricsMixin: # type: ignore[no-redef]
class Callback (line 52) | class Callback: # type: ignore[no-redef]
FILE: src/paperqa/agents/__init__.py
function is_running_under_cli (line 64) | def is_running_under_cli() -> bool:
function set_up_rich_handler (line 69) | def set_up_rich_handler(install: bool = True) -> RichHandler:
function configure_log_verbosity (line 82) | def configure_log_verbosity(verbosity: int = 0) -> None:
function configure_cli_logging (line 91) | def configure_cli_logging(verbosity: int | Settings = 0) -> None:
function ask (line 105) | def ask(
function search_query (line 115) | def search_query(
function build_index (line 137) | def build_index(
function save_settings (line 152) | def save_settings(settings: Settings, settings_path: str | os.PathLike) ...
function main (line 173) | def main() -> None:
FILE: src/paperqa/agents/env.py
function settings_to_tools (line 47) | def settings_to_tools( # noqa: PLR0912
function make_clinical_trial_status (line 143) | def make_clinical_trial_status(
function clinical_trial_status (line 168) | def clinical_trial_status(state: "EnvironmentState") -> str:
class PaperQAEnvironment (line 208) | class PaperQAEnvironment(Environment[EnvironmentState]):
method __init__ (line 211) | def __init__(
method from_task (line 232) | def from_task(cls, task: str) -> Self:
method make_tools (line 235) | def make_tools(self) -> list[Tool]:
method _reset_docs (line 243) | async def _reset_docs(self) -> None:
method make_initial_state (line 247) | async def make_initial_state(self) -> EnvironmentState:
method reset (line 274) | async def reset(self) -> tuple[list[Message], list[Tool]]:
method export_frame (line 292) | def export_frame(self) -> Frame:
method _has_excess_answer_failures (line 295) | def _has_excess_answer_failures(self) -> bool:
method step (line 309) | async def step(self, action: Message) -> tuple[Messages, float, bool, ...
method get_id (line 348) | async def get_id(self) -> str:
method __deepcopy__ (line 362) | def __deepcopy__(self, memo) -> Self:
FILE: src/paperqa/agents/helpers.py
function get_year (line 20) | def get_year(ts: datetime | None = None) -> str:
function litellm_get_search_query (line 27) | async def litellm_get_search_query(
function table_formatter (line 78) | def table_formatter(
FILE: src/paperqa/agents/main.py
function agent_query (line 54) | async def agent_query(
function run_agent (line 91) | async def run_agent(
function _run_with_timeout_failure (line 151) | async def _run_with_timeout_failure(
function run_fake_agent (line 182) | async def run_fake_agent(
function run_aviary_agent (line 259) | async def run_aviary_agent(
class LDPRolloutCallback (line 326) | class LDPRolloutCallback(Callback):
method __init__ (line 329) | def __init__(
method after_agent_get_asv (line 343) | async def after_agent_get_asv(self, traj_id: str, *args) -> None: # n...
method after_env_reset (line 347) | async def after_env_reset(self, traj_id: str, *_) -> None: # noqa: AR...
method after_env_step (line 351) | async def after_env_step(self, traj_id: str, *args) -> None: # noqa: ...
class LDPAdjustToolsForAgentCallback (line 356) | class LDPAdjustToolsForAgentCallback(Callback):
method __init__ (line 357) | def __init__(self, settings: Settings):
method after_env_reset (line 360) | async def after_env_reset(
function run_ldp_agent (line 366) | async def run_ldp_agent(
function index_search (line 408) | async def index_search(
FILE: src/paperqa/agents/models.py
class SupportsPickle (line 21) | class SupportsPickle(Protocol):
method __reduce__ (line 24) | def __reduce__(self) -> str | tuple[Any, ...]: ...
method __getstate__ (line 25) | def __getstate__(self) -> object: ...
method __setstate__ (line 26) | def __setstate__(self, state: object) -> None: ...
class AgentStatus (line 29) | class AgentStatus(StrEnum): # TODO: rename to AnswerStatus or RolloutSt...
class MismatchedModelsError (line 41) | class MismatchedModelsError(Exception):
class AnswerResponse (line 47) | class AnswerResponse(BaseModel):
method strip_answer (line 60) | def strip_answer(
method get_summary (line 69) | async def get_summary(self, llm_model: LLMModel | str = "gpt-4o") -> str:
class TimerData (line 93) | class TimerData(BaseModel):
class SimpleProfiler (line 98) | class SimpleProfiler(BaseModel):
method timer (line 111) | async def timer(self, name: str):
method start (line 124) | def start(self, name: str) -> None:
method stop (line 130) | def stop(self, name: str) -> None:
method results (line 146) | def results(self) -> dict[str, dict[str, float]]:
FILE: src/paperqa/agents/search.py
class AsyncRetryError (line 59) | class AsyncRetryError(Exception):
class SearchDocumentStorage (line 63) | class SearchDocumentStorage(StrEnum):
method extension (line 70) | def extension(self) -> str:
method write_to_string (line 77) | def write_to_string(self, data: BaseModel | SupportsPickle) -> bytes:
method read_from_string (line 86) | def read_from_string(
function reap_opened_index_cache (line 105) | def reap_opened_index_cache() -> None:
class SearchIndex (line 113) | class SearchIndex:
method __init__ (line 118) | def __init__(
method index_directory (line 148) | async def index_directory( # TODO: rename to index_root_directory
method index_filename (line 156) | async def index_filename( # TODO: rename to index_meta_directory
method docs_index_directory (line 165) | async def docs_index_directory(self) -> anyio.Path:
method file_index_filename (line 172) | async def file_index_filename(self) -> anyio.Path:
method schema (line 177) | def schema(self) -> Schema:
method index (line 186) | async def index(self) -> Index:
method __del__ (line 211) | def __del__(self) -> None:
method searcher (line 221) | async def searcher(self) -> Searcher:
method writer (line 229) | async def writer(self, reset: bool = False) -> AsyncIterator[IndexWrit...
method count (line 238) | async def count(self) -> int:
method index_files (line 242) | async def index_files(self) -> dict[str, str]:
method filehash (line 260) | def filehash(body: str) -> str:
method filecheck (line 263) | async def filecheck(self, filename: str, body_filehash: str | None = N...
method mark_failed_document (line 271) | async def mark_failed_document(self, path: str | os.PathLike) -> None:
method add_document (line 275) | async def add_document(
method delete_document (line 337) | async def delete_document(self, file_location: str) -> None:
method remove_from_index (line 347) | async def remove_from_index(self, file_location: str) -> None:
method save_index (line 367) | async def save_index(self) -> None:
method get_saved_object (line 381) | async def get_saved_object(
method query (line 399) | async def query(
function fetch_kwargs_from_manifest (line 437) | def fetch_kwargs_from_manifest(
function maybe_get_manifest (line 448) | async def maybe_get_manifest(
function process_file (line 490) | async def process_file(
function _make_progress_bar_update (line 586) | def _make_progress_bar_update(
function get_directory_index (line 622) | async def get_directory_index(
FILE: src/paperqa/agents/tools.py
function make_status (line 27) | def make_status(
function default_status (line 37) | def default_status(state: "EnvironmentState") -> str:
class EnvironmentState (line 47) | class EnvironmentState(BaseModel):
method status (line 70) | def status(self) -> str:
method get_relevant_contexts (line 75) | def get_relevant_contexts(self, score_threshold: int | None = 0) -> li...
method record_action (line 83) | def record_action(self, action: Message | ToolRequestMessage) -> None:
method query_tool_history (line 90) | def query_tool_history(self, tool_name: str) -> bool:
class NamedTool (line 95) | class NamedTool(BaseModel):
class PaperSearch (line 109) | class PaperSearch(NamedTool):
method paper_search (line 120) | async def paper_search(
class EmptyDocsError (line 213) | class EmptyDocsError(RuntimeError):
class GatherEvidence (line 217) | class GatherEvidence(NamedTool):
method gather_evidence (line 225) | async def gather_evidence(self, question: str, state: EnvironmentState...
class GenerateAnswer (line 314) | class GenerateAnswer(NamedTool):
method gen_answer (line 323) | async def gen_answer(self, state: EnvironmentState) -> str:
method extract_answer_from_message (line 381) | def extract_answer_from_message(cls, content: str) -> str:
class Reset (line 389) | class Reset(NamedTool):
method reset (line 392) | async def reset(self, state: EnvironmentState) -> None:
class Complete (line 405) | class Complete(NamedTool):
method complete (line 415) | async def complete(
class ClinicalTrialsSearch (line 443) | class ClinicalTrialsSearch(NamedTool):
method clinical_trials_search (line 473) | async def clinical_trials_search(self, query: str, state: EnvironmentS...
FILE: src/paperqa/clients/__init__.py
class DocMetadataTask (line 46) | class DocMetadataTask(BaseModel):
method provider_queries (line 64) | def provider_queries(
method processor_queries (line 70) | def processor_queries(
method __repr__ (line 78) | def __repr__(self) -> str:
class DocMetadataClient (line 84) | class DocMetadataClient:
method __init__ (line 85) | def __init__(
method query (line 156) | async def query(self, **kwargs) -> DocDetails | None:
method bulk_query (line 215) | async def bulk_query(
method upgrade_doc_to_doc_details (line 223) | async def upgrade_doc_to_doc_details(self, doc: Doc, **kwargs) -> DocD...
FILE: src/paperqa/clients/client_models.py
class ClientQuery (line 28) | class ClientQuery(BaseModel):
class TitleAuthorQuery (line 34) | class TitleAuthorQuery(ClientQuery):
method ensure_fields_are_present (line 42) | def ensure_fields_are_present(cls, data: dict[str, Any]) -> dict[str, ...
method zero_and_one (line 56) | def zero_and_one(cls, v: float, info: ValidationInfo) -> float: # noq...
class DOIQuery (line 64) | class DOIQuery(ClientQuery):
method add_doi_to_fields_and_validate (line 70) | def add_doi_to_fields_and_validate(cls, data: dict[str, Any]) -> dict[...
class JournalQuery (line 84) | class JournalQuery(ClientQuery):
class MetadataProvider (line 91) | class MetadataProvider(ABC, Generic[ClientQueryType]):
method query (line 97) | async def query(self, query: dict) -> DocDetails | None:
method _query (line 101) | async def _query(self, query: ClientQueryType) -> DocDetails | None:
method query_factory (line 105) | def query_factory(self, query: dict) -> ClientQueryType:
class DOIOrTitleBasedProvider (line 109) | class DOIOrTitleBasedProvider(MetadataProvider[DOIQuery | TitleAuthorQue...
method query (line 111) | async def query(self, query: dict) -> DocDetails | None:
method _query (line 146) | async def _query(self, query: DOIQuery | TitleAuthorQuery) -> DocDetai...
method query_factory (line 157) | def query_factory(self, query: dict) -> DOIQuery | TitleAuthorQuery:
class MetadataPostProcessor (line 171) | class MetadataPostProcessor(ABC, Generic[ClientQueryType]):
method process (line 178) | async def process(self, doc_details: DocDetails, **kwargs) -> DocDetails:
method _process (line 184) | async def _process(
method query_creator (line 190) | def query_creator(
FILE: src/paperqa/clients/crossref.py
function crossref_headers (line 82) | def crossref_headers() -> dict[str, str]:
function get_crossref_mailto (line 96) | def get_crossref_mailto() -> str:
function doi_to_bibtex (line 115) | async def doi_to_bibtex(
function parse_crossref_to_doc_details (line 167) | async def parse_crossref_to_doc_details(
function get_doc_details_from_crossref (line 253) | async def get_doc_details_from_crossref( # noqa: PLR0912
function download_retracted_dataset (line 358) | async def download_retracted_dataset(
class CrossrefProvider (line 384) | class CrossrefProvider(DOIOrTitleBasedProvider):
method _query (line 385) | async def _query(self, query: TitleAuthorQuery | DOIQuery) -> DocDetai...
FILE: src/paperqa/clients/exceptions.py
class DOINotFoundError (line 6) | class DOINotFoundError(Exception):
method __init__ (line 7) | def __init__(self, message="DOI not found") -> None:
function make_flaky_ssl_error_predicate (line 12) | def make_flaky_ssl_error_predicate(host: str) -> Callable[[BaseException...
FILE: src/paperqa/clients/journal_quality.py
class JournalQualityPostProcessor (line 37) | class JournalQualityPostProcessor(MetadataPostProcessor[JournalQuery]):
method __init__ (line 42) | def __init__(self, journal_quality_path: os.PathLike | str | None = No...
method load_data (line 52) | def load_data(self) -> None:
method _process (line 58) | async def _process(
method query_creator (line 82) | def query_creator(self, doc_details: DocDetails, **kwargs) -> JournalQ...
function download_file (line 106) | async def download_file(
function process_csv (line 142) | async def process_csv(
function main (line 201) | async def main() -> None:
FILE: src/paperqa/clients/openalex.py
function reformat_name (line 37) | def reformat_name(name: str) -> str:
function get_openalex_mailto (line 46) | def get_openalex_mailto() -> str | None:
function get_openalex_api_key (line 58) | def get_openalex_api_key() -> str | None:
function get_doc_details_from_openalex (line 67) | async def get_doc_details_from_openalex( # noqa: PLR0912
function parse_openalex_to_doc_details (line 176) | def parse_openalex_to_doc_details(message: dict[str, Any]) -> DocDetails:
class OpenAlexProvider (line 248) | class OpenAlexProvider(DOIOrTitleBasedProvider):
method get_doc_details (line 255) | async def get_doc_details(
method search_by_title (line 272) | async def search_by_title(
method _query (line 297) | async def _query(self, query: TitleAuthorQuery | DOIQuery) -> DocDetai...
FILE: src/paperqa/clients/retractions.py
class RetractionDataPostProcessor (line 18) | class RetractionDataPostProcessor(MetadataPostProcessor[DOIQuery]):
method __init__ (line 22) | def __init__(self, retraction_data_path: os.PathLike | str | None = No...
method _has_cache_expired (line 42) | def _has_cache_expired(self) -> bool:
method _is_csv_cached (line 55) | def _is_csv_cached(self) -> bool:
method _filter_dois (line 58) | def _filter_dois(self) -> None:
method load_data (line 66) | async def load_data(self) -> None:
method _process (line 75) | async def _process(self, query: DOIQuery, doc_details: DocDetails) -> ...
method query_creator (line 85) | def query_creator(self, doc_details: DocDetails, **kwargs) -> DOIQuery...
FILE: src/paperqa/clients/semantic_scholar.py
class SemanticScholarSearchType (line 61) | class SemanticScholarSearchType(IntEnum):
method make_url_params (line 71) | def make_url_params( # noqa: PLR0911
function _s2_get_with_retrying (line 123) | async def _s2_get_with_retrying(url: str, **get_kwargs) -> dict[str, Any]:
function s2_authors_match (line 138) | def s2_authors_match(authors: list[str], data: dict) -> bool:
function parse_s2_to_doc_details (line 158) | async def parse_s2_to_doc_details(
function semantic_scholar_headers (line 224) | def semantic_scholar_headers() -> dict[str, str]:
function s2_title_search (line 238) | async def s2_title_search(
function get_s2_doc_details_from_doi (line 302) | async def get_s2_doc_details_from_doi(
function get_s2_doc_details_from_title (line 336) | async def get_s2_doc_details_from_title(
class SemanticScholarProvider (line 371) | class SemanticScholarProvider(DOIOrTitleBasedProvider):
method _query (line 372) | async def _query(self, query: TitleAuthorQuery | DOIQuery) -> DocDetai...
FILE: src/paperqa/clients/unpaywall.py
class Author (line 22) | class Author(BaseModel):
class BestOaLocation (line 31) | class BestOaLocation(BaseModel):
class UnpaywallResponse (line 49) | class UnpaywallResponse(BaseModel):
class SearchResponse (line 71) | class SearchResponse(BaseModel):
class SearchResults (line 77) | class SearchResults(BaseModel):
class UnpaywallProvider (line 82) | class UnpaywallProvider(DOIOrTitleBasedProvider):
method get_doc_details (line 84) | async def get_doc_details(self, doi: str, client: httpx.AsyncClient) -...
method search_by_title (line 111) | async def search_by_title(
method _create_doc_details (line 159) | def _create_doc_details(self, data: UnpaywallResponse) -> DocDetails:
method _query (line 202) | async def _query(self, query: TitleAuthorQuery | DOIQuery) -> DocDetai...
FILE: src/paperqa/contrib/openreview_paper_helper.py
class PaperSuggestion (line 24) | class PaperSuggestion(BaseModel):
class RelevantPapersResponse (line 29) | class RelevantPapersResponse(BaseModel):
class OpenReviewPaperHelper (line 41) | class OpenReviewPaperHelper:
method __init__ (line 42) | def __init__(
method get_venues (line 66) | def get_venues(self) -> list[str]:
method get_submissions (line 70) | def get_submissions(self) -> list[Any]:
method create_submission_string (line 75) | def create_submission_string(self, submissions: list[Any]) -> str:
method fetch_relevant_papers (line 87) | async def fetch_relevant_papers(self, question: str) -> dict[str, Any]:
method _get_relevant_papers_chunk (line 108) | async def _get_relevant_papers_chunk(self, question: str, chunk: str) ...
method download_papers (line 123) | async def download_papers(self, submissions: list[Any]) -> None:
method _download_pdf (line 134) | async def _download_pdf(self, submission: Any) -> bool:
method aadd_docs (line 151) | async def aadd_docs(
FILE: src/paperqa/contrib/zotero.py
class ZoteroPaper (line 24) | class ZoteroPaper(BaseModel):
method __str__ (line 50) | def __str__(self) -> str:
class ZoteroDB (line 59) | class ZoteroDB(zotero.Zotero):
method __init__ (line 71) | def __init__(
method get_pdf (line 118) | def get_pdf(self, item: dict) -> Path | None:
method iterate (line 147) | def iterate( # noqa: PLR0912
method _sliced_collection_items (line 286) | def _sliced_collection_items(self, collection_id, limit, start):
method _get_collection_id (line 293) | def _get_collection_id(self, collection_name: str) -> str:
function _get_citation_key (line 323) | def _get_citation_key(item: dict) -> str:
function _extract_pdf_key (line 345) | def _extract_pdf_key(item: dict) -> str | None:
FILE: src/paperqa/core.py
function llm_parse_json (line 19) | def llm_parse_json(text: str) -> dict[str, JsonValue]:
class LLMContextError (line 127) | class LLMContextError(ValueError):
method __init__ (line 131) | def __init__(self, message: str, llm_results: list[LLMResult]) -> None:
class LLMBadContextJSONError (line 136) | class LLMBadContextJSONError(LLMContextError):
class LLMContextTimeoutError (line 150) | class LLMContextTimeoutError(LLMContextError):
class LLMContextRequestFailedError (line 163) | class LLMContextRequestFailedError(LLMContextError):
function _map_fxn_summary (line 178) | async def _map_fxn_summary( # noqa: PLR0912
function map_fxn_summary (line 383) | async def map_fxn_summary(**kwargs) -> tuple[Context | None, list[LLMRes...
FILE: src/paperqa/docs.py
class Docs (line 45) | class Docs(BaseModel): # noqa: PLW1641 # TODO: add __hash__
method __eq__ (line 58) | def __eq__(self, other) -> bool:
method clear_docs (line 78) | def clear_docs(self) -> None:
method _get_unique_name (line 84) | def _get_unique_name(self, docname: str) -> str:
method aadd_file (line 93) | async def aadd_file(
method aadd_url (line 132) | async def aadd_url(
method aadd (line 156) | async def aadd( # noqa: PLR0912
method aadd_texts (line 340) | async def aadd_texts(
method delete (line 403) | def delete(
method _build_texts_index (line 437) | async def _build_texts_index(
method retrieve_texts (line 456) | async def retrieve_texts(
method aget_evidence (line 492) | async def aget_evidence(
method aquery (line 588) | async def aquery(
FILE: src/paperqa/llms.py
function cosine_similarity (line 50) | def cosine_similarity(a, b):
class VectorStore (line 55) | class VectorStore(BaseModel, ABC):
method __contains__ (line 68) | def __contains__(self, item) -> bool:
method __len__ (line 71) | def __len__(self) -> int:
method add_texts_and_embeddings (line 75) | async def add_texts_and_embeddings(self, texts: Iterable[Embeddable]) ...
method similarity_search (line 80) | async def similarity_search(
method clear (line 86) | def clear(self) -> None:
method partitioned_similarity_search (line 89) | async def partitioned_similarity_search(
method max_marginal_relevance_search (line 111) | async def max_marginal_relevance_search(
class NumpyVectorStore (line 173) | class NumpyVectorStore(VectorStore): # noqa: PLW1641 # TODO: add __hash__
method __eq__ (line 178) | def __eq__(self, other) -> bool:
method clear (line 196) | def clear(self) -> None:
method add_texts_and_embeddings (line 202) | async def add_texts_and_embeddings(self, texts: Iterable[Embeddable]) ...
method partitioned_similarity_search (line 207) | async def partitioned_similarity_search(
method similarity_search (line 241) | async def similarity_search(
class QdrantVectorStore (line 277) | class QdrantVectorStore(VectorStore): # noqa: PLW1641 # TODO: add __ha...
method __del__ (line 289) | def __del__(self):
method aclose (line 300) | async def aclose(self):
method __eq__ (line 304) | def __eq__(self, other) -> bool:
method validate_client (line 318) | def validate_client(self):
method _collection_exists (line 338) | async def _collection_exists(self) -> bool:
method clear (line 342) | def clear(self) -> None:
method aclear (line 359) | async def aclear(self) -> None:
method add_texts_and_embeddings (line 367) | async def add_texts_and_embeddings(self, texts: Iterable[Embeddable]) ...
method similarity_search (line 410) | async def similarity_search(
method load_docs (line 445) | async def load_docs(
function embedding_model_factory (line 526) | def embedding_model_factory(embedding: str, **kwargs) -> EmbeddingModel:
FILE: src/paperqa/readers.py
class SyncPDFParserFn (line 30) | class SyncPDFParserFn(Protocol):
method __call__ (line 33) | def __call__(
class AsyncPDFParserFn (line 43) | class AsyncPDFParserFn(Protocol):
method __call__ (line 46) | async def __call__(
function resolve_page_range (line 58) | def resolve_page_range(
function parse_image (line 69) | async def parse_image(
function _make_chunk (line 92) | def _make_chunk(
function chunk_pdf (line 105) | def chunk_pdf(
function parse_text (line 146) | def parse_text(
function parse_office_doc (line 203) | def parse_office_doc(
function chunk_text (line 258) | def chunk_text(
function chunk_code_text (line 318) | def chunk_code_text(
function read_doc (line 367) | async def read_doc(
function read_doc (line 379) | async def read_doc(
function read_doc (line 391) | async def read_doc(
function read_doc (line 403) | async def read_doc(
function read_doc (line 415) | async def read_doc(
function read_doc (line 426) | async def read_doc( # noqa: PLR0912
FILE: src/paperqa/settings.py
class AsyncContextSerializer (line 94) | class AsyncContextSerializer(Protocol):
method __call__ (line 97) | async def __call__(
class AnswerSettings (line 106) | class AnswerSettings(BaseModel):
class ChunkingOptions (line 176) | class ChunkingOptions(StrEnum):
function get_default_pdf_parser (line 180) | def get_default_pdf_parser() -> PDFParserFn:
function default_pdf_parser_configurator (line 198) | def default_pdf_parser_configurator() -> None:
class MultimodalOptions (line 207) | class MultimodalOptions(IntEnum):
method from_value (line 216) | def from_value(cls, value: "bool | MultimodalOptions") -> "MultimodalO...
method should_parse_and_enrich_media (line 222) | def should_parse_and_enrich_media(self) -> tuple[bool, bool]:
class ParsingSettings (line 233) | class ParsingSettings(BaseModel):
method _resolve_parse_pdf (line 305) | def _resolve_parse_pdf(cls, v: str | PDFParserFn) -> PDFParserFn:
method _custom_serializer (line 317) | def _custom_serializer(
method should_parse_and_enrich_media (line 382) | def should_parse_and_enrich_media(self) -> tuple[bool, bool]:
class _FormatDict (line 388) | class _FormatDict(dict): # noqa: FURB189
method __init__ (line 391) | def __init__(self) -> None:
method __missing__ (line 394) | def __missing__(self, key: str) -> str:
function get_formatted_variables (line 399) | def get_formatted_variables(s: str) -> set[str]:
class PromptSettings (line 406) | class PromptSettings(BaseModel):
method check_summary (line 456) | def check_summary(cls, v: str) -> str:
method check_qa (line 468) | def check_qa(cls, v: str) -> str:
method check_select (line 478) | def check_select(cls, v: str) -> str:
method check_post (line 490) | def check_post(cls, v: str | None) -> str | None:
method check_context_outer (line 502) | def check_context_outer(cls, v: str) -> str:
method check_context_inner (line 514) | def check_context_inner(cls, v: str) -> str:
class IndexSettings (line 521) | class IndexSettings(BaseModel):
method get_named_index_directory (line 593) | def get_named_index_directory(self) -> anyio.Path:
method finalize_manifest_file (line 607) | async def finalize_manifest_file(self) -> anyio.Path | None:
class AgentSettings (line 616) | class AgentSettings(BaseModel):
function make_default_litellm_model_list_settings (line 728) | def make_default_litellm_model_list_settings(
class Settings (line 750) | class Settings(BaseSettings):
method _update_temperature (line 824) | def _update_temperature(self) -> Self:
method md5 (line 845) | def md5(self) -> str:
method get_index_name (line 853) | def get_index_name(self) -> str:
method from_name (line 877) | def from_name(
method get_llm (line 925) | def get_llm(self) -> LiteLLMModel:
method get_summary_llm (line 932) | def get_summary_llm(self) -> LiteLLMModel:
method get_agent_llm (line 941) | def get_agent_llm(self) -> LiteLLMModel:
method get_embedding_model (line 950) | def get_embedding_model(self) -> EmbeddingModel:
method get_enrichment_llm (line 953) | def get_enrichment_llm(self) -> LiteLLMModel:
method make_aviary_tool_selector (line 962) | def make_aviary_tool_selector(self, agent_type: str | type) -> ToolSel...
method make_ldp_agent (line 983) | async def make_ldp_agent(
method make_media_enricher (line 1051) | def make_media_enricher(self) -> Callable[[ParsedText], Awaitable[str]]:
method adjust_tools_for_agent_llm (line 1195) | def adjust_tools_for_agent_llm(self, tools: list[Tool]) -> None:
method context_serializer (line 1202) | async def context_serializer(
function get_settings (line 1283) | def get_settings(config_or_name: MaybeSettings = None) -> Settings:
FILE: src/paperqa/sources/clinical_trials.py
function api_search_clinical_trials (line 44) | async def api_search_clinical_trials(query: str, client: httpx.AsyncClie...
function api_get_clinical_trial (line 76) | async def api_get_clinical_trial(nct_id: str, client: httpx.AsyncClient)...
function search_retrieve_clinical_trials (line 86) | async def search_retrieve_clinical_trials(
function format_to_doc_details (line 115) | def format_to_doc_details(trial_data: dict) -> DocDetails:
function parse_clinical_trial (line 174) | def parse_clinical_trial(json_data: dict[str, Any]) -> str:
function add_clinical_trials_to_docs (line 237) | async def add_clinical_trials_to_docs(
function partition_clinical_trials_by_source (line 343) | def partition_clinical_trials_by_source(text: Embeddable) -> int:
FILE: src/paperqa/types.py
class Doc (line 75) | class Doc(Embeddable):
method remove_computed_fields (line 98) | def remove_computed_fields(cls, data: Mapping[str, Any]) -> dict[str, ...
method __hash__ (line 101) | def __hash__(self) -> int:
method formatted_citation (line 106) | def formatted_citation(self) -> str:
method matches_filter_criteria (line 109) | def matches_filter_criteria(self, filter_criteria: Mapping[str, Any]) ...
method to_csv (line 133) | def to_csv(cls, values: Iterable[Self], target_csv_path: str | os.Path...
class Text (line 155) | class Text(Embeddable):
method __eq__ (line 176) | def __eq__(self, other) -> bool:
method __hash__ (line 190) | def __hash__(self) -> int:
method get_embeddable_text (line 208) | async def get_embeddable_text(self, with_enrichment: bool = False) -> ...
class Context (line 238) | class Context(BaseModel):
method __str__ (line 284) | def __str__(self) -> str:
method __hash__ (line 288) | def __hash__(self) -> int:
method populate_id (line 306) | def populate_id(cls, data: dict[str, Any]) -> dict[str, Any]:
class PQASession (line 319) | class PQASession(BaseModel):
method __str__ (line 387) | def __str__(self) -> str:
method remove_computed (line 393) | def remove_computed(cls, data: Any) -> Any:
method used_contexts (line 400) | def used_contexts(self) -> set[str]:
method get_citation (line 404) | def get_citation(self, name: str) -> str:
method add_tokens (line 414) | def add_tokens(self, result: LLMResult | Message) -> None:
method get_unique_docs_from_contexts (line 435) | def get_unique_docs_from_contexts(self, score_threshold: int = 0) -> s...
method filter_content_for_user (line 442) | def filter_content_for_user(self) -> None:
method populate_formatted_answers_and_bib_from_raw_answer (line 474) | def populate_formatted_answers_and_bib_from_raw_answer(
class ChunkMetadata (line 529) | class ChunkMetadata(BaseModel):
class ParsedMetadata (line 542) | class ParsedMetadata(BaseModel):
class ParsedMedia (line 567) | class ParsedMedia(BaseModel):
method _check_data_xor_url (line 603) | def _check_data_xor_url(self) -> Self:
method _get_info_hashable (line 615) | def _get_info_hashable(self) -> Hashable:
method __hash__ (line 621) | def __hash__(self) -> int:
method to_id (line 625) | def to_id(self) -> UUID:
method __eq__ (line 653) | def __eq__(self, other) -> bool:
method to_image_url (line 670) | def to_image_url(self) -> str:
method save (line 683) | def save(self, path: str | os.PathLike) -> None:
function create_multimodal_message (line 697) | def create_multimodal_message(
class ParsedText (line 716) | class ParsedText(BaseModel):
method encode_content (line 738) | def encode_content(
method reduce_content (line 752) | def reduce_content(self) -> str:
class BibTeXSource (line 763) | class BibTeXSource(StrEnum):
method update_other (line 772) | def update_other(self, other: dict[str, Any] | None = None) -> dict[st...
class DocDetails (line 808) | class DocDetails(Doc):
method clean_key (line 897) | def clean_key(cls, value: str) -> str:
method add_tzinfo (line 903) | def add_tzinfo(cls, value: datetime | None) -> datetime | None:
method lowercase_doi_and_populate_doc_id (line 911) | def lowercase_doi_and_populate_doc_id(cls, data: dict[str, Any]) -> di...
method is_bibtex_complete (line 941) | def is_bibtex_complete(bibtex: str, fields: list[str] | None = None) -...
method merge_bibtex_entries (line 948) | def merge_bibtex_entries(entry1: Entry, entry2: Entry) -> Entry:
method misc_string_cleaning (line 960) | def misc_string_cleaning(data: dict[str, Any]) -> dict[str, Any]:
method inject_clean_doi_url_into_data (line 967) | def inject_clean_doi_url_into_data(data: dict[str, Any]) -> dict[str, ...
method add_preprint_journal_from_doi_if_missing (line 983) | def add_preprint_journal_from_doi_if_missing(
method remove_invalid_authors (line 1009) | def remove_invalid_authors(cls, data: dict[str, Any]) -> dict[str, Any]:
method overwrite_docname_dockey_for_compatibility_w_doc (line 1022) | def overwrite_docname_dockey_for_compatibility_w_doc(
method populate_bibtex_key_citation (line 1037) | def populate_bibtex_key_citation(cls, data: dict[str, Any]) -> dict[st...
method populate_content_hash (line 1142) | def populate_content_hash(cls, data: dict[str, Any]) -> dict[str, Any]:
method validate_all_fields (line 1154) | def validate_all_fields(cls, data: Mapping[str, Any]) -> dict[str, Any]:
method __getitem__ (line 1186) | def __getitem__(self, item: str):
method make_filename (line 1193) | def make_filename(self, title_limit: int | None = 48) -> str:
method formatted_citation (line 1218) | def formatted_citation(self) -> str:
method source_quality_message (line 1242) | def source_quality_message(self) -> str:
method is_hydration_needed (line 1253) | def is_hydration_needed(
method __add__ (line 1267) | def __add__(self, other: DocDetails | int) -> DocDetails: # noqa: PLR...
method __radd__ (line 1373) | def __radd__(self, other: DocDetails | int) -> DocDetails:
method __iadd__ (line 1379) | def __iadd__(self, other: DocDetails | int) -> DocDetails: # noqa: PY...
FILE: src/paperqa/utils.py
class ImpossibleParsingError (line 40) | class ImpossibleParsingError(Exception):
function clean_invalid_unicode (line 51) | def clean_invalid_unicode(text: str, repl: str = REPLACEMENT_CHAR) -> str:
function name_in_text (line 62) | def name_in_text(name: str, text: str) -> bool:
function maybe_is_text (line 68) | def maybe_is_text(s: str, thresh: float = 2.5) -> bool:
function maybe_is_pdf (line 93) | def maybe_is_pdf(file: BinaryIO) -> bool:
function maybe_is_html (line 99) | def maybe_is_html(file: BinaryIO) -> bool:
function strings_similarity (line 105) | def strings_similarity(s1: str, s2: str, case_insensitive: bool = True) ...
function hexdigest (line 117) | def hexdigest(data: str | bytes) -> str:
function md5sum (line 123) | def md5sum(file_path: str | os.PathLike) -> str:
function strip_citations (line 127) | def strip_citations(text: str) -> str:
function extract_score (line 134) | def extract_score(text: str) -> int:
function get_parenthetical_substrings (line 170) | def get_parenthetical_substrings(text: str) -> list[str]:
function get_citation_ids (line 191) | def get_citation_ids(text: str) -> list[str]:
function extract_doi (line 197) | def extract_doi(reference: str) -> str:
function batch_iter (line 214) | def batch_iter(iterable: list, n: int = 1) -> Iterator[list]:
function get_loop (line 227) | def get_loop() -> asyncio.AbstractEventLoop:
function run_or_ensure (line 236) | def run_or_ensure(coro: Awaitable[T]) -> T | asyncio.Task[T]:
function encode_id (line 244) | def encode_id(value: str | bytes | UUID, maxsize: int | None = 16) -> str:
function compute_unique_doc_id (line 253) | def compute_unique_doc_id(doi: str | None, content_hash: str | None) -> ...
function get_year (line 261) | def get_year(ts: datetime | None = None) -> str:
class CitationConversionError (line 268) | class CitationConversionError(Exception):
function clean_upbibtex (line 272) | def clean_upbibtex(bibtex: str) -> str:
function format_bibtex (line 314) | def format_bibtex(
function remove_substrings (line 371) | def remove_substrings(target: str, substr_removal_list: Collection[str])...
function mutate_acute_accents (line 381) | def mutate_acute_accents(text: str, replace: bool = False) -> str:
function bibtex_field_extract (line 409) | def bibtex_field_extract(
function create_bibtex_key (line 434) | def create_bibtex_key(author: list[str], year: str | int, title: str) ->...
function is_retryable (line 453) | def is_retryable(
function _get_with_retrying (line 479) | async def _get_with_retrying( # type: ignore[return] # noqa: RET503
function union_collections_to_ordered_list (line 519) | def union_collections_to_ordered_list(collections: Iterable) -> list:
function pqa_directory (line 523) | def pqa_directory(name: str) -> Path:
function setup_default_logs (line 533) | def setup_default_logs() -> None:
function extract_thought (line 547) | def extract_thought(content: str | None) -> str:
function logging_filters (line 589) | def logging_filters(
function citation_to_docname (line 612) | def citation_to_docname(citation: str) -> str:
function maybe_get_date (line 632) | def maybe_get_date(date: str | datetime | None) -> datetime | None:
function clean_possessives (line 654) | def clean_possessives(text: str) -> str:
function parse_enrichment_irrelevance (line 671) | def parse_enrichment_irrelevance(enrichment: str) -> tuple[bool, str]:
function get_stable_str (line 691) | def get_stable_str(fn: Callable, for_hash: bool = False) -> str:
FILE: tests/conftest.py
function _load_env (line 38) | def _load_env() -> None:
function _setup_default_logs (line 43) | def _setup_default_logs() -> None:
function _defeat_litellm_callbacks (line 56) | def _defeat_litellm_callbacks() -> None:
function _patch_litellm_logging_worker_for_race_condition (line 61) | def _patch_litellm_logging_worker_for_race_condition() -> Iterator[None]:
function fixture_vcr_config (line 109) | def fixture_vcr_config() -> dict[str, Any]:
function fixture_tmp_path_cleanup (line 127) | def fixture_tmp_path_cleanup(tmp_path: Path) -> Iterator[Path]:
function fixture_agent_home_dir (line 135) | def fixture_agent_home_dir(
function fixture_agent_index_dir (line 144) | def fixture_agent_index_dir(agent_home_dir: Path) -> Path:
function fixture_stub_data_dir (line 149) | def fixture_stub_data_dir() -> Path:
function agent_test_settings (line 154) | def agent_test_settings(agent_index_dir: Path, stub_data_dir: Path) -> S...
function agent_stub_session (line 173) | def agent_stub_session() -> PQASession:
function stub_data_dir_w_near_dupes (line 184) | def stub_data_dir_w_near_dupes(stub_data_dir: Path, tmp_path: Path) -> I...
class PreReadCompatibleAiohttpResponseStream (line 201) | class PreReadCompatibleAiohttpResponseStream(
method __aiter__ (line 206) | async def __aiter__(self) -> AsyncIterator[bytes]:
function _vcr_handle_async_request (line 219) | async def _vcr_handle_async_request(
function _build_response_with_raw_headers (line 245) | def _build_response_with_raw_headers(vcr_request, vcr_response, history):
FILE: tests/test_agents.py
function test_get_directory_index (line 68) | async def test_get_directory_index(
function test_resuming_crashed_index_build (line 183) | async def test_resuming_crashed_index_build(agent_test_settings: Setting...
function test_getting_manifest (line 238) | async def test_getting_manifest(
function test_get_directory_index_w_manifest (line 281) | async def test_get_directory_index_w_manifest(agent_test_settings: Setti...
function test_get_directory_index_w_no_citations (line 334) | async def test_get_directory_index_w_no_citations(
function test_agent_types (line 350) | async def test_agent_types(
function test_successful_memory_agent (line 403) | async def test_successful_memory_agent(agent_test_settings: Settings) ->...
function test_timeout (line 484) | async def test_timeout(agent_test_settings: Settings, agent_type: str | ...
function test_propagate_options (line 514) | async def test_propagate_options(agent_test_settings: Settings) -> None:
function test_gather_evidence_rejects_empty_docs (line 562) | async def test_gather_evidence_rejects_empty_docs(
function test_agent_sharing_state (line 620) | async def test_agent_sharing_state(
function test_settings_model_config (line 819) | def test_settings_model_config() -> None:
function test_tool_schema (line 848) | def test_tool_schema(agent_test_settings: Settings) -> None:
function test_answers_are_striped (line 993) | def test_answers_are_striped() -> None:
function test_clinical_tool_usage (line 1029) | async def test_clinical_tool_usage(agent_test_settings) -> None:
function test_search_pagination (line 1060) | async def test_search_pagination(agent_test_settings: Settings) -> None:
function test_empty_index_without_index_rebuild (line 1079) | async def test_empty_index_without_index_rebuild(agent_test_settings: Se...
class TestClinicalTrialSearchTool (line 1092) | class TestClinicalTrialSearchTool:
method test_continuation (line 1094) | async def test_continuation(self) -> None:
function test_index_build_concurrency (line 1119) | async def test_index_build_concurrency(agent_test_settings: Settings) ->...
function test_env_from_name (line 1156) | async def test_env_from_name(subtests: SubTests) -> None:
FILE: tests/test_cli.py
function test_can_modify_settings (line 17) | def test_can_modify_settings(capsys, stub_data_dir: Path) -> None:
function test_cli_ask (line 51) | def test_cli_ask(agent_index_dir: Path, stub_data_dir: Path) -> None:
function test_cli_can_build_and_search_index (line 72) | def test_cli_can_build_and_search_index(
function test_settings_index_name_used_when_index_arg_is_default (line 95) | def test_settings_index_name_used_when_index_arg_is_default(
FILE: tests/test_clients.py
function test_title_search (line 121) | async def test_title_search(paper_attributes: dict[str, str]) -> None:
function test_doi_search (line 273) | async def test_doi_search(paper_attributes: dict[str, str | list[str]]) ...
function test_bulk_doi_search (line 308) | async def test_bulk_doi_search() -> None:
function test_bulk_title_search (line 326) | async def test_bulk_title_search() -> None:
function test_bad_titles (line 351) | async def test_bad_titles() -> None:
function test_client_os_error (line 366) | async def test_client_os_error() -> None:
function test_s2_title_search_edge_cases (line 392) | async def test_s2_title_search_edge_cases(
function test_s2_title_search_empty_data (line 406) | async def test_s2_title_search_empty_data() -> None:
function test_bad_dois (line 415) | async def test_bad_dois() -> None:
function test_minimal_fields_filtering (line 424) | async def test_minimal_fields_filtering() -> None:
function test_s2_only_fields_filtering (line 458) | async def test_s2_only_fields_filtering() -> None:
function test_crossref_journalquality_fields_filtering (line 484) | async def test_crossref_journalquality_fields_filtering() -> None:
function test_author_matching (line 535) | async def test_author_matching() -> None:
function test_odd_client_requests (line 577) | async def test_odd_client_requests() -> None:
function test_ensure_robust_to_timeouts (line 626) | async def test_ensure_robust_to_timeouts() -> None:
function test_bad_init (line 636) | def test_bad_init() -> None:
function test_ensure_sequential_run (line 645) | async def test_ensure_sequential_run(caplog) -> None:
function test_ensure_sequential_run_early_stop (line 691) | async def test_ensure_sequential_run_early_stop(caplog) -> None:
function test_crossref_retraction_status (line 729) | async def test_crossref_retraction_status(stub_data_dir: Path) -> None:
function test_reformat_name (line 772) | def test_reformat_name(name: str, expected: str) -> None:
function test_arxiv_doi_is_used_when_available (line 779) | async def test_arxiv_doi_is_used_when_available() -> None:
function test_tricky_journal_quality_results (line 808) | async def test_tricky_journal_quality_results(doi: str, score: int) -> N...
function test_does_openalex_work (line 848) | async def test_does_openalex_work(
function test_journal_quality_csv_values_are_valid (line 869) | def test_journal_quality_csv_values_are_valid() -> None:
FILE: tests/test_clinical_trials.py
function mock_bucket_client (line 34) | def mock_bucket_client():
function fixture_mock_client (line 40) | def fixture_mock_client() -> httpx.AsyncClient:
function test_api_search_clinical_trials_success (line 45) | async def test_api_search_clinical_trials_success(mock_client) -> None:
function test_api_get_clinical_trial_success (line 62) | async def test_api_get_clinical_trial_success(mock_client) -> None:
function test_api_get_clinical_trial_not_found (line 75) | async def test_api_get_clinical_trial_not_found(mock_client) -> None:
function test_format_to_doc_details (line 85) | def test_format_to_doc_details():
function test_add_clinical_trials_to_docs (line 99) | async def test_add_clinical_trials_to_docs(mock_client) -> None:
function test_parse_clinical_trial (line 128) | def test_parse_clinical_trial():
FILE: tests/test_configs.py
function test_prompt_settings_validation (line 27) | def test_prompt_settings_validation() -> None:
function test_get_formatted_variables (line 40) | def test_get_formatted_variables() -> None:
function test_get_settings_with_valid_config (line 53) | def test_get_settings_with_valid_config(value: MaybeSettings) -> None:
function test_get_settings_missing_file (line 58) | def test_get_settings_missing_file() -> None:
function test_settings_default_instantiation (line 69) | def test_settings_default_instantiation(tmpdir, subtests: SubTests) -> N...
function test_index_naming (line 95) | def test_index_naming(subtests: SubTests) -> None:
function test_router_kwargs_present_in_models (line 106) | def test_router_kwargs_present_in_models() -> None:
function test_models_requiring_temp_1 (line 122) | def test_models_requiring_temp_1(model_name: str) -> None:
function test_matches_filter_criteria (line 204) | def test_matches_filter_criteria(doc_class, doc_data, filter_criteria, e...
function test_citation_prompt_current_year (line 209) | def test_citation_prompt_current_year():
function test_validity_of_bundled_configs (line 218) | def test_validity_of_bundled_configs(subtests: SubTests) -> None:
function test_readme_settings_cheatsheet_accuracy (line 230) | def test_readme_settings_cheatsheet_accuracy(subtests: SubTests) -> None:
FILE: tests/test_paperqa.py
function fixture_docs_fixture (line 111) | async def fixture_docs_fixture(stub_data_dir: Path) -> Docs:
function test_encode_id (line 123) | def test_encode_id() -> None:
function test_single_author (line 131) | def test_single_author() -> None:
function test_multiple_authors (line 136) | def test_multiple_authors() -> None:
function test_multiple_citations (line 141) | def test_multiple_citations() -> None:
function test_citations_with_pages (line 146) | def test_citations_with_pages() -> None:
function test_citations_without_space (line 151) | def test_citations_without_space() -> None:
function test_citations_with_commas (line 156) | def test_citations_with_commas() -> None:
function test_citations_with_text (line 161) | def test_citations_with_text() -> None:
function test_no_citations (line 166) | def test_no_citations() -> None:
function test_malformed_citations (line 171) | def test_malformed_citations() -> None:
function test_edge_case_citations (line 176) | def test_edge_case_citations() -> None:
function test_citations_with_special_characters (line 181) | def test_citations_with_special_characters() -> None:
function test_citations_with_nonstandard_chars (line 186) | def test_citations_with_nonstandard_chars() -> None:
function test_maybe_is_text (line 197) | def test_maybe_is_text() -> None:
function test_name_in_text (line 250) | def test_name_in_text() -> None:
function test_extract_score (line 291) | def test_extract_score() -> None:
function test_chain_completion (line 439) | async def test_chain_completion(caplog) -> None:
function test_model_chain (line 512) | async def test_model_chain(
function test_docs_lifecycle (line 736) | async def test_docs_lifecycle(subtests: SubTests, stub_data_dir: Path) -...
function test_evidence (line 783) | async def test_evidence(stub_data_dir: Path) -> None:
function test_nonduplicate_contexts (line 844) | async def test_nonduplicate_contexts() -> None:
function test_json_evidence (line 875) | async def test_json_evidence(docs_fixture: Docs) -> None:
function test_ablations (line 926) | async def test_ablations(docs_fixture: Docs) -> None:
function test_location_awareness (line 946) | async def test_location_awareness(stub_data_dir: Path) -> None:
function test_query (line 1012) | async def test_query(docs_fixture) -> None:
function test_custom_context_str_fn (line 1018) | async def test_custom_context_str_fn(docs_fixture) -> None:
function test_aquery_groups_contexts_by_question (line 1043) | async def test_aquery_groups_contexts_by_question(docs_fixture) -> None:
function test_query_with_iteration (line 1118) | async def test_query_with_iteration(docs_fixture) -> None:
function test_llmresult_callback (line 1142) | async def test_llmresult_callback(docs_fixture: Docs) -> None:
function test_get_reasoning (line 1184) | async def test_get_reasoning(docs_fixture: Docs, llm: str, llm_settings:...
function test_duplicate (line 1194) | async def test_duplicate(stub_data_dir: Path, tmp_path) -> None:
function test_docs_with_custom_embedding (line 1253) | async def test_docs_with_custom_embedding(
function test_sparse_embedding (line 1326) | async def test_sparse_embedding(
function test_hybrid_embedding (line 1351) | async def test_hybrid_embedding(
function test_custom_llm_custom_media (line 1386) | async def test_custom_llm_custom_media(stub_data_dir: Path) -> None:
function test_docs_pickle (line 1479) | async def test_docs_pickle(stub_data_dir) -> None:
function test_unrelated_context (line 1508) | async def test_unrelated_context(
function test_repeat_keys (line 1541) | async def test_repeat_keys(stub_data_dir) -> None:
function test_pdf_reader_w_no_match_doc_details (line 1565) | async def test_pdf_reader_w_no_match_doc_details(stub_data_dir: Path) ->...
function test_pdf_reader_w_no_chunks (line 1584) | async def test_pdf_reader_w_no_chunks(stub_data_dir: Path) -> None:
function test_partly_embedded_texts (line 1605) | async def test_partly_embedded_texts(defer_embeddings: bool) -> None:
function test_pdf_reader_match_doc_details (line 1651) | async def test_pdf_reader_match_doc_details(stub_data_dir: Path) -> None:
function test_fileio_reader_pdf (line 1712) | async def test_fileio_reader_pdf(stub_data_dir: Path) -> None:
function test_fileio_reader_txt (line 1725) | async def test_fileio_reader_txt(stub_data_dir: Path) -> None:
function test_resolve_page_range (line 1752) | def test_resolve_page_range(
function test_parser_only_reader (line 1762) | async def test_parser_only_reader(pdf_parser: PDFParserFn, stub_data_dir...
function test_chunk_metadata_reader (line 1793) | async def test_chunk_metadata_reader(
function test_media_to_image_url (line 1890) | def test_media_to_image_url(subtests: SubTests) -> None:
function test_parsed_media_data_or_url (line 1916) | def test_parsed_media_data_or_url() -> None:
function test_parsed_media_url_only_hash_eq (line 1942) | def test_parsed_media_url_only_hash_eq() -> None:
function test_image_aggregation (line 1959) | async def test_image_aggregation(stub_data_dir: Path) -> None:
function test_read_doc_images_metadata (line 2000) | async def test_read_doc_images_metadata(stub_data_dir: Path) -> None:
function test_read_doc_images_concurrency (line 2052) | async def test_read_doc_images_concurrency(stub_data_dir: Path) -> None:
class TestMultimodalOptions (line 2082) | class TestMultimodalOptions:
method test_from_value (line 2099) | def test_from_value(
method test_should_parse_and_enrich_media (line 2114) | def test_should_parse_and_enrich_media(
function record_non_llm_requests (line 2123) | def record_non_llm_requests(
function test_image_enrichment_normal_use (line 2136) | async def test_image_enrichment_normal_use(stub_data_dir: Path) -> None:
function test_image_enrichment_invalid_image (line 2266) | async def test_image_enrichment_invalid_image(caplog) -> None:
function test_image_enrichment_with_oversized_image (line 2287) | async def test_image_enrichment_with_oversized_image(caplog) -> None:
function test_code (line 2325) | async def test_code() -> None:
function test_querying_tables (line 2338) | async def test_querying_tables(stub_data_dir: Path) -> None:
function test_images (line 2382) | async def test_images(stub_data_dir: Path) -> None:
function test_duplicate_media_context_creation (line 2425) | async def test_duplicate_media_context_creation(stub_data_dir: Path) -> ...
function test_images_corrupt (line 2465) | async def test_images_corrupt(stub_data_dir: Path, caplog) -> None:
function test_equations (line 2532) | async def test_equations(stub_data_dir: Path, parser: PDFParserFn) -> None:
function test_missing_page_doesnt_crash_us (line 2563) | def test_missing_page_doesnt_crash_us() -> None:
function test_zotero (line 2579) | def test_zotero() -> None:
function test_too_much_evidence (line 2588) | async def test_too_much_evidence(
function test_custom_prompts (line 2610) | async def test_custom_prompts(stub_data_dir: Path) -> None:
function test_pre_prompt (line 2629) | async def test_pre_prompt(stub_data_dir: Path) -> None:
function test_post_prompt (line 2650) | async def test_post_prompt(stub_data_dir: Path) -> None:
function test_external_doc_index (line 2663) | async def test_external_doc_index(stub_data_dir: Path) -> None:
function test_context_inner_outer_prompt (line 2676) | async def test_context_inner_outer_prompt(stub_data_dir: Path) -> None:
function test_get_index_name_uniqueness (line 2717) | def test_get_index_name_uniqueness(
function test_case_insensitive_matching (line 2731) | def test_case_insensitive_matching():
function test_dois_resolve_to_correct_journals (line 2752) | def test_dois_resolve_to_correct_journals(doi_journals):
function test_none_values (line 2757) | def test_none_values() -> None:
function test_docdetails_merge_with_non_list_fields (line 2765) | def test_docdetails_merge_with_non_list_fields() -> None:
function test_docdetails_merge_with_list_fields (line 2799) | def test_docdetails_merge_with_list_fields() -> None:
function test_docdetails_deserialization (line 2833) | def test_docdetails_deserialization(tmp_path) -> None:
function test_docdetails_doc_id_roundtrip (line 2892) | def test_docdetails_doc_id_roundtrip() -> None:
function test_partitioning_fn_docs (line 3048) | async def test_partitioning_fn_docs(use_partition: bool) -> None:
class TestLLMParseJson (line 3159) | class TestLLMParseJson:
method test_basic_json_extraction (line 3197) | def test_basic_json_extraction(self, input_text: str) -> None:
method test_handling_newlines (line 3211) | def test_handling_newlines(self, input_text: str) -> None:
method test_relevance_score_parsing (line 3260) | def test_relevance_score_parsing(self, input_text: str) -> None:
method test_json_keys (line 3304) | def test_json_keys(self, input_text: str) -> None:
method test_json_broken_formatting (line 3338) | def test_json_broken_formatting(self, input_text: str) -> None:
method test_fallback_non_json (line 3355) | def test_fallback_non_json(self, input_text: str) -> None:
method test_llm_parse_json_with_escaped_characters (line 3366) | def test_llm_parse_json_with_escaped_characters(self, input_text, expe...
method test_llm_subquotes_and_newlines (line 3378) | def test_llm_subquotes_and_newlines(self, input_text: str) -> None:
function test_maybe_get_date (line 3388) | def test_maybe_get_date():
function test_clean_possessives (line 3418) | def test_clean_possessives(raw_text: str, cleaned_text: str) -> None:
function test_pqa_context_id_parsing (line 3475) | def test_pqa_context_id_parsing(raw_text: str, cleaned_text: str) -> None:
function test_timeout_resilience (line 3543) | async def test_timeout_resilience() -> None:
function test_parse_pdf_string_resolution (line 3593) | def test_parse_pdf_string_resolution() -> None:
function test_reader_config_propagation (line 3648) | async def test_reader_config_propagation(stub_data_dir: Path, multimodal...
function test_parse_office_doc (line 3687) | async def test_parse_office_doc(stub_data_dir: Path, filename: str, quer...
function test_text_comparison (line 3711) | def test_text_comparison() -> None:
function test_context_comparison (line 3768) | def test_context_comparison() -> None:
FILE: tests/test_utils.py
function test_citation_to_docname_acronym_title (line 4) | def test_citation_to_docname_acronym_title() -> None:
function test_citation_to_docname_non_text_fallback_is_deterministic (line 9) | def test_citation_to_docname_non_text_fallback_is_deterministic() -> None:
Copy disabled (too large)
Download .json
Condensed preview — 177 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (16,985K chars).
[
{
"path": ".gitattributes",
"chars": 42,
"preview": "tests/cassettes/* linguist-generated=true\n"
},
{
"path": ".github/renovate.json5",
"chars": 710,
"preview": "{\n $schema: \"https://docs.renovatebot.com/renovate-schema.json\",\n extends: [\n \"config:recommended\",\n \"group:allN"
},
{
"path": ".github/workflows/build.yml",
"chars": 3337,
"preview": "name: Publish\n\non:\n release:\n types: [created]\n workflow_dispatch:\n\njobs:\n publish:\n runs-on: ubuntu-latest\n "
},
{
"path": ".github/workflows/tests.yml",
"chars": 7336,
"preview": "name: Lint and Test\n\non:\n push:\n branches: [main]\n pull_request:\n workflow_dispatch:\n\njobs:\n pre-commit:\n runs"
},
{
"path": ".gitignore",
"chars": 5877,
"preview": "# Swap\n[._]*.s[a-v][a-z]\n!*.svg # comment out if you don't need vector files\n[._]*.sw[a-p]\n[._]s[a-rt-v][a-z]\n[._]ss[a-"
},
{
"path": ".mailmap",
"chars": 1171,
"preview": "Andrew White <andrew@futurehouse.org> <white.d.andrew@gmail.com>\nAhmet Celebi <59479833+AmT42@users.noreply.github.com> "
},
{
"path": ".pre-commit-config.yaml",
"chars": 3001,
"preview": "default_language_version:\n python: python3\nrepos:\n - repo: https://github.com/pre-commit/pre-commit-hooks\n rev: v6."
},
{
"path": ".python-version",
"chars": 5,
"preview": "3.13\n"
},
{
"path": "CITATION.cff",
"chars": 1768,
"preview": "---\ncff-version: 1.2.0\nmessage: >-\n If you use this software, please cite it using the\n metadata from this file.\nautho"
},
{
"path": "CONTRIBUTING.md",
"chars": 1994,
"preview": "# Contributing to PaperQA\n\nThank you for your interest in contributing to PaperQA!\nHere are some guidelines to help you "
},
{
"path": "LICENSE",
"chars": 11341,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "README.md",
"chars": 60462,
"preview": "# PaperQA2\n\n<!-- pyml disable-num-lines 6 line-length -->\n\n[ as your"
},
{
"path": "packages/paper-qa-docling/LICENSE",
"chars": 11341,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "packages/paper-qa-docling/README.md",
"chars": 1033,
"preview": "# paper-qa-pypdf\n\n<!-- pyml disable-num-lines 6 line-length -->\n\n["
},
{
"path": "packages/paper-qa-pymupdf/README.md",
"chars": 690,
"preview": "# paper-qa-pymupdf\n\n<!-- pyml disable-num-lines 6 line-length -->\n\n[ -> None:\n assert cl"
},
{
"path": "pyproject.toml",
"chars": 23152,
"preview": "[build-system]\nbuild-backend = \"setuptools.build_meta\"\nrequires = [\"setuptools>=64\", \"setuptools_scm>=8\"]\n\n[dependency-g"
},
{
"path": "src/paperqa/__init__.py",
"chars": 1078,
"preview": "from lmi import (\n EmbeddingModel,\n HybridEmbeddingModel,\n LiteLLMEmbeddingModel,\n LiteLLMModel,\n LLMMode"
},
{
"path": "src/paperqa/_ldp_shims.py",
"chars": 2085,
"preview": "\"\"\"Centralized place for lazy LDP imports.\"\"\"\n\n__all__ = [\n \"HAS_LDP_INSTALLED\",\n \"Agent\",\n \"Callback\",\n \"Co"
},
{
"path": "src/paperqa/agents/__init__.py",
"chars": 8758,
"preview": "from __future__ import annotations\n\nimport argparse\nimport asyncio\nimport logging\nimport os\nfrom pathlib import Path\nfro"
},
{
"path": "src/paperqa/agents/env.py",
"chars": 13763,
"preview": "import logging\nfrom collections.abc import Callable\nfrom copy import deepcopy\nfrom typing import Any, ClassVar, Self, ca"
},
{
"path": "src/paperqa/agents/helpers.py",
"chars": 3980,
"preview": "from __future__ import annotations\n\nimport logging\nimport re\nfrom datetime import datetime\nfrom typing import cast\n\nfrom"
},
{
"path": "src/paperqa/agents/main.py",
"chars": 15932,
"preview": "import asyncio\nimport logging\nfrom collections.abc import Awaitable, Callable\nfrom typing import TYPE_CHECKING, Any\n\nfro"
},
{
"path": "src/paperqa/agents/models.py",
"chars": 5529,
"preview": "from __future__ import annotations\n\nimport asyncio\nimport logging\nimport time\nfrom contextlib import asynccontextmanager"
},
{
"path": "src/paperqa/agents/search.py",
"chars": 27194,
"preview": "from __future__ import annotations\n\nimport contextlib\nimport csv\nimport json\nimport logging\nimport os\nimport pathlib\nimp"
},
{
"path": "src/paperqa/agents/tools.py",
"chars": 28496,
"preview": "\"\"\"Base classes for tools, implemented in a functional manner.\"\"\"\n\nimport asyncio\nimport inspect\nimport logging\nimport o"
},
{
"path": "src/paperqa/clients/__init__.py",
"chars": 10401,
"preview": "from __future__ import annotations\n\nimport copy\nimport logging\nfrom collections.abc import Awaitable, Collection, Corout"
},
{
"path": "src/paperqa/clients/client_data/journal_quality.csv",
"chars": 1415929,
"preview": "clean_name,quality\r\n\"\"\"rau\"\" publishing house, russian-armenian (slavonic) state university\",-1\r\n#isoj,-1\r\n#tyottomat,-1"
},
{
"path": "src/paperqa/clients/client_models.py",
"chars": 6507,
"preview": "from __future__ import annotations\n\nimport logging\nfrom abc import ABC, abstractmethod\nfrom collections.abc import Colle"
},
{
"path": "src/paperqa/clients/crossref.py",
"chars": 13762,
"preview": "from __future__ import annotations\n\nimport contextlib\nimport copy\nimport json\nimport logging\nimport os\nfrom collections."
},
{
"path": "src/paperqa/clients/exceptions.py",
"chars": 774,
"preview": "from collections.abc import Callable\n\nimport httpx\n\n\nclass DOINotFoundError(Exception):\n def __init__(self, message=\""
},
{
"path": "src/paperqa/clients/journal_quality.py",
"chars": 8432,
"preview": "from __future__ import annotations\n\nimport asyncio\nimport csv\nimport logging\nimport os\nimport tempfile\nfrom collections."
},
{
"path": "src/paperqa/clients/openalex.py",
"chars": 10537,
"preview": "from __future__ import annotations\n\nimport logging\nimport os\nfrom collections.abc import Collection\nfrom datetime import"
},
{
"path": "src/paperqa/clients/retractions.py",
"chars": 3170,
"preview": "from __future__ import annotations\n\nimport csv\nimport datetime\nimport logging\nimport os\n\nfrom pydantic import Validation"
},
{
"path": "src/paperqa/clients/semantic_scholar.py",
"chars": 13684,
"preview": "from __future__ import annotations\n\nimport logging\nimport os\nfrom collections.abc import Collection\nfrom datetime import"
},
{
"path": "src/paperqa/clients/unpaywall.py",
"chars": 7110,
"preview": "from __future__ import annotations\n\nimport os\nfrom datetime import datetime\nfrom http import HTTPStatus\nfrom typing impo"
},
{
"path": "src/paperqa/configs/clinical_trials.json",
"chars": 393,
"preview": "{\n \"answer\": {\n \"evidence_k\": 15,\n \"answer_max_sources\": 5,\n \"max_concurrent_requests\": 10\n },\n \"agent\": {\n "
},
{
"path": "src/paperqa/configs/contracrow.json",
"chars": 5301,
"preview": "{\n \"llm\": \"claude-3-5-sonnet-20240620\",\n \"llm_config\": null,\n \"summary_llm\": \"claude-3-5-sonnet-20240620\",\n \"summary"
},
{
"path": "src/paperqa/configs/debug.json",
"chars": 433,
"preview": "{\n \"llm\": \"claude-3-haiku-20240307\",\n \"summary_llm\": \"claude-3-haiku-20240307\",\n \"answer\": {\n \"evidence_k\": 2,\n "
},
{
"path": "src/paperqa/configs/fast.json",
"chars": 367,
"preview": "{\n \"answer\": {\n \"evidence_k\": 5,\n \"evidence_summary_length\": \"25 to 50 words\",\n \"answer_max_sources\": 3,\n \""
},
{
"path": "src/paperqa/configs/high_quality.json",
"chars": 233,
"preview": "{\n \"answer\": {\n \"evidence_k\": 20,\n \"answer_max_sources\": 5,\n \"max_concurrent_requests\": 10\n },\n \"parsing\": {"
},
{
"path": "src/paperqa/configs/openreview.json",
"chars": 930,
"preview": "{\n \"llm\": \"gemini/gemini-2.0-flash-exp\",\n \"llm_config\": {\n \"model_name\": \"gemini/gemini-2.0-flash-exp\",\n \"litell"
},
{
"path": "src/paperqa/configs/search_only_clinical_trials.json",
"chars": 371,
"preview": "{\n \"answer\": {\n \"evidence_k\": 15,\n \"answer_max_sources\": 5,\n \"max_concurrent_requests\": 10\n },\n \"agent\": {\n "
},
{
"path": "src/paperqa/configs/tier1_limits.json",
"chars": 1699,
"preview": "{\n \"answer\": {\n \"evidence_k\": 5,\n \"evidence_summary_length\": \"25 to 50 words\",\n \"answer_max_sources\": 3,\n \""
},
{
"path": "src/paperqa/configs/tier2_limits.json",
"chars": 1668,
"preview": "{\n \"answer\": {\n \"evidence_k\": 8,\n \"answer_max_sources\": 3,\n \"max_concurrent_requests\": 8\n },\n \"parsing\": {\n "
},
{
"path": "src/paperqa/configs/tier3_limits.json",
"chars": 1668,
"preview": "{\n \"answer\": {\n \"evidence_k\": 8,\n \"answer_max_sources\": 3,\n \"max_concurrent_requests\": 8\n },\n \"parsing\": {\n "
},
{
"path": "src/paperqa/configs/tier4_limits.json",
"chars": 1691,
"preview": "{\n \"answer\": {\n \"evidence_k\": 10,\n \"answer_max_sources\": 5,\n \"max_concurrent_requests\": 8\n },\n \"parsing\": {\n"
},
{
"path": "src/paperqa/configs/tier5_limits.json",
"chars": 1712,
"preview": "{\n \"answer\": {\n \"evidence_k\": 15,\n \"answer_max_sources\": 5,\n \"max_concurrent_requests\": 8\n },\n \"parsing\": {\n"
},
{
"path": "src/paperqa/configs/wikicrow.json",
"chars": 5356,
"preview": "{\n \"llm\": \"gpt-4-turbo-2024-04-09\",\n \"llm_config\": null,\n \"summary_llm\": \"gpt-4-turbo-2024-04-09\",\n \"summary_llm_con"
},
{
"path": "src/paperqa/contrib/__init__.py",
"chars": 53,
"preview": "from .zotero import ZoteroDB\n\n__all__ = [\"ZoteroDB\"]\n"
},
{
"path": "src/paperqa/contrib/openreview_paper_helper.py",
"chars": 6497,
"preview": "import json\nimport logging\nimport os\nfrom pathlib import Path\nfrom typing import Any\n\nimport anyio\nimport httpx\nimport h"
},
{
"path": "src/paperqa/contrib/zotero.py",
"chars": 13027,
"preview": "\"\"\"This module gets PDF files from the user's Zotero library.\"\"\"\n\nimport asyncio\nimport logging\nimport os\nfrom collectio"
},
{
"path": "src/paperqa/core.py",
"chars": 16629,
"preview": "import json\nimport logging\nimport re\nfrom collections.abc import Callable, Sequence\nfrom typing import Any, ClassVar\n\nim"
},
{
"path": "src/paperqa/docs.py",
"chars": 27486,
"preview": "from __future__ import annotations\n\nimport asyncio\nimport json\nimport logging\nimport os\nimport re\nimport tempfile\nimport"
},
{
"path": "src/paperqa/llms.py",
"chars": 19962,
"preview": "import asyncio\nimport itertools\nimport logging\nimport threading\nimport uuid\nfrom abc import ABC, abstractmethod\nfrom col"
},
{
"path": "src/paperqa/paths.py",
"chars": 65,
"preview": "from pathlib import Path\n\nPAPERQA_DIR = Path.home() / \".paperqa\"\n"
},
{
"path": "src/paperqa/prompts.py",
"chars": 12390,
"preview": "from datetime import datetime\n\nsummary_json_prompt = (\n \"Excerpt from {citation}\\n\\n---\\n\\n{text}\\n\\n---\\n\\nQuestion:"
},
{
"path": "src/paperqa/py.typed",
"chars": 0,
"preview": ""
},
{
"path": "src/paperqa/readers.py",
"chars": 19106,
"preview": "from __future__ import annotations\n\nimport asyncio\nimport os\nfrom collections.abc import Awaitable, Callable\nfrom import"
},
{
"path": "src/paperqa/settings.py",
"chars": 51063,
"preview": "import asyncio\nimport importlib.resources\nimport logging\nimport os\nimport pathlib\nimport re\nimport warnings\nfrom collect"
},
{
"path": "src/paperqa/sources/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "src/paperqa/sources/clinical_trials.py",
"chars": 11442,
"preview": "import json\nimport logging\nimport ssl\nfrom contextlib import suppress\nfrom datetime import datetime\nfrom typing import A"
},
{
"path": "src/paperqa/types.py",
"chars": 54380,
"preview": "from __future__ import annotations\n\nimport ast\nimport contextlib\nimport csv\nimport hashlib\nimport json\nimport logging\nim"
},
{
"path": "src/paperqa/utils.py",
"chars": 25017,
"preview": "import asyncio\nimport contextlib\nimport hashlib\nimport logging\nimport logging.config\nimport math\nimport os\nimport re\nimp"
},
{
"path": "tests/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "tests/cassettes/test_arxiv_doi_is_used_when_available.yaml",
"chars": 6018,
"preview": "interactions:\n - request:\n body: \"\"\n headers:\n accept:\n - \"*/*\"\n accept-encoding:\n "
},
{
"path": "tests/cassettes/test_author_matching.yaml",
"chars": 10140,
"preview": "interactions:\n - request:\n body: \"\"\n headers:\n accept:\n - \"*/*\"\n accept-encoding:\n "
},
{
"path": "tests/cassettes/test_bad_dois.yaml",
"chars": 3056,
"preview": "interactions:\n - request:\n body: \"\"\n headers:\n accept:\n - \"*/*\"\n accept-encoding:\n "
},
{
"path": "tests/cassettes/test_bad_titles.yaml",
"chars": 15071,
"preview": "interactions:\n - request:\n body: \"\"\n headers:\n accept:\n - \"*/*\"\n accept-encoding:\n "
},
{
"path": "tests/cassettes/test_bulk_doi_search.yaml",
"chars": 69495,
"preview": "interactions:\n - request:\n body: null\n headers:\n accept:\n - \"*/*\"\n accept-encoding:\n "
},
{
"path": "tests/cassettes/test_bulk_title_search.yaml",
"chars": 79465,
"preview": "interactions:\n - request:\n body: null\n headers:\n accept:\n - \"*/*\"\n accept-encoding:\n "
},
{
"path": "tests/cassettes/test_crossref_journalquality_fields_filtering.yaml",
"chars": 6172,
"preview": "interactions:\n - request:\n body: \"\"\n headers:\n accept:\n - \"*/*\"\n accept-encoding:\n "
},
{
"path": "tests/cassettes/test_crossref_retraction_status.yaml",
"chars": 2126,
"preview": "interactions:\n - request:\n body: \"\"\n headers:\n accept:\n - \"*/*\"\n accept-encoding:\n "
},
{
"path": "tests/cassettes/test_docs_lifecycle.yaml",
"chars": 169155,
"preview": "interactions:\n - request:\n body: null\n headers:\n accept:\n - \"*/*\"\n accept-encoding:\n "
},
{
"path": "tests/cassettes/test_does_openalex_work[not-in-openalex].yaml",
"chars": 2378,
"preview": "interactions:\n - request:\n body: null\n headers:\n accept:\n - \"*/*\"\n accept-encoding:\n "
},
{
"path": "tests/cassettes/test_does_openalex_work[not-oa-in-openalex].yaml",
"chars": 2291,
"preview": "interactions:\n - request:\n body: null\n headers:\n accept:\n - \"*/*\"\n accept-encoding:\n "
},
{
"path": "tests/cassettes/test_does_openalex_work[oa-in-openalex1].yaml",
"chars": 2342,
"preview": "interactions:\n - request:\n body: null\n headers:\n accept:\n - \"*/*\"\n accept-encoding:\n "
},
{
"path": "tests/cassettes/test_does_openalex_work[oa-in-openalex2].yaml",
"chars": 2370,
"preview": "interactions:\n - request:\n body: null\n headers:\n accept:\n - \"*/*\"\n accept-encoding:\n "
},
{
"path": "tests/cassettes/test_doi_search[paper_attributes0].yaml",
"chars": 24795,
"preview": "interactions:\n - request:\n body: \"\"\n headers:\n accept:\n - \"*/*\"\n accept-encoding:\n "
},
{
"path": "tests/cassettes/test_doi_search[paper_attributes1].yaml",
"chars": 24097,
"preview": "interactions:\n - request:\n body: null\n headers:\n accept:\n - \"*/*\"\n accept-encoding:\n "
},
{
"path": "tests/cassettes/test_doi_search[paper_attributes2].yaml",
"chars": 14315,
"preview": "interactions:\n - request:\n body: \"\"\n headers:\n accept:\n - \"*/*\"\n accept-encoding:\n "
},
{
"path": "tests/cassettes/test_doi_search[paper_attributes3].yaml",
"chars": 25541,
"preview": "interactions:\n - request:\n body: \"\"\n headers:\n accept:\n - \"*/*\"\n accept-encoding:\n "
},
{
"path": "tests/cassettes/test_doi_search[paper_attributes4].yaml",
"chars": 24552,
"preview": "interactions:\n - request:\n body: \"\"\n headers:\n accept:\n - \"*/*\"\n accept-encoding:\n "
},
{
"path": "tests/cassettes/test_ensure_sequential_run.yaml",
"chars": 15980,
"preview": "interactions:\n - request:\n body: \"\"\n headers:\n accept:\n - \"*/*\"\n accept-encoding:\n "
},
{
"path": "tests/cassettes/test_ensure_sequential_run_early_stop.yaml",
"chars": 3001,
"preview": "interactions:\n - request:\n body: \"\"\n headers:\n accept:\n - \"*/*\"\n accept-encoding:\n "
},
{
"path": "tests/cassettes/test_equations[docling].yaml",
"chars": 5831,
"preview": "interactions:\n - request:\n body: null\n headers:\n accept:\n - \"*/*\"\n accept-encoding:\n "
},
{
"path": "tests/cassettes/test_equations[nemotron].yaml",
"chars": 3568472,
"preview": "interactions:\n - request:\n body: null\n headers:\n accept:\n - \"*/*\"\n accept-encoding:\n "
},
{
"path": "tests/cassettes/test_equations[pymupdf].yaml",
"chars": 5837,
"preview": "interactions:\n - request:\n body: null\n headers:\n accept:\n - \"*/*\"\n accept-encoding:\n "
},
{
"path": "tests/cassettes/test_get_reasoning[deepseek-reasoner].yaml",
"chars": 558566,
"preview": "interactions:\n - request:\n body: null\n headers:\n accept:\n - \"*/*\"\n accept-encoding:\n "
},
{
"path": "tests/cassettes/test_get_reasoning[openrouter-deepseek].yaml",
"chars": 600491,
"preview": "interactions:\n - request:\n body: null\n headers:\n accept:\n - \"*/*\"\n accept-encoding:\n "
},
{
"path": "tests/cassettes/test_image_enrichment_invalid_image.yaml",
"chars": 23341,
"preview": "interactions:\n - request:\n body:\n '{\"messages\":[{\"role\":\"user\",\"content\":[{\"type\":\"image_url\",\"image_url\":{"
},
{
"path": "tests/cassettes/test_image_enrichment_normal_use.yaml",
"chars": 14709,
"preview": "interactions:\n - request:\n body: null\n headers:\n accept:\n - \"*/*\"\n accept-encoding:\n "
},
{
"path": "tests/cassettes/test_maybe_is_text.yaml",
"chars": 349681,
"preview": "interactions:\n - request:\n body: \"\"\n headers:\n accept:\n - \"*/*\"\n accept-encoding:\n "
},
{
"path": "tests/cassettes/test_minimal_fields_filtering.yaml",
"chars": 4713,
"preview": "interactions:\n - request:\n body: \"\"\n headers:\n accept:\n - \"*/*\"\n accept-encoding:\n "
},
{
"path": "tests/cassettes/test_nonduplicate_contexts.yaml",
"chars": 53585,
"preview": "interactions:\n - request:\n body: '{\"input\":[\"I like turtles\"],\"model\":\"text-embedding-3-small\",\"dimensions\":1536,\""
},
{
"path": "tests/cassettes/test_odd_client_requests.yaml",
"chars": 22646,
"preview": "interactions:\n - request:\n body: \"\"\n headers:\n accept:\n - \"*/*\"\n accept-encoding:\n "
},
{
"path": "tests/cassettes/test_partitioning_fn_docs[False].yaml",
"chars": 128825,
"preview": "interactions:\n - request:\n body: '{\"input\":[\"I like turtles\"],\"model\":\"text-embedding-3-small\",\"dimensions\":1536,\""
},
{
"path": "tests/cassettes/test_partitioning_fn_docs[True].yaml",
"chars": 143733,
"preview": "interactions:\n - request:\n body: '{\"input\":[\"I like turtles\"],\"model\":\"text-embedding-3-small\",\"dimensions\":1536,\""
},
{
"path": "tests/cassettes/test_partly_embedded_texts[False].yaml",
"chars": 76770,
"preview": "interactions:\n - request:\n body: '{\"input\":[\"I like turtles.\"],\"model\":\"text-embedding-3-small\",\"dimensions\":1536,"
},
{
"path": "tests/cassettes/test_partly_embedded_texts[True].yaml",
"chars": 76446,
"preview": "interactions:\n - request:\n body: '{\"input\":[\"I like turtles.\"],\"model\":\"text-embedding-3-small\",\"dimensions\":1536,"
},
{
"path": "tests/cassettes/test_pdf_reader_match_doc_details.yaml",
"chars": 600043,
"preview": "interactions:\n - request:\n body:\n '{\"messages\":[{\"role\":\"user\",\"content\":\"Extract the title, authors, and\n "
},
{
"path": "tests/cassettes/test_s2_only_fields_filtering.yaml",
"chars": 3511,
"preview": "interactions:\n - request:\n body: \"\"\n headers:\n accept:\n - \"*/*\"\n accept-encoding:\n "
},
{
"path": "tests/cassettes/test_s2_title_search_empty_data.yaml",
"chars": 931,
"preview": "interactions:\n - request:\n body: \"\"\n headers:\n accept:\n - \"*/*\"\n accept-encoding:\n "
},
{
"path": "tests/cassettes/test_title_search[paper_attributes0].yaml",
"chars": 24148,
"preview": "interactions:\n - request:\n body: \"\"\n headers:\n accept:\n - \"*/*\"\n accept-encoding:\n "
},
{
"path": "tests/cassettes/test_title_search[paper_attributes1].yaml",
"chars": 20711,
"preview": "interactions:\n - request:\n body: \"\"\n headers:\n accept:\n - \"*/*\"\n accept-encoding:\n "
},
{
"path": "tests/cassettes/test_title_search[paper_attributes2].yaml",
"chars": 97097,
"preview": "interactions:\n - request:\n body: \"\"\n headers:\n accept:\n - \"*/*\"\n accept-encoding:\n "
},
{
"path": "tests/cassettes/test_tricky_journal_quality_results[10.1016-j.bbcan.2023.188947-1].yaml",
"chars": 10599,
"preview": "interactions:\n - request:\n body: \"\"\n headers:\n accept:\n - \"*/*\"\n accept-encoding:\n "
},
{
"path": "tests/cassettes/test_tricky_journal_quality_results[10.1016-j.semcdb.2016.08.024-1].yaml",
"chars": 15155,
"preview": "interactions:\n - request:\n body: \"\"\n headers:\n accept:\n - \"*/*\"\n accept-encoding:\n "
},
{
"path": "tests/cassettes/test_tricky_journal_quality_results[10.1038-s41598-018-27044-6-1].yaml",
"chars": 16947,
"preview": "interactions:\n - request:\n body: \"\"\n headers:\n accept:\n - \"*/*\"\n accept-encoding:\n "
},
{
"path": "tests/cassettes/test_tricky_journal_quality_results[10.1073-pnas.1205508109-3].yaml",
"chars": 7092,
"preview": "interactions:\n - request:\n body: \"\"\n headers:\n accept:\n - \"*/*\"\n accept-encoding:\n "
},
{
"path": "tests/cassettes/test_tricky_journal_quality_results[10.1146-annurev.pathol.4.110807.092311-2].yaml",
"chars": 7912,
"preview": "interactions:\n - request:\n body: \"\"\n headers:\n accept:\n - \"*/*\"\n accept-encoding:\n "
},
{
"path": "tests/cassettes/test_tricky_journal_quality_results[10.1186-1471-2148-11-4-2].yaml",
"chars": 13720,
"preview": "interactions:\n - request:\n body: \"\"\n headers:\n accept:\n - \"*/*\"\n accept-encoding:\n "
},
{
"path": "tests/conftest.py",
"chars": 9083,
"preview": "from __future__ import annotations\n\nimport asyncio\nimport contextlib\nimport os\nimport shutil\nfrom collections.abc import"
},
{
"path": "tests/duplicate_media_template.md",
"chars": 3416,
"preview": "# SF Districts in the style of Andy Warhol\n\n<!-- pyml disable-num-lines 5 line-length -->\n\n[//]: # \"To generate `stub_da"
},
{
"path": "tests/stub_data/bates.txt",
"chars": 93925,
"preview": "<!DOCTYPE html>\n<html class=\"client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-"
},
{
"path": "tests/stub_data/empty.txt",
"chars": 0,
"preview": ""
},
{
"path": "tests/stub_data/flag_day.html",
"chars": 143242,
"preview": "<!doctype html>\n<html\n class=\"client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-pag"
},
{
"path": "tests/stub_data/gravity_hill.md",
"chars": 2296,
"preview": "# Gravity hill\n\n> \"Magnetic hill\" and \"Mystery hill\" redirect here. For other uses,\n> see [Magnetic Hill (disambiguation"
},
{
"path": "tests/stub_data/obama.txt",
"chars": 1650924,
"preview": "<!DOCTYPE html>\n<html class=\"client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-"
},
{
"path": "tests/stub_data/py.typed",
"chars": 0,
"preview": ""
},
{
"path": "tests/stub_data/stub_manifest.csv",
"chars": 244,
"preview": "file_location,doi,title\n\"paper.pdf\",\"10.1021/acs.jctc.2c01235\",\"A Perspective on Explanations of Molecular Prediction Mo"
},
{
"path": "tests/stub_data/stub_manifest_nocitation.csv",
"chars": 152,
"preview": "file_location,doi,title,citation,fields_to_overwrite_from_metadata\n\"bates.txt\",,\"Frederick Bates (Wikipedia article)\",\"\""
},
{
"path": "tests/stub_data/stub_retractions.csv",
"chars": 24800,
"preview": "Record ID,Title,Subject,Institution,Journal,Publisher,Country,Author,URLS,ArticleType,RetractionDate,RetractionDOI,Retra"
},
{
"path": "tests/test_agents.py",
"chars": 49367,
"preview": "from __future__ import annotations\n\nimport importlib\nimport itertools\nimport json\nimport logging\nimport re\nimport shutil"
},
{
"path": "tests/test_cli.py",
"chars": 4430,
"preview": "import os\nimport sys\nimport zlib\nfrom pathlib import Path\nfrom unittest.mock import patch\n\nimport pytest\nfrom tenacity i"
},
{
"path": "tests/test_clients.py",
"chars": 35872,
"preview": "from __future__ import annotations\n\nimport csv\nimport logging\nimport os\nimport re\nfrom collections.abc import Collection"
},
{
"path": "tests/test_clinical_trials.py",
"chars": 7333,
"preview": "# pylint: disable=redefined-outer-name\nimport json\nfrom unittest.mock import AsyncMock, Mock, patch\n\nimport httpx\nimport"
},
{
"path": "tests/test_configs.py",
"chars": 9275,
"preview": "import importlib.resources\nimport os\nimport pathlib\nimport re\nfrom unittest.mock import patch\n\nimport pytest\nfrom pydant"
},
{
"path": "tests/test_paperqa.py",
"chars": 157575,
"preview": "import asyncio\nimport contextlib\nimport csv\nimport io\nimport json\nimport pathlib\nimport pickle\nimport random\nimport re\ni"
},
{
"path": "tests/test_utils.py",
"chars": 1060,
"preview": "from paperqa.utils import citation_to_docname\n\n\ndef test_citation_to_docname_acronym_title() -> None:\n citation = \"CD"
}
]
// ... and 5 more files (download for full content)
About this extraction
This page contains the full source code of the Future-House/paper-qa GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 177 files (15.8 MB), approximately 4.2M tokens, and a symbol index with 745 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.