Totta kai. Koska rutiinimoottori (`routine_engine.py`) ja proxy
(`valvomo_proxy.py`) pyC6rivC$t samalla koneella ja samassa kansiossa, teemme
tC$stC$ erittC$in pragmaattisen: ohjelmoimme rutiinimoottorin lukemaan suoraan
`valvomo_state.json` -tiedostoa parin sekunnin vC$lein.
NC$in meidC$n ei tarvitse rakentaa proxyyn erillisiC$ "polling"-reittejC$, ja
botti osaa jC$C$dC$ kiltisti odottamaan (block), kunnes sinC$ painat
selaimessa "Vapauta Botille".
Luo samaan kansioon uusi tiedosto nimeltC$ `test_valvomo.py` ja kopioi tC$mC$
koodi sinne:
```python
import requests
import time
import json
def ask_valvomo_autonomously(prompt_text):
print(f"[*] LC$hetetC$C$n hC$tC$kutsu Valvomoon: '{prompt_text}'")
valvomo_url = "http://127.0.0.1:8001/v1/chat/completions"
payload = {
"model": "default",
"messages": [
{"role": "system", "content": "Olet autonominen UI-agentti. Vastaa
VAIN numerolla (esim. 42)."},
{"role": "user", "content": prompt_text}
],
"temperature": 0.1
}
# 1. Ammutaan kysely Valvomoon
try:
response = requests.post(valvomo_url, json=payload)
data = response.json()
except Exception as e:
print(f"[-] Yhteys Valvomoon epC$onnistui: {e}")
return None
prompt_id = data.get("id")
initial_answer = data["choices"][0]["message"]["content"]
# 2. Jos Valvomo on "Salli kaikki" -tilassa, vastaus tulee heti
if "[VALVOMO]" not in initial_answer:
print(f"[+] Automaattinen vastaus saatu suoraan: {initial_answer}")
return initial_answer
# 3. Kysely jC$i haaviin (Manuaalinen tila). JC$C$dC$C$n odottamaan.
print(f"[!] Kysely (ID: {prompt_id}) pysC$ytetty Valvomoon.")
print("[!] Botti pysC$htyy ja odottaa ihmisen toimenpiteitC$ osoitteessa
http://100.70.107.47:8001/ui ...")
while True:
time.sleep(2) # KysytC$C$n tilannetta 2 sekunnin vC$lein
try:
with open("valvomo_state.json", "r", encoding="utf-8") as f:
state = json.load(f)
# Tarkistetaan, onko vastaus ilmestynyt ja onko ihminen
vapauttanut sen
if prompt_id in state.get("responses", {}):
resp_data = state["responses"][prompt_id]
if resp_data.get("status") == "approved_and_released":
final_answer = resp_data.get("content")
print(f"
[+] IHMINEN VAPAUTTI VASTAUKSEN: {final_answer}")
return final_answer
except FileNotFoundError:
pass
if __name__ == "__main__":
print("=== KC$ynnistetC$C$n Autonominen Onboarding -testi ===")
# Simuloidaan tilanne, jossa botti ei lC6ydC$ Open-nappia ja kysyy apua
vastaus = ask_valvomo_autonomously("Etsi ruudulta 'Open'-nappi ja palauta
sen ID.")
print(f"
[*] Botti jatkaa suoritusta eteenpC$in tiedolla: ID {vastaus}")
print("=== Testi suoritettu onnistuneesti ===")
```
### Miten suoritat testin:
1. Varmista, ettC$ sinulla on selaimesi auki Valvomon UI-nC$kymC$ssC$
(`[http://100.70.107.47:8001/ui](http://100.70.107.47:8001/ui)`).
2. Varmista, ettC$ Valvomon reititystila on "Manuaalinen" (nC$kyy UI:ssa).
3. Aja pC$C$tteessC$:
```bash
python3 test_valvomo.py
```
**MitC$ tapahtuu:**
* Terminaali tulostaa: *"Botti pysC$htyy ja odottaa ihmisen toimenpiteitC$..."*
ja ohjelma jC$C$ jumiin ikuisesti.
* Selaimeesi ilmestyy uusi kysely **Saapuvat Kyselyt** -jonoon.
* Paina selaimesta **"ReititC$ LLM:lle"** (tC$mC$ lC$hettC$C$ sen Gemmalle).
* Sekuntia myC6hemmin Gemman vastaus ilmestyy **LLM Vastaukset** -jonoon.
* Paina selaimesta **"Vapauta Botille"**.
* KC$C$nnC$ katseesi takaisin terminaaliin: python-skripti herC$C$
vC$littC6mC$sti henkiin, tulostaa saamansa vastauksen ja jatkaa koodin
suoritusta loppuun!