🎓 全栈学术研究助手 - 搜索论文 → 提取可直接使用的BibTeX(头部) → 完整TEI XML文档结构解析(通过GROBID)...
Your AI-powered academic research assistant for paper search → BibTeX extraction → Zotero archiving → local PDF serving.
Save hours of manual work searching papers, copying citations, and organizing your library.
Trigger this skill when the user wants to:
TaskDescription🔍 Search papersFind papers across multiple academic search engines (arXiv, Google Scholar, Semantic Scholar, Tavily)📝 **Extract BibTeX (header analysis)**Parse PDF header and output publication-ready BibTeX matching AI conference/journal standards📄 Full text analysisExtract full document structure in TEI XML format for further processing🗄️ Archive to ZoteroAutomatically save papers to your Zotero library, default to openclaw collection, auto-create collections📂 Local PDF libraryMaintain a local PDF collection and serve it via HTTP for direct access from Zotero
This is a toolbox skill that provides multiple independent academic research tools. You can use just the features you need. A common complete workflow looks like this:
text
User Query
↓
[academic-talon] ← this skill
↓
1. Search → Multiple search APIs (arXiv, Google Scholar via SerpAPI, etc.)
↓
2. PDF Download → saved to local `pdfs/` directory
↓
3. PDF Parsing → **GROBID service** processes PDF
↓
- Header analysis → extracts metadata → skill generates clean BibTeX
- Full text analysis → returns complete TEI XML with full document structure
↓
4. If header analysis: BibTeX Generation → skill formats clean publication-ready output
↓
5. Zotero Archiving → via **pyzotero** → your Zotero library → auto-add to collection
↓
6. PDF Serving → built-in HTTP server serves PDFs from your intranet
↓
Result: Paper in Zotero with working PDF link, clean BibTeX ready for citation
You don't have to use this full workflow - use individual tools as needed.
ServicePurposeWhy do you need it?Required?GROBIDPDF metadata extractionParses PDF headers to extract title, authors, publication info for BibTeX✅ Required****Zotero APIPaper archivingStores papers in your Zotero library with correct metadata✅ Required for archiving****SerpAPI KeyGoogle Scholar searchenables searching Google Scholar⚙️ Optional (enables more results)Semantic Scholar API KeySemantic Scholar searchenables Semantic Scholar results⚙️ OptionalTavily API KeyTavily searchenables Tavily results⚙️ Optional
bash
pip install -r skills/academic-talon/requirements.txt
skills/academic-talon/.env)#env
# ========== Zotero Configuration (Required for archiving) ==========
ZOTERO_API_KEY=your_zotero_api_key_here
ZOTERO_LIBRARY_ID=your_library_id_here
ZOTERO_LIBRARY_TYPE=user # or "group" for group libraries
# ========== GROBID Configuration (Required for PDF parsing) ==========
GROBID_API_URL=http://localhost:8070/api
# Or if you use Docker Compose behind nginx:
# GROBID_API_URL=http://localhost:8080/api
# ========== Optional Search API Keys ==========
# Get these from their respective websites
SEMANTIC_SCHOLAR_API_KEY=your_semantic_scholar_api_key
SERPAPI_KEY=your_serpapi_key_for_google_scholar
TAVILY_API_KEY=your_tavily_api_key
# ========== Local PDF Serving (Optional) ==========
# After starting the PDF server, set this to your intranet URL:
# Example: PDF_BASE_URL=http://192.168.1.100:8000/
PDF_BASE_URL=http://your-server-ip:port/
Environment VariableWhat it doesZOTERO_API_KEYYour Zotero API key from Zotero settingsZOTERO_LIBRARY_IDYour Zotero library ID (found in Zotero API URL)ZOTERO_LIBRARY_TYPE``"user" for your personal library, "group" for group librariesGROBID_API_URLURL of your GROBID service endpointPDF_BASE_URLBase URL for your locally running PDF server (e.g. http://10.26.20.168:18001/)
Option A: Docker Compose (Recommended)
Create compose.yml in your GROBID directory:
yaml
version: "3.9"
services:
grobid:
# Choose the right image for your hardware:
# - For non-GPU environments: grobid/grobid:0.8.2-crf (CRF-only model, smaller)
# - For GPU environments: grobid/grobid:0.8.2-full (includes CRF + deep learning models)
image: grobid/grobid:0.8.2-crf
container_name: grobid
restart: unless-stopped
expose:
- "8070"
environment:
JAVA_OPTS: "-Xms512m -Xmx4g"
volumes:
- ./grobid/tmp:/opt/grobid/tmp
- ./grobid/logs:/opt/grobid/logs
💡 Image selection: Use
grobid/grobid:0.8.2-crffor CPU-only / non-GPU environments (smaller image, faster startup). Usegrobid/grobid:0.8.2-fullif you have GPU and want maximum accuracy with deep learning models.
Start:
bash
docker-compose up -d
Option B: Direct run
Follow GROBID documentation to run directly.
If you want to serve downloaded PDFs locally:
bash
# Start on port 8000, allow all intranet access
python skills/academic-talon/scripts/start_pdf_server.py start 8000 内网
# Check status
python skills/academic-talon/scripts/start_pdf_server.py status
# Stop
python skills/academic-talon/scripts/start_pdf_server.py stop
The server:
pdfs/ directory (sandboxed, no access outside)zhang2025hallucinationdetection.pdf)PDF_BASE_URL is configured, archived papers automatically get the correct local URLParameterTypeDescriptionRequiredDefaultactionstringAction to perform: search, download, analyze, archiveYessearch``querystringSearch keywordsYes (search)-limitintegerMax results to returnNo10``sourcestringSearch source: all, arxiv, google_scholar, semantic_scholar, tavilyNoall``engine_weightsobjectHow many results from each engineNo{"arxiv": 5, "google_scholar": 3, "semantic_scholar": 1, "tavily": 1}``urlstringPDF URL to downloadYes (download)-filenamestringCustom filename for downloaded PDFNoauto from citation keypaper_infoobjectPaper metadata (title, authors, year) for citation key generationNo-pdf_inputstringPath to local PDF or URL to remote PDFYes (analyze)-analysis_typestringheader → outputs publication-ready BibTeX; fulltext → outputs TEI XML of full documentNoheader``collectionstringZotero collection name to add paper toNoopenclaw
All actions return JSON in this format:
json
{
"success": true,
"action": "search",
"query": "your search query",
"results": [
{
"title": "Paper Title",
"authors": ["Author One", "Author Two"],
"year": "2025",
"abstract": "Paper abstract...",
"url": "https://...",
"pdf_url": "https://...",
"source": "arxiv"
}
]
}
Follows exactly the format used by top AI conferences (NeurIPS, ICML, ICLR, CVPR, etc.)
Correct entry types:
@article@inproceedings with conference name in booktitle@article with journal = {arXiv preprint xxxx.xxxxx} exactly matching your exampleCleans up junk: removes unnecessary fields like date, month, publisher, day that shouldn't be in final submissions
Correct citation keys: lastnameYearTitle → zhang2025hallucinationdetection matches standard academic practice
Example output (ready to paste into your manuscript):
bib
@article{zhang2025hallucinationdetection,
author = {Zhang, Chenggong and Wang, Haopeng},
title = {Hallucination Detection and Evaluation of Large Language Model},
year = {2025},
journal = {arXiv preprint 2512.22416},
abstract = {Hallucinations in Large Language Models...},
}
bib
@inproceedings{gal2016dropout,
author = {Gal, Yarin and Ghahramani, Zoubin},
title = {Dropout as a bayesian approximation: Representing model uncertainty in deep learning},
booktitle = {ICML},
year = {2016},
}
openclaw unless you specify otherwisepreprint, conference → conferencePaper, journal → journalArticleBenefit: Build your research library without repetitive manual clicking.
GROBID_API_URL for metadata extractionpdfs/ directorypdfs/ directory within this skill's installation.env file.env to version controlpython
# 1. Search for papers
result = skill.run({
"action": "search",
"query": "LLM judge knowledge possession",
"limit": 5
})
# 2. Download PDF for first result
paper = result["results"][0]
download_result = skill.run({
"action": "download",
"url": paper["pdf_url"],
"paper_info": paper
})
# 3. Extract BibTeX from downloaded PDF
analyze_result = skill.run({
"action": "analyze",
"pdf_input": download_result["pdf_path"],
"analysis_type": "header"
})
# 4. Archive to Zotero (goes to openclaw collection by default)
paper["bibtex"] = analyze_result["result"]
archive_result = skill.run({
"action": "archive",
"paper_info": paper
})
if archive_result["success"]:
print(f"✅ Paper archived to Zotero: {archive_result['result']['item_id']}")
ProblemSolutionGROBID server not accessibleCheck GROBID is running, verify GROBID_API_URL in .env``Zotero API errorCheck ZOTERO_API_KEY and ZOTERO_LIBRARY_ID are correctarXiv search returns nothingCheck network connectivity, arXiv API sometimes blocks unusual IPsPDF analysis returns emptyCheck PDF isn't corrupted, verify GROBID is workingLocal PDF link doesn't workCheck PDF server is running, verify PDF_BASE_URL matches server addressDuplicate papers in ZoteroSkill detects duplicates by title/DOI and adds to collection, safe to ignore
requests, python-dotenv, pyzoteroMIT License - free for academic and commercial use.