Ir al contenido

fast2flow

fast2flow es una extensión de enrutamiento de alto rendimiento que enruta mensajes entrantes al flow adecuado usando puntuación determinista basada en tokens (BM25) con fallback opcional a LLM.

Concepto principal: un usuario envía un mensaje como “refund please” → fast2flow consulta índices específicos del tenant → devuelve una directiva de enrutamiento (Dispatch, Respond, Deny o Continue).

Principios clave:

  • Determinista primero: puntuación BM25 basada en tokens para un enrutamiento predecible y explicable
  • Fail-open: errores, timeouts o índices faltantes producen una directiva Continue
  • Con límite de tiempo: aplicación estricta de timeout mediante time_budget_ms
  • Impulsado por políticas: el comportamiento en runtime cambia sin cambios de código
Incoming Message
┌──────────────────────────────────────────────────┐
│ fast2flow Pipeline │
│ │
│ ┌────────────────────────────────────────────┐ │
│ │ 1. Hook Filter │ │
│ │ Allow/deny lists, respond rules, policy │ │
│ └────────────────────────────────────────────┘ │
│ │ │
│ ┌────────────────────────────────────────────┐ │
│ │ 2. Index Lookup │ │
│ │ Load TF-IDF index for tenant scope │ │
│ └────────────────────────────────────────────┘ │
│ │ │
│ ┌────────────────────────────────────────────┐ │
│ │ 3. Deterministic Strategy (BM25) │ │
│ │ Token scoring with title boosting (2x) │ │
│ └────────────────────────────────────────────┘ │
│ │ │
│ ┌────────────────────────────────────────────┐ │
│ │ 4. Confidence Gate │ │
│ │ min_confidence threshold check │ │
│ └────────────────────────────────────────────┘ │
│ │ │
│ ┌────────────────────────────────────────────┐ │
│ │ 5. LLM Fallback (optional) │ │
│ │ OpenAI or Ollama for ambiguous cases │ │
│ └────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────┘
Routing Directive (Dispatch / Respond / Deny / Continue)

Cada decisión de enrutamiento produce una de cuatro directivas:

DirectivaPropósitoCampos
dispatchEnrutar a un flow específicotarget, confidence, reason
respondDevolver una respuesta inmediatamessage
denyBloquear la solicitudreason
continueSin decisión, deja que el llamador la maneje
// Dispatch to a flow
{"type": "dispatch", "target": "support-pack:refund_request", "confidence": 0.92, "reason": "BM25 match"}
// Auto-respond without routing
{"type": "respond", "message": "Use the self-service refund form at /refund."}
// Block the request
{"type": "deny", "reason": "Denied by scope policy"}
// Pass through (fail-open default)
{"type": "continue"}

fast2flow se distribuye como un artefacto .gtpack a través de GHCR:

Ventana de terminal
# Pull from GHCR
oras pull ghcr.io/greentic-biz/providers/routing-hook/fast2flow.gtpack:latest
# Or reference a specific version
oras pull ghcr.io/greentic-biz/providers/routing-hook/fast2flow.gtpack:v0.4.6

El pack registra un hook post_ingress que intercepta mensajes antes de que lleguen a cualquier flow.

fast2flow incluye tres components WASM (dirigidos a wasm32-wasip2):

ComponentPropósitoOperación
IndexerConstruye un índice TF-IDF consultable a partir de metadatos de flowsbuild, update
MatcherEmparejamiento rápido de intenciones basado en BM25 contra el índicematch
RouterOrquesta todo el pipeline de enrutamientoroute

Estos components son coordinados por tres flows definidos en el pack:

# flows/index.ygtc — Runs at deploy time to build indexes
# flows/match.ygtc — Runtime BM25 intent matching
# flows/route.ygtc — Full routing pipeline with LLM fallback

fast2flow indexa flows a partir de los archivos .ygtc de tu bundle. El indexer escanea el directorio del bundle, extrae metadatos (title, description, tags) y construye un índice TF-IDF con puntuación BM25.

my-bundle/
├── packs/
│ ├── support-pack/
│ │ └── flows/
│ │ ├── refund.ygtc
│ │ ├── shipping.ygtc
│ │ └── faq.ygtc
│ └── hr-pack/
│ └── flows/
│ ├── leave.ygtc
│ └── booking.ygtc

Cada archivo de flow proporciona los metadatos usados para el emparejamiento de intenciones:

refund.ygtc
id: refund_request
title: Process Refund Request
description: Handle customer refund requests for orders and payments
type: messaging
tags:
- refund
- payment
- billing
- return
start: collect_info
nodes:
collect_info:
templating.handlebars:
text: "Please provide your order number for the refund."
routing:
- out: true

Usa la CLI para construir un índice a partir de tu bundle:

Ventana de terminal
greentic-fast2flow bundle index \
--bundle ./my-bundle \
--output ./state/indexes \
--tenant demo \
--team default \
--verbose

Esto produce:

  • index.json: índice TF-IDF con frecuencias de términos y frecuencias de documentos
  • intents.md: documentación de intenciones legible por humanos
Ventana de terminal
greentic-fast2flow bundle validate --bundle ./my-bundle

Las políticas controlan el comportamiento del enrutamiento en runtime sin cambios de código. Son archivos JSON cargados desde /mnt/registry/fast2flow-policy.json o desde una ruta personalizada.

fast2flow-policy.json
{
"stage_order": ["scope", "channel", "provider"],
"default": {
"min_confidence": 0.5,
"llm_min_confidence": 0.5,
"candidate_limit": 20
},
"scope_overrides": [],
"channel_overrides": [],
"provider_overrides": []
}

Todos los campos de regla son opcionales; solo se aplican los campos especificados:

CampoTipoDescripción
min_confidencef32Puntuación BM25 mínima para despachar (0.0–1.0)
llm_min_confidencef32Confianza mínima del LLM para despachar (0.0–1.0)
candidate_limitusizeMáximo de candidatos a evaluar
allow_channelsstring[]Lista blanca de canales (null = permitir todos)
deny_channelsstring[]Lista negra de canales
allow_providersstring[]Lista blanca de providers (null = permitir todos)
deny_providersstring[]Lista negra de providers
allow_scopesstring[]Lista blanca de scopes (null = permitir todos)
deny_scopesstring[]Lista negra de scopes
respond_rulesobject[]Reglas de respuesta automática (coincidencia por palabras clave)

Los overrides se aplican en orden de etapas (scope → channel → provider) con ordenación por prioridad dentro de cada etapa.

Override de scope: confianza más estricta para un tenant VIP:

{
"id": "vip-tenant",
"priority": 10,
"scope": "tenant-vip",
"rules": {
"min_confidence": 0.8,
"candidate_limit": 10
}
}

Override de channel: respuesta automática en el canal email:

{
"id": "email-autorespond",
"priority": 20,
"channel": "email",
"rules": {
"respond_rules": [
{
"needle": "refund",
"message": "Refund requests via email take 3–5 business days. Use chat for instant support.",
"mode": "contains"
}
]
}
}

Override de provider: restringir a un provider específico:

{
"id": "slack-only",
"priority": 30,
"provider": "slack",
"rules": {
"deny_providers": ["telegram"]
}
}

Las reglas de respuesta automática hacen match con el texto antes de que se ejecute el pipeline de enrutamiento:

{
"needle": "business hours",
"message": "Our business hours are Mon–Fri 9AM–5PM UTC.",
"mode": "contains"
}

Modos compatibles: exact, contains (predeterminado), regex.

Ventana de terminal
# Print default policy
greentic-fast2flow policy print-default
# Validate a policy file
greentic-fast2flow policy validate --file ./my-policy.json

Cuando la estrategia determinista BM25 produce puntuaciones de baja confianza, fast2flow puede usar un LLM como fallback para la clasificación.

ProveedorVariables de entorno
OpenAIFAST2FLOW_OPENAI_API_KEY_PATH, FAST2FLOW_OPENAI_MODEL_PATH
OllamaFAST2FLOW_OLLAMA_ENDPOINT_PATH, FAST2FLOW_OLLAMA_MODEL_PATH
DisabledFAST2FLOW_LLM_PROVIDER=disabled (predeterminado)
Ventana de terminal
# Enable OpenAI fallback
FAST2FLOW_LLM_PROVIDER=openai \
FAST2FLOW_OPENAI_API_KEY_PATH=/run/secrets/openai-key \
greentic-fast2flow-routing-host < request.json
Ventana de terminal
# Build TF-IDF index from bundle
greentic-fast2flow bundle index \
--bundle ./my-bundle \
--output ./indexes \
--tenant demo \
--team default \
--generate-docs \
--verbose
# Validate bundle has indexable flows
greentic-fast2flow bundle validate --bundle ./my-bundle
Ventana de terminal
# Build index from flow definitions JSON
greentic-fast2flow index build \
--scope tenant-a \
--flows flows.json \
--output /tmp/indexes
# Inspect a built index
greentic-fast2flow index inspect \
--scope tenant-a \
--input /tmp/indexes
Ventana de terminal
# Simulate a routing decision
greentic-fast2flow route simulate \
--scope tenant-a \
--text "I need a refund" \
--indexes-path /tmp/indexes
Ventana de terminal
# Print default policy template
greentic-fast2flow policy print-default
# Validate policy file
greentic-fast2flow policy validate --file policy.json
VariableValor por defectoDescripción
FAST2FLOW_LLM_PROVIDERdisabledProvider LLM: disabled, openai, ollama
FAST2FLOW_POLICY_PATH/mnt/registry/fast2flow-policy.jsonRuta del archivo de política
FAST2FLOW_TRACE_POLICYEstablece 1 para emitir el rastro de política en stderr
FAST2FLOW_MIN_CONFIDENCE0.5Umbral mínimo de confianza por defecto
FAST2FLOW_LLM_MIN_CONFIDENCE0.5Confianza mínima del LLM por defecto
FAST2FLOW_CANDIDATE_LIMIT20Máximo de candidatos por defecto

fast2flow está optimizado para enrutamiento de baja latencia:

EtapaLatencia típica
Hook filter (allow/deny)< 0.1ms
BM25 index lookup< 1ms
Policy resolution< 0.1ms
LLM fallback (if enabled)200–500ms
  1. Escribe títulos descriptivos: las palabras del título obtienen un impulso TF-IDF de 2x para una mejor puntuación
  2. Usa tags específicos: los tags son la señal principal para el emparejamiento BM25
  3. Define umbrales adecuados: empieza con min_confidence: 0.5 y ajústalo hacia arriba
  4. Usa políticas para overrides: cambia el comportamiento por scope/channel/provider sin volver a desplegar
  5. Supervisa la tasa de Continue: una salida alta de Continue indica huecos en la cobertura de tus flows
  6. Mantén LLM como fallback: el enrutamiento determinista es más rápido y predecible