OSVauco/docs/ml-integration.md

124 lines
3.9 KiB
Markdown

# ML-integrasjon i OSVauco
**Fase:** ML-1 implementert | ML-2 og ML-3 planlagt
**Sist oppdatert:** 2026-05-26
---
## Hvorfor ML i OPAX?
OPAX er et multi-agent system. ML-laget gjør agentene sterkere på tre måter:
1. **Parallell kjøring** (ML-1): Dask DAG lar agenter kjøre samtidig i stedet for sekvensielt.
2. **Adaptiv intelligens** (ML-2): Agentene lærer fra faktisk bruk — heavy-mode aktiveres basert på historikk, ikke hardkodede regler.
3. **Strategisk innsikt** (ML-3): XGBoost feature importance avslører hvilke agenter og signaler som faktisk driver vellykkede utfall.
---
## Fase ML-1: Grunnlag (implementert)
### Arkitektur
```
main.py → build_agent_dag([agent_a, agent_b], payload)
Dask task graph
┌──────────┴──────────┐
▼ ▼
run_agent_task(a) run_agent_task(b) ← parallelt
│ │
└──────────┬──────────┘
execute_dag(tasks, scheduler="threads")
[result_a, result_b] → AgentStateStore.push()
telemetry.log_agent_call()
```
### Koble ML-laget inn i main.py
```python
# Eksempel: erstatt sekvensielle kall med parallell DAG
from ml import build_agent_dag, execute_dag, get_store, log_agent_call
import time
@app.post("/run")
def run_agent(req: RunRequest):
store = get_store()
payload = {"message": req.message, "user_id": req.user_id,
"session_id": req.session_id, "mode": req.mode}
# Velg agenter basert på mode
if req.mode == "heavy":
agent_fns = [billing_agent_heavy, rag_agent, multi_agent]
else:
agent_fns = [billing_agent, rag_agent]
start = time.monotonic()
tasks = build_agent_dag(agent_fns, payload)
results = execute_dag(tasks, scheduler="threads")
total_dur = time.monotonic() - start
# Push resultater til state store
for r in results:
if r["success"]:
store.push(r["agent"], "last_result", r["result"])
store.push(r["agent"], "last_duration_s", r["duration_s"])
# Logg DAG-kjøring
from ml.telemetry import log_dag_execution
log_dag_execution(dag_id=req.session_id, agent_results=results,
total_duration_s=total_dur)
# Returner kombinert svar
return {"response": [r["result"] for r in results if r["success"]]}
```
---
## Fase ML-2: Adaptiv intelligens (planlagt)
| Komponent | Fil | Repo |
|---|---|---|
| Inkrementell feedback-loop | `ml/feedback_loop.py` | `vauco-gemini-tui-bridge` |
| ASHA hyperparametertuning | `ml/hypertuner.py` | `vauco-bootstrap` |
| Heavy-mode predictor | `ml/heavy_predictor.py` | `OSVauco` |
**Krav:** `dask-ml>=2024.4.0`, `ray[tune]>=2.10.0` (vauco-bootstrap only)
---
## Fase ML-3: Strategisk innsikt (planlagt)
| Komponent | Fil | Repo |
|---|---|---|
| XGBoost feature importance | `ml/agent_importance.py` | `OSVauco` |
| Population-Based Training | `experiments/pbt.py` | `deep-dream` |
**Krav:** `xgboost>=2.0.0` (legg til requirements.txt i Fase ML-3)
---
## Telemetri-ruting
| Miljø | `TELEMETRY_DIR` | Arkivering |
|---|---|---|
| Lokal dev | `/tmp/vauco_telemetry/` | Manuell |
| Cloud Run | `/tmp/vauco_telemetry/` | `10-cost-guard.sh` cron → GCS |
| Prod skala | `gs://propane-will-491900-m5-telemetry/` | Auto via GCS sink |
---
## Cross-repo referanser
| Repo | ML-relatert fil | Fase |
|---|---|---|
| `OSVauco` | `ml/`, `AGENTS.md`, `docs/ml-integration.md` | ML-1 |
| `vauco-gemini-tui-bridge` | `ml/feedback_loop.py` (planlagt) | ML-2 |
| `vauco-bootstrap` | `ml/hypertuner.py` (planlagt) | ML-2 |
| `vauco-os` | Konsumerer beste konfig fra state store | ML-2 |
| `deep-dream` | `experiments/pbt.py` (planlagt) | ML-3 |