Skip to main content

inamprotocol (Python SDK)

Reference Python client for the INAM Protocol — parity with the TypeScript InamClient in ../sdk-js/src/client.ts. See ../SPEC.md for the full protocol specification.

Install (development)

python -m venv .venv
./.venv/Scripts/python.exe -m pip install -e . pytest   # Windows
# ./.venv/bin/python -m pip install -e . pytest          # macOS/Linux

Test

./.venv/Scripts/python.exe -m pytest -v

tests/test_interop.py is the important one: it checks this SDK's did:key encoding, canonical JSON, and Ed25519 signing against fixed values generated once by the TypeScript reference implementation (../scripts/interop-vectors.ts). If a change here ever breaks that test, a receipt signed by this SDK would stop verifying against a registry or another SDK written in a different language — that's the whole point of the test.

Usage

from inamprotocol import InamClient, generate_keypair

keypair = generate_keypair()
client = InamClient("http://localhost:4021", keypair)

profile = client.register_agent(["document-extraction"], {"name": "My Agent"})
print(profile["id"])  # did:key:z...

reputation = client.get_reputation(profile["id"])

Jobs (post -> offer -> accept -> execute -> receipt)

from datetime import datetime, timezone

now = datetime.now(timezone.utc).isoformat()
job = poster.post_job("document-extraction", "sha256:...")
worker.submit_offer(job["jobId"], "I can do this in an hour")
poster.accept_offer(job["jobId"], worker.did)

receipt = worker.submit_work(poster.did, {
    "jobId": job["jobId"],
    "task": {"capability": "document-extraction", "specHash": "sha256:...", "createdAt": now},
    "result": {"outputHash": "sha256:...", "completedAt": now},
    "verification": {"method": "payer_confirmation", "outcome": "success"},
})
poster.accept_work(receipt)  # finalizes the receipt and auto-completes the job

poster.cancel_job(job["jobId"]) cancels a not-yet-completed job (poster only); client.get_job(id) / client.search_jobs(capability=..., status=...) / client.list_offers(job_id) round out discovery.

External identity linking (challenge-response)

Linking a key-derived external identity (agentpass_id / aitp_id / passport_id; SPEC.md section 2.1) requires proving control of that external key via a single-use, ~60s challenge. a2a_endpoint isn't key-derived, so it skips straight to link_identity(protocol, value). See examples/interop_worker.py for this in a full running script.

# external_keypair stands in for whatever key AgentPass/AITP/Passport
# Alliance already issued this agent -- not an INAM keypair.
challenge = client.request_link_challenge("agentpass_id", to_base64(external_keypair.public_key), "ed25519")
proof = to_base64(sign(from_hex(challenge["challenge"]), external_keypair.private_key))
client.complete_link("agentpass_id", "ap_my_external_id", challenge["challengeId"], proof)

Verification (independent attestation)

A third party -- anyone but the receipt's own worker (agentB) -- can attest that a finalized receipt's output actually holds up (SPEC.md section 12), feeding a reputation boost:

verification = verifier_client.submit_verification(
    receipt_id=receipt["receiptId"],
    method="deterministic",  # or "agent_attestation"
    output_hash=receipt["result"]["outputHash"],
    result="verified",  # or "rejected"
)

verifier_client.get_verification(verification["verificationId"])
verifier_client.list_receipt_verifications(receipt["receiptId"])

See examples/interop_worker.py for a full worker-side flow (register, link an external identity, submit signed Execution Receipt drafts), and ../scripts/run-interop-demo.sh for the end-to-end cross-language demo (a TypeScript requester and this Python worker doing real business through the same live registry).

Download files

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

Source Distribution

inamprotocol-0.4.1.tar.gz (17.6 kB view details)

Uploaded Source

Built Distribution

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

inamprotocol-0.4.1-py3-none-any.whl (14.4 kB view details)

Uploaded Python 3

File details

Details for the file inamprotocol-0.4.1.tar.gz.

File metadata

  • Download URL: inamprotocol-0.4.1.tar.gz
  • Upload date:
  • Size: 17.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for inamprotocol-0.4.1.tar.gz
Algorithm Hash digest
SHA256 0513213158ac32458ab7f502d178278e38d13703134e1a37f4ff0bacb43ec519
MD5 379225ad541d72118e983dc14ae6d03e
BLAKE2b-256 845c0d614576fc32ac4e4041a6258f495e44bc2f02fab4cefbd878fa8c0186df

See more details on using hashes here.

Provenance

The following attestation bundles were made for inamprotocol-0.4.1.tar.gz:

Publisher: publish-pypi.yml on inamprotocol/inam-protocol

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file inamprotocol-0.4.1-py3-none-any.whl.

File metadata

  • Download URL: inamprotocol-0.4.1-py3-none-any.whl
  • Upload date:
  • Size: 14.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for inamprotocol-0.4.1-py3-none-any.whl
Algorithm Hash digest
SHA256 12a68d62273c65aaacba90ae467bd27d2372f987e6b81ea63139493954874055
MD5 ab14e0188645f9dc5600c456767d1685
BLAKE2b-256 a8f08093a815f24a8baec5f858ffde29367a7f55a81d2847cbaaabe46a1ca6da

See more details on using hashes here.

Provenance

The following attestation bundles were made for inamprotocol-0.4.1-py3-none-any.whl:

Publisher: publish-pypi.yml on inamprotocol/inam-protocol

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.4.1 This release

2 files

0.4.0

2 files

0.2.0

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page