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<InputTag> 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
This commit is contained in:
Claude
2026-03-30 03:21:19 +00:00
parent cd4b352bdf
commit 273af03c9f
20 changed files with 232 additions and 0 deletions
@@ -28,6 +28,9 @@ import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder
import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl
import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate
import com.vitorpamplona.quartz.nip31Alts.alt 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 import com.vitorpamplona.quartz.utils.TimeUtils
@Stable @Stable
@@ -40,6 +43,18 @@ class NIP90ContentDiscoveryRequestEvent(
content: String, content: String,
sig: HexKey, sig: HexKey,
) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) {
fun inputs(): List<InputTag> = 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 { companion object {
const val KIND = 5300 const val KIND = 5300
const val ALT = "NIP90 Content Discovery request" const val ALT = "NIP90 Content Discovery request"
@@ -26,7 +26,11 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder
import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate
import com.vitorpamplona.quartz.nip31Alts.alt 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.inputText
import com.vitorpamplona.quartz.nip90Dvms.tags.inputs
import com.vitorpamplona.quartz.nip90Dvms.tags.param import com.vitorpamplona.quartz.nip90Dvms.tags.param
import com.vitorpamplona.quartz.utils.TimeUtils import com.vitorpamplona.quartz.utils.TimeUtils
@@ -39,6 +43,18 @@ class NIP90ContentSearchRequestEvent(
content: String, content: String,
sig: HexKey, sig: HexKey,
) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) {
fun inputs(): List<InputTag> = 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 { companion object {
const val KIND = 5302 const val KIND = 5302
const val ALT = "NIP90 Content Search request" const val ALT = "NIP90 Content Search request"
@@ -26,7 +26,10 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder
import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate
import com.vitorpamplona.quartz.nip31Alts.alt 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.inputText
import com.vitorpamplona.quartz.nip90Dvms.tags.inputs
import com.vitorpamplona.quartz.nip90Dvms.tags.param import com.vitorpamplona.quartz.nip90Dvms.tags.param
import com.vitorpamplona.quartz.utils.TimeUtils import com.vitorpamplona.quartz.utils.TimeUtils
@@ -39,6 +42,14 @@ class NIP90EventCountRequestEvent(
content: String, content: String,
sig: HexKey, sig: HexKey,
) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) {
fun inputs(): List<InputTag> = tags.inputs()
fun relays(): List<String> = tags.dvmParamAll("relay")
fun groups(): List<String> = tags.dvmParamAll("group")
fun filterJson(): String = content
companion object { companion object {
const val KIND = 5400 const val KIND = 5400
const val ALT = "NIP90 Event Count request" const val ALT = "NIP90 Event Count request"
@@ -26,7 +26,10 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder
import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate
import com.vitorpamplona.quartz.nip31Alts.alt 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.inputText
import com.vitorpamplona.quartz.nip90Dvms.tags.inputs
import com.vitorpamplona.quartz.nip90Dvms.tags.param import com.vitorpamplona.quartz.nip90Dvms.tags.param
import com.vitorpamplona.quartz.utils.TimeUtils import com.vitorpamplona.quartz.utils.TimeUtils
@@ -39,6 +42,12 @@ class NIP90EventPowDelegationRequestEvent(
content: String, content: String,
sig: HexKey, sig: HexKey,
) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) {
fun inputs(): List<InputTag> = tags.inputs()
fun eventJsons(): List<String> = inputs().filter { it.type == "text" }.map { it.value }
fun pow(): Int? = tags.dvmParam("pow")?.toIntOrNull()
companion object { companion object {
const val KIND = 5970 const val KIND = 5970
const val ALT = "NIP90 Event PoW Delegation request" const val ALT = "NIP90 Event PoW Delegation request"
@@ -26,7 +26,10 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder
import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate
import com.vitorpamplona.quartz.nip31Alts.alt 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.inputText
import com.vitorpamplona.quartz.nip90Dvms.tags.inputs
import com.vitorpamplona.quartz.nip90Dvms.tags.param import com.vitorpamplona.quartz.nip90Dvms.tags.param
import com.vitorpamplona.quartz.utils.TimeUtils import com.vitorpamplona.quartz.utils.TimeUtils
@@ -39,6 +42,12 @@ class NIP90EventPublishScheduleRequestEvent(
content: String, content: String,
sig: HexKey, sig: HexKey,
) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) {
fun inputs(): List<InputTag> = tags.inputs()
fun eventJsons(): List<String> = inputs().filter { it.type == "text" }.map { it.value }
fun relays(): List<String> = tags.dvmParamValues("relays") ?: emptyList()
companion object { companion object {
const val KIND = 5905 const val KIND = 5905
const val ALT = "NIP90 Event Publish Schedule request" const val ALT = "NIP90 Event Publish Schedule request"
@@ -26,7 +26,10 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder
import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate
import com.vitorpamplona.quartz.nip31Alts.alt 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.inputEvent
import com.vitorpamplona.quartz.nip90Dvms.tags.inputs
import com.vitorpamplona.quartz.utils.TimeUtils import com.vitorpamplona.quartz.utils.TimeUtils
@Immutable @Immutable
@@ -38,6 +41,10 @@ class NIP90EventTimestampingRequestEvent(
content: String, content: String,
sig: HexKey, sig: HexKey,
) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) {
fun inputs(): List<InputTag> = tags.inputs()
fun eventIdToStamp(): HexKey? = tags.firstInputByType("event")?.value
companion object { companion object {
const val KIND = 5900 const val KIND = 5900
const val ALT = "NIP90 Event Timestamping request" const val ALT = "NIP90 Event Timestamping request"
@@ -26,8 +26,12 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder
import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate
import com.vitorpamplona.quartz.nip31Alts.alt 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.inputText
import com.vitorpamplona.quartz.nip90Dvms.tags.inputUrl 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.nip90Dvms.tags.param
import com.vitorpamplona.quartz.utils.TimeUtils import com.vitorpamplona.quartz.utils.TimeUtils
@@ -40,6 +44,22 @@ class NIP90ImageGenerationRequestEvent(
content: String, content: String,
sig: HexKey, sig: HexKey,
) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) {
fun inputs(): List<InputTag> = 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 { companion object {
const val KIND = 5100 const val KIND = 5100
const val ALT = "NIP90 Image Generation request" const val ALT = "NIP90 Image Generation request"
@@ -26,7 +26,10 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder
import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate
import com.vitorpamplona.quartz.nip31Alts.alt 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.inputUrl
import com.vitorpamplona.quartz.nip90Dvms.tags.inputs
import com.vitorpamplona.quartz.utils.TimeUtils import com.vitorpamplona.quartz.utils.TimeUtils
@Immutable @Immutable
@@ -38,6 +41,10 @@ class NIP90ImageToVideoRequestEvent(
content: String, content: String,
sig: HexKey, sig: HexKey,
) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) {
fun inputs(): List<InputTag> = tags.inputs()
fun imageUrl(): String? = tags.firstInputByType("url")?.value
companion object { companion object {
const val KIND = 5202 const val KIND = 5202
const val ALT = "NIP90 Image-to-Video request" const val ALT = "NIP90 Image-to-Video request"
@@ -26,7 +26,10 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder
import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate
import com.vitorpamplona.quartz.nip31Alts.alt 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.inputUrl
import com.vitorpamplona.quartz.nip90Dvms.tags.inputs
import com.vitorpamplona.quartz.utils.TimeUtils import com.vitorpamplona.quartz.utils.TimeUtils
@Immutable @Immutable
@@ -38,6 +41,10 @@ class NIP90MalwareScanRequestEvent(
content: String, content: String,
sig: HexKey, sig: HexKey,
) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) {
fun inputs(): List<InputTag> = tags.inputs()
fun fileUrl(): String? = tags.firstInputByType("url")?.value
companion object { companion object {
const val KIND = 5500 const val KIND = 5500
const val ALT = "NIP90 Malware Scan request" const val ALT = "NIP90 Malware Scan request"
@@ -26,7 +26,10 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder
import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate
import com.vitorpamplona.quartz.nip31Alts.alt 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.inputText
import com.vitorpamplona.quartz.nip90Dvms.tags.inputs
import com.vitorpamplona.quartz.utils.TimeUtils import com.vitorpamplona.quartz.utils.TimeUtils
@Immutable @Immutable
@@ -38,6 +41,10 @@ class NIP90OpReturnRequestEvent(
content: String, content: String,
sig: HexKey, sig: HexKey,
) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) {
fun inputs(): List<InputTag> = tags.inputs()
fun text(): String? = tags.firstInputByType("text")?.value
companion object { companion object {
const val KIND = 5901 const val KIND = 5901
const val ALT = "NIP90 OP_RETURN Creation request" const val ALT = "NIP90 OP_RETURN Creation request"
@@ -26,7 +26,11 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder
import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate
import com.vitorpamplona.quartz.nip31Alts.alt 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.inputText
import com.vitorpamplona.quartz.nip90Dvms.tags.inputs
import com.vitorpamplona.quartz.nip90Dvms.tags.param import com.vitorpamplona.quartz.nip90Dvms.tags.param
import com.vitorpamplona.quartz.utils.TimeUtils import com.vitorpamplona.quartz.utils.TimeUtils
@@ -39,6 +43,12 @@ class NIP90PeopleSearchRequestEvent(
content: String, content: String,
sig: HexKey, sig: HexKey,
) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) {
fun inputs(): List<InputTag> = tags.inputs()
fun searchQuery(): String? = tags.firstInputByType("text")?.value
fun maxResults(): Int? = tags.dvmParam("max_results")?.toIntOrNull()
companion object { companion object {
const val KIND = 5303 const val KIND = 5303
const val ALT = "NIP90 People Search request" const val ALT = "NIP90 People Search request"
@@ -26,8 +26,12 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder
import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate
import com.vitorpamplona.quartz.nip31Alts.alt 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.inputEvent
import com.vitorpamplona.quartz.nip90Dvms.tags.inputs
import com.vitorpamplona.quartz.nip90Dvms.tags.output 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.nip90Dvms.tags.param
import com.vitorpamplona.quartz.utils.TimeUtils import com.vitorpamplona.quartz.utils.TimeUtils
@@ -40,6 +44,12 @@ class NIP90SummarizationRequestEvent(
content: String, content: String,
sig: HexKey, sig: HexKey,
) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) {
fun inputs(): List<InputTag> = tags.inputs()
fun outputMimeType(): String? = tags.outputMimeType()
fun length(): String? = tags.dvmParam("length")
companion object { companion object {
const val KIND = 5001 const val KIND = 5001
const val ALT = "NIP90 Summarization request" const val ALT = "NIP90 Summarization request"
@@ -24,4 +24,18 @@ import com.vitorpamplona.quartz.nip01Core.core.TagArray
fun TagArray.inputs() = mapNotNull(InputTag::parse) 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.outputMimeType() = firstNotNullOfOrNull(OutputTag::parse)?.mimeType
fun TagArray.dvmParams(): List<Pair<String, List<String>>> =
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<String>? = firstOrNull { it.size >= 3 && it[0] == "param" && it[1] == key }?.drop(2)
fun TagArray.dvmParamAll(key: String): List<String> =
filter { it.size >= 3 && it[0] == "param" && it[1] == key }
.mapNotNull { it.getOrNull(2) }
@@ -26,8 +26,13 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder
import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate
import com.vitorpamplona.quartz.nip31Alts.alt 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.inputUrl
import com.vitorpamplona.quartz.nip90Dvms.tags.inputs
import com.vitorpamplona.quartz.nip90Dvms.tags.output 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.nip90Dvms.tags.param
import com.vitorpamplona.quartz.utils.TimeUtils import com.vitorpamplona.quartz.utils.TimeUtils
@@ -40,6 +45,16 @@ class NIP90TextExtractionRequestEvent(
content: String, content: String,
sig: HexKey, sig: HexKey,
) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) {
fun inputs(): List<InputTag> = 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 { companion object {
const val KIND = 5000 const val KIND = 5000
const val ALT = "NIP90 Text Extraction request" const val ALT = "NIP90 Text Extraction request"
@@ -26,8 +26,12 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder
import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate
import com.vitorpamplona.quartz.nip31Alts.alt 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.inputPrompt
import com.vitorpamplona.quartz.nip90Dvms.tags.inputs
import com.vitorpamplona.quartz.nip90Dvms.tags.output 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.nip90Dvms.tags.param
import com.vitorpamplona.quartz.utils.TimeUtils import com.vitorpamplona.quartz.utils.TimeUtils
@@ -40,6 +44,22 @@ class NIP90TextGenerationRequestEvent(
content: String, content: String,
sig: HexKey, sig: HexKey,
) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) {
fun inputs(): List<InputTag> = 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 { companion object {
const val KIND = 5050 const val KIND = 5050
const val ALT = "NIP90 Text Generation request" const val ALT = "NIP90 Text Generation request"
@@ -26,7 +26,11 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder
import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate
import com.vitorpamplona.quartz.nip31Alts.alt 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.inputText
import com.vitorpamplona.quartz.nip90Dvms.tags.inputs
import com.vitorpamplona.quartz.nip90Dvms.tags.param import com.vitorpamplona.quartz.nip90Dvms.tags.param
import com.vitorpamplona.quartz.utils.TimeUtils import com.vitorpamplona.quartz.utils.TimeUtils
@@ -39,6 +43,12 @@ class NIP90TextToSpeechRequestEvent(
content: String, content: String,
sig: HexKey, sig: HexKey,
) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) {
fun inputs(): List<InputTag> = tags.inputs()
fun text(): String? = tags.firstInputByType("text")?.value
fun language(): String? = tags.dvmParam("language")
companion object { companion object {
const val KIND = 5250 const val KIND = 5250
const val ALT = "NIP90 Text-to-Speech request" const val ALT = "NIP90 Text-to-Speech request"
@@ -26,7 +26,10 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder
import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate
import com.vitorpamplona.quartz.nip31Alts.alt 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.inputEvent
import com.vitorpamplona.quartz.nip90Dvms.tags.inputs
import com.vitorpamplona.quartz.nip90Dvms.tags.param import com.vitorpamplona.quartz.nip90Dvms.tags.param
import com.vitorpamplona.quartz.utils.TimeUtils import com.vitorpamplona.quartz.utils.TimeUtils
@@ -39,6 +42,10 @@ class NIP90TranslationRequestEvent(
content: String, content: String,
sig: HexKey, sig: HexKey,
) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) {
fun inputs(): List<InputTag> = tags.inputs()
fun language(): String? = tags.dvmParam("language")
companion object { companion object {
const val KIND = 5002 const val KIND = 5002
const val ALT = "NIP90 Translation request" const val ALT = "NIP90 Translation request"
@@ -26,6 +26,9 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder
import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate
import com.vitorpamplona.quartz.nip31Alts.alt 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 import com.vitorpamplona.quartz.utils.TimeUtils
@Immutable @Immutable
@@ -37,6 +40,12 @@ class NIP90UserDiscoveryRequestEvent(
content: String, content: String,
sig: HexKey, sig: HexKey,
) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) {
fun inputs(): List<InputTag> = tags.inputs()
fun dvmPubKey(): HexKey? = tags.firstOrNull { it.size >= 2 && it[0] == "p" }?.get(1)
fun user(): String? = tags.dvmParam("user")
companion object { companion object {
const val KIND = 5301 const val KIND = 5301
const val ALT = "NIP90 User Discovery request" const val ALT = "NIP90 User Discovery request"
@@ -26,8 +26,12 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder
import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate
import com.vitorpamplona.quartz.nip31Alts.alt 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.inputUrl
import com.vitorpamplona.quartz.nip90Dvms.tags.inputs
import com.vitorpamplona.quartz.nip90Dvms.tags.output 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.nip90Dvms.tags.param
import com.vitorpamplona.quartz.utils.TimeUtils import com.vitorpamplona.quartz.utils.TimeUtils
@@ -40,6 +44,14 @@ class NIP90VideoConversionRequestEvent(
content: String, content: String,
sig: HexKey, sig: HexKey,
) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) {
fun inputs(): List<InputTag> = 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 { companion object {
const val KIND = 5200 const val KIND = 5200
const val ALT = "NIP90 Video Conversion request" const val ALT = "NIP90 Video Conversion request"
@@ -26,8 +26,13 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder
import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate
import com.vitorpamplona.quartz.nip31Alts.alt 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.inputUrl
import com.vitorpamplona.quartz.nip90Dvms.tags.inputs
import com.vitorpamplona.quartz.nip90Dvms.tags.output 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.nip90Dvms.tags.param
import com.vitorpamplona.quartz.utils.TimeUtils import com.vitorpamplona.quartz.utils.TimeUtils
@@ -40,6 +45,18 @@ class NIP90VideoTranslationRequestEvent(
content: String, content: String,
sig: HexKey, sig: HexKey,
) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) {
fun inputs(): List<InputTag> = 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 { companion object {
const val KIND = 5201 const val KIND = 5201
const val ALT = "NIP90 Video Translation request" const val ALT = "NIP90 Video Translation request"