# SPDX-License-Identifier: Apache-2.0 # © 2026 Lutar, Stephen P. — SZL Holdings · Doctrine v11 · Perplexity Computer Agent. """a11oy research / model-atlas / ontology live connectors (keyless → CONNECTED now). arxiv arXiv API (Atom XML) keyless hf_hub Hugging Face Hub API (models/datasets) public keyless; token → higher rate wikidata Wikidata WDQS SPARQL keyless (60/min) """ from __future__ import annotations import os import time import urllib.parse as up import xml.etree.ElementTree as ET from typing import Any from ..base import Connector, Records, State, http_json, http_text, _now from ..registry import register _CACHE: dict[str, tuple[float, Any]] = {} def _cached(k, ttl): h = _CACHE.get(k) return h[1] if h and (time.time() - h[0]) < ttl else None def _put(k, v): _CACHE[k] = (time.time(), v) @register class ArxivConnector(Connector): id = "arxiv" label = "arXiv research papers" category = "research" auth_kind = "none" free_tier = True provider_base = "http://export.arxiv.org/api/query" docs_url = "https://info.arxiv.org/help/api/index.html" schema_preview = ["id", "title", "authors", "published", "url"] _NS = {"a": "http://www.w3.org/2005/Atom"} def _probe(self): st, _ = http_text(self.provider_base + "?search_query=all:test&max_results=1") return (st == 200), f"arXiv HTTP {st}" def read(self, query: dict | None = None) -> Records: q = (query or {}).get("q", "formal verification temporal logic") limit = max(1, min(int((query or {}).get("limit", 8)), 30)) ck = f"arxiv:{q}:{limit}" c = _cached(ck, 900) if c: return c url = self.provider_base + "?" + up.urlencode({ "search_query": f"all:{q}", "start": 0, "max_results": limit, "sortBy": "submittedDate", "sortOrder": "descending"}) st, xml = http_text(url) if st == 200 and " Records: kind = (query or {}).get("kind", "models") # models|datasets|spaces search = (query or {}).get("search", "") limit = max(1, min(int((query or {}).get("limit", 10)), 30)) ck = f"hf:{kind}:{search}:{limit}" c = _cached(ck, 300) if c: return c params = {"limit": limit, "sort": "downloads", "direction": -1} if search: params["search"] = search st, raw = http_json(f"{self.provider_base}/{kind}?" + up.urlencode(params), headers=self._headers()) if st == 200 and isinstance(raw, list): items = [{"id": m.get("id") or m.get("modelId"), "downloads": m.get("downloads"), "likes": m.get("likes"), "pipeline_tag": m.get("pipeline_tag"), "library_name": m.get("library_name")} for m in raw[:limit]] r = Records(connector_id=self.id, category=self.category, state=State.CONNECTED, records=items, source=f"HF Hub /{kind}", live=True, note=f"live · {kind}", schema_preview=self.schema_preview) _put(ck, r) return r return self._ready_records(f"HF Hub HTTP {st}") @register class WikidataConnector(Connector): id = "wikidata" label = "Wikidata (WDQS SPARQL)" category = "ontology" auth_kind = "none" free_tier = True provider_base = "https://query.wikidata.org/sparql" docs_url = "https://www.mediawiki.org/wiki/Wikidata_Query_Service/User_Manual" schema_preview = ["item", "itemLabel"] def _probe(self): st, _ = http_json(self.provider_base + "?format=json&query=" + up.quote("SELECT ?x WHERE{?x wdt:P31 wd:Q5}LIMIT 1")) return (st == 200), f"WDQS HTTP {st}" def read(self, query: dict | None = None) -> Records: sparql = (query or {}).get("sparql") or ( "SELECT ?item ?itemLabel WHERE { ?item wdt:P31 wd:Q4830453 . " "SERVICE wikibase:label { bd:serviceParam wikibase:language 'en'. } } LIMIT 10") ck = f"wd:{hash(sparql)}" c = _cached(ck, 600) if c: return c st, raw = http_json(self.provider_base + "?format=json&query=" + up.quote(sparql)) if st == 200 and isinstance(raw, dict): cols = raw.get("head", {}).get("vars", []) rows = [] for b in raw.get("results", {}).get("bindings", []): rows.append({c2: b.get(c2, {}).get("value") for c2 in cols}) r = Records(connector_id=self.id, category=self.category, state=State.CONNECTED, records=rows, source="Wikidata WDQS SPARQL", live=True, note="live SPARQL", schema_preview=cols or self.schema_preview) _put(ck, r) return r return self._ready_records(f"WDQS unreachable (HTTP {st})") __all__ = ["ArxivConnector", "HfHubConnector", "WikidataConnector"]