Specs stay at repo root (cross-VM). Move deploy and code into logical projects with README per domain, updated manifest.yaml, and symlinks at legacy paths for VM122 backward compatibility.
38 lines
1.6 KiB
Python
38 lines
1.6 KiB
Python
"""Ollama VM123 + fallback — Spec 029 T1."""
|
|
from __future__ import annotations
|
|
import os
|
|
import httpx
|
|
|
|
OLLAMA_BASE_URL = os.getenv("OLLAMA_BASE_URL", "http://10.10.10.123:11434").rstrip("/")
|
|
AGENTIC_LLM_MODEL = os.getenv("AGENTIC_LLM_MODEL", "qwen2.5:7b-instruct")
|
|
AGENTIC_LLM_ENABLED = os.getenv("AGENTIC_LLM_ENABLED", "false").lower() in ("1", "true", "yes")
|
|
|
|
def ollama_available() -> bool:
|
|
try:
|
|
with httpx.Client(timeout=3.0) as c:
|
|
return c.get(f"{OLLAMA_BASE_URL}/api/tags").status_code == 200
|
|
except Exception:
|
|
return False
|
|
|
|
def advise_human_action(*, finding_title: str, finding_detail: str, kb_snippets: list[str] | None = None) -> tuple[str, str]:
|
|
prompt = (
|
|
"Advisor Agentic Ops Ligbox. Português BR, máx 6 frases. O que fazer AGORA?\n"
|
|
f"Problema: {finding_title}\nDetalhe: {finding_detail}\nKB: {'---'.join(kb_snippets or [])[:2500] or 'N/A'}"
|
|
)
|
|
if not AGENTIC_LLM_ENABLED:
|
|
return (f"Investigar manualmente: {finding_title}", "t0")
|
|
if ollama_available():
|
|
try:
|
|
with httpx.Client(timeout=90.0) as c:
|
|
r = c.post(f"{OLLAMA_BASE_URL}/api/chat", json={
|
|
"model": AGENTIC_LLM_MODEL,
|
|
"messages": [{"role": "user", "content": prompt}],
|
|
"stream": False,
|
|
})
|
|
if r.status_code == 200:
|
|
txt = (r.json().get("message") or {}).get("content", "").strip()
|
|
if txt:
|
|
return txt, AGENTIC_LLM_MODEL
|
|
except Exception:
|
|
pass
|
|
return (f"Rever logs e specs para: {finding_title}", "t0-fallback")
|