[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-83341":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":12,"contributorsCount":12,"subscribersCount":12,"size":12,"stars1d":14,"stars7d":15,"stars30d":15,"stars90d":12,"forks30d":12,"starsTrendScore":16,"compositeScore":17,"rankGlobal":9,"rankLanguage":9,"license":9,"archived":18,"fork":18,"defaultBranch":19,"hasWiki":20,"hasPages":18,"topics":21,"createdAt":9,"pushedAt":9,"updatedAt":22,"readmeContent":23,"aiSummary":9,"trendingCount":12,"starSnapshotCount":12,"syncStatus":24,"lastSyncTime":25,"discoverSource":26},83341,"Web-browser-agent","Lyra-stellAI\u002FWeb-browser-agent","Lyra-stellAI","An agent that helps user to understand and analyze web content",null,"Python",117,0,51,14,66,60,83.6,false,"claude\u002Fweb-reading-assistant-YKpjg",true,[],"2026-06-12 04:01:40","# Web browser agent\n\nA lightweight Flask web app that helps you read the web faster and\nincrementally build a personal knowledge graph:\n\n- **Search the web** from a single input bar (DuckDuckGo).\n- **Summarize any page** by pasting its URL and clicking *Summarize*.\n- **Summarize pasted text** by pasting raw text instead of a URL.\n- One-click \"Summarize this\" on every search result.\n- **Knowledge Graph** — highlight any text in a summary, or paste a chunk\n  in the input and click *+ KG*, to save it (with source metadata, tags,\n  and notes) to a staging area. When you're ready, *Integrate* curated\n  chunks into the persistent overall graph — the LLM extracts entities\n  and links chunks to existing nodes, so the graph compounds over time\n  the more you read.\n\nSummaries can be generated by any of:\n\n| Provider | Env var for API key | Default model |\n| --- | --- | --- |\n| Anthropic (Claude) | `ANTHROPIC_API_KEY` | `claude-haiku-4-5-20251001` |\n| OpenAI | `OPENAI_API_KEY` | `gpt-4o-mini` |\n| Qwen (DashScope) | `DASHSCOPE_API_KEY` | `qwen-plus` |\n| DeepSeek | `DEEPSEEK_API_KEY` | `deepseek-chat` |\n\nPick the provider and model from the dropdowns in the UI. The model field is\nfree-form, so any model ID the provider supports also works. If no API keys are\nset, the app falls back to a local extractive summarizer that needs no key.\n\n## Quick start\n\n```bash\npython -m venv .venv\nsource .venv\u002Fbin\u002Factivate\npip install -r requirements.txt\n\n# Optional — set any one or more for higher-quality AI summaries:\nexport ANTHROPIC_API_KEY=sk-ant-...\nexport OPENAI_API_KEY=sk-...\nexport DASHSCOPE_API_KEY=sk-...       # Qwen\nexport DEEPSEEK_API_KEY=sk-...\n\npython app.py\n```\n\nThen open \u003Chttp:\u002F\u002Flocalhost:5000>.\n\n## How to use\n\n- **Search** — Type a query, press *Search* (or hit `Enter`).\n- **Summarize a URL** — Paste a URL, press *Summarize* (or `Shift+Enter`).\n- **Summarize text** — Paste raw text into the input and press *Summarize*.\n- From any search result, click **Summarize this** to summarize that page.\n\n## How to use\n\n### Read tab\n- **Search** — type a query, press *Search* (or `Enter`).\n- **Summarize a URL** — paste a URL, press *Summarize* (or `Shift+Enter`).\n- **Save a chunk to KG** — either paste text in the input and click `+ KG`,\n  or highlight any text in a summary to surface a floating \"Save to KG\"\n  button. A modal lets you add tags, a note, and source metadata.\n\n### Knowledge Graph tab\n- **Ingest a corpus** — at the top of the tab, three modes:\n  - **Files**: drag-drop or pick `.txt`, `.md`, `.html`, `.pdf` (up to 50 MB).\n  - **URLs**: one URL per line — each page is fetched and chunked.\n  - **Text**: paste a large document with an optional source title.\n- All modes share **chunk size** (default 800 chars, ~200 tokens) and\n  **overlap** (default 120 chars, ~15%). The chunker splits on paragraph\n  boundaries first, then sentence boundaries inside long paragraphs, and\n  carries an overlap (snapped to a word boundary) between chunks. Chunks\n  land in staging tagged with their source and `part:i\u002FN`.\n- Browse what's in **staging** (recently saved chunks awaiting integration).\n- Browse the **integrated** graph (chunks + extracted entities + edges).\n- Click **Integrate →** to move all staged chunks into the overall graph.\n  The selected provider\u002Fmodel (from the Read tab) extracts entities and\n  links them. If no API key is set or you select Extractive, the app\n  falls back to a heuristic (capitalized phrase) entity extractor.\n- Click a node in the graph or sidebar to see its full text, source,\n  tags, note, and linked nodes.\n- **Search** the graph by free text — matches chunk text, entity names,\n  tags, notes, and source titles.\n\nThe graph is stored as plain JSON in `data\u002Fcurrent.json` (staging) and\n`data\u002Foverall.json` (integrated). It's just a git-friendly file you can\ndiff, back up, or edit by hand.\n\n## Endpoints\n\n- `GET \u002Fapi\u002Fproviders` — list configured providers and their suggested models.\n- `POST \u002Fapi\u002Fsearch` — `{ \"query\": \"...\" }` → DuckDuckGo results.\n- `POST \u002Fapi\u002Fsummarize` — `{ \"input\": \"\u003Curl-or-text>\", \"provider\": \"...\", \"model\": \"...\" }`\n  → page summary. `provider` may be `auto`, `anthropic`, `openai`, `qwen`,\n  `deepseek`, or `extractive`. `model` is optional and falls back to the\n  provider's default.\n- `GET \u002Fapi\u002Fkg\u002Fstats` — `{current: {chunks, entities, edges}, overall: {...}}`.\n- `GET \u002Fapi\u002Fkg\u002Fgraph?where=current|overall` — full nodes + edges.\n- `POST \u002Fapi\u002Fkg\u002Fadd` — `{ \"text\", \"source_title?\", \"source_url?\", \"tags?\", \"note?\" }`\n  adds a chunk to the staging graph.\n- `POST \u002Fapi\u002Fkg\u002Fintegrate` — `{ \"provider?\", \"model?\", \"use_ai?\" }` moves\n  staged chunks into the overall graph, extracting entities and edges.\n- `POST \u002Fapi\u002Fkg\u002Fquery` — `{ \"query\", \"where?\" }` returns matching nodes.\n- `DELETE \u002Fapi\u002Fkg\u002Fnode\u002F\u003Cid>?where=current|overall` — remove a node.\n- `POST \u002Fapi\u002Fkg\u002Fingest\u002Ftext` — chunk a pasted document into staging.\n  Body: `{ \"text\", \"source_title?\", \"source_url?\", \"tags?\", \"chunk_size?\", \"overlap?\" }`.\n- `POST \u002Fapi\u002Fkg\u002Fingest\u002Furls` — fetch each URL, parse, chunk into staging.\n  Body: `{ \"urls\": [...], \"tags?\", \"chunk_size?\", \"overlap?\" }`.\n- `POST \u002Fapi\u002Fkg\u002Fingest\u002Ffiles` — multipart upload of `.txt`\u002F`.md`\u002F`.html`\u002F`.pdf`,\n  with form fields `tags`, `chunk_size`, `overlap`.\n\n## Configuration\n\n| Variable | Purpose |\n| --- | --- |\n| `ANTHROPIC_API_KEY` | Enables Claude-powered summaries. |\n| `OPENAI_API_KEY` | Enables OpenAI-powered summaries. |\n| `DASHSCOPE_API_KEY` | Enables Qwen (DashScope) summaries. |\n| `DEEPSEEK_API_KEY` | Enables DeepSeek summaries. |\n| `OPENAI_BASE_URL` | Override OpenAI base URL (proxy, Azure, etc.). |\n| `QWEN_BASE_URL` | Override DashScope base URL (use China endpoint, etc.). |\n| `DEEPSEEK_BASE_URL` | Override DeepSeek base URL. |\n| `KG_DATA_DIR` | Directory for KG JSON files (default `data\u002F`). |\n| `PORT` | Port to bind (default `5000`). |\n",2,"2026-06-11 04:10:59","CREATED_QUERY"]