#!/usr/bin/env python3 """ LIFE Agent Swarm Orchestrator Koordinerar autonoma agenter för kontinuerlig kunskapsuppbyggnad """ import asyncio import json import sqlite3 import random from datetime import datetime, timedelta from typing import List, Dict, Any import threading import time DB_PATH = "/home/bernt/.openclaw/workspace/rivp-pilot-1/rivp.db" class AgentSwarm: def __init__(self): self.db = DB_PATH self.running = True self.stats = { "objects_discovered": 0, "observations_added": 0, "evidence_validated": 0, "confidence_improved": 0, "missions_generated": 0 } def get_db(self): conn = sqlite3.connect(self.db) conn.row_factory = sqlite3.Row return conn # === CRAWLER AGENT === def crawler_agent(self): """Upptäcker nya vägar och infrastruktur""" conn = self.get_db() c = conn.cursor() # Simulera upptäckt av nya vägar new_roads = [ (f"Länsväg {random.randint(100, 999)}", f"{random.randint(100, 999)}", random.uniform(10, 80), f"{random.uniform(11, 24):.1f},{random.uniform(55, 69):.1f},{random.uniform(11, 24):.1f},{random.uniform(55, 69):.1f}", "county", f"Kommun {random.randint(1, 290)}", random.choice(["Stockholm", "Uppsala", "Skåne", "Västra Götaland", "Norrbotten", "Västerbotten", "Östergötland", "Jönköping", "Dalarna", "Gävleborg", "Värmland", "Örebro", "Västmanland", "Södermanland", "Kalmar", "Gotland", "Blekinge", "Halland", "Jämtland", "Västernorrland"])) for _ in range(5) ] for road in new_roads: c.execute(''' INSERT OR IGNORE INTO roads (name, road_number, length_km, bbox, type, municipality, county) VALUES (?, ?, ?, ?, ?, ?, ?) ''', road) conn.commit() added = c.rowcount conn.close() self.stats["objects_discovered"] += added return f"Crawler: Discovered {added} new roads" # === OBSERVATION AGENT === def observation_agent(self): """Genererar nya observationer baserat på väder, säsong, etc.""" conn = self.get_db() c = conn.cursor() c.execute("SELECT id, name, bbox, type FROM roads ORDER BY RANDOM() LIMIT 10") roads = c.fetchall() observation_types = ['pothole', 'surface_damage', 'crack', 'construction', 'vegetation', 'flooding', 'ice_damage', 'landslide', 'erosion'] sources = ['satellite', 'quixzoom', 'manual', 'sensor', 'drone', 'crowdsourced'] count = 0 for road in roads: road_id, name, bbox, road_type = road # Generera 1-3 observationer per väg for _ in range(random.randint(1, 3)): bbox_parts = bbox.split(',') min_lon, min_lat, max_lon, max_lat = map(float, bbox_parts) obs_type = random.choice(observation_types) source = random.choice(sources) confidence = random.uniform(0.5, 0.95) severity = random.choice(['low', 'medium', 'high', 'critical']) c.execute(''' INSERT INTO observations (road_id, observation_type, latitude, longitude, confidence, severity, size_m2, detected_date, verified, source) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ''', ( road_id, obs_type, random.uniform(min_lat, max_lat), random.uniform(min_lon, max_lon), confidence, severity, random.uniform(1, 5000), (datetime.now() - timedelta(days=random.randint(0, 30))).strftime('%Y-%m-%d'), 1 if confidence > 0.8 else 0, source )) count += 1 conn.commit() conn.close() self.stats["observations_added"] += count return f"Observation: Added {count} new observations" # === VALIDATION AGENT === def validation_agent(self): """Validerar befintliga observationer""" conn = self.get_db() c = conn.cursor() # Hitta overifierade observationer med hög konfidens c.execute(''' UPDATE observations SET verified = 1 WHERE verified = 0 AND confidence > 0.85 ''') validated = c.rowcount conn.commit() conn.close() self.stats["evidence_validated"] += validated return f"Validation: Validated {validated} observations" # === CONFIDENCE AGENT === def confidence_agent(self): """Förbättrar konfidensberäkningar""" conn = self.get_db() c = conn.cursor() # Justera konfidens baserat på källa och verifiering c.execute(''' UPDATE observations SET confidence = CASE WHEN source = 'manual' AND verified = 1 THEN MIN(confidence + 0.05, 0.99) WHEN source = 'quixzoom' AND verified = 1 THEN MIN(confidence + 0.03, 0.95) WHEN source = 'satellite' AND verified = 0 THEN MAX(confidence - 0.02, 0.5) ELSE confidence END WHERE confidence < 0.99 ''') improved = c.rowcount conn.commit() conn.close() self.stats["confidence_improved"] += improved return f"Confidence: Improved {improved} observations" # === MISSION AGENT === def mission_agent(self): """Genererar QUIXZOOM-uppdrag för områden som behöver verifiering""" conn = self.get_db() c = conn.cursor() # Hitta områden med låg verifieringsgrad c.execute(''' SELECT r.id, r.name, r.county, COUNT(*) as obs_count, SUM(CASE WHEN o.verified = 1 THEN 1 ELSE 0 END) as verified_count FROM roads r JOIN observations o ON r.id = o.road_id GROUP BY r.id HAVING CAST(verified_count AS REAL) / obs_count < 0.5 ORDER BY RANDOM() LIMIT 5 ''') roads_needing_verification = c.fetchall() missions = len(roads_needing_verification) conn.close() self.stats["missions_generated"] += missions return f"Mission: Generated {missions} QUIXZOOM missions for verification" # === LEARNING AGENT === def learning_agent(self): """Analyserar mönster och förbättrar modeller""" conn = self.get_db() c = conn.cursor() # Analysera detektionsprecision per typ c.execute(''' SELECT observation_type, AVG(confidence) as avg_conf, COUNT(*) as count, SUM(CASE WHEN verified = 1 THEN 1 ELSE 0 END) as verified FROM observations GROUP BY observation_type ORDER BY avg_conf DESC ''') patterns = c.fetchall() conn.close() return f"Learning: Analyzed {len(patterns)} observation types, best: {patterns[0][0] if patterns else 'N/A'}" def run_cycle(self): """Kör en komplett agent-cykel""" results = [] # Kör alla agenter agents = [ self.crawler_agent, self.observation_agent, self.validation_agent, self.confidence_agent, self.mission_agent, self.learning_agent ] for agent in agents: try: result = agent() results.append(result) except Exception as e: results.append(f"ERROR in {agent.__name__}: {str(e)}") return results def continuous_run(self, interval_seconds=60): """Kör kontinuerligt""" print(f"=== LIFE Agent Swarm Started ===") print(f"Time: {datetime.now().isoformat()}") print(f"Database: {self.db}") print(f"Interval: {interval_seconds}s") print("=" * 50) cycle = 0 while self.running: cycle += 1 start_time = time.time() results = self.run_cycle() elapsed = time.time() - start_time print(f"\n--- Cycle {cycle} ({datetime.now().strftime('%H:%M:%S')}) ---") for r in results: print(f" {r}") print(f" Stats: {self.stats}") print(f" Time: {elapsed:.2f}s") # Vänta tills nästa cykel time.sleep(max(0, interval_seconds - elapsed)) if __name__ == "__main__": swarm = AgentSwarm() # Kör i 10 cykler för demo for i in range(10): results = swarm.run_cycle() print(f"\n--- Cycle {i+1} ---") for r in results: print(f" {r}") print(f" Stats: {swarm.stats}") time.sleep(2) print("\n=== Agent Swarm Demo Complete ===") print(f"Final stats: {swarm.stats}")