* docs(hub): document durable workflow routing * docs(hub): make workflow guide progressive
237 lines
6.3 KiB
Markdown
237 lines
6.3 KiB
Markdown
---
|
|
title: Hub examples
|
|
description: Copyable Hub workflow configurations for typed routing, classification, direct answers, implementations, and provider replies.
|
|
nav: Examples
|
|
order: 70
|
|
category: Hub
|
|
---
|
|
|
|
# Hub examples
|
|
|
|
These examples use the durable step syntax. Replace the daemon, paths, provider identifiers, and provider filters with resources in your organization. The shared workflow page explains the contract behind each pattern.
|
|
|
|
## Model and provider selection
|
|
|
|
Use finite choices when caller input selects an agent provider or model.
|
|
|
|
```yaml
|
|
environments:
|
|
- name: development
|
|
kind: daemon
|
|
daemon: my-macbook
|
|
cwd: /Users/you/code/project
|
|
|
|
triggers:
|
|
- name: selectable-agent
|
|
on: manual.run
|
|
max_runtime: 2h
|
|
filters:
|
|
from_users: [automation]
|
|
inputs:
|
|
provider:
|
|
type: string
|
|
default: codex
|
|
choices: [codex, claude]
|
|
model:
|
|
type: string
|
|
default: standard
|
|
choices: [standard, fast]
|
|
steps:
|
|
- id: work
|
|
environment: development
|
|
max_runtime: 90m
|
|
idle_timeout: 10m
|
|
agent:
|
|
provider: ${{ paseo.inputs.provider }}
|
|
model: ${{ paseo.inputs.model }}
|
|
mode: full-access
|
|
prompt:
|
|
- text: ${{ paseo.prompt }}
|
|
```
|
|
|
|
Invoke it with `provider=claude model=fast investigate the sync`. An undeclared leading key stops header parsing and becomes prompt text.
|
|
|
|
## Repository routing
|
|
|
|
Use a declared input plus `filters.inputs` when separate triggers should own separate repositories or projects.
|
|
|
|
```yaml
|
|
environments:
|
|
- name: project
|
|
kind: daemon
|
|
daemon: my-macbook
|
|
cwd: /Users/you/code/project
|
|
- name: paseo
|
|
kind: daemon
|
|
daemon: my-macbook
|
|
cwd: /Users/you/code/paseo
|
|
|
|
triggers:
|
|
- name: project-request
|
|
on: slack.mention
|
|
max_runtime: 2h
|
|
filters:
|
|
workspace: T01234567
|
|
from_users: [U01234567]
|
|
inputs: { repo: project }
|
|
inputs:
|
|
repo:
|
|
type: string
|
|
choices: [project, paseo]
|
|
steps:
|
|
- id: project-work
|
|
environment: project
|
|
max_runtime: 90m
|
|
idle_timeout: 10m
|
|
agent:
|
|
provider: codex
|
|
mode: full-access
|
|
prompt:
|
|
- text: ${{ paseo.prompt }}
|
|
allow_outputs:
|
|
- type: slack.reply
|
|
max: 5
|
|
|
|
- name: paseo-request
|
|
on: slack.mention
|
|
max_runtime: 2h
|
|
filters:
|
|
workspace: T01234567
|
|
from_users: [U01234567]
|
|
inputs: { repo: paseo }
|
|
inputs:
|
|
repo:
|
|
type: string
|
|
choices: [project, paseo]
|
|
steps:
|
|
- id: paseo-work
|
|
environment: paseo
|
|
max_runtime: 90m
|
|
idle_timeout: 10m
|
|
agent:
|
|
provider: codex
|
|
mode: full-access
|
|
prompt:
|
|
- text: ${{ paseo.prompt }}
|
|
allow_outputs:
|
|
- type: slack.reply
|
|
max: 5
|
|
```
|
|
|
|
The same event can match multiple triggers, so the input filters make these routes exclusive.
|
|
|
|
## Safety gate and direct answer
|
|
|
|
For a request that may either be answered or implemented, let a read-only classifier choose a finite branch. Supplying `kind=answer` or `kind=implementation` skips classification.
|
|
|
|
```yaml
|
|
environments:
|
|
- name: development
|
|
kind: daemon
|
|
daemon: my-macbook
|
|
cwd: /Users/you/code/project
|
|
|
|
triggers:
|
|
- name: request
|
|
on: github.issue_comment
|
|
max_runtime: 2h
|
|
filters:
|
|
repo: example/project
|
|
contains: "@paseo"
|
|
from_users: [maintainer]
|
|
inputs:
|
|
kind:
|
|
type: string
|
|
choices: [answer, implementation]
|
|
steps:
|
|
- id: classify
|
|
if: ${{ paseo.inputs.kind == null }}
|
|
environment: development
|
|
max_runtime: 2m
|
|
idle_timeout: 30s
|
|
agent:
|
|
provider: codex
|
|
mode: read-only
|
|
prompt:
|
|
- text: Classify this request as answer or implementation.
|
|
- text: ${{ paseo.prompt }}
|
|
output:
|
|
schema:
|
|
type: object
|
|
additionalProperties: false
|
|
required: [kind]
|
|
properties:
|
|
kind:
|
|
enum: [answer, implementation]
|
|
|
|
- id: answer
|
|
if: ${{ paseo.inputs.kind == 'answer' || steps.classify.outputs.kind == 'answer' }}
|
|
environment: development
|
|
max_runtime: 10m
|
|
idle_timeout: 2m
|
|
agent:
|
|
provider: codex
|
|
mode: read-only
|
|
prompt:
|
|
- text: Answer the request. Do not change files.
|
|
- text: ${{ paseo.prompt }}
|
|
|
|
- id: implementation
|
|
if: ${{ paseo.inputs.kind == 'implementation' || steps.classify.outputs.kind == 'implementation' }}
|
|
environment: development
|
|
max_runtime: 90m
|
|
idle_timeout: 10m
|
|
agent:
|
|
provider: codex
|
|
mode: full-access
|
|
prompt:
|
|
- text: Implement the request, verify it, and report the result.
|
|
- text: ${{ paseo.prompt }}
|
|
allow_outputs:
|
|
- type: github.reply
|
|
max: 5
|
|
```
|
|
|
|
The answer and implementation conditions cannot both be true for one classification. The workflow ends after the answer step because there is no later matching step.
|
|
|
|
## PR progress and final updates
|
|
|
|
Keep progress and final updates on the implementation step. The step can use up to five replies while it works, then finish normally.
|
|
|
|
```yaml
|
|
environments:
|
|
- name: development
|
|
kind: daemon
|
|
daemon: my-macbook
|
|
cwd: /Users/you/code/project
|
|
|
|
triggers:
|
|
- name: pr-work
|
|
on: github.pull_request_review_comment
|
|
max_runtime: 2h
|
|
filters:
|
|
repo: example/project
|
|
contains: "@paseo"
|
|
from_users: [maintainer]
|
|
steps:
|
|
- id: implement-review
|
|
environment: development
|
|
max_runtime: 90m
|
|
idle_timeout: 10m
|
|
auto_archive: true
|
|
agent:
|
|
provider: codex
|
|
mode: full-access
|
|
prompt:
|
|
- text: |
|
|
Address the review request.
|
|
Request: ${{ paseo.prompt }}
|
|
allow_outputs:
|
|
- type: github.reply
|
|
max: 5
|
|
```
|
|
|
|
For Slack and Discord, use `slack.reply` or `discord.reply` instead. GitHub-triggered agents also receive the scoped GitHub credential for the triggering repository, so the agent can use `gh` for repository updates.
|
|
|
|
See [Hub workflows](/docs/hub/workflows) for partials, deadlines, structured output retry, and provider invocation details.
|