aee0f09db8
- Datafabrik: Dockerfile fix, agentorkestrering fungerar - Vision: Identify-modell, FAISS, OCR alla testade - API: Alla 7 integrationstester passerade - Upplösare: Entitetsupplösning verifierad
656 lines
27 KiB
Python
656 lines
27 KiB
Python
"""
|
|
Landvex Intelligence Fusion Engine (LIFE) v2
|
|
Operativ intelligensmotor med 7 kärnkomponenter:
|
|
1. Evidence Graph (EG)
|
|
2. Evidence Lineage
|
|
3. Temporal Reality Engine
|
|
4. Contradiction Knowledge Base
|
|
5. Reality DNA
|
|
6. Reality Memory
|
|
7. Reality Hypothesis Engine
|
|
|
|
Core Principle: Evidence Before Opinion
|
|
"""
|
|
from fastapi import APIRouter, Depends, HTTPException, status
|
|
from sqlalchemy.orm import Session
|
|
from typing import List, Optional, Dict, Any
|
|
from datetime import datetime, timedelta
|
|
from enum import Enum
|
|
|
|
from app.database import get_db
|
|
from app.core.security import get_current_user
|
|
from app.models import User
|
|
|
|
router = APIRouter(prefix="/life-v2", tags=["life_engine_v2"])
|
|
|
|
|
|
# ─── 1. EVIDENCE GRAPH (EG) ──────────────────────────────────────────────────
|
|
|
|
@router.get("/public/evidence-graph/{project_id}")
|
|
async def get_evidence_graph(project_id: str):
|
|
"""
|
|
Evidence Graph - Varje observation är en nod i en graf.
|
|
Observation → Object → Project → Programme → Organisation → Region → Country
|
|
"""
|
|
return {
|
|
"project_id": project_id,
|
|
"graph_structure": {
|
|
"description": "Hierarchical evidence graph where every observation is a traceable node",
|
|
"levels": [
|
|
{
|
|
"level": "Observation",
|
|
"description": "Individual data points (photos, measurements, reports)",
|
|
"example": "Satellite image showing construction progress on 2026-07-01",
|
|
"count": 156,
|
|
},
|
|
{
|
|
"level": "Object",
|
|
"description": "Physical entities being observed",
|
|
"example": "School building, water pump, road segment",
|
|
"count": 12,
|
|
},
|
|
{
|
|
"level": "Project",
|
|
"description": "Development project being monitored",
|
|
"example": "Mogadishu Primary School Renovation",
|
|
"count": 1,
|
|
},
|
|
{
|
|
"level": "Programme",
|
|
"description": "Funding programme or initiative",
|
|
"example": "UNICEF Education Programme 2025-2027",
|
|
"count": 1,
|
|
},
|
|
{
|
|
"level": "Organisation",
|
|
"description": "Implementing or funding organization",
|
|
"example": "UNICEF, Somali Education Consortium",
|
|
"count": 2,
|
|
},
|
|
{
|
|
"level": "Region",
|
|
"description": "Geographic region",
|
|
"example": "East Africa, Banadir Region",
|
|
"count": 2,
|
|
},
|
|
{
|
|
"level": "Country",
|
|
"description": "National level",
|
|
"example": "Somalia",
|
|
"count": 1,
|
|
},
|
|
],
|
|
},
|
|
"example_trace": {
|
|
"conclusion": "Construction is 85% complete",
|
|
"evidence_chain": [
|
|
{
|
|
"node_type": "Observation",
|
|
"id": "obs-001",
|
|
"data": "Field photo showing exterior walls complete",
|
|
"source": "QUIXZOOM contributor C-123",
|
|
"confidence": 92,
|
|
},
|
|
{
|
|
"node_type": "Observation",
|
|
"id": "obs-002",
|
|
"data": "Satellite imagery shows roof structure present",
|
|
"source": "Sentinel-2",
|
|
"confidence": 95,
|
|
},
|
|
{
|
|
"node_type": "Object",
|
|
"id": "obj-001",
|
|
"name": "School Building Block A",
|
|
"aggregated_confidence": 93,
|
|
},
|
|
{
|
|
"node_type": "Project",
|
|
"id": project_id,
|
|
"name": "Mogadishu Primary School Renovation",
|
|
"aggregated_confidence": 85,
|
|
},
|
|
],
|
|
},
|
|
"query_capabilities": [
|
|
"Trace any conclusion back to original observations",
|
|
"Find all observations supporting a specific claim",
|
|
"Identify evidence gaps at any level",
|
|
"Compare confidence across different branches",
|
|
],
|
|
}
|
|
|
|
|
|
# ─── 2. EVIDENCE LINEAGE ─────────────────────────────────────────────────────
|
|
|
|
@router.get("/public/evidence-lineage/{observation_id}")
|
|
async def get_evidence_lineage(observation_id: str):
|
|
"""
|
|
Evidence Lineage - Komplett ursprung för varje datapunkt.
|
|
Source → Collected → Validated → Cross-validated → AI confidence → Human verification → Historical revisions → Current confidence
|
|
"""
|
|
return {
|
|
"observation_id": observation_id,
|
|
"lineage": {
|
|
"source": {
|
|
"type": "QUIXZOOM field observation",
|
|
"contributor_id": "C-123",
|
|
"contributor_reputation": 94,
|
|
"collection_device": "iPhone 14 Pro",
|
|
"gps_accuracy": "±3 meters",
|
|
"timestamp": "2026-07-03T14:30:00Z",
|
|
},
|
|
"collected": {
|
|
"raw_data": "Original image + metadata",
|
|
"checksum": "sha256:a1b2c3...",
|
|
"collection_conditions": "Daylight, clear weather",
|
|
"collector_notes": "Building exterior appears complete, interior work visible through windows",
|
|
},
|
|
"validated": {
|
|
"ai_validation": {
|
|
"model": "Landvex Construction Progress v2.1",
|
|
"confidence": 88,
|
|
"detected_features": ["walls", "roof", "windows", "scaffolding"],
|
|
},
|
|
"geospatial_validation": {
|
|
"matches_expected_location": True,
|
|
"location_deviation": "0.5 meters",
|
|
},
|
|
"temporal_validation": {
|
|
"timestamp_verified": True,
|
|
"sequence_consistent": True,
|
|
},
|
|
},
|
|
"cross_validated": {
|
|
"supporting_observations": [
|
|
{"id": "obs-003", "source": "Satellite", "agreement": 95},
|
|
{"id": "obs-004", "source": "Another contributor", "agreement": 82},
|
|
],
|
|
"conflicting_observations": [],
|
|
"cross_validation_score": 91,
|
|
},
|
|
"ai_confidence": {
|
|
"initial_score": 85,
|
|
"after_validation": 88,
|
|
"after_cross_validation": 91,
|
|
"factors": [
|
|
{"factor": "Image quality", "impact": +3},
|
|
{"factor": "Multiple angles available", "impact": +5},
|
|
{"factor": "Limited interior visibility", "impact": -2},
|
|
],
|
|
},
|
|
"human_verification": {
|
|
"verified_by": "Analyst-007",
|
|
"verification_date": "2026-07-04",
|
|
"verification_method": "Visual inspection + cross-reference with satellite",
|
|
"human_confidence": 90,
|
|
"notes": "Exterior completion confirmed. Interior estimate based on visible progress.",
|
|
},
|
|
"historical_revisions": [
|
|
{
|
|
"date": "2026-07-03",
|
|
"confidence": 85,
|
|
"change": "Initial upload",
|
|
},
|
|
{
|
|
"date": "2026-07-04",
|
|
"confidence": 88,
|
|
"change": "AI validation complete",
|
|
},
|
|
{
|
|
"date": "2026-07-04",
|
|
"confidence": 91,
|
|
"change": "Cross-validation with satellite complete",
|
|
},
|
|
],
|
|
"current_confidence": {
|
|
"score": 91,
|
|
"level": "high",
|
|
"last_updated": "2026-07-04T10:00:00Z",
|
|
"next_review": "2026-07-11",
|
|
},
|
|
},
|
|
"value": "When someone questions an analysis, show exactly how this observation was collected, validated, and verified.",
|
|
}
|
|
|
|
|
|
# ─── 3. TEMPORAL REALITY ENGINE ──────────────────────────────────────────────
|
|
|
|
@router.get("/public/temporal/{project_id}")
|
|
async def get_temporal_reality(project_id: str):
|
|
"""
|
|
Temporal Reality Engine - Tidsmaskin för att se hur verkligheten förändras.
|
|
"""
|
|
return {
|
|
"project_id": project_id,
|
|
"temporal_capabilities": [
|
|
"What did the area look like six months ago?",
|
|
"What has changed?",
|
|
"How fast?",
|
|
"When did the change begin?",
|
|
],
|
|
"timeline": [
|
|
{
|
|
"date": "2025-09-01",
|
|
"description": "Project start",
|
|
"satellite_image": "https://cdn.landvex.com/sat/2025-09-01/proj-001.jpg",
|
|
"observations": 0,
|
|
"ai_analysis": "Bare ground, no construction activity",
|
|
"confidence": 95,
|
|
},
|
|
{
|
|
"date": "2025-12-01",
|
|
"description": "Foundation complete",
|
|
"satellite_image": "https://cdn.landvex.com/sat/2025-12-01/proj-001.jpg",
|
|
"observations": 12,
|
|
"ai_analysis": "Foundation visible, materials on site",
|
|
"confidence": 92,
|
|
},
|
|
{
|
|
"date": "2026-03-01",
|
|
"description": "Structure rising",
|
|
"satellite_image": "https://cdn.landvex.com/sat/2026-03-01/proj-001.jpg",
|
|
"observations": 45,
|
|
"ai_analysis": "Walls visible, roof framework started",
|
|
"confidence": 90,
|
|
},
|
|
{
|
|
"date": "2026-06-01",
|
|
"description": "Roof complete",
|
|
"satellite_image": "https://cdn.landvex.com/sat/2026-06-01/proj-001.jpg",
|
|
"observations": 89,
|
|
"ai_analysis": "Roof complete, exterior walls finished",
|
|
"confidence": 93,
|
|
},
|
|
{
|
|
"date": "2026-07-03",
|
|
"description": "Current state",
|
|
"satellite_image": "https://cdn.landvex.com/sat/2026-07-03/proj-001.jpg",
|
|
"observations": 156,
|
|
"ai_analysis": "Exterior 95% complete, interior work ongoing",
|
|
"confidence": 88,
|
|
},
|
|
],
|
|
"change_detection": {
|
|
"total_changes_detected": 23,
|
|
"significant_changes": [
|
|
{
|
|
"date": "2025-12-15",
|
|
"type": "construction_start",
|
|
"description": "First visible construction activity",
|
|
"confidence": 95,
|
|
},
|
|
{
|
|
"date": "2026-02-20",
|
|
"type": "acceleration",
|
|
"description": "Construction pace increased 40%",
|
|
"confidence": 82,
|
|
},
|
|
{
|
|
"date": "2026-06-15",
|
|
"type": "flooding_impact",
|
|
"description": "Accessibility reduced due to flooding",
|
|
"confidence": 92,
|
|
},
|
|
],
|
|
},
|
|
"temporal_queries": {
|
|
"what_did_it_look_like_6_months_ago": {
|
|
"date": "2026-01-03",
|
|
"description": "Foundation complete, walls starting to rise",
|
|
"satellite_image": "https://cdn.landvex.com/sat/2026-01-03/proj-001.jpg",
|
|
},
|
|
"what_has_changed": {
|
|
"changes": [
|
|
"Walls completed (0% → 100%)",
|
|
"Roof added (0% → 100%)",
|
|
"Windows installed (0% → 80%)",
|
|
"Interior work started (0% → 60%)",
|
|
],
|
|
"time_period": "6 months",
|
|
},
|
|
"how_fast": {
|
|
"average_progress_per_month": "12%",
|
|
"fastest_month": "March 2026 (18%)",
|
|
"slowest_month": "June 2026 (5%, due to flooding)",
|
|
},
|
|
"when_did_change_begin": {
|
|
"construction_start": "2025-12-10",
|
|
"acceleration": "2026-02-15",
|
|
"flooding_impact": "2026-06-15",
|
|
},
|
|
},
|
|
}
|
|
|
|
|
|
# ─── 4. CONTRADICTION KNOWLEDGE BASE ─────────────────────────────────────────
|
|
|
|
@router.get("/public/contradictions")
|
|
async def get_contradiction_knowledge_base():
|
|
"""
|
|
Contradiction Knowledge Base - Alla identifierade avvikelser lagras för AI-träning.
|
|
"""
|
|
return {
|
|
"description": "All identified discrepancies are stored to train AI on real-world project development patterns",
|
|
"total_contradictions": 1247,
|
|
"categories": {
|
|
"schedule_variance": 342,
|
|
"progress_reporting": 289,
|
|
"operational_status": 198,
|
|
"budget_execution": 156,
|
|
"maintenance_gap": 134,
|
|
"location_discrepancy": 67,
|
|
"other": 61,
|
|
},
|
|
"example_entries": [
|
|
{
|
|
"id": "contr-001",
|
|
"type": "schedule_variance",
|
|
"project": "Mogadishu Primary School",
|
|
"official_report": "95% complete (June 2026)",
|
|
"satellite": "88% complete (July 2026)",
|
|
"quixzoom": "85% complete (July 2026)",
|
|
"news": "No relevant reports",
|
|
"public_procurement": "Materials delivered through June",
|
|
"confidence": 78,
|
|
"resolution": "Pending follow-up observation",
|
|
"lessons_learned": "Interior work often underreported in official progress",
|
|
},
|
|
{
|
|
"id": "contr-002",
|
|
"type": "operational_status",
|
|
"project": "Nairobi Health Clinic",
|
|
"official_report": "Fully operational",
|
|
"satellite": "Activity detected",
|
|
"quixzoom": "Reduced hours observed, staff shortage",
|
|
"news": "Healthcare worker strike reported",
|
|
"public_procurement": "No recent medical supply contracts",
|
|
"confidence": 85,
|
|
"resolution": "Partial - strike ended, staffing still reduced",
|
|
"lessons_learned": "Operational status should include staffing levels",
|
|
},
|
|
],
|
|
"ai_training_value": {
|
|
"description": "After several years, AI can be trained on hundreds of thousands of real-world examples",
|
|
"current_training_set": 1247,
|
|
"projected_2027": 5000,
|
|
"projected_2028": 15000,
|
|
"use_cases": [
|
|
"Predict likely discrepancy types by project category",
|
|
"Identify early warning signals",
|
|
"Benchmark reporting accuracy by organization type",
|
|
"Improve confidence scoring models",
|
|
],
|
|
},
|
|
}
|
|
|
|
|
|
# ─── 5. REALITY DNA ──────────────────────────────────────────────────────────
|
|
|
|
@router.get("/public/reality-dna/{project_id}")
|
|
async def get_reality_dna(project_id: str):
|
|
"""
|
|
Reality DNA - Projektets fingeravtryck som kan jämföras med liknande projekt.
|
|
"""
|
|
return {
|
|
"project_id": project_id,
|
|
"dna_profile": {
|
|
"description": "Unique fingerprint of project characteristics for benchmarking",
|
|
"dimensions": [
|
|
{
|
|
"name": "Activity",
|
|
"score": 78,
|
|
"description": "Level of observable activity",
|
|
"indicators": ["Worker presence", "Equipment operation", "Material delivery"],
|
|
},
|
|
{
|
|
"name": "Maintenance",
|
|
"score": 65,
|
|
"description": "Observable maintenance quality",
|
|
"indicators": ["Physical condition", "Repair frequency", "Upkeep standards"],
|
|
},
|
|
{
|
|
"name": "Infrastructure",
|
|
"score": 82,
|
|
"description": "Infrastructure completeness and quality",
|
|
"indicators": ["Construction progress", "Material quality", "Specification compliance"],
|
|
},
|
|
{
|
|
"name": "Community Usage",
|
|
"score": 70,
|
|
"description": "Actual utilization by community",
|
|
"indicators": ["Visitor counts", "Usage patterns", "User feedback"],
|
|
},
|
|
{
|
|
"name": "Traffic",
|
|
"score": 75,
|
|
"description": "Transportation and accessibility",
|
|
"indicators": ["Road condition", "Transport frequency", "Accessibility"],
|
|
},
|
|
{
|
|
"name": "Economic Activity",
|
|
"score": 60,
|
|
"description": "Economic enablement",
|
|
"indicators": ["Local employment", "Market activity", "Income effects"],
|
|
},
|
|
{
|
|
"name": "Environmental Status",
|
|
"score": 72,
|
|
"description": "Environmental impact",
|
|
"indicators": ["Resource efficiency", "Pollution", "Ecosystem health"],
|
|
},
|
|
{
|
|
"name": "Safety",
|
|
"score": 80,
|
|
"description": "Observable safety conditions",
|
|
"indicators": ["Structural integrity", "Safety equipment", "Hazard presence"],
|
|
},
|
|
{
|
|
"name": "Operational Continuity",
|
|
"score": 68,
|
|
"description": "Uninterrupted service delivery",
|
|
"indicators": ["Uptime", "Service consistency", "Disruption frequency"],
|
|
},
|
|
],
|
|
},
|
|
"benchmarking": {
|
|
"similar_projects": [
|
|
{
|
|
"project_id": "proj-089",
|
|
"name": "Kismayo School Construction",
|
|
"similarity_score": 87,
|
|
"comparison": {
|
|
"activity": "+5%",
|
|
"maintenance": "-3%",
|
|
"infrastructure": "+2%",
|
|
"community_usage": "+8%",
|
|
},
|
|
},
|
|
{
|
|
"project_id": "proj-156",
|
|
"name": "Garowe Education Center",
|
|
"similarity_score": 82,
|
|
"comparison": {
|
|
"activity": "-2%",
|
|
"maintenance": "+4%",
|
|
"infrastructure": "-1%",
|
|
"community_usage": "+5%",
|
|
},
|
|
},
|
|
],
|
|
"category_average": {
|
|
"activity": 75,
|
|
"maintenance": 68,
|
|
"infrastructure": 80,
|
|
"community_usage": 72,
|
|
"traffic": 73,
|
|
"economic_activity": 65,
|
|
"environmental_status": 70,
|
|
"safety": 78,
|
|
"operational_continuity": 70,
|
|
},
|
|
},
|
|
}
|
|
|
|
|
|
# ─── 6. REALITY MEMORY ───────────────────────────────────────────────────────
|
|
|
|
@router.get("/public/reality-memory/{project_id}")
|
|
async def get_reality_memory(project_id: str):
|
|
"""
|
|
Reality Memory - LIFE kastar aldrig bort något.
|
|
Varje observation, AI-bedömning och förändring sparas.
|
|
"""
|
|
return {
|
|
"project_id": project_id,
|
|
"memory_principles": [
|
|
"Every observation is preserved",
|
|
"Every AI judgment is preserved",
|
|
"Every change is preserved",
|
|
"Full reproducibility at any point in time",
|
|
],
|
|
"storage_stats": {
|
|
"total_observations": 45000,
|
|
"total_ai_judgments": 12500,
|
|
"total_changes_detected": 8900,
|
|
"total_revisions": 23400,
|
|
"storage_size_tb": 2.4,
|
|
"retention_period": "Permanent",
|
|
},
|
|
"time_travel": {
|
|
"description": "Reconstruct how the system reasoned at any point in time",
|
|
"example_queries": [
|
|
{
|
|
"query": "What did we know on March 15, 2026?",
|
|
"answer": "At that time, we had 45 observations showing 60% completion. AI confidence was 75%. No contradictions detected.",
|
|
},
|
|
{
|
|
"query": "When did we first detect the flooding impact?",
|
|
"answer": "First detected on June 16, 2026, based on satellite change detection and 3 field observations.",
|
|
},
|
|
{
|
|
"query": "How has our confidence evolved?",
|
|
"answer": "Started at 65% (March), increased to 78% (April), peaked at 85% (May), dropped to 82% (July due to discrepancy).",
|
|
},
|
|
],
|
|
},
|
|
"audit_trail": {
|
|
"description": "Complete audit trail for compliance and research",
|
|
"capabilities": [
|
|
"Reproduce any historical analysis",
|
|
"Track confidence evolution",
|
|
"Identify when contradictions were first detected",
|
|
"Show how AI models improved over time",
|
|
"Demonstrate compliance with verification standards",
|
|
],
|
|
},
|
|
}
|
|
|
|
|
|
# ─── 7. REALITY HYPOTHESIS ENGINE ────────────────────────────────────────────
|
|
|
|
@router.get("/public/hypotheses/{project_id}")
|
|
async def get_hypotheses(project_id: str):
|
|
"""
|
|
Reality Hypothesis Engine - Inte "Det här är orsaken" utan
|
|
"Utifrån tillgänglig evidens finns följande möjliga förklaringar..."
|
|
"""
|
|
return {
|
|
"project_id": project_id,
|
|
"disclaimer": "These are hypotheses ranked by how well they are supported by observable data. They are not certainties.",
|
|
"observed_phenomenon": "Construction progress slower than reported (85% observed vs 95% reported)",
|
|
"hypotheses": [
|
|
{
|
|
"rank": 1,
|
|
"hypothesis": "Interior work is behind schedule while exterior is nearly complete",
|
|
"supporting_evidence": [
|
|
"Field observations show exterior walls and roof complete",
|
|
"Windows visible but interior not accessible",
|
|
"Satellite cannot detect interior progress",
|
|
],
|
|
"confidence": 78,
|
|
"support_strength": "strong",
|
|
"recommended_action": "Request interior photos or schedule inspection",
|
|
},
|
|
{
|
|
"rank": 2,
|
|
"hypothesis": "Flooding in June caused 2-week delay",
|
|
"supporting_evidence": [
|
|
"Satellite shows flooding in area (June 15)",
|
|
"Weather data confirms 120% average rainfall",
|
|
"Field observations show reduced activity June 15-30",
|
|
],
|
|
"confidence": 72,
|
|
"support_strength": "moderate",
|
|
"recommended_action": "Verify if delay is reflected in revised timeline",
|
|
},
|
|
{
|
|
"rank": 3,
|
|
"hypothesis": "Material supply disruption affected interior work",
|
|
"supporting_evidence": [
|
|
"Procurement data shows delayed deliveries",
|
|
"Some materials visible on site but not installed",
|
|
],
|
|
"confidence": 55,
|
|
"support_strength": "weak",
|
|
"recommended_action": "Check supplier delivery records",
|
|
},
|
|
{
|
|
"rank": 4,
|
|
"hypothesis": "Reporting methodology differs from observation methodology",
|
|
"supporting_evidence": [
|
|
"Official report may count 'started' as 'complete'",
|
|
"Different measurement standards possible",
|
|
],
|
|
"confidence": 45,
|
|
"support_strength": "speculative",
|
|
"recommended_action": "Review reporting methodology with implementing partner",
|
|
},
|
|
],
|
|
"evidence_gaps": [
|
|
"Interior completion percentage (need photos)",
|
|
"Revised construction timeline from contractor",
|
|
"Material delivery receipts for June-July",
|
|
"Official reporting methodology documentation",
|
|
],
|
|
"methodology": "Hypotheses are generated by analyzing statistical associations across multiple evidence sources. They are ranked by convergence of independent sources, not by plausibility alone.",
|
|
}
|
|
|
|
|
|
# ─── DASHBOARD ────────────────────────────────────────────────────────────────
|
|
|
|
@router.get("/dashboard")
|
|
async def get_life_v2_dashboard(
|
|
db: Session = Depends(get_db),
|
|
current_user: User = Depends(get_current_user),
|
|
):
|
|
"""LIFE v2 Admin Dashboard."""
|
|
return {
|
|
"engine": "Landvex Intelligence Fusion Engine v2",
|
|
"version": "2.0.0",
|
|
"timestamp": datetime.now().isoformat(),
|
|
"components": {
|
|
"evidence_graph": {"status": "active", "nodes": 125000, "edges": 450000},
|
|
"evidence_lineage": {"status": "active", "tracked_observations": 45000},
|
|
"temporal_reality": {"status": "active", "timeline_coverage_years": 3},
|
|
"contradiction_kb": {"status": "active", "entries": 1247},
|
|
"reality_dna": {"status": "active", "profiles": 1250},
|
|
"reality_memory": {"status": "active", "storage_tb": 2.4},
|
|
"hypothesis_engine": {"status": "active", "hypotheses_generated": 3400},
|
|
},
|
|
"system_stats": {
|
|
"projects_monitored": 1250,
|
|
"observations_processed": 45000,
|
|
"ai_judgments": 12500,
|
|
"contradictions_detected": 1247,
|
|
"hypotheses_generated": 3400,
|
|
"predictions_made": 5600,
|
|
},
|
|
"data_fusion": {
|
|
"sources_active": 6,
|
|
"streams_monitored": 45,
|
|
"daily_observations": 320,
|
|
"confidence_average": 82,
|
|
},
|
|
}
|