aiwg
Version:
Deployment tool and support utility for AI context. Copies agents, skills, commands, rules, and behaviors into the paths each AI platform reads (Claude Code, Codex, Copilot, Cursor, Warp, OpenClaw, and 6 more) so one source of truth works across 10 platfo
273 lines (224 loc) • 6.57 kB
YAML
# FSM Configuration Schema
# Schema for fsm.config.yaml used by state-machine pattern pipelines
$schema: "https://json-schema.org/draft/2020-12/schema"
$id: "https://aiwg.io/schemas/nlp-prod/fsm-config/v1"
title: "FSM Pipeline Configuration"
description: |
Schema for fsm.config.yaml — the state machine definition for
state-machine pattern pipelines. Consumed by the FSM runtime stub.
type: object
required:
- version
- name
- initial_state
- states
- transitions
properties:
version:
type: string
default: "1.0.0"
name:
type: string
description: "State machine name"
description:
type: string
initial_state:
type: string
description: "Name of the entry state"
states:
type: object
description: "Map of state name to state definition"
additionalProperties:
$ref: "#/$defs/State"
transitions:
type: array
items:
$ref: "#/$defs/Transition"
error_handling:
$ref: "#/$defs/ErrorHandling"
audit:
$ref: "#/$defs/AuditConfig"
$defs:
State:
type: object
required:
- type
properties:
type:
type: string
enum:
- llm # LLM call step
- transform # Code-only transformation (no LLM)
- decision # Branching point (guard evaluation)
- terminal # Final state (accept or reject)
- escalate # Human escalation state
prompt:
type: string
nullable: true
description: "Path to prompt file (required for llm states)"
model:
type: string
description: "Model for this state (llm states only)"
max_tokens:
type: integer
default: 512
description:
type: string
description: "Human-readable description of what this state does"
on_entry:
type: string
description: "Function to call on state entry (for transform states)"
output_key:
type: string
description: "Key to store output under in pipeline context"
is_terminal:
type: boolean
default: false
terminal_result:
type: string
nullable: true
enum: [accept, reject, escalate, null]
description: "Terminal outcome (for terminal states)"
Transition:
type: object
required:
- from
- to
- guard
properties:
from:
type: string
description: "Source state name"
to:
type: string
description: "Target state name"
guard:
type: string
description: "Condition expression (e.g., 'output.valid == true')"
priority:
type: integer
default: 0
description: "Evaluation priority (higher = evaluated first)"
description:
type: string
ErrorHandling:
type: object
properties:
on_llm_error:
type: string
enum: [retry, escalate, fail]
default: retry
description: "What to do on LLM call failure"
max_retries:
type: integer
default: 3
on_max_retries:
type: string
enum: [escalate, fail]
default: escalate
on_invalid_transition:
type: string
enum: [escalate, fail]
default: fail
description: "What to do if no transition guard matches"
escalation_state:
type: string
description: "State to transition to on escalation"
default: ESCALATE
AuditConfig:
type: object
description: "State transition audit trail configuration"
properties:
enabled:
type: boolean
default: true
output_path:
type: string
default: "audit/transitions.jsonl"
description: "Append-only log of all state transitions"
include_context:
type: boolean
default: false
description: "Include full pipeline context in audit log (may be large)"
# Example FSM config
examples:
- version: "1.0.0"
name: document-processor
description: "Extract, validate, and enrich document data with error recovery"
initial_state: EXTRACT
states:
EXTRACT:
type: llm
prompt: prompts/extract.prompt.md
model: claude-haiku-4-5
max_tokens: 512
description: "Extract structured fields from input document"
output_key: extracted
VALIDATE:
type: decision
description: "Check extracted data meets quality thresholds"
output_key: validation_result
ENRICH:
type: llm
prompt: prompts/enrich.prompt.md
model: claude-haiku-4-5
max_tokens: 256
description: "Enrich extracted data with additional context"
output_key: enriched
RETRY_EXTRACT:
type: llm
prompt: prompts/extract-retry.prompt.md
model: claude-sonnet-4-6
max_tokens: 512
description: "Retry extraction with stronger model and refined prompt"
output_key: extracted
OUTPUT:
type: terminal
is_terminal: true
terminal_result: accept
description: "Pipeline complete — output accepted"
ESCALATE:
type: terminal
is_terminal: true
terminal_result: escalate
description: "Human review required"
transitions:
- from: EXTRACT
to: VALIDATE
guard: "extracted != null"
description: "Extraction produced output"
- from: EXTRACT
to: ESCALATE
guard: "extracted == null"
description: "Extraction failed — no output"
- from: VALIDATE
to: ENRICH
guard: "validation_result.score >= 0.8"
priority: 1
description: "Validation passed"
- from: VALIDATE
to: RETRY_EXTRACT
guard: "validation_result.score < 0.8 and context.retry_count < 1"
priority: 0
description: "First retry with stronger model"
- from: VALIDATE
to: ESCALATE
guard: "validation_result.score < 0.8 and context.retry_count >= 1"
priority: -1
description: "Max retries exhausted"
- from: RETRY_EXTRACT
to: VALIDATE
guard: "extracted != null"
- from: ENRICH
to: OUTPUT
guard: "enriched != null"
error_handling:
on_llm_error: retry
max_retries: 3
on_max_retries: escalate
on_invalid_transition: escalate
escalation_state: ESCALATE
audit:
enabled: true
output_path: audit/transitions.jsonl
include_context: false