Jump to content

Connect SuperML | Leeroopedia MCP: Equip your AI agents with best practices, code verification, and debugging knowledge. Powered by Leeroo — building Organizational Superintelligence. Contact us at founders@leeroo.com.

Implementation:Microsoft Autogen Studio Termination Fields

From Leeroopedia
Sources Microsoft_Autogen
Domains Frontend, React, Termination Conditions, Form Fields
Last Updated 2026-02-11 17:00 GMT

Overview

Description

The TerminationFields component provides a comprehensive interface for configuring termination conditions in AutoGen teams. It supports multiple termination types (max messages, text mention, token usage, timeout, handoff, etc.) and combination conditions (OR/AND combinations). The component offers a flexible UI for composing complex termination logic with nested conditions, add/remove operations, and type-specific configuration fields.

Termination conditions determine when conversations should end, including:

  • Message count limits
  • Text pattern matching
  • Token usage thresholds
  • Timeout limits
  • Agent handoffs
  • Source matching
  • Custom external conditions

Usage

Used within ComponentEditor to render termination condition configuration fields. It handles both simple termination conditions and complex combination conditions (OR/Combination) that contain nested sub-conditions. The component provides a dynamic UI that adapts to the termination type being configured.

Code Reference

Source Location: python/packages/autogen-studio/frontend/src/components/views/teambuilder/builder/component-editor/fields/termination-fields.tsx

Signature:

interface TerminationFieldsProps {
  component: Component<TerminationConfig>;
  onChange: (updates: Partial<Component<ComponentConfig>>) => void;
  onNavigate?: (componentType: string, id: string, parentField: string) => void;
}

export const TerminationFields: React.FC<TerminationFieldsProps> = ({
  component,
  onChange,
  onNavigate,
}) => { /* ... */ }

Import:

import { TerminationFields } from "./fields/termination-fields";

I/O Contract

Props/Inputs

Parameter Type Required Description
component Component<TerminationConfig> Yes Termination condition component to configure
onChange (updates: Partial<Component<ComponentConfig>>) => void Yes Callback for component updates
onNavigate (type: string, id: string, field: string) => void No Navigate to nested conditions (unused currently)

Outputs

Output Type Description
onChange callback Partial<Component<ComponentConfig>> Emits termination configuration updates

Supported Termination Types

Simple Conditions

Type Provider Description Config Fields
Max Messages MaxMessageTermination Terminate after N messages max_messages, include_agent_event
Text Mention TextMentionTermination Terminate when text appears text
Stop Message StopMessageTermination Terminate on stop message (none)
Token Usage TokenUsageTermination Terminate after token limit max_total_token
Timeout TimeoutTermination Terminate after time limit timeout_seconds
Handoff HandoffTermination Terminate on agent handoff target
Source Match SourceMatchTermination Terminate when source matches sources (array)
Text Message TextMessageTermination Terminate on text message source
External ExternalTermination Custom external condition (none)

Combination Conditions

Type Provider Description Config Fields
OR Combination OrTermination Terminate if any condition met conditions (array)
AND Combination CombinationTermination Terminate if all conditions met conditions (array)

Termination Type Templates

The component defines templates for creating new conditions:

const TERMINATION_TYPES = {
  MAX_MESSAGE: {
    label: "Max Messages",
    provider: PROVIDERS.MAX_MESSAGE,
    defaultConfig: {
      max_messages: 10,
      include_agent_event: false,
    },
  },
  TEXT_MENTION: {
    label: "Text Mention",
    provider: PROVIDERS.TEXT_MENTION,
    defaultConfig: {
      text: "TERMINATE",
    },
  },
  TOKEN_USAGE: {
    label: "Token Usage",
    provider: PROVIDERS.TOKEN_USAGE,
    defaultConfig: {
      max_total_token: 1000,
    },
  },
  TIMEOUT: {
    label: "Timeout",
    provider: PROVIDERS.TIMEOUT,
    defaultConfig: {
      timeout_seconds: 300,
    },
  },
  // ... more types
};

UI Structure

Simple Termination Rendering

For simple conditions (non-combination), the UI shows:

  • Component details (label, description)
  • Type-specific configuration fields
  • Collapsible sections with icons

Combination Termination Rendering

For OR/AND combinations:

  • Conditions List: Shows all nested conditions
  • Add Condition: Dropdown to add new condition types
  • Remove Condition: Delete button for each condition
  • Recursive Rendering: Each condition rendered with TerminationFields

Example structure:

<Collapse>
  <Panel header="Condition Details">
    {/* Label and description fields */}
  </Panel>

  <Panel header="Termination Conditions">
    {conditions.map((condition, index) => (
      <div key={index}>
        <TerminationFields
          component={condition}
          onChange={(updates) => handleConditionUpdate(index, updates)}
        />
        <Button onClick={() => handleRemoveCondition(index)}>
          Remove
        </Button>
      </div>
    ))}

    <Button onClick={() => setShowAddCondition(true)}>
      Add Condition
    </Button>
  </Panel>
</Collapse>

Type-Specific Fields

Max Message Termination

<InputNumber
  value={config.max_messages}
  onChange={(value) => handleConfigUpdate("max_messages", value)}
  min={1}
/>
<Checkbox
  checked={config.include_agent_event}
  onChange={(e) => handleConfigUpdate("include_agent_event", e.target.checked)}
>
  Include Agent Events
</Checkbox>

Text Mention Termination

<Input
  value={config.text}
  onChange={(e) => handleConfigUpdate("text", e.target.value)}
  placeholder="e.g., TERMINATE"
/>

Token Usage Termination

<InputNumber
  value={config.max_total_token}
  onChange={(value) => handleConfigUpdate("max_total_token", value)}
  min={1}
/>

Timeout Termination

<InputNumber
  value={config.timeout_seconds}
  onChange={(value) => handleConfigUpdate("timeout_seconds", value)}
  min={1}
  addonAfter="seconds"
/>

Handoff Termination

<Input
  value={config.target}
  onChange={(e) => handleConfigUpdate("target", e.target.value)}
  placeholder="Target agent name"
/>

Source Match Termination

<Select
  mode="tags"
  value={config.sources}
  onChange={(value) => handleConfigUpdate("sources", value)}
  placeholder="Add source names"
/>

Text Message Termination

<Input
  value={config.source}
  onChange={(e) => handleConfigUpdate("source", e.target.value)}
  placeholder="Source agent name"
/>

Add/Remove Condition Logic

Adding a Condition

const handleAddCondition = () => {
  if (!selectedConditionType || !isCombinationTermination(component)) return;

  const newCondition = createNewCondition(selectedConditionType);
  const currentConditions = component.config.conditions || [];

  handleComponentUpdate({
    config: {
      conditions: [...currentConditions, newCondition],
    },
  });

  setShowAddCondition(false);
  setSelectedConditionType("");
};

const createNewCondition = (type: string) => {
  const template = TERMINATION_TYPES[type];
  return {
    provider: template.provider,
    component_type: "termination",
    version: 1,
    component_version: 1,
    description: `${template.label} termination condition`,
    label: template.label,
    config: template.defaultConfig,
  };
};

Removing a Condition

const handleRemoveCondition = (index: number) => {
  if (!isCombinationTermination(component)) return;

  const currentConditions = [...component.config.conditions];
  currentConditions.splice(index, 1);

  handleComponentUpdate({
    config: {
      conditions: currentConditions,
    },
  });
};

Type Guards Used

The component uses termination-specific type guards:

import {
  isOrTermination,
  isMaxMessageTermination,
  isTextMentionTermination,
  isCombinationTermination,
  isStopMessageTermination,
  isTokenUsageTermination,
  isHandoffTermination,
  isTimeoutTermination,
  isExternalTermination,
  isSourceMatchTermination,
  isTextMessageTermination,
} from "../../../../../types/guards";

Usage Examples

Simple Termination Configuration

import { TerminationFields } from "./fields/termination-fields";

// Max message termination
const maxMessageTermination = {
  provider: "autogen_core.termination.MaxMessageTermination",
  component_type: "termination",
  label: "Max 10 Messages",
  config: {
    max_messages: 10,
    include_agent_event: false,
  }
};

<TerminationFields
  component={maxMessageTermination}
  onChange={(updates) => {
    updateTermination({ ...maxMessageTermination, ...updates });
  }}
/>

Text Mention Termination

const textMentionTermination = {
  provider: "autogen_core.termination.TextMentionTermination",
  component_type: "termination",
  label: "TERMINATE Keyword",
  config: {
    text: "TERMINATE",
  }
};

<TerminationFields
  component={textMentionTermination}
  onChange={handleUpdate}
/>

OR Combination Termination

const orTermination = {
  provider: "autogen_core.termination.OrTermination",
  component_type: "termination",
  label: "Max Messages OR Text Mention",
  config: {
    conditions: [
      {
        provider: "autogen_core.termination.MaxMessageTermination",
        component_type: "termination",
        label: "Max 10 Messages",
        config: { max_messages: 10 }
      },
      {
        provider: "autogen_core.termination.TextMentionTermination",
        component_type: "termination",
        label: "TERMINATE",
        config: { text: "TERMINATE" }
      }
    ]
  }
};

<TerminationFields
  component={orTermination}
  onChange={handleUpdate}
/>

This renders a combination editor where users can: 1. See the list of conditions 2. Add new conditions via dropdown 3. Edit each condition individually 4. Remove conditions

Timeout Termination

const timeoutTermination = {
  provider: "autogen_core.termination.TimeoutTermination",
  component_type: "termination",
  label: "5 Minute Timeout",
  config: {
    timeout_seconds: 300,
  }
};

<TerminationFields
  component={timeoutTermination}
  onChange={handleUpdate}
/>

Token Usage Termination

const tokenTermination = {
  provider: "autogen_core.termination.TokenUsageTermination",
  component_type: "termination",
  label: "1000 Token Limit",
  config: {
    max_total_token: 1000,
  }
};

<TerminationFields
  component={tokenTermination}
  onChange={handleUpdate}
/>

Recursive Rendering

For combination conditions, the component renders itself recursively:

// Inside combination termination rendering
{conditions.map((condition, index) => (
  <div key={index} className="nested-condition">
    <TerminationFields
      component={condition}
      onChange={(updates) => {
        const updatedConditions = [...conditions];
        updatedConditions[index] = { ...condition, ...updates };
        handleComponentUpdate({
          config: { conditions: updatedConditions }
        });
      }}
    />
  </div>
))}

This allows for arbitrarily nested termination logic:

  • OR containing AND
  • AND containing OR
  • Nested combinations of any depth

Related Pages

Page Connections

Double-click a node to navigate. Hold to expand connections.
Principle
Implementation
Heuristic
Environment