# TARKISTETAAN AUTOMAATIOEHDOT (SC$C$nnC6t 2.1 - 2.3)
auto_approve = False
if mode == "all":
auto_approve = True
elif mode == "regex":
pattern = state.get("approval_regex", "")
if pattern and re.search(pattern, full_prompt_text):
auto_approve = True
if auto_approve:
# Ohitetaan saapuvien hyvC$ksyntC$ ja ajetaan suoraan LLM:C$C$n
prompt_data["status"] = "auto_approved"
state["prompts"][prompt_id] = prompt_data
save_state(state)
# Ajetaan taustalla eteenpC$in
process_prompt_to_llm(prompt_id, state)
# Palautetaan asiakkaalle heti valmis vastaus (jos halutaan
synkronisena) taikka ilmoitus
# Koska haluamme response-jonon kuratointiin, tarkistetaan onko
vastaus jo valmis:
updated_state = load_state()
resp_obj = updated_state["responses"].get(prompt_id, {})
return {
"id": prompt_id,
"object": "chat.completion",
"choices": [{
"message": {"role": "assistant", "content": resp_obj.get("cont
ent", "[AUTO-APPROVED]")},
"finish_reason": "stop"
}]
}
else:
# PysC$ytetC$C$n saapuvien jonoon (Tila 2.1: Kaikki jC$C$vC$t
hyvC$ksyttC$viksi)
state["prompts"][prompt_id] = prompt_data
save_state(state)
return {
"id": prompt_id,
"object": "chat.completion",
"choices": [{
"message": {"role": "assistant", "content": "[VALVOMO]
Prompti pysC$ytetty saapuvien hyvC$ksyntC$jonoon."},
"finish_reason": "stop"
}]
}
# ==========================================
# 2. VALVOMON HALLINTARAJAPINTA: LLM-PCCTEPISTEET (FC6C6ri 1 & 3)
# ==========================================
@app.get("/valvomo/llms")
def list_llm_endpoints():
"""1. Listaa nykyiset online-LLM:t, joille prompteja voi ohjata."""
state = load_state()
return state["llm_endpoints"]
@app.post("/valvomo/llms")
def add_llm_endpoint(data: LLMEndpointRequest):
"""3. LisC$C$ uuden online-LLM pC$C$tepisteen."""
state = load_state()
state["llm_endpoints"][data.name] = data.url
save_state(state)
return {"status": "success", "message": f"LLM '{data.name}' lisC$tty
osoitteeseen {data.url}"}
@app.delete("/valvomo/llms/{name}")
def remove_llm_endpoint(name: str):
"""3. Poistaa online-LLM pC$C$tepisteen."""
state = load_state()
if name not in state["llm_endpoints"]:
raise HTTPException(status_code=404, detail="PC$C$tepistettC$ ei
lC6ydy")
if len(state["llm_endpoints"]) <= 1:
raise HTTPException(status_code=400, detail="Et voi poistaa
viimeistC$ jC$ljellC$ olevaa LLM-pC$C$tepistettC$.")
del state["llm_endpoints"][name]
save_state(state)
return {"status": "success", "message": f"LLM '{name}' poistettu"}
# ==========================================
# 3. VALVOMON HALLINTARAJAPINTA: TILAN / SCCNTCJEN HALLINTA (FC6C6ri 2)
# ==========================================
@app.get("/valvomo/mode")
def get_valvomo_mode():
"""NC$yttC$C$ nykyisen hyvC$ksyntC$tilan (manual / all / regex)."""
state = load_state()
return {
"mode": state.get("mode", "manual"),
"approval_regex": state.get("approval_regex", "")
}
@app.put("/valvomo/mode")
def set_valvomo_mode(data: ModeRequest):
"""
2. Asettaa tilan:
- 'manual': Kaikki jC$C$vC$t hyvC$ksyttC$viksi (2.1)
- 'all': Kaikki hyvC$ksytC$C$n automaattisesti (2.2)
- 'regex': Kaikki sC$C$nnC6n matchaavat hyvC$ksytC$C$n (2.3)
"""
state = load_state()
if data.mode not in ["manual", "all", "regex"]:
raise HTTPException(status_code=400, detail="Virheellinen tila.
Sallitut: manual, all, regex")
state["mode"] = data.mode
state["approval_regex"] = data.regex_pattern
save_state(state)
return {"status": "success", "message": f"Valvomon tila pC$ivitetty
muotoon: {data.mode}"}
# ==========================================
# 4. VALVOMON HALLINTARAJAPINTA: PROMPTIT & REITITYS (FC6C6ri 4)
# ==========================================
@app.get("/valvomo/prompts/pending")
def list_pending_prompts():
"""Listaa odottavat promptit."""
state = load_state()
return {pid: p for pid, p in state["prompts"].items() if p["status"] ==
"pending_approval"}
@app.put("/valvomo/prompts/{prompt_id}/target-llm")
def change_prompt_target_llm(prompt_id: str, llm_name: str):
"""4. Muuttaa hyvC$ksynnC$ssC$ olevan kyselyn tulevaa online-llm
pC$C$tepistettC$."""
state = load_state()
if prompt_id not in state["prompts"]:
raise HTTPException(status_code=404, detail="Promptia ei lC6ydy")
if llm_name not in state["llm_endpoints"]:
raise HTTPException(status_code=400, detail=f"LLM-pC$C$tepistettC$
'{llm_name}' ei ole olemassa")
state["prompts"][prompt_id]["assigned_llm"] = llm_name
save_state(state)
return {"status": "success", "message": f"Promptin {prompt_id} kohde-LLM
vaihdettu muotoon: {llm_name}"}