mirror of
https://github.com/believethehype/nostrdvm.git
synced 2025-06-21 02:30:57 +02:00
add paramters to signal if encryption and cashu are supported and show them in the bot
(might need to be renamed if convention says other)
This commit is contained in:
parent
26dab119c3
commit
091fe10a94
16
bot/bot.py
16
bot/bot.py
@ -510,10 +510,24 @@ class Bot:
|
|||||||
if nip89content_str is not None:
|
if nip89content_str is not None:
|
||||||
nip89content = json.loads(nip89content_str)
|
nip89content = json.loads(nip89content_str)
|
||||||
info = ""
|
info = ""
|
||||||
|
cashu_accepted = False
|
||||||
|
encryption_supported = False
|
||||||
|
|
||||||
if nip89content.get("name"):
|
if nip89content.get("name"):
|
||||||
info += "Name: " + nip89content.get("name") + "\n"
|
info += "Name: " + nip89content.get("name") + "\n"
|
||||||
|
if nip89content.get("image"):
|
||||||
info += nip89content.get("image") + "\n"
|
info += nip89content.get("image") + "\n"
|
||||||
info += "About:\n" + nip89content.get("about") + "\n"
|
if nip89content.get("about"):
|
||||||
|
info += "About:\n" + nip89content.get("about") + "\n\n"
|
||||||
|
if nip89content.get("acceptsCashu"):
|
||||||
|
cashu_accepted = str(nip89content.get("acceptsCashu"))
|
||||||
|
|
||||||
|
if nip89content.get("encryptionSupported"):
|
||||||
|
encryption_supported = str(nip89content.get("encryptionSupported"))
|
||||||
|
|
||||||
|
info += "Encryption supported: " + str(encryption_supported) + "\n"
|
||||||
|
info += "Cashu accepted: " + str(cashu_accepted) + "\n\n"
|
||||||
|
if nip89content.get("nip90Params"):
|
||||||
params = nip89content["nip90Params"]
|
params = nip89content["nip90Params"]
|
||||||
info += "\nParameters:\n"
|
info += "\nParameters:\n"
|
||||||
for param in params:
|
for param in params:
|
||||||
|
@ -20,6 +20,7 @@ class DVMTaskInterface:
|
|||||||
PUBLIC_KEY: str
|
PUBLIC_KEY: str
|
||||||
DVM = DVM
|
DVM = DVM
|
||||||
SUPPORTS_ENCRYPTION = True # DVMs build with this framework support encryption, but others might not.
|
SUPPORTS_ENCRYPTION = True # DVMs build with this framework support encryption, but others might not.
|
||||||
|
ACCEPTS_CASHU = True # DVMs build with this framework support encryption, but others might not.
|
||||||
dvm_config: DVMConfig
|
dvm_config: DVMConfig
|
||||||
admin_config: AdminConfig
|
admin_config: AdminConfig
|
||||||
|
|
||||||
|
35
main.py
35
main.py
@ -1,8 +1,9 @@
|
|||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
|
from datetime import timedelta
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
import dotenv
|
import dotenv
|
||||||
from nostr_sdk import PublicKey
|
from nostr_sdk import PublicKey, Options, Client, Keys
|
||||||
|
|
||||||
from bot.bot import Bot
|
from bot.bot import Bot
|
||||||
from interfaces.dvmtaskinterface import DVMTaskInterface
|
from interfaces.dvmtaskinterface import DVMTaskInterface
|
||||||
@ -22,7 +23,8 @@ from utils.admin_utils import AdminConfig
|
|||||||
from utils.backend_utils import keep_alive
|
from utils.backend_utils import keep_alive
|
||||||
from utils.definitions import EventDefinitions
|
from utils.definitions import EventDefinitions
|
||||||
from utils.dvmconfig import DVMConfig
|
from utils.dvmconfig import DVMConfig
|
||||||
from utils.nip89_utils import NIP89Config, check_and_set_d_tag
|
from utils.external_dvm_utils import build_external_dvm
|
||||||
|
from utils.nip89_utils import NIP89Config, check_and_set_d_tag, nip89_fetch_events_pubkey
|
||||||
from utils.nostr_utils import check_and_set_private_key
|
from utils.nostr_utils import check_and_set_private_key
|
||||||
from utils.output_utils import PostProcessFunctionType
|
from utils.output_utils import PostProcessFunctionType
|
||||||
|
|
||||||
@ -102,6 +104,8 @@ def playground():
|
|||||||
"name": name,
|
"name": name,
|
||||||
"image": "https://image.nostr.build/229c14e440895da30de77b3ca145d66d4b04efb4027ba3c44ca147eecde891f1.jpg",
|
"image": "https://image.nostr.build/229c14e440895da30de77b3ca145d66d4b04efb4027ba3c44ca147eecde891f1.jpg",
|
||||||
"about": "I draw images based on a prompt in the style of paper sketches",
|
"about": "I draw images based on a prompt in the style of paper sketches",
|
||||||
|
"encryptionSupported": True,
|
||||||
|
"cashuAccepted": True,
|
||||||
"nip90Params": nip90params
|
"nip90Params": nip90params
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -151,31 +155,13 @@ def playground():
|
|||||||
|
|
||||||
|
|
||||||
#Let's define a function so we can add external DVMs to our bot, we will instanciate it afterwards
|
#Let's define a function so we can add external DVMs to our bot, we will instanciate it afterwards
|
||||||
def build_external_dvm(name, pubkey, task, kind, fix_cost, per_unit_cost,
|
|
||||||
external_post_process=PostProcessFunctionType.NONE):
|
|
||||||
dvm_config = DVMConfig()
|
|
||||||
dvm_config.PUBLIC_KEY = PublicKey.from_hex(pubkey).to_hex()
|
|
||||||
dvm_config.FIX_COST = fix_cost
|
|
||||||
dvm_config.PER_UNIT_COST = per_unit_cost
|
|
||||||
dvm_config.EXTERNAL_POST_PROCESS_TYPE = external_post_process
|
|
||||||
nip89info = {
|
|
||||||
"name": name,
|
|
||||||
}
|
|
||||||
nip89config = NIP89Config()
|
|
||||||
nip89config.KIND = kind
|
|
||||||
nip89config.CONTENT = json.dumps(nip89info)
|
|
||||||
|
|
||||||
interface = DVMTaskInterface(name=name, dvm_config=dvm_config, nip89config=nip89config, task=task)
|
|
||||||
|
|
||||||
return interface
|
|
||||||
|
|
||||||
# Spawn DVM7.. oh wait, actually we don't spawn a new DVM, we use the dvmtaskinterface to define an external dvm by providing some info about it, such as
|
# Spawn DVM7.. oh wait, actually we don't spawn a new DVM, we use the dvmtaskinterface to define an external dvm by providing some info about it, such as
|
||||||
# their pubkey, a name, task, kind etc. (unencrypted)
|
# their pubkey, a name, task, kind etc. (unencrypted)
|
||||||
tasktiger_external = build_external_dvm(name="External DVM: TaskTiger",
|
tasktiger_external = build_external_dvm(pubkey="d483935d6bfcef3645195c04c97bbb70aedb6e65665c5ea83e562ca3c7acb978",
|
||||||
pubkey="d483935d6bfcef3645195c04c97bbb70aedb6e65665c5ea83e562ca3c7acb978",
|
|
||||||
task="text-to-image",
|
task="text-to-image",
|
||||||
kind=EventDefinitions.KIND_NIP90_GENERATE_IMAGE,
|
kind=EventDefinitions.KIND_NIP90_GENERATE_IMAGE,
|
||||||
fix_cost=80, per_unit_cost=0)
|
fix_cost=80, per_unit_cost=0, config=bot_config)
|
||||||
|
|
||||||
tasktiger_external.SUPPORTS_ENCRYPTION = False # if the dvm does not support encrypted events, just send a regular NIP90 event and mark it with p tag. Other dvms might answer initally
|
tasktiger_external.SUPPORTS_ENCRYPTION = False # if the dvm does not support encrypted events, just send a regular NIP90 event and mark it with p tag. Other dvms might answer initally
|
||||||
bot_config.SUPPORTED_DVMS.append(tasktiger_external)
|
bot_config.SUPPORTED_DVMS.append(tasktiger_external)
|
||||||
@ -187,12 +173,11 @@ def playground():
|
|||||||
media_bringer.run()
|
media_bringer.run()
|
||||||
|
|
||||||
# DVM: 9 Another external dvm for recommendations:
|
# DVM: 9 Another external dvm for recommendations:
|
||||||
ymhm_external = build_external_dvm(name="External DVM: You might have missed",
|
ymhm_external = build_external_dvm(pubkey="6b37d5dc88c1cbd32d75b713f6d4c2f7766276f51c9337af9d32c8d715cc1b93",
|
||||||
pubkey="6b37d5dc88c1cbd32d75b713f6d4c2f7766276f51c9337af9d32c8d715cc1b93",
|
|
||||||
task="content-discovery",
|
task="content-discovery",
|
||||||
kind=EventDefinitions.KIND_NIP90_CONTENT_DISCOVERY,
|
kind=EventDefinitions.KIND_NIP90_CONTENT_DISCOVERY,
|
||||||
fix_cost=0, per_unit_cost=0,
|
fix_cost=0, per_unit_cost=0,
|
||||||
external_post_process=PostProcessFunctionType.LIST_TO_EVENTS)
|
external_post_process=PostProcessFunctionType.LIST_TO_EVENTS, config=bot_config)
|
||||||
# If we get back a list of people or events, we can post-process it to make it readable in social clients
|
# If we get back a list of people or events, we can post-process it to make it readable in social clients
|
||||||
|
|
||||||
ymhm_external.SUPPORTS_ENCRYPTION = False
|
ymhm_external.SUPPORTS_ENCRYPTION = False
|
||||||
|
@ -168,6 +168,8 @@ def build_example(name, identifier, admin_config):
|
|||||||
"name": name,
|
"name": name,
|
||||||
"image": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
"image": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||||
"about": "I search notes",
|
"about": "I search notes",
|
||||||
|
"encryptionSupported": True,
|
||||||
|
"cashuAccepted": True,
|
||||||
"nip90Params": nip90params
|
"nip90Params": nip90params
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -193,7 +195,7 @@ if __name__ == '__main__':
|
|||||||
admin_config.UPDATE_PROFILE = False
|
admin_config.UPDATE_PROFILE = False
|
||||||
admin_config.LUD16 = ""
|
admin_config.LUD16 = ""
|
||||||
|
|
||||||
dvm = build_example("advanced_search", "discovery_content_search", admin_config)
|
dvm = build_example("Advanced Nostr Search", "discovery_content_search", admin_config)
|
||||||
dvm.run()
|
dvm.run()
|
||||||
|
|
||||||
keep_alive()
|
keep_alive()
|
||||||
|
@ -100,6 +100,8 @@ def build_example(name, identifier, admin_config):
|
|||||||
"name": name,
|
"name": name,
|
||||||
"image": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
"image": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||||
"about": "I convert videos from urls to given output format.",
|
"about": "I convert videos from urls to given output format.",
|
||||||
|
"encryptionSupported": True,
|
||||||
|
"cashuAccepted": True,
|
||||||
"nip90Params": nip90params
|
"nip90Params": nip90params
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -194,6 +194,8 @@ def build_example(name, identifier, admin_config):
|
|||||||
"name": name,
|
"name": name,
|
||||||
"image": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
"image": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||||
"about": "I discover users you follow, but that have been inactive on Nostr",
|
"about": "I discover users you follow, but that have been inactive on Nostr",
|
||||||
|
"encryptionSupported": True,
|
||||||
|
"cashuAccepted": True,
|
||||||
"nip90Params": nip90params
|
"nip90Params": nip90params
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -144,6 +144,8 @@ def build_example(name, identifier, admin_config):
|
|||||||
"name": name,
|
"name": name,
|
||||||
"image": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
"image": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||||
"about": "I use OpenAI's DALL·E 3",
|
"about": "I use OpenAI's DALL·E 3",
|
||||||
|
"encryptionSupported": True,
|
||||||
|
"cashuAccepted": True,
|
||||||
"nip90Params": nip90params
|
"nip90Params": nip90params
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -190,6 +190,8 @@ def build_example(name, identifier, admin_config, server_address, default_model=
|
|||||||
"name": name,
|
"name": name,
|
||||||
"image": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
"image": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||||
"about": "I draw images based on a prompt with a Model called unstable diffusion",
|
"about": "I draw images based on a prompt with a Model called unstable diffusion",
|
||||||
|
"encryptionSupported": True,
|
||||||
|
"cashuAccepted": True,
|
||||||
"nip90Params": nip90params
|
"nip90Params": nip90params
|
||||||
}
|
}
|
||||||
nip89config = NIP89Config()
|
nip89config = NIP89Config()
|
||||||
|
@ -219,6 +219,8 @@ def build_example(name, identifier, admin_config, server_address, default_lora="
|
|||||||
"name": name,
|
"name": name,
|
||||||
"image": "https://image.nostr.build/229c14e440895da30de77b3ca145d66d4b04efb4027ba3c44ca147eecde891f1.jpg",
|
"image": "https://image.nostr.build/229c14e440895da30de77b3ca145d66d4b04efb4027ba3c44ca147eecde891f1.jpg",
|
||||||
"about": "I convert an image to another image, kinda random for now. ",
|
"about": "I convert an image to another image, kinda random for now. ",
|
||||||
|
"encryptionSupported": True,
|
||||||
|
"cashuAccepted": True,
|
||||||
"nip90Params": nip90params
|
"nip90Params": nip90params
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -150,6 +150,8 @@ def build_example(name, identifier, admin_config):
|
|||||||
"name": name,
|
"name": name,
|
||||||
"image": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
"image": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||||
"about": "I extract text from media files with the Google API. I understand English by default",
|
"about": "I extract text from media files with the Google API. I understand English by default",
|
||||||
|
"encryptionSupported": True,
|
||||||
|
"cashuAccepted": True,
|
||||||
"nip90Params": nip90params
|
"nip90Params": nip90params
|
||||||
}
|
}
|
||||||
nip89config = NIP89Config()
|
nip89config = NIP89Config()
|
||||||
|
@ -104,6 +104,8 @@ def build_example(name, identifier, admin_config):
|
|||||||
"name": name,
|
"name": name,
|
||||||
"image": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
"image": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||||
"about": "I extract text from pdf documents. I only support Latin letters",
|
"about": "I extract text from pdf documents. I only support Latin letters",
|
||||||
|
"encryptionSupported": True,
|
||||||
|
"cashuAccepted": True,
|
||||||
"nip90Params": nip90params
|
"nip90Params": nip90params
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -175,6 +175,8 @@ def build_example(name, identifier, admin_config, server_address):
|
|||||||
"name": name,
|
"name": name,
|
||||||
"image": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
"image": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||||
"about": "I extract text from media files with WhisperX",
|
"about": "I extract text from media files with WhisperX",
|
||||||
|
"encryptionSupported": True,
|
||||||
|
"cashuAccepted": True,
|
||||||
"nip90Params": nip90params
|
"nip90Params": nip90params
|
||||||
}
|
}
|
||||||
nip89config = NIP89Config()
|
nip89config = NIP89Config()
|
||||||
|
@ -133,6 +133,8 @@ def build_example(name, identifier, admin_config):
|
|||||||
"image": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
"image": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||||
"about": "I translate text from given text/event/job. Currently using Google TranslationGoogle Services to translate "
|
"about": "I translate text from given text/event/job. Currently using Google TranslationGoogle Services to translate "
|
||||||
"input into the language defined in params.",
|
"input into the language defined in params.",
|
||||||
|
"encryptionSupported": True,
|
||||||
|
"cashuAccepted": True,
|
||||||
"nip90Params": nip90params
|
"nip90Params": nip90params
|
||||||
}
|
}
|
||||||
nip89config = NIP89Config()
|
nip89config = NIP89Config()
|
||||||
|
@ -132,6 +132,8 @@ def build_example(name, identifier, admin_config):
|
|||||||
"image": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
"image": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||||
"about": "I translate text from given text/event/job using LibreTranslate Services to translate "
|
"about": "I translate text from given text/event/job using LibreTranslate Services to translate "
|
||||||
"input into the language defined in params.",
|
"input into the language defined in params.",
|
||||||
|
"encryptionSupported": True,
|
||||||
|
"cashuAccepted": True,
|
||||||
"nip90Params": nip90params
|
"nip90Params": nip90params
|
||||||
}
|
}
|
||||||
nip89config = NIP89Config()
|
nip89config = NIP89Config()
|
||||||
|
@ -195,3 +195,5 @@ def keep_alive():
|
|||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
os.kill(os.getpid(), signal.SIGKILL)
|
os.kill(os.getpid(), signal.SIGKILL)
|
||||||
exit(1)
|
exit(1)
|
||||||
|
|
||||||
|
|
||||||
|
68
utils/external_dvm_utils.py
Normal file
68
utils/external_dvm_utils.py
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
import json
|
||||||
|
from datetime import timedelta
|
||||||
|
|
||||||
|
from nostr_sdk import PublicKey, Options, Keys, Client
|
||||||
|
|
||||||
|
from interfaces.dvmtaskinterface import DVMTaskInterface
|
||||||
|
from utils.dvmconfig import DVMConfig
|
||||||
|
from utils.nip89_utils import NIP89Config, nip89_fetch_events_pubkey
|
||||||
|
from utils.output_utils import PostProcessFunctionType
|
||||||
|
|
||||||
|
|
||||||
|
def build_external_dvm(pubkey, task, kind, fix_cost, per_unit_cost, config,
|
||||||
|
external_post_process=PostProcessFunctionType.NONE):
|
||||||
|
dvm_config = DVMConfig()
|
||||||
|
dvm_config.PUBLIC_KEY = PublicKey.from_hex(pubkey).to_hex()
|
||||||
|
dvm_config.FIX_COST = fix_cost
|
||||||
|
dvm_config.PER_UNIT_COST = per_unit_cost
|
||||||
|
dvm_config.EXTERNAL_POST_PROCESS_TYPE = external_post_process
|
||||||
|
|
||||||
|
opts = (Options().wait_for_send(True).send_timeout(timedelta(seconds=config.RELAY_TIMEOUT))
|
||||||
|
.skip_disconnected_relays(True))
|
||||||
|
keys = Keys.from_sk_str(config.PRIVATE_KEY)
|
||||||
|
client = Client.with_opts(keys, opts)
|
||||||
|
|
||||||
|
for relay in config.RELAY_LIST:
|
||||||
|
client.add_relay(relay)
|
||||||
|
client.connect()
|
||||||
|
|
||||||
|
nip89content_str = nip89_fetch_events_pubkey(client, pubkey, kind)
|
||||||
|
name = "External DVM"
|
||||||
|
image = "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg"
|
||||||
|
about = "An External DVM with no info"
|
||||||
|
nip90params = {}
|
||||||
|
encryption_supported = False
|
||||||
|
cashu_accepted = False
|
||||||
|
print(nip89content_str)
|
||||||
|
if nip89content_str is not None:
|
||||||
|
nip89content = json.loads(nip89content_str)
|
||||||
|
if nip89content.get("name"):
|
||||||
|
name = nip89content.get("name")
|
||||||
|
if nip89content.get("image"):
|
||||||
|
image = nip89content.get("image")
|
||||||
|
if nip89content.get("about"):
|
||||||
|
about = nip89content.get("about")
|
||||||
|
if nip89content.get("nip90Params"):
|
||||||
|
nip90params = nip89content["nip90Params"]
|
||||||
|
if nip89content.get("encryptionSupported"):
|
||||||
|
encryption_supported = nip89content["encryptionSupported"]
|
||||||
|
if nip89content.get("cashuAccepted"):
|
||||||
|
cashu_accepted = nip89content["cashuAccepted"]
|
||||||
|
|
||||||
|
nip89info = {
|
||||||
|
"name": name,
|
||||||
|
"image": image,
|
||||||
|
"about": about,
|
||||||
|
"encryptionSupported": encryption_supported,
|
||||||
|
"cashuAccepted": cashu_accepted,
|
||||||
|
"nip90Params": nip90params
|
||||||
|
}
|
||||||
|
nip89config = NIP89Config()
|
||||||
|
nip89config.KIND = kind
|
||||||
|
nip89config.CONTENT = json.dumps(nip89info)
|
||||||
|
|
||||||
|
interface = DVMTaskInterface(name=name, dvm_config=dvm_config, nip89config=nip89config, task=task)
|
||||||
|
interface.SUPPORTS_ENCRYPTION = encryption_supported
|
||||||
|
interface.ACCEPTS_CASHU = cashu_accepted
|
||||||
|
|
||||||
|
return interface
|
Loading…
x
Reference in New Issue
Block a user