Items completed: 1. Merged PR #2 (starlette/httpx deps) 2. Fixed async race condition in multimodal_ui.py 3. Wired TTSAdapter (ElevenLabs, Azure) in API routes 4. Moved super_big_brain.py from core/ to reasoning/ (backward compat shim) 5. Added API authentication middleware (Bearer token via FUSIONAGI_API_KEY) 6. Added async adapter interface (acomplete/acomplete_structured) 7. Migrated FastAPI on_event to lifespan (fixes 20 deprecation warnings) 8. Liquid Neural Networks (continuous-time adaptive weights) 9. Quantum-AI Hybrid compute backend (simulator + optimization) 10. Embodied Intelligence / Robotics bridge (actuator + sensor protocols) 11. Consciousness Engineering (formal self-model with introspection) 12. ASI Scoring Rubric (C/A/L/N/R self-assessment harness) 13. GPU integration tests for TensorFlow backend 14. Multi-stage production Dockerfile 15. Gitea CI/CD pipeline (lint, test matrix, Docker build) 16. API rate limiting middleware (per-IP sliding window) 17. OpenAPI docs cleanup (auth + rate limiting descriptions) 18. Benchmarking suite (decomposition, multi-path, recomposition, e2e) 19. Plugin system (head registry for custom heads) 427 tests passing, 0 ruff errors, 0 mypy errors. Co-Authored-By: Nakamoto, S <defi@defi-oracle.io>
142 lines
5.1 KiB
Python
142 lines
5.1 KiB
Python
"""Smoke tests for AGI stack: executive, memory, verification, world model, skills, multi-agent, governance, tooling."""
|
|
|
|
|
|
from fusionagi.core import (
|
|
BlockersAndCheckpoints,
|
|
FallbackMode,
|
|
GoalManager,
|
|
Scheduler,
|
|
SchedulerMode,
|
|
)
|
|
from fusionagi.governance import AuditLog, IntentAlignment, PolicyEngine
|
|
from fusionagi.memory import ProceduralMemory, SemanticMemory, TrustMemory
|
|
from fusionagi.multi_agent import arbitrate, consensus_vote
|
|
from fusionagi.schemas.audit import AuditEventType
|
|
from fusionagi.schemas.goal import Blocker, Checkpoint, Goal, GoalBudget
|
|
from fusionagi.schemas.plan import Plan, PlanStep
|
|
from fusionagi.schemas.skill import Skill
|
|
from fusionagi.skills import SkillInduction, SkillLibrary, SkillVersioning
|
|
from fusionagi.tools import CodeRunnerConnector, DBConnector, DocsConnector
|
|
from fusionagi.verification import ContradictionDetector, FormalValidators, OutcomeVerifier
|
|
from fusionagi.world_model import SimpleWorldModel, run_rollout
|
|
|
|
|
|
class TestExecutive:
|
|
def test_goal_manager_budget(self):
|
|
gm = GoalManager()
|
|
g = Goal(goal_id="g1", objective="Test", budget=GoalBudget(time_seconds=10.0, compute_budget=100.0))
|
|
gm.add_goal(g)
|
|
assert gm.get_goal("g1") is not None
|
|
gm.record_time("g1", 5.0)
|
|
assert not gm.is_over_budget("g1")
|
|
gm.record_time("g1", 10.0)
|
|
assert gm.is_over_budget("g1")
|
|
|
|
def test_scheduler_fallback(self):
|
|
s = Scheduler(default_mode=SchedulerMode.ACT, max_retries_per_step=2)
|
|
assert s.next_mode("t1", "s1") == SchedulerMode.ACT
|
|
assert s.should_retry("t1", "s1")
|
|
s.record_retry("t1", "s1")
|
|
s.record_retry("t1", "s1")
|
|
assert not s.should_retry("t1", "s1")
|
|
fb = s.next_fallback("t1")
|
|
assert fb == FallbackMode.RETRY
|
|
|
|
def test_blockers_checkpoints(self):
|
|
bc = BlockersAndCheckpoints()
|
|
bc.add_blocker(Blocker(blocker_id="b1", task_id="t1", reason="Waiting"))
|
|
assert len(bc.get_blockers("t1")) == 1
|
|
bc.add_checkpoint(Checkpoint(checkpoint_id="c1", task_id="t1", step_ids_completed=["s1"]))
|
|
assert bc.get_latest_checkpoint("t1") is not None
|
|
|
|
|
|
class TestMemory:
|
|
def test_semantic(self):
|
|
sm = SemanticMemory()
|
|
sm.add_fact("f1", "The sky is blue", domain="weather")
|
|
assert sm.get_fact("f1")["statement"] == "The sky is blue"
|
|
assert len(sm.query(domain="weather")) == 1
|
|
|
|
def test_procedural_trust(self):
|
|
pm = ProceduralMemory()
|
|
sk = Skill(skill_id="s1", name="Close month", description="Close month-end")
|
|
pm.add_skill(sk)
|
|
assert pm.get_skill_by_name("Close month") is not None
|
|
tm = TrustMemory()
|
|
tm.add("c1", verified=True, source="test")
|
|
assert tm.is_verified("c1")
|
|
|
|
|
|
class TestVerification:
|
|
def test_outcome_verifier(self):
|
|
v = OutcomeVerifier()
|
|
assert v.verify({"result": "ok"}) is True
|
|
assert v.verify({"error": "fail"}) is False
|
|
|
|
def test_contradiction_detector(self):
|
|
d = ContradictionDetector()
|
|
assert d.check("It is not raining") == []
|
|
|
|
def test_formal_validators(self):
|
|
fv = FormalValidators()
|
|
ok, msg = fv.validate_json('{"a": 1}')
|
|
assert ok is True
|
|
|
|
|
|
class TestWorldModel:
|
|
def test_rollout(self):
|
|
plan = Plan(steps=[PlanStep(id="s1", description="Step 1"), PlanStep(id="s2", description="Step 2")])
|
|
wm = SimpleWorldModel()
|
|
ok, trans, state = run_rollout(plan, {}, wm)
|
|
assert ok is True
|
|
assert len(trans) == 2
|
|
|
|
|
|
class TestSkills:
|
|
def test_library_induction_versioning(self):
|
|
lib = SkillLibrary()
|
|
sk = Skill(skill_id="s1", name="Routine", description="Test")
|
|
lib.register(sk)
|
|
assert lib.get_by_name("Routine") is not None
|
|
ind = SkillInduction()
|
|
candidates = ind.propose_from_traces([[{"step_id": "a", "tool": "t1"}]])
|
|
assert len(candidates) == 1
|
|
ver = SkillVersioning()
|
|
ver.record_success("s1", 1)
|
|
assert ver.get_info("s1", 1).success_count == 1
|
|
|
|
|
|
class TestGovernance:
|
|
def test_audit_policy_intent(self):
|
|
audit = AuditLog()
|
|
eid = audit.append(AuditEventType.TOOL_CALL, "executor", action="run", task_id="t1")
|
|
assert eid
|
|
assert len(audit.get_by_task("t1")) == 1
|
|
pe = PolicyEngine()
|
|
allowed, _ = pe.check("run", {"tool_name": "read"})
|
|
assert allowed is True
|
|
ia = IntentAlignment()
|
|
ok, _ = ia.check("Summarize", "summarize the doc")
|
|
assert ok is True
|
|
|
|
|
|
class TestMultiAgent:
|
|
def test_consensus_arbitrate(self):
|
|
out = consensus_vote(["a", "a", "b"])
|
|
assert out == "a"
|
|
prop = arbitrate([{"plan": "p1"}, {"plan": "p2"}])
|
|
assert prop["plan"] == "p1"
|
|
|
|
|
|
class TestConnectors:
|
|
def test_connectors(self):
|
|
doc = DocsConnector()
|
|
r = doc.invoke("read", {"path": "/x"})
|
|
assert "error" in r or "content" in r
|
|
db = DBConnector()
|
|
r = db.invoke("query", {"query": "SELECT 1"})
|
|
assert "error" in r or "rows" in r
|
|
code = CodeRunnerConnector()
|
|
r = code.invoke("run", {"code": "1+1", "language": "python"})
|
|
assert "error" in r or "stdout" in r
|