Zum Inhalt springen

Constraint-Metadatensystem

Zweck: Umfassende Constraint-Metadaten für deterministische KI-Generierung, CLI-Validierung und Terraform-Schema-Durchsetzung.

Erweiterung: x-f5xc-constraints Version: 3.3.0 Status: Produktion Konsumenten: KI-Assistenten, CLI-Werkzeuge, Terraform-Provider, IDE-Erweiterungen, API-Validatoren


  1. Übersicht
  2. Erweiterungsstruktur
  3. Constraint-Typen
  4. Natürlichsprachliche Beschreibungen
  5. Validierungsbeispiele
  6. Konfidenzwerte
  7. Discovery-Integration
  8. Werkzeug-Integrationshandbuch

Die Erweiterung x-f5xc-constraints stellt deterministisches Wissen über Feldvalidierungsbeschränkungen bereit und ermöglicht:

  • KI-Assistenten: Gültige Konfigurationen ohne Benutzereingabe für Constraint-Details generieren
  • CLI-Werkzeuge: Genaue Eingabehinweise, Validierung und Fehlermeldungen bereitstellen
  • Terraform: Constraints zur Planungszeit durchsetzen, nicht zur Anwendungszeit
  • IDE-Erweiterungen: Echtzeit-Validierung und Autovervollständigungsvorschläge
  • API-Validatoren: Vorab-Validierung zur Reduzierung von API-Fehlern
  • 9.851 Constraints über alle F5 XC API-Spezifikationen
  • 50+ Mustertypen (String, Array, Numerisch)
  • 95 % Konfidenz bei hochprioritären Feldern (Namen, Ports, Bezeichner)
  • 3-Stufen-Abgleich: EXISTING > DISCOVERY > INFERRED

{
"x-f5xc-constraints": {
"constraintType": "string|array|number|object",
"deterministic": true,
"category": "length|size|range|pattern|character|format",
"minLength": 1,
"maxLength": 63,
"pattern": "^[a-z0-9]+$",
"metadata": {
"source": "discovery|inferred|explicit",
"confidence": 0.95,
"category": "naming",
"validatedAt": "2026-01-19T12:00:00Z"
}
}
}
FeldTypBeschreibung
constraintTypestringDatentyp (string, array, number, object)
deterministicbooleanHochkonfidenz-Flag (Konfidenz >= 0,9) für KI-Generierung
categorystringConstraint-Kategorie für Gruppierung und Berichterstellung
(Constraint-Schlüssel)verschiedenTypspezifische Constraint-Schlüssel, die auf oberster Ebene zusammengefasst sind (z. B. minLength, maxItems, minimum)
metadataobjectQuellenverfolgung, Konfidenz, Validierungszeitstempel

{
"constraintType": "string",
"category": "naming",
"minLength": 1,
"maxLength": 63,
"pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$",
"characterSet": {
"allowed": "[a-z0-9-]",
"restricted": "[^a-z0-9-]",
"required": "[a-z0-9]",
"description": "Lowercase alphanumeric with hyphens, not at start/end"
},
"format": "dns-label",
"formatDescription": "RFC 1123 DNS label: lowercase, alphanumeric, hyphens allowed but not at start/end",
"byteLength": {
"min": 1,
"max": 63
},
"validation": {
"rfc": "RFC 1123",
"standard": "Kubernetes resource naming"
},
"metadata": {
"source": "inferred",
"confidence": 0.95
},
"deterministic": true
}
FormatBeschreibungBeispiel
dns-labelRFC 1123 DNS-Label (1–63 Zeichen)my-service
fqdnVollständig qualifizierter Domänennameapi.example.com
emailRFC 5322 E-Mail-Adresseuser@example.com
urlRFC 3986 URI/URLhttps://example.com/api
ipv4IPv4-Adresse192.168.1.1
ipv6IPv6-Adresse2001:db8::1
uuidRFC 4122 UUID550e8400-e29b-41d4-a716-446655440000
date-timeISO 8601 Zeitstempel2026-01-19T12:00:00Z
dateISO 8601 Datum2026-01-19
timeISO 8601 Uhrzeit12:00:00
jsonJSON-String (analysierbar){"key": "value"}
yamlYAML-String (analysierbar)key: value
base64Base64-kodierter StringSGVsbG8gV29ybGQ=
hexHexadezimaler String48656c6c6f
mac-addressMAC-Adresse00:1A:2B:3C:4D:5E
phoneE.164-Telefonnummer+1-555-123-4567
{
"constraintType": "array",
"category": "collection",
"minItems": 1,
"maxItems": 50,
"uniqueItems": true,
"metadata": {
"source": "inferred",
"confidence": 0.90
},
"deterministic": true
}
{
"constraintType": "number",
"category": "range",
"minimum": 1,
"maximum": 65535,
"multipleOf": 1,
"exclusiveMinimum": false,
"exclusiveMaximum": false,
"metadata": {
"source": "inferred",
"confidence": 0.99
},
"deterministic": true
}

DNS-Labels (format: "dns-label"):

  • DNS-Label-Namen müssen 1–63 kleingeschriebene alphanumerische Zeichen enthalten
  • Bindestriche erlaubt, jedoch nicht am Anfang oder Ende (RFC 1123)
  • Beispiel: my-service, api-gateway, lb-prod-01

E-Mail-Adressen (format: "email"):

  • E-Mail-Adressen müssen gemäß RFC 5322 gültig sein
  • Maximal 254 Zeichen
  • Beispiel: admin@example.com, api+webhook@service.io

FQDNs (format: "fqdn"):

  • Vollständig qualifizierte Domänennamen müssen 1–253 Zeichen lang sein
  • Durch Punkte getrennte DNS-Labels
  • Beispiel: api.example.com, service.production.internal

URLs (format: "url"):

  • URLs müssen gültige URIs gemäß RFC 3986 sein
  • Schema (http/https) muss angegeben werden
  • Beispiel: https://api.example.com/v1, http://localhost:8080

IPv4-Adressen (format: "ipv4"):

  • IPv4-Adressen müssen in Punkt-Dezimal-Notation vorliegen
  • Beispiel: 192.168.1.1, 10.0.0.1

UUIDs (format: "uuid"):

  • UUIDs müssen dem RFC 4122-Format entsprechen
  • Beispiel: 550e8400-e29b-41d4-a716-446655440000

Zeitstempel (format: "date-time"):

  • Zeitstempel müssen im ISO 8601-Format vorliegen
  • Beispiel: 2026-01-19T12:00:00Z, 2026-01-19T12:00:00+00:00

Portnummern:

  • Portnummern müssen ganze Zahlen zwischen 1 und 65535 sein
  • Standardports: 80 (HTTP), 443 (HTTPS), 22 (SSH)

VLAN-IDs:

  • VLAN-IDs müssen ganze Zahlen zwischen 1 und 4094 sein (802.1Q-Standard)

Timeouts:

  • Timeouts müssen zwischen 1 und 3600 Sekunden liegen (maximal 1 Stunde)

Ursprungsserver-Pools:

  • Ein Array von Ursprungsserver-Pools erfordert mindestens 1 Element, maximal 50 Elemente
  • Jedes Element muss eindeutig sein

Tags:

  • Das Tags-Array erlaubt 0–100 Elemente
  • Elemente müssen nicht eindeutig sein

Constraint:

{
"constraintType": "string",
"minLength": 1,
"maxLength": 63,
"pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$",
"format": "dns-label",
"deterministic": true
}

Gültige Werte:

  • my-service
  • api-gateway
  • lb-prod-01
  • web

Ungültige Werte:

  • My-Service (Großbuchstaben nicht erlaubt)
  • -my-service (Bindestrich am Anfang)
  • my-service- (Bindestrich am Ende)
  • my_service (Unterstrich nicht erlaubt)
  • this-is-a-very-long-name-that-exceeds-the-sixty-three-character-limit (zu lang)

Constraint:

{
"constraintType": "number",
"minimum": 1,
"maximum": 65535,
"deterministic": true
}

Gültige Werte:

  • 80 (HTTP)
  • 443 (HTTPS)
  • 8080 (alternativer HTTP-Port)
  • 65535 (maximaler Port)

Ungültige Werte:

  • 0 (unter dem Minimum)
  • 65536 (über dem Maximum)
  • -1 (negativ)
  • "80" (String, keine Zahl)

Constraint:

{
"constraintType": "array",
"minItems": 1,
"maxItems": 50,
"uniqueItems": true,
"deterministic": true
}

Gültige Werte:

  • ["origin-1"] (1 Element)
  • ["origin-1", "origin-2", "origin-3"] (3 Elemente, alle eindeutig)

Ungültige Werte:

  • [] (unter dem Minimum)
  • ["origin-1", "origin-1"] (doppelte Elemente)
  • [Array mit 51 Elementen] (über dem Maximum)

BereichInterpretationVerwendung
0,90–1,00Hohe KonfidenzDeterministisches Flag aktiviert, für KI-Generierung verwenden
0,70–0,89Mittlere KonfidenzBeratend, Benutzerbestätigung empfohlen
0,50–0,69Geringe KonfidenzNur informativ, Benutzervalidierung erforderlich
< 0,50Sehr geringe KonfidenzNicht in Constraints enthalten

Das boolesche deterministic-Flag wird gesetzt, wenn:

  • Konfidenzwert >= 0,9
  • Muster gegen Discovery-Daten validiert wurde ODER
  • Muster etablierten Standards entspricht (RFC, ISO usw.)

Verwendung bei der KI-Generierung:

if constraint.get("deterministic"):
# Wert automatisch generieren ohne Benutzerabfrage
value = generate_from_pattern(constraint)
else:
# Benutzer mit Constraint-Hinweisen abfragen
value = prompt_user_with_hints(constraint)

Constraints werden nach 3-Stufen-Priorität abgeglichen:

  1. EXISTING (Konfidenz: 1,0)

    • Explizit in der ursprünglichen OpenAPI-Spezifikation festgelegt
    • Wird niemals überschrieben
  2. DISCOVERY (Konfidenz: 0,99)

    • Aus Live-F5-XC-API-Antworten extrahiert
    • Enthält Validierungsregeln aus x-ves-validation-rules
    • Überschreibt abgeleitete Constraints
  3. INFERRED (Konfidenz: 0,50–0,95)

    • Muster aus Feldnamen abgeleitet
    • Niedrigste Priorität, wird durch Discovery oder Explicit überschrieben

Discovery-Constraints werden aus folgenden Quellen extrahiert:

  1. x-ves-validation-rules: Native F5-Validierungserweiterungen

    • ves.io.schema.rules.string.max_lenmaxLength
    • ves.io.schema.rules.string.patternpattern
    • ves.io.schema.rules.repeated.max_itemsmaxItems
  2. Fehlerkatalog: API-Fehlermeldungen, die auf Constraint-Verletzungen hinweisen

    • „name must be 1-63 characters” → minLength/maxLength
    • „port must be between 1 and 65535” → minimum/maximum
  3. Antwortvalidierung: Erfolgreiche API-Antworten mit gültigen Werten

    • Beobachtete Wertebereiche
    • Tatsächliche Formatmuster

Gültige Ressourcennamen generieren:

def generate_resource_name(schema_property):
constraints = schema_property.get("x-f5xc-constraints", {})
if not constraints.get("deterministic"):
# Benutzer nach Namen fragen
return prompt_user("Enter resource name: ")
# Automatisch generieren
pattern = constraints.get("pattern")
max_len = constraints.get("maxLength", 63)
# Gültigen Namen passend zum Muster generieren
return generate_dns_label(max_length=max_len)

Eingabevalidierung bereitstellen:

def validate_cli_input(field_name, user_value, constraints):
if not constraints:
return True, None
# Länge prüfen (Constraint-Schlüssel befinden sich auf oberster Ebene)
if "minLength" in constraints and len(user_value) < constraints["minLength"]:
return False, f"{field_name} must be at least {constraints['minLength']} characters"
if "maxLength" in constraints and len(user_value) > constraints["maxLength"]:
return False, f"{field_name} must be at most {constraints['maxLength']} characters"
# Muster prüfen
if "pattern" in constraints:
import re
if not re.match(constraints["pattern"], user_value):
char_set = constraints.get("characterSet", {})
desc = char_set.get("description", "valid format")
return False, f"{field_name} must match {desc}"
return True, None

Schema-Generierung:

func generateTerraformSchema(property map[string]interface{}) *schema.Schema {
constraints := property["x-f5xc-constraints"].(map[string]interface{})
s := &schema.Schema{
Type: schema.TypeString,
Required: true,
}
// Constraint-Schlüssel befinden sich auf oberster Ebene (kein verschachtelter "string"-Wrapper)
if minLen, ok := constraints["minLength"].(float64); ok {
s.ValidateDiagFunc = validation.StringLenBetween(int(minLen), int(constraints["maxLength"].(float64)))
}
if pattern, ok := constraints["pattern"].(string); ok {
charSet := constraints["characterSet"].(map[string]interface{})
s.ValidateDiagFunc = validation.StringMatch(regexp.MustCompile(pattern),
charSet["description"].(string))
}
return s
}

Autovervollständigung und Validierung:

function provideCompletions(field: FieldInfo): CompletionItem[] {
const constraints = field.schema['x-f5xc-constraints'];
if (!constraints) return [];
const items: CompletionItem[] = [];
// Formatspezifische Vervollständigungen hinzufügen
if (constraints.format === 'dns-label') {
items.push({
label: 'my-service',
detail: 'Example DNS label',
kind: CompletionItemKind.Value
});
}
// Validierungshinweis hinzufügen
if (constraints.deterministic) {
items.push({
label: '✨ Auto-generate',
detail: 'Generate valid value automatically',
kind: CompletionItemKind.Function,
command: { command: 'f5xc.generateValue', arguments: [field] }
});
}
return items;
}

MusterFeldname-RegexConstraint-TypBeispiel
DNS-Label\bname$String (1–63 Zeichen, dns-label)my-service
Namespace\bnamespace$String (1–63 Zeichen, dns-label)production
Port\bport$Zahl (1–65535)443
VLAN-ID\b(vlan)?_?id$Zahl (1–4094)100
UUID\buuid$String (36 Zeichen, UUID-Format)550e8400-...
E-Mail\bemail$String (max. 254 Zeichen, E-Mail)user@example.com
Zeitstempel\b(timestamp|created_at|updated_at)$String (ISO 8601)2026-01-19T12:00:00Z
MusterFeldname-RegexConstraint-TypBeispiel
Benutzername\b(user|username)$String (1–64 Zeichen, alphanumerisch)admin
Anzeigename\b(display_?)?name$String (1–256 Zeichen, Freitext)My Service
Beschreibung\b(comment|description|note)$String (max. 4096 Zeichen)Service description
Pfad\bpath$String (max. 2048 Zeichen)/api/v1/resources


Version: 3.3.0 Zuletzt aktualisiert: 2026-01-19 Abgeglichene Constraints: 9.851 Musterabdeckung: 50+ Typen