diff --git a/network-poc/deploy.sh b/network-poc/deploy.sh new file mode 100755 index 0000000..63900fb --- /dev/null +++ b/network-poc/deploy.sh @@ -0,0 +1,26 @@ +#!/bin/bash +set -e + +SERVER="ubuntu@86.50.252.98" +REMOTE_DIR="~/code/agentic-studio/network-poc" +SSH_OPTS="-o StrictHostKeyChecking=no" + +echo "=== Kipinä Studio Deploy ===" + +# 1. Rakennetaan Docker-image lokaalisti +echo "[1/4] Rakennetaan image lokaalisti..." +docker build -f Dockerfile.prod -t kipina-agentic:latest . + +# 2. Tallennetaan ja siirretään +echo "[2/4] Siirretään image palvelimelle..." +docker save kipina-agentic:latest | gzip | ssh $SSH_OPTS $SERVER "gunzip | docker load" + +# 3. Päivitetään konfiguraatiot +echo "[3/4] Päivitetään konfiguraatiot..." +scp $SSH_OPTS docker-compose.prod.yml Caddyfile.prod $SERVER:$REMOTE_DIR/ + +# 4. Käynnistetään uudelleen +echo "[4/4] Käynnistetään palvelut..." +ssh $SSH_OPTS $SERVER "cd $REMOTE_DIR && docker compose -f docker-compose.prod.yml up -d" + +echo "=== Valmis! https://kipina.studio ===" diff --git a/network-poc/docker-compose.prod.yml b/network-poc/docker-compose.prod.yml index 7b320c4..207e74d 100644 --- a/network-poc/docker-compose.prod.yml +++ b/network-poc/docker-compose.prod.yml @@ -14,9 +14,7 @@ services: - hub hub: - build: - context: . - dockerfile: Dockerfile.prod + image: kipina-agentic:latest container_name: kipina-agentic-hub restart: unless-stopped environment: diff --git a/network-poc/hub/Cargo.toml b/network-poc/hub/Cargo.toml index 182d6e8..5820065 100644 --- a/network-poc/hub/Cargo.toml +++ b/network-poc/hub/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "hub" -version = "0.1.0" +version = "0.2.0" edition = "2021" [dependencies] diff --git a/network-poc/hub/src/db.rs b/network-poc/hub/src/db.rs index f16f14e..3af9538 100644 --- a/network-poc/hub/src/db.rs +++ b/network-poc/hub/src/db.rs @@ -245,7 +245,7 @@ impl NodeDb { en: &serde_json::Value, fi: &serde_json::Value, overhead: f64, - duration_ms: u64, + duration_ms: f64, ) { let conn = self.conn.lock().unwrap(); let now = chrono::Utc::now().to_rfc3339(); @@ -265,7 +265,7 @@ impl NodeDb { en.get("chars_per_token").and_then(|v| v.as_f64()), fi.get("chars_per_token").and_then(|v| v.as_f64()), overhead, - duration_ms as i64, + duration_ms, ], ); } diff --git a/network-poc/hub/src/main.rs b/network-poc/hub/src/main.rs index e11170d..e6da32d 100644 --- a/network-poc/hub/src/main.rs +++ b/network-poc/hub/src/main.rs @@ -74,7 +74,7 @@ tr:hover td { background:#1c2333; }

Kipina Admin

-

Node-sessiot ja tokenisointivertailut

+

Node-sessiot ja tokenisointivertailut · -

@@ -140,6 +140,9 @@ async function load() { const sessions = await sessionsRes.json(); const pairs = await pairsRes.json(); + // Versio + if (stats.version) document.getElementById('admin-version').textContent = 'v' + stats.version; + // Stats document.getElementById('stats').innerHTML = [ {v: stats.total_sessions, l: 'Sessioita'}, @@ -194,7 +197,7 @@ async function load() { } load(); -setInterval(load, 10000); +setInterval(load, 1000); "##; @@ -275,7 +278,7 @@ async fn main() { .with_state(state); let addr = SocketAddr::from(([0, 0, 0, 0], 3000)); - tracing::debug!("Kipinä Agent Hub käynnistyy osoitteessa http://localhost:3000"); + tracing::info!("Kipinä Agent Hub v{} käynnistyy osoitteessa http://localhost:3000", env!("CARGO_PKG_VERSION")); let listener = tokio::net::TcpListener::bind(&addr).await.unwrap(); axum::serve(listener, app.into_make_service_with_connect_info::()).await.unwrap(); @@ -296,7 +299,9 @@ async fn api_pairs( async fn api_stats( axum::extract::State(state): axum::extract::State>, ) -> impl IntoResponse { - axum::Json(state.db.get_stats()) + let mut stats = state.db.get_stats(); + stats.as_object_mut().unwrap().insert("version".to_string(), serde_json::json!(env!("CARGO_PKG_VERSION"))); + axum::Json(stats) } async fn admin_page() -> impl IntoResponse { @@ -358,6 +363,7 @@ async fn broadcast_stats(state: &Arc) { let completed = *state.total_tasks.lock().unwrap(); let stats_msg = serde_json::json!({ "type": "stats", + "version": env!("CARGO_PKG_VERSION"), "nodes": total_nodes, "vram_gb": total_vram, "tasks": completed @@ -553,7 +559,7 @@ async fn handle_socket(socket: WebSocket, state: Arc, ip: IpAddr) { let en = obj.get("en").unwrap_or(&empty); let fi = obj.get("fi").unwrap_or(&empty); let overhead = obj.get("overhead_pct").and_then(|v| v.as_f64()).unwrap_or(0.0); - let duration = obj.get("duration_ms").and_then(|v| v.as_u64()).unwrap_or(0); + let duration = obj.get("duration_ms").and_then(|v| v.as_f64()).unwrap_or(0.0); let en_text = en.get("text").and_then(|v| v.as_str()).unwrap_or(""); let en_tokens = en.get("token_count").and_then(|v| v.as_u64()).unwrap_or(0); @@ -568,7 +574,7 @@ async fn handle_socket(socket: WebSocket, state: Arc, ip: IpAddr) { let overhead_color = if overhead > 10.0 { "\x1b[31m" } else if overhead < -10.0 { "\x1b[32m" } else { "\x1b[33m" }; println!(); - println!("\x1b[36m━━━ Solmu {} ━━━ {}ms ━━━\x1b[0m", node_id, duration); + println!("\x1b[36m━━━ Solmu {} ━━━ {:.2}ms ━━━\x1b[0m", node_id, duration); println!(" \x1b[34mEN\x1b[0m \"{}\"", en_text); println!(" {} merkkiä → \x1b[35m{} tokenia\x1b[0m | \x1b[32m{:.2} merkkiä/token\x1b[0m", en_chars, en_tokens, en_cpt); println!(" \x1b[33mFI\x1b[0m \"{}\"", fi_text); diff --git a/network-poc/node/Cargo.toml b/network-poc/node/Cargo.toml index c52ea08..1c6d81f 100644 --- a/network-poc/node/Cargo.toml +++ b/network-poc/node/Cargo.toml @@ -15,6 +15,7 @@ web-sys = { version = "0.3.68", features = [ "HtmlElement", "WebSocket", "MessageEvent", + "Performance", "console", ] } serde = { version = "1.0", features = ["derive"] } diff --git a/network-poc/node/src/lib.rs b/network-poc/node/src/lib.rs index a138e53..3542d13 100644 --- a/network-poc/node/src/lib.rs +++ b/network-poc/node/src/lib.rs @@ -117,10 +117,11 @@ async fn run_pair_comparison(en_text: String, fi_text: String, ws: Rc

Kipinä Agent Dashboard

-

Hajautettu WebGPU Laskentaverkko

+

Hajautettu WebGPU Laskentaverkko · -

@@ -215,16 +267,51 @@
+