File size: 4,960 Bytes
63a104d
11e4aa2
2762feb
 
5431ef4
2762feb
 
9dba011
2762feb
9dba011
2762feb
11e4aa2
 
2762feb
11e4aa2
 
2762feb
11e4aa2
9dba011
2762feb
9dba011
2762feb
 
609ec31
 
9dba011
609ec31
2762feb
63a104d
 
2762feb
63a104d
 
9dba011
 
63a104d
 
 
 
9dba011
11e4aa2
2762feb
 
11e4aa2
 
63a104d
 
11e4aa2
 
63a104d
9dba011
63a104d
 
9dba011
 
11e4aa2
63a104d
ce58fd6
2762feb
63a104d
9dba011
63a104d
 
9dba011
63a104d
 
 
9dba011
63a104d
 
 
 
92bff3a
63a104d
 
9dba011
 
63a104d
9dba011
 
63a104d
2762feb
11e4aa2
63a104d
 
 
 
2762feb
 
92bff3a
2762feb
63a104d
11e4aa2
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# FILE: main_web.py (Hugging Face Demo - v1.0 - )

import gradio as gr
import asyncio
import logging
import os
import sys
from typing import Optional, Dict, Any

# --- Basic Setup ---
APP_TITLE = "ZOTHEOS - Ethical Fusion AI"
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s")
logger = logging.getLogger("ZOTHEOS_Interface_HF")

def get_asset_path(filename: str) -> str:
    return filename if os.path.exists(filename) else os.path.join('assets', filename)

logo_path_verified = get_asset_path("zotheos_logo.png")
GUMROAD_LINK = "https://zotheos.gumroad.com/l/jibfv"

# --- Core Logic Imports ---
try:
    from modules.main_fusion_public import MainFusionPublic
    ai_system = MainFusionPublic()
except Exception as e:
    logger.error(f"CRITICAL: Failed to initialize AI system: {e}")
    ai_system = None

# --- DEFINITIVE "OBSIDIAN PRO" CSS ---
zotheos_web_css = """
@import url('https://fonts.googleapis.com/css2?family=Bebas+Neue&family=Inter:wght@400;600;700&display=swap');
body { background: linear-gradient(135deg, #000000, #1c1c1c) !important; font-family: 'Inter', sans-serif !important; color: #f0f0f0 !important; }
.gradio-container { max-width: 900px !important; margin: 0 auto !important; padding: 1.5rem !important; background: transparent !important; }
#main_layout { display:flex; flex-direction:column; align-items:center; gap: 1.5rem; }
#header_logo img { max-height: 70px !important; filter: brightness(0) invert(1) !important; }
#header_subtitle { font-family: 'Bebas Neue', cursive !important; font-size: 1.8rem !important; letter-spacing: 2px !important; }
#header_tagline { color: #a0a0a0 !important; text-align: center; margin-top: -10px !important; margin-bottom: 1.5rem !important; }
.result-box { background-color: rgba(18, 18, 18, 0.9) !important; border: 1px solid #333 !important; border-radius: 12px !important; padding: 1.5rem !important; }
.result-box h2 { font-family: 'Bebas Neue', cursive !important; font-size: 1.5rem !important; border-bottom: 1px solid #333; padding-bottom: 0.75rem; margin-bottom: 1rem; }
.cta-button { background: #FFFFFF !important; color: #000000 !important; font-weight: bold !important; }
footer { display: none !important; }
"""

# --- Build Gradio Interface ---
def build_interface():
    theme = gr.themes.Base(primary_hue=gr.themes.colors.neutral).set(
        button_primary_background_fill="white", button_primary_text_color="black"
    )

    with gr.Blocks(theme=theme, css=zotheos_web_css, title=APP_TITLE) as demo:
        with gr.Column(elem_id="main_layout"):
            gr.Image(value=logo_path_verified, elem_id="header_logo", show_label=False, container=False, interactive=False)
            gr.Markdown("<h1 id='header_subtitle' style='text-align:center;'>Ethical Fusion AI</h1>", elem_id="header-title-wrapper")
            gr.Markdown("<p id='header_tagline'>Fusing perspectives for deeper truth.</p>", elem_id="tagline-wrapper")
            
            with gr.Accordion("🔥 Get the Full Offline Desktop Version", open=True):
                gr.Markdown("This web demo uses smaller, slower models. For the full-power, GPU-accelerated, 100% private experience, download the ZOTHEOS Public Beta for Windows.")
                gr.Button("Download Full Version on Gumroad", link=GUMROAD_LINK, elem_classes="cta-button")
            
            gr.Markdown("---")
            
            query_input = gr.Textbox(label="Your Inquiry:", placeholder="e.g., What is universal peace?", lines=5)
            submit_button = gr.Button("Process Inquiry (Web Demo)", variant="primary")
            
            with gr.Column(elem_id="results_box", visible=True): # Always visible now
                synthesized_summary_output = gr.Markdown("Synthesized insight will appear here...")
                fusion_output = gr.Markdown("Detailed perspectives will appear here...")

        # --- ✅ FAILSAFE EVENT HANDLER ---
        async def process_query_wrapper(query):
            # Show a simple "Processing..." message
            yield "## Synthesizing...\n\nPlease wait, the AI cores are thinking.", ""
            
            if not ai_system:
                return "## SYSTEM OFFLINE\n\n[The AI engine failed to load.]", ""
            
            response = await ai_system.process_query_with_fusion(query)
            summary = response.split("###")[0].strip()
            perspectives = "###" + response.split("###", 1)[1] if "###" in response else ""
            
            yield summary, perspectives

        submit_button.click(
            fn=process_query_wrapper,
            inputs=[query_input],
            outputs=[synthesized_summary_output, fusion_output]
        )
    return demo

# --- Main Execution Block ---
if __name__ == "__main__":
    logger.info("--- Initializing ZOTHEOS Hugging Face Demo (v4.1 - Failsafe) ---")
    zotheos_interface = build_interface()
    zotheos_interface.queue().launch()