jevclient
Async Python client for TypeSafe Jev, the System One decision model. Jev answers typed questions about a state and returns values, so there is no text to parse.
import asyncio
from jevclient import JevClient, Noul, Choice, Score
async def main():
async with JevClient("your-api-key") as jev:
answers = await jev.ask(
"The front door has been unlocked for 40 minutes and nobody is home.",
{
"warn": Noul("Should someone be warned about this?"),
"area": Choice("Which area is this about?",
{"security": "Doors, locks, alarms",
"climate": "Heating and ventilation"}),
"urgency": Score("How urgent is it?",
["Ignore", "Today", "Right now"]),
},
)
print(answers["warn"].noul) # 0.94
print(answers["area"].choice) # "security"
print(answers["area"].probabilities) # {"security": 0.97, "climate": 0.03}
print(answers["urgency"].score) # 1.8, between "Today" and "Right now"
asyncio.run(main())
Three question types
| Type | Ask it | You get back |
|---|---|---|
Noul |
a yes/no question | noul, the probability the answer is yes |
Choice |
pick one of your options | choice, probabilities, confidence |
Score |
rate against ordered levels | score, legend, probabilities, confidence |
A Noul carries no confidence, because the probability is the whole answer.
What one call costs
Every question in a call is evaluated in isolation against the same state, and the API answers them in parallel. Measured from the Netherlands on 2026-09-17:
| questions | input tokens | latency |
|---|---|---|
| 3 | 521 | 712 ms |
| 25 | 1,242 | 690 ms |
| 100 | 4,017 | 714 ms |
| 400 | 15,417 | 1,336 ms |
Two things follow. Batching questions into one call is nearly free in time, so ask everything you want to know at once. It is not free in money: question text is billed as input tokens, roughly 38 for a short question, and output is billed at zero.
Those figures are first calls on a cold connection. Over 16 calls from the same place, a warm connection answered in 250 to 580 ms.
A choice takes 2 to 255 options and a score takes 2 to 10 levels. Both are checked locally, so a mistake costs no request.
Install
pip install jevclient
Requires Python 3.12 and aiohttp. Pass your own aiohttp.ClientSession if you have
one, and the client will use it and leave closing it to you.
Errors
JevAuthError (401), JevValidationError (422), JevRateLimitError (429, carries
retry_after), JevOverloadedError (529) and JevConnectionError, all deriving
from JevError. There is no internal retry loop, so the caller decides the policy.
A Choice with fewer than two options and a Score with fewer than two levels are
refused locally, before a request is spent on a 422.
Not affiliated with TypeSafe
This is an independent client. See the TypeSafe docs for the API itself.
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 jevclient-1.1.0.tar.gz.
File metadata
- Download URL: jevclient-1.1.0.tar.gz
- Upload date:
- Size: 9.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d60c477f8cb3342595a6a5d3846d80a5d3484d7aa59cbaa1ed28e44881f27a17
|
|
| MD5 |
0ffa1d9149b0d46ff2f3891bfa5cbff6
|
|
| BLAKE2b-256 |
cf557a223c162d106bc67b9511b92c35204e4a6e3cc3aeb8f6ffb6416c6f2353
|
Provenance
The following attestation bundles were made for jevclient-1.1.0.tar.gz:
Publisher:
python-publish.yml on AboveColin/jevclient
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
jevclient-1.1.0.tar.gz -
Subject digest:
d60c477f8cb3342595a6a5d3846d80a5d3484d7aa59cbaa1ed28e44881f27a17 - Sigstore transparency entry: 2877591832
- Sigstore integration time:
-
Permalink:
AboveColin/jevclient@d568f25717c5b956022f5dc0fcfcb905c7533a05 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/AboveColin
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@d568f25717c5b956022f5dc0fcfcb905c7533a05 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file jevclient-1.1.0-py3-none-any.whl.
File metadata
- Download URL: jevclient-1.1.0-py3-none-any.whl
- Upload date:
- Size: 9.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d25187c6a3befeedf7aba79e92eb3e34c83720f1bc8606bfc5e04805836dbe8e
|
|
| MD5 |
a846e3ca0adc2a8ca314a17ea1716b5a
|
|
| BLAKE2b-256 |
ed09636b680e84a4b8806aff67db86cb86e7652e697340bb860c2871ce8c63e9
|
Provenance
The following attestation bundles were made for jevclient-1.1.0-py3-none-any.whl:
Publisher:
python-publish.yml on AboveColin/jevclient
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
jevclient-1.1.0-py3-none-any.whl -
Subject digest:
d25187c6a3befeedf7aba79e92eb3e34c83720f1bc8606bfc5e04805836dbe8e - Sigstore transparency entry: 2877591862
- Sigstore integration time:
-
Permalink:
AboveColin/jevclient@d568f25717c5b956022f5dc0fcfcb905c7533a05 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/AboveColin
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@d568f25717c5b956022f5dc0fcfcb905c7533a05 -
Trigger Event:
workflow_dispatch
-
Statement type: