IdeaScope is a FastAPI web app for searching papers from arXiv + DBLP, classifying them, exporting/importing BibTeX, generating keyword reports, and evaluating idea novelty.
- Search papers by keyword and year range
- Support normal mode and approximate full crawl mode
- Classify papers with preset tags and optional AI-generated free tags
- Export results to
BibTeXorMarkdown - Import
BibTeXfiles back into the UI - Import current papers into Zotero via API
- Persist search snapshots into
runs/<run_id>.json - Re-open a previous run by
run_id - Generate a keyword report from current papers or a saved run
- Evaluate novelty of a research idea against current papers or a saved run
- Python 3.10+ recommended
- Network access to arXiv/DBLP
- Optional: OpenAI-compatible API for AI classification/reporting/novelty
- Optional: Zotero API credentials for Zotero import
- Install dependencies:
pip install -r requirements.txt- Create or edit
.envin project root (project_root/.env):
OPENAI_BASE_URL(OpenAI-compatible endpoint, usually ending with/v1)OPENAI_API_KEYOPENAI_MODELCLASSIFIER_ENABLED=true|falseDEFAULT_PRESET_TAGS(comma-separated)MAX_PAPERS_FOR_ANALYSIS(optional, default120)ANALYSIS_CHUNK_SIZE(optional, default20)MAX_ABSTRACT_CHARS(optional, default800)ZOTERO_LIBRARY_TYPE(userorgroup)ZOTERO_LIBRARY_IDZOTERO_API_KEYZOTERO_COLLECTION_KEY(optional)
uvicorn app.main:app --reloadOpen http://127.0.0.1:8000.
UI language: switch interface language between system/Chinese/English.Theme mode: switch between system/light/dark theme.
Keyword: required forSearch.Start year/End year: publication year filter.Max results/source: used in normal mode only.Approx full crawl cap: used only when full crawl mode is enabled.Approx full crawl mode(checkbox): when enabled, paginated fetching is used until per-source cap.Use AI for classify(checkbox): controls whetherClassifycalls AI free-tag generation.
Report keywords: comma-separated keywords for report coverage/trend analysis.Idea: free text for novelty evaluation.Run ID: targetrun_idto reload.Analysis top N: upper bound of papers used by report and idea evaluation.Report language: output language for report and novelty result.
- Calls
POST /api/search. - Requires
Keyword. - Returns papers and a new
run_id. - Side effects:
- Updates paper list on page.
- Shows status line with paper count.
- Fills
Run IDinput automatically. - Stores run snapshot under
runs/<run_id>.json.
- Calls
POST /api/classifyin batches. - Requires current paper list (from Search/Load Run/BibTeX import).
- Uses
Use AI for classifycheckbox to setuse_ai. - Side effects:
- Rewrites tags in current paper list.
- Does not create a new
run_idby itself.
- Calls
POST /api/export/zotero. - Requires current paper list.
- Needs Zotero credentials in
.env. - Side effects:
- Creates/updates items in your Zotero library.
- Opens local file picker (
.bib,.bibtex,.txt). - Uploads file to
POST /api/import/bibtex. - Side effects:
- Replaces current paper list with imported entries.
- Does not auto-create
run_idunless you runSearch(or later generate analysis against an existing run).
- Calls
POST /api/export/bibtexwith current papers. - Downloads
papers.bib. - Requires current paper list.
- Calls
POST /api/export/markdownwith current papers. - Downloads
papers.md. - Requires current paper list.
- Calls
POST /api/report/keywords. - Requires:
Report keywordsnot empty.- Either current paper list or a valid
run_id.
- Uses
Analysis top NandReport language. - Side effects:
- Renders keyword report panel.
- If request is based on
run_id, report is persisted toruns/<run_id>.jsonunderanalysis.keyword_report.
- Calls
POST /api/idea/evaluate. - Requires:
Ideanot empty.- Either current paper list or a valid
run_id.
- Uses
Report keywords(optional),Analysis top N, andReport language. - Side effects:
- Renders novelty panel.
- If request is based on
run_id, result is persisted underanalysis.idea_novelty.
- Calls
GET /api/runs/{run_id}. - Requires
Run IDinput. - Side effects:
- Reloads papers from saved run (
papers_brief). - Restores saved report/novelty panels if present.
- Sets current context to the loaded run.
- Reloads papers from saved run (
Use any of these methods:
- After Search in UI:
- The
Run IDinput is auto-filled. - Status line displays current run id (
Current run_id: ...).
- The
- From local files:
- Search snapshots are saved in
runs/. - Filename is exactly
<run_id>.json. - Example:
runs/b048f98f0c2b4fc6bacb3928623eb42f.json->run_id = b048f98f0c2b4fc6bacb3928623eb42f.
- Search snapshots are saved in
- From API response:
POST /api/searchreturns JSON fieldrun_id.
If Load Run returns 404, usually the run_id does not exist under runs/ or was typed incorrectly.
- Fill search fields and click
Search. - (Optional) Enable/disable
Use AI for classify, then clickClassify. - Click
Export BibTeXorExport Markdown.
- Put a known
run_idintoRun ID. - Click
Load Run. - Fill
Report keywords, setAnalysis top N, clickGenerate Report.
- Click
Import BibTeXand select file. - Fill
Idea(+ optionalReport keywords). - Click
Evaluate Idea Novelty.
POST /api/searchPOST /api/classifyPOST /api/import/bibtexPOST /api/export/bibtexPOST /api/export/markdownPOST /api/export/zoteroPOST /api/report/keywordsPOST /api/idea/evaluateGET /api/runs/{run_id}
pytest