Token导航 LogoToken导航TokenDH.com
研究检索敏感数据github未标认证来源可访问许可证需确认审计异常

nostr-dvms诺斯特尔 DVM

Agent Skill

nostr-dvms 用于查找、检索和筛选相关信息,适合在 Codex、Claude、Cursor、Gemini CLI 中需要根据关键词、任务场景或来源线索快速定位候选结果时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

总安装

212

周安装

9

GitHub Stars

4

下载量

74
CodexClaudeCursorGemini CLI

安装说明

本站只整理中文说明和来源信息,不托管安装包,也不代用户安装。

GitHub

来源数

2

许可证

unknown

最后核验

2026-05-01

来源状态

来源可访问

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:nostr-dvms(诺斯特尔 DVM)
来源仓库:https://github.com/accolver/skill-maker
仓库路径:skills/nostr-dvms
安装命令:
npx skills add https://github.com/accolver/skill-maker --skill nostr-dvms
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 npx skills 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

skills.shnpx skills
npx skills add https://github.com/accolver/skill-maker --skill nostr-dvms

简介

用于查找、检索和筛选相关信息,快速定位候选结果。

  • 适合在关键词搜索、任务场景或来源线索下使用,提升信息获取效率。
  • 可结合来源仓库和原始 README 核验具体用法,确保适用性。
  • 安装方式:通过 npx 从 GitHub 仓库添加,支持 Codex、Claude、Cursor、Gemini CLI。
  • 注意:安装前建议确认权限范围和维护状态,避免触发不必要的联网或文件操作。

SKILL.md

Nostr Data Vending Machines (NIP-90)

Overview

Build AI and compute services on Nostr using the Data Vending Machine protocol. DVMs follow a simple pattern: customers publish job requests (kind 5000-5999), service providers process them and return results (kind 6000-6999), with optional feedback events (kind 7000) for status updates and payment negotiation.

When to Use

  • The task involves NIP-90 Data Vending Machine request, feedback, result, discovery, or payment flows.
  • The user is building a DVM client, a DVM service provider, or chaining DVM jobs together.
  • The request includes DVM job kinds, encrypted params, payment-required states, or NIP-89 discovery events.
  • The problem is DVM-specific orchestration, not generic Nostr publishing.

Do NOT use when:

  • The task is generic event construction without DVM semantics.
  • The work is plain Lightning or Cashu integration outside a DVM workflow.
  • The problem is relay transport or subscription infrastructure rather than DVM behavior.

Response format

Always structure the final response with these top-level sections, in this order:

  1. Summary — state the task, scope, and main conclusion in 1-3 sentences.
  2. Decision / Approach — state the key classification, assumptions, or chosen path.
  3. Artifacts — provide the primary deliverable(s) for this skill. Use clear subheadings for multiple files, commands, JSON payloads, queries, or documents.
  4. Validation — state checks performed, important risks, caveats, or unresolved questions.
  5. Next steps — list concrete follow-up actions, or write None if nothing remains.

Rules:

  • Do not omit a section; write None when a section does not apply.
  • If files are produced, list each file path under Artifacts before its contents.
  • If commands, JSON, SQL, YAML, or code are produced, put each artifact in fenced code blocks with the correct language tag when possible.
  • Keep section names exactly as written above so output stays predictable across skills.

Workflow

1. Determine Your Role

Ask: "Am I building a service provider, a client, or both?"

RolePublishesSubscribes To
Service Providerkind:6xxx resultskind:5xxx requests
kind:7000 feedbackkind:5 cancellations
kind:31990 NIP-89 info
Customer/Clientkind:5xxx requestskind:6xxx results
kind:5 cancellationskind:7000 feedback

2. Choose the Job Kind

Each DVM operation has a specific kind number. The result kind is always request kind + 1000.

Request KindResult KindDescription
50006000Text extraction
50016001Summarization
50026002Translation
50036003Text generation
50056005Content discovery/recommendation
50506050Text-to-speech
51006100Image generation
52506250Event publishing

See references/dvm-kinds.md for the full registry.

3. Build the Job Request (Customer Side)

Construct a kind 5000-5999 event:

{
  "kind": 5001,
  "content": "",
  "tags": [
    ["i", "<data>", "<input-type>", "<relay>", "<marker>"],
    ["output", "<mime-type>"],
    ["relays", "wss://relay.example.com"],
    ["bid", "<msat-amount>"],
    ["t", "<topic-tag>"],
    ["p", "<preferred-service-provider-pubkey>"]
  ]
}

Input types — the second element of the i tag:

TypeMeaningExample
textRaw text data, no resolution needed["i", "Hello world", "text"]
urlURL to fetch content from["i", "https://example.com/doc.pdf", "url"]
eventReference to a Nostr event by ID["i", "<event-id>", "event", "wss://relay"]
jobOutput of a previous DVM job (for chaining)["i", "<job-event-id>", "job"]

Optional tags:

  • output — requested MIME type for the result (e.g., text/plain)
  • param — key/value parameters: ["param", "lang", "es"]
  • bid — max millisats the customer will pay
  • relays — where service providers should publish responses
  • p — preferred service provider pubkey (others MAY still respond)
  • t — topic tags for categorization

4. Handle Job Feedback (Kind 7000)

Service providers send feedback events to communicate status:

{
  "kind": 7000,
  "content": "",
  "tags": [
    ["status", "<status>", "<extra-info>"],
    ["amount", "<msat>", "<bolt11>"],
    ["e", "<job-request-id>", "<relay-hint>"],
    ["p", "<customer-pubkey>"]
  ]
}

Status values:

StatusMeaningAction Required
payment-requiredSP requires payment before continuingCustomer must pay
processingSP is actively working on the jobWait for result
errorSP could not process the jobCheck extra-info for why
successSP completed the jobResult incoming
partialSP has partial results (content may have samples)More results coming

Critical: payment-required is a hard gate — the SP will NOT proceed until paid. Other statuses are informational.

The content field MAY contain partial results (e.g., a sample of processed output) for any feedback status.

5. Publish Job Results (Service Provider Side)

Result kind = request kind + 1000 (e.g., 5001 → 6001):

{
  "kind": 6001,
  "content": "<result-payload>",
  "tags": [
    ["request", "<stringified-original-job-request-event>"],
    ["e", "<job-request-id>", "<relay-hint>"],
    ["i", "<original-input-data>"],
    ["p", "<customer-pubkey>"],
    ["amount", "<msat>", "<optional-bolt11>"]
  ]
}

Required tags:

  • request — the FULL original job request event as a stringified JSON string
  • e — references the job request event ID
  • p — the customer's pubkey (so they can find the result)

Important: The request tag value is the entire job request event serialized as a JSON string, not just the event ID.

6. Handle Payments

The payment model is flexible by design:

  1. Customer bids: Include ["bid", "<msat>"] in the request
  2. SP quotes: Include ["amount", "<msat>", "<bolt11>"] in feedback/result
  3. Customer pays: Either pay the bolt11 invoice OR zap the result event
Customer                    Service Provider
   |                              |
   |-- kind:5001 (bid: 5000) ---->|
   |                              |
   |<-- kind:7000 ----------------|  status: payment-required
   |    amount: 3000, bolt11:...  |
   |                              |
   |-- pay bolt11 or zap -------->|
   |                              |
   |<-- kind:7000 ----------------|  status: processing
   |                              |
   |<-- kind:6001 ----------------|  result + amount tag

SPs MUST use payment-required feedback to block until paid. They SHOULD NOT silently wait for payment without signaling.

7. Implement Job Chaining

Chain jobs by using the job input type — the output of one job becomes the input of the next:

{
  "kind": 5001,
  "content": "",
  "tags": [
    ["i", "<translation-job-event-id>", "job"],
    ["param", "lang", "en"]
  ]
}

The service provider for job #2 watches for the result of job #1, then processes it. Payment timing is at the SP's discretion — they may wait for the customer to zap job #1's result before starting job #2.

Chaining example — translate then summarize:

Step 1: Publish kind:5002 (translation)
  ["i", "https://article.com/post", "url"]
  ["param", "lang", "en"]

Step 2: Publish kind:5001 (summarization)
  ["i", "<step-1-event-id>", "job"]

8. Add Encrypted Parameters (Optional)

For privacy, encrypt i and param tags using NIP-04 with the service provider's pubkey:

  1. Collect all i and param tags into a JSON array
  2. Encrypt with NIP-04 (customer's private key + SP's public key)
  3. Put encrypted payload in content field
  4. Add ["encrypted"] tag and ["p", "<sp-pubkey>"] tag
  5. Remove plaintext i and param tags from the event
{
  "kind": 5001,
  "content": "<nip04-encrypted-payload>",
  "tags": [
    ["p", "<service-provider-pubkey>"],
    ["encrypted"],
    ["output", "text/plain"],
    ["relays", "wss://relay.example.com"]
  ]
}

The SP decrypts the content to recover the input parameters. If the request was encrypted, the result MUST also be encrypted and tagged ["encrypted"].

9. Publish Service Provider Discovery (NIP-89)

Advertise DVM capabilities with a kind:31990 handler announcement:

{
  "kind": 31990,
  "content": "{\"name\":\"My Summarizer DVM\",\"about\":\"AI-powered text summarization\"}",
  "tags": [
    ["d", "<unique-identifier>"],
    ["k", "5001"],
    ["t", "summarization"],
    ["t", "ai"]
  ]
}
  • k tag: the job request kind this DVM handles (e.g., 5001)
  • t tags: topic tags for discoverability
  • content: JSON with name and about fields (like kind:0 metadata)

10. Handle Cancellation

Customers cancel jobs by publishing a kind:5 deletion request:

{
  "kind": 5,
  "tags": [
    ["e", "<job-request-event-id>"],
    ["k", "5001"]
  ],
  "content": "No longer needed"
}

Service providers SHOULD monitor for kind:5 events tagging their active jobs and stop processing if a cancellation is received.

Checklist

  • Job request uses correct kind (5000-5999) for the operation type
  • Input i tags use valid input-type (text, url, event, job)
  • Job result kind = request kind + 1000
  • Result includes request tag with full stringified job request event
  • Result includes e tag referencing the job request event ID
  • Result includes p tag with customer's pubkey
  • Feedback events use kind:7000 with valid status values
  • payment-required feedback includes amount tag with bolt11
  • Encrypted requests have ["encrypted"] tag and encrypted content
  • Encrypted results also use ["encrypted"] tag
  • Job chains use ["i", "<event-id>", "job"] input type
  • NIP-89 discovery uses kind:31990 with k tag for supported job kind
  • Cancellation uses kind:5 with e tag referencing the job request

Example: Complete Summarization DVM Service Provider

Scenario: Build a service provider that handles kind:5001 summarization requests.

Subscribe to job requests

const sub = relay.subscribe([{ kinds: [5001] }]);

Process a request

async function handleJobRequest(event: NostrEvent) {
  const customerPubkey = event.pubkey;
  const jobId = event.id;

  // 1. Send processing feedback
  await publishEvent({
    kind: 7000,
    content: "",
    tags: [
      ["status", "processing", "Starting summarization"],
      ["e", jobId, "wss://relay.example.com"],
      ["p", customerPubkey],
    ],
  });

  // 2. Extract input data
  const inputTag = event.tags.find((t) => t[0] === "i");
  const inputType = inputTag[2]; // "text", "url", "event", "job"
  let inputData: string;

  if (inputType === "text") {
    inputData = inputTag[1];
  } else if (inputType === "url") {
    inputData = await fetch(inputTag[1]).then((r) => r.text());
  } else if (inputType === "event") {
    inputData = await fetchNostrEvent(inputTag[1], inputTag[3]);
  }

  // 3. Process the job
  const summary = await summarize(inputData);

  // 4. Publish result (kind = 5001 + 1000 = 6001)
  await publishEvent({
    kind: 6001,
    content: summary,
    tags: [
      ["request", JSON.stringify(event)],
      ["e", jobId, "wss://relay.example.com"],
      ["i", inputTag[1], inputTag[2]],
      ["p", customerPubkey],
      ["amount", "1000", generateBolt11(1000)],
    ],
  });
}

Common Mistakes

MistakeWhy It BreaksFix
Result kind doesn't match request kind + 1000Clients can't correlate results to requestskind:5001 → kind:6001, always add 1000
Missing request tag in resultClients can't verify the result matches their requestInclude full stringified job request event
request tag contains event ID instead of full eventSpec requires the complete event JSON as a stringUse JSON.stringify(originalEvent)
Using payment-required without amount tagCustomer has no way to payAlways include ["amount", "<msat>", "<bolt11>"]
Forgetting p tag in result/feedbackCustomer can't find the result via subscriptionAlways tag the customer's pubkey
Encrypting request but not resultLeaks the output even though input was privateIf request has ["encrypted"], result must too
Using wrong input-type in i tagSP can't resolve the input datatext=raw, url=fetch, event=nostr lookup, job=chain
Chaining with event type instead of jobSP treats it as a static event, not a job outputUse ["i", "<id>", "job"] for chaining
Not monitoring for kind:5 cancellationsWastes compute on cancelled jobsSubscribe to kind:5 events tagging active jobs
NIP-89 announcement missing k tagClients can't discover which kinds the DVM supportsInclude ["k", "5001"] for each supported kind

Key Principles

  1. Result kind = request kind + 1000 — This is the fundamental mapping. kind:5001 always produces kind:6001. No exceptions.
  2. The request tag carries the full event — Not just the ID. The entire original job request event must be stringified and included so clients can verify the result matches their request without additional lookups.
  3. Payment is flexible, signaling is not — SPs can choose when to require payment, but they MUST use payment-required feedback to signal it. Silent blocking creates a broken UX.
  4. Encrypted in = encrypted out — If the job request uses encrypted params, the result MUST also be encrypted. Partial encryption leaks data.
  5. Job chaining uses the job input type — Not event. The job type tells the SP to wait for and use the output of a previous DVM job, not just read a static event.

适合场景

01

用户想查找某类 Agent Skill 时

02

需要根据任务场景推荐可安装能力包时

03

需要对比不同来源的安装命令和来源信息时

能力概览

能力 1

按任务关键词查找相关 Skills

能力 2

展示可复制的安装命令

能力 3

保留来源站点、仓库和原始说明,方便继续核验

能力 4

展示第三方安全扫描或审计结果

安装后应在对应宿主中按原始 README 的触发条件使用;具体调用方式请以来源页面和 README 为准。

平台分布

Codex

35.16%
按下载量换算26

Claude

30.7%
按下载量换算23

Cursor

15.91%
按下载量换算12

Gemini CLI

8.46%
按下载量换算6

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

未通过

权限和风险

敏感数据

该 Skill 可能接触密钥、Token、环境变量或敏感配置,应进入高风险复核队列,默认不自动发布。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。来源安全扫描存在 warning/failed 结果,不能写成本站确认安全。当前只有一个来源,正式发布前建议补源仓库或其他目录站核验。

来源信息

继续浏览同类 Skills