File size: 5,016 Bytes
15c06cc
0c5a382
 
919ef54
 
 
15c06cc
1149742
15c06cc
0c5a382
 
 
15c06cc
 
919ef54
 
 
 
1149742
0c5a382
1149742
 
 
 
919ef54
0c5a382
919ef54
1149742
0c5a382
 
 
1149742
0c5a382
1149742
 
 
 
919ef54
0c5a382
919ef54
1149742
0c5a382
 
 
1149742
0c5a382
 
 
 
 
 
1149742
 
0c5a382
1149742
0c5a382
919ef54
1149742
 
 
 
 
919ef54
1149742
 
919ef54
0c5a382
1149742
 
919ef54
1149742
919ef54
1149742
 
0c5a382
1149742
 
 
 
 
 
 
 
 
 
 
 
0c5a382
1149742
0c5a382
1149742
0c5a382
 
 
 
 
1149742
0c5a382
1149742
0c5a382
 
 
 
 
 
 
 
1149742
 
 
0c5a382
1149742
 
 
 
0c5a382
 
919ef54
0c5a382
 
 
 
 
 
 
 
919ef54
0c5a382
1149742
 
 
 
0c5a382
 
1149742
0c5a382
919ef54
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
import gradio as gr
import tempfile
import imageio
import torch
from transformers import pipeline
from diffusers import DiffusionPipeline

# ---------- Configuration ----------
AVAILABLE_MODELS = {
    "GPT-2 (small, fast)": "gpt2",
    "Falcon (TII UAE)": "tiiuae/falcon-7b-instruct",
    "Mistral (OpenAccess)": "mistralai/Mistral-7B-v0.1"
}

device = "cuda" if torch.cuda.is_available() else "cpu"
text_model_cache = {}
chat_memory = {}

# ---------- Load Image Generator ----------
try:
    image_generator = DiffusionPipeline.from_pretrained(
        "runwayml/stable-diffusion-v1-5",
        torch_dtype=torch.float16 if device == "cuda" else torch.float32
    )
    image_generator.to(device)
    image_enabled = True
except Exception as e:
    print(f"[Image Model Load Error]: {e}")
    image_generator = None
    image_enabled = False

# ---------- Load Video Generator ----------
try:
    video_pipeline = DiffusionPipeline.from_pretrained(
        "damo-vilab/text-to-video-ms-1.7b",
        torch_dtype=torch.float16 if device == "cuda" else torch.float32
    )
    video_pipeline.to(device)
    video_enabled = True
except Exception as e:
    print(f"[Video Model Load Error]: {e}")
    video_pipeline = None
    video_enabled = False

# ---------- Streamed Response Generator ----------
def codette_terminal(prompt, model_name, generate_image, generate_video, session_id):
    if session_id not in chat_memory:
        chat_memory[session_id] = []

    if prompt.lower() in ["exit", "quit"]:
        chat_memory[session_id] = []
        yield "🧠 Codette signing off... Session reset.", None, None
        return

    # Load text model if not already loaded
    if model_name not in text_model_cache:
        try:
            text_model_cache[model_name] = pipeline(
                "text-generation",
                model=AVAILABLE_MODELS[model_name],
                device=0 if device == "cuda" else -1
            )
        except Exception as e:
            yield f"[Text model error]: {e}", None, None
            return

    generator = text_model_cache[model_name]

    # Generate response
    try:
        output = generator(prompt, max_length=100, do_sample=True, num_return_sequences=1)[0]['generated_text'].strip()
    except Exception as e:
        yield f"[Text generation error]: {e}", None, None
        return

    # Stream the output character by character
    response_so_far = ""
    for char in output:
        response_so_far += char
        temp_log = chat_memory[session_id][:]
        temp_log.append(f"πŸ–‹οΈ You > {prompt}")
        temp_log.append(f"🧠 Codette > {response_so_far}")
        yield "\n".join(temp_log[-10:]), None, None
        import time
        time.sleep(0.01)

    # Finalize chat memory
    chat_memory[session_id].append(f"πŸ–‹οΈ You > {prompt}")
    chat_memory[session_id].append(f"🧠 Codette > {output}")

    # Image Generation
    img = None
    if generate_image and image_enabled:
        try:
            img = image_generator(prompt).images[0]
        except Exception as e:
            response_so_far += f"\n[Image error]: {e}"

    # Video Generation
    vid = None
    if generate_video and video_enabled:
        try:
            video_frames = video_pipeline(prompt, num_inference_steps=50).frames
            temp_video_path = tempfile.NamedTemporaryFile(suffix=".mp4", delete=False).name
            imageio.mimsave(temp_video_path, video_frames, fps=8)
            vid = temp_video_path
        except Exception as e:
            response_so_far += f"\n[Video error]: {e}"

    yield "\n".join(chat_memory[session_id][-10:]), img, vid

# ---------- Gradio UI ----------
with gr.Blocks(title="🧬 Codette Terminal – Streamed AI Chat") as demo:
    gr.Markdown("## 🧬 Codette Terminal (Chat + Image + Video)")
    gr.Markdown("Type a prompt and select your model. Enable image or video generation if you like. Type `'exit'` to reset.")

    session_id = gr.Textbox(value="session_default", visible=False)
    model_dropdown = gr.Dropdown(choices=list(AVAILABLE_MODELS.keys()), value="GPT-2 (small, fast)", label="Choose a Language Model")
    generate_image_toggle = gr.Checkbox(label="Also generate image?", value=False, interactive=image_enabled)
    generate_video_toggle = gr.Checkbox(label="Also generate video?", value=False, interactive=video_enabled)
    user_input = gr.Textbox(label="Your Prompt", placeholder="e.g. A robot dreaming on Mars", lines=1)
    output_text = gr.Textbox(label="Codette Output", lines=15, interactive=False)
    output_image = gr.Image(label="Generated Image")
    output_video = gr.Video(label="Generated Video")

    user_input.submit(
        codette_terminal,
        inputs=[user_input, model_dropdown, generate_image_toggle, generate_video_toggle, session_id],
        outputs=[output_text, output_image, output_video],
        concurrency_limit=1,
        queue=True,
        show_progress=True
    )

# ---------- Launch ----------
if __name__ == "__main__":
    demo.launch()