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 00ca000880..48d820f572 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 6ea427fab9..f7093bfb5f 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 3bbed29c76..7af5173577 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 3e4842255f..c371a0d6c0 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 072d6d77b0..a82e27d51c 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 b48d49aa1c..3686612a4b 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 22d4887e24..4d613568ab 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 597f533022..ab5720c980 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 9eacb7522f..489686c3ba 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 2482045c81..f3fbca7f9e 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 55e988d5fb..a190815081 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 99efffd41e..907d5f300e 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 48219735b3..ab4b6e97cc 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 12eb9b8295..940e22716a 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 9f56509981..5d058c7399 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 ee842cb4cf..0a45650843 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 167060cebf..ad76d18e0b 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 0acdb60cfa..b06a1cd63c 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 17efb7342a..6524e95507 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 d1fcbd0c6d..8f32c372b7 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"