Release Notes

2025/07/01: Major update

Webapp

New Features

  • Dashboard page

    • New table experience

  • Jobs page

    • Open Job in new tab

    • “Go to end” button for logs has been improved, and a “Go to start” button added

  • UI Improvements throughout the webapp

    • Hover-over tooltips now interfere less when clicking on other rows and only appear when necessary

    • Quick filter buttons

Bug Fixes

  • Human flag for cancel/retry jobs (previously not included, which caused some inconsistent behavior)

Monitoring/Performance

  • Improved performance on the jobs page – fewer API calls are necessary

  • OpenReplay now monitors browser size

Enforced expiration for API keys/tokens

All API keys/tokens created on Toolkit will be updated with an expiration duration of 90 days.

All new API keys/tokens will have a maximum duration of 90 days.

Emails will be sent to the creator of the token 7, 3, and 1 days before the token expires.

Data home directory

All users are now granted a data home resource located at <organization>.home.<name>. You are automatically granted access to this Toolkit data.

You can find the name or ID of your own data home by calling: eai user get and checking the dataHome field (be sure to update your CLI first).

Note

This space is intended to store private information only.

Please do not store models, datasets, or any large files. Keep it under 10GB.

Warning

This data home will be erased immediately when your user is deactivated.

See Data home directory for best practices on using the data home directory.

gRPC support

Toolkit now supports job running gRPC server.

On internal Toolkit cluster like Superpod, Toolkit can directly detect the gRPC request to use HTTP2/H2C protocol.

For Toolkit cluster on https://console.elementai.com, you need to use a separate domain name dedicated to gRPC:

https://jobID.job-grpc.elementai.com
https://jobID-portNumber.job-grpc.elementai.com

instead of:

https://jobID.job.elementai.com
https://jobID-portNumber.job.elementai.com

Note

For debugging purposes, you can set the header Request-Type: h2c to use the HTTP2/H2C protocol.

AI Toolkit Assistant and MCP integration for Windsurf

AI Toolkit Assistant is now available in Toolkit!

CLI command: eai agent. The assistant is also available in the Webapp. See eai agent.

To learn more about the AI Toolkit Assistant and Windsurf integration, see How does the AI Toolkit Assistant work?

Major update for the Toolkit policies

1. Vocabulary changes

In the policies:

  • The word client has been changed to target to designate the Toolkit resource to which the policy applies.

  • The word cascades indicates whether the policy is applied to the resource itself (false) or to resources contained by the provided resource (true).

2. Rules and Policies are now combined

When creating a policy with multiple rules, multiple policies with different IDs will be returned.

3. Policies are now always linked to a Toolkit resource

The policy expression is now validated and cannot contain random URNs. For the compatibility of tools, it is still possible to create a policy using a URN but it will fail if the URN doesn’t exist.

As the policy are now linked to a resource, it is possible to use and get the full name of the resource and target instead of URNs when calling the API or using the CLI eai role policy ls <roleID>. To get the URN based expression, you can use the --field expression flag. You can find example of the new and old output in Accounts, Roles and Policies.

When creating a policy, you can now call: eai role policy new action@<resourceFullName/resourceID/URN>. You can find examples of the new and old ways to create a policy in Example to add new policy.

4. Mandatory CLI update

These are breaking changes to the policy for the CLI. This causes CLI versions < 1.13.1 to return an error when creating a new policy: eai role policy new <roleID> <action>@<urn>: Error: http: 201; request-id: 5989f611cba701878d31b8566a286306; error: json: cannot unmarshal array into Go value of type toolkit.Policy.

Don’t worry, the policy is created successfully; the issue only occurs when printing the output of the API call. To resolve this issue, please upgrade to the latest CLI version!

5. New granular permissions

To define permissions more precisely, the list of actions used by Toolkit has been expanded and renamed.

Another goal is to separate the action *:get from other actions, making it a basic view permission on the Toolkit resource. For example, data:get previously granted the ability to see the data and also to get read-only access to the data. With this update, data:get will only allow you to view that the data resource exists in Toolkit, without the ability to access its content. You will need the additional action data:read to have read access to the content.

We have automatically migrated existing policies to add the new action.

Please refer to Permissions table for the full list of actions used in Toolkit.

Title

Command

Old Permission

New Permission

Creating or Launching a New Job

eai job new

account:get on accountID

account:get on accountID

job:new on accountID

job:new on accountID

data:get on dataID

data:get and data:read on dataID

data:set on dataID

data:get and data:write on dataID

registry:get for docker image on registryAccountID

registry:pull for docker image on registryAccountID

role:set on roleID

role:apply-job on roleID

Setting a Bid on a Job

eai job set --bid {bid} {jobID}

job:set on jobID

job:get on jobID

job:set on jobID

Giving Consent to a Job

eai job consent {jobID}

job:get on jobID

job:get on jobID

job:access on jobID

Executing Scripts/Commands on Running Job

eai job exec {jobID}

job:set on jobID

job:get on jobID

job:exec on jobID

Getting Logs of a Job

eai job logs {jobID}

job:get on jobID

job:get on jobID

job:log on jobID

Setting Name to a Job

eai job set --name {name} {jobID}

job:set on jobID

job:get on jobID

job:set on jobID

Retrying a Job

eai job retry {jobID}

job:set on jobID

job:get on jobID

job:set on jobID

Killing a Job

eai job kill {jobID}

job:set on jobID

job:get on jobID

job:set on jobID

Listing All Jobs Under an Organization

eai job ls --organization {organizationID}

job:get on descendant job of organizationID

organization:get on organizationID

job:get on descendant job of organizationID

Changing Ownership of a Data Object

eai data chown {dataID} {accountID}

data:get on dataID

data:get on dataID

data:set on dataID

data:write on dataID

data:rm on dataID

data:rm on dataID

data:new on accountID

data:new on accountID

account:get on accountID

account:new on accountID

Listing Data Object Branches

eai data branch ls {dataID}

data:get on dataID

data:get on dataID

data:read on dataID

Pushing Data to a Data Object

eai data push {dataID}

data:get on dataID

data:get on dataID

data:set on dataID

data:write on dataID

Deleting Content from a Data Object

eai data content rm {dataID}

data:get on dataID

data:get on dataID

data:set on dataID

data:write on dataID

Syncing Data to a Data Object

eai data sync {dataID}

data:get on dataID

data:get on dataID

data:set on dataID

data:write on dataID

Listing Contents of a Data Object

eai data content ls {dataID}

data:get on dataID

data:get on dataID

data:read on dataID

Printing Tree Structure of a Data Object

eai data content tree {dataID}

data:get on dataID

data:get on dataID

data:read on dataID

Adding a Branch to a Data Object

eai data branch add {dataID}

data:get on dataID

data:get on dataID

data:set on dataID

data:write on dataID

Setting an organization

eai organization brsetanch {organizationID}

organization:set on organizationID

organization:get on organizationID

organization:set on organizationID

Creating a New Team Under an Organization

eai team new {organizationID}.{name}

team:new on organizationID

organization:get on organizationID

team:new on organizationID

Creating a New Role Under an Organization

eai role new {organizationID}.{name}

role:new on organizationID

organization:get on organizationID

role:new on organizationID

Setting a Default Account

eai account set {account}

account:set on accountID

account:get on accountID

account:set on accountID

Creating a New Account

eai account new {organizationID}.{name}

account:new on organizationID

organization:get on organizationID

account:new on organizationID

Listing Role Keys

eai role key ls {roleID}

role:get on roleID

role:get on roleID

role:key:get on roleID

Creating a New Role Key

eai role key new {roleID}

role:set on roleID

role:get on roleID

role:key:new on roleID

Deleting a Role Key

eai role key rm {roleID} {keyID}

role:set on roleID

role:get on roleID

role:key:rm on roleID

Listing Role Members

eai role member ls {roleID}

role:get on roleID

role:get on roleID

role:member:get on roleID

Adding a Member to a Role

eai role member add {roleID} {userTeamID}

role:set on roleID

role:get on roleID

role:member:add on roleID

user:get or team:get on userTeamID

user:get or team:get on userTeamID

user:add or team:add on userTeamID

Removing a Member from a Role

eai role member rm {roleID} {userTeamID}

role:set on roleID

role:get on roleID

user:get or team:get on userTeamID

role:member:rm on roleID

Removing a Policy from a Role

eai role policy rm {roleID} {policyID}

role:get on roleID

role:get on roleID

policy:set on roleID

policy:rm on roleID

Creating a New Role Under a Team

eai team role new {teamID}

role:new on teamID

team:get on teamID

role:new on teamID

Listing Team Members

eai team member ls {teamID}

team:get on teamID

team:get on teamID

team:member:get on teamID

Adding a Member to a Team

eai team add {teamID} {userTeamID}

team:set on teamID

team:get on teamID

user:get or team:get on userTeamID

team:member:add on teamID

user:get or team:get on userTeamID

user:add or team:add on userTeamID

Removing a Member from a Team

eai team member rm {teamID} {userTeamID}

team:set on teamID

team:get on teamID

user:get or team:get on userTeamID

team:member:rm on teamID

Removing a Policy from a Team

eai team policy rm {teamID} {policyID}

team:get on teamID

team:get on teamID

policy:set on teamID

policy:rm on teamID

Inviting a User to an Organization

eai user invite {userMail} --organization {organizationID}

user:new on organizationID

organization:get on organizationID

user:new on organizationID

Accepting Terms on Behalf of Another User

eai terms --agree {userId}

user:get on userID

user:get on userID if user is different from user session

user:set on userID if user is different from user session

Creating a New Private Registry

eai privateregistry new {organizationID}.{name}

privateregistry:new on organizationID

organization:get on organizationID

privateregistry:new on organizationID

Accessing a Job URL

{jobID}.job.console.elementai.com

job:get on jobID

job:get on jobID

job:access on jobID

Accessing a Service

{serviceID}.service.console.elementai.com

service:get on serviceID

service:get on serviceID

service:access on serviceID

2025/05/19: Webapp

New Features

  • Jobs page

    • GPUs and replicas new, sortable columns as part of the jobs table

    • Duration formatting displays full timestamp on hover over and when copying

  • UI Improvements throughout the webapp

    • Consistent date/time formatting throughout the app

Bug Fixes

  • All menu items in ‘More’ (three dot) menu in each job row clickable on Jobs page

Monitoring/Performance

  • More custom events in OpenReplay

2025/05/02: Webapp

New Features

  • New job page

    • Icon showing your permission level (read vs read/write) to data mounts

  • Jobs page

    • Ability to cancel or restart jobs from the jobs table depending on job status

  • Navigation

    • Clicking on the root nav item in the side panel opens the root page and toggles open additional options (saving you a click!)

  • UI Improvements throughout the webapp

    • Adding more links to relevant docs sections

    • Page layout consistency

    • Slightly smaller search field as we begin to streamline and make improvements to the in page filtering

Bug Fixes

  • Fix issue with accounts loading on new job page not all loading before user types in desired account.

  • Fix bug associated with downloading individual data resource files, and improving performance on the page for large files

Monitoring/Performance

  • Creation of additional custom events in OpenReplay, our platform to better understand webapp usage

2025/04/15: Webapp

New Features

  • Enhanced Data Explorer View

    • Redesigned table interface similar to the Jobs view

    • Table allows sorting by column for ID, name, and date

    • Additional controls for searching for a specific ID, name, creator, and/or date

Bug Fixes

  • Fixed critical blank screen issue that some users encountered when creating new jobs

Monitoring/Performance

  • Framework Upgrade

    • Updated our core framework (React) for improved performance and stability

    • Minor font and sizing adjustments that maintain the overall look and feel

  • Enhanced Monitoring

    • Implemented OpenReplay for better performance monitoring and bug tracking

    • All user session data is securely stored in our private AWS infrastructure

    • This will help us identify and resolve issues faster, leading to a more reliable experience