Give any Python agent a real, routable Whisper IPv6 identity and safe egress.
Project description
whisper-id
A real, routable IPv6 identity and safe egress for any Python agent — in two calls.
pip install whisper-id # add [socks] for requests+SOCKS: pip install "whisper-id[socks]"
from whisper_id import register, egress
import requests
agent = register("my-bot") # a routable Whisper /128 identity
with egress(): # route this block through your /128
requests.get("https://api64.ipify.org").text # ← leaves from your Whisper IPv6
That's it. Inside the with block the standard proxy env vars point at your local Whisper
proxy, so requests, httpx, urllib, and most libraries "just work"; on exit they're restored.
API
| Call | Does |
|---|---|
register(name, *, new_key=False) |
Create a named agent — a routable /128. new_key=True mints a new agent and its own API key. → Agent(address, id, name) |
egress(agent=None, *, tier="socks5", set_env=True) |
Context manager: bring up egress bound to your /128. Yields Egress (.port, .proxy_url, .socks_url, .proxies). tier="wireguard" for a routed /128. |
verify(address) |
Keyless — is address a real Whisper agent? (DANE + DNSSEC + reverse-DNS + JWS) → bool |
verify_details(address) |
Keyless — the full verdict (is_whisper_agent, fqdn, operator, tenant, dane_ok, jws_ok, …) or None |
rdap(address) |
Keyless — the public RDAP record for a /128, or None |
egress_ip() |
Keyless — the IP this process leaves from (a /128 when routed, else the platform's) → str |
ip() |
Your current egress IP via the CLI, proving it's your /128. → str |
Pass the proxy explicitly instead of via env if you prefer:
with egress(set_env=False) as e:
requests.get(url, proxies=e.proxies)
Keyless / serverless (no CLI)
verify, verify_details, rdap, and egress_ip are keyless — pure HTTPS, no whisper CLI and no key — so they run anywhere, including serverless/edge functions:
from whisper_id import verify, rdap
if verify(addr): # one HTTPS call; works in AWS Lambda, Cloudflare, etc.
print(rdap(addr)["name"])
register, egress, and ip need the CLI (egress needs the local proxy; register needs your key).
Requirements
For register / egress / ip, the whisper CLI on your PATH (this package is a thin,
dependency-free wrapper over it). The keyless calls above need nothing.
curl get.whisper.online | sh
For authenticated calls (register, egress, ip), set WHISPER_API_KEY in the environment
or run whisper login. verify is keyless. ($WHISPER_BIN overrides the CLI path.)
Links
MIT licensed.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file whisper_id-0.2.0.tar.gz.
File metadata
- Download URL: whisper_id-0.2.0.tar.gz
- Upload date:
- Size: 8.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
136e8bc05cad4df12a2b91832f62be214a2120a8b4bce262e07200d2602b9950
|
|
| MD5 |
b3fe43a354e366f8f176f47e977d8f3b
|
|
| BLAKE2b-256 |
b9935a525408f1ad806c5b972d9db03f9b1cdf4a4cecaa8ff02c83dcd3f3822b
|
Provenance
The following attestation bundles were made for whisper_id-0.2.0.tar.gz:
Publisher:
publish.yml on whisper-sec/whisper-py
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
whisper_id-0.2.0.tar.gz -
Subject digest:
136e8bc05cad4df12a2b91832f62be214a2120a8b4bce262e07200d2602b9950 - Sigstore transparency entry: 2013914038
- Sigstore integration time:
-
Permalink:
whisper-sec/whisper-py@e50b5eb57252181441e109c29aa4d6ed42e8d7d7 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/whisper-sec
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@e50b5eb57252181441e109c29aa4d6ed42e8d7d7 -
Trigger Event:
release
-
Statement type:
File details
Details for the file whisper_id-0.2.0-py3-none-any.whl.
File metadata
- Download URL: whisper_id-0.2.0-py3-none-any.whl
- Upload date:
- Size: 7.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1821fee1a4f159cecc501829eae0a838584adbc155d53870402d2eadfadcb58e
|
|
| MD5 |
278c8066aa99cee72b199b8574a6a611
|
|
| BLAKE2b-256 |
4c4137f7630728047d199e19c0dd8bea829fc4c475d9ba3dac50b4800c7688b5
|
Provenance
The following attestation bundles were made for whisper_id-0.2.0-py3-none-any.whl:
Publisher:
publish.yml on whisper-sec/whisper-py
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
whisper_id-0.2.0-py3-none-any.whl -
Subject digest:
1821fee1a4f159cecc501829eae0a838584adbc155d53870402d2eadfadcb58e - Sigstore transparency entry: 2013914106
- Sigstore integration time:
-
Permalink:
whisper-sec/whisper-py@e50b5eb57252181441e109c29aa4d6ed42e8d7d7 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/whisper-sec
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@e50b5eb57252181441e109c29aa4d6ed42e8d7d7 -
Trigger Event:
release
-
Statement type: