1. Go to this page and download the library: Download sofyco/workflow library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
sofyco / workflow example snippets
enum ArtifactType: string
{
case Image = 'image';
case Audio = 'audio';
case Video = 'video';
case File = 'file'; // text, JSON, HTML, Markdown, CSV, XML, …
}
$registry = new NodeRunnerRegistry([
new InputNodeRunner(),
new PromptNodeRunner($storage, $promptRenderer, $llmGateway),
new TextToSpeechNodeRunner($contentReader, $storage, $ttsRegistry),
new ImageGenerationNodeRunner($contentReader, $storage, $imageRegistry),
new VideoRenderNodeRunner($storage, $videoRenderer),
new FinalOutputNodeRunner($storage),
]);
use Sofyco\Workflow\Application\Artifact\ArtifactContentReader;
use Sofyco\Workflow\Application\Id\UuidIdGenerator;
use Sofyco\Workflow\Application\Llm\PromptRenderer;
use Sofyco\Workflow\Application\NodeRunner\FinalOutputNodeRunner;
use Sofyco\Workflow\Application\NodeRunner\InputNodeRunner;
use Sofyco\Workflow\Application\NodeRunner\NodeRunnerRegistry;
use Sofyco\Workflow\Application\NodeRunner\PromptNodeRunner;
use Sofyco\Workflow\Application\Runtime\ArtifactResolver;
use Sofyco\Workflow\Application\Runtime\CompletionResolver;
use Sofyco\Workflow\Application\Runtime\ConditionEvaluator;
use Sofyco\Workflow\Application\Runtime\ExecutionEventRecorder;
use Sofyco\Workflow\Application\Runtime\FieldAccessor;
use Sofyco\Workflow\Application\Runtime\NodeReadinessResolver;
use Sofyco\Workflow\Application\Runtime\RuntimeContextBuilder;
use Sofyco\Workflow\Application\Runtime\TransitionResolver;
use Sofyco\Workflow\Application\Runtime\WorkflowExecutionService;
use Sofyco\Workflow\Application\Runtime\WorkflowRunService;
use Sofyco\Workflow\Application\Runtime\WorkflowScheduler;
use Sofyco\Workflow\Infrastructure\InMemory\InMemoryArtifactRepository;
use Sofyco\Workflow\Infrastructure\InMemory\InMemoryExecutionEventRepository;
use Sofyco\Workflow\Infrastructure\InMemory\InMemoryNodeExecutionRepository;
use Sofyco\Workflow\Infrastructure\InMemory\InMemoryWorkflowRunRepository;
use Sofyco\Workflow\Infrastructure\InMemory\InMemoryWorkflowVersionRepository;
use Sofyco\Workflow\Infrastructure\Storage\LocalArtifactStorage;
$idGenerator = new UuidIdGenerator();
$runs = new InMemoryWorkflowRunRepository();
$versions = new InMemoryWorkflowVersionRepository();
$nodeExecutions = new InMemoryNodeExecutionRepository();
$artifacts = new InMemoryArtifactRepository();
$events = new InMemoryExecutionEventRepository($idGenerator);
$storage = new LocalArtifactStorage('/tmp/workflow-artifacts', $idGenerator);
$contentReader = new ArtifactContentReader($storage);
// … wire gateways, node runners, runtime services (see WorkflowTestHarness)
$versions->save($myWorkflowVersion);
$run = $runService->start(
workflowId: 'wf_example',
userId: 'user_1',
inputArtifacts: [
'source_text' => [
'type' => 'file',
'mimeType' => 'text/plain',
'extension' => 'txt',
'content' => 'Write a blog post about PHP 8.5.',
],
],
);
$runService->process($run->getId());
// Run status is now Completed; artifacts are in $artifacts repository
[
'alias_name' => [
'type' => 'file', // ArtifactType value
'mimeType' => 'text/plain',
'extension' => 'txt',
'content' => '…', // stored as a file
],
]
use Sofyco\Workflow\Domain\Model\WorkflowEdge;
use Sofyco\Workflow\Domain\Model\WorkflowNode;
use Sofyco\Workflow\Domain\Model\WorkflowPort;
use Sofyco\Workflow\Domain\Model\WorkflowVersion;
use Sofyco\Workflow\Domain\Enum\ArtifactType;
use Sofyco\Workflow\Domain\Enum\NodeType;
$input = new WorkflowNode('input_text', NodeType::Input, 'Input');
$input->addOutputPort(new WorkflowPort(
name: 'source_text',
type: ArtifactType::File,
allowedMimeTypes: ['text/plain'],
));
$prompt = new WorkflowNode('rewrite', NodeType::Prompt, 'Rewrite');
$prompt->addInputPort(new WorkflowPort(
name: 'source_text',
type: ArtifactType::File,
allowedMimeTypes: ['text/plain'],
));
$prompt->addOutputPort(new WorkflowPort(
name: 'story',
type: ArtifactType::File,
allowedMimeTypes: ['text/plain'],
));
$prompt->setSettings([
'model' => 'gpt-4.1-mini',
'systemPrompt' => 'You rewrite text clearly.',
'userPromptTemplate' => '{{ input.source_text.content }}',
'responseMimeType' => 'text/plain',
'outputAlias' => 'story',
]);
$version = new WorkflowVersion(
id: 'wfv_1',
workflowId: 'wf_1',
version: 1,
name: 'Rewrite Pipeline',
startNodeId: 'input_text',
createdAt: new DateTimeImmutable(),
);
$version->addNode($input);
$version->addNode($prompt);
$version->addEdge(new WorkflowEdge(
id: 'edge_1',
fromNodeId: 'input_text',
fromPort: 'source_text',
toNodeId: 'rewrite',
toPort: 'source_text',
));
new ConditionDefinition(
field: 'nodes.validate.latest.output.validation_result.content.is_valid',
operator: ConditionOperator::Equals,
value: true,
);
interface LlmGatewayInterface
{
public function complete(LlmRequest $request): LlmResponse;
}
interface TtsGatewayInterface
{
public function supports(string $provider): bool;
public function synthesize(string $text, array $settings): TtsSynthesisResult;
}
interface ImageGeneratorInterface
{
public function supports(string $provider): bool;
public function generate(string $prompt, array $settings): ImageGenerationResult;
}
interface VideoRendererInterface
{
public function render(
string $audioPath,
string $subtitlesPath,
?string $backgroundPath,
array $settings,
): VideoRenderResult;
}
interface ArtifactStorageInterface
{
public function storeFile(…): Artifact;
public function storeContent(…): Artifact;
public function readContent(Artifact $artifact): string;
public function createTemporaryLocalFile(Artifact $artifact): string;
}
final readonly class ExecuteWorkflowNode
{
public function __construct(
public string $workflowRunId,
public string $nodeId,
public int $attempt,
) {}
}
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.