{% extends "base.html" %} {% block content %} {% include "aes_nav.html" %} {% if !configured %}

{{ error }}

{% else %} {% if !error.is_empty() %}

{{ error }}

{% endif %} {% if !note.is_empty() %}

{{ note }}

{% endif %} {% if section == "dashboard" %}
{% for c in health %}
{{ c.label }}
{{ c.sub }}
{{ c.value }}
{% endfor %}
{% for k in kpis %}
{{ k.label }}
{{ k.value }}
{{ k.sub }}
{% endfor %}

Projekte

{% if projects.is_empty() %}

Keine Projekte.

{% else %} {% for p in projects %}{% endfor %}
ProjektLetzter Lauf
{{ p.name }}{{ p.status }}
{% endif %}

Live Activity

{% if activity.is_empty() %}

Keine Aktivitaet.

{% else %}
{% for a in activity %}
{{ a.text }}{{ a.when }}
{% endfor %}
{% endif %}

Infrastruktur

{{ bal_summary }}

{% if backends.is_empty() %}

Keine Backends gemeldet.

{% endif %} {% for b in backends %}
{{ b.url }}
CPU {{ b.cpu }}% · RAM {{ b.ram }}% · VRAM {{ b.vram }}% · {{ b.latency }}ms
{{ b.badge }}
{% endfor %}
{% else if section == "projekte" %}

Projekte

{% if projects.is_empty() %}

Noch keine Projekte.

{% else %} {% for p in projects %}{% endfor %}
Projekt
{{ p.name }}Oeffnen →
{% endif %}

Projekt anlegen

{% else if section == "forge" %}

Forge

⚙ Einstellungen

Git-Server der AES-Suite. Zugriff erfolgt serverseitig mit dem AES-Token — kein eigenes Token noetig.

{% if repos.is_empty() %}

Keine Repositories.

{% else %} {% for r in repos %}{% endfor %}
RepositoryBranchSichtbarkeit
{{ r.label }} {{ r.value }} {{ r.sub }}
{% endif %}

Repository anlegen

{% else if section == "runner" %}

Runner

⚙ Einstellungen
{% if !runner_available %}

Runner-Status nicht verfuegbar. {{ runner_hint }}

{% else %}
Version
v{{ runner_version }}
Poll-Intervall
{{ runner_poll }}s
Zuletzt aktiv
{{ runner_updated }}
Forge/Gitea: {{ runner_instance }} · Self-Update-Repo: {{ runner_update_repo }}

Beobachtete Repositories

{% if runner_watched.is_empty() %}

Keine.

{% else %}
{% for w in runner_watched %}{{ w }}{% endfor %}
{% endif %}

Letzte CI-Laeufe

{% if runner_runs.is_empty() %}

Noch keine Laeufe aufgezeichnet (erscheinen beim naechsten Commit auf einem beobachteten Repo).

{% else %} {% for r in runner_runs %}{% endfor %}
RepositoryBranchCommitErgebnisBeendet
{{ r.repo }}{{ r.branch }}{{ r.sha }}{{ r.ok_label }}{{ r.finished_at }}
{% endif %} {% endif %} {% else if section == "agenten" %}

Agenten

Agenten sind llm-agent-Instanzen (je LLM-Host, mit lokalem Ollama), die sich beim Balancer anmelden und Inferenz + Host-Metriken liefern.

{{ bal_summary }}

{% if backends.is_empty() %}

Kein Agent online. Starte einen Agenten auf einem GPU/CPU-Host: aes-suite agent --token <AGENT_TOKEN> (Ollama vorausgesetzt) und trage seine URL im Balancer (OLLAMA_HOSTS) ein.

{% else %} {% for b in backends %}{% endfor %}
HostAgentBackendCPURAMVRAMLatenz
{{ b.url }}{{ b.agent }}{{ b.badge }}{{ b.cpu }}%{{ b.ram }}%{{ b.vram }}%{{ b.latency }}ms
{% endif %} {% else if section == "llm" %}

LLM & Verbindungen

⚙ Einstellungen
{% if !hinweis.is_empty() %}

{{ hinweis }}

{% endif %} {% if !fehler.is_empty() %}

{{ fehler }}

{% endif %}

Der Balancer proxyt Inferenz OpenAI-/Ollama-kompatibel auf die Verbindungen; ohne gesundes Ollama-Backend greift der passende Cloud-/OpenAI-Provider.

LLM-Verbindungen (Provider)

Ollama-Hosts und OpenAI-kompatible Provider (OpenAI, InferX, Together, Groq, Infercom, …). base_url = OpenAI-Basis (…/v1). API-Key leer lassen = unveraendert. Speichern startet die aes-suite neu.

Presets base_url: InferX https://model.inferx.net/<endpoint>/v1 · Together https://api.together.xyz/v1 · Groq https://api.groq.com/openai/v1 · OpenAI https://api.openai.com/v1

{% for c in conns %} {% endfor %}
AktivNameTypURL (ollama) / base_url (cloud)Agent-URLModellAPI-Key
 

Inferenz testen

{% if infer_shown %}

Antwort{% if !infer_model.is_empty() %} ({{ infer_model }}){% endif %}

{% if infer_result.is_empty() %}

Keine Antwort — Ursache siehe Fehlermeldung oben (kein gesundes Backend und kein Cloud-Fallback aktiv).

{% else %}
{{ infer_result }}
{% endif %} {% endif %}

Modelle verwalten

{% if models.is_empty() %}

Keine Modelle geladen (Backend offline oder leer).

{% else %} {% for m in models %}{% endfor %}
Modell
{{ m }}
{% endif %}

Backends

{{ bal_summary }}

{% if backends.is_empty() %}

Keine Backends. Sobald ein llm-agent online ist, erscheinen hier Auslastung und Modelle.

{% else %} {% for b in backends %}{% endfor %}
BackendStatusCPURAMVRAMLatenzModelle
{{ b.url }}{{ b.badge }}{{ b.cpu }}%{{ b.ram }}%{{ b.vram }}%{{ b.latency }}ms{{ b.models }}
{% endif %} {% else if section == "monitoring" %}

Monitoring

Live-Ansicht aller Dienste (aktualisiert sich automatisch). Externe Anbindung siehe Admin → Metrics.

Lade Live-Daten… (aktiviere JavaScript fuer die Live-Ansicht)

Logs (Events)

{% if logs.is_empty() %}

Keine Events.

{% else %}
{% for l in logs %}
{{ l }}
{% endfor %}
{% endif %} {% else if section == "admin" %}

Admin

Dienste & Modul

{% for r in admin_rows %}{% endfor %}
{{ r.k }}{% if r.class.is_empty() %}{{ r.v }}{% else %}{{ r.v }}{% endif %}

Externe Monitoring-Schnittstelle

Zum Anbinden eines externen Monitorings (Prometheus/Grafana o.ae.). Aufruf mit Header Authorization: Bearer <ITSM_AES_METRICS_TOKEN>.

{% for r in metrics_rows %}{% endfor %}
{{ r.k }}{{ r.v }}
{% else if section == "einstellungen" %}

Einstellungen{% if !comp.is_empty() %} · {{ comp }}{% endif %}

{% if !comp.is_empty() %}

← alle Einstellungen

{% endif %} {% if !hinweis.is_empty() %}

{{ hinweis }}

{% endif %} {% if !fehler.is_empty() %}

{{ fehler }}

{% endif %}

Secrets werden nie im Klartext angezeigt; Feld leer lassen = unveraendert. Speichern startet den betroffenen Dienst automatisch neu.

{% if comp != "runner" %}

AES-Suite / Balancer / Cloud / Forge

{% for g in sett_aes %} {% if comp.is_empty() || comp == "all" || (comp == "llm" && g.name == "LLM-Balancer / Cloud") || (comp == "forge" && g.name == "Forge") || (comp == "forge" && g.name == "AES-Kern") %}

{{ g.name }}

{% for it in g.items %}
{% if it.secret %} {% else %}{% endif %}
{% endfor %} {% endif %} {% endfor %}
{% endif %} {% if comp.is_empty() || comp == "all" || comp == "runner" %}

Runner

{% for g in sett_runner %} {% for it in g.items %}
{% if it.secret %} {% else %}{% endif %}
{% endfor %} {% endfor %}
{% endif %} {% endif %} {% endif %} {% endblock %}