Remix.run Logo
calcsam 4 months ago

Thanks! The conditional `when` clauses live on the steps, rather than being represented in the workflow, and in fact when we built this for an example, the last step being called depended on the results of the previous two steps.

How would you simplify this?

anentropic 4 months ago | parent | next [-]

I think the problem is that a 'fluent' chain of calls already expresses a sequence, so the way that 'after' resets the context to start a new branch feels very awkward ... like a GOTO or something

It's telling that the example relies on arbitrary indentation (which a linter will get rid of) to have some hope of comprehending it

Possibly this was all motivated by a desire to avoid nested structures above all?

But for a branching graph a nested structure is more natural. It'd also probably be nicer if the methods were on the task nodes instead of on the workflow, then you could avoid the 'step'/'then' distinction and have something like:

e.g.

    testWorkflow(
        llm
        .then(decider)
        .then(
            agentOne.then(workflow),
            agentTwo.then(workflow),
        )
    )
calcsam 4 months ago | parent [-]

You’re right that the syntax was inspired by the desire to avoid nested structures. But the syntax here is interesting as well and fairly readable. Worth thinking about!

anentropic 4 months ago | parent [-]

that example syntax is loosely based on CDK code for AWS Step Functions, since I had to write some recently

essentially you're building a DAG so it could be worth checking some other APIs which do a similar thing for inspiration

e.g. it looks like in Airflow you could write it as:

    chain(llm, decider, [agentOne, agentTwo], workflow)
https://airflow.apache.org/docs/apache-airflow/stable/core-c...
jumski 4 months ago | parent | prev [-]

I think it is just easier to comprehend if the edges/dependencies are explicit (as an array for example).

calcsam 4 months ago | parent [-]

We have a ticket to allow this actually!