Channel Tagging System
Configure services for deployment channels (voice, text, async) with validation and optimized LLM presets.
Overview
Different deployment channels have distinct requirements:
Voice channels need ultra-low latency and restricted state types
Text channels support full features with moderate latency
Async channels (email, API) have relaxed latency requirements
The channel tagging system helps you configure services appropriately and validates configurations before sync.
Channels
phone
voice
Telephony (PSTN/VoIP)
web_voice
voice
Browser WebRTC
mobile_voice
voice
Mobile app voice
sms
text
SMS messaging
whatsapp
text
web_chat
text
Web chat widget
mobile_chat
text
Mobile app chat
email
async
api
async
Direct API integration
Channel Profiles
Each channel type has a profile defining its constraints:
Voice Channels
Max states: 5
Allowed state types: action, annotation, tool-call
Memory retrieval: Disabled
Dynamic behaviors: Not supported
Recommendation: Configure
keytermsfor transcription accuracy
Text Channels
Max states: Unlimited
Allowed state types: All
Memory retrieval: Supported
Dynamic behaviors: Supported
Async Channels
Max states: Unlimited
Allowed state types: All
Memory retrieval: Supported
Dynamic behaviors: Supported
Maximum capabilities with relaxed latency requirements
Version Set Presets
Presets configure LLM models optimized for each channel type:
Standard
voice
text
async
Premium
voice_premium
text_premium
async_premium
Economy
voice_economy
text_economy
async_economy
Ultra-Low
voice_ultra_low
—
—
Ultra-Low Premium
voice_ultra_low_premium
—
—
Regional Availability
Some presets use LLMs that are not available in all regions. See LLM Regional Availability for the full availability matrix.
GPT-5.1 Regional Restriction
The following presets use GPT-5.1, which is only available in US and EU regions:
text_premiumasyncasync_premium
These presets cannot be deployed to CA or AU regions. Use economy or standard presets for those regions instead.
Ultra-Low Latency Presets
The voice_ultra_low and voice_ultra_low_premium presets require single-state context graphs:
Single-State Requirements
To use ultra-low latency presets:
All action states must have exactly 1 action
All action states must have 0 exit conditions
Set
skip_active_memory_retrieval: true
This triggers the backend fast path that skips the select_next_action LLM call, saving 100-500ms latency per turn.
Tag Format
Services support two tag formats in local JSON/YAML files:
Simple String Format (Recommended)
Or in YAML:
Object Format (Legacy)
Use the simple string format for easier editing. Both formats are automatically converted to the API format during sync.
Tags encode:
Channel (e.g.,
phone,web_chat) - which deployment channelPreset (e.g.,
voice_premium,text) - which LLM configuration
Service Environment Tags
Services can be tagged with dev or production to enforce different validation rules for version set pinning.
Environment Tag Options
dev
Development/sandbox services
No version pinning required. Can push directly to release.
production
Production services
Must have preview defined. release must match preview. All version sets must be pinned.
Adding Environment Tags
Add an environment tag alongside your channel tags:
Production Service Requirements
When a service is tagged production, the following rules are enforced during forge sync-to-remote:
Preview version set required: A
previewversion set must be definedRelease matches preview: The
releaseconfiguration must exactly matchpreview(agent version, context graph version, LLM preferences)Versions pinned: All version sets (except
edge) must have explicit pinned version numbers—nolatest
Example validation error:
Dev Service Flexibility
Services tagged dev have no version set restrictions:
Can use unpinned versions (
latest) in any version setNo
previewrequirementCan push directly to
releasewithout promotion workflow
Use dev only for sandbox/development environments. Production services should always use the production tag to enforce proper promotion workflows.
LLM Validation
Service tags control LLM validation at the version set layer. This ensures LLM preferences match channel and cost requirements.
Voice-Optimized LLMs
Voice channels require low Time-To-First-Token (TTFT) for real-time conversation. Only these LLMs are voice-optimized:
azure_gpt-4.1-2025-04-14
Yes
Primary choice for voice
azure_gpt-4.1-mini-2025-04-14
Yes
Default for voice (cost-effective)
azure_gpt-5-*
No
Higher latency
azure_gpt-5.1-*
No
Highest latency
Claude, Gemini
No
Not optimized for voice TTFT
Non-voice-optimized LLMs will cause validation errors for services with voice channel or voice preset tags.
Cost Tier Classifications
LLMs are classified into cost tiers for validation against preset expectations:
Economy
GPT-5-nano, GPT-4.1-mini, Gemini 2.5 Flash
$0.05-$0.40
Standard
GPT-5-mini, GPT-4.1
$0.25-$2
Premium
GPT-5, GPT-5.1, Claude Sonnet 4.5, Gemini 2.5 Pro
$1.25-$15
Validation Rules
Voice channel (phone, web_voice, mobile_voice)
Non-voice-optimized LLMs
ERROR
Voice preset (voice, voice_premium, etc.)
Non-voice-optimized LLMs
ERROR
Economy preset (*_economy)
Premium-tier LLMs
ERROR
Premium preset (*_premium)
Only economy-tier LLMs
ERROR
Production environment
release LLM prefs != preview
ERROR
Empty llm_model_preferences (voice)
System defaults may not be voice-optimized
WARNING
No channel/preset tags
LLM preferences cannot be validated
WARNING
Example Validation Output
System Defaults vs Preset Defaults
Important: Empty llm_model_preferences does NOT use preset defaults. It uses system defaults which may not match your channel/preset requirements.
For voice services, always explicitly configure LLM preferences to ensure voice-optimized models are used.
Validation
Services with channel tags are validated against channel constraints:
Preset compatibility: Voice presets only work with voice channels
Regional LLM availability: Presets are validated against the target region's LLM availability
LLM preferences: Voice channels require voice-optimized LLMs; cost tiers must match preset expectations
Channel constraints: Context graphs are checked against channel profile limits
Keyterms warning: Voice services without
keytermstrigger a warningUntagged LLM preferences: Services with LLM preferences but no tags trigger a warning
Errors block sync, warnings prompt for confirmation
Standalone Validation
Use forge validate to check services locally before syncing:
This catches issues early without making any changes to the remote.
Dependency Validation (--check-dependencies)
--check-dependencies)The --check-dependencies flag validates that a service's linked assets are compatible with its channel constraints. This is essential for voice services which have strict latency requirements.
What gets validated:
Context graph state count ≤ 5
✓
Warning
No decision/reflection/recall states
✓
Error
No active memory retrieval
✓
Warning
No dynamic behaviors applied
✓
Error
Single-state for ultra-low presets
✓
Error
Example output:
Voice Services with Dynamic Behaviors
Voice channels do not support dynamic behaviors due to latency requirements. If you have dynamic behaviors applied to a voice service, you must either:
Remove the dynamic behaviors from the service
Change the service to a text or async channel
Validation Flow
CLI Commands
Use forge channel commands to explore and validate configurations:
List Channels
Shows all supported channels with their profiles.
List Presets
Show Channel Profile
Displays constraints and recommendations for a specific channel.
Show Tags
Outputs the JSON tags to add to your service.
Validate Preset
Checks if a preset is compatible with a channel and optionally validates regional LLM availability.
Validate Context Graph
Validates context graph characteristics against channel constraints.
LLM Info
Shows the LLM catalog with voice-optimized recommendations.
Best Practices
Voice Channel Optimization
Use keyterms: Configure domain-specific vocabulary for better transcription
Minimize states: Keep context graphs under 5 states for voice
Consider ultra-low presets: If your workflow is single-state, use
voice_ultra_lowto save 100-500msAvoid memory retrieval: Set
skip_active_memory_retrieval: truefor voice
Production voice with quality focus
voice_premium
High-volume voice, cost-sensitive
voice_economy
Single-state voice flows
voice_ultra_low
Standard text chat
text
Complex reasoning (email, API)
async_premium
Example: Configuring a Voice Service
Check channel constraints:
Get tags for your preset:
Add tags to your service in
local/<env>/entity_data/service/<service>.yaml:Validate locally (catches issues without touching remote):
Validate dependencies (ensures context graph is compatible):
Preview sync changes:
Apply changes:
Related Documentation
Version Sets & PromotionLast updated
Was this helpful?

