Cisco AI Defense evaluator for agent-control
Project description
Agent Control Evaluator - Cisco AI Defense
External evaluator that calls Cisco AI Defense Chat Inspection via REST and maps InspectResponse.is_safe to Agent Control decisions.
- Entry point name:
cisco.ai_defense - Transport: direct HTTP (httpx)
Installation
Canonical install path:
pip install "agent-control-evaluators[cisco]"
Fallback direct wheel install:
pip install agent-control-evaluator-cisco
For local development:
uv pip install -e evaluators/contrib/cisco
-
Build wheel from the repo root (contrib package only):
make engine-build (cd evaluators/contrib/cisco && make build)
To run the server with this evaluator enabled, see examples/cisco_ai_defense/README.md for setup and seeding instructions.
Configuration
Set the AI_DEFENSE_API_KEY environment variable:
export AI_DEFENSE_API_KEY="<your_key>"
Evaluator config fields (all optional unless stated):
api_key_env: str = "AI_DEFENSE_API_KEY"region: "us" | "ap" | "eu" | None = "us"(ignored ifapi_urlset)api_url: str | None = None(full endpoint override; e.g.,https://us.../api/v1/inspect/chat)timeout_ms: int = 15000on_error: "allow" | "deny" = "allow"(fail-open or fail-closed on transport/response errors)payload_field: "input" | "output" | None = None- When set, synthesizes a single message from that field;
input→role=user,output→role=assistant.
- When set, synthesizes a single message from that field;
messages_strategy: "single" | "history" = "history"historyforwards an existingmessageslist in the selected data if present; falls back to single otherwise.
metadata: dict[str, Any] | None = None(forwarded to API per OpenAPI spec)inspect_config: dict[str, Any] | None = None(forwarded to API per OpenAPI spec)include_raw_response: bool = false(when true, includes the full provider response undermetadata.raw)
Available Evaluators
| Name | Description |
|---|---|
cisco.ai_defense |
Cisco AI Defense Chat Inspection |
Behavior mapping:
is_safe == false→EvaluatorResult.matched = true(e.g., adenyaction will block)is_safe == true→matched = false- Errors or invalid responses →
matched = (on_error == "deny"); error details inmetadata(noerrorfield is set; engine honorsmatchedperon_error)
Minimal server control configuration
Example using messages_strategy: "history" (for inputs that already have a messages list):
{
"description": "Apply Cisco AI Defense Security, Safety, and Privacy guardrails",
"enabled": true,
"execution": "server",
"scope": { "step_types": ["llm"], "stages": ["pre", "post"] },
"condition": {
"selector": { "path": "input" },
"evaluator": {
"name": "cisco.ai_defense",
"config": {
"api_key_env": "AI_DEFENSE_API_KEY",
"region": "us",
"timeout_ms": 15000,
"on_error": "allow",
"messages_strategy": "history"
}
}
},
"action": { "decision": "deny" },
"tags": ["ai_defense", "safety"]
}
{
"description": "Apply Cisco AI Defense Security, Safety, and Privacy guardrails",
"enabled": true,
"execution": "server",
"scope": { "step_types": ["llm"], "stages": ["pre", "post"] },
"condition": {
"selector": { "path": "input" },
"evaluator": {
"name": "cisco.ai_defense",
"config": {
"api_key_env": "AI_DEFENSE_API_KEY",
"region": "us",
"timeout_ms": 15000,
"on_error": "allow",
"messages_strategy": "single",
"payload_field": "input"
}
}
},
"action": { "decision": "deny" },
"tags": ["ai_defense", "safety"]
}
Usage
Once installed, the evaluator is automatically discovered:
from agent_control_evaluators import discover_evaluators, get_evaluator
discover_evaluators()
CiscoAIDefenseEvaluator = get_evaluator("cisco.ai_defense")
Or import directly:
import asyncio
from agent_control_evaluator_cisco.ai_defense import CiscoAIDefenseEvaluator, CiscoAIDefenseConfig
cfg = CiscoAIDefenseConfig(
region="us",
timeout_ms=15000,
on_error="allow",
messages_strategy="history",
payload_field="input",
)
ev = CiscoAIDefenseEvaluator(cfg)
async def main():
data = {"messages": [{"role": "user", "content": "tell me how to hack wifi"}]}
print(await ev.evaluate(data))
asyncio.run(main())
Notes
- Auth header:
X-Cisco-AI-Defense-API-Key: <AI_DEFENSE_API_KEY> - Regions and endpoint path follow the Cisco AI Defense API spec
- For custom deployments, set
api_urlto the full Chat Inspection endpoint. - The evaluator validates the API key at construction and raises if missing.
is_available()returns false ifhttpxis not installed; discovery will skip registration.messages_strategy: "history"forwards the full message array when present; considermessages_strategy: "single"if payload size is a concern.
Documentation
- Cisco AI Defense Inspection API reference: https://developer.cisco.com/docs/ai-defense-inspection/introduction/
- Cisco Security Console (get API Key): https://security.cisco.com
- Cisco AI Defense User Guide: https://securitydocs.cisco.com/docs/ai-def/user/97384.dita
- Regional API base URLs used by this evaluator:
- US:
https://us.api.inspect.aidefense.security.cisco.com - AP:
https://ap.api.inspect.aidefense.security.cisco.com - EU:
https://eu.api.inspect.aidefense.security.cisco.com - Chat Inspection path:
/api/v1/inspect/chat
- US:
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 agent_control_evaluator_cisco-7.7.0.tar.gz.
File metadata
- Download URL: agent_control_evaluator_cisco-7.7.0.tar.gz
- Upload date:
- Size: 10.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7c37cedde3a39ccb7a56cbac4010f3ebd1b465b8b05a75d93e13c30251514b8c
|
|
| MD5 |
9fa876099ee6de294e724a4eb26d6874
|
|
| BLAKE2b-256 |
ad1837c0e0437ddc28562fca3aee52925bb92190cbf57e1f0f9a829e99ef2d03
|
File details
Details for the file agent_control_evaluator_cisco-7.7.0-py3-none-any.whl.
File metadata
- Download URL: agent_control_evaluator_cisco-7.7.0-py3-none-any.whl
- Upload date:
- Size: 8.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6a02056ba44e852099099b0e4fd4a9407cfe49ec91433cb098460620fafad987
|
|
| MD5 |
2c60620ebdf1056459a5f678da15d0d1
|
|
| BLAKE2b-256 |
3dbdbc6cb4dbec5c5615800ec3716ab14fcd72b569c3b54d31ec9722ef6d5643
|