Skip to content

Latest commit

 

History

History
142 lines (116 loc) · 6.95 KB

File metadata and controls

142 lines (116 loc) · 6.95 KB

Changelog

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.

Added

  • Canonical (harmonized) metrics as the sole metric surface -- details
  • Bounded uri label on http_api_client_request_seconds: uses path templates (e.g. /workflow/{workflowId}) instead of fully-resolved paths, preventing metric cardinality explosion
  • WorkflowStatusProbe in harness: opt-in probe (via HARNESS_PROBE_RATE_PER_SEC) that exercises UUID-bearing endpoints to validate template URI metrics

Changed

  • BREAKING: Workflow DSL Redesign - Complete redesign of the workflow DSL for Ruby-idiomatic syntax
    • New entry point: Conductor.workflow :name do...end instead of ConductorWorkflow.new
    • Block-based workflow definition with method chaining
    • Output references using task[:field] syntax instead of task.output('field')
    • Input references using wf[:param] syntax instead of workflow.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
  • HTTP request timing (http_api_client_request_seconds) is zero-overhead when no collector is active: RestClient only enters the timing path when a MetricsCollector is subscribed to GlobalDispatcher
  • thread_uncaught_exceptions_total is no longer incremented for caught exceptions in the polling loop; the metric surface is retained but unwired, matching the Python and JavaScript SDKs
  • MetricsCollector responds to stop; TaskHandler#stop calls it automatically to unsubscribe from process-wide dispatchers
  • MetricsCollector.create accepts measure_payload_size: (default true) to opt out of workflow_input_size_bytes JSON serialization overhead

Removed

  • Old DSL classes removed (breaking change):
    • ConductorWorkflow - replaced by Conductor.workflow entry point
    • TaskInterface - replaced by TaskRef (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

Migration Guide

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

[Unreleased] - 2026-02-09

Added

  • 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 example
    • simple_worker.rb - Worker implementation patterns
    • simple_workflow.rb - Basic workflow client usage
    • workflow_dsl.rb - Comprehensive DSL examples
    • dynamic_workflow.rb - Runtime workflow creation
    • kitchensink.rb - All major task types demo
    • workflow_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

Notes

  • Full feature parity with Python SDK
  • Supports both OSS Conductor and Orkes Cloud
  • Ruby 2.6+ compatible (Ruby 3+ recommended for Ractor support)