Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

English | 中文版

NPS Python SDK (nps-lib)

License Candidate NCP NWP NIP NDP NOP

Python client library for the Neural Protocol Suite (NPS) — a complete internet protocol stack designed for AI agents and models.

PyPI package: nps-lib | Python namespace: nps_sdk

Status

v1.0.0-alpha.18 candidate — portable protocol conformance

Covers all five protocols — NCP + NWP + NIP + NDP + NOP — frame definitions, async client, Ed25519 identity management, plus full NPS-RFC-0002 X.509 + ACME agent-01 NID certificate primitives (nps_sdk.nip.x509 + nps_sdk.nip.acme).

The full SDK suite and the shared Alpha.17 conformance fixtures pass.

Alpha.15 additions: typed remote NIP CA client (nps_sdk.nip.NipCaClient), native-mode NWP serving helper (nps_sdk.nwp.NwpNativeNodeServer), and TC-N1/TC-N2 conformance manifest helpers (nps_sdk.conformance).

Requirements

  • Python 3.11+
  • Dependencies: msgpack, httpx, cryptography

Alpha.17 portable profiles

  • NCP 0.11 bounded native-server handshake and deterministic Caps negotiation.
  • NWP 0.20 portable Node/Bridge serving and bridge lifecycle.
  • NIP 0.13 portable CA, live revocation, signed CRL, and verification policy.
  • NDP 0.12 signed Announce admission and registry conflict/liveness policy.
  • NOP 0.9 deterministic orchestration, callback security, delegation, leases, and CR-0007 runtime decisions.

All five profiles consume the language-neutral fixtures under spec/conformance.

Installation

pip install nps-lib

For development:

pip install "nps-lib[dev]"

Modules

Module Description
nps_sdk.core Frame header, codec (Tier-1 JSON / Tier-2 MsgPack / Tier-3 BinaryVector), anchor cache, exceptions
nps_sdk.ncp NCP frames: AnchorFrame, DiffFrame, StreamFrame, CapsFrame, HelloFrame, ErrorFrame; NcpFailoverConnector (CR-0009 §3.3 re-resolving reconnect)
nps_sdk.nwp NWP frames: QueryFrame, ActionFrame; async NwpClient; native serving via NwpNativeNodeServer; Anchor Node server with the CR-0009 AnchorEpochGuard epoch fence
nps_sdk.nwp.inbound CR-0010 inbound Bridge servers (foreign protocol → NPS): McpInboundServer (incl. stdio), A2aInboundServer, GrpcInboundService (service logic; no transport binding), over InProcessNwpBackend / HttpNwpBackend, with the single §16.3 BridgeErrorMap
nps_sdk.nip NIP frames: IdentFrame (v2 dual-trust), TrustFrame, RevokeFrame; NipIdentity (Ed25519); NipIdentVerifier + NipVerifierOptions (RFC-0002 §8.1 dual-trust, NIP v0.12 phase3_enforcement); NipPhase3Enforcer; AssuranceLevel (RFC-0003); remote CA NipCaClient
nps_sdk.nip.x509 RFC-0002 X.509 NID certs: NipX509Builder / NipX509Verifier / NpsX509Oids
nps_sdk.nip.acme RFC-0002 ACME agent-01: AcmeClient / AcmeServer (in-process) / JWS helpers / messages
nps_sdk.ndp NDP frames: AnnounceFrame (incl. cluster_epoch, bridge_inbound_protocols), ResolveFrame, GraphFrame; in-memory registry + validator; CR-0009 highest-epoch resolve_cluster
nps_sdk.nop NOP frames: TaskFrame, DelegateFrame, SyncFrame, AlignStreamFrame; async NopClient; ClusterDelegationResolver (CR-0009 §3.4)
nps_sdk.conformance TC-N1/TC-N2 conformance catalog, manifest builder, and validator

Quick Start

Encoding / Decoding NCP Frames

from nps_sdk.core.codec import NpsFrameCodec
from nps_sdk.core.registry import FrameRegistry
from nps_sdk.ncp.frames import AnchorFrame, FrameSchema, SchemaField

registry = FrameRegistry.create_default()
codec    = NpsFrameCodec(registry)

schema = FrameSchema(fields=(
    SchemaField(name="id",    type="uint64"),
    SchemaField(name="price", type="decimal", semantic="commerce.price.usd"),
))
frame  = AnchorFrame(anchor_id="sha256:...", schema=schema)

wire   = codec.encode(frame)           # bytes — Tier-2 MsgPack by default
result = codec.decode(wire)            # → AnchorFrame

Anchor Cache (Schema Deduplication)

from nps_sdk.core.cache import AnchorFrameCache

cache     = AnchorFrameCache()
anchor_id = cache.set(frame)           # stores; returns canonical sha256 anchor_id
frame     = cache.get_required(anchor_id)

Querying a Memory Node (async)

import asyncio
from nps_sdk.nwp import NwpClient, QueryFrame

async def main():
    async with NwpClient("https://node.example.com") as client:
        caps = await client.query(
            QueryFrame(anchor_ref="sha256:...", limit=50)
        )
        print(caps.count, caps.data)

asyncio.run(main())

Invoking an Action Node (async)

from nps_sdk.nwp import NwpClient, ActionFrame

async with NwpClient("https://node.example.com") as client:
    result = await client.invoke(
        ActionFrame(action_id="orders.create", params={"sku": "X-101", "qty": 1})
    )

Native NWP Serving

from nps_sdk.nwp import NwpNativeNodeServer

server = NwpNativeNodeServer(
    query_handler=lambda query: [{"id": 42}],
    action_handler=lambda action: {"action": action.action_id},
)

# `reader`/`writer` are already past NCP preamble, TLS, and Hello negotiation.
await server.serve(reader, writer)

NIP Identity Management

from nps_sdk.nip.identity import NipIdentity

# Generate and save an encrypted Ed25519 keypair
identity = NipIdentity.generate("ca.key", passphrase="my-secret")

# Load from file
identity = NipIdentity()
identity.load("ca.key", passphrase="my-secret")

# Sign a NIP frame payload (canonical JSON, no 'signature' field)
sig = identity.sign(ident_frame.unsigned_dict())

# Verify
ok = NipIdentity.verify_signature(identity.pub_key_string, payload, sig)

NIP Remote CA Client

from nps_sdk.nip import NipCaClient, NipCaRegisterRequest

async with NipCaClient("https://ca.example.com", route_prefix="/nip") as ca:
    discovery = await ca.get_discovery()
    ident = await ca.register_agent(
        NipCaRegisterRequest("agent-a", "ed25519:<pub>", ("nwp:query",)),
        bearer_token="token",
    )
    status = await ca.verify_agent(ident.nid)

Conformance Manifest

from nps_sdk.conformance import (
    NODE_L1,
    NpsConformanceCaseResult,
    NpsConformanceManifest,
    catalog_for_profile,
    validate_manifest,
)

results = [NpsConformanceCaseResult(case.id, "pass") for case in catalog_for_profile(NODE_L1)]
manifest = NpsConformanceManifest.create(
    profile=NODE_L1,
    iut_name="my-node",
    iut_version="1.0.0-alpha.16",
    iut_nid="urn:nps:node:example.com:my-node",
    peer_name="labacacia-fixture",
    peer_version="1.0.0-alpha.16",
    results=results,
)
result = validate_manifest(manifest)

Architecture

nps_sdk/
├── core/          # Wire primitives (FrameHeader, codec, cache, exceptions)
├── ncp/           # NCP frames (0x01–0x0F)
├── nwp/           # NWP frames (0x10–0x1F) + async HTTP client
└── nip/           # NIP frames (0x20–0x2F) + Ed25519 identity

Frame Encoding Tiers

Tier Value Description
Tier-1 JSON 0x00 UTF-8 JSON. Development / compatibility.
Tier-2 MsgPack 0x01 MessagePack binary. ~60% smaller. Production default.
Tier-3 BinaryVector 0x02 binary_vector.v1: MessagePack metadata plus little-endian float32 vector segments for vector-heavy frames.

NWP HTTP Overlay Mode

NwpClient communicates via HTTP with Content-Type: application/x-nps-frame. Sub-paths per operation:

Operation Path Request Frame Response Frame
Schema anchor POST /anchor AnchorFrame 204
Structured query POST /query QueryFrame CapsFrame
Streaming query POST /stream QueryFrame StreamFrame chunks
Action invocation POST /invoke ActionFrame raw result or AsyncActionResponse

Running Tests

pytest                 # all tests + coverage report
pytest -k test_nip     # NIP tests only

Coverage target: ≥ 90 %.

License

Apache 2.0 — see LICENSE.

Copyright 2026 INNO LOTUS PTY LTD

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

nps_lib-1.0.0a18.tar.gz (427.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

nps_lib-1.0.0a18-py3-none-any.whl (286.8 kB view details)

Uploaded Python 3

File details

Details for the file nps_lib-1.0.0a18.tar.gz.

File metadata

  • Download URL: nps_lib-1.0.0a18.tar.gz
  • Upload date:
  • Size: 427.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.12.3

File hashes

Hashes for nps_lib-1.0.0a18.tar.gz
Algorithm Hash digest
SHA256 1f2f633c413cc59037f7a5d3c163e874d0986f83967216108bb66bcbd93d8ccd
MD5 ea829432054e6a36b07374b222e91951
BLAKE2b-256 b56d1f4247ac93299cf04cc62f81e7b9702accbf3adcfb64c3b0fdf2db7d4b44

See more details on using hashes here.

File details

Details for the file nps_lib-1.0.0a18-py3-none-any.whl.

File metadata

  • Download URL: nps_lib-1.0.0a18-py3-none-any.whl
  • Upload date:
  • Size: 286.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.12.3

File hashes

Hashes for nps_lib-1.0.0a18-py3-none-any.whl
Algorithm Hash digest
SHA256 34f9aeb025fbe4e03b0693cd47e1148a0b59f6cbfeda7973d05962db659be420
MD5 9c430de4727e2678f806a90a289ac49a
BLAKE2b-256 5cdaf340d7edab39262e79012f969eecc1a378b2e09d77cd421cfde787e68716

See more details on using hashes here.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page