4 Commits

Author SHA1 Message Date
afc7f9bcee Versio 0.2.4
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 18:52:21 +03:00
5d2027b2ca Native-node: automaattinen Ollama-haistelu käynnistyksessä
Jos OLLAMA_URL ei ole asetettu, kokeillaan järjestyksessä:
1. localhost:11434 (paikallinen Ollama)
2. 127.0.0.1:11434
3. ollama:11434 (Docker-verkko)
4. host.docker.internal:11434 (Docker-kontti → isäntä)

Ensimmäinen joka vastaa /api/version-kutsuun valitaan.
Timeout 2s per kokeilu. Jos OLLAMA_URL on asetettu, sitä käytetään suoraan.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 17:41:44 +03:00
8a4d515eed Client-compose: Ollama lisätty jokaiseen profiiliin (nvidia/amd/cpu)
Ollama-palvelu puuttui client-composesta — native-node yritti yhdistää
ollamaan jota ei ollut. Nyt jokaisessa profiilissa on oma Ollama
(nvidia: latest+GPU, amd: rocm+/dev/kfd, cpu: latest) network alias
'ollama' jotta native-node löytää sen.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 17:40:33 +03:00
987a370a05 Docker: Cargo.lock valinnainen, Ollama AMD ROCm -tuella
- Dockerfile.native-node: Cargo.lock kopioidaan glob-patternilla (ei kaadu
  jos puuttuu, esim. .gitignore poistaa sen)
- docker-compose: Ollama vaihdettu ollama/ollama:rocm -imageen AMD GPU:lle,
  /dev/kfd + /dev/dri laitemappaukset, poistettu nvidia deploy.resources

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 17:33:27 +03:00
7 changed files with 124 additions and 32 deletions

View File

@@ -5,7 +5,8 @@ RUN apt-get update && apt-get install -y \
&& rm -rf /var/lib/apt/lists/* && rm -rf /var/lib/apt/lists/*
WORKDIR /app WORKDIR /app
COPY Cargo.toml Cargo.lock ./ COPY Cargo.toml ./
COPY Cargo.loc[k] ./
COPY hub/Cargo.toml hub/Cargo.toml COPY hub/Cargo.toml hub/Cargo.toml
COPY node/Cargo.toml node/Cargo.toml COPY node/Cargo.toml node/Cargo.toml
COPY native-node/Cargo.toml native-node/Cargo.toml COPY native-node/Cargo.toml native-node/Cargo.toml

View File

@@ -1,13 +1,12 @@
services: services:
# NVIDIA GPU -solmu # Ollama NVIDIA GPU:lla
native-node-nvidia: ollama-nvidia:
build: image: ollama/ollama:latest
context: . container_name: kipina-ollama
dockerfile: Dockerfile.native-node ports:
container_name: kipina-node-nvidia - "11434:11434"
environment: volumes:
- HUB_URL=wss://kipina.studio/ws - ollama-models:/root/.ollama
- ALLOCATED_GB=4
restart: unless-stopped restart: unless-stopped
deploy: deploy:
resources: resources:
@@ -16,6 +15,65 @@ services:
- driver: nvidia - driver: nvidia
count: all count: all
capabilities: [gpu] capabilities: [gpu]
networks:
default:
aliases:
- ollama
profiles:
- nvidia
# Ollama AMD ROCm GPU:lla
ollama-amd:
image: ollama/ollama:rocm
container_name: kipina-ollama
ports:
- "11434:11434"
volumes:
- ollama-models:/root/.ollama
restart: unless-stopped
devices:
- /dev/kfd:/dev/kfd
- /dev/dri:/dev/dri
group_add:
- video
- render
networks:
default:
aliases:
- ollama
profiles:
- amd
# Ollama CPU:lla
ollama-cpu:
image: ollama/ollama:latest
container_name: kipina-ollama
ports:
- "11434:11434"
volumes:
- ollama-models:/root/.ollama
restart: unless-stopped
networks:
default:
aliases:
- ollama
profiles:
- cpu
# NVIDIA GPU -solmu
native-node-nvidia:
build:
context: .
dockerfile: Dockerfile.native-node
container_name: kipina-node-nvidia
environment:
- HUB_URL=wss://kipina.studio/ws
- OLLAMA_URL=http://ollama:11434
- OLLAMA_MODEL=qwen2.5-coder:7b
- ALLOCATED_GB=4
restart: unless-stopped
depends_on:
- ollama-nvidia
profiles: profiles:
- nvidia - nvidia
@@ -27,14 +85,12 @@ services:
container_name: kipina-node-amd container_name: kipina-node-amd
environment: environment:
- HUB_URL=wss://kipina.studio/ws - HUB_URL=wss://kipina.studio/ws
- OLLAMA_URL=http://ollama:11434
- OLLAMA_MODEL=qwen2.5-coder:7b
- ALLOCATED_GB=4 - ALLOCATED_GB=4
restart: unless-stopped restart: unless-stopped
devices: depends_on:
- /dev/kfd:/dev/kfd - ollama-amd
- /dev/dri:/dev/dri
group_add:
- video
- render
profiles: profiles:
- amd - amd
@@ -46,7 +102,14 @@ services:
container_name: kipina-node-cpu container_name: kipina-node-cpu
environment: environment:
- HUB_URL=wss://kipina.studio/ws - HUB_URL=wss://kipina.studio/ws
- OLLAMA_URL=http://ollama:11434
- OLLAMA_MODEL=qwen2.5-coder:7b
- ALLOCATED_GB=2 - ALLOCATED_GB=2
restart: unless-stopped restart: unless-stopped
depends_on:
- ollama-cpu
profiles: profiles:
- cpu - cpu
volumes:
ollama-models:

View File

@@ -11,21 +11,19 @@ services:
# Käännetään aina käynnistyksen yhteydessä varmuuden vuoksi Wasm uusimmista koodeista, ja päälle pyöräytetään Hub! # Käännetään aina käynnistyksen yhteydessä varmuuden vuoksi Wasm uusimmista koodeista, ja päälle pyöräytetään Hub!
command: bash -c "cd node && wasm-pack build --release --target web --out-dir ../static/pkg && cd ../hub && cargo run" command: bash -c "cd node && wasm-pack build --release --target web --out-dir ../static/pkg && cd ../hub && cargo run"
# Ollama — LLM-inferenssi GPU:lla (NVIDIA/AMD/Apple) # Ollama — LLM-inferenssi
# NVIDIA: vaihda image → ollama/ollama:latest ja lisää deploy.resources (ks. README)
# CPU: vaihda image → ollama/ollama:latest ja poista devices
ollama: ollama:
image: ollama/ollama:latest image: ollama/ollama:rocm
container_name: kipina_ollama container_name: kipina_ollama
ports: ports:
- "11434:11434" - "11434:11434"
volumes: volumes:
- ollama-models:/root/.ollama - ollama-models:/root/.ollama
deploy: devices:
resources: - /dev/kfd
reservations: - /dev/dri
devices:
- driver: nvidia
count: all
capabilities: [gpu]
profiles: profiles:
- native - native

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "hub" name = "hub"
version = "0.2.3" version = "0.2.4"
edition = "2024" edition = "2024"
[dependencies] [dependencies]

View File

@@ -8,17 +8,47 @@ pub struct LlmEngine {
} }
impl LlmEngine { impl LlmEngine {
pub fn load() -> Result<Self, String> { pub async fn load() -> Result<Self, String> {
let ollama_url = std::env::var("OLLAMA_URL").unwrap_or_else(|_| "http://localhost:11434".to_string());
let model = std::env::var("OLLAMA_MODEL").unwrap_or_else(|_| "qwen2.5-coder:7b".to_string()); let model = std::env::var("OLLAMA_MODEL").unwrap_or_else(|_| "qwen2.5-coder:7b".to_string());
tracing::info!("Ollama backend: {} | malli: {}", ollama_url, model);
let client = reqwest::Client::builder() let client = reqwest::Client::builder()
.timeout(std::time::Duration::from_secs(600)) .timeout(std::time::Duration::from_secs(600))
.connect_timeout(std::time::Duration::from_secs(3))
.build() .build()
.map_err(|e| format!("HTTP client: {}", e))?; .map_err(|e| format!("HTTP client: {}", e))?;
// Jos OLLAMA_URL on asetettu, käytetään sitä suoraan
let ollama_url = if let Ok(url) = std::env::var("OLLAMA_URL") {
tracing::info!("Ollama backend (env): {}", url);
url
} else {
// Haistellaan Ollamaa tunnetuista osoitteista
let candidates = [
"http://localhost:11434",
"http://127.0.0.1:11434",
"http://ollama:11434",
"http://host.docker.internal:11434",
];
let mut found = None;
for url in &candidates {
let probe = reqwest::Client::builder()
.connect_timeout(std::time::Duration::from_secs(2))
.build().unwrap_or(client.clone());
if let Ok(resp) = probe.get(format!("{}/api/version", url)).send().await {
if resp.status().is_success() {
tracing::info!("Ollama löytyi osoitteesta: {}", url);
found = Some(url.to_string());
break;
}
}
}
found.unwrap_or_else(|| {
tracing::warn!("Ollamaa ei löytynyt — käytetään oletusta http://localhost:11434");
"http://localhost:11434".to_string()
})
};
tracing::info!("Ollama backend: {} | malli: {}", ollama_url, model);
Ok(LlmEngine { ollama_url, model: RefCell::new(model), client }) Ok(LlmEngine { ollama_url, model: RefCell::new(model), client })
} }

View File

@@ -287,7 +287,7 @@ async fn main() {
// Ollama-backend // Ollama-backend
tracing::info!("Alustetaan Ollama-yhteyttä..."); tracing::info!("Alustetaan Ollama-yhteyttä...");
let llm = match inference::LlmEngine::load() { let llm = match inference::LlmEngine::load().await {
Ok(engine) => { Ok(engine) => {
// Varmistetaan malli (ollama pull) — odotetaan kunnes valmis // Varmistetaan malli (ollama pull) — odotetaan kunnes valmis
match engine.ensure_model().await { match engine.ensure_model().await {

View File

@@ -2943,7 +2943,7 @@ ${staticHtml}
${filesHtml} ${filesHtml}
<hr style="border-color:#30363d;margin:24px 0"> <hr style="border-color:#30363d;margin:24px 0">
<p style="color:#8b949e;font-size:12px">Generoitu Kipinä Agentic Playground v0.2.3 — <a href="https://kipina.studio">kipina.studio</a></p> <p style="color:#8b949e;font-size:12px">Generoitu Kipinä Agentic Playground v0.2.4 — <a href="https://kipina.studio">kipina.studio</a></p>
</body></html>`; </body></html>`;
} }