33from prompt import *
44from models import *
55from 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 *
89import 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)
0 commit comments