{% extends "base.html" %} {% block actions %}{% endblock %} {% block content %}
{% for p in providers %}{% else %}{% endfor %}
{{ _('Label') }}{{ _('Engine') }}{{ _('status') }}{{ _('endpoint / model') }}{{ _('limits') }}{{ _('credentials') }}
{{ p.label }}{% if not p.enabled %} off{% endif %}
prio {{ p.priority }} · w{{ p.weight }} · {{ p.timeout }}s
{{ p.engine.name if p.engine else p.engine_id }} {{ p.engine.kind if p.engine else '' }} {{ _(p.health) if p.health == 'healthy' else p.health }}{% if p.circuit_open_until %}
circuit → {{ p.circuit_open_until[11:19] }}
{% endif %}
{{ p.endpoint or '-' }}
{{ p.model or '' }}
{{ p.rpm_limit or '∞' }} rpm · {{ p.rpd_limit or '∞' }} rpd · {{ p.concurrency_limit }} conc{% if p.monthly_budget_cents %} · {{ p.monthly_budget_cents }}¢{% endif %} {% for c in p.credentials %}
{{ c.alias or 'key' }} …{{ secrets.decrypt(c.secret_enc)[-4:] }}{{ c.success_count }}✓ {{ c.failure_count }}✗{% if c.exhausted_until %}{{ _('exhausted') }}{% endif %}
{% endfor %}

{{ _('No providers yet') }}

{{ _('Nothing here yet.') }}

{{ _('New provider') }}

{{ _('Engine options') }}

{{ _('Add credential') }}

{{ _('Stored encrypted; shown masked afterwards. Several keys on one provider rotate automatically on quota/auth errors.') }}

{{ _('Test') }}

{% endblock %} {% block scripts %}{% endblock %}