import json import pathlib import gradio as gr from dvnc_ai_v2_hf.app import demo MODELS = ["DVNC Sovereign", "DVNC Atlas", "DVNC Curie"] BASE_DIR = pathlib.Path(__file__).resolve().parent #CONNECTOME_SNIPPET = (BASE_DIR / "ui" / "connectome.html").read_text(encoding="utf-8") # replaced base connectome with enhanced connectome. CONNECTOME_SNIPPET = (BASE_DIR / "ui" / "enhanced_connectome.html").read_text(encoding="utf-8") def build_chat_html(query, data): return f'''
You

{query}

DVNC

{data.get("summary","")}

Primary Hypothesis

{data.get("primary_hypothesis","")}

''' def build_reasoning_html(steps): chunks = [] for s in steps: chunks.append(f'''
{s['step']}
{s['agent']}{s['tag']}
{s['summary']}
''') return '
' + ''.join(chunks) + '
' def build_cards_html(cards): html = [] for c in cards: html.append(f'''
{c['agent']}{c['score']}

{c['title']}

{c['front']}

Novelty{c['novelty']}
Alt path{c['score']}

{c['title']}

{c['back']}

Swap stateReady
''') return '
' + ''.join(html) + '
' def build_metrics_md(metrics, model_used): lines = [f"# Discovery Output\n", f"**Claude model used:** {model_used}\n", "## Metrics"] for k, v in metrics.items(): lines.append(f"- {k}: {v}/100") lines.append("\n## Next action\n- Replace `core/dvnc_engine.py` with your production graph and evidence stack.") return "\n".join(lines) def build_frontend_payload(data): return f""" {CONNECTOME_SNIPPET} """ def run(query, model_name): data = run_discovery(query, model_name) return ( build_chat_html(query, data), build_frontend_payload(data), build_reasoning_html(data.get("reasoning", [])), build_cards_html(data.get("cards", [])), build_metrics_md(data.get("metrics", {}), data.get("model_used", "unknown")), ) CSS = r''' :root{--bg:#fffaf7;--panel:#ffffff;--panel2:#fff6f1;--line:rgba(17,24,39,.08);--text:#000;--muted:#5f6675;--orange:#ff6b35;--orange-light:#ff955f;--orange-pale:#fff3ec;--teal:#b9efe8;--blue:#8fb2ff;--radius:24px;--shadow:0 16px 44px rgba(17,24,39,.06)} html,body,.gradio-container{background:linear-gradient(180deg,#fffaf7 0%,#fff 100%)!important;color:var(--text)!important;font-family:Inter,system-ui,sans-serif} .gradio-container{max-width:1480px!important;padding:18px!important} footer{display:none!important} #app-shell{border:1px solid var(--line);background:rgba(255,255,255,.92);backdrop-filter:blur(14px);box-shadow:var(--shadow);border-radius:32px;overflow:hidden} #app-shell .grid{display:grid;grid-template-columns:1.08fr .92fr;min-height:72vh}.left,.right{padding:20px}.left{border-right:1px solid var(--line);display:flex;flex-direction:column;gap:14px}.right{display:grid;grid-template-rows:auto auto auto 1fr;gap:14px} .hero{display:flex;justify-content:space-between;align-items:center;gap:12px} .hero-plate{padding:22px 24px 18px 24px;min-height:160px;border-bottom:1px solid var(--line);background:linear-gradient(180deg,rgba(255,255,255,.92) 0%,rgba(255,247,243,.88) 100%)} .hero-copy{display:flex;flex-direction:column;justify-content:space-between;gap:16px;min-height:118px} .brand{display:flex;gap:14px;align-items:center} .logo{width:50px;height:50px;border-radius:16px;display:grid;place-items:center;border:1px solid rgba(255,107,53,.2);background:linear-gradient(135deg,var(--orange-pale),rgba(255,107,53,.08))} .logo svg{width:26px;height:26px;color:var(--orange)} .brand h1{margin:0;font-size:1.18rem;color:var(--text)} .brand p{margin:4px 0 0;color:var(--muted);font-size:.9rem} .live{display:flex;gap:10px;align-items:center;color:var(--text)} .live i{width:10px;height:10px;border-radius:50%;background:var(--orange);display:inline-block;box-shadow:0 0 18px rgba(255,107,53,.4);animation:pulse 2s ease-in-out infinite} .hero-orb-wrap{margin-left:auto;display:flex;align-items:center;justify-content:center;min-width:180px} .hero-orb{position:relative;width:110px;height:110px;display:grid;place-items:center} .hero-orb-core{width:64px;height:64px;border-radius:50%;background:radial-gradient(circle at 30% 28%,#ffd2be 0%,#ff9a6f 30%,#ff6b35 68%,#d94d1c 100%);box-shadow:0 12px 34px rgba(255,107,53,.28), inset -8px -10px 18px rgba(100,35,10,.22), inset 8px 10px 16px rgba(255,255,255,.22);animation:heroOrbFloat 5s ease-in-out infinite} .hero-orb-ring{position:absolute;border-radius:50%;border:1px solid rgba(255,107,53,.16)} .hero-orb-ring.ring-a{width:86px;height:86px;animation:spinSlow 10s linear infinite} .hero-orb-ring.ring-b{width:108px;height:108px;border-color:rgba(255,107,53,.10);animation:spinReverse 14s linear infinite} .hero-orb-glow{position:absolute;width:120px;height:120px;border-radius:50%;background:radial-gradient(circle,rgba(255,107,53,.18) 0%,rgba(255,107,53,.08) 42%,rgba(255,107,53,0) 72%)} @keyframes heroOrbFloat{0%,100%{transform:translateY(0) scale(1)}50%{transform:translateY(-5px) scale(1.03)}} @keyframes spinSlow{from{transform:rotate(0deg)}to{transform:rotate(360deg)}} @keyframes spinReverse{from{transform:rotate(360deg)}to{transform:rotate(0deg)}} @keyframes pulse{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.6;transform:scale(.9)}} .panel{border:1px solid var(--line);background:#ffffff;border-radius:22px;box-shadow:0 2px 12px rgba(0,0,0,.04)} .dvnc-model-cards .gr-radio{ display:grid!important; grid-template-columns:repeat(3,1fr); gap:12px; } .dvnc-model-cards label{ display:flex!important; flex-direction:column; gap:4px; padding:14px!important; border:1px solid var(--line)!important; border-radius:18px!important; background:#fafbfc!important; cursor:pointer!important; transition:all .2s ease!important; min-height:84px; justify-content:center; } .dvnc-model-cards label:hover{ border-color:var(--orange)!important; transform:translateY(-1px); box-shadow:0 10px 22px rgba(255,107,53,.08); } .dvnc-model-cards input[type="radio"]{ margin-bottom:8px; accent-color:var(--orange); } .dvnc-model-cards label:has(input[type="radio"]:checked){ border-color:var(--orange)!important; background:var(--orange-pale)!important; box-shadow:0 10px 24px rgba(255,107,53,.12); } .querybox,.querybox>div{background:#fff!important;border:1.5px solid rgba(255,107,53,.28)!important;border-radius:20px!important;box-shadow:0 6px 22px rgba(255,107,53,.08)!important}.querybox textarea{color:#000!important;background:#fff!important}.querybox:focus-within,.querybox>div:focus-within{border-color:#ff6b35!important;box-shadow:0 0 0 4px rgba(255,107,53,.10),0 8px 28px rgba(255,107,53,.10)!important} .chat-panel{padding:14px;display:flex;flex-direction:column;gap:10px;min-height:240px;max-height:300px;overflow:auto}.bubble{max-width:86%;padding:14px 16px;border:1px solid var(--line);border-radius:20px}.bubble .role{font-size:.72rem;text-transform:uppercase;letter-spacing:.14em;color:var(--muted)}.bubble p{margin:6px 0 0;line-height:1.55;color:var(--text)}.bubble.user{margin-left:auto;background:var(--orange-pale);border-color:rgba(255,107,53,.22)}.bubble.ai{background:#fff}.bubble.system{background:var(--orange-pale);border-color:rgba(255,107,53,.22)} .brain-shell{padding:14px}.brain-head{display:flex;justify-content:space-between;gap:16px;align-items:flex-end;margin-bottom:10px}.eyebrow{margin:0 0 4px;font-size:.72rem;letter-spacing:.16em;text-transform:uppercase;color:var(--orange)}.brain-head h3{margin:0;font-size:1.02rem;color:var(--text)}.brain-help{color:var(--muted);font-size:.8rem}#dvnc-three-root{height:300px;border-radius:20px;border:1px solid var(--line);overflow:hidden;background:linear-gradient(180deg,#fff7f3 0%,#fff 100%);position:relative} .working-orb{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:80px;height:80px;border-radius:50%;background:radial-gradient(circle at 30% 30%,rgba(255,143,102,.9),var(--orange));box-shadow:0 8px 32px rgba(255,107,53,.4),inset 0 -4px 12px rgba(0,0,0,.15);animation:orbPulse 2.5s ease-in-out infinite,orbFloat 4s ease-in-out infinite} @keyframes orbPulse{0%,100%{box-shadow:0 8px 32px rgba(255,107,53,.4),inset 0 -4px 12px rgba(0,0,0,.15)}50%{box-shadow:0 12px 48px rgba(255,107,53,.7),inset 0 -4px 12px rgba(0,0,0,.2)}} @keyframes orbFloat{0%,100%{transform:translate(-50%,-50%) translateY(0)}50%{transform:translate(-50%,-50%) translateY(-12px)}} .tray-panel{padding:14px;display:flex;flex-direction:column;gap:10px}.tray{border:1px solid var(--line);border-radius:18px;background:#ffffff;overflow:hidden}.tray summary{list-style:none;display:grid;grid-template-columns:42px 1fr;gap:12px;align-items:center;padding:12px 14px;cursor:pointer}.tray summary::-webkit-details-marker{display:none}.tray .step{width:42px;height:42px;border-radius:14px;display:grid;place-items:center;color:#ffffff;font-weight:700;background:var(--orange);border:1px solid var(--orange-light)}.tray summary strong{display:block;color:var(--text)}.tray summary small{color:var(--muted);text-transform:uppercase;letter-spacing:.12em}.tray-body{padding:0 14px 14px 68px;color:var(--text);line-height:1.6} .cards-panel{padding:16px}.candidate-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px}.candidate-card{perspective:1200px;min-height:250px}.candidate-card-inner{position:relative;min-height:250px;height:100%;transform-style:preserve-3d;transition:transform .8s cubic-bezier(.2,.7,.1,1)}.candidate-card:hover .candidate-card-inner,.candidate-card:focus .candidate-card-inner{transform:rotateY(180deg)}.candidate-face{position:absolute;inset:0;padding:18px;border-radius:22px;border:1px solid var(--line);backface-visibility:hidden;display:flex;flex-direction:column;gap:12px;box-shadow:0 4px 16px rgba(0,0,0,.06);background:#ffffff}.candidate-face.back{transform:rotateY(180deg);background:var(--orange-pale)}.top,.meta{display:flex;justify-content:space-between;gap:12px}.chip{font-size:.72rem;letter-spacing:.12em;text-transform:uppercase;color:var(--orange);padding:7px 10px;border-radius:999px;border:1px solid rgba(255,107,53,.2);background:var(--orange-pale)}.chip.alt{color:var(--blue);border-color:rgba(37,99,235,.2);background:rgba(37,99,235,.08)}.score{font-weight:700;color:var(--orange)}.candidate-face h4{margin:0;color:var(--text)}.candidate-face p{margin:0;color:var(--text);line-height:1.6}.meta{margin-top:auto;color:var(--muted)} .gr-button-primary{background:linear-gradient(135deg,var(--orange),var(--orange-light))!important;color:#fff!important;border:none!important;font-weight:700!important;box-shadow:0 10px 24px rgba(255,107,53,.22)!important}.gr-button-secondary{background:#fff!important;color:#000!important;border:1px solid rgba(255,107,53,.18)!important} @media (max-width:1180px){#app-shell .grid{grid-template-columns:1fr}.left{border-right:0;border-bottom:1px solid var(--line)}.model-strip,.candidate-grid{grid-template-columns:1fr}} ''' HEAD = ''' ''' with gr.Blocks(css=CSS, head=HEAD, theme=gr.themes.Base(), fill_height=True) as demo: gr.HTML('''

DVNC.AI

Connectome-native reasoning · premium scientific discovery interface

Claude-linked runtime
''') model = gr.Radio( choices=MODELS, value="DVNC Sovereign", label="Model family", elem_id="dvnc-model-cards", elem_classes=["dvnc-model-cards"] ) query = gr.Textbox(label="Discovery query", lines=3, elem_classes=["querybox"], placeholder="Ask a scientific question, anomaly, mechanism, or hypothesis target…") with gr.Row(): run_btn = gr.Button("Run discovery", variant="primary") example_btn = gr.Button("Load example", variant="secondary") chat = gr.HTML('
DVNC

Enter a discovery prompt to trigger Claude-backed orchestration or demo mode if no API key is set.

') gr.HTML('
') connectome = gr.HTML(CONNECTOME_SNIPPET) trays = gr.HTML('
') cards = gr.HTML('
') output = gr.Markdown('# Discovery Output\n\nAwaiting query.') gr.HTML('
') example_btn.click(lambda: "How could a self-assembling conductive biomaterial improve cardiac repair by converting mechanical strain into regenerative signalling?", outputs=query) run_btn.click(run, inputs=[query, model], outputs=[chat, connectome, trays, cards, output]) if __name__ == '__main__': demo.launch()