Skip to content

feat(sources): Semantic Scholar como segundo motor (ADR 0042)#250

Open
complexluise wants to merge 2 commits into
devfrom
feat/semantic-scholar-source
Open

feat(sources): Semantic Scholar como segundo motor (ADR 0042)#250
complexluise wants to merge 2 commits into
devfrom
feat/semantic-scholar-source

Conversation

@complexluise

Copy link
Copy Markdown
Owner

Qué

Implementa SemanticScholarSource (src/bib2graph/sources/semanticscholar.py), el adaptador de Semantic Scholar (Academic Graph API) como segundo motor además de OpenAlex, cumpliendo el Protocol Source. Registra la decisión en ADR 0042 (Propuesta).

Primer paso del soporte multi-proveedor (ver docs/Notas/25-multiproveedor-requerimientos.md): no depender solo de OpenAlex.

Alcance (un PR = una idea)

  • SemanticScholarSource: seed (query nativa, sin traducción WoS), fetch_works_by_ids (POST /paper/batch, lotes ≤500), fetch_citing_batch/_with_works (citantes directos vía /paper/{id}/citations, duck-typed para el Forager), _paper_to_row con identidad DOI-first (ADR 0036).
  • ✅ ADR 0042 + índice.
  • Fuera de alcance (PRs futuros): selector CLI --source y wiring al Forager (hoy forager.py:494 importa openalex._work_to_row hardcodeado — anotado en el docstring del módulo); escritura de external_ids; traducción rica WoS→S2.

Decisiones (del ADR 0042)

  • D2 — asimetría de credenciales por rol: /paper/search da 429 sostenido sin API key, pero el grafo de citas responde sin key. seed sin key levanta un NetworkError accionable que nombra la key gratuita de S2 (no error pelado, no loop).
  • D3 — query nativa sin traducción: se pasa la ecuación tal cual; translation_report lo declara honestamente.

Divergencias S2 vs OpenAlex

Auth por header x-api-key (no Bearer) · citantes directos sin el truco cites:+cruce de refs · paperId como source_id · consulta por DOI con prefijo DOI: · límites propios (≤500).

Tests / gate

35 tests con MockTransport (sin red en CI; 1 @network opcional). Gate verde: ruff ✓, ruff format ✓, mypy src ✓, pytest 1249 passed, 6 deselected. Revisado por el verifier (aprobado; reservas de higiene de rama ya resueltas): los tests de D2 y dedup cross-motor sellan lo que aseveran.

🤖 Generated with Claude Code

complexluise and others added 2 commits June 30, 2026 18:18
…ocol)

Adaptador de Semantic Scholar (Academic Graph API) que cumple el Protocol
Source (ADR 0042): seed con query nativa (sin traducción WoS),
fetch_works_by_ids (POST /paper/batch, lotes <=500), fetch_citing_batch y
_with_works (citantes directos via /paper/{id}/citations, duck-typed para el
Forager) y _paper_to_row con identidad DOI-first (ADR 0036, reusa
_normalize_doi para no introducir drift).

Divergencias S2 vs OpenAlex: auth por header x-api-key (no Bearer), citantes
directos sin el truco cites:+cruce de refs, paperId como source_id, limites
propios. seed sin API key ante 429 levanta NetworkError accionable que nombra
la key gratuita de S2 (sella D2). load() declara NotImplementedError.

35 tests con MockTransport (sin red en CI; 1 @network opcional).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Registra las dos decisiones que ADR 0036 difirio para el 2o motor: D2
asimetria de credenciales por rol (search exige API key, el grafo de citas
no) y D3 query nativa sin traduccion. Indexa el ADR en el README de decisiones.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@complexluise

Copy link
Copy Markdown
Owner Author

Aún no se va a brindar multiples proveedores, en v0.12.0 queremos terminar de hacer CLI agent native.

@complexluise

Copy link
Copy Markdown
Owner Author

Estado: diferida a v0.13.0 (no entra en 0.11.0 ni 0.12.0).

Contexto:

Refs #233, ADR 0042, nota 29.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant