govagent 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- govagent/__init__.py +0 -0
- govagent/agent.py +73 -0
- govagent/guards.py +43 -0
- govagent/hitl.py +0 -0
- govagent/policy.py +26 -0
- govagent/telemetry.py +85 -0
- govagent-0.1.0.dist-info/METADATA +88 -0
- govagent-0.1.0.dist-info/RECORD +9 -0
- govagent-0.1.0.dist-info/WHEEL +4 -0
govagent/__init__.py
ADDED
|
File without changes
|
govagent/agent.py
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
from typing import List, Optional, Any
|
|
2
|
+
from govagent.policy import Policy
|
|
3
|
+
from govagent.guards import CircuitBreaker, GovernanceViolation
|
|
4
|
+
from govagent.telemetry import TelemetryManager
|
|
5
|
+
|
|
6
|
+
class ExecutiveAgent:
|
|
7
|
+
"""
|
|
8
|
+
The core execution engine. Orchestrates reasoning while
|
|
9
|
+
enforcing governance constraints in real-time.
|
|
10
|
+
"""
|
|
11
|
+
def __init__(
|
|
12
|
+
self,
|
|
13
|
+
persona: str,
|
|
14
|
+
policy: Policy,
|
|
15
|
+
model_client: Any,
|
|
16
|
+
telemetry: Optional[TelemetryManager] = None
|
|
17
|
+
):
|
|
18
|
+
self.persona = persona
|
|
19
|
+
self.policy = policy
|
|
20
|
+
self.model = model_client
|
|
21
|
+
self.guard = CircuitBreaker(policy)
|
|
22
|
+
self.telemetry = telemetry or TelemetryManager()
|
|
23
|
+
|
|
24
|
+
async def execute(self, task: str):
|
|
25
|
+
"""
|
|
26
|
+
The 'Governed Reasoning' Loop: Think -> Guard -> Act -> Record.
|
|
27
|
+
"""
|
|
28
|
+
self.telemetry.start_trace(self.persona, task)
|
|
29
|
+
current_step = 0
|
|
30
|
+
max_steps = 10 # Safety ceiling
|
|
31
|
+
|
|
32
|
+
try:
|
|
33
|
+
while current_step < max_steps:
|
|
34
|
+
# 1. Financial Guard Check
|
|
35
|
+
self.guard.check_financial_risk(self.telemetry.current_session.estimated_cost_usd)
|
|
36
|
+
|
|
37
|
+
# 2. Reasoning Phase (LLM Call)
|
|
38
|
+
# Note: This is a conceptual representation of the LLM interaction
|
|
39
|
+
thought, action, params = await self.model.generate_plan(task, self.persona)
|
|
40
|
+
|
|
41
|
+
# 3. Action Validation Guard
|
|
42
|
+
# Intercept the intent before execution
|
|
43
|
+
self.guard.validate_action(action, params)
|
|
44
|
+
|
|
45
|
+
# 4. Human-in-the-Loop Check
|
|
46
|
+
if self.guard.assess_confidence(0.9) == "ESCALATE_TO_HUMAN":
|
|
47
|
+
# Placeholder for HITL protocol (Slack/Teams)
|
|
48
|
+
return "Pending Human Approval"
|
|
49
|
+
|
|
50
|
+
# 5. Execution & Logging
|
|
51
|
+
result = await self.perform_action(action, params)
|
|
52
|
+
self.telemetry.log_step(thought, action, result)
|
|
53
|
+
|
|
54
|
+
if self.is_task_complete(result):
|
|
55
|
+
break
|
|
56
|
+
|
|
57
|
+
current_step += 1
|
|
58
|
+
|
|
59
|
+
return self.telemetry.finalize(status="success", tokens=1200) # Mock token count
|
|
60
|
+
|
|
61
|
+
except GovernanceViolation as gv:
|
|
62
|
+
# Operationalize the error: Log the violation and stop
|
|
63
|
+
return self.telemetry.finalize(status=f"blocked: {str(gv)}", tokens=500)
|
|
64
|
+
except Exception as e:
|
|
65
|
+
return self.telemetry.finalize(status=f"error: {str(e)}", tokens=0)
|
|
66
|
+
|
|
67
|
+
async def perform_action(self, action: str, params: dict):
|
|
68
|
+
"""Placeholder for actual tool execution logic."""
|
|
69
|
+
return f"Executed {action} with success."
|
|
70
|
+
|
|
71
|
+
def is_task_complete(self, result: str) -> bool:
|
|
72
|
+
"""Logic to determine if the agent has reached its goal."""
|
|
73
|
+
return "complete" in result.lower()
|
govagent/guards.py
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
from typing import Any, Dict
|
|
2
|
+
from govagent.policy import Policy
|
|
3
|
+
from govagent.telemetry import ExecutionSnapshot
|
|
4
|
+
|
|
5
|
+
class GovernanceViolation(Exception):
|
|
6
|
+
"""Custom exception for audit-ready error handling."""
|
|
7
|
+
pass
|
|
8
|
+
|
|
9
|
+
class CircuitBreaker:
|
|
10
|
+
"""
|
|
11
|
+
Real-time enforcement of the Governance Manifest.
|
|
12
|
+
"""
|
|
13
|
+
def __init__(self, policy: Policy):
|
|
14
|
+
self.policy = policy
|
|
15
|
+
|
|
16
|
+
def check_financial_risk(self, current_spend: float):
|
|
17
|
+
"""Prevents further execution if budget is exceeded."""
|
|
18
|
+
if current_spend >= self.policy.max_spend_usd:
|
|
19
|
+
raise GovernanceViolation(
|
|
20
|
+
f"Budget Exceeded: Current spend ${current_spend:.4f} "
|
|
21
|
+
f"exceeds limit of ${self.policy.max_spend_usd}"
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
def validate_action(self, tool_name: str, parameters: Dict[str, Any]):
|
|
25
|
+
"""
|
|
26
|
+
Validates the intended action against the whitelist
|
|
27
|
+
and inspects for restricted domains.
|
|
28
|
+
"""
|
|
29
|
+
# Whitelist check
|
|
30
|
+
if tool_name not in self.policy.allowed_tools:
|
|
31
|
+
raise GovernanceViolation(f"Unauthorized Tool: {tool_name} is not in the allowed manifest.")
|
|
32
|
+
|
|
33
|
+
# Restricted domain check (e.g., blocking specific URLs or IPs)
|
|
34
|
+
for domain in self.policy.restricted_domains:
|
|
35
|
+
if any(domain in str(val) for val in parameters.values()):
|
|
36
|
+
raise GovernanceViolation(f"Access Denied: Parameter contains restricted domain '{domain}'")
|
|
37
|
+
|
|
38
|
+
def assess_confidence(self, score: float):
|
|
39
|
+
"""Forces Human-in-the-Loop if AI confidence is low."""
|
|
40
|
+
if score < self.policy.confidence_threshold:
|
|
41
|
+
# In a production loop, this would trigger the HITL protocol
|
|
42
|
+
return "ESCALATE_TO_HUMAN"
|
|
43
|
+
return "PROCEED"
|
govagent/hitl.py
ADDED
|
File without changes
|
govagent/policy.py
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import yaml
|
|
2
|
+
from pydantic import BaseModel, Field
|
|
3
|
+
from typing import List, Optional
|
|
4
|
+
|
|
5
|
+
class Policy(BaseModel):
|
|
6
|
+
"""The Governance Manifest schema for enterprise control."""
|
|
7
|
+
version: str = "1.0"
|
|
8
|
+
agent_name: str
|
|
9
|
+
|
|
10
|
+
# Financial Guardrails
|
|
11
|
+
max_spend_usd: float = Field(default=1.0, description="Hard limit for API costs")
|
|
12
|
+
|
|
13
|
+
# Action Scopes
|
|
14
|
+
allowed_tools: List[str] = Field(default_factory=list)
|
|
15
|
+
restricted_domains: List[str] = Field(default_factory=list)
|
|
16
|
+
|
|
17
|
+
# Escalation
|
|
18
|
+
require_human_approval: bool = True
|
|
19
|
+
confidence_threshold: float = 0.85
|
|
20
|
+
|
|
21
|
+
@classmethod
|
|
22
|
+
def from_yaml(cls, file_path: str):
|
|
23
|
+
"""Standardizes the loading of governance policies from YAML files."""
|
|
24
|
+
with open(file_path, "r") as f:
|
|
25
|
+
data = yaml.safe_load(f)
|
|
26
|
+
return cls(**data)
|
govagent/telemetry.py
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import time
|
|
2
|
+
import uuid
|
|
3
|
+
from datetime import datetime
|
|
4
|
+
from typing import Dict, Any, Optional
|
|
5
|
+
from pydantic import BaseModel, Field
|
|
6
|
+
|
|
7
|
+
class ExecutionSnapshot(BaseModel):
|
|
8
|
+
"""
|
|
9
|
+
A single point-in-time record of an agent's activity.
|
|
10
|
+
Designed for export to JSON/CSV for compliance reporting.
|
|
11
|
+
"""
|
|
12
|
+
trace_id: str = Field(default_factory=lambda: str(uuid.uuid4()))
|
|
13
|
+
timestamp: str = Field(default_factory=lambda: datetime.utcnow().isoformat())
|
|
14
|
+
agent_role: str
|
|
15
|
+
task_input: str
|
|
16
|
+
|
|
17
|
+
# Financial Metrics
|
|
18
|
+
estimated_cost_usd: float = 0.0
|
|
19
|
+
tokens_used: int = 0
|
|
20
|
+
|
|
21
|
+
# Performance Metrics
|
|
22
|
+
latency_seconds: float = 0.0
|
|
23
|
+
status: str = "initiated" # initiated, success, failed, human_intervention_required
|
|
24
|
+
|
|
25
|
+
# Business ROI Logic
|
|
26
|
+
human_minutes_saved: float = 0.0
|
|
27
|
+
|
|
28
|
+
# Audit Trail
|
|
29
|
+
reasoning_steps: list = []
|
|
30
|
+
|
|
31
|
+
class TelemetryManager:
|
|
32
|
+
"""
|
|
33
|
+
Handles the collection and persistence of execution data.
|
|
34
|
+
Can be extended to push logs to CloudWatch, ELK, or a SQL DB.
|
|
35
|
+
"""
|
|
36
|
+
def __init__(self, output_path: Optional[str] = "logs/audit_trail.json"):
|
|
37
|
+
self.output_path = output_path
|
|
38
|
+
self.current_session: Optional[ExecutionSnapshot] = None
|
|
39
|
+
self._start_time: float = 0.0
|
|
40
|
+
|
|
41
|
+
def start_trace(self, agent_role: str, task: str):
|
|
42
|
+
"""Starts the 'stopwatch' for a specific agent task."""
|
|
43
|
+
self._start_time = time.perf_counter()
|
|
44
|
+
self.current_session = ExecutionSnapshot(
|
|
45
|
+
agent_role=agent_role,
|
|
46
|
+
task_input=task
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
def log_step(self, thought: str, action: str, result: str):
|
|
50
|
+
"""Appends a reasoning step to the audit trail."""
|
|
51
|
+
if self.current_session:
|
|
52
|
+
step = {
|
|
53
|
+
"timestamp": datetime.utcnow().isoformat(),
|
|
54
|
+
"thought": thought,
|
|
55
|
+
"action": action,
|
|
56
|
+
"result": result
|
|
57
|
+
}
|
|
58
|
+
self.current_session.reasoning_steps.append(step)
|
|
59
|
+
|
|
60
|
+
def finalize(self, status: str, tokens: int, cost_per_1k: float = 0.02):
|
|
61
|
+
"""
|
|
62
|
+
Calculates final ROI and latency.
|
|
63
|
+
In a real scenario, cost_per_1k would be dynamic based on the model used.
|
|
64
|
+
"""
|
|
65
|
+
if not self.current_session:
|
|
66
|
+
return
|
|
67
|
+
|
|
68
|
+
self.current_session.latency_seconds = round(time.perf_counter() - self._start_time, 2)
|
|
69
|
+
self.current_session.status = status
|
|
70
|
+
self.current_session.tokens_used = tokens
|
|
71
|
+
self.current_session.estimated_cost_usd = (tokens / 1000) * cost_per_1k
|
|
72
|
+
|
|
73
|
+
# Simple heuristic for ROI: Assumes 1 min of human labor saved for every 5 tokens
|
|
74
|
+
# (This logic can be customized per use case)
|
|
75
|
+
self.current_session.human_minutes_saved = round(tokens / 50, 2)
|
|
76
|
+
|
|
77
|
+
self._persist_log()
|
|
78
|
+
return self.current_session
|
|
79
|
+
|
|
80
|
+
def _persist_log(self):
|
|
81
|
+
"""Writes to a local file—first step toward a full database integration."""
|
|
82
|
+
if self.output_path and self.current_session:
|
|
83
|
+
# Here you would implement logic to append to a file or database
|
|
84
|
+
# For a 'Lite' version, logging to a standard JSONL file is often best.
|
|
85
|
+
pass
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: govagent
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: The Governance-First Framework for Agentic AI
|
|
5
|
+
Project-URL: Homepage, https://github.com/thekakodkar/govagent
|
|
6
|
+
Author: Your Name
|
|
7
|
+
License: MIT
|
|
8
|
+
Keywords: agents,ai,enterprise,governance,roi
|
|
9
|
+
Requires-Python: >=3.10
|
|
10
|
+
Requires-Dist: httpx>=0.25.0
|
|
11
|
+
Requires-Dist: pydantic>=2.0.0
|
|
12
|
+
Requires-Dist: pyyaml>=6.0.0
|
|
13
|
+
Description-Content-Type: text/markdown
|
|
14
|
+
|
|
15
|
+
# GovAgent: The Enterprise Protocol for Agentic AI
|
|
16
|
+
|
|
17
|
+
**The Governance-First Framework for Production-Grade Autonomous Systems.**
|
|
18
|
+
|
|
19
|
+
`GovAgent` is a high-abstraction, lightweight Python framework designed to bridge the gap between experimental AI and business-critical operations.
|
|
20
|
+
|
|
21
|
+
## 🎯 Value Proposition
|
|
22
|
+
In high-stakes environments, the barrier to AI adoption is **reliability and control**. `GovAgent` ensures every action is transparent, budget-aware, and risk-managed.
|
|
23
|
+
|
|
24
|
+
* **Active Circuit Breakers:** Real-time enforcement of financial and operational limits.
|
|
25
|
+
* **Governance-as-Code:** Human-readable permission manifests (`policy.yaml`) that align technical execution with organizational policy.
|
|
26
|
+
* **Forensic Telemetry:** Standardized audit logs and ROI projections (USD saved vs. USD spent).
|
|
27
|
+
* **Zero-Trust Tooling:** Strict whitelisting for agent actions and domain access.
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## 🏗️ Core Pillars
|
|
32
|
+
|
|
33
|
+
### 1. The Governance Manifest (`policy.yaml`)
|
|
34
|
+
Define "Rules of Engagement" outside the codebase. This allows stakeholders to review and approve agent permissions.
|
|
35
|
+
* **Financial Guardrails:** Hard limits on USD spend per session.
|
|
36
|
+
* **Action Scopes:** Explicit whitelisting of approved tools.
|
|
37
|
+
* **Escalation Triggers:** Thresholds for Human-in-the-Loop (HITL) intervention.
|
|
38
|
+
|
|
39
|
+
### 2. Forensic Telemetry (`telemetry.py`)
|
|
40
|
+
Every execution generates a **Business Value Summary**:
|
|
41
|
+
* **ROI Projection:** Estimated manual human-hours saved.
|
|
42
|
+
* **Audit Chain:** A verifiable history of every decision, tool call, and result.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
# GovAgent: Enterprise-Grade Agentic Governance
|
|
47
|
+
|
|
48
|
+
## 🚧 Development Status (WIP)
|
|
49
|
+
**GovAgent is rapidly evolving.** We are currently moving from architectural design to core module implementation.
|
|
50
|
+
|
|
51
|
+
### ✅ Completed Modules
|
|
52
|
+
* **Governance Manifest (`policy.py`):** Structured YAML-based policy enforcement.
|
|
53
|
+
* **Forensic Telemetry (`telemetry.py`):** Real-time ROI and audit trail generation.
|
|
54
|
+
* **Circuit Breakers (`guards.py`):** Financial and operational risk mitigation logic.
|
|
55
|
+
**Human-in-the-Loop (`hitl.py`)** - Managed intervention state.
|
|
56
|
+
* **The Executive Loop (`agent.py`):** A "Think-Guard-Act" orchestration engine.
|
|
57
|
+
|
|
58
|
+
### 🛠️ In Active Development
|
|
59
|
+
* **Standardized Tool Registry:** A type-safe way to map business functions to agent capabilities.
|
|
60
|
+
* **Mock Model Client:** A testing utility to simulate LLM responses without incurring API costs.
|
|
61
|
+
* **HITL Connectors:** Initial hooks for manual approval via CLI.
|
|
62
|
+
|
|
63
|
+
## 📖 Usage Example: Controlled Execution
|
|
64
|
+
|
|
65
|
+
GovAgent allows you to wrap any AI task in a protective governance layer. Here is how you enforce a $0.50 budget on a research task:
|
|
66
|
+
|
|
67
|
+
```python
|
|
68
|
+
from govagent import ExecutiveAgent, Policy
|
|
69
|
+
|
|
70
|
+
# Load your enterprise SOP
|
|
71
|
+
policy = Policy.from_yaml("market_research_policy.yaml")
|
|
72
|
+
|
|
73
|
+
# Run the agent with real-time circuit breakers
|
|
74
|
+
agent = ExecutiveAgent(persona="Analyst", policy=policy, model_client=my_llm)
|
|
75
|
+
report = await agent.execute("Research competitor pricing")
|
|
76
|
+
|
|
77
|
+
print(f"Audit Trace: {report.audit_id}")
|
|
78
|
+
print(f"Budget Consumed: ${report.estimated_cost_usd}")
|
|
79
|
+
|
|
80
|
+
### 💡 Call for Contributions & Ideas
|
|
81
|
+
We are looking for collaborators to help build:
|
|
82
|
+
1. **Cloud Adapters:** Exporting `telemetry.py` logs to AWS CloudWatch or Azure Monitor.
|
|
83
|
+
2. **Standard Policies:** Pre-built `policy.yaml` templates for common roles (e.g., "Safe Research", "Data Entry", "Code Review").
|
|
84
|
+
3. **Reasoning Visualizers:** A tool to turn the Audit Trail JSON into a readable PDF report for non-technical stakeholders.
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
**"Governance is not a constraint; it is the catalyst for enterprise AI adoption."**
|
|
88
|
+
---
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
govagent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
+
govagent/agent.py,sha256=jCprJ5COboENiRqiklkW78hKxcV9VL2VV-DCclSY2fk,2968
|
|
3
|
+
govagent/guards.py,sha256=NaKttVR133GNImVvoyuRmWRXWzpCsDNzDr03G0x1jn0,1792
|
|
4
|
+
govagent/hitl.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
|
+
govagent/policy.py,sha256=UjcPvsqMDtkiWqszzyMP5V4ZTGwQgXAAqXyBeRhAnZQ,852
|
|
6
|
+
govagent/telemetry.py,sha256=QTWhwgOezoWGEi3CuDF8c5w4i_XXlBDZc_Vz49LpjI0,3233
|
|
7
|
+
govagent-0.1.0.dist-info/METADATA,sha256=Ujq6y4evWl5MR277FbeQ0cGS7QbeKDNrUayVBaISiV0,3986
|
|
8
|
+
govagent-0.1.0.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
|
|
9
|
+
govagent-0.1.0.dist-info/RECORD,,
|