File size: 2,520 Bytes
3d1ce05
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a9deb6d
3d1ce05
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a9deb6d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3d1ce05
 
 
 
 
 
 
 
 
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
# ui/workspace.py
import gradio as gr

from ui.agent import respond
from ui.agent.system_prompt import BORDERLESS_SYSTEM_PROMPT
from ui.chat.defaults import DEFAULT_MAX_TOKENS, DEFAULT_TEMPERATURE, DEFAULT_TOP_P
from ui.chat.panel import SidebarChatInterface
from ui.globe import render_globe_panel
from ui.globe_commands import empty_globe_state
from ui.intake import render_intake_panel


def create_main_workspace(
    history_container: gr.Column | None = None,
) -> gr.ChatInterface:
    """
    Compose the main workspace: globe panel, intake form, and chat.
    """
    globe_state = gr.JSON(value=empty_globe_state(), visible=False, elem_id="globe-state")
    chat_input = gr.MultimodalTextbox(
        show_label=False,
        placeholder="Create a prompt from the form, choose a demo, or type directly...",
        file_count="multiple",
        sources=["upload"],
        lines=3,
        max_lines=12,
        elem_classes=["borderless-chat-input"],
        render=False,
    )

    with gr.Row(elem_classes=["borderless-main-workspace"], equal_height=True):
        with gr.Column(
            scale=7,
            min_width=520,
            elem_classes=["borderless-center-panel"],
        ):
            globe_column = gr.Column(elem_classes=["globe-column"])
            with globe_column:
                render_globe_panel(height="70vh")

        with gr.Column(
            scale=4,
            min_width=360,
            elem_classes=["borderless-chat-panel"],
        ):
            render_intake_panel(chat_input)
            chat = SidebarChatInterface(
                respond,
                multimodal=True,
                chatbot=gr.Chatbot(
                    show_label=False,
                    container=False,
                    elem_classes=["borderless-chatbot"],
                ),
                textbox=chat_input,
                history_container=history_container,
                fill_height=True,
                additional_inputs=[
                    gr.State(BORDERLESS_SYSTEM_PROMPT),
                    gr.State(DEFAULT_MAX_TOKENS),
                    gr.State(DEFAULT_TEMPERATURE),
                    gr.State(DEFAULT_TOP_P),
                    globe_state,
                ],
                additional_outputs=[globe_state],
            )

    globe_state.change(
        fn=None,
        inputs=[globe_state],
        outputs=[],
        js="(state) => { window.BorderlessGlobe?.applyState(state); return []; }",
        queue=False,
    )
    return chat