integrate evidence-grounded AI enrichment

This commit is contained in:
Marco0300
2026-09-03 19:55:48 +02:00
parent 74871b5006
commit e3257f1ce9
4 changed files with 142 additions and 53 deletions
+30
View File
@@ -49,6 +49,36 @@ class Phase13ApiTests(unittest.TestCase):
self.assertEqual(status, "not_configured"); self.assertEqual(provider, ""); self.assertEqual(version, "")
self.assertNotIn("output", metadata)
def test_structured_enrichment_contract_has_classification_priority_confidence_uncertainty_and_provenance(self):
status, business = self.request("POST", "/api/v1/businesses", {"name": "Structured Co", "website": "https://structured.test"}); self.assertEqual(status, 201)
bid = business["id"]
self.request("POST", f"/api/v1/businesses/{bid}/evidence", {"kind": "source", "url": "https://source.test", "claim": "Provides solar installation"})
status, run = self.request("POST", f"/api/v1/businesses/{bid}/ai/suggest", {}); self.assertEqual(status, 201)
output = run["output"]
for key in ("classification", "summary", "priority_recommendation", "confidence", "uncertainty", "conflicts", "citations", "policy"):
self.assertIn(key, output)
self.assertTrue(output["citations"][0]["provenance"])
self.assertTrue(output["citations"][0]["hash"])
self.assertEqual(output["policy"]["claim_policy"], "stored_evidence_only")
def test_approval_rejects_stale_source_hashes(self):
_, business = self.request("POST", "/api/v1/businesses", {"name": "Stale Co"})
bid = business["id"]
self.request("POST", f"/api/v1/businesses/{bid}/evidence", {"kind": "source", "url": "https://source.test", "claim": "Original claim"})
_, run = self.request("POST", f"/api/v1/businesses/{bid}/ai/suggest", {})
self.request("POST", f"/api/v1/businesses/{bid}/evidence", {"kind": "source", "url": "https://source.test", "claim": "Changed claim"})
status, result = self.request("POST", f"/api/v1/ai-runs/{run['id']}/approve", {})
self.assertEqual(status, 409); self.assertEqual(result["error"], "ai_run_stale")
def test_remote_provider_is_not_configured_and_status_never_makes_network_call(self):
os.environ["AI_PROVIDER"] = "openai"
status, provider, version, metadata = generate({"name": "Remote"}, [], [], [])
self.assertEqual(status, "not_configured"); self.assertEqual(provider, "openai"); self.assertNotIn("output", metadata)
status, result = self.request("GET", "/api/v1/ai/provider-config")
self.assertEqual(status, 200); self.assertEqual(result["status"], "not_configured"); self.assertFalse(result["network_enabled"])
status, result = self.request("POST", "/api/v1/ai/provider-config", {"provider": "openai", "enabled": True, "reviewed": True})
self.assertEqual(status, 409); self.assertFalse(result["network_enabled"])
def test_endpoint_persists_citations_and_approval_without_crm_write(self):
status, business = self.request("POST", "/api/v1/businesses", {"name": "Evidence Co", "website": "https://evidence.test"}); self.assertEqual(status, 201)
bid = business["id"]