Note Web DSL Spring 2025 syntax changes are non-breaking and advance on updates announced in Summer 2024:
N.B.: TBI - to be implemented or implementation is partial, TBD - to be defined
<block> ::= (<contextStatement> | <statement>)+
<contextStatement> ::= "context" <string literal>
("runat" <string literal>|"repo" <string literal>)*
INDENT (<cloudAccountStatement> | <dashboardStatement> | <contextPipelineDefinition> | | <testSuiteStatement>)+ DEDENT
<cloudAccountStatement> ::= "cloud" <string literal>
(type "AWS" | type "Azure" | deploy "Ansible" | deploy "Terraform")*
INDENT (<cloudStatement>)* DEDENT
<cloudStatement> ::= "user" <string literal>
| "bucket" <string literal>
| "vpc" <stringLiteral> INDENT (<vpcContent>)+ DEDENT
| <containerServiceStatement>
| <kubernetesServiceStatement>
| "app service" <string literal> "image" <string literal> <resourceEntities>
| <lambdaStatement>
| "queue" <string literal> <queueAttributes> [INDENT <kvBlock>* DEDENT]
| "topic" <string literal> <topicAttributes> [INDENT <kvBlock>* DEDENT]
| "stream" <string literal> <streamAttributes> [INDENT <kvBlock>* DEDENT]
| "search engine" <string literal>
| "auth" <string literal>
| <apiGatewayStatement>
| <cdnStatement>
| <containerClusterStatement>
| <kubernetesClusterStatement>
| <databaseClusterStatement>
| <databaseInstanceStatement>
| "volume" <string literal> "type" <string literal> "config" <string literal>
| "secret" <string literal> <string literal>
| "resource" <string literal> "type" <string literal> "url" <string literal> INDENT (<resourceEntities>)+ DEDENT
| <agentStatement>
| <knowledgeBaseStatement>
| <testSuiteStatement>
| <observabilityStatement>
<agentStatement> ::= "agent" <string literal>
"model" <string literal>
"prompt" <string literal>
"tools" <string literal>+
["memory" <string literal>]
["guardrails" <string literal>]
["orchestration" <string literal>]
["collaboration" <string literal>]
["a2a" <string literal>]
["mcp" <mcpRole>]
["use kb" <string literal>]
<mcpRole> ::= "client" | "server" | "both"
<knowledgeBaseStatement> ::= "knowledge base" <string literal>
"type" <string literal>
"source" <string literal>
["embedding model" <string literal>]
<queueAttributes> ::= "type" <string literal>
["visibility timeout" <string literal>]
["dead letter queue" <string literal>]
["encryption" <string literal>]
<topicAttributes> ::= "type" <string literal>
["partition count" <string literal>]
["retention" <string literal>]
["schema" <string literal>]
<streamAttributes> ::= "type" <string literal>
["consumer group" <string literal>]
["subscribe to" <string literal>]
["from" <string literal>]
["format" <string literal>]
["handler" <string literal>]
<kvBlock> ::= <string literal> <string literal>
<lambdaStatement> ::= "lambda" <string literal>
"template" <string literal>
"ref" <string literal>
"index" <string literal>
"logs" <string literal>
"metrics" <string literal>
<serviceEntititesVolumesEnvs>
<apiGatewayStatement> ::= "api gateway" <string literal>
["auth" <string literal>]
INDENT ("ref" <string literal> "url" <string literal>)+ DEDENT
<cdnStatement> ::= "cdn" <string literal>
INDENT ("ref" <string literal> "path" <string literal> "url" <string literal>)+ DEDENT
<dashboardStatement> ::= "dashboard" <string literal>
INDENT ("web note" <string literal> "aspect" <string literal> "ref" <string literal>)+ DEDENT
<containerClusterStatement> ::= "container cluster" <string literal>
<kubernetesClusterStatement> ::= "kubernetes cluster" <string literal>
"cidr" <string literal>
"subnets" <string literal>
<databaseClusterStatement> ::= "database cluster" <string literal>
"type" <string literal>
INDENT <databaseInstanceStatement>+ DEDENT
<databaseInstanceStatement> ::= "database instance" <string literal>
"type" <string literal>
<resourceEntities>
<containerServiceStatement> ::= "container service" <string literal>
"image" <string literal>
(<serviceParameter>)+
<serviceEntititesVolumesEnvs>
<kubernetesServiceStatement> ::= "kubernetes service" <string literal>
"image" <string literal>
(<serviceParameter>)+
<serviceEntititesVolumesEnvs>
<serviceParameter> ::= "runat" <string literal>
| "registerdns" <string literal>
| "registerlb" <string literal>
| "repo" <string literal>
| "template" <string literal>
| "package" <string literal>
| "database type" <string literal>
| "database url" <string literal>
| "url" <string literal>
| "ref" <string literal>
| "subnets" <string literal>
| "security groups" <string literal>
| "config" <string literal>
| "index" <string literal>
| "logs" <string literal>
| "metrics" <string literal>
<resourceEntities> ::= (INDENT ("entity" <string literal>
INDENT ("field" <string literal> "type" <string literal>)+ DEDENT)+ DEDENT)?
<serviceEntititesVolumesEnvs> ::= (INDENT (
"entity" <string literal>
INDENT ("field" <string literal> "type" <string literal>)+ DEDENT
| "volume" <string literal> "runat" <string literal>
| "env" <string literal> ("value" | "secret") <string literal>
| "consume" <string literal>
| "publish" <string literal>
| <pipelineReference>
)+ DEDENT)?
<vpcContent> ::= "vm" <string literal> "type" <string literal> "image" <string literal>
<statement> ::= "exit"
| "read input" (<identifier> ",")* <identifier>
| "call service" <identifier> "with" <stringLiteral> ("into" <identifier> | <string literal>)
| "switch" ":" INDENT (<ifThen>)+ [otherwiseThen] DEDENT
<ifThen> ::= <condition> "->" INDENT <block> DEDENT
<otherwiseThen> ::= "otherwise" "->" INDENT <block> DEDENT
<condition> ::= <identifier> "==" <stringLiteral>
<testSuiteStatement> ::= "test suite" <string literal>
["type" <testSuiteType>]
INDENT (
<testCaseStatement>
| <generateTestCasesStatement>
)+ DEDENT
<testSuiteType> ::= "unit" | "integration"
<testCaseStatement> ::= "test case" <string literal>
"target" <string literal>
["description" <string literal>]
["input" <string literal>]
["expect" <string literal>]
["assert" <assertionBlock>]
["mock" <mockBlock>]
["setup" <string literal>]
["teardown" <string literal>]
<generateTestCasesStatement> ::= "generate cases from" <string literal>
["mode" <testSuiteType>]
["strategy" <generationStrategy>]
["include" <string literal>+]
<generationStrategy> ::= "introspect endpoints"
| "trace event flow"
| "simulate inputs"
<assertionBlock> ::= INDENT <assertionStatement>+ DEDENT
<assertionStatement> ::= "equals" <string literal> <string literal>
| "contains" <string literal>
| "matches" <string literal>
<mockBlock> ::= INDENT ("mock" <string literal> <string literal>)+ DEDENT
<observabilityStatement> ::= "observability" INDENT
(<metricDefinition> | <dashboardDefinition>)+
DEDENT
<metricDefinition> ::= "metric" <string literal>
"source" <string literal>
["unit" <string literal>]
["type" <metricType>]
["aggregation" <aggregationType>]
["interval" <string literal>]
["namespace" <string literal>]
["dimensions" INDENT (<string literal> <string literal>)+ DEDENT]
<metricType> ::= "counter" | "gauge" | "histogram" | "latency"
<aggregationType> ::= "average" | "sum" | "min" | "max" | "percentile"
<dashboardDefinition> ::= "dashboard" <string literal>
INDENT <widgetDefinition>+ DEDENT
<widgetDefinition> ::= "widget" <string literal>
"type" <widgetType>
"metric" <string literal>
["visual" <visualType>]
["dimensions" INDENT (<string literal> <string literal>)+ DEDENT]
<widgetType> ::= "metric" | "log" | "text" | "alarm"
<visualType> ::= "line" | "bar" | "number" | "gauge" | "area"
<pipelineReference> ::= "pipeline" <string literal>
"type" <string literal>
"role" <string literal>
"secret" <string literal>
"config" <string literal>
<contextPipelineDefinition> ::= "pipeline" <string literal>
"strategy" <deploymentStrategy>
["clouds" <string literal>+]
["include" <string literal>+]
["exclude" <string literal>+]
"type" <string literal>
"role" <string literal>
"secret" <string literal>
"config" <string literal>
<deploymentStrategy> ::= "blue-green" | "rolling" | "manual"
Observability statement example:
cloud "ml-service" type "Azure"
container service "model-server"
image "ghcr.io/example/model:latest"
logs "azure-logs"
metrics "azure-metrics"
observability
metric "inference-count"
source "container service:model-server"
unit "Count"
type "counter"
aggregation "sum"
interval "1m"
namespace "ml-service"
dashboard "model-insights"
widget "inference-volume"
type "metric"
metric "inference-count"
visual "bar"
dimensions
env "prod"
Agent and observability statements example:
cloud "ai-platform" type "AWS"
agent "chat-assistant"
model "anthropic.claude-v2"
prompt """
You are a helpful assistant.
Always answer in a concise and polite tone, and never disclose internal logic.
"""
tools "faq-search" "order-status"
memory "session"
guardrails "safety-v1"
orchestration "react"
collaboration "multi-agent"
a2a "enabled"
mcp "client"
observability
metric "chat-invocations"
source "agent:chat-assistant"
unit "Count"
type "counter"
aggregation "sum"
interval "1m"
namespace "ai-platform/chat"
dimensions
env "production"
region "us-east-1"
metric "chat-latency"
source "agent:chat-assistant"
unit "Milliseconds"
type "latency"
aggregation "average"
interval "1m"
namespace "ai-platform/chat"
dimensions
env "production"
region "us-east-1"
monitoring dashboard "chat-agent-observability"
widget "invocation-count"
type "metric"
metric "chat-invocations"
visual "bar"
dimensions
env "production"
widget "response-latency"
type "metric"
metric "chat-latency"
visual "line"
dimensions
env "production"
cloud "ai-azure-platform" type "Azure"
container service "user-api"
image "ghcr.io/example/user-api:latest"
logs "log-user-api"
metrics "metric-user-api"
agent "chat-assistant"
model "azure-openai:gpt-4"
prompt "You are a helpful assistant"
tools "faq-search"
memory "short-term"
orchestration "simple"
observability
metric "user-api-requests"
source "container service:user-api"
unit "Count"
type "counter"
aggregation "sum"
interval "1m"
namespace "ai-azure/user-api"
dimensions
env "production"
region "westeurope"
metric "agent-latency"
source "agent:chat-assistant"
unit "Milliseconds"
type "latency"
aggregation "average"
interval "1m"
namespace "ai-azure/agent"
dimensions
env "production"
region "westeurope"
dashboard "azure-monitor-ai"
platform "azure-monitor"
widget "request-volume"
type "metric"
metric "user-api-requests"
visual "bar"
dimensions
env "production"
widget "assistant-latency"
type "metric"
metric "agent-latency"
visual "line"
dimensions
env "production"
Messaging channels and bindings example:
cloud "event-stack" type "AWS"
queue "incoming-tasks"
type "sqs"
visibility timeout "30s"
stream "task-stream"
type "msk"
consumer group "analytics-service"
subscribe to "task-topic"
from "latest"
topic "notifications"
type "sns"
retention "2d"
lambda "task-processor"
template "basic"
ref "task-stream"
index "main"
logs "log-group"
metrics "lambda-metrics"
consume "incoming-tasks"
publish "task-stream"
container service "notifier"
image "ghcr.io/example/notifier"
consume "task-stream"
publish "notifications"
agent "support-bot"
model "bedrock.anthropic.claude-v2"
prompt "You are a helpful assistant."
tools "ticket-checker"
consume "notifications"
Deployment pipeline example:
context "ai-platform-prod"
pipeline "deploy-ai-stack"
strategy "blue-green"
clouds "ai-inference" "analytics"
include "agent:chat-assistant" "container service:user-api"
type "github-actions"
role "ci-role"
secret "gh-token"
config ".github/workflows/deploy-bluegreen.yml"
cloud "ai-inference" type "AWS"
agent "chat-assistant"
model "bedrock.claude-v2"
prompt "You are helpful."
tools "faq"
memory "session"
publish "events"
cloud "analytics" type "Azure"
container service "event-logger"
image "ghcr.io/example/logger"
consume "events"
Context-Level Integration Test Suite
context "ai-platform-stack"
test suite "integration-tests"
type "integration"
generate cases from "agent:chat-assistant"
mode "integration"
strategy "trace event flow"
include "greeting" "fallback" "metrics"
generate cases from "stream:task-events"
mode "integration"
strategy "simulate inputs"
include "task_created" "task_processed"
Service-level Unit Test Suite
cloud "ml-backend" type "AWS"
container service "predictor"
image "ghcr.io/ml/predictor"
logs "log-predictor"
metrics "predictor-metrics"
test suite "predictor-unit-tests"
type "unit"
generate cases from "container service:predictor"
mode "unit"
strategy "introspect endpoints"
include "predict" "healthcheck"