diff --git a/.idea/dvm.iml b/.idea/dvm.iml index 007729a..5de74eb 100644 --- a/.idea/dvm.iml +++ b/.idea/dvm.iml @@ -4,8 +4,10 @@ + + - + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 3ce312c..af05b9d 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,5 +3,5 @@ - + \ No newline at end of file diff --git a/nostr_dvm/interfaces/dvmtaskinterface.py b/nostr_dvm/interfaces/dvmtaskinterface.py index dd25269..5aa50a5 100644 --- a/nostr_dvm/interfaces/dvmtaskinterface.py +++ b/nostr_dvm/interfaces/dvmtaskinterface.py @@ -1,12 +1,14 @@ import json +import subprocess +import sys from threading import Thread from nostr_sdk import Keys +from nostr_dvm.dvm import DVM from nostr_dvm.utils.admin_utils import AdminConfig from nostr_dvm.utils.dvmconfig import DVMConfig from nostr_dvm.utils.nip89_utils import NIP89Config -from nostr_dvm.dvm import DVM from nostr_dvm.utils.output_utils import post_process_result @@ -23,11 +25,13 @@ class DVMTaskInterface: ACCEPTS_CASHU = True # DVMs build with this framework support encryption, but others might not. dvm_config: DVMConfig admin_config: AdminConfig + dependencies = [] def __init__(self, name, dvm_config: DVMConfig, nip89config: NIP89Config, admin_config: AdminConfig = None, options=None, task=None): self.init(name, dvm_config, admin_config, nip89config, task) self.options = options + self.install_dependencies(self.dependencies) def init(self, name, dvm_config, admin_config=None, nip89config=None, task=None): self.NAME = name @@ -80,6 +84,13 @@ class DVMTaskInterface: """Post-process the data and return the result Use default function, if not overwritten""" return post_process_result(result, event) + def install_dependencies(self, packages): + import pip + for package in packages: + try: + __import__(package.split("=")[0]) + except ImportError: + subprocess.check_call([sys.executable, "-m", "pip", "install", package]) @staticmethod def set_options(request_form): diff --git a/nostr_dvm/tasks/imagegeneration_openai_dalle.py b/nostr_dvm/tasks/imagegeneration_openai_dalle.py index bc0df52..b536cb8 100644 --- a/nostr_dvm/tasks/imagegeneration_openai_dalle.py +++ b/nostr_dvm/tasks/imagegeneration_openai_dalle.py @@ -30,6 +30,7 @@ class ImageGenerationDALLE(DVMTaskInterface): KIND: int = EventDefinitions.KIND_NIP90_GENERATE_IMAGE TASK: str = "text-to-image" FIX_COST: float = 120 + dependencies = ["openai==1.3.5"] def __init__(self, name, dvm_config: DVMConfig, nip89config: NIP89Config, admin_config: AdminConfig = None, options=None): diff --git a/nostr_dvm/tasks/imagegeneration_replicate_sdxl.py b/nostr_dvm/tasks/imagegeneration_replicate_sdxl.py index 92df32d..4d22f88 100644 --- a/nostr_dvm/tasks/imagegeneration_replicate_sdxl.py +++ b/nostr_dvm/tasks/imagegeneration_replicate_sdxl.py @@ -31,6 +31,7 @@ class ImageGenerationReplicateSDXL(DVMTaskInterface): KIND: int = EventDefinitions.KIND_NIP90_GENERATE_IMAGE TASK: str = "text-to-image" FIX_COST: float = 120 + dependencies = ["replicate==0.21.1"] def __init__(self, name, dvm_config: DVMConfig, nip89config: NIP89Config, admin_config: AdminConfig = None, options=None): diff --git a/nostr_dvm/tasks/textextraction_pdf.py b/nostr_dvm/tasks/textextraction_pdf.py index 06ba041..3e2b4da 100644 --- a/nostr_dvm/tasks/textextraction_pdf.py +++ b/nostr_dvm/tasks/textextraction_pdf.py @@ -28,11 +28,14 @@ class TextExtractionPDF(DVMTaskInterface): KIND: int = EventDefinitions.KIND_NIP90_EXTRACT_TEXT TASK: str = "pdf-to-text" FIX_COST: float = 0 + dependencies = ["pypdf==3.17.1"] def __init__(self, name, dvm_config: DVMConfig, nip89config: NIP89Config, admin_config: AdminConfig = None, options=None): super().__init__(name, dvm_config, nip89config, admin_config, options) + + def is_input_supported(self, tags): for tag in tags: if tag.as_vec()[0] == 'i': diff --git a/nostr_dvm/tasks/textgeneration_llmlite.py b/nostr_dvm/tasks/textgeneration_llmlite.py index 974e3ca..c5f4866 100644 --- a/nostr_dvm/tasks/textgeneration_llmlite.py +++ b/nostr_dvm/tasks/textgeneration_llmlite.py @@ -3,7 +3,7 @@ import os from pathlib import Path import dotenv -from litellm import completion + from nostr_dvm.interfaces.dvmtaskinterface import DVMTaskInterface from nostr_dvm.utils.admin_utils import AdminConfig @@ -27,6 +27,7 @@ class TextGenerationOLLAMA(DVMTaskInterface): KIND: int = EventDefinitions.KIND_NIP90_GENERATE_TEXT TASK: str = "text-to-text" FIX_COST: float = 0 + dependencies = ["litellm==1.12.3"] def __init__(self, name, dvm_config: DVMConfig, nip89config: NIP89Config, admin_config: AdminConfig = None, options=None): @@ -71,6 +72,8 @@ class TextGenerationOLLAMA(DVMTaskInterface): return request_form def process(self, request_form): + from litellm import completion + options = DVMTaskInterface.set_options(request_form) try: diff --git a/nostr_dvm/tasks/translation_google.py b/nostr_dvm/tasks/translation_google.py index 220140d..518e186 100644 --- a/nostr_dvm/tasks/translation_google.py +++ b/nostr_dvm/tasks/translation_google.py @@ -27,6 +27,7 @@ class TranslationGoogle(DVMTaskInterface): KIND: int = EventDefinitions.KIND_NIP90_TRANSLATE_TEXT TASK: str = "translation" FIX_COST: float = 0 + dependencies = ["translatepy==2.3"] def __init__(self, name, dvm_config: DVMConfig, nip89config: NIP89Config, admin_config: AdminConfig = None, options=None): diff --git a/setup.py b/setup.py index ec5c963..4101063 100644 --- a/setup.py +++ b/setup.py @@ -6,17 +6,29 @@ LONG_DESCRIPTION = '-' # Setting up setup( - # the name must match the folder name 'verysimplemodule' name="nostr-dvm", version=VERSION, author="Believethehype", author_email="-", description=DESCRIPTION, long_description=LONG_DESCRIPTION, - packages=find_packages(), - install_requires=[], # add any additional packages that - # needs to be installed along with your package. Eg: 'caer' - + packages=find_packages(include=['nostr_dvm']), + install_requires=["nostr-sdk==0.0.5", + "bech32==1.2.0", + "pycryptodome==3.19.0", + "python-dotenv==1.0.0", + "emoji==2.8.0", + "eva-decord==0.6.1", + "ffmpegio==0.8.5", + "lnurl==0.4.1", + "pandas==2.1.3", + "Pillow==10.1.0", + "PyUpload==0.1.4", + "requests==2.31.0", + "instaloader==4.10.1", + "pytube==15.0.0", + "moviepy==2.0.0.dev2" + ], keywords=['nostr', 'nip90', 'dvm', 'data vending machine'], classifiers=[ "Development Status :: 3 - Alpha",