Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
18a9e51
Resolve merge conflicts for PR #34
Jul 26, 2026
66a518f
feat: add multi provider AI Gateway Gemini Qwen support
Jul 26, 2026
c6cc2fa
feat: add AI Gateway provider health monitoring
Jul 26, 2026
4fde48c
feat: add AI Gateway provider routing and failover layer
Jul 26, 2026
8a5fbca
feat: add AI Gateway metrics observability layer
Jul 26, 2026
4ee086e
feat: add AI Gateway circuit breaker and auto failover
Jul 26, 2026
30cdaef
feat: add AI Gateway telemetry event bus integration
Jul 26, 2026
1649565
fix: unify AI Gateway decision telemetry pipeline
Jul 26, 2026
147ce02
feat: add Guardian risk decision pipeline
Jul 26, 2026
02b6b97
feat: add autonomous action execution engine
Jul 26, 2026
e8a06a6
feat: add autonomous governance and rollback layer
Jul 26, 2026
bef62a6
feat: connect governance control plane
Jul 26, 2026
7ba20ff
fix: remove duplicate python path step in ci workflow
Jul 26, 2026
64d7ce6
fix: rename platform package to avoid stdlib collision
Jul 26, 2026
f7c7902
ci: upgrade checkout action to v5
Jul 26, 2026
9882bbc
chore: remove editor swap file
Jul 26, 2026
6105a04
ci: verify python pipeline
Jul 26, 2026
796adee
ci: upgrade setup-python action
Jul 26, 2026
0b285cc
fix: simplify coverage config
Jul 26, 2026
da6b4e5
ci: fix workflow indentation
Jul 26, 2026
bca3f47
fix: repair learning bridge indentation
Jul 26, 2026
199c5d0
merge main into pr-34 resolve conflicts
Jul 26, 2026
1f329b3
fix: remove committed merge conflict markers
Jul 26, 2026
4747197
fix: remove ai client merge conflict markers
Jul 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file removed .github/workflows/.python-ci.yml.swp
Binary file not shown.
13 changes: 5 additions & 8 deletions .github/workflows/python-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,14 @@ jobs:

steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v5

- name: Configure Python Path
run: |
echo "PYTHONPATH=$PWD:$PWD/services:$PWD/services/guardian" >> $GITHUB_ENV
echo "PYTHONPATH=$PWD:$PWD/src:$PWD/services:$PWD/services/guardian" >> $GITHUB_ENV

- name: Set up Python
uses: actions/setup-python@v5
uses: actions/setup-python@v6
with:
python-version: "3.12"

Expand All @@ -37,9 +37,6 @@ jobs:
- name: Compile check
run: python -m compileall services

- name: Run tests
run: python -m pytest -v

- name: Coverage
run: python -m pytest --cov=services.guardian --cov-config=.coveragerc.guardian --cov-config=.coveragerc --cov-report=term-missing --cov-fail-under=0
- name: Run tests with coverage
run: python -m pytest -v --cov=services.guardian --cov-config=.coveragerc --cov-report=term-missing --cov-fail-under=0

7 changes: 7 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,11 @@ __pycache__/
*.before_mother_brain
*.runtime_backup
.env.local
<<<<<<< HEAD
<<<<<<< HEAD
=======
guardian_audit.json
>>>>>>> origin/main
=======
guardian_audit.json
>>>>>>> origin/main
18 changes: 18 additions & 0 deletions ai/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,24 @@ def generate(prompt: str, model: str = "gemini-3.5-flash") -> str:
return "AI Runtime Mock Ready"

api_key = os.getenv("GEMINI_API_KEY")

client = genai.Client(
api_key=api_key
)

try:
response = client.models.generate_content(
model="gemini-3.5-flash",
contents=prompt
)

return response.text

except ClientError as e:

if e.code == 429:
return "AI Runtime Quota Limited - Fallback Mode"

client = genai.Client(api_key=api_key)

try:
Expand Down
35 changes: 35 additions & 0 deletions ai_gateway/action_engine.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
from datetime import datetime


class ActionEngine:

def __init__(self):
self.actions = []


def create(self, decision):

action = {
"action": decision.get(
"action",
"NO_ACTION"
),
"risk_level": decision.get(
"risk",
{}
).get(
"risk_level",
"UNKNOWN"
),
"status": "PLANNED",
"timestamp": datetime.utcnow().isoformat()
}


self.actions.append(action)

return action


def history(self):
return self.actions
126 changes: 115 additions & 11 deletions ai_gateway/aeon_ai_gateway.py
Original file line number Diff line number Diff line change
@@ -1,34 +1,138 @@
import os

from ai_gateway.gemini_provider import GeminiProvider
from ai_gateway.qwen_adapter import QwenAdapter
from ai_gateway.health import ProviderHealth
from ai_gateway.router import ProviderRouter
from ai_gateway.metrics import GatewayMetrics
from ai_gateway.circuit_breaker import CircuitBreaker
from ai_gateway.events import EventBus
from ai_gateway.telemetry import Telemetry
from ai_gateway.risk import RiskAnalyzer
from ai_gateway.guardian import Guardian
from ai_gateway.command_center import CommandCenter
from ai_gateway.approval import ApprovalGate
from ai_gateway.audit import AuditTrail
from ai_gateway.rollback import RollbackEngine
from ai_gateway.action_engine import ActionEngine
from ai_gateway.policy import PolicyGuard
from ai_gateway.executor import Executor
from ai_gateway.decision import DecisionContract


class AEONAI:

def __init__(self):
self.provider = GeminiProvider()
def __init__(self, provider=None):
self.health = ProviderHealth()
self.router = ProviderRouter()
self.metrics = GatewayMetrics()
self.breaker = CircuitBreaker()
self.events = EventBus()
self.telemetry = Telemetry()
self.risk = RiskAnalyzer()
self.guardian = Guardian()
self.command = CommandCenter()
self.approval = ApprovalGate()
self.audit = AuditTrail()
self.rollback = RollbackEngine()
self.actions = ActionEngine()
self.policy = PolicyGuard()
self.executor = Executor()
self.decision = DecisionContract()

provider = provider or os.getenv(
"AEON_LLM_PROVIDER",
"gemini"
)

if provider == "qwen":

self.provider = QwenAdapter(
{
"model": os.getenv(
"QWEN_MODEL",
"qwen-max"
),
"api_key": os.getenv(
"DASHSCOPE_API_KEY",
""
)
}
)

self.mode = "qwen"

else:

self.provider = GeminiProvider()
self.mode = "gemini"

self.health.check(self.mode, self.provider)
self.router.register(self.mode, self.provider)



def analyze(self, event):

prompt = f"""
You are AEON MATRIX Mother Brain AI.

System:
- Autonomous Logistics Operating System
- WMS Intelligence
- Digital Twin
- Command Center
- Predictive Operations
- AI Governance

Analyze operational event:

{event}

Return:

1. Situation
2. Risk
3. Prediction
4. Recommended Action
"""

return self.provider.generate(prompt)

result = self.router.execute(
prompt,
self.breaker
)


self.events.publish(
"AI_DECISION",
{
"provider": self.mode,
"event": event
}
)


self.telemetry.capture(
self.mode,
event,
result
)


risk = self.risk.analyze(
event
)


guardian_result = self.guardian.evaluate(
risk
)


final_decision = self.decision.build(
result,
guardian_result
)


self.events.publish(
"GUARDIAN_DECISION",
final_decision
)


return final_decision

24 changes: 24 additions & 0 deletions ai_gateway/approval.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
from datetime import datetime


class ApprovalGate:

def __init__(self):
self.records=[]


def approve(self, action):

record={
"action":action,
"approved":True,
"timestamp":datetime.utcnow().isoformat()
}

self.records.append(record)

return record


def history(self):
return self.records
19 changes: 19 additions & 0 deletions ai_gateway/audit.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
from datetime import datetime


class AuditTrail:

def __init__(self):
self.logs=[]


def record(self,event):

self.logs.append({
"event":event,
"time":datetime.utcnow().isoformat()
})


def report(self):
return self.logs
52 changes: 52 additions & 0 deletions ai_gateway/circuit_breaker.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
from datetime import datetime


class CircuitBreaker:

def __init__(self, threshold=3):
self.threshold = threshold
self.failures = {}
self.state = {}

def record_success(self, provider):

self.failures[provider] = 0
self.state[provider] = {
"status": "CLOSED",
"updated": datetime.utcnow().isoformat()
}


def record_failure(self, provider):

if provider not in self.failures:
self.failures[provider] = 0

self.failures[provider] += 1


if self.failures[provider] >= self.threshold:
self.state[provider] = {
"status": "OPEN",
"updated": datetime.utcnow().isoformat()
}

else:
self.state[provider] = {
"status": "DEGRADED",
"updated": datetime.utcnow().isoformat()
}


def allow(self, provider):

status = self.state.get(
provider,
{"status":"CLOSED"}
)

return status["status"] != "OPEN"


def report(self):
return self.state
11 changes: 11 additions & 0 deletions ai_gateway/command_center.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@

class CommandCenter:


def status(self):

return {
"system":"AEON MATRIX",
"mode":"AUTONOMOUS GOVERNANCE",
"status":"ONLINE"
}
20 changes: 20 additions & 0 deletions ai_gateway/decision.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
class DecisionContract:


def build(
self,
analysis,
guardian
):

return {

"analysis": analysis,

"guardian":
guardian,

"status":
"DECISION_READY"

}
Loading
Loading