Olet 100 % oikeassa. Osuit juuri visuaalisen AI-agentin ytimeen. PelkkC$
teksti on tC$ysin hyC6dytC6n, jos LLM ei nC$e ruutua, jolta sen pitC$isi
asioita etsiC$.
Jotta Gemma (tai Gemini) nC$kee Set-of-Mark -kuvan, kuva tC$ytyy pakata
**Base64-muotoon** ja lC$hettC$C$ osana API-pyynnC6n `content`-kenttC$C$.
TC$mC$ on OpenAI:n rajapintastandardi visuaalisille malleille, ja samaa
standardia kC$yttC$C$ myC6s Ollama/vLLM.
TehdC$C$n kaksi asiaa: pC$ivitetC$C$n testimuuttuja lC$hettC$mC$C$n kuva, ja
pC$ivitetC$C$n Valvomon kC$yttC6liittymC$ nC$yttC$mC$C$n tuo kuva sinulle
ruudulla.
### 1. PC$ivitetty `test_valvomo.py` (Kuvan lC$hetys)
TC$mC$ koodi lukee kuvatiedoston, koodaa sen Base64-tekstiksi ja liittC$C$ sen
API-pyyntC6C6n oikeassa formaatissa. (Varmista, ettC$ sinulla on jokin kuva,
esim. aiempi `annotated_ui.png` tai `115477.jpg` samassa tai alikansiossa, ja
muuta `IMAGE_PATH` sen mukaiseksi).
```python
import requests
import time
import json
import base64
import os
def encode_image(image_path):
"""Muuttaa paikallisen kuvan Base64-merkkijonoksi."""
with open(image_path, "rb") as image_file:
return base64.b64encode(image_file.read()).decode('utf-8')
def ask_valvomo_autonomously(prompt_text, image_path):
print(f"[*] LC$hetetC$C$n hC$tC$kutsu Valvomoon: '{prompt_text}' (Kuva:
{image_path})")
if not os.path.exists(image_path):
print(f"[-] VIRHE: Kuvaa {image_path} ei lC6ydy!")
return None
base64_image = encode_image(image_path)
valvomo_url = "http://127.0.0.1:8001/v1/chat/completions"
# Visuaalinen payload (OpenAI Vision -standardi)
payload = {
"model": "default",
"messages": [
{
"role": "system",
"content": "Olet autonominen UI-agentti. Vastaa VAIN numerolla
(esim. 42)."
},
{
"role": "user",
"content": [
{
"type": "text",
"text": prompt_text
},
{
"type": "image_url",
"image_url": {
"url": f"data:image/png;base64,{base64_image}"
}
}
]
}
],
"temperature": 0.1
}
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"]
if "[VALVOMO]" not in initial_answer:
print(f"[+] Automaattinen vastaus saatu: {initial_answer}")
return initial_answer
print(f"[!] Kysely (ID: {prompt_id}) pysC$ytetty Valvomoon.")
print("[!] Botti odottaa hyvC$ksyntC$C$ osoitteessa http://100.70.107.47:80
01/ui ...")
while True:
time.sleep(2)
try:
with open("valvomo_state.json", "r", encoding="utf-8") as f:
state = json.load(f)
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 ===")
# VAIHDA TCHCN JOKIN OIKEA KUVA KONEELTASI! (esim. liitevalikko tai
ruutukaappaus)
IMAGE_PATH = "ui_calibration_pack/annotated_ui.png"
vastaus = ask_valvomo_autonomously("Etsi ruudulta 'Open' / 'Avaa' -nappi
ja palauta sen ID.", IMAGE_PATH)
if vastaus:
print(f"
[*] Botti jatkaa suoritusta eteenpC$in tiedolla: ID {vastaus}")
```