researchbee / README-DEPLOY.md
nikeshn's picture
Upload 8 files
7c6808b verified
|
Raw
History Blame Contribute Delete
5.57 kB

ResearchBee v1.4 β€” verified-sources release

What changed, in one line

Policy facts now come from databases, not from the language model. Where no source could be reached, the system says so instead of filling the gap.


1. HuggingFace Space β€” researchbee-hf/

File Status
app.py modified β€” DOI-first /api/check-license, registry-backed /api/find-repository, fixed publisher matcher, Khazna startup + 23:30 refresh, new /api/health
prompts.py modified β€” "ResearchPilot" β†’ "ResearchBee" everywhere; LICENSE_SYSTEM_PROMPT can no longer state policy facts; new ADVISORY_NOTE_PROMPT; REPO_SYSTEM_PROMPT constrained to registry selection
oaworks.py new β€” OA.Works Permissions client, schema-confirmed against T&F / Elsevier / Springer
doi_utils.py new β€” DOI extraction from URLs and text; ISSN mod-11 validation
repositories.py new β€” 25-entry curated repository registry
khazna_loader.py new β€” loads the harvested Khazna index from an HF Dataset
requirements.txt modified β€” added huggingface_hub, apscheduler

Upload all seven. ku_knowledge.py, openalex.py, scimago_index.py, utils.py, Dockerfile, and the SCImago CSV are unchanged β€” leave them.

Before you deploy

  1. Set KU_ROR in oaworks.py. Find it at https://ror.org (search "Khalifa University"). This matters more than it looks: Elsevier publishes a 12-month embargo for UK institutions and 24 months for everyone else, and the ROR lets OA.Works pick the right one.
  2. Optionally set KHAZNA_DATASET and HF_TOKEN in Space secrets.
  3. Check GET /api/health after deploy β€” it reports every source's status.

Khazna lookups return checked: false until the harvest has run. That is correct behaviour, not a failure.


2. GitHub Pages β€” researchbee-github/

File Status
index.html modified β€” DOI/URL field added as the primary input
js/license.js modified β€” sends the DOI, renders provenance, Khazna status, deposit statement
js/render_license.js new β€” the new render helpers
css/style.css modified β€” styles appended at the end
khazna_oai.py new β€” the OAI-PMH harvester (runs in Actions, not in the Space)
.github/workflows/harvest-khazna.yml new β€” nightly 23:00 Dubai harvest
test_publishers.py new β€” validation harness

Other JS files are untouched.


3. Khazna harvest β€” first run

# See the deposit gap before automating anything
python khazna_oai.py gap

# Verify the parser against real records
python khazna_oai.py inspect --set publications:withFiles --format mods -n 2 --raw
python khazna_oai.py inspect --set openaire --format oai_dc -n 2 --raw

Then:

  1. Create an HF Dataset repo (default: nikeshn/researchbee-data)
  2. Add HF_TOKEN as a GitHub repository secret
  3. Actions β†’ "Harvest Khazna" β†’ Run workflow (first full run)
  4. Nightly thereafter: Sunday full, Mon–Sat incremental

Sunday is full because Khazna's OAI reports deletedRecord: no β€” incrementals can never learn that a record was withdrawn.


4. How to tell it is working

With a DOI β€” green "Verified Β· OA.Works Permissions" badge, per-version rights, the publisher's required deposit statement with a copy button, a source panel with evidence links, and Khazna status.

Without a DOI β€” amber "Unverified Β· journal-level estimate", all version blocks "Unclear", a prompt to enter a DOI. The backend forcibly downgrades any policy_status: "Confirmed" the model returns, so this cannot be bypassed.

Khazna unavailable β€” "Khazna status not checked", explicitly distinguished from "Not yet in Khazna".

Test DOIs from this build:

10.1080/19322909.2023.2221477   T&F      β€” no embargo stated
10.1016/j.jclepro.2023.136775   Elsevier β€” 24 months (not 12; see below)
10.1007/s11192-023-04812-4      Springer β€” preprint immediate, AAM 12 months

5. Things worth knowing

The Elsevier embargo trap. OA.Works returns two permissions with identical score: 1100 β€” 12 months (UK) and 24 months (everyone else). Ranking by score alone silently picks 12. _permission_rank() in oaworks.py breaks the tie by the longer embargo. Do not "optimise" that away.

Absent is not zero. T&F records carry no embargo field. The system reports "Not stated in the permission record" rather than "no embargo", because T&F's published policy is normally 12 months and a wrong permissive answer costs the library a takedown notice.

Publisher matcher. Now covers imprints whose SCImago string never says the parent publisher β€” W.B. Saunders, Academic Press, Cell Press, BioMed Central, Palgrave, Blackwell, Informa, Dove Medical. Q1 APC badge coverage went from 45.8% to 51.1% (+497 journals). AMBIGUOUS_ALIASES prevents "Maximum Academic Press" from being mistaken for Elsevier.

Repository registry. The model selects entries by id and writes the fit_reason; every factual field is overwritten from repositories.py. Unknown ids are dropped. Entries you have not personally verified are left blank rather than guessed β€” please fill them in and bump verified.


6. Still open

  • KU_ROR is empty
  • Repository registry has blank fields awaiting your verification
  • Wiley, IEEE and ACS not yet validated against OA.Works (test_publishers.py)
  • Worth telling OA.Works about the UK/non-UK tie: help@openaccessbutton.org