diff --git a/examples/literature-explorer/README.md b/examples/literature-explorer/README.md index 7ecb44a..cb19697 100644 --- a/examples/literature-explorer/README.md +++ b/examples/literature-explorer/README.md @@ -42,6 +42,7 @@ The adapter exposes JSON-serializable methods suitable for a local web bridge: - `expand_topic(...)` - `extract_text(text, backend="heuristic")` - `verify_strings(values, context="", limit=5)` +- `support_claims(text, context="", limit=5, max_claims=8, min_claim_chars=90)` - `verify_bibtex(bibtex_text, context="", limit=5)` - `graph(seed_keys, relation_types=None, depth=1, review_status=None, missing_only=False)` @@ -64,6 +65,7 @@ window.citegeist = { expandTopic(topicSlug, opts) {}, extractText(text, opts) {}, verifyStrings(values, opts) {}, + supportClaims(text, opts) {}, verifyBibtex(bibtexText, opts) {}, graph(seedKeys, opts) {} } @@ -122,6 +124,7 @@ This is sufficient to drive a demonstration app that can: - preview or apply topic expansion; - inspect one entry with BibTeX/provenance details; - run rough-reference extraction and verification; +- rank support-worthy claims in a prose excerpt and inspect suggested references; - render local citation neighborhoods from `graph()` JSON payloads. For a first demo, the strongest path is topic exploration rather than generic reference-manager behavior. diff --git a/examples/literature-explorer/index.html b/examples/literature-explorer/index.html index bd562c3..0ce0a76 100644 --- a/examples/literature-explorer/index.html +++ b/examples/literature-explorer/index.html @@ -839,6 +839,23 @@ "max_expanded_entries": 100, "max_expand_seconds": 20 } +} + +
+
+ POST + /api/call support_claims +
+

Analyze a prose excerpt for support-worthy claims, rank them by needs_support_score, and return candidate references not already parsed from the excerpt.

+
{ + "method": "support_claims", + "params": { + "text": "Movement may not be modeled at all, but simply assigned a cost value ...", + "context": "artificial life", + "limit": 5, + "max_claims": 5, + "min_claim_chars": 80 + } }
diff --git a/tests/test_app_server.py b/tests/test_app_server.py index 2475264..482e317 100644 --- a/tests/test_app_server.py +++ b/tests/test_app_server.py @@ -2,6 +2,7 @@ from types import SimpleNamespace from citegeist import BibliographyStore from citegeist.app_api import LiteratureExplorerApi +from citegeist.bibtex import BibEntry from citegeist.bootstrap import BootstrapResult from citegeist.app_server import ( LiteratureExplorerAppServer, @@ -9,6 +10,7 @@ from citegeist.app_server import ( _request_is_authorized, create_request_handler, ) +from citegeist.verify import VerificationMatch, VerificationResult class FakeBootstrapper: @@ -29,6 +31,38 @@ class FakeBootstrapper: ] +class FakeVerifier: + def verify_strings(self, values, context="", limit=5): + return [] + + def verify_string(self, value: str, context: str = "", limit: int = 5): + return VerificationResult( + query=value, + context=context, + status="high_confidence", + confidence=0.88, + entry=BibEntry( + entry_type="article", + citation_key="support2024", + fields={"title": "Support Paper", "year": "2024"}, + ), + source_label="openalex:search:Support Paper", + alternates=[ + VerificationMatch( + entry=BibEntry( + entry_type="article", + citation_key="alt2023", + fields={"title": "Alternate Support", "year": "2023"}, + ), + score=0.66, + source_label="crossref:search:Alternate Support", + ) + ], + input_type="string", + input_key=None, + ) + + def test_literature_explorer_app_server_dispatch_search(): store = BibliographyStore() try: @@ -138,6 +172,35 @@ def test_literature_explorer_app_server_dispatch_bootstrap_with_new_caps(): store.close() +def test_literature_explorer_app_server_dispatch_support_claims(): + store = BibliographyStore() + try: + server = LiteratureExplorerAppServer(LiteratureExplorerApi(store, verifier=FakeVerifier())) + + payload = server.dispatch( + "support_claims", + { + "text": """ +Long claim text about agents evolving intelligent movement strategies in multiple computational settings without enough direct support [1]. + +References + +[[1]]Earlier Cited Paper +""", + "context": "artificial life", + "limit": 3, + "max_claims": 2, + "min_claim_chars": 40, + }, + ) + + assert payload["context"] == "artificial life" + assert payload["suggestion_count"] == 1 + assert payload["suggestions"][0]["suggested_references"][0]["citation_key"] == "support2024" + finally: + store.close() + + def test_literature_explorer_http_handler_class_can_be_created(): store = BibliographyStore() try: