| import gradio as gr |
| import modal |
|
|
| import os |
| if not os.getenv("MODAL_TOKEN_ID") and not os.path.exists(os.path.expanduser("~/.modal.toml")): |
| raise RuntimeError( |
| "Modal credentials missing. Set MODAL_TOKEN_ID and MODAL_TOKEN_SECRET, " |
| "or run `modal token new` locally." |
| ) |
|
|
| from transformers import pipeline as hf_pipeline |
|
|
| custom_css = """ |
| /* === oneironauts: eerie liminal === */ |
| |
| /* fullscreen ambient gradient — purple at top, fading to black */ |
| html, body { |
| background: |
| linear-gradient(180deg, #1d1827 0%, #14111c 30%, #0a080d 70%, #050407 100%) !important; |
| min-height: 100vh !important; |
| margin: 0 !important; |
| } |
| |
| /* dust texture: real PNG noise, embedded base64, tiled */ |
| body::before { |
| content: ""; |
| position: fixed; |
| inset: 0; |
| background-image: url("data:image/png;base64,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"); |
| background-repeat: repeat; |
| pointer-events: none; |
| z-index: 0; |
| opacity: 0.85; |
| } |
| |
| /* radial pool at center */ |
| body::after { |
| content: ""; |
| position: fixed; |
| inset: 0; |
| background: radial-gradient(ellipse 900px 600px at center 45%, rgba(70, 55, 95, 0.3) 0%, rgba(40, 35, 55, 0.12) 40%, transparent 75%); |
| pointer-events: none; |
| z-index: 0; |
| } |
| |
| /* Greek epigram — top left */ |
| .gradio-container::before { |
| content: "πύλαι ὀνείρων"; |
| position: fixed; |
| top: 2rem; |
| left: 2.5rem; |
| font-family: 'Crimson Pro', Georgia, serif; |
| font-style: italic; |
| font-size: 1rem; |
| color: rgba(210, 200, 230, 0.5); |
| letter-spacing: 0.05em; |
| pointer-events: none; |
| z-index: 3; |
| } |
| |
| .gradio-container::after { |
| content: "the gates of dreams"; |
| position: fixed; |
| top: 4.1rem; |
| left: 2.5rem; |
| font-family: 'Inter', sans-serif; |
| font-size: 0.72rem; |
| color: rgba(210, 200, 230, 0.3); |
| letter-spacing: 0.18em; |
| text-transform: lowercase; |
| pointer-events: none; |
| z-index: 3; |
| } |
| |
| /* main content column */ |
| .gradio-container { |
| background: transparent !important; |
| color: #d0ccdc !important; |
| font-family: 'Crimson Pro', 'Iowan Old Style', Georgia, serif !important; |
| max-width: 920px !important; |
| margin: 0 auto !important; |
| padding: 4rem 2rem !important; |
| position: relative !important; |
| z-index: 1 !important; |
| } |
| |
| /* headings */ |
| h1, h2, h3, .prose h1, .prose h2, .prose h3 { |
| font-family: 'Inter', -apple-system, system-ui, sans-serif !important; |
| color: #f0ebf5 !important; |
| font-weight: 500 !important; |
| letter-spacing: 0.01em !important; |
| } |
| |
| h1 { font-size: 2.1rem !important; margin-bottom: 0.25rem !important; } |
| |
| /* body prose */ |
| .prose, .prose p, .markdown-body, .markdown-body p { |
| font-family: 'Crimson Pro', 'Iowan Old Style', Georgia, serif !important; |
| font-size: 1.07rem !important; |
| line-height: 1.85 !important; |
| color: #c8c4d4 !important; |
| letter-spacing: 0.002em !important; |
| } |
| |
| /* fade in scene text */ |
| .prose, .markdown-body { |
| animation: gentleFade 1.2s ease-out !important; |
| } |
| |
| @keyframes gentleFade { |
| from { opacity: 0; transform: translateY(4px); } |
| to { opacity: 1; transform: translateY(0); } |
| } |
| |
| /* textarea */ |
| textarea, .gr-textbox textarea, input[type="text"] { |
| background-color: rgba(25, 22, 35, 0.75) !important; |
| border: 1px solid rgba(190, 180, 210, 0.18) !important; |
| border-radius: 2px !important; |
| color: #e0dceb !important; |
| font-family: 'Crimson Pro', Georgia, serif !important; |
| font-size: 1.05rem !important; |
| line-height: 1.7 !important; |
| padding: 1rem !important; |
| } |
| |
| textarea:focus, .gr-textbox textarea:focus { |
| border-color: rgba(190, 180, 210, 0.4) !important; |
| outline: none !important; |
| box-shadow: 0 0 0 1px rgba(190, 180, 210, 0.15) !important; |
| } |
| |
| /* primary button */ |
| button.primary, button[variant="primary"], .lg.primary { |
| background: linear-gradient(180deg, #322a44 0%, #1f1a2c 100%) !important; |
| border: 1px solid rgba(190, 180, 210, 0.25) !important; |
| color: #f0ebf5 !important; |
| font-family: 'Inter', sans-serif !important; |
| font-weight: 400 !important; |
| letter-spacing: 0.04em !important; |
| text-transform: lowercase !important; |
| padding: 0.85rem 1.5rem !important; |
| border-radius: 2px !important; |
| transition: all 0.4s ease !important; |
| } |
| |
| button.primary:hover, button[variant="primary"]:hover { |
| background: linear-gradient(180deg, #3d3452 0%, #292239 100%) !important; |
| border-color: rgba(210, 200, 230, 0.45) !important; |
| } |
| |
| /* choice buttons */ |
| button.secondary, button[variant="secondary"] { |
| background-color: rgba(30, 27, 42, 0.75) !important; |
| border: 1px solid rgba(190, 180, 210, 0.2) !important; |
| color: #d0ccdc !important; |
| font-family: 'Crimson Pro', Georgia, serif !important; |
| font-size: 1rem !important; |
| font-style: italic !important; |
| text-align: left !important; |
| padding: 1rem 1.4rem !important; |
| border-radius: 2px !important; |
| line-height: 1.5 !important; |
| transition: all 0.4s ease !important; |
| white-space: normal !important; |
| height: auto !important; |
| } |
| |
| button.secondary:hover, button[variant="secondary"]:hover { |
| background-color: rgba(45, 40, 60, 0.85) !important; |
| border-color: rgba(210, 200, 230, 0.4) !important; |
| color: #e4ddef !important; |
| transform: translateY(-1px) !important; |
| } |
| |
| /* labels */ |
| label, .gr-form > label, span[data-testid="block-info"] { |
| font-family: 'Inter', sans-serif !important; |
| color: #9892a8 !important; |
| font-size: 0.85rem !important; |
| font-weight: 400 !important; |
| letter-spacing: 0.05em !important; |
| text-transform: lowercase !important; |
| } |
| |
| /* horizontal rules */ |
| hr { |
| border: none !important; |
| border-top: 1px solid rgba(190, 180, 210, 0.15) !important; |
| margin: 2.5rem 0 !important; |
| } |
| |
| /* audio component */ |
| .gr-audio, .audio { |
| background-color: rgba(25, 22, 35, 0.6) !important; |
| border-radius: 2px !important; |
| border: 1px solid rgba(190, 180, 210, 0.12) !important; |
| } |
| |
| footer { display: none !important; } |
| /* choice blockquotes inside the full dream */ |
| blockquote { |
| border-left: 2px solid rgba(190, 180, 210, 0.3) !important; |
| margin: 1.5rem 0 !important; |
| padding: 0.5rem 0 0.5rem 1.5rem !important; |
| color: rgba(180, 170, 195, 0.85) !important; |
| font-style: italic !important; |
| font-size: 0.98rem !important; |
| } |
| |
| blockquote em { |
| font-style: italic !important; |
| } |
| """ |
|
|
| print("[oneironauts] loading Whisper base...") |
| whisper = hf_pipeline( |
| "automatic-speech-recognition", |
| model="openai/whisper-base", |
| chunk_length_s=30, |
| ) |
| print("[oneironauts] whisper ready") |
|
|
| print("[oneironauts] connecting to Modal endpoint...") |
| DreamWeaver = modal.Cls.from_name("oneironauts", "DreamWeaver") |
| weaver = DreamWeaver() |
| print("[oneironauts] ready") |
|
|
| MAX_DEPTH = 4 |
|
|
|
|
| def start_dream(fragment, state): |
| if not fragment.strip(): |
| return ( |
| state, |
| gr.update(value="Please enter a dream fragment first.", visible=True), |
| "—", "—", "—", |
| gr.update(visible=False), |
| gr.update(visible=True), |
| "", |
| ) |
|
|
| print(f"[oneironauts] generating opening scene...") |
| result = weaver.generate.remote(fragment) |
| print(f"[oneironauts] opening done") |
|
|
| state = { |
| "fragment": fragment, |
| "history": [result["scene"]], |
| "depth": 1, |
| } |
| choices = result["choices"] |
| return ( |
| state, |
| gr.update(value=result["scene"], visible=True), |
| choices[0], choices[1], choices[2], |
| gr.update(visible=True), |
| gr.update(visible=False), |
| "", |
| ) |
|
|
|
|
| def pick_choice(choice_text, state): |
| state["history"].append(f"Chose: {choice_text}") |
|
|
| if state["depth"] >= MAX_DEPTH: |
| print(f"[oneironauts] closing dream...") |
| closing = weaver.close_dream.remote( |
| state["fragment"], |
| state["history"], |
| choice_text, |
| ) |
| print(f"[oneironauts] closing done — scene len: {len(closing.get('scene', ''))}, interp len: {len(closing.get('interpretation', ''))}") |
|
|
| full_dream = build_full_dream(state, closing["scene"]) |
| dream_file = write_dream_file(state, full_dream, closing["interpretation"]) |
|
|
| final_text = ( |
| f"{closing['scene']}\n\n" |
| f"---\n\n" |
| f"### Your dream\n\n" |
| f"{full_dream}\n\n" |
| f"---\n\n" |
| f"### Dream journal\n\n" |
| f"{closing['interpretation']}" |
| ) |
| return ( |
| state, |
| gr.update(value=final_text, visible=True), |
| "—", "—", "—", |
| gr.update(visible=False), |
| gr.update(value=dream_file, visible=True), |
| ) |
|
|
| print(f"[oneironauts] continuing at depth {state['depth']}...") |
| result = weaver.continue_dream.remote( |
| state["fragment"], |
| state["history"], |
| choice_text, |
| ) |
| state["history"].append(result["scene"]) |
| state["depth"] += 1 |
| choices = result["choices"] |
| return ( |
| state, |
| gr.update(value=result["scene"], visible=True), |
| choices[0], choices[1], choices[2], |
| gr.update(visible=True), |
| gr.update(), |
| ) |
|
|
| def build_full_dream(state, closing_scene): |
| """Reconstruct the whole dream as readable text from history + closing.""" |
| history = state.get("history", []) |
| parts = [] |
|
|
| |
| for entry in history: |
| if entry.startswith("Chose: "): |
| choice = entry[len("Chose: "):] |
| parts.append(f"\n> *{choice}*\n") |
| else: |
| parts.append(entry) |
|
|
| parts.append(closing_scene) |
| return "\n\n".join(parts) |
|
|
|
|
| def write_dream_file(state, full_dream_md, interpretation): |
| """Write the dream as a plain-text file the user can download.""" |
| import tempfile |
| from datetime import datetime |
|
|
| fragment = state.get("fragment", "") |
| timestamp = datetime.now().strftime("%Y-%m-%d") |
|
|
| |
| plain = full_dream_md.replace("> *", "[you chose: ").replace("*\n", "]\n") |
|
|
| text = ( |
| f"ONEIRONAUTS — DREAM JOURNAL\n" |
| f"{timestamp}\n\n" |
| f"FRAGMENT\n" |
| f"{fragment}\n\n" |
| f"{'-' * 60}\n\n" |
| f"THE DREAM\n\n" |
| f"{plain}\n\n" |
| f"{'-' * 60}\n\n" |
| f"REFLECTION\n\n" |
| f"{interpretation}\n" |
| ) |
|
|
| f = tempfile.NamedTemporaryFile( |
| mode="w", suffix=".txt", delete=False, encoding="utf-8" |
| ) |
| f.write(text) |
| f.close() |
| return f.name |
|
|
| def reset_dream(): |
| return ( |
| {}, |
| gr.update(visible=True), |
| gr.update(visible=False), |
| gr.update(value="", visible=False), |
| "", |
| gr.update(value=None, visible=False), |
| ) |
|
|
|
|
| def transcribe_audio(audio): |
| if audio is None: |
| return "" |
| import numpy as np |
| sample_rate, audio_array = audio |
|
|
| if audio_array.dtype == np.int16: |
| audio_array = audio_array.astype(np.float32) / 32768.0 |
| elif audio_array.dtype == np.int32: |
| audio_array = audio_array.astype(np.float32) / 2147483648.0 |
| elif audio_array.dtype != np.float32: |
| audio_array = audio_array.astype(np.float32) |
|
|
| if audio_array.ndim > 1: |
| audio_array = audio_array.mean(axis=1) |
|
|
| duration = len(audio_array) / sample_rate |
| print(f"[oneironauts] transcribing audio ({duration:.1f}s)...") |
| result = whisper({"raw": audio_array, "sampling_rate": sample_rate}) |
| text = result["text"].strip() |
| print(f"[oneironauts] transcribed: {text[:80]}") |
| return text |
|
|
|
|
| with gr.Blocks(title="Oneironauts") as demo: |
| gr.Markdown("# Oneironauts\nA fragment of a dream becomes a branching exploration.") |
|
|
| state = gr.State({}) |
|
|
| with gr.Column(visible=True) as input_panel: |
| fragment_box = gr.Textbox( |
| label="Describe a fragment of a dream", |
| placeholder="I was walking down stairs that wouldn't end...", |
| lines=3, |
| ) |
| audio_input = gr.Audio( |
| sources=["microphone"], |
| type="numpy", |
| label="Or speak it (transcribed into the box above)", |
| ) |
| start_btn = gr.Button("Begin", variant="primary") |
|
|
| scene = gr.Markdown(visible=False) |
|
|
| with gr.Column(visible=False) as choices_panel: |
| gr.Markdown("**Where do you go?**") |
| btn_a = gr.Button("A") |
| btn_b = gr.Button("B") |
| btn_c = gr.Button("C") |
|
|
| |
| |
| reset_btn = gr.Button("Start over", variant="secondary") |
|
|
| start_btn.click( |
| start_dream, |
| inputs=[fragment_box, state], |
| outputs=[ |
| state, scene, |
| btn_a, btn_b, btn_c, |
| choices_panel, input_panel, |
| fragment_box, |
| ], |
| ) |
|
|
| audio_input.stop_recording( |
| fn=transcribe_audio, |
| inputs=[audio_input], |
| outputs=[fragment_box], |
| ) |
|
|
| download_file = gr.File( |
| label="Download your dream", |
| visible=False, |
| interactive=False, |
| ) |
| |
| for btn in (btn_a, btn_b, btn_c): |
| btn.click( |
| pick_choice, |
| inputs=[btn, state], |
| outputs=[ |
| state, scene, |
| btn_a, btn_b, btn_c, |
| choices_panel, |
| download_file, |
| ], |
| ) |
|
|
| |
|
|
| reset_btn.click( |
| reset_dream, |
| inputs=[], |
| outputs=[ |
| state, |
| input_panel, choices_panel, |
| scene, fragment_box, |
| download_file, |
| ], |
| ) |
|
|
|
|
| if __name__ == "__main__": |
| demo.launch(css=custom_css) |