Skema YAML Flow
Ringkasan
Section titled “Ringkasan”Flow didefinisikan dalam file YAML dengan ekstensi .ygtc. Referensi ini mencakup skema lengkapnya.
Struktur Tingkat Atas
Section titled “Struktur Tingkat Atas”name: string # Required: Flow identifierversion: string # Required: Semantic versiondescription: string # Optional: Human-readable description
nodes: [] # Required: List of nodestriggers: [] # Required: List of triggersvariables: {} # Optional: Flow-level variablesconfig: {} # Optional: Flow configurationSkema Node
Section titled “Skema Node”nodes: - id: string # Required: Unique node identifier type: string # Required: Node type config: object # Type-specific configuration next: string # Optional: Next node ID on_error: string # Optional: Error handler node ID output: string # Optional: Output variable name timeout: number # Optional: Timeout in millisecondsJenis Node
Section titled “Jenis Node”Kirim respons pesan.
- id: greet type: reply config: message: string # Message text buttons: [] # Optional: Action buttons attachments: [] # Optional: File attachmentsPanggil LLM.
- id: analyze type: llm config: model: string # Model name (e.g., "gpt-4") prompt: string # User prompt system_prompt: string # Optional: System message temperature: number # Optional: 0-2 (default: 1) max_tokens: number # Optional: Max response tokens output_format: string # Optional: "text" or "json" functions: [] # Optional: Function definitionstemplate
Section titled “template”Render template Handlebars.
- id: format type: template config: template: string # Inline template template_file: string # Or: Path to template file data: object # Optional: Template datascript
Section titled “script”Eksekusi script Rhai.
- id: calculate type: script config: script: string # Inline script script_file: string # Or: Path to script filebranch
Section titled “branch”Percabangan kondisional.
- id: route type: branch config: conditions: - expression: string # Condition expression next: string # Target node if true default: string # Default node if no matchKelola state sesi.
- id: save type: state config: action: string # "get", "set", "delete" key: string # State key value: any # Value (for "set") output: string # Output variable (for "get")Buat request HTTP.
- id: fetch type: http config: method: string # HTTP method url: string # Request URL headers: object # Optional: HTTP headers body: any # Optional: Request body timeout: number # Optional: Timeout in msEmit event.
- id: notify type: event config: event_type: string # Event type identifier payload: object # Event payloadadaptive-card
Section titled “adaptive-card”Render Adaptive Card.
- id: show_card type: adaptive-card config: card: string # Card name (from pack) card_json: object # Or: Inline card JSON data: object # Optional: Card datafast2flow
Section titled “fast2flow”Routing intent.
- id: route type: fast2flow config: config_file: string # Path to fast2flow config fallback_to_llm: bool # Optional: Use LLM for ambiguousflow2flow
Section titled “flow2flow”Panggil sub-flow.
- id: call_sub type: flow2flow config: target_flow: string # Flow to invoke pass_context: bool # Optional: Pass current context input: object # Optional: Input datamcp-tool
Section titled “mcp-tool”Eksekusi tool MCP.
- id: query type: mcp-tool config: tool: string # Tool name parameters: object # Tool parametersTrigger
Section titled “Trigger”Skema Trigger
Section titled “Skema Trigger”triggers: - type: string # Trigger type target: string # Target node ID # Type-specific fieldsJenis Trigger
Section titled “Jenis Trigger”message
Section titled “message”Dipicu oleh pesan masuk.
- type: message pattern: string # Optional: Regex pattern target: startdefault
Section titled “default”Trigger catch-all.
- type: default target: fallbackDipicu oleh event.
- type: event event_type: string # Event type to listen for target: handle_eventTrigger terjadwal.
- type: timer cron: string # Cron expression timezone: string # Optional: Timezone target: scheduled_taskcallback_query
Section titled “callback_query”Callback tombol (Telegram).
- type: callback_query target: handle_buttonblock_action
Section titled “block_action”Aksi interaktif (Slack).
- type: block_action target: handle_actionVariabel
Section titled “Variabel”Definisikan variabel tingkat flow:
variables: max_retries: 3 api_url: "https://api.example.com" welcome_message: "Hello!"Akses di dalam node:
- id: greet type: reply config: message: "{{flow.welcome_message}}"Konfigurasi
Section titled “Konfigurasi”config: timeout: 30000 # Flow timeout in ms retry_policy: max_retries: 3 backoff: exponential logging: level: debugSintaks Ekspresi
Section titled “Sintaks Ekspresi”Ekspresi menggunakan DSL sederhana:
# Equalityexpression: "intent == 'greeting'"
# Containsexpression: "message contains 'help'"
# Comparisonexpression: "count > 5"
# Logicalexpression: "is_vip && has_order"expression: "status == 'pending' || status == 'processing'"
# Nested accessexpression: "user.profile.tier == 'premium'"Variabel Template
Section titled “Variabel Template”Tersedia di semua field string:
| Variable | Description |
|---|---|
{{message}} | Teks pesan saat ini |
{{user_id}} | Pengidentifikasi pengguna |
{{channel_id}} | Pengidentifikasi channel |
{{session_id}} | Pengidentifikasi sesi |
{{tenant_id}} | Pengidentifikasi tenant |
{{state.*}} | Nilai state sesi |
{{flow.*}} | Variabel flow |
{{entry.*}} | Field konteks entry (masuk) |
{{in.*}} | Alias untuk {{entry.*}} |
Alias Konteks Template: in dan entry
Section titled “Alias Konteks Template: in dan entry”Konteks template mengekspos data pesan masuk di bawah key entry. Pada versi saat ini, in didukung sebagai alias untuk entry, memberikan cara yang lebih singkat dan intuitif untuk mereferensikan data masuk di template.
Kedua bentuk ini setara:
# Using 'entry' (original)- id: echo type: reply config: message: "You said: {{entry.text}}"
# Using 'in' (alias)- id: echo type: reply config: message: "You said: {{in.text}}"Key entry tetap didukung penuh untuk kompatibilitas mundur. Flow yang ada dan menggunakan {{entry.*}} akan tetap berjalan tanpa perubahan. Flow baru dapat menggunakan salah satu bentuk; in direkomendasikan karena lebih ringkas.
Contoh Lengkap
Section titled “Contoh Lengkap”name: customer_serviceversion: "1.0.0"description: Customer service flow with intent routing
variables: support_email: "support@example.com"
nodes: - id: analyze type: llm config: model: "gpt-4" system_prompt: | Classify intent: greeting, order_status, complaint, other Respond JSON: {"intent": "...", "confidence": 0.0-1.0} prompt: "{{message}}" output_format: json output: intent_result next: route
- id: route type: branch config: conditions: - expression: "intent_result.intent == 'greeting'" next: greet - expression: "intent_result.intent == 'order_status'" next: check_order - expression: "intent_result.intent == 'complaint'" next: escalate default: general_help
- id: greet type: reply config: message: "Hello! How can I help you today?"
- id: check_order type: http config: method: GET url: "https://api.example.com/orders/{{order_id}}" next: show_order_status
- id: show_order_status type: template config: template: | Order #{{order.id}} Status: {{order.status}} ETA: {{order.eta}} next: reply_order
- id: reply_order type: reply config: message: "{{formatted_status}}"
- id: escalate type: reply config: message: "I'm sorry to hear that. Connecting you to support..." next: create_ticket
- id: create_ticket type: mcp-tool config: tool: "create_ticket" parameters: subject: "Complaint from {{user_id}}" message: "{{message}}"
- id: general_help type: reply config: message: | I can help you with: - Order status - Returns - General questions
Contact: {{flow.support_email}}
triggers: - type: message target: analyze