skills/pdf-citation-verifier/SKILL.md
[Activation] Use this skill when the user provides a paper PDF (file path or upload) and asks to verify, audit, or fact-check its references / citations / bibliography — e.g. "check whether the references in this PDF are hallucinated", "find fake citations", "verify the bibliography". [Capability] Uploads the PDF to the AMiner pdf-citation-verifier service, polls the asynchronous job, and returns a per-reference classification (REAL / LIKELY_REAL / NEEDS_REVIEW / LIKELY_FAKE / FAKE) plus an overall hallucination summary. [Routing] Do NOT use for general paper search, scholar lookup, citation-intent analysis, or building a citation graph — use aminer-academic-search, aminer-free-academic, or paper-source-trace instead. This skill only verifies whether references actually exist.
npx skillsauth add canxiangcc/aminer-open-skill aminer-pdf-citation-verifierInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Verify whether the references in a paper PDF actually exist by submitting the PDF to the AMiner pdf-citation-verifier service, polling the asynchronous job, and returning a structured summary. Invoke via natural language or /pdf-citation-verifier.
For each reference parsed from the uploaded PDF, the upstream service queries AMiner SearchPro and labels the citation with one of:
REAL — high-confidence match in AMiner.LIKELY_REAL — partial match, likely genuine.NEEDS_REVIEW — evidence is inconclusive; ask a human.LIKELY_FAKE — partial mismatch, probably fabricated.FAKE — no plausible match found.Each call to the gateway returns the standard envelope {"code": 200, "success": true, "msg": "", "data": ..., "log_id": "..."}. The script unwraps it before printing.
POST /api/v3/paper/citation/verify/upload returns data: {"job_id": "verify_..."}.GET /api/v3/paper/citation/result?job_id=... returns data: [<record>] where the single record has top-level fields like is_finish, has_hallucination, hallucination_ratio, total, counts_by_status, summary, urls, report, result.The skill returns that record plus the job_id so the user can re-poll later.
SKILL.md / SKILL.zh.md — English / Chinese skill definitions (this file).commands/pdf-citation-verifier.md — slash command entry.scripts/verify_pdf.py — HTTP client: upload → poll → print the unwrapped result record.requirements.txt — Python dependencies (requests).Run these checks before invoking the script. Stop and surface the error to the user if any check fails.
1. AMINER_API_KEY
[ -z "${AMINER_API_KEY+x}" ] && echo "AMINER_API_KEY missing" || echo "AMINER_API_KEY exists"
If missing, stop and tell the user to obtain a token from https://open.aminer.cn and export AMINER_API_KEY=<token>. Never print the token value.
2. Python dependency
python3 - <<'PY'
import importlib.util
missing = [name for name in ("requests",) if importlib.util.find_spec(name) is None]
print("Missing: " + ", ".join(missing) if missing else "Python dependencies exist")
PY
If missing, instruct: pip install -r "${CLAUDE_PLUGIN_ROOT}/requirements.txt".
3. PDF input
The user must supply an existing local .pdf file path. If they only describe a paper without a file, ask them to provide the PDF path. Do not invent or download a PDF.
Basic verification with defaults (max 50 references, auto-polls until done):
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/verify_pdf.py" \
--pdf "/abs/path/to/paper.pdf"
Full options:
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/verify_pdf.py" \
--pdf "/abs/path/to/paper.pdf" \
--max-refs 80 \
--strict \
--timeout 900 \
--poll-interval 5 \
--output outputs/pdf-citation-verifier/<safe-paper-stem>/result.json
Submit-only (no polling, return job_id for later lookup):
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/verify_pdf.py" \
--pdf "/abs/path/to/paper.pdf" --no-wait
Fetch the result for an existing job_id (no new upload):
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/verify_pdf.py" \
--job-id verify_20260527T090207Z_a72c9ba5
| Flag | Default | Notes |
| --- | --- | --- |
| --pdf | required (unless --job-id) | Local .pdf file path. Server caps body at 50 MB. |
| --job-id | – | Skip upload and just fetch the result for an existing job. |
| --max-refs | 50 | Server hard cap is 100. |
| --strict | off | Stricter FAKE judgement on partial matches. |
| --no-wait | off | With --pdf: submit and return job_id without polling. With --job-id: single fetch, return immediately without looping. |
| --timeout | 600 | Overall polling timeout in seconds. |
| --poll-interval | 5 | Seconds between result polls. |
| --request-timeout | 120 | Per-HTTP-request timeout. |
| --output | - | Optional path to also write the JSON response. |
| Var | Required | Purpose |
| --- | --- | --- |
| AMINER_API_KEY | yes | JWT used in the Authorization header. |
| PDF_CITATION_VERIFIER_BASE_URL | no | Override the gateway base URL. Defaults to https://datacenter.aminer.cn/gateway/open_platform. |
AMINER_API_KEY.urls, report, result, pdf in the response point to server-side artifacts and may be pre-signed for url_expire_seconds. Do not claim those local paths exist on the user's machine. Use --output if the user needs a local copy of the JSON.LIKELY_FAKE / FAKE verdict as a flag for human review, not a final accusation. Surface counts_by_status and per-record reasons when the response includes them.After the script returns, summarize the result for the user with at minimum:
job_idtotal (number of references verified)has_hallucination, hallucination_ratiocounts_by_status (REAL / LIKELY_REAL / NEEDS_REVIEW / LIKELY_FAKE / FAKE / etc.)urls.report / urls.result links from the response, with a note that they may expire after url_expire_seconds--output) or echoed back to the user, never silently dropped.If is_finish is true and a status / msg field signals failure, report it and suggest re-running.
development
Use when a user provides an academic paper PDF, extracted paper text, citation contexts, or references and asks for paper source tracing, claim-centered source tracing, citation intent extraction, entity/relation extraction, contribution mapping, citation graph JSON, SVG/HTML citation maps, or optional AMiner metadata/citation enrichment. Do NOT use this skill for simple paper lookup by title, scholar search, or lightweight academic queries — use aminer-free-academic or aminer-academic-search for those instead.
tools
Activate this skill when the user wants deep, multi-round academic paper collection for a survey or literature review using AMiner data and a ReAct-style LLM controller. Use this skill for broad topic exploration, survey bibliography construction, automatic keyword search plus backward-reference snowballing, and collecting hundreds of candidate papers with AMiner IDs and titles. This skill calls an OpenAI-compatible chat model to decide tool calls, and uses AMiner keyword search plus paper reference APIs as tools. It is not intended for simple single-paper lookup or lightweight recommendations; use aminer-free-academic or aminer-daily-paper for those simpler tasks.
development
Personalized academic paper recommendation via AMiner rec5 API. Activate this skill whenever the user asks for paper recommendations, whether triggered by /aminer-dp, /skill aminer-dp, or any natural language request such as 'recommend me papers on multimodal agents'. When invoked: extract topics/scholar signals from the input yourself, call handle_trigger.py with structured fields, then present the Markdown in `reply_text` to the user.
development
ACADEMIC PRIORITY: Activate this skill whenever the user's query involves academic, scholarly, or research-related topics — including but not limited to: papers, publications, citations, scholars, researchers, professors, institutions, universities, labs, journals, conferences, venues, patents, research fields, h-index, impact factor, co-authorship, dissertations, theses, peer review, grant projects, research trends, or any question about "who published what / where / when". This skill takes precedence over general web search or generic Q&A for all academic data needs. Full-featured AMiner skill with 27 APIs and 5 workflows. Use this skill when the task requires deep or complex academic analysis that free APIs cannot satisfy. Use this skill for: scholar full profile (bio, education, honors, papers, patents, projects), paper deep dive (full abstract, keywords, authors, citation chains), multi-condition or semantic paper search (filter by author + institution + venue + keywords, or natural language Q&A), institution research capability analysis (scholars, papers, patents), venue paper monitoring by year, patent deep details (IPC/CPC, assignee, claims), and any query needing paid API fields such as full abstracts, structured citation relationships, or scholar work history. Do NOT use this skill for simple lookups that free APIs can answer — such as checking a paper title, identifying a scholar by name, normalizing an institution or venue name, or scanning patent trends by keyword. For those, use aminer-free-academic instead. Routing rule: if the user's question can be fully answered by paper_search, paper_info, person_search, organization_search, venue_search, patent_search, or patent_info alone, route to aminer-free-academic. Otherwise use this skill.