Initial commit
This commit is contained in:
parent
20e8586609
commit
b7d72fad81
109
ix_scout.py
Normal file
109
ix_scout.py
Normal file
@ -0,0 +1,109 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
IX Scout — Global Hardware Node Registry
|
||||
Part of the Inference-X Ecosystem
|
||||
# SALKA ELMADANI | inference-x.com | BSL-1.1
|
||||
Copyright (C) 2024-2026 Salka Elmadani. BSL-1.1.
|
||||
https://git.inference-x.com/inference-x-community/ix-scout
|
||||
|
||||
Real-time map of every IX node on Earth.
|
||||
Anonymous. Voluntary. Community-powered.
|
||||
"""
|
||||
from fastapi import FastAPI, Request
|
||||
from fastapi.responses import JSONResponse, HTMLResponse
|
||||
from fastapi.middleware.cors import CORSMiddleware
|
||||
import sqlite3, json, time, os, hashlib
|
||||
|
||||
app = FastAPI(title="IX Scout", version="1.0.0",
|
||||
description="Real-time global map of every Inference-X node.")
|
||||
app.add_middleware(CORSMiddleware, allow_origins=["*"],
|
||||
allow_methods=["*"], allow_headers=["*"])
|
||||
|
||||
DB = os.environ.get("SCOUT_DB", "./scout.db")
|
||||
|
||||
def db():
|
||||
conn = sqlite3.connect(DB)
|
||||
conn.row_factory = sqlite3.Row
|
||||
return conn
|
||||
|
||||
def init_db():
|
||||
with db() as c:
|
||||
c.execute("""CREATE TABLE IF NOT EXISTS nodes (
|
||||
id TEXT PRIMARY KEY,
|
||||
backend TEXT NOT NULL,
|
||||
model TEXT,
|
||||
tokens_per_sec REAL DEFAULT 0,
|
||||
ram_gb REAL DEFAULT 0,
|
||||
country TEXT DEFAULT '',
|
||||
version TEXT DEFAULT '1.0',
|
||||
reported_at INTEGER,
|
||||
load_pct REAL DEFAULT 0
|
||||
)""")
|
||||
c.commit()
|
||||
|
||||
@app.on_event("startup")
|
||||
async def startup(): init_db()
|
||||
|
||||
@app.post("/report")
|
||||
async def report_node(request: Request):
|
||||
"""IX Engine nodes report telemetry here (opt-in via --scout flag)."""
|
||||
try:
|
||||
data = await request.json()
|
||||
node_id = hashlib.sha256(
|
||||
f"{data.get('backend','')}{data.get('ram_gb',0)}".encode()
|
||||
).hexdigest()[:16]
|
||||
with db() as c:
|
||||
c.execute("""INSERT OR REPLACE INTO nodes
|
||||
(id,backend,model,tokens_per_sec,ram_gb,country,version,reported_at,load_pct)
|
||||
VALUES (?,?,?,?,?,?,?,?,?)""",
|
||||
(node_id, data.get("backend","cpu"), data.get("model",""),
|
||||
float(data.get("tokens_per_sec",0)), float(data.get("ram_gb",0)),
|
||||
data.get("country",""), data.get("version","1.0"),
|
||||
int(time.time()), float(data.get("load_pct",0))))
|
||||
c.commit()
|
||||
return {"status":"ok","node_id":node_id}
|
||||
except Exception as e:
|
||||
return JSONResponse({"error":str(e)}, status_code=400)
|
||||
|
||||
@app.get("/stats")
|
||||
async def stats():
|
||||
"""Aggregated network stats — last 24 hours."""
|
||||
cutoff = int(time.time()) - 86400
|
||||
with db() as c:
|
||||
backends = c.execute("""
|
||||
SELECT backend, COUNT(*) as nodes,
|
||||
AVG(tokens_per_sec) as avg_tps,
|
||||
AVG(ram_gb) as avg_ram,
|
||||
AVG(load_pct) as avg_load
|
||||
FROM nodes WHERE reported_at > ?
|
||||
GROUP BY backend ORDER BY nodes DESC
|
||||
""", (cutoff,)).fetchall()
|
||||
total = c.execute("SELECT COUNT(*) as t FROM nodes WHERE reported_at > ?",
|
||||
(cutoff,)).fetchone()
|
||||
return {
|
||||
"total_nodes": total["t"] if total else 0,
|
||||
"window": "24h",
|
||||
"backends": [dict(b) for b in backends]
|
||||
}
|
||||
|
||||
@app.get("/nodes")
|
||||
async def list_nodes(limit: int = 100):
|
||||
"""List recent nodes (anonymized)."""
|
||||
cutoff = int(time.time()) - 3600
|
||||
with db() as c:
|
||||
rows = c.execute("""
|
||||
SELECT backend, model, tokens_per_sec, ram_gb, country, version
|
||||
FROM nodes WHERE reported_at > ? ORDER BY reported_at DESC LIMIT ?
|
||||
""", (cutoff, limit)).fetchall()
|
||||
return {"nodes": [dict(r) for r in rows], "count": len(rows)}
|
||||
|
||||
@app.get("/health")
|
||||
async def health():
|
||||
return {"status":"ok","service":"IX Scout","author":"Salka Elmadani","version":"1.0.0"}
|
||||
|
||||
if __name__ == "__main__":
|
||||
import uvicorn
|
||||
print("IX Scout — Global Hardware Node Registry")
|
||||
print("Anonymous. Voluntary. Real.")
|
||||
print("Built in Morocco for the world.")
|
||||
uvicorn.run(app, host="0.0.0.0", port=int(os.environ.get("PORT","7936")))
|
||||
Loading…
Reference in New Issue
Block a user