spb/wpai0002_uqo
Public
1<!doctype html><html lang="en"><head><meta charset="utf-8"><title>HTR demo — {{MODEL}}</title>2<meta name="viewport" content="width=device-width,initial-scale=1">3<style>4body{font:15px/1.5 -apple-system,Segoe UI,Helvetica,Arial,sans-serif;max-width:980px;margin:2rem auto;padding:0 1rem;color:#1a1a1a;background:#fafafa}5h1{font-size:1.4rem}textarea{width:100%;min-height:160px;font:inherit;padding:.6rem;border:1px solid #bbb;border-radius:6px}6.row{display:flex;gap:.6rem;flex-wrap:wrap;margin:.6rem 0}select,input,button{font:inherit;padding:.4rem .6rem;border:1px solid #bbb;border-radius:6px;background:#fff}7button{background:#1f4e79;color:#fff;border-color:#1f4e79;cursor:pointer}button:disabled{opacity:.5}8.card{background:#fff;border:1px solid #ddd;border-radius:8px;padding:1rem;margin:1rem 0}del{background:#ffd8d8;text-decoration:line-through}ins{background:#d8f5d8;text-decoration:none}9.warn{color:#8a4b00;background:#fff4e0;border:1px solid #f0c080;padding:.4rem .6rem;border-radius:6px;margin:.3rem 0}.notice{font-size:.85rem;color:#555}10pre{white-space:pre-wrap}11</style></head><body>12<h1>HTR — Human Text Reconstruction <small>({{MODEL}})</small></h1>13<p class="notice">Research demo. Paste an LLM-rewritten scientific passage; the model proposes a reconstruction in pre-2018 scientific register. The output is a <b>synthetic reconstruction</b>, not the original text and not evidence of human authorship. Check every number, citation and negation.</p>14<textarea id="t" placeholder="Paste a rewritten passage…"></textarea>15<div class="row">16<select id="disc"><option value="">discipline (optional)</option><option>biomedicine</option><option>life_sciences</option><option>economics</option><option>finance</option><option>physics</option><option>mathematics</option><option>computer_science</option><option>statistics</option><option>social_sciences</option><option>general_reference</option></select>17<input id="year" type="number" placeholder="publication year (optional)" min="1700" max="2017">18<select id="role"><option value="">section (optional)</option><option>abstract</option><option>introduction</option><option>methods</option><option>results</option><option>discussion</option><option>conclusion</option><option>chapter</option></select>19<select id="beam"><option value="1">greedy</option><option value="3">beam 3</option></select>20<button id="go">Reconstruct</button></div>21<div id="out"></div>22<script>23const $=s=>document.querySelector(s);24$('#go').onclick=async()=>{const b=$('#go');b.disabled=true;$('#out').innerHTML='<div class="card">Working…</div>';25try{const r=await fetch('/api/reconstruct',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({text:$('#t').value,discipline:$('#disc').value,pub_year:$('#year').value||null,section_role:$('#role').value,beam:$('#beam').value})});26const j=await r.json(); if(j.error){$('#out').innerHTML='<div class="card">'+j.error+'</div>';return;}27let w=j.warnings.length?j.warnings.map(x=>'<div class="warn">⚠ '+x+'</div>').join(''):'<div class="notice">No preservation warnings.</div>';28$('#out').innerHTML='<div class="card"><h3>Reconstruction</h3><pre>'+j.reconstruction.replace(/</g,'<')+'</pre>'+w+'</div><div class="card"><h3>Differences (input → reconstruction)</h3><p>'+j.diff_html+'</p></div><div class="card"><h3>Preservation checks</h3><pre>'+JSON.stringify(j.preservation,null,1)+'</pre><p class="notice">'+j.notice+'</p></div>';}29catch(e){$('#out').innerHTML='<div class="card">Error: '+e+'</div>';}finally{b.disabled=false;}};30</script></body></html>31