Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Access French and European research via the HAL open archive API
.claude/skills/brycewang-stanford-hal-archive-api/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 54% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 376% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 49% | 0% |
| case-03 | ✓→✓ | = Same ✓ | 54% | 0% |
| case-04 | ✓→✓ | = Same ✓ | 73% | 0% |
HAL (Hyper Articles en Ligne) is France's national open archive for scholarly deposits. Managed by CNRS, it hosts 4M+ full-text documents from French research institutions and international collaborators. The API provides Solr-based search with full metadata, PDF links, and OAI-PMH harvesting. Free, no authentication required.
bash# Keyword search curl "https://api.archives-ouvertes.fr/search/?q=machine+learning&rows=20&wt=json" # Search specific fields curl "https://api.archives-ouvertes.fr/search/?q=title_s:\"deep learning\"&wt=json" # Filter by document type curl "https://api.archives-ouvertes.fr/search/?q=neural+networks&\ fq=docType_s:ART&rows=20&wt=json" # Filter by year and language curl "https://api.archives-ouvertes.fr/search/?q=climate+change&\ fq=producedDateY_i:[2023 TO 2026]&fq=language_s:en&wt=json" # Filter by institution curl "https://api.archives-ouvertes.fr/search/?q=robotics&\ fq=structId_i:441569&wt=json" # Return specific fields curl "https://api.archives-ouvertes.fr/search/?q=CRISPR&\ fl=halId_s,title_s,authFullName_s,producedDateY_i,uri_s,files_s&wt=json"
| Field | Description | Example | |-------|-------------|---------| | title_s | Title | title_s:"attention mechanism" | | authFullName_s | Author name | authFullName_s:"Yann LeCun" | | abstract_s | Abstract | abstract_s:transformer | | keyword_s | Keywords | keyword_s:"natural language" | | producedDateY_i | Year | producedDateY_i:2024 | | docType_s | Document type | docType_s:ART | | language_s | Language | language_s:en | | domain_s | Domain/subject | domain_s:info.info-ai | | journalTitle_s | Journal name | journalTitle_s:"Nature" | | structId_i | Institution ID | Lab/university ID |
| Code | Type | |------|------| | ART | Journal article | | COMM | Conference paper | | THESE | PhD thesis | | HDR | Habilitation thesis | | REPORT | Report | | COUV | Book chapter | | OUV | Book | | POSTER | Poster | | UNDEFINED | Preprint/other |
| Parameter | Description | |-----------|-------------| | q | Solr query | | fq | Filter query | | fl | Fields to return | | rows | Results per page (max 10000) | | start | Pagination offset | | sort | Sort order (e.g., producedDateY_i desc) | | wt | Format: json, xml, csv |
json{ "response": { "numFound": 12500, "start": 0, "docs": [ { "halId_s": "hal-01234567", "title_s": ["Deep Learning for Climate Modeling"], "authFullName_s": ["Marie Dupont", "Jean Martin"], "producedDateY_i": 2024, "docType_s": "ART", "journalTitle_s": "Environmental Modelling", "uri_s": "https://hal.science/hal-01234567", "files_s": ["https://hal.science/hal-01234567/document"], "domain_s": ["sde.es", "info.info-ai"], "abstract_s": ["We propose a novel deep learning approach..."], "language_s": ["en"] } ] } }
pythonimport requests BASE_URL = "https://api.archives-ouvertes.fr/search/" def search_hal(query: str, rows: int = 20, doc_type: str = None, from_year: int = None, language: str = None) -> list: """Search HAL open archive.""" params = { "q": query, "wt": "json", "rows": rows, "fl": "halId_s,title_s,authFullName_s,producedDateY_i," "uri_s,files_s,docType_s,journalTitle_s,abstract_s", "sort": "producedDateY_i desc", } fq = [] if doc_type: fq.append(f"docType_s:{doc_type}") if from_year: fq.append(f"producedDateY_i:[{from_year} TO 2030]") if language: fq.append(f"language_s:{language}") if fq: params["fq"] = fq resp = requests.get(BASE_URL, params=params) resp.raise_for_status() data = resp.json() results = [] for doc in data.get("response", {}).get("docs", []): title = doc.get("title_s", [""])[0] if isinstance( doc.get("title_s"), list) else doc.get("title_s", "") results.append({ "hal_id": doc.get("halId_s"), "title": title, "authors": doc.get("authFullName_s", []), "year": doc.get("producedDateY_i"), "type": doc.get("docType_s"), "journal": doc.get("journalTitle_s"), "url": doc.get("uri_s"), "pdf": doc.get("files_s", [None])[0], }) return results def search_theses(topic: str, from_year: int = 2020) -> list: """Find French PhD theses on a topic.""" return search_hal(topic, rows=50, doc_type="THESE", from_year=from_year) def get_institution_publications(struct_id: int, from_year: int = 2023) -> list: """Get publications from a specific institution.""" params = { "q": "*:*", "fq": [f"structId_i:{struct_id}", f"producedDateY_i:[{from_year} TO 2030]"], "wt": "json", "rows": 100, "fl": "halId_s,title_s,authFullName_s,producedDateY_i,docType_s", "sort": "producedDateY_i desc", } resp = requests.get(BASE_URL, params=params) resp.raise_for_status() return resp.json().get("response", {}).get("docs", []) # Example: find recent French AI research papers = search_hal("intelligence artificielle", from_year=2024) for p in papers: pdf = " [PDF]" if p["pdf"] else "" print(f"[{p['year']}] {p['title']}{pdf}") # Example: find PhD theses on NLP theses = search_theses("natural language processing") for t in theses: print(f"{t['title']} — {', '.join(t['authors'][:2])}")
| Code | Domain | |------|--------| | info | Computer Science | | math | Mathematics | | phys | Physics | | sde | Environmental Sciences | | sdv | Life Sciences | | shs | Social Sciences & Humanities | | chim | Chemistry | | spi | Engineering Sciences |
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 13,177 | 11,248 | -15% | 1 | 1 | 0% | 2,704 | 4,166 | +54% | 0 | 0 | — |
case-02 | fail→pass | 13,926 | 16,980 | +22% | 1 | 1 | 0% | 1,081 | 5,146 | +376% | 0 | 0 | — |
case-03 | pass→pass | 11,653 | 5,252 | -55% | 1 | 1 | 0% | 2,032 | 3,122 | +54% | 0 | 0 | — |
case-04 | pass→pass | 9,485 | 3,616 | -62% | 1 | 1 | 0% | 1,602 | 2,775 | +73% | 0 | 0 | — |
case-05 | fail→pass | 13,308 | 8,090 | -39% | 1 | 1 | 0% | 2,563 | 3,812 | +49% | 0 | 0 | — |
case-06 | pass→pass | 6,761 | 3,177 | -53% | 1 | 1 | 0% | 1,099 | 2,614 | +138% | 0 | 0 | — |
case-07 | pass→pass | 6,903 | 3,877 | -44% | 1 | 1 | 0% | 1,137 | 2,720 | +139% | 0 | 0 | — |
case-08 | pass→pass | 4,942 | 6,739 | +36% | 1 | 1 | 0% | 865 | 3,109 | +259% | 0 | 0 | — |
case-09 | pass→pass | 7,110 | 3,834 | -46% | 1 | 1 | 0% | 1,132 | 2,731 | +141% | 0 | 0 | — |
case-10 | pass→pass | 11,446 | 6,964 | -39% | 1 | 1 | 0% | 1,777 | 3,357 | +89% | 0 | 0 | — |
case-11 | pass→pass | 6,131 | 4,391 | -28% | 1 | 1 | 0% | 1,054 | 2,993 | +184% | 0 | 0 | — |
case-12 | pass→pass | 5,288 | 2,448 | -54% | 1 | 1 | 0% | 934 | 2,501 | +168% | 0 | 0 | — |
case-13 | pass→pass | 9,248 | 3,464 | -63% | 1 | 1 | 0% | 1,716 | 2,727 | +59% | 0 | 0 | — |
case-14 | pass→pass | 8,794 | 2,524 | -71% | 1 | 1 | 0% | 1,386 | 2,543 | +83% | 0 | 0 | — |
case-15 | pass→pass | 6,412 | 3,434 | -46% | 1 | 1 | 0% | 1,030 | 2,634 | +156% | 0 | 0 | — |
case-16 | pass→pass | 15,884 | 3,714 | -77% | 1 | 1 | 0% | 1,193 | 2,731 | +129% | 0 | 0 | — |
case-17 | pass→pass | 8,086 | 3,340 | -59% | 1 | 1 | 0% | 1,459 | 2,720 | +86% | 0 | 0 | — |
case-18 | pass→pass | 5,197 | 3,561 | -31% | 1 | 1 | 0% | 863 | 2,622 | +204% | 0 | 0 | — |
case-19 | pass→pass | 9,705 | 3,308 | -66% | 1 | 1 | 0% | 1,427 | 2,664 | +87% | 0 | 0 | — |
case-20 | pass→pass | 7,239 | 2,819 | -61% | 1 | 1 | 0% | 1,140 | 2,580 | +126% | 0 | 0 | — |
case-21 | pass→pass | 12,466 | 12,862 | +3% | 1 | 1 | 0% | 2,467 | 4,390 | +78% | 0 | 0 | — |
case-22 | pass→pass | 10,870 | 9,721 | -11% | 1 | 1 | 0% | 2,248 | 3,885 | +73% | 0 | 0 | — |
case-23 | pass→pass | 12,611 | 16,238 | +29% | 1 | 1 | 0% | 2,388 | 5,328 | +123% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted, and 22 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +13 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.