BlogRelease 0.8 - Asset improvements

June 20, 2025

Release 0.8 - Asset improvements

Joe Freeman

Version 0.8 has been released. This makes improvements to existing features, and modernises the UI a bit.

Asset improvements

Assets were released in version 0.2. There were two types of asset - files and directories. In either case there was only a single underlying 'blob', since directories were zipped. With this change, the distinction between the two types is removed, and the listing of entries in the asset is stored by the server.

This change makes the API a bit simpler, and unlocks features:

  • Entries in an asset can be restored selectively - e.g., restoring files within a specified subdirectory, with a specified extension: asset.restore(match="images/**/*.jpg").
  • Assets can be (selectively) combined together without needing to download the asset: cf.asset({"images": images_asset, "videos": videos_asset}).
  • The asset listing can be inspected in the UI without needing to have access to the blob store.

The UI has been improved, making it easier to inspect assets, switch between assets, and preview some types of file - e.g., images:

A preview of an image in an asset

Suspense improvements

Version 0.4 introduced the concept of implicit suspense, where a timeout can be set for waiting for results from other executions - if the timeout is reached the waiting execution is stopped and will be restarted (from the beginning) once the execution it's waiting for is ready.

This timeout was being managed by the execution, but with this change the management of timeouts is moved to the server. This makes it possible to specify a timeout of zero, indicating that the execution should be suspended immediately if the result isn't available yet.

@cf.task(memo=True)
def my_task():
    ...

@cf.workflow()
def suspense_example():
    with cf.suspense():
        result = my_task()
    ...

Suspense can be a good way to free up workers to process other executions. But it's important to bear in mind that everything before the suspense will be re-run when the execution is restarted. A subtle consequence of this is that it's important (as in the example above) to memo-ise the task being called so that when the calling task executes it again, the original execution is picked up (rather than a new one starting, leading to repeated suspense).

UI improvements

The UI has been modernised a bit, along with some small improvements. There's now a button for toggling the sidebar, and the run dialog now allows an argument type to be selected, rather than requiring a values to be JSON-encoded.

Further renaming

'Agents' have been renamed to 'workers' to avoid confusion with AI agents. And then to avoid having three concepts starting with 'work', 'workspaces' (which were perviously named 'environments'), have been renamed to 'spaces'.

On the subject of agents, Coflux is great for orchestrating AI workflows - you can easily pass tasks as tools. More to come!

Join the mailing list

Get notified of new product features.