Improve CEO cockpit clarity and Revenue visuals, with Hermes briefing.
Tighten overview KPIs/pipeline height, add selectable Revenue views and a resizable sidebar, and keep supporting Hermes/Wereldexport updates.
This commit is contained in:
@@ -68,6 +68,14 @@ LLM_PRESETS: dict[str, dict[str, Any]] = {
|
||||
"signup_url": "https://console.mistral.ai/",
|
||||
"hint": "EU-hosted · gratis proef tier.",
|
||||
},
|
||||
"hermes": {
|
||||
"label": "Hermes Agent (Herman)",
|
||||
"api_base_url": "http://10.4.7.10:8642/v1",
|
||||
"models": ["hermes-agent"],
|
||||
"default_model": "hermes-agent",
|
||||
"needs_key": True,
|
||||
"hint": "OpenAI-compatible API van Hermes Agent LXC — OpenCode eronder.",
|
||||
},
|
||||
"custom_openai": {
|
||||
"label": "Custom OpenAI-compatible",
|
||||
"api_base_url": "",
|
||||
@@ -124,6 +132,26 @@ def _env_openrouter_provider() -> dict[str, Any] | None:
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
def _env_hermes_provider() -> dict[str, Any] | None:
|
||||
from app.config import settings as app_settings
|
||||
|
||||
key = (app_settings.HERMES_API_KEY or "").strip()
|
||||
base = (app_settings.HERMES_API_BASE or "").strip()
|
||||
if not key or not base:
|
||||
return None
|
||||
return {
|
||||
"id": -2,
|
||||
"label": "Hermes Agent (Herman)",
|
||||
"provider_type": "hermes",
|
||||
"api_base_url": base.rstrip("/"),
|
||||
"api_key": key,
|
||||
"model": app_settings.HERMES_API_MODEL or "hermes-agent",
|
||||
"extra_config": {"temperature": 0.35, "max_tokens": 4096},
|
||||
}
|
||||
|
||||
|
||||
def list_presets() -> list[dict[str, Any]]:
|
||||
out = []
|
||||
for key, meta in LLM_PRESETS.items():
|
||||
@@ -175,8 +203,24 @@ def get_provider(provider_id: int | None = None) -> dict[str, Any] | None:
|
||||
|
||||
|
||||
def resolve_provider(provider_id: int | None = None) -> dict[str, Any]:
|
||||
from app.config import settings as app_settings
|
||||
|
||||
backend = (app_settings.HERMAN_LLM_BACKEND or "auto").lower()
|
||||
hermes = _env_hermes_provider()
|
||||
if hermes and backend in ("hermes", "auto"):
|
||||
# Prefer Hermes when configured (Ollama is often offline)
|
||||
if backend == "hermes" or provider_id is None:
|
||||
row = get_provider(provider_id) if provider_id else None
|
||||
# Explicit provider_id still wins when set
|
||||
if provider_id and row:
|
||||
pass
|
||||
else:
|
||||
return hermes
|
||||
|
||||
row = get_provider(provider_id)
|
||||
if not row:
|
||||
if hermes:
|
||||
return hermes
|
||||
env_or = _env_openrouter_provider()
|
||||
if env_or:
|
||||
return env_or
|
||||
@@ -191,6 +235,8 @@ def resolve_provider(provider_id: int | None = None) -> dict[str, Any]:
|
||||
}
|
||||
env_or = _env_openrouter_provider()
|
||||
ptype = (row.get("provider_type") or "").lower()
|
||||
if hermes and ptype == "ollama" and row.get("is_default") and not (row.get("api_key") or "").strip():
|
||||
return hermes
|
||||
if env_or and ptype == "openrouter" and not (row.get("api_key") or "").strip():
|
||||
merged = dict(row)
|
||||
merged["api_key"] = env_or["api_key"]
|
||||
@@ -198,9 +244,7 @@ def resolve_provider(provider_id: int | None = None) -> dict[str, Any]:
|
||||
merged["model"] = env_or["model"]
|
||||
return merged
|
||||
if env_or and ptype == "ollama" and row.get("is_default") and not (row.get("api_key") or "").strip():
|
||||
# Optional: prefer env OpenRouter over default Ollama when key is set
|
||||
from app.config import settings as app_settings
|
||||
if (app_settings.HERMAN_LLM_BACKEND or "").lower() in ("router", "openrouter"):
|
||||
if backend in ("router", "openrouter"):
|
||||
return env_or
|
||||
return row
|
||||
|
||||
|
||||
Reference in New Issue
Block a user