File size: 3,072 Bytes
724c738
b2f7196
 
 
 
724c738
b2f7196
 
 
 
724c738
b2f7196
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
724c738
b2f7196
 
 
 
724c738
 
 
 
 
 
 
 
 
 
b2f7196
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
724c738
b2f7196
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
724c738
 
 
b2f7196
 
 
f5bbd44
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
import os
from typing import Any, List, Tuple

import gradio as gr

from config import MEMORY_FILE
from sidekick import Sidekick


async def setup() -> Sidekick:
    sidekick = Sidekick(memory_file=MEMORY_FILE)
    await sidekick.setup()
    return sidekick


async def process_message(
    sidekick: Sidekick, message: str, success_criteria: str, history: List[Any]
) -> Tuple[List[Any], Sidekick]:
    results = await sidekick.run_superstep(message, success_criteria, history)
    return results, sidekick


async def reset(sidekick: Sidekick) -> Tuple[str, str, None, Sidekick]:
    """Reset the UI and create a fresh Sidekick, cleaning up the existing one if present."""
    try:
        if sidekick:
            sidekick.free_resources()
    except Exception:
        pass  # Ignore cleanup failures during reset

    new_sidekick = Sidekick(memory_file=MEMORY_FILE)
    await new_sidekick.setup()
    return "", "", None, new_sidekick


async def clear_memory(sidekick: Sidekick) -> Tuple[str, str, None, Sidekick]:
    """Delete the persistent memory file."""
    try:
        os.remove(MEMORY_FILE)
    except FileNotFoundError:
        pass

    return await reset(sidekick)


def free_resources(sidekick: Sidekick) -> None:
    try:
        if sidekick:
            sidekick.free_resources()
    except Exception as e:
        print(f"Exception during cleanup: {e}")


with gr.Blocks(title="Sidekick", theme=gr.themes.Default(primary_hue="emerald")) as ui:
    gr.Markdown("## Sidekick Personal Co-Worker")
    sidekick = gr.State(delete_callback=free_resources)

    # Chatbot section
    with gr.Row():
        chatbot = gr.Chatbot(
            label="Sidekick", height=300, type="messages", resizable=True
        )

    # Input section
    with gr.Group():
        with gr.Row():
            message = gr.Textbox(
                show_label=False, placeholder="Your request to the Sidekick"
            )
        with gr.Row():
            success_criteria = gr.Textbox(
                show_label=False, placeholder="What are your success criteria?"
            )

    # Buttons section
    with gr.Row():
        reset_button = gr.Button("Reset", variant="stop")
        go_button = gr.Button("Go!", variant="primary")
        clear_memory_button = gr.Button("Clear Memory", variant="secondary")

    ui.load(setup, [], [sidekick])
    message.submit(
        process_message,
        [sidekick, message, success_criteria, chatbot],
        [chatbot, sidekick],
    )
    success_criteria.submit(
        process_message,
        [sidekick, message, success_criteria, chatbot],
        [chatbot, sidekick],
    )
    go_button.click(
        process_message,
        [sidekick, message, success_criteria, chatbot],
        [chatbot, sidekick],
    )
    reset_button.click(
        reset, [sidekick], [message, success_criteria, chatbot, sidekick]
    )
    clear_memory_button.click(
        clear_memory, [sidekick], [message, success_criteria, chatbot, sidekick]
    )


if __name__ == "__main__":
    ui.launch(server_name="0.0.0.0", server_port=7860)