[{"data":1,"prerenderedAt":4},["ShallowReactive",2],{"readme:edgextract":3},"\u003Ch1>edgextract\u003C\u002Fh1>\n\u003Cp>\u003Cstrong>Turn markdown into a knowledge graph with an ontology you write and a cutoff you own.\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Your code proposes names. Your ontology says which kinds and links are legal. A small local decision model answers one closed yes-or-no question at a time. Anything it is unsure about waits for a person instead of silently entering your graph.\u003C\u002Fp>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002Fraphaelmansuy\u002Fedgextract\u002FHEAD\u002Fdocs\u002Fimg\u002Fgraph.png\" alt=\"An interactive knowledge graph built by edgextract from four sentences of company news\" \u002F>\u003C\u002Fp>\n\u003Cp>\u003Csub>Real output from a local \u003Ccode>tev1\u003C\u002Fcode> run on \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fraphaelmansuy\u002Fedgextract\u002Fblob\u002FHEAD\u002Fdata\u002Fgolden\u002Fdocs\u002F13_northwind.md\" rel=\"nofollow ugc noopener\">\u003Ccode>13_northwind.md\u003C\u002Fcode>\u003C\u002Fa>: \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fraphaelmansuy\u002Fedgextract\u002Fblob\u002FHEAD\u002Fdocs\u002Farticle\u002Fsample-graph.html\" rel=\"nofollow ugc noopener\">open the interactive page\u003C\u002Fa> · \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fraphaelmansuy\u002Fedgextract\u002Fblob\u002FHEAD\u002Fdocs\u002Farticle\u002Fsample-report.html\" rel=\"nofollow ugc noopener\">full report\u003C\u002Fa> · \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fraphaelmansuy\u002Fedgextract\u002Fblob\u002FHEAD\u002Fdocs\u002Farticle\u002Farticle.pdf\" rel=\"nofollow ugc noopener\">read the article (PDF)\u003C\u002Fa>. One of the five links in that graph is wrong (\u003Ccode>Acme ACQUIRED Northwind\u003C\u002Fcode>; the text says \"invested in\"). We left it in. That is what the review queue and your cutoff are for.\u003C\u002Fsub>\u003C\u002Fp>\n\u003Ch2>60-second start\u003C\u002Fh2>\n\u003Cp>Rust (native): \u003Ccode>cargo add edgextract\u003C\u002Fcode> or \u003Ccode>cargo install edgextract\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>Browser WASM: \u003Ccode>npm i @raphael.mansuy\u002Fedgextract\u003C\u002Fcode> (demo: \u003Ca href=\"https:\u002F\u002Fraphaelmansuy.github.io\u002Fedgextract\u002F\" rel=\"nofollow ugc noopener\">GitHub Pages\u003C\u002Fa> · \u003Ca href=\"https:\u002F\u002Fraphaelmansuy-edgextract.static.hf.space\u002F\" rel=\"nofollow ugc noopener\">Hugging Face Space\u003C\u002Fa>).\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">git clone https:\u002F\u002Fgithub.com\u002Fraphaelmansuy\u002Fedgextract &amp;&amp; cd edgextract\nuv sync --all-extras\nollama pull tev1                       # a local decision model (Ollama 0.35+)\nuv run edgextract --model tev1 report data\u002Fgolden\u002Fdocs\u002F13_northwind.md \\\n    --ontology company_news --out graph.html\nopen graph.html\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>No model yet? Everything below runs offline against a stand-in model:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">make test examples\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Or from Python, in five lines:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-python\">from edgextract import extract_text, load_ontology_named, write_report\n\ntext = open(\"note.md\").read()\nontology = load_ontology_named(\"company_news\")      # or \"tech_docs\", \"conll04\", or a YAML path\nresult = extract_text(text, ontology, model=\"tev1\")\nwrite_report(\"graph.html\", text, result, ontology, title=\"My note\")\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>Try it in your browser\u003C\u002Fh2>\n\u003Cp>\u003Cstrong>Hosted demo:\u003C\u002Fstrong> \u003Ca href=\"https:\u002F\u002Fraphaelmansuy.github.io\u002Fedgextract\u002F\" rel=\"nofollow ugc noopener\">GitHub Pages\u003C\u002Fa> · \u003Ca href=\"https:\u002F\u002Fhuggingface.co\u002Fspaces\u002Fraphaelmansuy\u002Fedgextract\" rel=\"nofollow ugc noopener\">Hugging Face Space\u003C\u002Fa> (\u003Ca href=\"https:\u002F\u002Fraphaelmansuy-edgextract.static.hf.space\" rel=\"nofollow ugc noopener\">direct app\u003C\u002Fa>) — Chromium with WebGPU; first \u003Cstrong>Load Tev1\u003C\u002Fstrong> downloads ~1 GB from Hugging Face into the browser cache (no server of ours sees your text). The hosted page \u003Cstrong>does not call \u003Ccode>127.0.0.1:11434\u003C\u002Fcode>\u003C\u002Fstrong>. Optional Ollama: \u003Ccode>?backend=ollama&amp;host=https:\u002F\u002Fyour-host\u003C\u002Fcode> plus \u003Ccode>OLLAMA_ORIGINS\u003C\u002Fcode> (HTTPS required; the browser blocks mixed-content \u003Ccode>http:\u002F\u002F\u003C\u002Fcode>). Open the Space on \u003Ccode>*.hf.space\u003C\u002Fcode>, not only the Hub iframe.\u003C\u002Fp>\n\u003Cp>The Rust crate compiles to WebAssembly, and a small Vite + TypeScript page runs the whole pipeline in a tab. Your text goes only to the decision model you name (by default Tev1 on WebGPU in this tab; Ollama is one click away), never to a server of ours.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">ollama pull tev1                  # Ollama already accepts pages served from localhost;\n                                  # for another origin set OLLAMA_ORIGINS before `ollama serve`\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cpre>\u003Ccode class=\"language-bash\">make demo                # builds the wasm, then serves http:\u002F\u002Flocalhost:5273\n# WebGPU default loads raphaelmansuy\u002Ftev1-0.8b-onnx-webgpu (~1 GB, browser cache).\n# Optional: make demo-webgpu-model \u002F make demo-webgpu-publish \u002F make demo-webgpu-export-tev1\n# Attribution: docs\u002FTHIRD_PARTY_NOTICES.md\n# GitHub Pages: push to master runs .github\u002Fworkflows\u002Fpages.yml (lean dist, Hub weights).\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002Fraphaelmansuy\u002Fedgextract\u002FHEAD\u002Fdocs\u002Fimg\u002Fdemo\u002F01-northwind.png\" alt=\"The browser demo reading four sentences of company news\" \u002F>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Bring any document.\u003C\u002Fstrong> Upload or drop a \u003Ccode>.md\u003C\u002Fcode> \u002F \u003Ccode>.txt\u003C\u002Fcode> file, or paste text.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Bring any ontology.\u003C\u002Fstrong> Pick one of seven samples (company news, tech docs, research papers, film, medicine, history, CoNLL04), start from a template, upload your own YAML, and edit it with live validation.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Names no list knows are still read.\u003C\u002Fstrong> Every capitalized name in your text is put to the model as a closed question (\"is this a name this ontology can\u003C\u002Fli>\n\u003C\u002Ful>\n",1791762979569]