From 273af03c9fe5fb76ec1806c4beaf4c098e523a3c Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 30 Mar 2026 03:21:19 +0000 Subject: [PATCH] feat: add reader methods to all DVM request events for server processing Each request event now exposes typed reader methods so DVM servers can extract inputs, parameters, and configuration from incoming requests: - inputs() returns List with value, type, relay, marker - Kind-specific readers like language(), model(), searchQuery(), pow(), etc. - Shared TagArrayExt with dvmParam(), dvmParamAll(), dvmParamValues() Also adds readers to existing 5300/5301 events (dvmPubKey, user, relays). https://claude.ai/code/session_017aamEDeRtQ2H9u5U9B5F1C --- .../NIP90ContentDiscoveryRequestEvent.kt | 15 ++++++++++++++ .../NIP90ContentSearchRequestEvent.kt | 16 +++++++++++++++ .../eventCount/NIP90EventCountRequestEvent.kt | 11 ++++++++++ .../NIP90EventPowDelegationRequestEvent.kt | 9 +++++++++ .../NIP90EventPublishScheduleRequestEvent.kt | 9 +++++++++ .../NIP90EventTimestampingRequestEvent.kt | 7 +++++++ .../NIP90ImageGenerationRequestEvent.kt | 20 +++++++++++++++++++ .../NIP90ImageToVideoRequestEvent.kt | 7 +++++++ .../NIP90MalwareScanRequestEvent.kt | 7 +++++++ .../opReturn/NIP90OpReturnRequestEvent.kt | 7 +++++++ .../NIP90PeopleSearchRequestEvent.kt | 10 ++++++++++ .../NIP90SummarizationRequestEvent.kt | 10 ++++++++++ .../quartz/nip90Dvms/tags/TagArrayExt.kt | 14 +++++++++++++ .../NIP90TextExtractionRequestEvent.kt | 15 ++++++++++++++ .../NIP90TextGenerationRequestEvent.kt | 20 +++++++++++++++++++ .../NIP90TextToSpeechRequestEvent.kt | 10 ++++++++++ .../NIP90TranslationRequestEvent.kt | 7 +++++++ .../NIP90UserDiscoveryRequestEvent.kt | 9 +++++++++ .../NIP90VideoConversionRequestEvent.kt | 12 +++++++++++ .../NIP90VideoTranslationRequestEvent.kt | 17 ++++++++++++++++ 20 files changed, 232 insertions(+) diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/contentDiscoveryRequest/NIP90ContentDiscoveryRequestEvent.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/contentDiscoveryRequest/NIP90ContentDiscoveryRequestEvent.kt index 00ca00088..48d820f57 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/contentDiscoveryRequest/NIP90ContentDiscoveryRequestEvent.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/contentDiscoveryRequest/NIP90ContentDiscoveryRequestEvent.kt @@ -28,6 +28,9 @@ import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate import com.vitorpamplona.quartz.nip31Alts.alt +import com.vitorpamplona.quartz.nip90Dvms.tags.InputTag +import com.vitorpamplona.quartz.nip90Dvms.tags.dvmParam +import com.vitorpamplona.quartz.nip90Dvms.tags.inputs import com.vitorpamplona.quartz.utils.TimeUtils @Stable @@ -40,6 +43,18 @@ class NIP90ContentDiscoveryRequestEvent( content: String, sig: HexKey, ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { + fun inputs(): List = tags.inputs() + + fun dvmPubKey(): HexKey? = tags.firstOrNull { it.size >= 2 && it[0] == "p" }?.get(1) + + fun relays() = tags.relays() + + fun params() = tags.params() + + fun user(): String? = tags.dvmParam("user") + + fun maxResults(): String? = tags.dvmParam("max_results") + companion object { const val KIND = 5300 const val ALT = "NIP90 Content Discovery request" diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/contentSearch/NIP90ContentSearchRequestEvent.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/contentSearch/NIP90ContentSearchRequestEvent.kt index 6ea427fab..f7093bfb5 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/contentSearch/NIP90ContentSearchRequestEvent.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/contentSearch/NIP90ContentSearchRequestEvent.kt @@ -26,7 +26,11 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate import com.vitorpamplona.quartz.nip31Alts.alt +import com.vitorpamplona.quartz.nip90Dvms.tags.InputTag +import com.vitorpamplona.quartz.nip90Dvms.tags.dvmParam +import com.vitorpamplona.quartz.nip90Dvms.tags.firstInputByType import com.vitorpamplona.quartz.nip90Dvms.tags.inputText +import com.vitorpamplona.quartz.nip90Dvms.tags.inputs import com.vitorpamplona.quartz.nip90Dvms.tags.param import com.vitorpamplona.quartz.utils.TimeUtils @@ -39,6 +43,18 @@ class NIP90ContentSearchRequestEvent( content: String, sig: HexKey, ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { + fun inputs(): List = tags.inputs() + + fun searchQuery(): String? = tags.firstInputByType("text")?.value + + fun users(): String? = tags.dvmParam("users") + + fun since(): Long? = tags.dvmParam("since")?.toLongOrNull() + + fun until(): Long? = tags.dvmParam("until")?.toLongOrNull() + + fun maxResults(): Int? = tags.dvmParam("max_results")?.toIntOrNull() + companion object { const val KIND = 5302 const val ALT = "NIP90 Content Search request" diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/eventCount/NIP90EventCountRequestEvent.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/eventCount/NIP90EventCountRequestEvent.kt index 3bbed29c7..7af517357 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/eventCount/NIP90EventCountRequestEvent.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/eventCount/NIP90EventCountRequestEvent.kt @@ -26,7 +26,10 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate import com.vitorpamplona.quartz.nip31Alts.alt +import com.vitorpamplona.quartz.nip90Dvms.tags.InputTag +import com.vitorpamplona.quartz.nip90Dvms.tags.dvmParamAll import com.vitorpamplona.quartz.nip90Dvms.tags.inputText +import com.vitorpamplona.quartz.nip90Dvms.tags.inputs import com.vitorpamplona.quartz.nip90Dvms.tags.param import com.vitorpamplona.quartz.utils.TimeUtils @@ -39,6 +42,14 @@ class NIP90EventCountRequestEvent( content: String, sig: HexKey, ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { + fun inputs(): List = tags.inputs() + + fun relays(): List = tags.dvmParamAll("relay") + + fun groups(): List = tags.dvmParamAll("group") + + fun filterJson(): String = content + companion object { const val KIND = 5400 const val ALT = "NIP90 Event Count request" diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/eventPowDelegation/NIP90EventPowDelegationRequestEvent.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/eventPowDelegation/NIP90EventPowDelegationRequestEvent.kt index 3e4842255..c371a0d6c 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/eventPowDelegation/NIP90EventPowDelegationRequestEvent.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/eventPowDelegation/NIP90EventPowDelegationRequestEvent.kt @@ -26,7 +26,10 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate import com.vitorpamplona.quartz.nip31Alts.alt +import com.vitorpamplona.quartz.nip90Dvms.tags.InputTag +import com.vitorpamplona.quartz.nip90Dvms.tags.dvmParam import com.vitorpamplona.quartz.nip90Dvms.tags.inputText +import com.vitorpamplona.quartz.nip90Dvms.tags.inputs import com.vitorpamplona.quartz.nip90Dvms.tags.param import com.vitorpamplona.quartz.utils.TimeUtils @@ -39,6 +42,12 @@ class NIP90EventPowDelegationRequestEvent( content: String, sig: HexKey, ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { + fun inputs(): List = tags.inputs() + + fun eventJsons(): List = inputs().filter { it.type == "text" }.map { it.value } + + fun pow(): Int? = tags.dvmParam("pow")?.toIntOrNull() + companion object { const val KIND = 5970 const val ALT = "NIP90 Event PoW Delegation request" diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/eventPublishSchedule/NIP90EventPublishScheduleRequestEvent.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/eventPublishSchedule/NIP90EventPublishScheduleRequestEvent.kt index 072d6d77b..a82e27d51 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/eventPublishSchedule/NIP90EventPublishScheduleRequestEvent.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/eventPublishSchedule/NIP90EventPublishScheduleRequestEvent.kt @@ -26,7 +26,10 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate import com.vitorpamplona.quartz.nip31Alts.alt +import com.vitorpamplona.quartz.nip90Dvms.tags.InputTag +import com.vitorpamplona.quartz.nip90Dvms.tags.dvmParamValues import com.vitorpamplona.quartz.nip90Dvms.tags.inputText +import com.vitorpamplona.quartz.nip90Dvms.tags.inputs import com.vitorpamplona.quartz.nip90Dvms.tags.param import com.vitorpamplona.quartz.utils.TimeUtils @@ -39,6 +42,12 @@ class NIP90EventPublishScheduleRequestEvent( content: String, sig: HexKey, ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { + fun inputs(): List = tags.inputs() + + fun eventJsons(): List = inputs().filter { it.type == "text" }.map { it.value } + + fun relays(): List = tags.dvmParamValues("relays") ?: emptyList() + companion object { const val KIND = 5905 const val ALT = "NIP90 Event Publish Schedule request" diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/eventTimestamping/NIP90EventTimestampingRequestEvent.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/eventTimestamping/NIP90EventTimestampingRequestEvent.kt index b48d49aa1..3686612a4 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/eventTimestamping/NIP90EventTimestampingRequestEvent.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/eventTimestamping/NIP90EventTimestampingRequestEvent.kt @@ -26,7 +26,10 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate import com.vitorpamplona.quartz.nip31Alts.alt +import com.vitorpamplona.quartz.nip90Dvms.tags.InputTag +import com.vitorpamplona.quartz.nip90Dvms.tags.firstInputByType import com.vitorpamplona.quartz.nip90Dvms.tags.inputEvent +import com.vitorpamplona.quartz.nip90Dvms.tags.inputs import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -38,6 +41,10 @@ class NIP90EventTimestampingRequestEvent( content: String, sig: HexKey, ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { + fun inputs(): List = tags.inputs() + + fun eventIdToStamp(): HexKey? = tags.firstInputByType("event")?.value + companion object { const val KIND = 5900 const val ALT = "NIP90 Event Timestamping request" diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/imageGeneration/NIP90ImageGenerationRequestEvent.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/imageGeneration/NIP90ImageGenerationRequestEvent.kt index 22d4887e2..4d613568a 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/imageGeneration/NIP90ImageGenerationRequestEvent.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/imageGeneration/NIP90ImageGenerationRequestEvent.kt @@ -26,8 +26,12 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate import com.vitorpamplona.quartz.nip31Alts.alt +import com.vitorpamplona.quartz.nip90Dvms.tags.InputTag +import com.vitorpamplona.quartz.nip90Dvms.tags.dvmParam +import com.vitorpamplona.quartz.nip90Dvms.tags.firstInputByType import com.vitorpamplona.quartz.nip90Dvms.tags.inputText import com.vitorpamplona.quartz.nip90Dvms.tags.inputUrl +import com.vitorpamplona.quartz.nip90Dvms.tags.inputs import com.vitorpamplona.quartz.nip90Dvms.tags.param import com.vitorpamplona.quartz.utils.TimeUtils @@ -40,6 +44,22 @@ class NIP90ImageGenerationRequestEvent( content: String, sig: HexKey, ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { + fun inputs(): List = tags.inputs() + + fun prompt(): String? = tags.firstInputByType("text")?.value + + fun sourceImageUrl(): String? = tags.firstInputByType("url")?.value + + fun model(): String? = tags.dvmParam("model") + + fun lora(): String? = tags.dvmParam("lora") + + fun ratio(): String? = tags.dvmParam("ratio") + + fun size(): String? = tags.dvmParam("size") + + fun negativePrompt(): String? = tags.dvmParam("negative_prompt") + companion object { const val KIND = 5100 const val ALT = "NIP90 Image Generation request" diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/imageToVideo/NIP90ImageToVideoRequestEvent.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/imageToVideo/NIP90ImageToVideoRequestEvent.kt index 597f53302..ab5720c98 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/imageToVideo/NIP90ImageToVideoRequestEvent.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/imageToVideo/NIP90ImageToVideoRequestEvent.kt @@ -26,7 +26,10 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate import com.vitorpamplona.quartz.nip31Alts.alt +import com.vitorpamplona.quartz.nip90Dvms.tags.InputTag +import com.vitorpamplona.quartz.nip90Dvms.tags.firstInputByType import com.vitorpamplona.quartz.nip90Dvms.tags.inputUrl +import com.vitorpamplona.quartz.nip90Dvms.tags.inputs import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -38,6 +41,10 @@ class NIP90ImageToVideoRequestEvent( content: String, sig: HexKey, ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { + fun inputs(): List = tags.inputs() + + fun imageUrl(): String? = tags.firstInputByType("url")?.value + companion object { const val KIND = 5202 const val ALT = "NIP90 Image-to-Video request" diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/malwareScanning/NIP90MalwareScanRequestEvent.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/malwareScanning/NIP90MalwareScanRequestEvent.kt index 9eacb7522..489686c3b 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/malwareScanning/NIP90MalwareScanRequestEvent.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/malwareScanning/NIP90MalwareScanRequestEvent.kt @@ -26,7 +26,10 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate import com.vitorpamplona.quartz.nip31Alts.alt +import com.vitorpamplona.quartz.nip90Dvms.tags.InputTag +import com.vitorpamplona.quartz.nip90Dvms.tags.firstInputByType import com.vitorpamplona.quartz.nip90Dvms.tags.inputUrl +import com.vitorpamplona.quartz.nip90Dvms.tags.inputs import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -38,6 +41,10 @@ class NIP90MalwareScanRequestEvent( content: String, sig: HexKey, ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { + fun inputs(): List = tags.inputs() + + fun fileUrl(): String? = tags.firstInputByType("url")?.value + companion object { const val KIND = 5500 const val ALT = "NIP90 Malware Scan request" diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/opReturn/NIP90OpReturnRequestEvent.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/opReturn/NIP90OpReturnRequestEvent.kt index 2482045c8..f3fbca7f9 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/opReturn/NIP90OpReturnRequestEvent.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/opReturn/NIP90OpReturnRequestEvent.kt @@ -26,7 +26,10 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate import com.vitorpamplona.quartz.nip31Alts.alt +import com.vitorpamplona.quartz.nip90Dvms.tags.InputTag +import com.vitorpamplona.quartz.nip90Dvms.tags.firstInputByType import com.vitorpamplona.quartz.nip90Dvms.tags.inputText +import com.vitorpamplona.quartz.nip90Dvms.tags.inputs import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -38,6 +41,10 @@ class NIP90OpReturnRequestEvent( content: String, sig: HexKey, ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { + fun inputs(): List = tags.inputs() + + fun text(): String? = tags.firstInputByType("text")?.value + companion object { const val KIND = 5901 const val ALT = "NIP90 OP_RETURN Creation request" diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/peopleSearch/NIP90PeopleSearchRequestEvent.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/peopleSearch/NIP90PeopleSearchRequestEvent.kt index 55e988d5f..a19081508 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/peopleSearch/NIP90PeopleSearchRequestEvent.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/peopleSearch/NIP90PeopleSearchRequestEvent.kt @@ -26,7 +26,11 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate import com.vitorpamplona.quartz.nip31Alts.alt +import com.vitorpamplona.quartz.nip90Dvms.tags.InputTag +import com.vitorpamplona.quartz.nip90Dvms.tags.dvmParam +import com.vitorpamplona.quartz.nip90Dvms.tags.firstInputByType import com.vitorpamplona.quartz.nip90Dvms.tags.inputText +import com.vitorpamplona.quartz.nip90Dvms.tags.inputs import com.vitorpamplona.quartz.nip90Dvms.tags.param import com.vitorpamplona.quartz.utils.TimeUtils @@ -39,6 +43,12 @@ class NIP90PeopleSearchRequestEvent( content: String, sig: HexKey, ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { + fun inputs(): List = tags.inputs() + + fun searchQuery(): String? = tags.firstInputByType("text")?.value + + fun maxResults(): Int? = tags.dvmParam("max_results")?.toIntOrNull() + companion object { const val KIND = 5303 const val ALT = "NIP90 People Search request" diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/summarization/NIP90SummarizationRequestEvent.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/summarization/NIP90SummarizationRequestEvent.kt index 99efffd41..907d5f300 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/summarization/NIP90SummarizationRequestEvent.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/summarization/NIP90SummarizationRequestEvent.kt @@ -26,8 +26,12 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate import com.vitorpamplona.quartz.nip31Alts.alt +import com.vitorpamplona.quartz.nip90Dvms.tags.InputTag +import com.vitorpamplona.quartz.nip90Dvms.tags.dvmParam import com.vitorpamplona.quartz.nip90Dvms.tags.inputEvent +import com.vitorpamplona.quartz.nip90Dvms.tags.inputs import com.vitorpamplona.quartz.nip90Dvms.tags.output +import com.vitorpamplona.quartz.nip90Dvms.tags.outputMimeType import com.vitorpamplona.quartz.nip90Dvms.tags.param import com.vitorpamplona.quartz.utils.TimeUtils @@ -40,6 +44,12 @@ class NIP90SummarizationRequestEvent( content: String, sig: HexKey, ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { + fun inputs(): List = tags.inputs() + + fun outputMimeType(): String? = tags.outputMimeType() + + fun length(): String? = tags.dvmParam("length") + companion object { const val KIND = 5001 const val ALT = "NIP90 Summarization request" diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/tags/TagArrayExt.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/tags/TagArrayExt.kt index 48219735b..ab4b6e97c 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/tags/TagArrayExt.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/tags/TagArrayExt.kt @@ -24,4 +24,18 @@ import com.vitorpamplona.quartz.nip01Core.core.TagArray fun TagArray.inputs() = mapNotNull(InputTag::parse) +fun TagArray.firstInputByType(type: String) = inputs().firstOrNull { it.type == type } + fun TagArray.outputMimeType() = firstNotNullOfOrNull(OutputTag::parse)?.mimeType + +fun TagArray.dvmParams(): List>> = + filter { it.size >= 3 && it[0] == "param" } + .map { it[1] to it.drop(2) } + +fun TagArray.dvmParam(key: String): String? = firstOrNull { it.size >= 3 && it[0] == "param" && it[1] == key }?.getOrNull(2) + +fun TagArray.dvmParamValues(key: String): List? = firstOrNull { it.size >= 3 && it[0] == "param" && it[1] == key }?.drop(2) + +fun TagArray.dvmParamAll(key: String): List = + filter { it.size >= 3 && it[0] == "param" && it[1] == key } + .mapNotNull { it.getOrNull(2) } diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/textExtraction/NIP90TextExtractionRequestEvent.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/textExtraction/NIP90TextExtractionRequestEvent.kt index 12eb9b829..940e22716 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/textExtraction/NIP90TextExtractionRequestEvent.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/textExtraction/NIP90TextExtractionRequestEvent.kt @@ -26,8 +26,13 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate import com.vitorpamplona.quartz.nip31Alts.alt +import com.vitorpamplona.quartz.nip90Dvms.tags.InputTag +import com.vitorpamplona.quartz.nip90Dvms.tags.dvmParam +import com.vitorpamplona.quartz.nip90Dvms.tags.dvmParamValues import com.vitorpamplona.quartz.nip90Dvms.tags.inputUrl +import com.vitorpamplona.quartz.nip90Dvms.tags.inputs import com.vitorpamplona.quartz.nip90Dvms.tags.output +import com.vitorpamplona.quartz.nip90Dvms.tags.outputMimeType import com.vitorpamplona.quartz.nip90Dvms.tags.param import com.vitorpamplona.quartz.utils.TimeUtils @@ -40,6 +45,16 @@ class NIP90TextExtractionRequestEvent( content: String, sig: HexKey, ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { + fun inputs(): List = tags.inputs() + + fun outputMimeType(): String? = tags.outputMimeType() + + fun rangeStart(): String? = tags.dvmParamValues("range")?.getOrNull(0) + + fun rangeEnd(): String? = tags.dvmParamValues("range")?.getOrNull(1) + + fun alignment(): String? = tags.dvmParam("alignment") + companion object { const val KIND = 5000 const val ALT = "NIP90 Text Extraction request" diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/textGeneration/NIP90TextGenerationRequestEvent.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/textGeneration/NIP90TextGenerationRequestEvent.kt index 9f5650998..5d058c739 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/textGeneration/NIP90TextGenerationRequestEvent.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/textGeneration/NIP90TextGenerationRequestEvent.kt @@ -26,8 +26,12 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate import com.vitorpamplona.quartz.nip31Alts.alt +import com.vitorpamplona.quartz.nip90Dvms.tags.InputTag +import com.vitorpamplona.quartz.nip90Dvms.tags.dvmParam import com.vitorpamplona.quartz.nip90Dvms.tags.inputPrompt +import com.vitorpamplona.quartz.nip90Dvms.tags.inputs import com.vitorpamplona.quartz.nip90Dvms.tags.output +import com.vitorpamplona.quartz.nip90Dvms.tags.outputMimeType import com.vitorpamplona.quartz.nip90Dvms.tags.param import com.vitorpamplona.quartz.utils.TimeUtils @@ -40,6 +44,22 @@ class NIP90TextGenerationRequestEvent( content: String, sig: HexKey, ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { + fun inputs(): List = tags.inputs() + + fun outputMimeType(): String? = tags.outputMimeType() + + fun model(): String? = tags.dvmParam("model") + + fun maxTokens(): Int? = tags.dvmParam("max_tokens")?.toIntOrNull() + + fun temperature(): Double? = tags.dvmParam("temperature")?.toDoubleOrNull() + + fun topK(): Int? = tags.dvmParam("top_k")?.toIntOrNull() + + fun topP(): Double? = tags.dvmParam("top_p")?.toDoubleOrNull() + + fun frequencyPenalty(): Double? = tags.dvmParam("frequency_penalty")?.toDoubleOrNull() + companion object { const val KIND = 5050 const val ALT = "NIP90 Text Generation request" diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/textToSpeech/NIP90TextToSpeechRequestEvent.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/textToSpeech/NIP90TextToSpeechRequestEvent.kt index ee842cb4c..0a4565084 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/textToSpeech/NIP90TextToSpeechRequestEvent.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/textToSpeech/NIP90TextToSpeechRequestEvent.kt @@ -26,7 +26,11 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate import com.vitorpamplona.quartz.nip31Alts.alt +import com.vitorpamplona.quartz.nip90Dvms.tags.InputTag +import com.vitorpamplona.quartz.nip90Dvms.tags.dvmParam +import com.vitorpamplona.quartz.nip90Dvms.tags.firstInputByType import com.vitorpamplona.quartz.nip90Dvms.tags.inputText +import com.vitorpamplona.quartz.nip90Dvms.tags.inputs import com.vitorpamplona.quartz.nip90Dvms.tags.param import com.vitorpamplona.quartz.utils.TimeUtils @@ -39,6 +43,12 @@ class NIP90TextToSpeechRequestEvent( content: String, sig: HexKey, ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { + fun inputs(): List = tags.inputs() + + fun text(): String? = tags.firstInputByType("text")?.value + + fun language(): String? = tags.dvmParam("language") + companion object { const val KIND = 5250 const val ALT = "NIP90 Text-to-Speech request" diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/translation/NIP90TranslationRequestEvent.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/translation/NIP90TranslationRequestEvent.kt index 167060ceb..ad76d18e0 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/translation/NIP90TranslationRequestEvent.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/translation/NIP90TranslationRequestEvent.kt @@ -26,7 +26,10 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate import com.vitorpamplona.quartz.nip31Alts.alt +import com.vitorpamplona.quartz.nip90Dvms.tags.InputTag +import com.vitorpamplona.quartz.nip90Dvms.tags.dvmParam import com.vitorpamplona.quartz.nip90Dvms.tags.inputEvent +import com.vitorpamplona.quartz.nip90Dvms.tags.inputs import com.vitorpamplona.quartz.nip90Dvms.tags.param import com.vitorpamplona.quartz.utils.TimeUtils @@ -39,6 +42,10 @@ class NIP90TranslationRequestEvent( content: String, sig: HexKey, ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { + fun inputs(): List = tags.inputs() + + fun language(): String? = tags.dvmParam("language") + companion object { const val KIND = 5002 const val ALT = "NIP90 Translation request" diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/userDiscoveryRequest/NIP90UserDiscoveryRequestEvent.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/userDiscoveryRequest/NIP90UserDiscoveryRequestEvent.kt index 0acdb60cf..b06a1cd63 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/userDiscoveryRequest/NIP90UserDiscoveryRequestEvent.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/userDiscoveryRequest/NIP90UserDiscoveryRequestEvent.kt @@ -26,6 +26,9 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate import com.vitorpamplona.quartz.nip31Alts.alt +import com.vitorpamplona.quartz.nip90Dvms.tags.InputTag +import com.vitorpamplona.quartz.nip90Dvms.tags.dvmParam +import com.vitorpamplona.quartz.nip90Dvms.tags.inputs import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -37,6 +40,12 @@ class NIP90UserDiscoveryRequestEvent( content: String, sig: HexKey, ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { + fun inputs(): List = tags.inputs() + + fun dvmPubKey(): HexKey? = tags.firstOrNull { it.size >= 2 && it[0] == "p" }?.get(1) + + fun user(): String? = tags.dvmParam("user") + companion object { const val KIND = 5301 const val ALT = "NIP90 User Discovery request" diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/videoConversion/NIP90VideoConversionRequestEvent.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/videoConversion/NIP90VideoConversionRequestEvent.kt index 17efb7342..6524e9550 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/videoConversion/NIP90VideoConversionRequestEvent.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/videoConversion/NIP90VideoConversionRequestEvent.kt @@ -26,8 +26,12 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate import com.vitorpamplona.quartz.nip31Alts.alt +import com.vitorpamplona.quartz.nip90Dvms.tags.InputTag +import com.vitorpamplona.quartz.nip90Dvms.tags.dvmParamValues import com.vitorpamplona.quartz.nip90Dvms.tags.inputUrl +import com.vitorpamplona.quartz.nip90Dvms.tags.inputs import com.vitorpamplona.quartz.nip90Dvms.tags.output +import com.vitorpamplona.quartz.nip90Dvms.tags.outputMimeType import com.vitorpamplona.quartz.nip90Dvms.tags.param import com.vitorpamplona.quartz.utils.TimeUtils @@ -40,6 +44,14 @@ class NIP90VideoConversionRequestEvent( content: String, sig: HexKey, ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { + fun inputs(): List = tags.inputs() + + fun outputMimeType(): String? = tags.outputMimeType() + + fun rangeStart(): String? = tags.dvmParamValues("range")?.getOrNull(0) + + fun rangeEnd(): String? = tags.dvmParamValues("range")?.getOrNull(1) + companion object { const val KIND = 5200 const val ALT = "NIP90 Video Conversion request" diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/videoTranslation/NIP90VideoTranslationRequestEvent.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/videoTranslation/NIP90VideoTranslationRequestEvent.kt index d1fcbd0c6..8f32c372b 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/videoTranslation/NIP90VideoTranslationRequestEvent.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip90Dvms/videoTranslation/NIP90VideoTranslationRequestEvent.kt @@ -26,8 +26,13 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate import com.vitorpamplona.quartz.nip31Alts.alt +import com.vitorpamplona.quartz.nip90Dvms.tags.InputTag +import com.vitorpamplona.quartz.nip90Dvms.tags.dvmParam +import com.vitorpamplona.quartz.nip90Dvms.tags.dvmParamValues import com.vitorpamplona.quartz.nip90Dvms.tags.inputUrl +import com.vitorpamplona.quartz.nip90Dvms.tags.inputs import com.vitorpamplona.quartz.nip90Dvms.tags.output +import com.vitorpamplona.quartz.nip90Dvms.tags.outputMimeType import com.vitorpamplona.quartz.nip90Dvms.tags.param import com.vitorpamplona.quartz.utils.TimeUtils @@ -40,6 +45,18 @@ class NIP90VideoTranslationRequestEvent( content: String, sig: HexKey, ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { + fun inputs(): List = tags.inputs() + + fun outputMimeType(): String? = tags.outputMimeType() + + fun language(): String? = tags.dvmParam("language") + + fun subtitle(): String? = tags.dvmParam("subtitle") + + fun rangeStart(): String? = tags.dvmParamValues("range")?.getOrNull(0) + + fun rangeEnd(): String? = tags.dvmParamValues("range")?.getOrNull(1) + companion object { const val KIND = 5201 const val ALT = "NIP90 Video Translation request"