Skip to content

Commit e98864b

Browse files
committed
more tweaks to views, appbar & session state support
1 parent 68213a8 commit e98864b

File tree

5 files changed

+197
-79
lines changed

5 files changed

+197
-79
lines changed

assets/logos/mlx.png

12.3 KB
Loading

assets/logos/ollama.png

40.8 KB
Loading

main.py

Lines changed: 61 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33
from prompt import *
44
from models import *
55
from utils import Avatar, Message
6-
from settings import settingsView
7-
from history import historyView
6+
from model_hub import *
7+
from settings import *
8+
from history import *
89
import time
910

1011

@@ -26,6 +27,11 @@ def main(page: ft.Page) -> None:
2627
"CabinSketch-Regular" : "fonts/CabinSketch-Regular.ttf"
2728
}
2829

30+
#initialize page state
31+
page.session.set('selected_model', 'N/A')
32+
page.session.set('selected_temp', 0.0)
33+
page.session.set('isMlx', False)
34+
2935
banner_image = ft.Image(src=f"logos/pyollama_1.png",
3036
width=75,
3137
height=75,
@@ -37,14 +43,14 @@ def main(page: ft.Page) -> None:
3743
alignment=ft.MainAxisAlignment.CENTER,
3844
horizontal_alignment=ft.CrossAxisAlignment.START,
3945
scroll=ft.ScrollMode.ADAPTIVE,
40-
height=350,
46+
height=450,
4147
width=695,
4248
)
4349
search_messages = ft.Column(
4450
alignment=ft.MainAxisAlignment.CENTER,
4551
horizontal_alignment=ft.CrossAxisAlignment.START,
4652
scroll=ft.ScrollMode.ADAPTIVE,
47-
height=350,
53+
height=450,
4854
width=695,
4955
)
5056
tabs = ft.Tabs(
@@ -62,7 +68,7 @@ def main(page: ft.Page) -> None:
6268
content = search_messages
6369
),
6470
],
65-
height=450,
71+
height=488,
6672
width=700,
6773
scrollable=True,
6874
)
@@ -94,17 +100,31 @@ def main(page: ft.Page) -> None:
94100
temp_value_label = ft.Text(value=temp_slider.value)
95101
model_help_text = ft.Text('^Ollama models are loaded by default', style=ft.TextStyle(size=10), text_align=ft.TextAlign.LEFT)
96102

103+
# BottomBar
104+
selected_model = ft.Text('None', style=ft.TextStyle(size=15))
105+
selected_temp = ft.Text('N/A', style=ft.TextStyle(size=15))
106+
selected_model_image = ft.Image(src='logos/combined_logos.png', width=35, height=35)
107+
bottom_control = ft.Row([
108+
ft.Text('Model Selected: ', style=ft.TextStyle(size=15)),
109+
selected_model,
110+
selected_model_image,
111+
ft.Text('Temperature: ', style=ft.TextStyle(size=15)),
112+
selected_temp
113+
], alignment=ft.MainAxisAlignment.START, vertical_alignment=ft.CrossAxisAlignment.CENTER)
114+
bottom_appbar = ft.BottomAppBar(content=bottom_control)
115+
97116
def open_url(e):
98117
page.launch_url(e.data)
99118

100-
def updateChat(message: Message = None, ai_response: bool = False, controlHandle: ft.Column = None):
119+
def updateChat(message: Message, controlHandle: ft.Column, ai_response: bool = False):
120+
#print(f'message {message} ai_response {ai_response} controlHandle {controlHandle}')
101121
if ai_response:
102122
ai_message_container = ft.Container(width=550)
103123
ai_message_md = ft.Markdown(value="", extension_set="gitHubWeb", code_theme='obsidian', code_style=ft.TextStyle(font_family='Roboto Mono'),selectable=True, on_tap_link=open_url, auto_follow_links=True)
104124
ai_message_container.content = ai_message_md
105125
controlHandle.controls.append(
106126
ft.Row([
107-
ft.Image(src=getAILogo(select_mlX_models.value),
127+
ft.Image(src=getAILogo(page.session.get('isMlx')),
108128
width=50,
109129
height=50,
110130
fit=ft.ImageFit.CONTAIN),
@@ -118,7 +138,7 @@ def updateChat(message: Message = None, ai_response: bool = False, controlHandle
118138
for chunk in message.text.split(sep=" "):
119139
full_r += chunk + " "
120140
ai_message_md.value = full_r
121-
controlHandle.scroll_to(offset=-1, duration=100, curve=ft.AnimationCurve.EASE_IN_OUT)
141+
# controlHandle.scroll_to(offset=-1, duration=100, curve=ft.AnimationCurve.EASE_IN_OUT)
122142
page.update()
123143
time.sleep(0.05)
124144
else:
@@ -136,12 +156,15 @@ def updateChat(message: Message = None, ai_response: bool = False, controlHandle
136156
width=500
137157
)
138158
)
139-
controlHandle.scroll_to(offset=-1, duration=100, curve=ft.AnimationCurve.EASE_IN_OUT)
159+
#controlHandle.scroll_to(offset=-1, duration=100, curve=ft.AnimationCurve.EASE_IN_OUT)
140160
page.update()
141161

142-
def getAILogo(isMlx: bool):
162+
def getAILogo(isMlx: bool) -> str:
143163
return f'logos/mlx_logo.png' if isMlx else f'logos/pyollama_1.png'
144164

165+
def getBottomBarModelLogo(isMlx: bool) -> str:
166+
return f'logos/mlx.png' if isMlx else f'logos/ollama.png'
167+
145168
def show_spinning():
146169
pr_ph.value='Working...🏃🏻‍♂️⏳'
147170
pr.value = None
@@ -165,16 +188,16 @@ def send(e: ControlEvent) -> None:
165188
updateChat(Message(user='user', text=prompt), controlHandle=ctrlHandle, ai_response=False)
166189
user_text_field.value = ""
167190
show_spinning()
168-
isMlx = select_mlX_models.value
169-
res, keys = firePrompt(prompt=prompt, model=model_dropdown.value, temp=temp_slider.value, isMlx=isMlx, chat_mode=isChat)
191+
isMlx = page.session.get('isMlx')
192+
res, keys = firePrompt(prompt=prompt, model=page.session.get('selected_model'), temp=page.session.get('selected_temp'), isMlx=isMlx, chat_mode=isChat)
170193
if keys != "":
171194
res = res + f'\n\n Keywords used for search : {keys} '
172195
updateChat(Message(user='assistant', text=res), controlHandle=ctrlHandle, ai_response=True)
173196
end_spinning()
174197
page.update()
175198

176199
def enableSend(e: ControlEvent) -> None:
177-
if user_text_field.value != "" and model_dropdown.value != "unselected":
200+
if user_text_field.value != "" and page.session.get('selected_model') != "N/A":
178201
send_button.disabled = False
179202
clear_button.disabled = False
180203
page.update()
@@ -200,14 +223,17 @@ def clear(e: ControlEvent) -> None:
200223
clearSearchHistory()
201224
page.update()
202225

226+
def showModelSettings(e: ControlEvent) -> None:
227+
page.go('/settings')
228+
203229
def toggleTheme(e: ControlEvent) -> None:
204230
icon : ft.IconButton = e.control
205231
if icon.icon == ft.icons.DARK_MODE_SHARP:
206232
page.theme_mode = "light"
207233
icon.icon = ft.icons.DARK_MODE_OUTLINED
208234
user_text_field.border_color = 'black'
209235
else:
210-
icon.icon == ft.icons.DARK_MODE_OUTLINED
236+
#icon.icon == ft.icons.DARK_MODE_OUTLINED
211237
page.theme_mode = "dark"
212238
icon.icon = ft.icons.DARK_MODE_SHARP
213239
user_text_field.border_color = 'white'
@@ -218,8 +244,8 @@ def view_pop(view):
218244
top_view = page.views[-1]
219245
page.go(top_view.route)
220246

221-
def showSettings(e: ControlEvent):
222-
page.go('/settings')
247+
def showModelHub(e: ControlEvent):
248+
page.go('/model_hub')
223249

224250
def showHistory(e: ControlEvent):
225251
page.go('/history')
@@ -264,12 +290,13 @@ def showHistory(e: ControlEvent):
264290
], vertical_alignment=ft.CrossAxisAlignment.CENTER, alignment=ft.MainAxisAlignment.SPACE_AROUND)
265291

266292
top_banner_view = ft.Row([
293+
ft.IconButton(ft.icons.SETTINGS, on_click=showModelSettings, tooltip='Expand Model Settings'),
267294
ft.Container(),
268295
ft.Row([ft.Column([ft.Row([banner_image, banner_text]), subbanner_text], alignment=ft.MainAxisAlignment.CENTER, horizontal_alignment=ft.CrossAxisAlignment.CENTER)], alignment=ft.MainAxisAlignment.CENTER),
269296
ft.Row([
270-
ft.IconButton(ft.icons.DARK_MODE_SHARP, icon_size=15, on_click=toggleTheme, tooltip='Toggle Dark Mode'),
271-
ft.IconButton(ft.icons.SETTINGS, icon_size=15, on_click=showSettings, tooltip='Model Settings'),
272-
ft.IconButton(ft.icons.HISTORY, icon_size=15, on_click=showHistory, tooltip='Conversation History'),
297+
ft.IconButton(ft.icons.DARK_MODE_SHARP, on_click=toggleTheme, tooltip='Toggle Dark Mode'),
298+
ft.IconButton(ft.icons.INSTALL_DESKTOP, on_click=showModelHub, tooltip='Download Models'),
299+
ft.IconButton(ft.icons.HISTORY, on_click=showHistory, tooltip='Conversation History'),
273300
ft.PopupMenuButton()
274301
], alignment="spacearound"),
275302
], alignment="spacebetween")
@@ -283,19 +310,30 @@ def route_change(e: ft.RouteChangeEvent) -> None:
283310
route = "/",
284311
controls=[
285312
top_banner_view,
286-
controls_view,
313+
#controls_view,
287314
tabs,
288315
spinner_view,
289316
user_input_view,
290317
#enable_streaming,
291318
],
292319
auto_scroll=True,
293-
scroll=ft.ScrollMode.ADAPTIVE
320+
scroll=ft.ScrollMode.ADAPTIVE,
321+
bottom_appbar=bottom_appbar,
294322
)
295323
)
296324

325+
if page.route == "/":
326+
selected_model.value = page.session.get('selected_model')
327+
selected_temp.value = page.session.get('selected_temp')
328+
selected_model_image.src = getBottomBarModelLogo(page.session.get('isMlx'))
329+
banner_image.src = getAILogo(page.session.get('isMlx'))
330+
331+
297332
if page.route == "/settings":
298-
page.views.append(settingsView(page.theme_mode))
333+
page.views.append(settingsView(page))
334+
335+
if page.route == "/model_hub":
336+
page.views.append(modelHubView(page.theme_mode))
299337

300338
if page.route == "/history":
301339
page.views.append(historyView(page.theme_mode))
@@ -304,6 +342,7 @@ def route_change(e: ft.RouteChangeEvent) -> None:
304342

305343
page.on_route_change = route_change
306344
page.on_view_pop = view_pop
345+
#page.overlay.append(controls_bottom_sheet)
307346
page.go(page.route)
308347

309348
#page.add(top_banner_view)

model_hub.py

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
import flet as ft
2+
3+
settings_banner_text = ft.Text(value='Download Models', style=ft.TextStyle(font_family='CabinSketch-Bold'), size=30)
4+
settings_banner_image = ft.Image(src=f"logos/combined_logos.png",
5+
width=75,
6+
height=75,
7+
fit=ft.ImageFit.CONTAIN,
8+
)
9+
10+
settings_banner_view = ft.Row([
11+
settings_banner_image,
12+
settings_banner_text
13+
], alignment=ft.MainAxisAlignment.CENTER, vertical_alignment=ft.CrossAxisAlignment.CENTER)
14+
15+
ollama_download_text = ft.Text('Download Ollama Model from ollama.ai')
16+
ollama_download_textField = ft.TextField(width=500, height=50)
17+
ollama_download_button = ft.IconButton(ft.icons.DOWNLOAD)
18+
19+
mlx_download_text = ft.Text('Download MlX Model from 🤗')
20+
mlx_download_textField = ft.TextField(width=500, height=50)
21+
mlx_download_button = ft.IconButton(ft.icons.DOWNLOAD)
22+
23+
ollama_control = ft.Column([
24+
ollama_download_text,
25+
ft.Row([
26+
ollama_download_textField,
27+
ollama_download_button,
28+
]),
29+
], alignment=ft.MainAxisAlignment.CENTER, horizontal_alignment=ft.CrossAxisAlignment.CENTER)
30+
31+
mlx_control = ft.Column([
32+
mlx_download_text,
33+
ft.Row([
34+
mlx_download_textField,
35+
mlx_download_button,
36+
]),
37+
], alignment=ft.MainAxisAlignment.CENTER, horizontal_alignment=ft.CrossAxisAlignment.CENTER)
38+
39+
40+
model_tabs = ft.Tabs(
41+
selected_index=0,
42+
animation_duration=300,
43+
tabs=[
44+
ft.Tab(
45+
text="Ollama Models 🦙",
46+
content = ollama_control,
47+
),
48+
ft.Tab(
49+
text="Mlx Models 🤗",
50+
content = mlx_control
51+
),
52+
],
53+
height=490,
54+
width=700,
55+
scrollable=True,
56+
)
57+
58+
def modelHubView(theme: str) -> ft.View:
59+
if theme == 'dark':
60+
ollama_download_textField.border_color="white"
61+
mlx_download_textField.border_color="white"
62+
else:
63+
ollama_download_textField.border_color="black"
64+
mlx_download_textField.border_color="black"
65+
66+
return ft.View(
67+
"/model_hub",
68+
controls = [
69+
ft.AppBar(title=""),
70+
settings_banner_view,
71+
model_tabs
72+
]
73+
)

0 commit comments

Comments
 (0)