Python SDK
지원 모드: Hosted Hybrid Local 제공 플랜: Free Solo Teams
영어 원문 -- 번역은 기술 검토 대기 중입니다
The Control Zero Python SDK provides deterministic policy enforcement for AI agents running in Python environments. A deny stops the guarded call before it executes. Hosted policies arrive as signed bundles that are verified before use, and the SDK fails closed by default when it cannot establish coverage.
설치
pip install controlzero
요구 사항:
- Python 3.9 이상
- 추가 시스템 종속성 없음
빠른 시작
배포 모드를 선택하세요.
- Hosted
- Hybrid
- Local
Hosted 정책을 대시보드에서 가져옵니다.
영어 원문 -- 번역은 기술 검토 대기 중입니다
Audit in cloud.
대부분의 팀에 권장합니다.
from controlzero import Client
# SDK fetches your signed policy bundle on first call.
# Manages audit automatically. No local config needed.
client = Client(api_key="cz_live_your_api_key_here")
# Or use env var: export CONTROLZERO_API_KEY="cz_live_..."
설치: pip install controlzero (1.4.3부터 클라우드 모드 종속성이 기본 설치에 포함됩니다).
Hybrid API 키와 로컬 정책 파일을 함께 사용합니다.
영어 원문 -- 번역은 기술 검토 대기 중입니다
When you pass policy or policy_file explicitly to Client() alongside an api_key, your local policy governs enforcement and the hosted/dashboard bundle is IGNORED for that instance -- audit still ships to your dashboard.
이때 선택 사항이 눈에 띄도록 SDK가 한 번 경고를 출력합니다(대신 HybridModeError를 발생시키려면 strict_hosted=True를 전달하세요). CONTROLZERO_LOCAL_OVERRIDE는 위와 같이 정책 인수를 명시적으로 전달하는 경우에는 적용되 지 않으며, 자동 탐색에만 영향을 줍니다. 자동 탐색이란 api_key가 설정되어 있고 policy/policy_file을 전달하지 않았지만 CONTROLZERO_POLICY_FILE 또는 작업 디렉터리의 controlzero.yaml/.yml/.json을 통해 로컬 파일이 발견되는 경우를 말하며, 이때는 기본적으로 호스팅 번들이 우선하고 CONTROLZERO_LOCAL_OVERRIDE=1을 설정하면 발견된 로컬 파일로 전환됩니다.
from controlzero import Client
# Your local file governs enforcement; the hosted bundle is ignored.
client = Client(
api_key="cz_live_your_api_key_here",
policy_file="controlzero.yaml",
)
# The local file already governs enforcement; the API key only routes audit to the dashboard.
영어 원문 -- 번역은 기술 검토 대기 중입니다
Your local policy governs enforcement; the API key only routes audit to the dashboard.
SDK는 이 인스턴스에서 대시보드 정책이 무시된다는 경고를 한 번 출력합니다(strict_hosted=True로 설정한 경우에는 HybridModeError를 발생시킵니다).
Local API 키가 없습니다.
영어 원문 -- 번역은 기술 검토 대기 중입니다
No network calls.
완전한 오프라인입니다. 에어갭 환경과 호환됩니다.
from controlzero import Client
# Inline policy -- no file needed
client = Client(policy={
"rules": [
{"allow": "database:query", "reason": "Reads are permitted"},
{"deny": "database:execute", "reason": "Writes are blocked"},
]
})
# Or from a file
client = Client(policy_file="controlzero.yaml")
영어 원문 -- 번역은 기술 검토 대기 중입니다
Every decision and its event-level coverage is written to ./controlzero.log, so “did not run” remains distinguishable from “ran and found nothing.”
구성
Hosted Hosted 모드(권장)
영어 원문 -- 번역은 기술 검토 대기 중입니다
Pass only your project API key. The SDK pulls the signed policy bundle from the dashboard at first call, verifies its signature, decrypts locally, and enforces every call against the dashboard policy. Audit entries ship to the remote trail automatically.
from controlzero import Client
client = Client(api_key="cz_live_your_api_key_here")
Local 로컬 정책 파일 사용
from controlzero import Client
client = Client(policy_file="controlzero.yaml")
Hybrid Hybrid 모드(API 키 + 로컬 정책)
from controlzero import Client
# Explicit policy_file + api_key: the local file governs enforcement,
# the hosted bundle is IGNORED, audit still ships remotely.
client = Client(api_key="cz_live_your_api_key_here", policy_file="controlzero.yaml")
인라인 정책
from controlzero import Client
client = Client(policy={
"rules": [
{"allow": "database:query", "reason": "Reads are permitted"},
{"deny": "database:*", "reason": "All other database operations are blocked"},
]
})
database:query, database:execute, database:delete는 레거시 액션 이름으로, 표준 클래스인 database:read, database:write, database:admin과 동일한 호출에 일치합니다. 새 정책에서는 표준 이름을 사용하는 것이 좋으며, 레거시 이름을 사용하는 기존 규칙은 변경 없이 계속 동작합니다. SQL 시맨틱 클래스 매핑은 읽기 전용 데이터베이스 레시피를 참조하세요.
와일드카드 리소스 매칭
resources: ["*"]를 나열한 규칙은 호출자가 context.resource를 전달했는지와 관계없이 모든 호출에 일치합니다. 규칙을 모든 호출에 보편적으로 적용해야 하고 호출별 리소스가 없거나 전달하고 싶지 않을 때 사용하세요.
# Policy rule with universal resource matching
{"effect": "allow", "actions": ["database:read"], "resources": ["*"]}
# This call matches even though context.resource is not set:
cz.guard("database", method="query", args={"sql": "SELECT 1"})
와일드카드가 아닌 리소스 패턴(예: resources: ["table/orders"])은 규칙이 적용되려면 호출자가 일치하는 context.resource를 전달해야 합니다. 이렇게 하면 범위가 좁은 규칙이 좁게 유지됩니다.
환경 변수
API 키를 명시적으로 전달하거나 CONTROLZERO_API_KEY 환경 변수로 설정할 수 있습니다. 에이전트 이름은 CZ_AGENT_NAME으로 설정할 수 있습니다.
export CONTROLZERO_API_KEY="cz_live_your_api_key_here"
export CZ_AGENT_NAME="my-analyst-agent"
from controlzero import Client
client = Client() # reads CONTROLZERO_API_KEY from environment
구성 옵션
| 매개변수 | 유형 | 기본값 | 설명 |
|---|---|---|---|
api_key | str | CONTROLZERO_API_KEY env | Project API key. Enables hosted mode: SDK auto-pulls the signed policy bundle from the dashboard and ships audit to the remote trail. |
policy | dict | None | 규칙이 포함된 인라인 정책 dict. |
policy_file | str | None | YAML 또는 JSON 정책 파일 경로. |
strict_hosted | bool | False | api_key가 명시적인 policy/policy_file과 함께 전달되면, 한 번 경고하고 로컬 정책을 사 용하는 대신 HybridModeError를 발생시킵니다. CI에서 의도하지 않은 로컬 재정의를 찾아내는 데 유용합니다. |
refresh_interval_seconds | int | 60 | Hosted 모드: 대시보드에 새 정책 번들이 있는지 확인하는 주기. 자동 새로 고침을 끄려면 None을 전달하세요. 모든 guard() 호출마다 새로 고치려면 0을 전달하세요(테스트 전용). |
log_path | str | "./controlzero.log" | 로컬 감사 로그 파일 경로. |
log_rotation | str | "daily" | 감사 로그 순환 주기. |
log_retention | str | "30 days" | How long to keep rotated logs. |
log_compression | str | None | 순환된 로그 압축(예: "gz"). |
log_format | str | "json" | 감사 로그 형식. |
정책 새로 고침(Hosted 모드)
대시보드에서 정책을 업데이트하면, 장시간 실행 중인 SDK 프로세스는 새로 고침 주기(기본값: 60초) 안에 변경 사항을 자동으로 반영합니다. SDK는 조건부 요청을 보내므로, 번들이 바뀌지 않았다면 작은 왕복 비용만 듭니다.
세 가지 설정이 있습니다.
refresh_interval_seconds=60(기본값): 1분마다 확인합니다.refresh_interval_seconds=None: 백그라운드 확인을 끕니다. 완전한 수동 제어를 위해client.refresh()와 함께 사용하세요.client.refresh(): 즉시 다시 불러옵니다. 번들이 실제로 변경되었으면True를, 대시보드에 업데이트가 없으면False를 반환합니다.
from controlzero import Client
# Long-lived agent, picks up dashboard changes within 60s automatically.
client = Client(api_key="cz_live_your_api_key_here")
# Or: force an immediate reload after a known dashboard change.
changed = client.refresh()
if changed:
print(f"Policy updated at {client.last_refreshed_at.isoformat()}")
영어 원문 -- 번역은 기술 검토 대기 중입니다
Network errors during a background refresh are logged at WARNING
level and do not raise; the last-known-good bundle keeps working until
the next successful pull.
기본 사용법
도구 호출 평가
기본 메서드는 guard()이며, 활성 정책을 평가합니다.
from controlzero import Client, PolicyDeniedError
client = Client(policy_file="controlzero.yaml")
decision = client.guard(
"database",
method="query",
args={"sql": "SELECT * FROM orders"},
)
print(decision.effect) # "allow" or "deny"
print(decision.reason) # human-readable reason
print(decision.policy_id) # matching policy ID
거부된 액션 처리
정책이 액션을 거부하면 결정의 effect를 확인하거나 PolicyDeniedError를 잡으세요.
from controlzero import Client, PolicyDeniedError
client = Client(policy_file="controlzero.yaml")
decision = client.guard(
"filesystem",
method="write_file",
args={"path": "/data/output.csv", "content": "..."},
)
if decision.effect == "deny":
print(f"Blocked: {decision.reason}")
print(f"Policy: {decision.policy_id}")
컨텍스트 관리자
Client는 컨텍스트 관리자 프로토콜을 구현합니다. with를 사용하면 종료 시 close()가 호출됩니다.
from controlzero import Client
with Client(policy_file="controlzero.yaml") as client:
decision = client.guard("github", method="list_issues", args={"repo": "acme/app"})
API 레퍼런스
Client
기본 동기식 클라이언트 클래스입니다.
__init__(api_key=None, policy=None, policy_file=None, strict_hosted=False, log_path="./controlzero.log", log_rotation="daily", log_retention="30 days", log_compression=None, log_format="json")
새 Control Zero 클라이언트를 생성합니다.
policy와 policy_file을 모두 전달하면 ValueError가 발생합니다.
guard(tool, args=None, method="*", raise_on_deny=False, context=None) -> PolicyDecision
로드된 정책에 대해 도구 호출을 평가합니다.
매개변수:
| 이름 | 유형 | 필수 | 기본값 | 설명 |
|---|---|---|---|---|
tool | str | 예 | - | 도구 이름. method와 결합되어 액션을 이룹니다. |
args | dict | 아니요 | None | DLP 스캔과 조건부 평가에 사용되는 인수. |
method | str | 아니요 | "*" | 메서드 이름. 평가되는 액션은 "{tool}:{method}"입니다. |
raise_on_deny | bool | 아니요 | False | True이면 거부 결정 시 PolicyDeniedError를 발생시킵니다. |
context | dict | 아니요 | None | 매칭에 사용하는 resource 및 tags 키를 가진 선택적 컨텍스트. |
반환값: effect, reason, policy_id, dlp_findings를 가진 PolicyDecision.
close() -> None
영어 원문 -- 번역은 기술 검토 대기 중입니다
Flushes buffered audit logs, wipes secrets from memory, and closes the HTTP connection.
PolicyDecision
guard()가 반환합니다.
| 속성 | 유형 | 설명 |
|---|---|---|
effect | str | "allow" 또는 "deny". |
policy_id | str or None | 일치한 정책(있는 경우). |
reason | str | 사람이 읽을 수 있는 설명. |
dlp_findings | list | 인수에서 발견된 DLP 일치 항목 목록. |