All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Canonical (harmonized) metrics as the sole metric surface -- details
- Bounded
urilabel onhttp_api_client_request_seconds: uses path templates (e.g./workflow/{workflowId}) instead of fully-resolved paths, preventing metric cardinality explosion WorkflowStatusProbein harness: opt-in probe (viaHARNESS_PROBE_RATE_PER_SEC) that exercises UUID-bearing endpoints to validate template URI metrics
- BREAKING: Workflow DSL Redesign - Complete redesign of the workflow DSL for Ruby-idiomatic syntax
- New entry point:
Conductor.workflow :name do...endinstead ofConductorWorkflow.new - Block-based workflow definition with method chaining
- Output references using
task[:field]syntax instead oftask.output('field') - Input references using
wf[:param]syntax instead ofworkflow.input('param') - Control flow blocks:
parallel do,decide expr do,loop_over items do - Auto-generated task reference names
- Simplified LLM task methods with hash-to-ChatMessage auto-conversion
- New entry point:
- HTTP request timing (
http_api_client_request_seconds) is zero-overhead when no collector is active:RestClientonly enters the timing path when aMetricsCollectoris subscribed toGlobalDispatcher thread_uncaught_exceptions_totalis no longer incremented for caught exceptions in the polling loop; the metric surface is retained but unwired, matching the Python and JavaScript SDKsMetricsCollectorresponds tostop;TaskHandler#stopcalls it automatically to unsubscribe from process-wide dispatchersMetricsCollector.createacceptsmeasure_payload_size:(defaulttrue) to opt out ofworkflow_input_size_bytesJSON serialization overhead
- Old DSL classes removed (breaking change):
ConductorWorkflow- replaced byConductor.workflowentry pointTaskInterface- replaced byTaskRef(internal)- Task classes:
SimpleTask,SwitchTask,ForkTask,JoinTask,DoWhileTask,HttpTask,SubWorkflowTask,WaitTask,TerminateTask,SetVariableTask,DynamicForkTask,JavascriptTask,JsonJqTask,EventTask,HttpPollTask,DynamicTask,HumanTask,StartWorkflowTask,KafkaPublishTask,WaitForWebhookTask - LLM task classes:
LlmChatCompleteTask,LlmTextCompleteTask,LlmGenerateEmbeddingsTask,LlmIndexTextTask,LlmIndexDocumentTask,LlmSearchIndexTask,LlmQueryEmbeddingsTask,LlmStoreEmbeddingsTask,LlmSearchEmbeddingsTask,GenerateImageTask,GenerateAudioTask,GetDocumentTask,ListMcpToolsTask,CallMcpToolTask
Before (old DSL):
include Conductor::Workflow
workflow = ConductorWorkflow.new(client, 'my_workflow', version: 1)
task = SimpleTask.new('greet', 'greet_ref').input('name', workflow.input('name'))
workflow >> task
workflow.output_parameter('result', task.output('result'))After (new DSL):
workflow = Conductor.workflow :my_workflow, version: 1, executor: executor do
task = simple :greet, name: wf[:name]
output result: task[:result]
end-
Core Infrastructure
- Configuration with environment variable support
- Authentication (token management, TTL refresh, exponential backoff)
- HTTP Transport using Faraday with retry, connection pooling, SSL support
- ApiClient with serialization/deserialization and auth injection
- Exception hierarchy (ApiError, AuthenticationError, etc.)
-
Resource APIs (17 classes)
- WorkflowResourceApi - Workflow operations
- TaskResourceApi - Task operations
- MetadataResourceApi - Workflow/task definitions
- SchedulerResourceApi - Schedule management
- EventResourceApi - Event handlers
- WorkflowBulkResourceApi - Bulk operations
- PromptResourceApi - AI prompt management
- SecretResourceApi - Secret management
- IntegrationResourceApi - External integrations
- SchemaResourceApi - JSON schema management
- AuthorizationResourceApi - Permissions
- ApplicationResourceApi - Application management
- UserResourceApi - User management
- GroupResourceApi - Group management
- RoleResourceApi - Role management
- TokenResourceApi - Token operations
- GatewayAuthResourceApi - Gateway authentication
-
High-Level Clients (9 classes)
- WorkflowClient - Workflow operations
- TaskClient - Task operations
- MetadataClient - Metadata operations
- SchedulerClient - Schedule management
- PromptClient - AI prompts
- SecretClient - Secrets
- IntegrationClient - Integrations
- SchemaClient - Schemas
- AuthorizationClient - Authorization
-
Worker Framework
- Worker module with DSL for task definition
- Class-based workers using
include Conductor::Worker::WorkerModule - Block-based workers using
Conductor::Worker.define - TaskRunner with multi-threaded polling and execution
- FiberExecutor for lightweight concurrency
- RactorTaskRunner for true parallelism (Ruby 3+)
- Telemetry with Prometheus metrics backend
- Event system for task lifecycle hooks
-
Workflow DSL (25+ task types)
- Control Flow: SimpleTask, SwitchTask, ForkTask, JoinTask, DoWhileTask, DynamicTask, DynamicForkTask, SubWorkflowTask
- System Tasks: HttpTask, HttpPollTask, EventTask, WaitTask, WaitForWebhookTask, TerminateTask, SetVariableTask, JsonJqTask, JavascriptTask, KafkaPublishTask, StartWorkflowTask, HumanTask
- LLM/AI Tasks: LlmChatCompleteTask, LlmTextCompleteTask, LlmGenerateEmbeddingsTask, LlmIndexTextTask, LlmIndexDocumentTask, LlmSearchIndexTask, LlmQueryEmbeddingsTask, LlmSearchEmbeddingsTask, LlmStoreEmbeddingsTask, GenerateImageTask, GenerateAudioTask, GetDocumentTask, CallMcpToolTask, ListMcpToolsTask
-
OrkesClients Factory
- Single entry point for all client creation
- WorkflowExecutor for synchronous workflow execution
-
Models (50+ classes)
- HTTP models for all API request/response types
- Orkes-specific models (MetadataTag, RateLimitTag, etc.)
-
Examples
helloworld/- Simplest complete examplesimple_worker.rb- Worker implementation patternssimple_workflow.rb- Basic workflow client usageworkflow_dsl.rb- Comprehensive DSL examplesdynamic_workflow.rb- Runtime workflow creationkitchensink.rb- All major task types demoworkflow_ops.rb- Workflow lifecycle operations
-
Testing
- 281 unit tests
- 110 integration tests covering all major API categories
- Tests for Scheduler, Events, Bulk Operations, Workflow, Task, Prompt APIs
- Full feature parity with Python SDK
- Supports both OSS Conductor and Orkes Cloud
- Ruby 2.6+ compatible (Ruby 3+ recommended for Ractor support)