From b1dd4d9174492664ac67fbe3b2df365340019c4c Mon Sep 17 00:00:00 2001 From: Hugo Saporetti Junior Date: Wed, 4 Sep 2024 15:39:58 -0300 Subject: [PATCH] Code-Reformat and optimize imports --- src/demo/__init__.py | 9 ++--- src/demo/components/__init__.py | 9 ++--- src/demo/components/vision_demo.py | 3 +- src/demo/components/webcam_demo.py | 4 +-- src/demo/features/__init__.py | 8 ++--- src/demo/features/rag/__init__.py | 6 ++-- src/demo/features/tools/__init__.py | 6 ++-- src/demo/others/__init__.py | 8 ++--- src/demo/others/vision_model_demos.py | 10 +++--- src/main/__init__.py | 6 ++-- src/main/askai/__init__.py | 9 ++--- src/main/askai/core/__init__.py | 30 ++++++++-------- src/main/askai/core/askai.py | 19 +++++----- src/main/askai/core/askai_cli.py | 3 +- src/main/askai/core/askai_configs.py | 3 +- src/main/askai/core/askai_messages.py | 6 ++-- src/main/askai/core/commander/__init__.py | 7 ++-- src/main/askai/core/commander/commander.py | 18 +++++----- .../askai/core/commander/commands/__init__.py | 11 ++---- .../core/commander/commands/camera_cmd.py | 3 +- src/main/askai/core/component/__init__.py | 20 +++++------ .../askai/core/component/cache_service.py | 19 +++++----- src/main/askai/core/component/camera.py | 24 ++++++------- src/main/askai/core/component/geo_location.py | 6 ++-- src/main/askai/core/component/image_store.py | 6 ++-- .../askai/core/component/internet_service.py | 34 +++++++++--------- src/main/askai/core/component/recorder.py | 34 +++++++++--------- src/main/askai/core/component/scheduler.py | 2 ++ src/main/askai/core/component/summarizer.py | 11 +++--- src/main/askai/core/engine/__init__.py | 10 ++---- src/main/askai/core/engine/ai_engine.py | 5 ++- src/main/askai/core/engine/ai_model.py | 1 - src/main/askai/core/engine/ai_reply.py | 1 - src/main/askai/core/engine/ai_vision.py | 3 +- src/main/askai/core/engine/engine_factory.py | 5 ++- src/main/askai/core/engine/openai/__init__.py | 9 ++--- .../askai/core/engine/openai/openai_engine.py | 32 ++++++++--------- .../askai/core/engine/openai/openai_vision.py | 35 ++++++++++--------- src/main/askai/core/enums/__init__.py | 8 ++--- src/main/askai/core/features/__init__.py | 7 ++-- .../askai/core/features/router/__init__.py | 11 ++---- .../core/features/router/model_selector.py | 7 ++-- .../core/features/router/procs/__init__.py | 9 ++--- .../askai/core/features/router/task_agent.py | 10 +++--- .../core/features/router/tools/__init__.py | 13 ++----- .../core/features/router/tools/analysis.py | 3 +- .../core/features/router/tools/generation.py | 10 +++--- .../core/features/router/tools/vision.py | 17 +++++---- .../core/features/router/tools/webcam.py | 31 ++++++++-------- .../core/features/validation/__init__.py | 6 ++-- .../core/features/validation/accuracy.py | 10 +++--- src/main/askai/core/model/__init__.py | 10 ++---- src/main/askai/core/model/api_keys.py | 11 +++--- src/main/askai/core/model/image_result.py | 6 ++-- src/main/askai/core/support/__init__.py | 18 +++++----- .../askai/core/support/langchain_support.py | 3 +- .../askai/core/support/shared_instances.py | 8 ++--- src/main/askai/core/support/utilities.py | 22 ++++++------ src/main/askai/exception/__init__.py | 6 ++-- src/main/askai/language/__init__.py | 8 ++--- src/main/askai/language/language.py | 1 - .../askai/language/translators/__init__.py | 7 ++-- src/main/askai/language/translators/deep.py | 8 ++--- src/main/askai/tui/__init__.py | 10 ++---- src/test/__init__.py | 7 ++-- src/test/core/__init__.py | 6 ++-- src/test/core/support/__init__.py | 6 ++-- 67 files changed, 299 insertions(+), 415 deletions(-) diff --git a/src/demo/__init__.py b/src/demo/__init__.py index 77b8b226..e650c81f 100644 --- a/src/demo/__init__.py +++ b/src/demo/__init__.py @@ -5,10 +5,5 @@ # Package: demo """Package initialization.""" -__all__ = [ - 'components', - 'features', - 'others', - 'utils' -] -__version__ = '1.0.13' +__all__ = ["components", "features", "others", "utils"] +__version__ = "1.0.13" diff --git a/src/demo/components/__init__.py b/src/demo/components/__init__.py index d299209c..1a0ab0a2 100644 --- a/src/demo/components/__init__.py +++ b/src/demo/components/__init__.py @@ -5,10 +5,5 @@ # Package: demo.components """Package initialization.""" -__all__ = [ - 'camera_demo', - 'internet_demo', - 'summarizer_demo', - 'webcam_demo' -] -__version__ = '1.0.13' +__all__ = ["camera_demo", "internet_demo", "summarizer_demo", "webcam_demo"] +__version__ = "1.0.13" diff --git a/src/demo/components/vision_demo.py b/src/demo/components/vision_demo.py index 3120f2f3..e15aaaa8 100644 --- a/src/demo/components/vision_demo.py +++ b/src/demo/components/vision_demo.py @@ -1,9 +1,8 @@ from askai.core.engine.ai_vision import AIVision from askai.core.support.shared_instances import shared - from utils import init_context -if __name__ == '__main__': +if __name__ == "__main__": init_context("vision-demo") vision: AIVision = shared.engine.vision() load_dir: str = "${HOME}/.config/hhs/askai/cache/pictures/photos" diff --git a/src/demo/components/webcam_demo.py b/src/demo/components/webcam_demo.py index 87ea3ca4..6be8b5dc 100644 --- a/src/demo/components/webcam_demo.py +++ b/src/demo/components/webcam_demo.py @@ -14,7 +14,6 @@ """ from askai.core.features.router.tools.webcam import webcam_capturer from hspylib.core.tools.commons import sysout - from utils import init_context if __name__ == "__main__": @@ -22,7 +21,6 @@ sysout("-=" * 40) sysout("AskAI WebCam Demo") sysout("-=" * 40) - info: str = webcam_capturer('hugo', True) + info: str = webcam_capturer("hugo", True) # info: str = webcam_identifier() sysout(info, markdown=True) - diff --git a/src/demo/features/__init__.py b/src/demo/features/__init__.py index 9d71cda8..f1e4a74d 100644 --- a/src/demo/features/__init__.py +++ b/src/demo/features/__init__.py @@ -5,9 +5,5 @@ # Package: demo.features """Package initialization.""" -__all__ = [ - 'rag', - 'router_demo', - 'tools' -] -__version__ = '1.0.13' +__all__ = ["rag", "router_demo", "tools"] +__version__ = "1.0.13" diff --git a/src/demo/features/rag/__init__.py b/src/demo/features/rag/__init__.py index 7c4a72cc..8743c9cb 100644 --- a/src/demo/features/rag/__init__.py +++ b/src/demo/features/rag/__init__.py @@ -5,7 +5,5 @@ # Package: demo.features.rag """Package initialization.""" -__all__ = [ - 'x_refs_demo' -] -__version__ = '1.0.13' +__all__ = ["x_refs_demo"] +__version__ = "1.0.13" diff --git a/src/demo/features/tools/__init__.py b/src/demo/features/tools/__init__.py index 4327c29b..0ebcd82b 100644 --- a/src/demo/features/tools/__init__.py +++ b/src/demo/features/tools/__init__.py @@ -5,7 +5,5 @@ # Package: demo.features.tools """Package initialization.""" -__all__ = [ - 'query_output_demo' -] -__version__ = '1.0.13' +__all__ = ["query_output_demo"] +__version__ = "1.0.13" diff --git a/src/demo/others/__init__.py b/src/demo/others/__init__.py index 32b01f44..d18595d4 100644 --- a/src/demo/others/__init__.py +++ b/src/demo/others/__init__.py @@ -5,9 +5,5 @@ # Package: demo.others """Package initialization.""" -__all__ = [ - 'deepl_demo', - 'tech_week_demo', - 'translate_demo' -] -__version__ = '1.0.13' +__all__ = ["deepl_demo", "tech_week_demo", "translate_demo"] +__version__ = "1.0.13" diff --git a/src/demo/others/vision_model_demos.py b/src/demo/others/vision_model_demos.py index d5a34eaf..1c751cb3 100644 --- a/src/demo/others/vision_model_demos.py +++ b/src/demo/others/vision_model_demos.py @@ -1,8 +1,8 @@ -import os +from PIL import Image +from transformers import AutoTokenizer, VisionEncoderDecoderModel, ViTImageProcessor -from transformers import VisionEncoderDecoderModel, ViTImageProcessor, AutoTokenizer +import os import torch -from PIL import Image class Captioner: @@ -34,6 +34,6 @@ def predict_step(self, image_paths: list[str]) -> list[str]: return preds -if __name__ == '__main__': +if __name__ == "__main__": c = Captioner() - print(c.predict_step(['photos/webcam_photo.jpg-PHOTO.jpg'])) + print(c.predict_step(["photos/webcam_photo.jpg-PHOTO.jpg"])) diff --git a/src/main/__init__.py b/src/main/__init__.py index fa691888..2c7b3b7a 100644 --- a/src/main/__init__.py +++ b/src/main/__init__.py @@ -5,7 +5,5 @@ # Package: main """Package initialization.""" -__all__ = [ - 'askai' -] -__version__ = '1.0.13' +__all__ = ["askai"] +__version__ = "1.0.13" diff --git a/src/main/askai/__init__.py b/src/main/askai/__init__.py index 78851fb6..a3237699 100644 --- a/src/main/askai/__init__.py +++ b/src/main/askai/__init__.py @@ -5,10 +5,5 @@ # Package: main.askai """Package initialization.""" -__all__ = [ - 'core', - 'exception', - 'language', - 'tui' -] -__version__ = '1.0.13' +__all__ = ["core", "exception", "language", "tui"] +__version__ = "1.0.13" diff --git a/src/main/askai/core/__init__.py b/src/main/askai/core/__init__.py index 38392f62..6e338929 100644 --- a/src/main/askai/core/__init__.py +++ b/src/main/askai/core/__init__.py @@ -6,19 +6,19 @@ """Package initialization.""" __all__ = [ - 'askai', - 'askai_cli', - 'askai_configs', - 'askai_events', - 'askai_messages', - 'askai_prompt', - 'askai_settings', - 'commander', - 'component', - 'engine', - 'enums', - 'features', - 'model', - 'support' + "askai", + "askai_cli", + "askai_configs", + "askai_events", + "askai_messages", + "askai_prompt", + "askai_settings", + "commander", + "component", + "engine", + "enums", + "features", + "model", + "support", ] -__version__ = '1.0.13' +__version__ = "1.0.13" diff --git a/src/main/askai/core/askai.py b/src/main/askai/core/askai.py index 1e894d0c..489dfa46 100644 --- a/src/main/askai/core/askai.py +++ b/src/main/askai/core/askai.py @@ -12,14 +12,6 @@ Copyright (c) 2024, HomeSetup """ -import logging as log -import os -import re -import sys -from enum import Enum -from pathlib import Path -from typing import List, Optional, TypeAlias - from askai.__classpath__ import classpath from askai.core.askai_configs import configs from askai.core.askai_events import events @@ -37,12 +29,20 @@ MaxInteractionsReached, TerminatingQuery) from askai.tui.app_icons import AppIcons from click import UsageError +from enum import Enum from hspylib.core.enums.charset import Charset from hspylib.core.tools.commons import file_is_not_empty, is_debugging from hspylib.core.zoned_datetime import DATE_FORMAT, now, TIME_FORMAT from hspylib.modules.application.exit_status import ExitStatus from hspylib.modules.eventbus.event import Event from openai import RateLimitError +from pathlib import Path +from typing import List, Optional, TypeAlias + +import logging as log +import os +import re +import sys QueryString: TypeAlias = str | List[str] | None @@ -217,5 +217,6 @@ def _cb_mode_changed_event(self, ev: Event) -> None: f"{msg.enter_qna()} \n" f"```\nContext:  {ev.args.sum_path},  {ev.args.glob} \n```\n" f"`{msg.press_esc_enter()}` \n\n" - f"> {msg.qna_welcome()}") + f"> {msg.qna_welcome()}" + ) events.reply.emit(message=sum_msg) diff --git a/src/main/askai/core/askai_cli.py b/src/main/askai/core/askai_cli.py index f0e742d1..691ef5cc 100644 --- a/src/main/askai/core/askai_cli.py +++ b/src/main/askai/core/askai_cli.py @@ -12,8 +12,6 @@ Copyright (c) 2024, HomeSetup """ -from pathlib import Path - from askai.core.askai import AskAi from askai.core.askai_configs import configs from askai.core.askai_events import * @@ -31,6 +29,7 @@ from functools import partial from hspylib.core.tools.commons import sysout from hspylib.modules.eventbus.event import Event +from pathlib import Path from threading import Thread from typing import List, TypeAlias diff --git a/src/main/askai/core/askai_configs.py b/src/main/askai/core/askai_configs.py index 86fe63b1..79ef12d2 100644 --- a/src/main/askai/core/askai_configs.py +++ b/src/main/askai/core/askai_configs.py @@ -113,7 +113,8 @@ def language(self) -> Language: settings.get("askai.preferred.language") or locale.getlocale(locale.LC_ALL) or os.getenv("LC_ALL", os.getenv("LC_TYPE", os.getenv("LANG"))) - or Language.EN_US.idiom) + or Language.EN_US.idiom + ) @property def encoding(self) -> Charset: diff --git a/src/main/askai/core/askai_messages.py b/src/main/askai/core/askai_messages.py index 28693761..a40c7986 100644 --- a/src/main/askai/core/askai_messages.py +++ b/src/main/askai/core/askai_messages.py @@ -12,15 +12,15 @@ Copyright (c) 2024, HomeSetup """ -import re -from functools import cached_property, lru_cache - from askai.core.askai_configs import configs from askai.language.ai_translator import AITranslator from askai.language.language import Language from askai.language.translators.deep import DeepLTranslator +from functools import cached_property, lru_cache from hspylib.core.metaclass.singleton import Singleton +import re + class AskAiMessages(metaclass=Singleton): """Provide access to static 'translated' messages.""" diff --git a/src/main/askai/core/commander/__init__.py b/src/main/askai/core/commander/__init__.py index 1b3f6253..ec244593 100644 --- a/src/main/askai/core/commander/__init__.py +++ b/src/main/askai/core/commander/__init__.py @@ -5,8 +5,5 @@ # Package: main.askai.core.commander """Package initialization.""" -__all__ = [ - 'commander', - 'commands' -] -__version__ = '1.0.13' +__all__ = ["commander", "commands"] +__version__ = "1.0.13" diff --git a/src/main/askai/core/commander/commander.py b/src/main/askai/core/commander/commander.py index 60d89f30..13f50187 100644 --- a/src/main/askai/core/commander/commander.py +++ b/src/main/askai/core/commander/commander.py @@ -12,15 +12,6 @@ Copyright (c) 2024, HomeSetup """ -import os -import re -from functools import partial -from os.path import dirname -from pathlib import Path -from string import Template -from textwrap import dedent - -import click from askai.core.askai_configs import configs from askai.core.askai_events import ASKAI_BUS_NAME, AskAiEvents, REPLY_ERROR_EVENT, REPLY_EVENT from askai.core.commander.commands.cache_cmd import CacheCmd @@ -35,9 +26,18 @@ from askai.language.language import AnyLocale, Language from click import Command, Group from clitt.core.term.cursor import cursor +from functools import partial from hspylib.core.enums.charset import Charset from hspylib.core.tools.commons import sysout, to_bool from hspylib.modules.eventbus.event import Event +from os.path import dirname +from pathlib import Path +from string import Template +from textwrap import dedent + +import click +import os +import re COMMANDER_HELP_TPL = Template( dedent( diff --git a/src/main/askai/core/commander/commands/__init__.py b/src/main/askai/core/commander/commands/__init__.py index 5b867155..c86ea8eb 100644 --- a/src/main/askai/core/commander/commands/__init__.py +++ b/src/main/askai/core/commander/commands/__init__.py @@ -5,12 +5,5 @@ # Package: main.askai.core.commander.commands """Package initialization.""" -__all__ = [ - 'cache_cmd', - 'camera_cmd', - 'general_cmd', - 'history_cmd', - 'settings_cmd', - 'tts_stt_cmd' -] -__version__ = '1.0.13' +__all__ = ["cache_cmd", "camera_cmd", "general_cmd", "history_cmd", "settings_cmd", "tts_stt_cmd"] +__version__ = "1.0.13" diff --git a/src/main/askai/core/commander/commands/camera_cmd.py b/src/main/askai/core/commander/commands/camera_cmd.py index 446f1826..10b0eb69 100644 --- a/src/main/askai/core/commander/commands/camera_cmd.py +++ b/src/main/askai/core/commander/commands/camera_cmd.py @@ -1,8 +1,7 @@ from abc import ABC - from askai.core.askai_configs import configs from askai.core.component.camera import camera -from askai.core.features.router.tools.webcam import webcam_identifier, webcam_capturer +from askai.core.features.router.tools.webcam import webcam_capturer, webcam_identifier from askai.core.support.text_formatter import text_formatter from askai.core.support.utilities import display_text from hspylib.core.metaclass.classpath import AnyPath diff --git a/src/main/askai/core/component/__init__.py b/src/main/askai/core/component/__init__.py index 74f709a2..bc70f7d2 100644 --- a/src/main/askai/core/component/__init__.py +++ b/src/main/askai/core/component/__init__.py @@ -6,14 +6,14 @@ """Package initialization.""" __all__ = [ - 'audio_player', - 'cache_service', - 'camera', - 'geo_location', - 'image_store', - 'internet_service', - 'recorder', - 'scheduler', - 'summarizer' + "audio_player", + "cache_service", + "camera", + "geo_location", + "image_store", + "internet_service", + "recorder", + "scheduler", + "summarizer", ] -__version__ = '1.0.13' +__version__ = "1.0.13" diff --git a/src/main/askai/core/component/cache_service.py b/src/main/askai/core/component/cache_service.py index b0b3fe7b..05072cf8 100644 --- a/src/main/askai/core/component/cache_service.py +++ b/src/main/askai/core/component/cache_service.py @@ -12,19 +12,18 @@ Copyright (c) 2024, HomeSetup """ -import re -from collections import namedtuple -from pathlib import Path -from typing import Optional - +from askai.core.askai_configs import configs +from askai.core.askai_settings import ASKAI_DIR from clitt.core.tui.line_input.keyboard_input import KeyboardInput +from collections import namedtuple from hspylib.core.metaclass.singleton import Singleton from hspylib.core.tools.commons import file_is_not_empty from hspylib.core.tools.text_tools import hash_text from hspylib.modules.cache.ttl_cache import TTLCache +from pathlib import Path +from typing import Optional -from askai.core.askai_configs import configs -from askai.core.askai_settings import ASKAI_DIR +import re # AskAI cache root directory. CACHE_DIR: Path = Path(f"{ASKAI_DIR}/cache") @@ -120,9 +119,9 @@ def audio_file_path(self, text: str, voice: str = "onyx", audio_format: str = "m def save_reply(self, text: str, reply: str) -> Optional[str]: """Save an AI reply into the TTL (Time-To-Live) cache. - :param text: The text to be cached. - :param reply: The AI reply associated with this text. - :return: The key under which the reply is saved, or None if the save operation fails. + :param text: The text to be cached. + :param reply: The AI reply associated with this text. + :return: The key under which the reply is saved, or None if the save operation fails. """ if configs.is_cache: key = text.strip().lower() diff --git a/src/main/askai/core/component/camera.py b/src/main/askai/core/component/camera.py index 3451b041..c941734e 100644 --- a/src/main/askai/core/component/camera.py +++ b/src/main/askai/core/component/camera.py @@ -12,17 +12,6 @@ Copyright (c) 2024, HomeSetup """ -import atexit -import glob -import logging as log -import os.path -import shutil -from os.path import basename -from pathlib import Path -from typing import Optional, TypeAlias - -import cv2 -import pause from askai.__classpath__ import classpath from askai.core.askai_configs import configs from askai.core.askai_events import events @@ -39,8 +28,19 @@ from hspylib.core.tools.dict_tools import get_or_default from hspylib.core.tools.text_tools import hash_text from hspylib.core.zoned_datetime import now_ms +from os.path import basename +from pathlib import Path from retry import retry from torchvision.datasets.folder import is_image_file +from typing import Optional, TypeAlias + +import atexit +import cv2 +import glob +import logging as log +import os.path +import pause +import shutil InputDevice: TypeAlias = tuple[int, str] @@ -167,7 +167,7 @@ def detect_faces( hash_text(basename(final_path)), final_path, store.FACE_CATEGORY, - get_or_default(result.people_description, 0, '') if with_caption else msg.no_caption(), + get_or_default(result.people_description, 0, "") if with_caption else msg.no_caption(), ) face_files.append(face_file) face_datas.append(cropped_face) diff --git a/src/main/askai/core/component/geo_location.py b/src/main/askai/core/component/geo_location.py index 9a137a90..00c1fbad 100644 --- a/src/main/askai/core/component/geo_location.py +++ b/src/main/askai/core/component/geo_location.py @@ -34,13 +34,15 @@ class GeoLocation(metaclass=Singleton): GEO_LOC_URL: str = "http://ip-api.com/json" - EMPTY_JSON_RESP: str = dedent(""" + EMPTY_JSON_RESP: str = dedent( + """ { "status": "failure", "country": "", "countryCode": "", "region": "", "regionName": "", "city": "", "zip": "", "lat": 0.0, "lon": 0.0, "timezone": "", "isp": "", "org": "", "as": "", "query": "" } - """).strip() + """ + ).strip() # Date format used in prompts, e.g: Fri 22 Mar 19:47 2024. DATE_FMT: str = "%a %d %b %-H:%M %Y" diff --git a/src/main/askai/core/component/image_store.py b/src/main/askai/core/component/image_store.py index d3e749b9..5e8d90fc 100644 --- a/src/main/askai/core/component/image_store.py +++ b/src/main/askai/core/component/image_store.py @@ -140,9 +140,9 @@ def clear_store(self) -> None: def sync_store(self, re_caption: bool = False) -> int: """Synchronize the image store collection with the cached pictures folder. - :param re_caption: Whether to regenerate captions for the images during synchronization (default is False). - :return: The number of images synchronized with the store. - """ + :param re_caption: Whether to regenerate captions for the images during synchronization (default is False). + :return: The number of images synchronized with the store. + """ log.info( "Synchronizing image store folders: '%s', '%s' and '%s'", cache.PHOTO_DIR, diff --git a/src/main/askai/core/component/internet_service.py b/src/main/askai/core/component/internet_service.py index 245c9e7e..e47b0845 100644 --- a/src/main/askai/core/component/internet_service.py +++ b/src/main/askai/core/component/internet_service.py @@ -12,12 +12,6 @@ Copyright (c) 2024, HomeSetup """ -import logging as log -import re -from textwrap import dedent -from typing import List, Literal - -import bs4 from askai.__classpath__ import API_KEYS from askai.core.askai_configs import configs from askai.core.askai_events import events @@ -43,6 +37,12 @@ from langchain_core.tools import Tool from langchain_google_community import GoogleSearchAPIWrapper from langchain_text_splitters import RecursiveCharacterTextSplitter +from textwrap import dedent +from typing import List, Literal + +import bs4 +import logging as log +import re class InternetService(metaclass=Singleton): @@ -78,25 +78,27 @@ def _build_google_query(search: SearchResult) -> str: return final_query @staticmethod - def _wrap_response(terms: str, output: str, sites: list[str], method: Literal['Google', 'Other'] = 'Google') -> str: + def _wrap_response(terms: str, output: str, sites: list[str], method: Literal["Google", "Other"] = "Google") -> str: """Format and wrap the search response based on the search terms, output, and method used. - :param terms: The search terms used in the query. - :param output: The raw output or results from the search. - :param sites: A list of websites included in or relevant to the search results. - :param method: The search method used, either 'Google' or 'Other'. - :return: A formatted string that encapsulates the search response. - """ + :param terms: The search terms used in the query. + :param output: The raw output or results from the search. + :param sites: A list of websites included in or relevant to the search results. + :param method: The search method used, either 'Google' or 'Other'. + :return: A formatted string that encapsulates the search response. + """ method_icon = {"google": "", "other": ""} - return dedent(f""" + return dedent( + f""" Your {method.title()} search returned the following: {output} \n---\n Sources: {', '.join(sites)} *{method_icon[method]} Accessed: {geo_location.location} {now('%d %B, %Y')}* - >  Terms: {terms}""").strip() + >  Terms: {terms}""" + ).strip() def __init__(self): - API_KEYS.ensure('GOOGLE_API_KEY', 'google_search') + API_KEYS.ensure("GOOGLE_API_KEY", "google_search") self._google = GoogleSearchAPIWrapper(google_api_key=API_KEYS.GOOGLE_API_KEY) self._tool = Tool(name="google_search", description="Search Google for recent results.", func=self._google.run) self._text_splitter = RecursiveCharacterTextSplitter( diff --git a/src/main/askai/core/component/recorder.py b/src/main/askai/core/component/recorder.py index d9c435f9..479386ce 100644 --- a/src/main/askai/core/component/recorder.py +++ b/src/main/askai/core/component/recorder.py @@ -12,13 +12,14 @@ Copyright (c) 2024, HomeSetup """ -import logging as log -import operator -import sys -from pathlib import Path -from typing import Callable, Optional, TypeAlias - -import pause +from askai.core.askai_configs import configs +from askai.core.askai_events import events +from askai.core.askai_messages import msg +from askai.core.component.cache_service import REC_DIR +from askai.core.component.scheduler import Scheduler +from askai.core.support.utilities import display_text, seconds +from askai.exception.exceptions import InvalidInputDevice, InvalidRecognitionApiError +from askai.language.language import Language from clitt.core.tui.mselect.mselect import mselect from hspylib.core.enums.enumeration import Enumeration from hspylib.core.metaclass.classpath import AnyPath @@ -26,16 +27,14 @@ from hspylib.core.preconditions import check_argument, check_state from hspylib.core.zoned_datetime import now_ms from hspylib.modules.application.exit_status import ExitStatus +from pathlib import Path from speech_recognition import AudioData, Microphone, Recognizer, RequestError, UnknownValueError, WaitTimeoutError +from typing import Callable, Optional, TypeAlias -from askai.core.askai_configs import configs -from askai.core.askai_events import events -from askai.core.askai_messages import msg -from askai.core.component.cache_service import REC_DIR -from askai.core.component.scheduler import Scheduler -from askai.core.support.utilities import display_text, seconds -from askai.exception.exceptions import InvalidInputDevice, InvalidRecognitionApiError -from askai.language.language import Language +import logging as log +import operator +import pause +import sys InputDevice: TypeAlias = tuple[int, str] @@ -49,6 +48,7 @@ class Recorder(metaclass=Singleton): class RecognitionApi(Enumeration): """Available voice recognition APIs.""" + # fmt: off OPEN_AI = 'recognize_whisper' GOOGLE = 'recognize_google' @@ -143,9 +143,7 @@ def is_headphones(self) -> bool: return self.input_device is not None and self.input_device[0] > 1 def listen( - self, - recognition_api: RecognitionApi = RecognitionApi.GOOGLE, - language: Language = Language.EN_US, + self, recognition_api: RecognitionApi = RecognitionApi.GOOGLE, language: Language = Language.EN_US ) -> tuple[Path, Optional[str]]: """Listen to the microphone, save the recorded audio as a WAV file, and transcribe the speech. :param recognition_api: The API to use for recognizing the speech. Defaults to GOOGLE. diff --git a/src/main/askai/core/component/scheduler.py b/src/main/askai/core/component/scheduler.py index c9f5303b..53049983 100644 --- a/src/main/askai/core/component/scheduler.py +++ b/src/main/askai/core/component/scheduler.py @@ -51,6 +51,7 @@ def every(interval_ms: int, delay_ms: int): :param delay_ms: The initial delay in milliseconds before the first execution of the decorated function. :return: The decorated function. """ + def every_wrapper(func: Callable, *fargs, **fkwargs): """'every' function wrapper.""" return scheduler.set_interval(interval_ms, func, delay_ms, *fargs, **fkwargs) @@ -148,6 +149,7 @@ def set_interval( :param cb_fn_args: The arguments to pass to the callback function. :param cb_fn_kwargs: The keyword arguments to pass to the callback function. """ + def _call_it_back(): """Internal method to repeatedly invoke the callback function at specified intervals. It uses the `pause.milliseconds()` method to handle the waiting periods between each invocation. diff --git a/src/main/askai/core/component/summarizer.py b/src/main/askai/core/component/summarizer.py index 137c4366..d72ae93d 100644 --- a/src/main/askai/core/component/summarizer.py +++ b/src/main/askai/core/component/summarizer.py @@ -12,9 +12,6 @@ Copyright (c) 2024, HomeSetup """ -from hspylib.core.metaclass.classpath import AnyPath -from langchain_core.embeddings import Embeddings - from askai.core.askai_configs import configs from askai.core.askai_events import events from askai.core.askai_messages import msg @@ -24,12 +21,14 @@ from askai.exception.exceptions import DocumentsNotFound from functools import lru_cache from hspylib.core.config.path_object import PathObject +from hspylib.core.metaclass.classpath import AnyPath from hspylib.core.metaclass.singleton import Singleton from hspylib.core.tools.text_tools import ensure_endswith, hash_text from langchain.chains import RetrievalQA from langchain_community.document_loaders import DirectoryLoader from langchain_community.vectorstores.chroma import Chroma from langchain_core.documents import Document +from langchain_core.embeddings import Embeddings from langchain_text_splitters import RecursiveCharacterTextSplitter, TextSplitter from pathlib import Path from typing import Optional @@ -61,7 +60,8 @@ def __init__(self): self._folder = None self._glob = None self._text_splitter = RecursiveCharacterTextSplitter( - chunk_size=configs.chunk_size, chunk_overlap=configs.chunk_overlap) + chunk_size=configs.chunk_size, chunk_overlap=configs.chunk_overlap + ) @property def persist_dir(self) -> Path: @@ -122,7 +122,8 @@ def generate(self, folder: AnyPath, glob: str) -> bool: v_store = Chroma.from_documents(texts, embeddings, persist_directory=str(self.persist_dir)) self._retriever = RetrievalQA.from_chain_type( - llm=lc_llm.create_chat_model(), chain_type="stuff", retriever=v_store.as_retriever()) + llm=lc_llm.create_chat_model(), chain_type="stuff", retriever=v_store.as_retriever() + ) return True except ImportError as err: log.error("Unable to summarize '%s' => %s", self.sum_path, err) diff --git a/src/main/askai/core/engine/__init__.py b/src/main/askai/core/engine/__init__.py index 1119138f..1fafc21a 100644 --- a/src/main/askai/core/engine/__init__.py +++ b/src/main/askai/core/engine/__init__.py @@ -5,11 +5,5 @@ # Package: main.askai.core.engine """Package initialization.""" -__all__ = [ - 'ai_engine', - 'ai_model', - 'ai_reply', - 'engine_factory', - 'openai' -] -__version__ = '1.0.13' +__all__ = ["ai_engine", "ai_model", "ai_reply", "engine_factory", "openai"] +__version__ = "1.0.13" diff --git a/src/main/askai/core/engine/ai_engine.py b/src/main/askai/core/engine/ai_engine.py index ec3ed73b..19026725 100644 --- a/src/main/askai/core/engine/ai_engine.py +++ b/src/main/askai/core/engine/ai_engine.py @@ -12,15 +12,14 @@ Copyright (c) 2024, HomeSetup """ -from pathlib import Path -from typing import Optional, Protocol - from askai.core.askai_configs import AskAiConfigs from askai.core.engine.ai_model import AIModel from askai.core.engine.ai_reply import AIReply from askai.core.engine.ai_vision import AIVision from langchain_core.embeddings import Embeddings from langchain_core.language_models import BaseChatModel, BaseLLM +from pathlib import Path +from typing import Optional, Protocol class AIEngine(Protocol): diff --git a/src/main/askai/core/engine/ai_model.py b/src/main/askai/core/engine/ai_model.py index edddaa4e..8c812126 100644 --- a/src/main/askai/core/engine/ai_model.py +++ b/src/main/askai/core/engine/ai_model.py @@ -29,4 +29,3 @@ def token_limit(self) -> int: :return: The token limit of the model. """ ... - diff --git a/src/main/askai/core/engine/ai_reply.py b/src/main/askai/core/engine/ai_reply.py index f8d19376..b0c39463 100644 --- a/src/main/askai/core/engine/ai_reply.py +++ b/src/main/askai/core/engine/ai_reply.py @@ -25,4 +25,3 @@ class AIReply: def __str__(self) -> str: return f"Success = {self.is_success}\nMessage = {self.message}" - diff --git a/src/main/askai/core/engine/ai_vision.py b/src/main/askai/core/engine/ai_vision.py index a2a30c49..315c4f06 100644 --- a/src/main/askai/core/engine/ai_vision.py +++ b/src/main/askai/core/engine/ai_vision.py @@ -12,9 +12,8 @@ Copyright (c) 2024, HomeSetup """ -from typing import Protocol - from hspylib.core.metaclass.classpath import AnyPath +from typing import Protocol class AIVision(Protocol): diff --git a/src/main/askai/core/engine/engine_factory.py b/src/main/askai/core/engine/engine_factory.py index 3d0b3e28..584ec23c 100644 --- a/src/main/askai/core/engine/engine_factory.py +++ b/src/main/askai/core/engine/engine_factory.py @@ -13,14 +13,13 @@ Copyright (c) 2024, HomeSetup """ -from hspylib.core.metaclass.singleton import Singleton -from hspylib.core.preconditions import check_not_none - from askai.core.engine.ai_engine import AIEngine from askai.core.engine.ai_model import AIModel from askai.core.engine.openai.openai_engine import OpenAIEngine from askai.core.engine.openai.openai_model import OpenAIModel from askai.exception.exceptions import NoSuchEngineError +from hspylib.core.metaclass.singleton import Singleton +from hspylib.core.preconditions import check_not_none class EngineFactory(metaclass=Singleton): diff --git a/src/main/askai/core/engine/openai/__init__.py b/src/main/askai/core/engine/openai/__init__.py index 7e02b3ec..73ddfb2b 100644 --- a/src/main/askai/core/engine/openai/__init__.py +++ b/src/main/askai/core/engine/openai/__init__.py @@ -5,10 +5,5 @@ # Package: main.askai.core.engine.openai """Package initialization.""" -__all__ = [ - 'openai_configs', - 'openai_engine', - 'openai_model', - 'temperature' -] -__version__ = '1.0.13' +__all__ = ["openai_configs", "openai_engine", "openai_model", "temperature"] +__version__ = "1.0.13" diff --git a/src/main/askai/core/engine/openai/openai_engine.py b/src/main/askai/core/engine/openai/openai_engine.py index 9542d444..4805c339 100644 --- a/src/main/askai/core/engine/openai/openai_engine.py +++ b/src/main/askai/core/engine/openai/openai_engine.py @@ -12,15 +12,6 @@ Copyright (c) 2024, HomeSetup """ -import logging as log -import os -from pathlib import Path -from threading import Thread -from typing import List, Optional - -import langchain_openai -import pause -import tiktoken from askai.core.component.audio_player import player from askai.core.component.cache_service import cache from askai.core.component.recorder import Recorder @@ -35,6 +26,15 @@ from langchain_core.embeddings import Embeddings from langchain_core.language_models import BaseChatModel, BaseLLM from openai import APIError, OpenAI +from pathlib import Path +from threading import Thread +from typing import List, Optional + +import langchain_openai +import logging as log +import os +import pause +import tiktoken class OpenAIEngine: @@ -94,9 +94,8 @@ def lc_model(self, temperature: float, top_p: float) -> BaseLLM: :return: An instance of BaseLLM. """ return langchain_openai.OpenAI( - openai_api_key=self._api_key, - model=self._model.model_name(), - temperature=temperature, top_p=top_p) + openai_api_key=self._api_key, model=self._model.model_name(), temperature=temperature, top_p=top_p + ) def lc_chat_model(self, temperature: float) -> BaseChatModel: """Create a LangChain LLM chat model instance using the current AI engine. @@ -104,18 +103,15 @@ def lc_chat_model(self, temperature: float) -> BaseChatModel: :return: An instance of BaseChatModel. """ return langchain_openai.ChatOpenAI( - openai_api_key=self._api_key, - model=self._model.model_name(), - temperature=temperature) + openai_api_key=self._api_key, model=self._model.model_name(), temperature=temperature + ) def lc_embeddings(self, model: str) -> Embeddings: """Create a LangChain LLM embeddings model instance. :param model: The LLM embeddings model string. :return: An instance of Embeddings. """ - return langchain_openai.OpenAIEmbeddings( - openai_api_key=self._api_key, - model=model) + return langchain_openai.OpenAIEmbeddings(openai_api_key=self._api_key, model=model) def ai_name(self) -> str: """Get the AI engine name. diff --git a/src/main/askai/core/engine/openai/openai_vision.py b/src/main/askai/core/engine/openai/openai_vision.py index 4bc42e0a..6de16a45 100644 --- a/src/main/askai/core/engine/openai/openai_vision.py +++ b/src/main/askai/core/engine/openai/openai_vision.py @@ -12,10 +12,6 @@ Copyright (c) 2024, HomeSetup """ -import os -from textwrap import dedent -from typing import TypeAlias - from askai.core.model.image_result import ImageResult from askai.core.support.utilities import encode_image, find_file from hspylib.core.metaclass.classpath import AnyPath @@ -27,6 +23,10 @@ from langchain_core.output_parsers import JsonOutputParser from langchain_core.runnables import chain from langchain_openai import ChatOpenAI +from textwrap import dedent +from typing import TypeAlias + +import os Base64Image: TypeAlias = dict[str, str] @@ -58,23 +58,28 @@ def create_image_caption_chain(inputs: dict) -> MessageContent: """ model: BaseChatModel = ChatOpenAI(temperature=0.8, model="gpt-4o-mini", max_tokens=1024) msg: BaseMessage = model.invoke( - [HumanMessage( - content=[ - {"type": "text", "text": inputs["prompt"]}, - {"type": "text", "text": OpenAIVision._OUT_PARSER.get_format_instructions()}, - {"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{inputs['image']}"}}, - ])] + [ + HumanMessage( + content=[ + {"type": "text", "text": inputs["prompt"]}, + {"type": "text", "text": OpenAIVision._OUT_PARSER.get_format_instructions()}, + {"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{inputs['image']}"}}, + ] + ) + ] ) return msg.content def template(self, question: str | None = None) -> str: - return dedent(f""" + return dedent( + f""" Given the image, provide the following information: - A count of how many living beings are in the image. - A list of the main objects present in the image. - A description the atmosphere of the environment. - A list of detailed descriptions all living beings you find in the image. - {'- ' + question if question else ''}""").strip() + {'- ' + question if question else ''}""" + ).strip() def caption(self, filename: AnyPath, load_dir: AnyPath | None, question: str | None = None) -> str: """Generate a caption for the provided image. @@ -86,10 +91,8 @@ def caption(self, filename: AnyPath, load_dir: AnyPath | None, question: str | N check_argument(len((final_path := str(find_file(final_path) or ""))) > 0, f"Invalid image path: {final_path}") vision_prompt = self.template() load_image_chain = TransformChain( - input_variables=["image_path"], - output_variables=["image"], - transform=self._encode_image + input_variables=["image_path"], output_variables=["image"], transform=self._encode_image ) vision_chain = load_image_chain | self.create_image_caption_chain | OpenAIVision._OUT_PARSER - args: dict[str, str] = {'image_path': f'{final_path}', 'prompt': vision_prompt} + args: dict[str, str] = {"image_path": f"{final_path}", "prompt": vision_prompt} return str(vision_chain.invoke(args)) diff --git a/src/main/askai/core/enums/__init__.py b/src/main/askai/core/enums/__init__.py index 45d6e12c..ce5f84c4 100644 --- a/src/main/askai/core/enums/__init__.py +++ b/src/main/askai/core/enums/__init__.py @@ -5,9 +5,5 @@ # Package: main.askai.core.enums """Package initialization.""" -__all__ = [ - 'acc_response', - 'router_mode', - 'routing_model' -] -__version__ = '1.0.13' +__all__ = ["acc_response", "router_mode", "routing_model"] +__version__ = "1.0.13" diff --git a/src/main/askai/core/features/__init__.py b/src/main/askai/core/features/__init__.py index 1a8f9a85..f6ea9eae 100644 --- a/src/main/askai/core/features/__init__.py +++ b/src/main/askai/core/features/__init__.py @@ -5,8 +5,5 @@ # Package: main.askai.core.features """Package initialization.""" -__all__ = [ - 'router', - 'validation' -] -__version__ = '1.0.13' +__all__ = ["router", "validation"] +__version__ = "1.0.13" diff --git a/src/main/askai/core/features/router/__init__.py b/src/main/askai/core/features/router/__init__.py index 1af70260..d27a79c4 100644 --- a/src/main/askai/core/features/router/__init__.py +++ b/src/main/askai/core/features/router/__init__.py @@ -5,12 +5,5 @@ # Package: main.askai.core.features.router """Package initialization.""" -__all__ = [ - 'ai_processor', - 'model_selector', - 'procs', - 'task_agent', - 'task_toolkit', - 'tools' -] -__version__ = '1.0.13' +__all__ = ["ai_processor", "model_selector", "procs", "task_agent", "task_toolkit", "tools"] +__version__ = "1.0.13" diff --git a/src/main/askai/core/features/router/model_selector.py b/src/main/askai/core/features/router/model_selector.py index be592741..ac0508fb 100644 --- a/src/main/askai/core/features/router/model_selector.py +++ b/src/main/askai/core/features/router/model_selector.py @@ -12,8 +12,6 @@ Copyright (c) 2024, HomeSetup """ -from langchain_core.language_models import BaseChatModel - from askai.core.askai_prompt import prompt from askai.core.component.geo_location import geo_location from askai.core.engine.openai.temperature import Temperature @@ -22,6 +20,7 @@ from askai.core.support.langchain_support import lc_llm from hspylib.core.metaclass.singleton import Singleton from hspylib.core.object_mapper import object_mapper +from langchain_core.language_models import BaseChatModel from langchain_core.prompts import PromptTemplate @@ -46,9 +45,7 @@ def select_model(self, question: str) -> ModelResult: :return: An instance of ModelResult representing the selected model. """ final_prompt: str = self.model_template.format( - datetime=geo_location.datetime, - models=RoutingModel.enlist(), - question=question + datetime=geo_location.datetime, models=RoutingModel.enlist(), question=question ) llm: BaseChatModel = lc_llm.create_chat_model(Temperature.DATA_ANALYSIS.temp) if response := llm.invoke(final_prompt): diff --git a/src/main/askai/core/features/router/procs/__init__.py b/src/main/askai/core/features/router/procs/__init__.py index 4ef8ee8a..8d0f3dd4 100644 --- a/src/main/askai/core/features/router/procs/__init__.py +++ b/src/main/askai/core/features/router/procs/__init__.py @@ -5,10 +5,5 @@ # Package: main.askai.core.features.router.procs """Package initialization.""" -__all__ = [ - 'qna', - 'qstring', - 'rag', - 'task_splitter' -] -__version__ = '1.0.13' +__all__ = ["qna", "qstring", "rag", "task_splitter"] +__version__ = "1.0.13" diff --git a/src/main/askai/core/features/router/task_agent.py b/src/main/askai/core/features/router/task_agent.py index df19d88e..130bc921 100644 --- a/src/main/askai/core/features/router/task_agent.py +++ b/src/main/askai/core/features/router/task_agent.py @@ -1,8 +1,3 @@ -import logging as log -import os -from functools import lru_cache -from typing import Optional, AnyStr - from askai.core.askai_configs import configs from askai.core.askai_events import events from askai.core.askai_messages import msg @@ -17,6 +12,7 @@ from askai.core.model.model_result import ModelResult from askai.core.support.langchain_support import lc_llm from askai.core.support.shared_instances import shared +from functools import lru_cache from hspylib.core.config.path_object import PathObject from hspylib.core.metaclass.singleton import Singleton from langchain.agents import AgentExecutor, create_structured_chat_agent @@ -24,6 +20,10 @@ from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain_core.runnables import Runnable from langchain_core.runnables.utils import Output +from typing import AnyStr, Optional + +import logging as log +import os class TaskAgent(metaclass=Singleton): diff --git a/src/main/askai/core/features/router/tools/__init__.py b/src/main/askai/core/features/router/tools/__init__.py index d2f85b42..67e189d4 100644 --- a/src/main/askai/core/features/router/tools/__init__.py +++ b/src/main/askai/core/features/router/tools/__init__.py @@ -5,14 +5,5 @@ # Package: main.askai.core.features.router.tools """Package initialization.""" -__all__ = [ - 'analysis', - 'browser', - 'general', - 'generation', - 'summarization', - 'terminal', - 'vision', - 'webcam' -] -__version__ = '1.0.13' +__all__ = ["analysis", "browser", "general", "generation", "summarization", "terminal", "vision", "webcam"] +__version__ = "1.0.13" diff --git a/src/main/askai/core/features/router/tools/analysis.py b/src/main/askai/core/features/router/tools/analysis.py index 559ef464..0b1d99c7 100644 --- a/src/main/askai/core/features/router/tools/analysis.py +++ b/src/main/askai/core/features/router/tools/analysis.py @@ -18,13 +18,12 @@ from askai.core.engine.openai.temperature import Temperature from askai.core.support.langchain_support import lc_llm from askai.core.support.shared_instances import shared +from askai.core.support.text_formatter import TextFormatter from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain_core.runnables.history import RunnableWithMessageHistory import logging as log -from askai.core.support.text_formatter import TextFormatter - def query_output(query: str, context: str = None) -> str: """Handle 'Text analysis', invoking: analyze(question: str). Analyze the context and answer the question. diff --git a/src/main/askai/core/features/router/tools/generation.py b/src/main/askai/core/features/router/tools/generation.py index 99c72e1b..b73d280d 100644 --- a/src/main/askai/core/features/router/tools/generation.py +++ b/src/main/askai/core/features/router/tools/generation.py @@ -13,11 +13,6 @@ Copyright (c) 2024, HomeSetup """ -import logging as log -import os -from pathlib import Path -from typing import AnyStr - from askai.core.askai_messages import msg from askai.core.askai_prompt import prompt from askai.core.component.cache_service import GEN_AI_DIR @@ -31,6 +26,11 @@ from hspylib.core.zoned_datetime import now_ms from langchain_core.messages import AIMessage from langchain_core.prompts import PromptTemplate +from pathlib import Path +from typing import AnyStr + +import logging as log +import os def generate_content(instructions: str, mime_type: str, filepath: AnyPath | None = None) -> str: diff --git a/src/main/askai/core/features/router/tools/vision.py b/src/main/askai/core/features/router/tools/vision.py index 4df257d4..29b95837 100644 --- a/src/main/askai/core/features/router/tools/vision.py +++ b/src/main/askai/core/features/router/tools/vision.py @@ -1,8 +1,3 @@ -import os -from textwrap import indent - -import torch -from PIL import Image from askai.core.askai_events import events from askai.core.askai_messages import msg from askai.core.component.cache_service import PICTURE_DIR @@ -13,8 +8,13 @@ from hspylib.core.config.path_object import PathObject from hspylib.core.enums.enumeration import Enumeration from hspylib.core.metaclass.classpath import AnyPath +from PIL import Image +from textwrap import indent from transformers import BlipForConditionalGeneration, BlipProcessor +import os +import torch + def offline_captioner(path_name: AnyPath) -> str: """This tool is used to describe an image. @@ -93,11 +93,10 @@ def parse_caption(image_caption: str) -> str: if image_caption: result: ImageResult = ImageResult.of(image_caption) ln: str = os.linesep - people_desc: str = '' + people_desc: str = "" if result.people_description: - people_desc: str = ( - f"- **People:** `({result.people_count})`\n" - + indent(f"- {'- '.join([f'`{ppl}{ln}`' for ppl in result.people_description])}", " ") + people_desc: str = f"- **People:** `({result.people_count})`\n" + indent( + f"- {'- '.join([f'`{ppl}{ln}`' for ppl in result.people_description])}", " " ) return ( f"- **Description:** `{result.env_description}`\n" diff --git a/src/main/askai/core/features/router/tools/webcam.py b/src/main/askai/core/features/router/tools/webcam.py index f02eca5b..bb28a97c 100644 --- a/src/main/askai/core/features/router/tools/webcam.py +++ b/src/main/askai/core/features/router/tools/webcam.py @@ -1,11 +1,11 @@ -import os -from os.path import basename -from textwrap import indent - from askai.core.askai_configs import configs from askai.core.component.camera import camera from askai.core.features.router.tools.vision import image_captioner, parse_caption from askai.core.support.utilities import display_text +from os.path import basename +from textwrap import indent + +import os def webcam_capturer(photo_name: str | None, detect_faces: bool = False) -> str: @@ -23,19 +23,22 @@ def webcam_capturer(photo_name: str | None, detect_faces: bool = False) -> str: face_files, face_datas = camera.detect_faces(pic_data, photo_name) faces: int = len(face_files) face_description = ( - f"- **Faces:** `({faces})`\n" - + indent(f"- {'- '.join([f'`{ff.img_path}` {ln}' for ff in face_files])}", " ") - + f"- **Face-Captions:** `({faces})`\n" - + indent(f"- {'- '.join([f'*{basename(ff.img_path)}*: `{ff.img_caption}` {ln}' for ff in face_files])}", " ") - ) if faces else '' + ( + f"- **Faces:** `({faces})`\n" + + indent(f"- {'- '.join([f'`{ff.img_path}` {ln}' for ff in face_files])}", " ") + + f"- **Face-Captions:** `({faces})`\n" + + indent( + f"- {'- '.join([f'*{basename(ff.img_path)}*: `{ff.img_caption}` {ln}' for ff in face_files])}", + " ", + ) + ) + if faces + else "" + ) image_description: str = parse_caption(image_captioner(pic_file.img_path)) - return ( - f">  Photo Taken -> {pic_file.img_path}\n\n" - f"{image_description or ''}\n" - f"{face_description or ''}" - ) + return f">  Photo Taken -> {pic_file.img_path}\n\n" f"{image_description or ''}\n" f"{face_description or ''}" def webcam_identifier(max_distance: int = configs.max_id_distance) -> str: diff --git a/src/main/askai/core/features/validation/__init__.py b/src/main/askai/core/features/validation/__init__.py index 07e95545..711cf42f 100644 --- a/src/main/askai/core/features/validation/__init__.py +++ b/src/main/askai/core/features/validation/__init__.py @@ -5,7 +5,5 @@ # Package: main.askai.core.features.validation """Package initialization.""" -__all__ = [ - 'accuracy' -] -__version__ = '1.0.13' +__all__ = ["accuracy"] +__version__ = "1.0.13" diff --git a/src/main/askai/core/features/validation/accuracy.py b/src/main/askai/core/features/validation/accuracy.py index 89f99f36..e13b5026 100644 --- a/src/main/askai/core/features/validation/accuracy.py +++ b/src/main/askai/core/features/validation/accuracy.py @@ -29,14 +29,16 @@ import logging as log -EVALUATION_GUIDE: str = dedent(""" +EVALUATION_GUIDE: str = dedent( + """ **Accuracy Evaluation Guidelines:** 1. Analyze past responses to ensure accuracy. 2. Regularly self-critique overall responses. 3. Reflect on past strategies to refine your approach. 4. Experiment with different methods or solutions. -""").strip() +""" +).strip() RAG: RAGProvider = RAGProvider("accuracy.csv") @@ -98,9 +100,7 @@ def resolve_x_refs(ref_name: str, context: str | None = None) -> str: if context or (context := str(shared.context.flat("HISTORY"))): runnable = template | lc_llm.create_chat_model(Temperature.CODE_GENERATION.temp) runnable = RunnableWithMessageHistory( - runnable, shared.context.flat, - input_messages_key="pathname", - history_messages_key="context" + runnable, shared.context.flat, input_messages_key="pathname", history_messages_key="context" ) log.info("Analysis::[QUERY] '%s' context=%s", ref_name, context) events.reply.emit(message=msg.x_reference(ref_name), verbosity="debug") diff --git a/src/main/askai/core/model/__init__.py b/src/main/askai/core/model/__init__.py index 596d55b8..762ed8d4 100644 --- a/src/main/askai/core/model/__init__.py +++ b/src/main/askai/core/model/__init__.py @@ -5,11 +5,5 @@ # Package: main.askai.core.model """Package initialization.""" -__all__ = [ - 'action_plan', - 'api_keys', - 'model_result', - 'search_result', - 'summary_result' -] -__version__ = '1.0.13' +__all__ = ["action_plan", "api_keys", "model_result", "search_result", "summary_result"] +__version__ = "1.0.13" diff --git a/src/main/askai/core/model/api_keys.py b/src/main/askai/core/model/api_keys.py index 4ca5cc64..d79bba4f 100644 --- a/src/main/askai/core/model/api_keys.py +++ b/src/main/askai/core/model/api_keys.py @@ -12,17 +12,17 @@ Copyright (c) 2024, HomeSetup """ -import os -from pathlib import Path -from typing import AnyStr - -import dotenv from askai.exception.exceptions import MissingApiKeyError from clitt.core.tui.minput.input_validator import InputValidator from clitt.core.tui.minput.menu_input import MenuInput from clitt.core.tui.minput.minput import minput from hspylib.core.enums.charset import Charset +from pathlib import Path from pydantic.v1 import BaseSettings, Field, validator +from typing import AnyStr + +import dotenv +import os API_KEY_FILE: str = os.environ.get("HHS_ENV_FILE", str(os.path.join(Path.home(), ".env"))) @@ -62,6 +62,7 @@ def has_key(self, key_name: str) -> bool: class Config: """Configuration class for setting environment variables related to API keys.""" + env_file = API_KEY_FILE env_file_encoding = Charset.UTF_8.val diff --git a/src/main/askai/core/model/image_result.py b/src/main/askai/core/model/image_result.py index 87b84e08..f660d4f8 100644 --- a/src/main/askai/core/model/image_result.py +++ b/src/main/askai/core/model/image_result.py @@ -1,17 +1,17 @@ -from typing import AnyStr - from pydantic import BaseModel, Field +from typing import AnyStr class ImageResult(BaseModel): """Information about an image. This class provides a schema for storing and validating image-related information using Pydantic's data validation features. """ + people_count: int = Field(description="Number of beings on the picture") main_objects: list[str] = Field(description="List of the main objects on the picture") env_description: str = Field(description="Description of the atmosphere of the environment") people_description: list[str] = Field(description="List of people description") @staticmethod - def of(image_caption: AnyStr) -> 'ImageResult': + def of(image_caption: AnyStr) -> "ImageResult": return ImageResult.model_validate_json(str(image_caption).replace("'", '"')) diff --git a/src/main/askai/core/support/__init__.py b/src/main/askai/core/support/__init__.py index 93296ffc..340ef171 100644 --- a/src/main/askai/core/support/__init__.py +++ b/src/main/askai/core/support/__init__.py @@ -6,13 +6,13 @@ """Package initialization.""" __all__ = [ - 'chat_context', - 'langchain_support', - 'platform', - 'presets', - 'rag_provider', - 'shared_instances', - 'text_formatter', - 'utilities' + "chat_context", + "langchain_support", + "platform", + "presets", + "rag_provider", + "shared_instances", + "text_formatter", + "utilities", ] -__version__ = '1.0.13' +__version__ = "1.0.13" diff --git a/src/main/askai/core/support/langchain_support.py b/src/main/askai/core/support/langchain_support.py index 79536213..1cf9aede 100644 --- a/src/main/askai/core/support/langchain_support.py +++ b/src/main/askai/core/support/langchain_support.py @@ -12,9 +12,8 @@ Copyright (c) 2024, HomeSetup """ -from functools import lru_cache - from askai.core.support.shared_instances import shared +from functools import lru_cache from hspylib.core.metaclass.singleton import Singleton from hspylib.core.preconditions import check_not_none from langchain_core.embeddings import Embeddings diff --git a/src/main/askai/core/support/shared_instances.py b/src/main/askai/core/support/shared_instances.py index 341f64b4..a6ed7184 100644 --- a/src/main/askai/core/support/shared_instances.py +++ b/src/main/askai/core/support/shared_instances.py @@ -13,10 +13,6 @@ Copyright (c) 2024, HomeSetup """ -import os -from pathlib import Path -from typing import Optional - from askai.__classpath__ import classpath from askai.core.askai_configs import configs from askai.core.askai_messages import msg @@ -37,6 +33,10 @@ from hspylib.modules.cli.keyboard import Keyboard from langchain.memory import ConversationBufferWindowMemory from langchain.memory.chat_memory import BaseChatMemory +from pathlib import Path +from typing import Optional + +import os class SharedInstances(metaclass=Singleton): diff --git a/src/main/askai/core/support/utilities.py b/src/main/askai/core/support/utilities.py index a5fc0a6a..af13b2aa 100644 --- a/src/main/askai/core/support/utilities.py +++ b/src/main/askai/core/support/utilities.py @@ -12,17 +12,6 @@ Copyright (c) 2024, HomeSetup """ -import base64 -import mimetypes -import os -import re -import shutil -import sys -from os.path import basename, dirname -from pathlib import Path -from typing import Optional, AnyStr - -import pause from askai.core.support.presets import Presets from askai.core.support.text_formatter import text_formatter from askai.language.language import Language @@ -35,6 +24,17 @@ from hspylib.core.tools.text_tools import ensure_endswith, strip_escapes from hspylib.core.zoned_datetime import now_ms from hspylib.modules.cli.vt100.vt_color import VtColor +from os.path import basename, dirname +from pathlib import Path +from typing import AnyStr, Optional + +import base64 +import mimetypes +import os +import pause +import re +import shutil +import sys def read_stdin() -> Optional[str]: diff --git a/src/main/askai/exception/__init__.py b/src/main/askai/exception/__init__.py index 5cf57b5b..5d89c407 100644 --- a/src/main/askai/exception/__init__.py +++ b/src/main/askai/exception/__init__.py @@ -5,7 +5,5 @@ # Package: main.askai.exception """Package initialization.""" -__all__ = [ - 'exceptions' -] -__version__ = '1.0.13' +__all__ = ["exceptions"] +__version__ = "1.0.13" diff --git a/src/main/askai/language/__init__.py b/src/main/askai/language/__init__.py index f186aa5d..170982a5 100644 --- a/src/main/askai/language/__init__.py +++ b/src/main/askai/language/__init__.py @@ -5,9 +5,5 @@ # Package: main.askai.language """Package initialization.""" -__all__ = [ - 'ai_translator', - 'language', - 'translators' -] -__version__ = '1.0.13' +__all__ = ["ai_translator", "language", "translators"] +__version__ = "1.0.13" diff --git a/src/main/askai/language/language.py b/src/main/askai/language/language.py index 1e897736..6fcf6cdb 100644 --- a/src/main/askai/language/language.py +++ b/src/main/askai/language/language.py @@ -248,4 +248,3 @@ def territory(self) -> str: :return: The mnemonic representing the territory, e.g., US. """ return self._territory - diff --git a/src/main/askai/language/translators/__init__.py b/src/main/askai/language/translators/__init__.py index eb76e967..35590107 100644 --- a/src/main/askai/language/translators/__init__.py +++ b/src/main/askai/language/translators/__init__.py @@ -5,8 +5,5 @@ # Package: main.askai.language.translators """Package initialization.""" -__all__ = [ - 'deep', - 'marian' -] -__version__ = '1.0.13' +__all__ = ["deep", "marian"] +__version__ = "1.0.13" diff --git a/src/main/askai/language/translators/deep.py b/src/main/askai/language/translators/deep.py index 81bde6eb..b4695b34 100644 --- a/src/main/askai/language/translators/deep.py +++ b/src/main/askai/language/translators/deep.py @@ -12,12 +12,12 @@ Copyright (c) 2024, HomeSetup """ -from functools import lru_cache - -import deepl from askai.__classpath__ import API_KEYS from askai.language.ai_translator import AITranslator from askai.language.language import Language +from functools import lru_cache + +import deepl class DeepLTranslator(AITranslator): @@ -25,7 +25,7 @@ class DeepLTranslator(AITranslator): def __init__(self, from_idiom: Language, to_idiom: Language): super().__init__(from_idiom, to_idiom) - API_KEYS.ensure('DEEPL_API_KEY', 'DeepLTranslator') + API_KEYS.ensure("DEEPL_API_KEY", "DeepLTranslator") self._translator = deepl.Translator(API_KEYS.DEEPL_API_KEY) @lru_cache(maxsize=256) diff --git a/src/main/askai/tui/__init__.py b/src/main/askai/tui/__init__.py index 89987117..00db4f77 100644 --- a/src/main/askai/tui/__init__.py +++ b/src/main/askai/tui/__init__.py @@ -5,11 +5,5 @@ # Package: main.askai.tui """Package initialization.""" -__all__ = [ - 'app_header', - 'app_icons', - 'app_suggester', - 'app_widgets', - 'askai_app' -] -__version__ = '1.0.13' +__all__ = ["app_header", "app_icons", "app_suggester", "app_widgets", "askai_app"] +__version__ = "1.0.13" diff --git a/src/test/__init__.py b/src/test/__init__.py index e5708d7d..4a23c5c3 100644 --- a/src/test/__init__.py +++ b/src/test/__init__.py @@ -5,8 +5,5 @@ # Package: test """Package initialization.""" -__all__ = [ - 'core', - 'test_main' -] -__version__ = '1.0.13' +__all__ = ["core", "test_main"] +__version__ = "1.0.13" diff --git a/src/test/core/__init__.py b/src/test/core/__init__.py index ae4a6ed6..44afbb8a 100644 --- a/src/test/core/__init__.py +++ b/src/test/core/__init__.py @@ -5,7 +5,5 @@ # Package: test.core """Package initialization.""" -__all__ = [ - 'support' -] -__version__ = '1.0.13' +__all__ = ["support"] +__version__ = "1.0.13" diff --git a/src/test/core/support/__init__.py b/src/test/core/support/__init__.py index 56d1d35c..88689ddc 100644 --- a/src/test/core/support/__init__.py +++ b/src/test/core/support/__init__.py @@ -5,7 +5,5 @@ # Package: test.core.support """Package initialization.""" -__all__ = [ - 'test_utilities' -] -__version__ = '1.0.13' +__all__ = ["test_utilities"] +__version__ = "1.0.13"