Workflow Copilot: update knowledge base (#4448)

This commit is contained in:
Stanislav Novosad
2026-01-14 10:48:55 -07:00
committed by GitHub
parent f7970bab32
commit 42af2fd96c

View File

@@ -11,8 +11,8 @@ title: "<workflow title>"
description: "<optional description>"
workflow_definition:
version: 2 # IMPORTANT: Always use version 2
parameters: []
blocks: []
parameters: []
webhook_callback_url: "<optional_https_url>" # Optional: Webhook URL to receive workflow run updates
Key Concepts:
@@ -34,13 +34,18 @@ workflow_parameter_type: <string|integer|float|boolean|json|file_url|credential_
description: <optional description>
default_value: <optional default>
Define exactly one parameters list under workflow_definition.
Example:
parameters:
- parameter_type: workflow
key: search_query
workflow_parameter_type: string
description: "Search term to use"
default_value: "example"
workflow_definition:
version: 2
blocks: []
parameters:
- parameter_type: workflow
key: search_query
workflow_parameter_type: string
description: "Search term to use"
default_value: "example"
* OUTPUT PARAMETERS (block outputs)
parameter_type: output
@@ -61,18 +66,18 @@ Using Parameters in Blocks:
Example:
workflow_definition:
version: 2
parameters:
- key: topics_count
description: null
parameter_type: workflow
workflow_parameter_type: integer
default_value: "3"
blocks:
- label: block_1
block_type: task_v2
prompt: Give me top {{topics_count}} news items
url: https://news.ycombinator.com/
next_block_label: null
parameters:
- key: topics_count
description: null
parameter_type: workflow
workflow_parameter_type: integer
default_value: "3"
** COMMON BLOCK FIELDS **
@@ -123,15 +128,21 @@ Use Cases:
- Execute focused browser tasks with clear completion criteria
Example:
blocks:
- block_type: navigation
label: search_and_open
next_block_label: null
url: "https://example.com/search"
navigation_goal: "Search for {{ query }} and click the first result"
parameter_keys:
- query
max_retries: 2
workflow_definition:
version: 2
blocks:
- block_type: navigation
label: search_and_open
next_block_label: null
url: "https://example.com/search"
navigation_goal: "Search for {{ query }} and click the first result"
parameter_keys:
- query
max_retries: 2
parameters:
- parameter_type: workflow
key: query
workflow_parameter_type: string
** URL BLOCK (goto_url) **
@@ -222,6 +233,82 @@ blocks:
prompt: "Book a flight from {{ origin }} to {{ destination }} on {{ date }}. Return the booking confirmation number."
max_iterations: 10
** FOR LOOP BLOCK (for_loop) **
Purpose: Iterate over a list of values and run a sequence of blocks for each item.
Structure:
block_type: for_loop
label: <unique_label>
loop_blocks: [] # Required: Blocks to run for each iteration
loop_over_parameter_key: <param_key> # Optional: Parameter key that resolves to a list
loop_variable_reference: <jinja|path> # Optional: Jinja2 or output path to resolve a list
complete_if_empty: false # Optional: Complete successfully when list is empty
Important Notes:
- Provide either loop_over_parameter_key or loop_variable_reference
- Loop blocks must use next_block_label to chain within the loop
- Each iteration exposes {{ current_value }}, {{ current_item }}, and {{ current_index }}
Example:
parameters:
- parameter_type: workflow
key: urls
workflow_parameter_type: json
default_value:
- "https://example.com/a"
- "https://example.com/b"
blocks:
- block_type: for_loop
label: visit_urls
next_block_label: null
loop_over_parameter_key: urls
loop_blocks:
- block_type: goto_url
label: open_url
next_block_label: null
url: "{{ current_value }}"
** CONDITIONAL BLOCK (conditional) **
Purpose: Branch to different blocks based on ordered conditions.
Structure:
block_type: conditional
label: <unique_label>
branch_conditions: [] # Required: Ordered list of branch conditions
Branch Condition Structure:
criteria: # Optional for default branch
criteria_type: <jinja2_template|prompt> # Optional: inferred when omitted
expression: <expression> # Required when criteria present
description: <optional description>
next_block_label: <label|null> # Optional: Label to execute when matched
description: <optional description>
is_default: false # Required when criteria is omitted
Important Notes:
- At least one branch is required
- Branches are evaluated in order; first match wins
- Only one default branch is allowed
- Branches without criteria must set is_default: true
Example:
blocks:
- block_type: conditional
label: route_by_status
next_block_label: null
branch_conditions:
- criteria:
criteria_type: jinja2_template
expression: "{{ account_status == 'active' }}"
next_block_label: handle_active
description: "Active accounts"
is_default: false
- is_default: true
next_block_label: handle_inactive
description: "Fallback for all other states"
** LOGIN BLOCK (login) **
Purpose: Handle authentication flows including username/password and TOTP/2FA.
@@ -251,20 +338,22 @@ Important Notes:
- TOTP is automatically handled if the credential parameter has TOTP configured
Example:
parameters:
- parameter_type: workflow
workflow_parameter_type: credential_id
key: my_credentials
default_value: "cred_uuid_here"
blocks:
- block_type: login
label: login_to_portal
next_block_label: null
url: "https://portal.example.com/login"
parameter_keys:
- my_credentials # This must match a 'key' from the parameters list above
complete_criterion: "Current URL is 'https://portal.example.com/dashboard'"
max_retries: 2
workflow_definition:
version: 2
blocks:
- block_type: login
label: login_to_portal
next_block_label: null
url: "https://portal.example.com/login"
parameter_keys:
- my_credentials # This must match a 'key' from the parameters list above
complete_criterion: "Current URL is 'https://portal.example.com/dashboard'"
max_retries: 2
parameters:
- parameter_type: workflow
workflow_parameter_type: credential_id
key: my_credentials
default_value: "cred_uuid_here"
** VALIDATION BLOCK (validation) **
@@ -292,6 +381,22 @@ blocks:
complete_criterion: "Page contains 'Thank you for your submission'"
terminate_criterion: "Page contains 'Error' or 'Try again'"
** WAIT BLOCK (wait) **
Purpose: Pause workflow execution for a specified duration.
Structure:
block_type: wait
label: <unique_label>
wait_sec: <seconds> # Required: Number of seconds to wait
Example:
blocks:
- block_type: wait
label: wait_for_processing
next_block_label: check_results
wait_sec: 30
** EXTRACTION BLOCK (extraction) **
Purpose: Extract structured data from the current page without navigation.
@@ -501,17 +606,23 @@ Use Cases:
- Generate classifications or tags
Example:
blocks:
- block_type: text_prompt
label: summarize_notes
next_block_label: null
prompt: "Summarize these notes: {{ notes }}"
json_schema:
type: object
properties:
summary: {type: string}
action_items: {type: array, items: {type: string}}
parameter_keys: [notes]
workflow_definition:
version: 2
blocks:
- block_type: text_prompt
label: summarize_notes
next_block_label: null
prompt: "Summarize these notes: {{ notes }}"
json_schema:
type: object
properties:
summary: {type: string}
action_items: {type: array, items: {type: string}}
parameter_keys: [notes]
parameters:
- parameter_type: workflow
key: notes
workflow_parameter_type: string
** HTTP REQUEST BLOCK (http_request) **
@@ -535,17 +646,26 @@ Use Cases:
- Upload files via multipart requests
Example:
blocks:
- block_type: http_request
label: lookup_customer
next_block_label: null
method: "POST"
url: "https://api.example.com/customers/search"
headers:
Authorization: "Bearer {{ api_token }}"
body:
email: "{{ customer_email }}"
parameter_keys: [api_token, customer_email]
workflow_definition:
version: 2
blocks:
- block_type: http_request
label: lookup_customer
next_block_label: null
method: "POST"
url: "https://api.example.com/customers/search"
headers:
Authorization: "Bearer {{ api_token }}"
body:
email: "{{ customer_email }}"
parameter_keys: [api_token, customer_email]
parameters:
- parameter_type: workflow
key: api_token
workflow_parameter_type: string
- parameter_type: workflow
key: customer_email
workflow_parameter_type: string
** PARAMETER TEMPLATING **
@@ -682,82 +802,107 @@ blocks:
** COMMON PATTERNS **
Pattern 1: Login → Navigate → Extract
parameters:
- parameter_type: workflow
workflow_parameter_type: credential_id
key: my_credentials
default_value: "uuid"
- parameter_type: output
key: extracted_data
blocks:
- block_type: login
label: authenticate
next_block_label: go_to_reports
url: "https://app.example.com/login"
parameter_keys: [my_credentials]
- block_type: navigation
label: go_to_reports
next_block_label: get_report_data
navigation_goal: "Navigate to Reports section"
- block_type: extraction
label: get_report_data
next_block_label: null
data_extraction_goal: "Extract all report entries"
data_schema:
type: array
items: {type: object}
workflow_definition:
version: 2
blocks:
- block_type: login
label: authenticate
next_block_label: go_to_reports
url: "https://app.example.com/login"
parameter_keys: [my_credentials]
- block_type: navigation
label: go_to_reports
next_block_label: get_report_data
navigation_goal: "Navigate to Reports section"
- block_type: extraction
label: get_report_data
next_block_label: null
data_extraction_goal: "Extract all report entries"
data_schema:
type: array
items: {type: object}
parameters:
- parameter_type: workflow
workflow_parameter_type: credential_id
key: my_credentials
default_value: "uuid"
- parameter_type: output
key: extracted_data
Pattern 2: Search with Dynamic Input
parameters:
- parameter_type: workflow
key: search_query
workflow_parameter_type: string
blocks:
- block_type: task_v2
label: search_and_extract
next_block_label: null
url: "https://example.com"
prompt: "Search for '{{ search_query }}' and extract the first 10 results with titles and URLs"
workflow_definition:
version: 2
blocks:
- block_type: task_v2
label: search_and_extract
next_block_label: null
url: "https://example.com"
prompt: "Search for '{{ search_query }}' and extract the first 10 results with titles and URLs"
parameters:
- parameter_type: workflow
key: search_query
workflow_parameter_type: string
Pattern 3: Multi-Step Form Filling
blocks:
- block_type: goto_url
label: open_form
next_block_label: fill_personal_info
url: "https://forms.example.com/application"
- block_type: navigation
label: fill_personal_info
next_block_label: fill_address
navigation_goal: "Fill in name as {{ name }}, email as {{ email }}"
parameter_keys: [name, email]
- block_type: navigation
label: fill_address
next_block_label: submit
navigation_goal: "Fill in address fields and click Continue"
parameter_keys: [address, city, zip]
- block_type: navigation
label: submit
next_block_label: null
navigation_goal: "Review information and click Submit"
workflow_definition:
version: 2
blocks:
- block_type: goto_url
label: open_form
next_block_label: fill_personal_info
url: "https://forms.example.com/application"
- block_type: navigation
label: fill_personal_info
next_block_label: fill_address
navigation_goal: "Fill in name as {{ name }}, email as {{ email }}"
parameter_keys: [name, email]
- block_type: navigation
label: fill_address
next_block_label: submit
navigation_goal: "Fill in address fields and click Continue"
parameter_keys: [address, city, zip]
- block_type: navigation
label: submit
next_block_label: null
navigation_goal: "Review information and click Submit"
parameters:
- parameter_type: workflow
key: name
workflow_parameter_type: string
- parameter_type: workflow
key: email
workflow_parameter_type: string
- parameter_type: workflow
key: address
workflow_parameter_type: string
- parameter_type: workflow
key: city
workflow_parameter_type: string
- parameter_type: workflow
key: zip
workflow_parameter_type: string
Pattern 4: Conditional Extraction
blocks:
- block_type: navigation
label: search_product
next_block_label: check_availability
navigation_goal: "Search for {{ product }}"
- block_type: extraction
label: check_availability
next_block_label: add_to_cart
data_extraction_goal: "Check if product is in stock"
data_schema:
type: object
properties:
in_stock: {type: boolean}
- block_type: navigation
label: add_to_cart
next_block_label: null
navigation_goal: "If product is in stock, add to cart"
workflow_definition:
version: 2
blocks:
- block_type: navigation
label: search_product
next_block_label: check_availability
navigation_goal: "Search for {{ product }}"
- block_type: extraction
label: check_availability
next_block_label: add_to_cart
data_extraction_goal: "Check if product is in stock"
data_schema:
type: object
properties:
in_stock: {type: boolean}
- block_type: navigation
label: add_to_cart
next_block_label: null
navigation_goal: "If product is in stock, add to cart"
parameters: []
** VALIDATION RULES **
@@ -787,22 +932,6 @@ title: E-commerce Product Search and Purchase
description: Search for a product, extract details, and add to cart
workflow_definition:
version: 2
parameters:
- parameter_type: workflow
key: product_name
workflow_parameter_type: string
description: "Product to search for"
- parameter_type: workflow
key: max_price
workflow_parameter_type: float
description: "Maximum price willing to pay"
- parameter_type: workflow
workflow_parameter_type: credential_id
key: account_creds
default_value: "cred_12345"
- parameter_type: output
key: product_details
description: "Extracted product information"
blocks:
- block_type: login
label: login_to_store
@@ -839,5 +968,21 @@ workflow_definition:
next_block_label: null
prompt: "Click on the first available product and add it to cart"
max_iterations: 5
parameters:
- parameter_type: workflow
key: product_name
workflow_parameter_type: string
description: "Product to search for"
- parameter_type: workflow
key: max_price
workflow_parameter_type: float
description: "Maximum price willing to pay"
- parameter_type: workflow
workflow_parameter_type: credential_id
key: account_creds
default_value: "cred_12345"
- parameter_type: output
key: product_details
description: "Extracted product information"
END OF KNOWLEDGE BASE