intended
Python SDK for Intended — the intent verification runtime for autonomous agents.
Evaluate every AI agent action against your organization's policies before execution. Fail-closed by default: if the authority service is unreachable, all actions are denied.
Installation
pip install intended
Quick Start
Synchronous
from intended import IntendedClient
client = IntendedSdk(api_key="intended_live_...", tenant_id="tenant-a")
decision = client.authorize("deploy to production", actor="ci-agent", system="github")
if decision.allowed:
print(f"Approved — token: {decision.token}")
elif decision.escalated:
print(f"Awaiting human approval: {decision.escalation_id}")
else:
print(f"Denied: {decision.reason}")
Asynchronous
from intended.client import AsyncIntendedClient
async with AsyncIntendedClient(api_key="intended_live_...", tenant_id="tenant-a") as client:
decision = await client.authorize("scale cluster to 100 nodes", actor="auto-scaler")
if decision.allowed:
await scale_cluster(100)
MCP Integration
Wrap any MCP tool function with Intended authority checks:
from intended.mcp import IntendedMCPMiddleware
middleware = IntendedMCPMiddleware(api_key="intended_live_...", tenant_id="tenant-a")
@middleware.protect
def execute_sql(query: str) -> str:
# Only runs if Intended approves
return db.execute(query)
# Or check manually
decision = middleware.check("execute_sql", {"query": "DROP TABLE users"})
print(decision.decision) # "DENY"
LangChain Integration
Guard any LangChain tool with Intended:
from intended.langchain import IntendedToolGuard
from langchain.tools import ShellTool
guard = IntendedToolGuard(api_key="intended_live_...", tenant_id="tenant-a")
shell = ShellTool()
safe_shell = guard.wrap(shell)
# Now shell.run() checks with INTENDED before executing
agent = create_react_agent(llm, tools=[safe_shell])
PydanticAI Integration
Use as a decorator on PydanticAI tool functions:
from intended.pydantic_ai import IntendedPydanticGuard
from pydantic_ai import Agent
guard = IntendedPydanticGuard(api_key="intended_live_...", tenant_id="tenant-a")
agent = Agent('openai:gpt-4o')
@agent.tool
@guard.protect
async def deploy(env: str) -> str:
return f"Deployed to {env}"
AuthorityDecision
Every call to authorize() returns an AuthorityDecision:
| Field | Type | Description |
|---|---|---|
decision |
str |
"ALLOW", "DENY", or "ESCALATE" |
intent_id |
str |
Unique ID of the evaluated intent |
risk_score |
int |
0-100 risk assessment |
confidence |
float |
Confidence in the risk assessment |
reason |
str |
Human-readable explanation |
token |
str | None |
Authority token for approved actions |
escalation_id |
str | None |
ID for tracking escalated actions |
Convenience properties: decision.allowed, decision.denied, decision.escalated.
Business Intent APIs
The Python SDK also exposes the business-intent compiler and runtime feedback surfaces:
from intended import IntendedClient
client = IntendedSdk(api_key="intended_live_...", tenant_id="tenant-a", api_url="http://localhost:3101")
compiled = client.compile_business_intent_and_plan(
"Shift the nightly ETL window to 3am",
workflow_family="enterprise-operations",
target_system="airflow",
metadata={"environment": "production"},
)
print(compiled["prediction"]["canonicalIntent"])
print(compiled["intentObject"]["process"]["stages"])
object_evals = client.get_business_intent_object_evals()
print(object_evals["report"]["summary"]["passedCases"])
feedback = client.capture_business_intent_feedback(
input_text="Shift the nightly ETL window to 3am",
predicted_intent="ops.batch.schedule",
workflow_family="enterprise-operations",
outcome="accepted",
confidence=0.93,
target_system="airflow",
execution_status="succeeded",
verification_status="verified",
)
evals = client.get_business_intent_feedback_evals(workflow_family="enterprise-operations")
print(evals["evals"]["verification"]["verificationRate"])
summary = client.get_business_intent_feedback_summary(workflow_family="enterprise-operations")
print(summary["summary"]["approvalPredictionHits"])
report = client.get_business_intent_feedback_report(workflow_family="enterprise-operations")
print(report["report"]["metadataDrift"])
Available helper methods:
compile_business_intent()compile_business_intent_and_plan()capture_business_intent_feedback()get_business_intent_object_evals()get_business_intent_feedback_summary()get_business_intent_feedback_report()get_business_intent_feedback_evals()get_business_intent_feedback_backlog()review_business_intent_feedback()promote_business_intent_feedback()
Example review and promote flow:
backlog = client.get_business_intent_feedback_backlog(workflow_family="enterprise-operations")
for record in backlog["backlog"]:
client.review_business_intent_feedback(record["id"], "approved")
promotion = client.promote_business_intent_feedback("enterprise-operations")
print(promotion["snapshotVersion"])
print(promotion["snapshotPath"])
Fail-Closed Behavior
If the INTENDED API is unreachable or returns an error, the SDK returns a DENY decision with risk_score=100 and confidence=0. This ensures that network issues or misconfigurations never result in unauthorized actions.
License
Apache-2.0
Release files for intended 0.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| intended-0.2.1.tar.gz | 19.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| intended-0.2.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 36.3 kB
Release files / intended-0.2.1.tar.gz
| Download URL | intended-0.2.1.tar.gz |
|---|---|
| Size | 19.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
4de9f152a921f8c055a72df5e661e284d73772bb29dd0bf7d6b5bbb9cf35d6ad
|
|
BLAKE2b-256 checksum How to use checksums |
d2a8caf00360731aa5ea8d49755c02912d7bd2a3c132734f68c2c1c83364ae8a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Release files / intended-0.2.1-py3-none-any.whl
| Download URL | intended-0.2.1-py3-none-any.whl |
|---|---|
| Size | 17.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
405dde53f9530f15e4b7f36b008b82beb2e1e3830ec85a8836f82e5b4d9bc741
|
|
BLAKE2b-256 checksum How to use checksums |
ad3e4160687155a00e4119bedef2a0c89e58ba74e856b7c08cd0c957661098b3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|