Observed since 20 Oct, 21:42 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
Cisco AI Defense evaluator for agent-control
External evaluator that calls Cisco AI Defense Chat Inspection via REST and maps InspectResponse.is_safe to Agent Control decisions.
cisco.ai_defenseCanonical 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.
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 if api_url set)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
input → role=user, output → role=assistant.messages_strategy: "single" | "history" = "history"
history forwards an existing messages list 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 under metadata.raw)| Name | Description |
|---|---|
cisco.ai_defense | Cisco AI Defense Chat Inspection |
Behavior mapping:
is_safe == false → EvaluatorResult.matched = true (e.g., a deny action will block)is_safe == true → matched = falsematched = (on_error == "deny"); error details in metadata (no error field is set; engine honors matched per on_error)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"]
}
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())
X-Cisco-AI-Defense-API-Key: <AI_DEFENSE_API_KEY>api_url to the full Chat Inspection endpoint.is_available() returns false if httpx is not installed; discovery will skip registration.messages_strategy: "history" forwards the full message array when present; consider messages_strategy: "single" if payload size is a concern.https://us.api.inspect.aidefense.security.cisco.comhttps://ap.api.inspect.aidefense.security.cisco.comhttps://eu.api.inspect.aidefense.security.cisco.com/api/v1/inspect/chatDownload counts and popularity will appear here as the collector receives them.
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 8.14.0 | 19 Oct 2026 | 8 |
This describes our collected data; it is not a security assessment.
Observed since 20 Oct, 21:42 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:afbbc3512db88aa56848c7763aa3b96ebf868468a1b1489800386242afee4aa4