Tenet SDK — cloud judge client and local server client. Framework-agnostic.
Project description
tenet-client
Pure-Python SDK for the Tenet cloud judge service and local Tenet server. No framework dependencies — works inside LangChain, LlamaIndex, FastAPI, plain scripts, anywhere.
For LangChain-specific middleware/callback adapters, install
tenet-langchain instead — it depends on this
package and ships the LangChain integration classes.
Install
pip install tenet-client
Quickstart — cloud judge
The cloud judge runs at https://api.tenetlabs.com/v1/judge/evaluate.
Your customer credentials (M2M client_id / client_secret) are issued
by Tenet at provisioning time.
from tenet_client import TenetCloudJudgeClient, JudgeUnavailableError
client = TenetCloudJudgeClient(
client_id="<your-m2m-client-id>",
client_secret="<your-m2m-client-secret>",
)
# Recommended: warm the client at process start so the first user-facing
# call doesn't pay the Auth0 token-mint cold path.
client.warmup()
try:
verdict = client.evaluate(
phase="tool_pre",
tool_name="search_resumes",
tool_input={"query": "5+ years Python experience"},
)
if verdict.decision == "block":
# Integrator decides what to do — return an error to the agent,
# surface a safe message to the user, log + halt, etc.
...
except JudgeUnavailableError as e:
# Cloud judge unreachable. The SDK does NOT have a fail_open flag —
# it's a policy decision. Catch and either retry, halt, or proceed
# depending on your environment.
...
Or read credentials from env. from_env() requires TENET_CLIENT_ID
and TENET_CLIENT_SECRET; optional tuning vars are TENET_JUDGE_ID and
TENET_JUDGE_TIMEOUT_SECONDS. (TENET_CLOUD_URL, TENET_AUTH0_AUDIENCE,
and TENET_AUTH0_ISSUER_URL exist as escape hatches for dev / staging
but should not be set in production.)
client = TenetCloudJudgeClient.from_env()
Async
Every method has an _async counterpart:
from contextlib import asynccontextmanager
from fastapi import FastAPI
from tenet_client import TenetCloudJudgeClient
@asynccontextmanager
async def lifespan(app: FastAPI):
app.state.judge = TenetCloudJudgeClient.from_env()
await app.state.judge.warmup_async()
yield
await app.state.judge.aclose()
app = FastAPI(lifespan=lifespan)
@app.post("/run-tool")
async def run_tool(req: ...):
verdict = await app.state.judge.evaluate_async(
phase="tool_pre", tool_name=..., tool_input=...,
)
...
@judged — gate any function
from tenet_client import TenetCloudJudgeClient, JudgeBlocked, judged
judge = TenetCloudJudgeClient.from_env()
judge.warmup()
@judged(judge, fail_open=False)
def search_resumes(query: str) -> list[dict]:
return _real_search(query)
try:
hits = search_resumes("5+ years Python")
except JudgeBlocked as e:
# e.reason / e.phase / e.tool_name / e.judge_id available
...
The decorator gates the function at tool_pre (before the body runs)
and tool_post (after it returns). Works on sync and async functions —
the wrapper auto-detects via inspect.iscoroutinefunction.
Integration recipes
For LangChain agents, install tenet-langchain —
it ships CloudJudgeMiddleware, the wrap() one-call helper, and
re-exports @judged. For other frameworks (LlamaIndex, FastAPI, raw
loops), see the cloud judge recipes
for copy-pasteable wiring patterns.
License
Apache-2.0.
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 tenet_client-0.1.0a2.tar.gz.
File metadata
- Download URL: tenet_client-0.1.0a2.tar.gz
- Upload date:
- Size: 63.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
868528ca39b85d83717f4649eacc9f135dcf02e87403d691beeefb4ca123da88
|
|
| MD5 |
7e9181d347f5f9c5a15dc9db5828a905
|
|
| BLAKE2b-256 |
a17f033819068ea3fd1eda5cb8721331b479bfe604ee7e546117d98f00482dc5
|
Provenance
The following attestation bundles were made for tenet_client-0.1.0a2.tar.gz:
Publisher:
publish-pypi.yml on tenetlabsdev/tenet
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
tenet_client-0.1.0a2.tar.gz -
Subject digest:
868528ca39b85d83717f4649eacc9f135dcf02e87403d691beeefb4ca123da88 - Sigstore transparency entry: 1593983691
- Sigstore integration time:
-
Permalink:
tenetlabsdev/tenet@e6a499396a5f350bde49864336ad95a6791442d3 -
Branch / Tag:
refs/tags/tenet-client-v0.1.0a2 - Owner: https://github.com/tenetlabsdev
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@e6a499396a5f350bde49864336ad95a6791442d3 -
Trigger Event:
push
-
Statement type:
File details
Details for the file tenet_client-0.1.0a2-py3-none-any.whl.
File metadata
- Download URL: tenet_client-0.1.0a2-py3-none-any.whl
- Upload date:
- Size: 31.4 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 |
b8734456fa95f21aeefb9e9ddd0de0cd1f1de14f4d693386e23fc94dc8f33766
|
|
| MD5 |
21d9a5870a85044dff9b9c0ef48e36af
|
|
| BLAKE2b-256 |
6bace1e2209ce83a4a0ac9f67e6e41182eabe2b097dcbf060f91e5df87b7a1e9
|
Provenance
The following attestation bundles were made for tenet_client-0.1.0a2-py3-none-any.whl:
Publisher:
publish-pypi.yml on tenetlabsdev/tenet
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
tenet_client-0.1.0a2-py3-none-any.whl -
Subject digest:
b8734456fa95f21aeefb9e9ddd0de0cd1f1de14f4d693386e23fc94dc8f33766 - Sigstore transparency entry: 1593983848
- Sigstore integration time:
-
Permalink:
tenetlabsdev/tenet@e6a499396a5f350bde49864336ad95a6791442d3 -
Branch / Tag:
refs/tags/tenet-client-v0.1.0a2 - Owner: https://github.com/tenetlabsdev
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@e6a499396a5f350bde49864336ad95a6791442d3 -
Trigger Event:
push
-
Statement type: