Verify image recognition only at launch
This commit is contained in:
parent
ed440d8935
commit
df568c7217
@ -52,6 +52,23 @@ class model_selector_popup(Gtk.Popover):
|
|||||||
child=scroller
|
child=scroller
|
||||||
)
|
)
|
||||||
|
|
||||||
|
class model_selector_row(Gtk.ListBoxRow):
|
||||||
|
__gtype_name__ = 'AlpacaModelSelectorRow'
|
||||||
|
|
||||||
|
def __init__(self, model_name:str, image_recognition:bool):
|
||||||
|
super().__init__(
|
||||||
|
child = Gtk.Label(
|
||||||
|
label=window.convert_model_name(model_name, 0),
|
||||||
|
halign=1,
|
||||||
|
hexpand=True
|
||||||
|
),
|
||||||
|
halign=0,
|
||||||
|
hexpand=True,
|
||||||
|
name=model_name,
|
||||||
|
tooltip_text=window.convert_model_name(model_name, 0)
|
||||||
|
)
|
||||||
|
self.image_recognition = image_recognition
|
||||||
|
|
||||||
class model_selector_button(Gtk.MenuButton):
|
class model_selector_button(Gtk.MenuButton):
|
||||||
__gtype_name__ = 'AlpacaModelSelectorButton'
|
__gtype_name__ = 'AlpacaModelSelectorButton'
|
||||||
|
|
||||||
@ -91,19 +108,18 @@ 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):
|
||||||
model_row = Gtk.ListBoxRow(
|
vision = False
|
||||||
child = Gtk.Label(
|
response = window.ollama_instance.request("POST", "api/show", json.dumps({"name": model_name}))
|
||||||
label=window.convert_model_name(model_name, 0),
|
if response.status_code != 200:
|
||||||
halign=1,
|
logger.error(f"Status code was {response.status_code}")
|
||||||
hexpand=True
|
return
|
||||||
),
|
try:
|
||||||
halign=0,
|
vision = 'projector_info' in json.loads(response.text)
|
||||||
hexpand=True,
|
except Exception as e:
|
||||||
name=model_name,
|
logger.error(f"Error fetching vision info: {str(e)}")
|
||||||
tooltip_text=window.convert_model_name(model_name, 0)
|
model_row = model_selector_row(model_name, vision)
|
||||||
)
|
GLib.idle_add(self.get_popover().model_list_box.append, model_row)
|
||||||
self.get_popover().model_list_box.append(model_row)
|
GLib.idle_add(self.change_model, model_name)
|
||||||
self.change_model(model_name)
|
|
||||||
|
|
||||||
def remove_model(self, model_name:str):
|
def remove_model(self, model_name:str):
|
||||||
self.get_popover().model_list_box.remove(next((model for model in list(self.get_popover().model_list_box) if model.get_name() == model_name), None))
|
self.get_popover().model_list_box.remove(next((model for model in list(self.get_popover().model_list_box) if model.get_name() == model_name), None))
|
||||||
@ -273,7 +289,7 @@ class local_model_list(Gtk.ListBox):
|
|||||||
|
|
||||||
def add_model(self, model_name:str):
|
def add_model(self, model_name:str):
|
||||||
model = local_model(model_name)
|
model = local_model(model_name)
|
||||||
self.append(model)
|
GLib.idle_add(self.append, model)
|
||||||
if not self.get_visible():
|
if not self.get_visible():
|
||||||
self.set_visible(True)
|
self.set_visible(True)
|
||||||
|
|
||||||
@ -466,7 +482,7 @@ class model_manager_container(Gtk.Box):
|
|||||||
else:
|
else:
|
||||||
self.local_list.set_visible(True)
|
self.local_list.set_visible(True)
|
||||||
for model in data['models']:
|
for model in data['models']:
|
||||||
self.add_local_model(model['name'])
|
threading.Thread(target=self.add_local_model, args=(model['name'], )).start()
|
||||||
else:
|
else:
|
||||||
window.connection_error()
|
window.connection_error()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@ -484,48 +500,18 @@ class model_manager_container(Gtk.Box):
|
|||||||
def change_model(self, model_name:str):
|
def change_model(self, model_name:str):
|
||||||
self.model_selector.change_model(model_name)
|
self.model_selector.change_model(model_name)
|
||||||
|
|
||||||
def has_vision(self, model_name) -> bool:
|
|
||||||
response = (
|
|
||||||
window.ollama_instance.request(
|
|
||||||
"POST", "api/show", json.dumps({"name": model_name})
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
if response.status_code != 200:
|
|
||||||
logger.error(f"Status code was {response.status_code}")
|
|
||||||
return False
|
|
||||||
|
|
||||||
try:
|
|
||||||
model_info = json.loads(response.text)
|
|
||||||
logger.debug(f"Vision for {model_name}: {'projector_info' in model_info}")
|
|
||||||
return 'projector_info' in model_info
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(f"Error fetching vision info: {str(e)}")
|
|
||||||
return False
|
|
||||||
|
|
||||||
def verify_if_image_can_be_used(self):
|
def verify_if_image_can_be_used(self):
|
||||||
logger.debug("Verifying if image can be used")
|
logger.debug("Verifying if image can be used")
|
||||||
selected = self.get_selected_model()
|
selected = self.model_selector.get_popover().model_list_box.get_selected_row()
|
||||||
if selected == None:
|
if selected and selected.image_recognition:
|
||||||
return False
|
|
||||||
|
|
||||||
# first try ollama show API.
|
|
||||||
if self.has_vision(selected):
|
|
||||||
return True
|
|
||||||
|
|
||||||
# then fall back to the old method.)
|
|
||||||
|
|
||||||
selected = selected.split(":")[0]
|
|
||||||
with open(os.path.join(source_dir, 'available_models.json'), 'r', encoding="utf-8") as f:
|
|
||||||
if selected in [key for key, value in json.load(f).items() if value["image"]]:
|
|
||||||
for name, content in window.attachments.items():
|
for name, content in window.attachments.items():
|
||||||
if content['type'] == 'image':
|
if content['type'] == 'image':
|
||||||
content['button'].set_css_classes(["flat"])
|
content['button'].set_css_classes(["flat"])
|
||||||
return True
|
return True
|
||||||
|
elif selected:
|
||||||
for name, content in window.attachments.items():
|
for name, content in window.attachments.items():
|
||||||
if content['type'] == 'image':
|
if content['type'] == 'image':
|
||||||
content['button'].set_css_classes(["flat", "error"])
|
content['button'].set_css_classes(["flat", "error"])
|
||||||
return False
|
|
||||||
|
|
||||||
def pull_model(self, model_name:str, modelfile:str=None):
|
def pull_model(self, model_name:str, modelfile:str=None):
|
||||||
if ':' not in model_name:
|
if ':' not in model_name:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user