Nice work. Thanks for sharing it! I've been thinking about using something like this for LLM agent workflows - the outbound action pattern would work well for tool calls that need to wait on external APIs.
I'm working on DSPy.rb [1] and this could pair nicely for multi-step reasoning chains.
Not sure how async gem would fit into this. The backbone of Stepped Actions is ActiveJob which handles execution. Where do you think this would fit in?
You’re right they’re different models. The path would be Falcon + async-job-adapter-active_job. I am exploring eliminating worker processes, so jobs run as fibers in the same process, yielding during I/O.
Both model prompts as functions. BAML is a DSL - write .baml files, generate code, get validated structured outputs.
DSPy is a programming paradigm. I like to look at it like the MVC for the Web. You define Signatures[0]: typed contracts governing the relationship between your models and your app. Signatures model prompts as functions too, without leaving Ruby. Then compose them into modules (Predict, ChainOfThought, ReAct, your own). The framework can automatically optimize prompts based on your metrics.
DSPy.rb brings the DSPy paradigm's tooling (optimizers, evaluation loops) to Ruby. Comes with OpenTelemetry OOTB. It also borrows BAML's schema format for 85% token savings vs JSON Schema in complex signatures. [1]
Everyone is talking about prompt, context, and harness engineering -and I agree they are good ways to frame how to build workflows and agents- this is just programming really.
I'm working on DSPy.rb [1] and this could pair nicely for multi-step reasoning chains.
Curious - any plans for async gem support?
[1] https://oss.vicente.services/dspy.rb/