{% extends "base.html" %} {% block title %}Dashboard — MoE Admin{% endblock %} {% block flash %} {% if flash %} {% endif %} {% endblock %} {% block content %} {# ── Service status (outside the save form) ── #}
{{ t(request, 'lbl.services') }}
{# Core containers — always shown #} {% set _sm = services_manifest if services_manifest is defined else {} %} {% set containers = [ ("langgraph-orchestrator", "Orchestrator"), ("moe-kafka", "Kafka"), ("neo4j-knowledge", "Neo4j"), ("mcp-precision", "MCP Tools"), ("terra_cache", "Valkey"), ("chromadb-vector", "ChromaDB"), ] %} {# Optional stacks — only if enabled in .moe-services.json #} {% if _sm.get("prometheus_stack") %} {% set containers = containers + [("moe-grafana","Grafana"),("moe-prometheus","Prometheus"),("node-exporter","Node Exporter"),("cadvisor","cAdvisor")] %} {% endif %} {% if _sm.get("docs") %} {% set containers = containers + [("moe-docs","Docs"),("moe-docs-sync","Docs Sync")] %} {% endif %} {% if _sm.get("dozzle") %} {% set containers = containers + [("moe-dozzle","Log Viewer")] %} {% endif %} {% if _sm.get("caddy") %} {% set containers = containers + [("moe-caddy","Caddy")] %} {% endif %} {# moe-codex — only if CODEX_URL is configured #} {% if codex_url %} {% set containers = containers + [("moe-codex-api","Codex API"),("moe-docling","DocLing"),("moe-trino","Trino"),("moe-lakefs","lakeFS"),("moe-marquez","Marquez"),("moe-mlflow","MLflow")] %} {% endif %} {% for cname, label in containers %}
{% if cname == "moe-dozzle" %} {{ label }} {% else %} {{ label }} {% endif %} ...
{% endfor %}
{# ── Haupt-Konfigurationsformular ── #}
{# ── Inference-Server ── #}
{{ t(request, 'lbl.inference') }} {{ t(request, 'page.servers') }}
{{ t(request, 'lbl.ollama_servers') }} {{ t(request, 'lbl.inference_changes') }}
{% for srv in inference_servers %} {% endfor %}
Name URL (/v1) GPUs VRAM GB {{ t(request, 'table.factor') }} {{ t(request, 'lbl.timeout') }} Delay s API-Typ {{ t(request, 'lbl.token') }} {{ t(request, 'status.active') }} {{ t(request, 'lbl.ontology_short') }} Status
{# ── Modelle ── #}
{{ t(request, 'section.models') }}
{# ── Claude Code ── #}
{{ t(request, 'section.cc_integration') }}

ANTHROPIC_BASE_URL=http://<server>:8002

{# ── CC Profile status ── #}
{% if enabled_profiles_count > 0 %}
{{ enabled_profiles_count }} {{ t(request, 'lbl.enabled_profiles') }}
{{ t(request, 'btn.edit') }}
{% else %}
{{ t(request, 'info.no_profiles_enabled') }}
{% endif %} {% if profiles %} {% else %} {{ t(request, 'btn.first_profile') }} {% endif %}
{# ── Fallback-Einstellungen (collapsed) ── #}
The model IDs that Claude Code sends via ANTHROPIC_MODEL=.... The MCP server accepts and routes them internally.
Tool calls always run via the tool model, regardless of mode.
{# ── System ── #}
{{ t(request, 'section.system') }}
{# ── E-Mail / SMTP ── #}
{{ t(request, 'section.smtp') }}
{# ── Public URLs ── #}
{{ t(request, 'section.public_urls') }} {{ t(request, 'lbl.public_urls_note') }}
{{ t(request, 'lbl.log_url_help') }}
{{ t(request, 'lbl.prometheus_url_public_help') }}
{# ── Object Storage / MinIO ── #}
Object Storage (Datei-Downloads)
Interne Container-URL — z.B. moe-storage:9000
Basis-URL für Download-Links — Nginx/Reverse-Proxy-Adresse
Leer lassen um das bestehende Passwort zu behalten.
{# ── SSO / OIDC ── #}
{{ t(request, 'section.sso') }}
{{ t(request, 'lbl.oidc_end_session_hint') }}
{{ t(request, 'lbl.public_sso_url_hint') }}
{# ── CORS-Konfiguration ── #}
CORS Configuration (Open WebUI direct connections)
One domain per line. Empty = no CORS (direct connections disabled).
{# ── Advanced pipeline settings ── #}
Advanced Pipeline Settings
{# Cache #}
Cache

{% for key, label, default, tip in [ ('CACHE_HIT_THRESHOLD', 'Cache Hit Threshold (Cosine)', '0.15', 'Distance below which a cache hit is counted (0.0–1.0)'), ('SOFT_CACHE_THRESHOLD', 'Soft Cache Max Distance', '0.50', 'Use as few-shot example up to this distance'), ('SOFT_CACHE_MAX_EXAMPLES','Soft Cache Max Examples', '2', 'Maximum number of similar responses as context'), ('CACHE_MIN_RESPONSE_LEN', 'Min. Response Length for Cache','150', 'Responses shorter than this value are not cached'), ] %}
{% endfor %} {# Expert Routing #}
Expert-Routing

{% for key, label, default, tip in [ ('EXPERT_TIER_BOUNDARY_B', 'T1/T2 Boundary (B Params.)', '20', 'Models ≤ this size = T1 (fast)'), ('EXPERT_MIN_SCORE', 'Min. Score for Tier', '0.3', 'Expert below this score is not selected'), ('EXPERT_MIN_DATAPOINTS', 'Min. Datapoints (Score)', '5', 'Below this count → neutral score 0.5'), ('HISTORY_MAX_TURNS', 'Max. Conversation Turns', '4', 'Conversation context: number of turns'), ('HISTORY_MAX_CHARS', 'Max. History Characters', '3000', 'Conversation context: character limit'), ('PLANNER_MAX_TASKS', 'Max. Planner Tasks', '4', 'Maximum parallel tasks per request'), ] %}
{% endfor %} {# Timeouts #}
Timeouts & Token-Limits

{% for key, label, default in [ ('JUDGE_TIMEOUT', 'Judge Timeout (s)', '900'), ('EXPERT_TIMEOUT', 'Expert Timeout (s)', '900'), ('PLANNER_TIMEOUT', 'Planner Timeout (s)', '300'), ('PLANNER_RETRIES', 'Planner Retries', '2'), ('TOOL_MAX_TOKENS', 'Tool max_tokens', '8192'), ('REASONING_MAX_TOKENS', 'Reasoning max_tokens', '16384'), ('MAX_EXPERT_OUTPUT_CHARS','Max. Expert Output (chars)', '2400'), ('SSE_CHUNK_SIZE', 'SSE Chunk Size (chars)', '50'), ] %}
{% endfor %} {# Judge Refinement #}
Judge Refinement Loop

{# Feedback #}
Feedback & Selbstbewertung

{% for key, label, default, tip in [ ('EVAL_CACHE_FLAG_THRESHOLD', 'Cache Flag Threshold (Self-Eval ≤)', '2', 'Self-evaluations ≤ this value flag the cache entry'), ('FEEDBACK_POSITIVE_THRESHOLD', 'Positive Feedback Threshold (≥)', '4', 'User rating ≥ this value = positive signal'), ('FEEDBACK_NEGATIVE_THRESHOLD', 'Negative Feedback Threshold (≤)', '2', 'User rating ≤ this value = negative signal'), ] %}
{% endfor %}
{# end row #} {# ── Save ── #}
Reset
{% endblock %} {% block scripts %} {% endblock %}