Zum Hauptinhalt springen
connic
Build

Runtime-Steuerung

Ausführungslimits, koordinierte parallele Runs, persistente Sessions und gemeinsame Konfigurationen für zusammengehörige Agenten.

Zuletzt aktualisiert

Ausführungslimits und Wiederholungsversuche

agents/agent.yaml
max_concurrent_runs: 10
max_iterations: 50
timeout: 180

retry_options:
  attempts: 3
  attempt_timeout: 120
  initial_delay: 10
  max_delay: 30
  # Tool and sequential agents only:
  rerun_middleware: true
  • max_concurrent_runs begrenzt gleichzeitige Runs, bis zur Grenze des Abonnements.
  • max_iterations begrenzt den LLM Loop, damit wiederholte Tool-Aufrufe nicht unbegrenzt laufen.
  • timeout legt die maximale Ausführungszeit in Sekunden fest, mit mindestens fünf Sekunden. Die Obergrenze ist das Run-Timeout deines Plans, das auf der Preisseite steht.
  • retry_options gilt bei LLM-Agenten für einzelne KI-Modell-Anfragen. Bei jedem Fehler einer solchen Anfrage greift die konfigurierte Regel für Wiederholungsversuche oder Fallback. Dazu zählen Timeouts und Ablehnungen durch den Provider. Ein Dateityp, den das KI-Modell nicht akzeptiert (unsupported_file_type), wird beim selben KI-Modell nicht wiederholt, kann aber weiterhin zum Fallback wechseln. Ergebnisse abgeschlossener Tool-Aufrufe und der Middleware bleiben erhalten. Bei Tool- und Sequential-Agenten wird weiterhin der jeweilige Vorgang wiederholt.
  • attempts erlaubt 1–10 Versuche einschließlich des ersten; der Standardwert ist 3. Ohne Fallback gilt die Anzahl für das primäre KI-Modell. Mit Fallback erhält das primäre KI-Modell einen Versuch und das Fallback-KI-Modell die konfigurierte Anzahl. Eine konfigurierte Kontextkomprimierung kann einen zusätzlichen Versuch ermöglichen.
  • attempt_timeout beträgt standardmäßig 120 Sekunden und muss eine positive, endliche Zahl sein. Für jede vollständige Antwort und jeden Stream gilt dieses Zeitlimit oder die verbleibende Zeit des Runs, falls diese kürzer ist. Alle Versuche und Wartezeiten teilen sich das Zeitlimit des Runs. Wiederholungsversuche setzen es nicht zurück; die Anzahl der Versuche teilt es auch nicht auf.
  • Weitere Versuche mit demselben KI-Modell verwenden exponentiellen Backoff mit Equal Jitter. Die Wartezeit liegt zufällig zwischen der Hälfte und dem gesamten begrenzten Backoff. Die Standardwerte sind 10 Sekunden für initial_delay und 30 für max_delay. Ein gültiger Retry-After-Wert des Providers ersetzt diese Wartezeit. Der Wechsel zum Fallback erfolgt sofort. Reicht die Restzeit des Runs nicht für die erforderliche Wartezeit, startet keine weitere Anfrage.
  • rerun_middleware gilt nur für Wiederholungsversuche bei Tool- und Sequential-Agenten. Erneute KI-Modell-Anfragen behalten den laufenden LLM-Run und den Middleware-Zustand bei. Wiederholungsversuche der Provider-SDKs sind deaktiviert, damit sie die konfigurierte Anzahl nicht vervielfachen.

Im Beispiel ist eine Antwort nach 90 Sekunden bereits im ersten Versuch erfolgreich. Erreicht ein Versuch 120 Sekunden, teilen sich weitere Versuche die Restzeit des auf 180 Sekunden begrenzten Runs.

Das Streaming-Timeout umfasst die gesamte Antwort; eingehende Chunks setzen es nicht zurück. Hat eine Anfrage bereits Ausgabe geliefert, meldet connic eine Unterbrechung als unvollständige Antwort und startet die Anfrage nicht erneut. Auch ein Abbruch oder das erreichte Run-Timeout beendet weitere Versuche. Das gilt für normales LLM-Streaming; native Voice-Sessions haben einen eigenen Ablauf.

Regeln zur Nebenläufigkeit

Regeln zur Nebenläufigkeit stellen sicher, dass pro eindeutigem Schlüssel immer nur ein Run aktiv ist. Verwende sie, wenn ein Agent Events für einen bestimmten Support-Prozess, Kunden oder Auftrag verarbeitet und eine parallele Verarbeitung zu Konflikten führen würde.

Queue-Modus (Standard)

Trifft ein weiteres Event für einen aktiven Schlüssel ein, wartet es, bis der erste Run beendet ist, und startet anschließend automatisch.

agents/support-processor.yaml
version: "1.0"

name: support-processor
type: llm
model: connic/gpt-5.6-terra
description: "Processes support tickets one at a time per process"
system_prompt: "You are a support agent. Process the incoming ticket."

# Only one run per process_id at a time. Additional runs wait in queue.
concurrency:
  key: "process_id"
  on_conflict: queue

Drop-Modus

Trifft ein weiteres Event für einen aktiven Schlüssel ein, wird der neue Run sofort abgebrochen. Verwende diesen Modus, wenn doppelte Arbeit unnötig wäre.

agents/notification-handler.yaml
version: "1.0"

name: notification-handler
type: tool
description: "Handles notifications, skipping duplicates"
tool_name: notifications.handle

# Drop duplicate runs for the same customer while one is active.
concurrency:
  key: "data.customer_id"
  on_conflict: drop

Coalesce-Modus

Trifft ein weiteres Event für einen aktiven Schlüssel ein, wartet sein Run wie im Queue-Modus, aber pro Schlüssel kann nur ein Run warten. Ein neueres Event ersetzt den wartenden Run. Viele Events während eines langen Runs führen so zu genau einem Folge-Run mit der neuesten Payload. Verwende diesen Modus, wenn jedes Event den Agenten nur auffordert, denselben Zustand erneut zu prüfen.

Der ersetzte Run wird abgebrochen. Sein Kontext enthält superseded_by_concurrency_rule und superseded_by, die ID des Runs, der ihn ersetzt hat.

agents/process-agent.yaml
version: "1.0"

name: process-agent
type: llm
model: connic/gpt-5.6-terra
description: "Re-evaluates the current process step on every status event"
system_prompt: "Check the current step of the process and act on it."

# Events that arrive during a run collapse into one follow-up run.
concurrency:
  key: "process_id"
  on_conflict: coalesce

Schlüssel extrahieren

key liest die Trigger-Payload in Punktnotation. Wenn ein Kafka-Payload {"data": {"customer_id": "abc"}} lautet, verwende data.customer_id. Existiert der Pfad nicht, wird die Nebenläufigkeitsregel für diesen Run übersprungen.

Zusammenspiel mit max_concurrent_runs

Beide Einschränkungen gelten. Mit max_concurrent_runs: 5 und concurrency.key: "process_id"können fünf Prozess-IDs parallel laufen, aber pro Prozess-ID kann nur ein Run aktiv sein. Runs, die auf ihren Schlüssel warten, belegen keinen Platz.

Wartende Runs

  • Wartende Runs werden dauerhaft gespeichert. Sie überstehen Neustarts und Deployments und starten auf dem aktiven Deployment.
  • Ein Schlüssel bleibt während eines Deployments belegt. Ein Run, der noch auf dem vorherigen Deployment läuft, behält seinen Schlüssel bis zu seinem Ende.
  • Ein Run, der auf eine Freigabe wartet, behält seinen Schlüssel. Nach der Entscheidung läuft er vor allen wartenden Runs weiter.
  • Im Queue-Modus starten wartende Runs in der Reihenfolge, in der ihre Events eingetroffen sind.
  • Es gibt keine Obergrenze für wartende Runs und kein Warte-Timeout. Die Wartezeit zählt nicht zu timeout, und ein Run verbraucht vor seinem Start kein Projektguthaben. Runs, die durch drop oder coalesce abgebrochen werden, starten nie.
Einschränkungen

Regeln zur Nebenläufigkeit werden bei Sequential-Agenten nicht unterstützt. Der Schlüssel wird aus der ursprünglichen Trigger-Payload gelesen. Das funktioniert für alle Trigger-Typen, darunter Kafka, HTTP, Cron, API und trigger_agent.

Persistente Sessions

Mit session: true teilen alle Runs des Agenten eine Session. Ein Objekt ohne key oder mit key: null verwendet dieselbe gemeinsame Session. false, null oder das Weglassen von session deaktiviert die dauerhafte Speicherung.

agents/support-bot.yaml
version: "1.0"

name: support-bot
type: llm
model: connic/gpt-5.6-terra
description: "A support chatbot that remembers conversation history"
system_prompt: |
  You are a helpful support agent. Use the conversation history
  to provide contextual responses.

# Maintain persistent sessions keyed by chat ID from middleware
session:
  key: context.chat_id
  ttl: 86400  # Sessions expire after 24 hours of inactivity

# Keep long conversations within the model context window
context_compression:
  enabled: true
  # Optional model for compression summaries; defaults to the agent model
  model: connic/gpt-5.6-luna
  keep_recent_messages: 12
  # Optional early compression based on model-reported prompt usage
  max_prompt_tokens: 100000

Verlauf und Browserzustand

history und browser sind standardmäßig true. Dieses Beispiel behält Cookies und Local Storage pro Chat; jeder Run beginnt mit einem neuen Gesprächsverlauf. Bei browser: false funktionieren Browser-Tools weiterhin, starten aber mit leerem Browserzustand.

agents/agent.yaml
session:
  key: context.chat_id
  ttl: 86400
  history: false
  browser: true

Session-Schlüssel

Der optionale key trennt Sessions nach dem aufgelösten Wert. Wenn angegeben, muss er eines von zwei Präfixen verwenden:

  • context.<path> liest den Session-Schlüssel aus dem Middleware-Kontext. Die Middleware kann ihn auch aus den Anfragedaten ableiten.
  • input.<path> liest den Session-Schlüssel direkt aus der Payload der Verbindung, bevor die Middleware ausgeführt wird. Die Payload muss gültiges JSON sein; auch verschachtelte Felder sind zugänglich.

Schlüssel in Middleware setzen

middleware/support-bot.py
async def before(content: dict, context: dict) -> dict:
    # Extract a stable identifier for this conversation from the connector payload.
    payload = context.get("payload", {})
    context["chat_id"] = payload.get("chat_id")
    return content

Input-Schlüssel verwenden

agents/agent.yaml
# When the connector payload is JSON like {"user_id": "u123", "message": "..."}
session:
  key: input.user_id

TTL und Session-Verwaltung

Der optionale Wert ttl legt fest, nach wie vielen Sekunden ohne Aktivität eine Session abläuft. Das Minimum beträgt 60 Sekunden; ohne TTL laufen Sessions nie ab. Aktive Sessions lassen sich im Dashboard unter Storage > Sessions ansehen und löschen. Sessions gelten pro Environment.

Runs mit derselben Session werden nicht automatisch nacheinander ausgeführt. Überschneiden sich zwei Runs derselben Session, schlägt der Run fehl, der als zweiter schreibt. Wenn das passieren kann, setze eine Regel zur Nebenläufigkeit auf das Feld, das die Session identifiziert, etwa concurrency.key: conversation_id zusammen mit session.key: input.conversation_id.

Kontextkomprimierung

Mit context_compression verkürzt connic den Gesprächsverlauf, wenn der Provider ein überschrittenes Kontextfenster meldet. Die Komprimierung erfolgt vor einem Wechsel zum Fallback. Danach erhält dasselbe KI-Modell eine zusätzliche Anfrage mit dem gekürzten Verlauf. Pro KI-Modell-Aufruf im Agent-Loop ist höchstens ein solcher Reparaturversuch außerhalb der regulären Anzahl erlaubt. Das Zeitlimit des Runs und die bereits verbrauchten Versuche bleiben bestehen. Schlägt die Reparatur fehl, gilt wieder die normale Regel für Wiederholungsversuche oder Fallback. Mit context_compression.model lässt sich ein separates KI-Modell für Zusammenfassungen festlegen. Der Reparaturversuch verwendet das KI-Modell, das den Kontext abgelehnt hat. max_prompt_tokens ermöglicht eine frühere Komprimierung anhand der gemeldeten Prompt-Nutzung. session_history.interval komprimiert auch den gespeicherten Verlauf zwischen Runs.

Für den gespeicherten Verlauf gibt es keine Obergrenze bei Gesamtgröße oder Anzahl der Runs; jede gespeicherte Nachricht darf bis zu 5 MB groß sein. Mit session_history.interval: 4 fasst jeder vierte Run an seinem Ende den älteren Verlauf zusammen und behält die letzten keep_recent_runs Runs (Standard 1) unverändert. Ohne diese Einstellung lädt jeder Run den vollständigen gespeicherten Verlauf, und die Komprimierung kürzt nur die Anfrage, nicht die gespeicherte Session.

Konfigurierte Session-Schlüssel müssen auflösbar sein

Wenn ein konfigurierter Schlüsselpfad einen leeren oder fehlenden Wert ergibt, schlägt der Run fehl. Ohne key wird die gemeinsame Session des Agenten verwendet.

Kaskadierende Defaults mit _defaults.yaml

Füge _defaults.yaml in einem beliebigen Verzeichnis unter agents/ hinzu, um die Konfiguration mit Agenten auf dieser und darunterliegenden Ebenen zu teilen. Verwende die Datei für ein gemeinsames model, guardrails, Tools oder database.collections.

agents/-Struktur
agents/
_defaults.yamlapplies to every agent in the project
process/
_defaults.yamladds/overrides for everything under process/
ingest/
foo.yamlinherits root + process defaults
enrich/
_defaults.yamladds/overrides for process/enrich/*
bar.yamlinherits root + process + enrich defaults
support-assistant.yamlinherits only root defaults

connic kombiniert Standardwerte von der obersten zur tiefsten Ebene und wendet danach die Agent-Datei an, sodass deren Werte bei Konflikten Vorrang haben.

Zulässige Inhalte einer Defaults-Datei

Eine Defaults-Datei unterstützt dieselben Felder wie Agent YAML, muss aber nicht alle Pflichtfelder enthalten. Es gibt zwei Ausnahmen:

  • name und description sind nicht erlaubt, da sie einen bestimmten Agenten identifizieren.
  • version ist erlaubt, um die Schema-Version für das gesamte Projekt festzulegen. Die Agent-Datei muss sie dennoch zusammen mit name und description festlegen.

Merge-Regeln

  • Skalare Werte wie model, temperature, system_prompt und timeout werden durch die tiefere Ebene ersetzt.
  • Objekte wie database, retrieval, retry_options, approval, session und guardrails werden rekursiv nach Schlüssel zusammengeführt.
  • Listen werden zusammengeführt und dedupliziert:
    • tools, discoverable_tools und approval.tools werden nach Tool-Referenz dedupliziert; eine tiefere Deklaration überschreibt den geerbten Eintrag.
    • approval.inputs wird nach dem Namen des Eingabe-Tools dedupliziert; eine tiefere Deklaration ersetzt die geerbte Konfiguration dieses Namens.
    • mcp_servers werden nach Servernamen dedupliziert; eine tiefere vollständige Serverkonfiguration ersetzt die geerbte.
    • guardrails.input und guardrails.output werden, wenn vorhanden, nach Regelnamen dedupliziert und andernfalls angehängt.
    • Bei Sequential-Agenten werden in der Liste agents doppelte Agentennamen entfernt.

Beispiel

agents/_defaults.yaml
version: "1.0"
type: llm
model: connic/gpt-5.6-terra
temperature: 0
guardrails:
  input:
    - type: prompt_injection
      mode: block
  output:
    - type: system_prompt_leakage
      mode: block
tools:
  - audit.log_event
agents/billing/refund-agent.yaml
version: "1.0"
name: refund-agent
description: "Issues refunds against the billing system."
system_prompt: "Refund only valid charges. Use the tools."
tools:
  - billing.lookup_charge
  - billing.issue_refund
approval:
  tools:
    - billing.issue_refund: param.amount > 50
  timeout: 3600

Der resultierende refund-agent erbt das KI-Modell, den Temperatur-Wert und beide Guardrails. Seine Tools werden zu [audit.log_event, billing.lookup_charge, billing.issue_refund].

Führe connic lint aus, um die zusammengeführte Konfiguration zu validieren. A/B-Test-Varianten namens <base>-test-<name>.yaml erben dieselben Standardwerte wie ihre Basis.

Cloud-Entwicklungsumgebung

connic dev stellt eine Cloud-Entwicklungsumgebung mit Hot Reload bereit.