Перейти до основного вмісту
Версія: 2.0

Sample App

https://github.com/durable-workflow/sample-app

Це галерея вбудованого Laravel: приклад застосунку Laravel 13 на стабільній лінійці Durable Workflow 2.0 із workflow для запуску в GitHub Codespace. Починайте тут, якщо ваша модель розгортання — вбудований Laravel і ви хочете разом переглянути виконання черг Laravel та Waterline.

Оберіть приклади відповідно до runtime:

Модель розгортанняШлях прикладу
Durable Workflow CloudПочніть із керованого runtime Cloud, потім оберіть посібник SDK PHP, Python або Rust із наданими обліковими даними простору імен. Користувачі Cloud не запускають Server.
Власний сервісний режимВикористовуйте швидкий старт Durable Workflow 2.0 для повних прикладів PHP, Python і Rust на опублікованих артефактах із локальним Server.
Вбудований LaravelПродовжуйте з цією галереєю та вбудованим встановленням.

Галерея дає наскрізні докази роботи рушія в Laravel. Це перше місце реалістичного покриття вбудованих можливостей Laravel і джерело прикладів природних для Laravel шаблонів на цьому сайті. Для сервісних і міжмовних розгортань використовуйте відповідні приклади вище. Якщо хочете поділитися шаблоном durable-workflow, посібник додавання прикладу пояснює процес.

Шукаєте версію Laravel 12 / Durable Workflow 1.x? Її збережено на гілці Laravel-12. Старі дописи й посібники з шаблонами v1, як Workflow\Workflow, yield activity(...), Workflow\Activity, стосуються цієї гілки.

Кожен запис називає шаблон, який викладає приклад, клас workflow, що його виконує, команду Artisan для запуску й екран Waterline, що доводить фіксацію run. Галерея відтворює «Sample Index» README репозиторію sample-app. Після додавання чи переміщення прикладу README та галерея змінюються разом.

ШаблонКлас workflowКомандаЕкран Waterline
Найменший детермінований workflow v2App\Workflows\Simple\SimpleWorkflowphp artisan app:workflowСписок run → деталі run із двома подіями activity та подією WorkflowCompleted
Стійке вимірювання тривалості без розбіжностей replayApp\Workflows\Elapsed\ElapsedTimeWorkflowphp artisan app:elapsedДеталі run із двома SideEffectRecorded для читання часу sideEffect навколо події TimerFired
Координація між Laravel-застосункамиApp\Workflows\Microservice\MicroserviceWorkflowphp artisan app:microserviceДеталі run із подіями activity та маршрутизацією черг між worker застосунку й мікросервісу
Автоматизація браузера зі збереженими результатамиApp\Workflows\Playwright\CheckConsoleErrorsWorkflowphp artisan app:playwrightДеталі run з activity Playwright, activity FFmpeg і activity очищення в порядку виконання
Запуск workflow webhook з очікуванням signalApp\Workflows\Webhooks\WebhookWorkflowphp artisan app:webhookДеталі run із WorkflowStarted від входу webhook і подією SignalReceived для ready
Цикл activity AI зі стійкою повторною спробою/перевіркоюApp\Workflows\Prism\PrismWorkflowphp artisan app:prismДеталі run із повторними спробами activity та ActivityCompleted, що задовольняє валідатор
AI-агент із signal та компенсацією sagaApp\Workflows\Ai\AiWorkflowphp artisan app:aiДеталі run із посиланням потоку повідомлень, історією update та activity компенсації після помилки saga

Стовпець екрана Waterline називає очікувані події здорового run. Якщо однієї немає локально, ця прогалина допомагає швидко знайти проблему worker або середовища.

Сторінки шаблонів цього сайту ведуть прямо до workflow прикладу, який виконує відповідну можливість. Використовуйте таблицю для переходу від сторінки шаблону до виконуваного workflow.

Сторінка шаблонуWorkflow прикладу
SagaApp\Workflows\Ai\AiWorkflow (php artisan app:ai)
SignalApp\Workflows\Webhooks\WebhookWorkflow (php artisan app:webhook)
Потоки повідомленьApp\Workflows\Ai\AiWorkflow (php artisan app:ai)
Дочірні workflowОкремого запису галереї ще немає. Використовуйте посібник дочірніх workflow.
Side effectApp\Workflows\Elapsed\ElapsedTimeWorkflow (php artisan app:elapsed)
WebhookApp\Workflows\Webhooks\WebhookWorkflow (php artisan app:webhook)
Workflow MCPУсі записи галереї відкриті через config/workflow_mcp.php

Крок 1

Створіть codespace з гілки main цього репозиторію.

Створення codespace

Крок 2

Після створення codespace дочекайтеся його збірки. Зазвичай це триває від 5 до 10 хвилин.

Крок 3

Після завершення ви побачите редактор і термінал унизу.

Редактор і термінал

Крок 4

Виконайте composer install.

composer install

Крок 5

Виконайте init для налаштування застосунку, встановлення додаткових залежностей і міграцій.

php artisan app:init

Шлях php artisan migrate sample-app безпосередньо підхоплює міграції пакетів Workflow і Waterline, тому всі таблиці та збережені подання Waterline готові після звичайного встановлення.

Крок 6

Запустіть worker черги. Це дозволить обробляти workflow та activity.

php artisan queue:work

Для перевірки самого циклу відновлення без очікування наступного циклу Looping зайнятого worker виконайте один явний прохід відновлення з другого термінала:

php artisan workflow:v2:repair-pass

Команда використовує ту саму політику пошуку й backoff, що й цикл worker. Вона корисна після виправлення локальної проблеми черги/backend, для перевірки сценарію втраченого завдання або codespace з малим трафіком, що довго очікує наступний прохід. Додайте --run-id=... для обмеження одним або кількома обраними run під час експерименту чи --instance-id=... для всього екземпляра.

Крок 7

Створіть нове вікно термінала.

Новий термінал

Крок 8

Запустіть workflow прикладу в новому терміналі.

php artisan app:workflow

Крок 9

Панель Waterline доступна за адресою https://[your-codespace-name]-80.preview.app.github.dev/waterline/dashboard.

Панель Waterline

Waterline показує стійкий стан: чи почався workflow, який run поточний, які типізовані події історії зафіксовані, які очікування відкриті та які дії оператора доступні. Телеметрія worker окрема: затримка опитування, тривалість завдань, налаштування exporter, власні метрики застосунку та помилки процесу походять із журналів worker PHP або endpoint метрик SDK зовнішнього worker.

ІнтерфейсНа що відповідаєПеревірка прикладу
Waterline та експорт історіїСтійкий статус workflow, історія, повторні спроби, очікування, signal, update, помилки й дії оператораВідкрийте /waterline/dashboard і експортуйте історію обраного run
Журнали workerПомилки процесу worker черги PHP та рядки журналу застосункуПереглядайте storage/logs/laravel.log під час роботи php artisan queue:work
Метрики SDKКількість запитів зовнішнього worker/клієнта, затримка опитування й тривалість завданьЗчитайте endpoint Prometheus/OpenMetrics worker SDK

Для worker Python встановіть додаткову підтримку Prometheus і відкрийте метрики з його процесу:

pip install 'durable-workflow[prometheus]'
from prometheus_client import start_http_server

from durable_workflow import Client, PrometheusMetrics, Worker

metrics = PrometheusMetrics()
start_http_server(9102)

async with Client("http://localhost:8080", token="secret", metrics=metrics) as client:
worker = Worker(
client,
task_queue="default",
workflows=[GreeterWorkflow],
activities=[greet],
metrics=metrics,
)
await worker.run()

Замініть GreeterWorkflow і greet на обробники workflow та activity, зареєстровані цим worker.

Зчитуйте :9102/metrics для рядів durable_workflow_worker_* і durable_workflow_client_*. Вони пояснюють продуктивність runtime worker, а Waterline визначає зафіксовану історію workflow.

Екран деталей Waterline має дію «Export History» для обраного run. Коли показаний поточний run екземпляра, кнопка використовує маршрут експорту поточного run екземпляра. Деталі історичного run використовують явний /runs/{runId}/history-export. Той самий пакет replay/налагодження можна експортувати з термінала sample-app:

php artisan workflow:v2:history-export {workflow-instance-id} --run-id={workflow-run-id} --output=storage/app/workflow-history/example.json --pretty

Експорт містить контрольну суму цілісності SHA-256. Задайте DW_V2_HISTORY_EXPORT_SIGNING_KEY і DW_V2_HISTORY_EXPORT_SIGNING_KEY_ID у середовищі застосунку, якщо іншій системі потрібно перевіряти пакет підписом HMAC.

Експортований блок selected_run містить waits_projection_source, timeline_projection_source, timers_projection_source і lineage_projection_source. Блок links також містить projection_source. Розділи links.parents / links.children спочатку походять із типізованої історії лінії походження обраного run. Зв’язки дочірніх workflow та continue-as-new залишаються видимими в пакеті, навіть якщо змінювані рядки зв’язків розійшлися під час локального експерименту. Коли рядок лінії походження зберігається лише через старі змінювані дані сумісності, пакет позначає його history_authority = mutable_open_fallback і diagnostic_only = true без прихованого відновлення додаткових метаданих зв’язків під час експорту.

Потоки повідомлень AI workflow​

Workflow з повторюваним вводом AI або людини мають використовувати основний фасад потоків повідомлень v2 як шаблон написання:

$reply = $this->inbox('ai.assistant')->receiveOne();

$this->outbox('ai.assistant')->sendReference(
targetInstanceId: $this->workflowId(),
payloadReference: $storedReplyReference,
correlationId: $requestId,
);

Великі тіла запитів/відповідей залишайте у сховищі payload застосунку, передаючи збережене посилання через потік. Нові приклади workflow не повинні прямо записувати workflow_messages, MessageStreamCursor або викликати MessageService. Стабільний контракт вхідної/вихідної скриньки v2 наведено в потоках повідомлень.

Крок 10

Виконайте тести workflow та activity.

vendor/bin/phpunit

Тепер ви можете створювати й тестувати workflow.

MCP-сервер AI-клієнта​

Sample App також надає сервер Laravel MCP за /mcp/workflows. Це еталонний інтерфейс AI-клієнта Durable Workflow v2: він надає агентам структуроване виявлення workflow, запуск, статус, вивід, недавню типізовану історію та факти помилок без зчитування Waterline.

Докладний контракт endpoint та інструментів наведено в інтерфейсі workflow MCP. Ширший контракт розробки за допомогою AI, зокрема маніфести LLM v2, коди завершення CLI, експорти Waterline та довідники SDK, наведено в розробці за допомогою AI.

Пакет Laravel MCP реєструє сервер у routes/ai.php. Відкриті ключі workflow задані в config/workflow_mcp.php. Кожен запис може містити клас workflow та метадані виявлення: опис, вимоги до облікових даних і очікувані аргументи.

Типові інструменти:

ІнструментПризначення
list_workflowsПерелічує налаштовані ключі workflow, вимоги до облікових даних, значення статусу v2 і за потреби недавні run.
start_workflowЗапускає налаштований workflow v2 і повертає workflow_id, run_id, статус, бізнес-ключ і результат команди.
get_workflow_resultОпитує поточний або обраний run і повертає статус, вивід, метадані видимості й останній опис помилки.
get_workflow_historyПовертає обмежений кінець типізованої історії v2 та останні стійкі помилки для діагностики.
diagnose_workflowКласифікує обраний run зі структурованими фактами, першопричиною, способом усунення й наступними діями.
repair_workflowЗапитує вбудовану команду відновлення v2 та повертає структурований результат зміни: прийнято, відмовлено або не потрібно.

Типовий цикл агента:

{"tool": "list_workflows", "arguments": {"show_recent": true, "limit": 5}}
{"tool": "start_workflow", "arguments": {"workflow": "simple", "business_key": "demo-001"}}
{"tool": "get_workflow_result", "arguments": {"workflow_id": "<workflow_id>"}}
{"tool": "get_workflow_history", "arguments": {"run_id": "<run_id>", "limit": 25}}

Використовуйте simple або elapsed для smoke-тестів без облікових даних. Workflow prism відкритий як приклад AI, але потребує OPENAI_API_KEY для завершення worker.