New 'model details' page
This commit is contained in:
		
							parent
							
								
									5462248565
								
							
						
					
					
						commit
						150e8779c7
					
				| @ -33,6 +33,7 @@ | |||||||
|     <file alias="icons/scalable/status/chat-bubble-text-symbolic.svg">icons/chat-bubble-text-symbolic.svg</file> |     <file alias="icons/scalable/status/chat-bubble-text-symbolic.svg">icons/chat-bubble-text-symbolic.svg</file> | ||||||
|     <file alias="icons/scalable/status/execute-from-symbolic.svg">icons/execute-from-symbolic.svg</file> |     <file alias="icons/scalable/status/execute-from-symbolic.svg">icons/execute-from-symbolic.svg</file> | ||||||
|     <file alias="icons/scalable/status/cross-large-symbolic.svg">icons/cross-large-symbolic.svg</file> |     <file alias="icons/scalable/status/cross-large-symbolic.svg">icons/cross-large-symbolic.svg</file> | ||||||
|  |     <file alias="icons/scalable/status/info-outline-symbolic.svg">icons/info-outline-symbolic.svg</file> | ||||||
|     <file preprocess="xml-stripblanks">window.ui</file> |     <file preprocess="xml-stripblanks">window.ui</file> | ||||||
|     <file preprocess="xml-stripblanks">gtk/help-overlay.ui</file> |     <file preprocess="xml-stripblanks">gtk/help-overlay.ui</file> | ||||||
|   </gresource> |   </gresource> | ||||||
|  | |||||||
| @ -56,7 +56,7 @@ class model_selector_popup(Gtk.Popover): | |||||||
| class model_selector_row(Gtk.ListBoxRow): | class model_selector_row(Gtk.ListBoxRow): | ||||||
|     __gtype_name__ = 'AlpacaModelSelectorRow' |     __gtype_name__ = 'AlpacaModelSelectorRow' | ||||||
| 
 | 
 | ||||||
|     def __init__(self, model_name:str, image_recognition:bool): |     def __init__(self, model_name:str, data:dict): | ||||||
|         super().__init__( |         super().__init__( | ||||||
|             child = Gtk.Label( |             child = Gtk.Label( | ||||||
|                 label=window.convert_model_name(model_name, 0), |                 label=window.convert_model_name(model_name, 0), | ||||||
| @ -68,7 +68,8 @@ class model_selector_row(Gtk.ListBoxRow): | |||||||
|             name=model_name, |             name=model_name, | ||||||
|             tooltip_text=window.convert_model_name(model_name, 0) |             tooltip_text=window.convert_model_name(model_name, 0) | ||||||
|         ) |         ) | ||||||
|         self.image_recognition = image_recognition |         self.data = data | ||||||
|  |         self.image_recognition = 'projector_info' in self.data | ||||||
| 
 | 
 | ||||||
| class model_selector_button(Gtk.MenuButton): | class model_selector_button(Gtk.MenuButton): | ||||||
|     __gtype_name__ = 'AlpacaModelSelectorButton' |     __gtype_name__ = 'AlpacaModelSelectorButton' | ||||||
| @ -109,16 +110,16 @@ class model_selector_button(Gtk.MenuButton): | |||||||
|         window.model_manager.verify_if_image_can_be_used() |         window.model_manager.verify_if_image_can_be_used() | ||||||
| 
 | 
 | ||||||
|     def add_model(self, model_name:str): |     def add_model(self, model_name:str): | ||||||
|         vision = False |         data = None | ||||||
|         response = window.ollama_instance.request("POST", "api/show", json.dumps({"name": model_name})) |         response = window.ollama_instance.request("POST", "api/show", json.dumps({"name": model_name})) | ||||||
|         if response.status_code != 200: |         if response.status_code != 200: | ||||||
|             logger.error(f"Status code was {response.status_code}") |             logger.error(f"Status code was {response.status_code}") | ||||||
|             return |             return | ||||||
|         try: |         try: | ||||||
|             vision = 'projector_info' in json.loads(response.text) |             data = json.loads(response.text) | ||||||
|         except Exception as e: |         except Exception as e: | ||||||
|             logger.error(f"Error fetching vision info: {str(e)}") |             logger.error(f"Error fetching 'api - show' info: {str(e)}") | ||||||
|         model_row = model_selector_row(model_name, vision) |         model_row = model_selector_row(model_name, data) | ||||||
|         GLib.idle_add(self.get_popover().model_list_box.append, model_row) |         GLib.idle_add(self.get_popover().model_list_box.append, model_row) | ||||||
|         GLib.idle_add(self.change_model, model_name) |         GLib.idle_add(self.change_model, model_name) | ||||||
| 
 | 
 | ||||||
| @ -248,6 +249,37 @@ class pulling_model_list(Gtk.ListBox): | |||||||
|             visible=False |             visible=False | ||||||
|         ) |         ) | ||||||
| 
 | 
 | ||||||
|  | class information_bow(Gtk.Box): | ||||||
|  |     __gtype_name__ = 'AlpacaModelInformationBow' | ||||||
|  | 
 | ||||||
|  |     def __init__(self, title:str, subtitle:str): | ||||||
|  |         self.title = title | ||||||
|  |         self.subtitle = subtitle | ||||||
|  |         title_label = Gtk.Label( | ||||||
|  |             label=self.title, | ||||||
|  |             css_classes=['subtitle', 'caption'], | ||||||
|  |             hexpand=True, | ||||||
|  |             margin_top=10, | ||||||
|  |             margin_start=0, | ||||||
|  |             margin_end=0 | ||||||
|  |         ) | ||||||
|  |         subtitle_label = Gtk.Label( | ||||||
|  |             label=self.subtitle if self.subtitle else '(none)', | ||||||
|  |             css_classes=['heading'], | ||||||
|  |             hexpand=True, | ||||||
|  |             margin_bottom=10, | ||||||
|  |             margin_start=0, | ||||||
|  |             margin_end=0 | ||||||
|  |         ) | ||||||
|  |         super().__init__( | ||||||
|  |             spacing=5, | ||||||
|  |             orientation=1, | ||||||
|  |             css_classes=['card'] | ||||||
|  |         ) | ||||||
|  |         self.append(title_label) | ||||||
|  |         self.append(subtitle_label) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| class local_model(Gtk.ListBoxRow): | class local_model(Gtk.ListBoxRow): | ||||||
|     __gtype_name__ = 'AlpacaLocalModel' |     __gtype_name__ = 'AlpacaLocalModel' | ||||||
| 
 | 
 | ||||||
| @ -275,6 +307,16 @@ class local_model(Gtk.ListBoxRow): | |||||||
|         description_box.append(model_label) |         description_box.append(model_label) | ||||||
|         description_box.append(tag_label) |         description_box.append(tag_label) | ||||||
| 
 | 
 | ||||||
|  |         info_button = Gtk.Button( | ||||||
|  |             icon_name = "info-outline-symbolic", | ||||||
|  |             vexpand = False, | ||||||
|  |             valign = 3, | ||||||
|  |             css_classes = ["circular"], | ||||||
|  |             tooltip_text = _("Details") | ||||||
|  |         ) | ||||||
|  | 
 | ||||||
|  |         info_button.connect('clicked', self.show_information) | ||||||
|  | 
 | ||||||
|         delete_button = Gtk.Button( |         delete_button = Gtk.Button( | ||||||
|             icon_name = "user-trash-symbolic", |             icon_name = "user-trash-symbolic", | ||||||
|             vexpand = False, |             vexpand = False, | ||||||
| @ -302,6 +344,7 @@ class local_model(Gtk.ListBoxRow): | |||||||
|             margin_end=10 |             margin_end=10 | ||||||
|         ) |         ) | ||||||
|         container_box.append(description_box) |         container_box.append(description_box) | ||||||
|  |         container_box.append(info_button) | ||||||
|         container_box.append(delete_button) |         container_box.append(delete_button) | ||||||
| 
 | 
 | ||||||
|         super().__init__( |         super().__init__( | ||||||
| @ -309,6 +352,51 @@ class local_model(Gtk.ListBoxRow): | |||||||
|             name=model_name |             name=model_name | ||||||
|         ) |         ) | ||||||
| 
 | 
 | ||||||
|  |     def show_information(self, button): | ||||||
|  |         model = next((element for element in list(window.model_manager.model_selector.get_popover().model_list_box) if element.get_name() == self.get_name()), None) | ||||||
|  |         model_name = model.get_child().get_label() | ||||||
|  | 
 | ||||||
|  |         window.model_detail_page.set_title(' ('.join(model_name.split(' (')[:-1])) | ||||||
|  |         window.model_detail_page.set_description(' ('.join(model_name.split(' (')[-1:])[:-1]) | ||||||
|  | 
 | ||||||
|  |         details_flow_box = Gtk.FlowBox( | ||||||
|  |             valign=1, | ||||||
|  |             hexpand=True, | ||||||
|  |             vexpand=False, | ||||||
|  |             selection_mode=0, | ||||||
|  |             max_children_per_line=2, | ||||||
|  |             min_children_per_line=1, | ||||||
|  |             margin_top=12, | ||||||
|  |             margin_bottom=12, | ||||||
|  |             margin_start=12, | ||||||
|  |             margin_end=12 | ||||||
|  |         ) | ||||||
|  | 
 | ||||||
|  |         translation_strings={ | ||||||
|  |             'modified_at': _('Modified At'), | ||||||
|  |             'parent_model': _('Parent Model'), | ||||||
|  |             'format': _('Format'), | ||||||
|  |             'family': _('Family'), | ||||||
|  |             'parameter_size': _('Parameter Size'), | ||||||
|  |             'quantization_level': _('Quantization Level') | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if 'modified_at' in model.data and model.data['modified_at']: | ||||||
|  |             details_flow_box.append(information_bow( | ||||||
|  |                 title=translation_strings['modified_at'], | ||||||
|  |                 subtitle=datetime.datetime.strptime(':'.join(model.data['modified_at'].split(':')[:-1]), '%Y-%m-%dT%H:%M').strftime('%Y-%m-%d %H:%M') | ||||||
|  |             )) | ||||||
|  | 
 | ||||||
|  |         for name, value in model.data['details'].items(): | ||||||
|  |             if isinstance(value, str): | ||||||
|  |                 details_flow_box.append(information_bow( | ||||||
|  |                     title=translation_strings[name] if name in translation_strings else name.replace('_', ' ').title(), | ||||||
|  |                     subtitle=value | ||||||
|  |                 )) | ||||||
|  | 
 | ||||||
|  |         window.model_detail_page.set_child(details_flow_box) | ||||||
|  |         window.navigation_view_manage_models.push_by_tag('model_information') | ||||||
|  | 
 | ||||||
| class local_model_list(Gtk.ListBox): | class local_model_list(Gtk.ListBox): | ||||||
|     __gtype_name__ = 'AlpacaLocalModelList' |     __gtype_name__ = 'AlpacaLocalModelList' | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										2
									
								
								src/icons/info-outline-symbolic.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								src/icons/info-outline-symbolic.svg
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,2 @@ | |||||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||||
|  | <svg xmlns="http://www.w3.org/2000/svg" height="16px" viewBox="0 0 16 16" width="16px"><path d="m 8 0 c -4.410156 0 -8 3.589844 -8 8 s 3.589844 8 8 8 s 8 -3.589844 8 -8 s -3.589844 -8 -8 -8 z m 0 2 c 3.332031 0 6 2.667969 6 6 s -2.667969 6 -6 6 s -6 -2.667969 -6 -6 s 2.667969 -6 6 -6 z m 0 1.875 c -0.621094 0 -1.125 0.503906 -1.125 1.125 s 0.503906 1.125 1.125 1.125 s 1.125 -0.503906 1.125 -1.125 s -0.503906 -1.125 -1.125 -1.125 z m -1.523438 3.125 c -0.265624 0.011719 -0.476562 0.230469 -0.476562 0.5 c 0 0.277344 0.222656 0.5 0.5 0.5 h 0.5 v 3 h -0.5 c -0.277344 0 -0.5 0.222656 -0.5 0.5 s 0.222656 0.5 0.5 0.5 h 3 c 0.277344 0 0.5 -0.222656 0.5 -0.5 s -0.222656 -0.5 -0.5 -0.5 h -0.5 v -4 h -2.5 c -0.007812 0 -0.015625 0 -0.023438 0 z m 0 0" fill="#222222"/></svg> | ||||||
| After Width: | Height: | Size: 813 B | 
| @ -102,6 +102,7 @@ class AlpacaWindow(Adw.ApplicationWindow): | |||||||
|     title_stack = Gtk.Template.Child() |     title_stack = Gtk.Template.Child() | ||||||
|     manage_models_dialog = Gtk.Template.Child() |     manage_models_dialog = Gtk.Template.Child() | ||||||
|     model_scroller = Gtk.Template.Child() |     model_scroller = Gtk.Template.Child() | ||||||
|  |     model_detail_page = Gtk.Template.Child() | ||||||
| 
 | 
 | ||||||
|     chat_list_container = Gtk.Template.Child() |     chat_list_container = Gtk.Template.Child() | ||||||
|     chat_list_box = None |     chat_list_box = None | ||||||
| @ -607,6 +608,7 @@ Generate a title following these rules: | |||||||
|             self.chat_list_box.prepend_chat(_("New Chat")) |             self.chat_list_box.prepend_chat(_("New Chat")) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|     def generate_numbered_name(self, chat_name:str, compare_list:list) -> str: |     def generate_numbered_name(self, chat_name:str, compare_list:list) -> str: | ||||||
|         if chat_name in compare_list: |         if chat_name in compare_list: | ||||||
|             for i in range(len(compare_list)): |             for i in range(len(compare_list)): | ||||||
|  | |||||||
| @ -6,7 +6,7 @@ | |||||||
|     <signal name="close-request" handler="closing_app"/> |     <signal name="close-request" handler="closing_app"/> | ||||||
|     <property name="resizable">True</property> |     <property name="resizable">True</property> | ||||||
|     <property name="width-request">400</property> |     <property name="width-request">400</property> | ||||||
|     <property name="height-request">400</property> |     <property name="height-request">600</property> | ||||||
|     <property name="default-width">1300</property> |     <property name="default-width">1300</property> | ||||||
|     <property name="default-height">800</property> |     <property name="default-height">800</property> | ||||||
|     <property name="title">Alpaca</property> |     <property name="title">Alpaca</property> | ||||||
| @ -637,6 +637,36 @@ | |||||||
|                   </property> |                   </property> | ||||||
|                 </object> |                 </object> | ||||||
|               </child> |               </child> | ||||||
|  |               <child> | ||||||
|  |                 <object class="AdwNavigationPage"> | ||||||
|  |                   <property name="title">Model Details</property> | ||||||
|  |                   <property name="tag">model_information</property> | ||||||
|  |                   <property name="child"> | ||||||
|  |                     <object class="AdwToolbarView"> | ||||||
|  |                       <child type="top"> | ||||||
|  |                         <object class="AdwHeaderBar"> | ||||||
|  |                           <child type="start"></child> | ||||||
|  |                         </object> | ||||||
|  |                       </child> | ||||||
|  |                       <property name="content"> | ||||||
|  |                         <object class="GtkScrolledWindow"> | ||||||
|  |                           <property name="vexpand">true</property> | ||||||
|  |                           <property name="hexpand">true</property> | ||||||
|  |                           <child> | ||||||
|  |                             <object class="AdwStatusPage" id="model_detail_page"> | ||||||
|  |                               <property name="icon-name">brain-augemnted-symbolic</property> | ||||||
|  |                               <property name="description">text</property> | ||||||
|  |                               <style> | ||||||
|  |                                 <class name="compact"/> | ||||||
|  |                               </style> | ||||||
|  |                             </object> | ||||||
|  |                           </child> | ||||||
|  |                         </object> | ||||||
|  |                       </property> | ||||||
|  |                     </object> | ||||||
|  |                   </property> | ||||||
|  |                 </object> | ||||||
|  |               </child> | ||||||
|               <child> |               <child> | ||||||
|                 <object class="AdwNavigationPage"> |                 <object class="AdwNavigationPage"> | ||||||
|                   <property name="title" translatable="yes">Create Model</property> |                   <property name="title" translatable="yes">Create Model</property> | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user