Zum Inhalt springen

manifest.yaml-Referenz

manifest.yaml beschreibt eine einzelne Capability für den Selu-Orchestrator. Die Datei liegt im Wurzelverzeichnis eines Capability-Ordners neben dem Dockerfile und der optionalen prompt.md.

manifest.yaml
id: weather-lookup
class: tool
image: ghcr.io/example/weather-lookup:1.0.0
manifest.yaml
id: weather-lookup
class: tool
image: ghcr.io/example/weather-lookup:1.0.0
tools:
- name: get_current_weather
description: Aktuelle Wetterbedingungen für einen Standort abrufen.
input_schema:
type: object
properties:
location:
type: string
description: Stadtname oder Koordinaten
units:
type: string
description: "Einheitensystem: metric oder imperial"
default: "metric"
required: ["location"]
recommended_policy: allow
credentials:
- name: WEATHER_API_KEY
scope: system
required: true
description: API-Schlüssel für den Wetterdienst
resources:
max_memory_mb: 128
max_cpu_fraction: 0.5
manifest.yaml
id: file-manager
class: tool
image: ghcr.io/example/file-manager:2.0.0
tool_source: dynamic
discovery_tool_name: list_available_tools
credentials:
- name: CLOUD_STORAGE_TOKEN
scope: user
required: false
description: Optionaler Token für Cloud-Storage-Integration
resources:
max_memory_mb: 256
max_cpu_fraction: 0.75
FeldTypErforderlichStandardBeschreibung
idstringJaEindeutiger Bezeichner (Kleinbuchstaben, Bindestriche).
classstringNein"tool""tool" oder "environment".
imagestringJaDocker-Image, das diese Capability implementiert.
tool_sourcestringNein"manifest"Wie Tools definiert werden: "manifest" oder "dynamic".
discovery_tool_namestringNein"list_tools"Name des Tools für die dynamische Erkennung.
toolslistNein[]Statische Tool-Definitionen (nur bei tool_source: "manifest").
networkobjectNeinSiehe untenNetzwerkzugriffs-Konfiguration.
filesystemstringNein"none"Dateisystem-Zugriffsrichtlinie.
credentialslistNein[]Benötigte Anmeldedaten und Secrets.
resourcesobjectNeinSiehe untenContainer-Ressourcenlimits.

Selu unterstützt zwei Methoden, um die Tools einer Capability zu definieren:

Tools werden direkt in der manifest.yaml-Datei deklariert. Das ist der klassische Ansatz und bleibt der Standard.

Tools werden zur Laufzeit durch Aufruf eines speziellen Discovery-Tools auf dem Capability-Container ermittelt. Dies ermöglicht:

  • Anpassung der verfügbaren Tools basierend auf Laufzeitbedingungen
  • Verschiedene Tools je nach vorhandenen Anmeldedaten
  • Aktualisierung des Tool-Sets ohne Manifest-Änderung

Bei dynamischer Erkennung wird Selu:

  1. Den Capability-Container starten
  2. Das Discovery-Tool aufrufen (Standardname: list_tools)
  3. Die zurückgegebenen Tool-Definitionen parsen
  4. Die Ergebnisse cachen und periodisch synchronisieren

Das Discovery-Tool muss ein JSON-Array von Tool-Definitionen zurückgeben:

[
{
"name": "read_file",
"description": "Dateiinhalt lesen",
"input_schema": {
"type": "object",
"properties": {
"path": {"type": "string", "description": "Dateipfad"}
},
"required": ["path"]
},
"recommended_policy": "ask"
}
]

Jeder Eintrag beschreibt eine aufrufbare Funktion, die Agenten nutzen können.

FeldTypErforderlichBeschreibung
namestringJaTool-Name, verwendet im gRPC-InvokeRequest.tool_name.
descriptionstringJaWird dem Agenten gesendet, um zu erklären, was das Tool tut.
input_schemaobjectJaJSON-Schema, das die Parameter des Tools definiert.
requires_confirmationboolNeinLegacy-Feld — stattdessen recommended_policy verwenden.
recommended_policystringNeinEmpfohlene Sicherheitsrichtlinie: "allow", "ask" oder "block".
terminal_on_successboolNeinTool-Schleife nach erfolgreichem Aufruf sofort beenden. Standard false.
FeldTypStandardBeschreibung
modestring"none"Netzwerkmodus: "none", "allowlist" oder "any".
hostsarray[]Erlaubte Hosts im allowlist-Modus (Format: "host:port").

Netzwerk-Hosts unterstützen Wildcard-Matching für Subdomains:

  • "api.example.com:443" — matcht genau api.example.com auf Port 443
  • "*.example.com:443" — matcht jede Subdomain wie cdn.example.com oder api.example.com
  • "*.example.com" — matcht Subdomains auf jedem Port
WertBeschreibung
"none"Nur-Lese-Dateisystem, kein persistenter Speicher.
"temp"Beschreibbares /tmp-Verzeichnis (wird bei Container-Neustart geleert).
"workspace"Benanntes Docker-Volume unter /workspace (nur environment-Klasse).
FeldTypErforderlichStandardBeschreibung
namestringJaName der Umgebungsvariable.
scopestringJa"system" (geteilt) oder "user" (pro Benutzer).
credential_typestringNein"secret"Typ der Anmeldedaten (derzeit nur "secret").
requiredboolNeintrueOb diese Anmeldedaten zwingend erforderlich sind.
descriptionstringNein""Menschenlesbare Erklärung für Benutzer.
FeldTypStandardBeschreibung
max_memory_mbinteger128Speicherlimit in Megabytes.
max_cpu_fractionnumber0.5CPU-Limit in Kernen (0.5 = halber Kern).
max_cpu_secondsinteger30Maximale CPU-Zeit pro Tool-Aufruf.
pids_limitinteger64Maximale Prozesse/Threads.

Capabilities mit tool_source: dynamic müssen ein Discovery-Tool implementieren, das die aktuell verfügbaren Tools zurückgibt.

Das Discovery-Tool wird wie jedes andere Tool aufgerufen, sollte aber ein JSON-Array mit allen verfügbaren Tools zurückgeben:

server.py
def invoke(self, request, context):
if request.tool_name == "list_tools":
# Verfügbare Tools basierend auf aktuellem Zustand zurückgeben
tools = []
# Immer verfügbar
tools.append({
"name": "basic_operation",
"description": "Führt eine Basisoperation aus",
"input_schema": {
"type": "object",
"properties": {
"input": {"type": "string"}
},
"required": ["input"]
},
"recommended_policy": "allow"
})
# Nur verfügbar wenn Anmeldedaten konfiguriert
if os.getenv("PREMIUM_API_KEY"):
tools.append({
"name": "premium_feature",
"description": "Zugriff auf Premium-Funktionen",
"input_schema": {
"type": "object",
"properties": {
"query": {"type": "string"}
}
},
"required": ["query"]
},
"recommended_policy": "ask"
})
return pb2.InvokeResponse(
result=json.dumps(tools),
success=True
)

Selu synchronisiert dynamische Tools automatisch:

  • Beim Start — Best-Effort-Synchronisation für alle geladenen Agenten
  • Bei Installation/Update — Tools werden als Teil des Installationsprozesses erkannt
  • Beim Setup — Frische Erkennung vor der Anzeige von Tool-Richtlinien

Wenn sich Tools zwischen Synchronisierungen ändern:

  • Hinzugefügte Tools erhalten die globale Standardrichtlinie (aus recommended_policy oder "block")
  • Entfernte Tools werden aus Richtlinientabellen und dem Cache gelöscht
  • Geänderte Tools aktualisieren ihre gecachten Definitionen

Wenn die Erkennung fehlschlägt, behält Selu die zuvor gecachten Tools bei und loggt einen Fehler.

Häufige Validierungsfehler:

  • Dynamisch + statisch Konflikttool_source: dynamic erfordert tools: []
  • Fehlendes Discovery-Tool — Dynamische Capabilities müssen das Discovery-Tool implementieren
  • Ungültige Tool-Schemas — Sowohl statische als auch erkannte Tools müssen gültiges JSON-Schema haben
  • Netzwerk-Host-Format — Hosts müssen im Format "hostname:port" sein

Verwende statische Tools wenn:

  • Die Capability einen festen Satz an Tools bereitstellt
  • Tool-Definitionen sich nicht basierend auf Laufzeitbedingungen ändern
  • Einfacheres Deployment und Debugging gewünscht ist

Verwende dynamische Tools wenn:

  • Verfügbare Tools von konfigurierten Anmeldedaten abhängen
  • Tools ohne Manifest-Änderung hinzugefügt/entfernt werden sollen
  • Tools durch externen Zustand oder APIs bestimmt werden