[Unreleased] - 2026-03-06
Added
-
workloadMetadataonPOST /api/v1/tracesets/upload-url:TracesetUploadUrlRequestnow documentsworkloadMetadata, which the endpoint already accepted. It is stored on the traceset as given, up to 65,536 bytes when serialized, and must be a JSON object. It declares the traceset’s rank count, either asshape.rankCountor as parallelism degrees (dp,tp,sp,ep,pp, multiplied together, with an absent degree counting as 1); the traceset reports that count asrankCountDerived, and attaching it to a configuration uses it. The Python client’sTracesetUploadUrlRequestgainsworkload_metadata, andcentral-cli traceset uploadgains--workload-metadata <PATH>, a JSON file that the command requires. -
Simple simulation endpoint:
POST /api/v1/simple/simulations— submit a collective-operation workload (AllReduce, Broadcast, etc.) with a single request. The platform handles topology derivation, traceset synthesis, and simulation launch automatically. -
Topology constraints:
topologyConstraintsobject onSimpleSimulationRequestwithswitchRadix(enum:64x800G,128x400G,256x200G) andsubscriptionRatio(enum:1:1,2:1,3:1,4:1). Enables arbitrary rank counts by deriving a valid 2-tier CLOS topology from hardware constraints. -
Chakra mapping files: a mapping-file resource that pins each Chakra logical rank to a server, and optionally declares scale-up groups and their fabric parameters. Upload a file once, attach it to a simulation configuration, and every simulation created from that configuration is launched with it. Without one, placement is unchanged: rank
iruns on thei-th Chakra-capable server. A simulation with a mapping file runs to completion on a traceset you upload. A simulation on one of the platform’s own Chakra tracesets fails before the simulator starts until an update to the platform’s simulation hosts is in service. The platform does not generate mapping files: you write or generate the file and upload it, and Scala provides a mapping file toolkit, a generator script with sample configs, on request (see Generate a mapping file in Chakra Mapping Files). A mapping file attaches behind an uploaded traceset only when that traceset has a rank count, which it reports asrankCountDerived. For a new upload that rank count is the one its workload metadata declares, asshape.rankCountor as parallelism degrees (dp,tp,sp,ep,pp). Behind a traceset with no rank count, the mapping-file attach, like the traceset attach, answers422UNPROCESSABLE_ENTITY, which retrying does not change (see Current limitations in Chakra Mapping Files). Eight new operations, all taggedmapping-files:The stored file is the simulator’s own text format, byte for byte, with a 64 MB per-file limit and no per-workspace quota.MappingFileSummarycarriesid,name,workspaceId,sizeBytes,rankCount,scaleUpGroupCount,hasScaleUpandcreatedAt;MappingFileDetailsaddsdescription,hash,etagandduplicateOfExisting. Newerror.codevalues:MAPPING_FILE_INVALID,MAPPING_FILE_HASH_COLLISION,MAPPING_FILE_DELETED,MAPPING_REQUIRES_TRACESET,MAPPING_REQUIRES_CHAKRA_APP,MAPPING_RANK_COUNT_MISMATCH,MAPPING_PARAMS_LOCKED,TRACESET_CONFLICTS_WITH_MAPPINGandMAPPING_FILE_DELETED_REFERENCE, plusMAPPING_FILE_MISSINGandMAPPING_PARAMS_INCONSISTENTon500platform faults. See Chakra Mapping Files for the file format and the full flow. -
activeMappingFileonConfigurationDetails: names the attached mapping file as{ "id", "name", "deleted" }, or isnull.deletedis resolved when the configuration is read, so a configuration that still refers to a deleted file reports it as deleted. Only attach and detach set it: a configuration update whose body carriesactiveMappingFilereturns400. Attach requires at least one Chakra application (422MAPPING_REQUIRES_CHAKRA_APP), an attached traceset (409MAPPING_REQUIRES_TRACESET) that has a rank count (422UNPROCESSABLE_ENTITYotherwise, not resolved by retrying), a mapping file in the configuration’s workspace that has not been deleted (404otherwise), and equal rank counts (422MAPPING_RANK_COUNT_MISMATCH, naming both counts). While a file is attached, a configuration update, an application-parameter update or an application create that would changeUseMappingorMappingFileNamereturns422MAPPING_PARAMS_LOCKED, and a traceset with a different rank count returns409TRACESET_CONFLICTS_WITH_MAPPINGon traceset attach and on configuration update. -
appliedMappingFileonSimulationDetails: names the mapping file the simulation was created with, as{ "id", "name", "deleted" }, and is absent for a configuration with no mapping file. It keeps naming the file after a delete, withdeletedreadingtrue; deleting a mapping file never changes a simulation already created.POST /api/v1/simulationsfrom a configuration whose attached mapping file has been deleted returns409MAPPING_FILE_DELETED_REFERENCE, naming the file. A mapped run never falls back to in-order placement: a file that cannot be delivered to the simulator fails the simulation. When the platform rejects the file while staging it, thefailureReasonreadsMapping file <name> (<id>) could not be delivered, with a long<name>possibly shortened to end in…and the id always in full; a failure not attributed to the mapping file reports a general failure reason.
Fixed
- Simulation results endpoints: Removed non-functional workspace ownership check that blocked all users from accessing results.
DefaultWorkspace.owner = 'system'causedverify_workspace_accessto reject every real user. Endpoints now correctly return results for any authenticated user. Affected:GET /simulations/{id}/results,GET /simulations/{id}/results/download-url,GET /simulations/{id}/results/data.
Changed
-
BREAKING for generated clients:
SimulationResults, theGET /api/v1/simulations/{sim_id}/resultsresponse, no longer declaressummaryordashboardUrl. The endpoint never returned either, so responses are unchanged. A client regenerated from this spec no longer has the two fields; to migrate, delete reads of them, which always found them absent.ResultsSummaryleaves the published spec, because no operation refers to it. -
Upload’s
workloadMetadatadocuments its rank-count members:TracesetUploadUrlRequest.workloadMetadatanow refers toUploadWorkloadMetadata, which describesshape.rankCountand theparallelismdegreesdp,tp,sp,epandppthroughWorkloadShapeandWorkloadParallelism. Every member is optional, and other members are still accepted and returned as given. This is a documentation change: requests and responses are unchanged, and upload validates only the rank-count members it already validated.WorkloadMetadata, the stored object on responses, stays a free-form object.TracesetResponse.workloadMetadatano longer says it is present only after promotion: it returns the metadata given at upload, or at the traceset’s latest applied promotion that carried metadata. A new Workload Metadata page describes the rank-count rules and the descriptive members. -
Upload part URLs carry their size and real expiry:
POST /api/v1/tracesets/upload-urlandPOST /api/v1/mapping-files/upload-urlpresign each part URL for one hour (was 15 minutes).PartUploadUrlgainssize, the number of bytes to PUT for that part; every part but the last is the server’s part size, and a mapping file’s part may be shorter, since itssizeBytesis an upper bound. The part URLs’ expiry is now reported aspartUrlsExpireAt, on eachFileUploadUrlsentry and onMappingFileUploadUrlResponse.expiresAtis unchanged: it is the 24-hour upload session lifetime, which it always was, not the URLs’ expiry. A URL can stop working beforepartUrlsExpireAtif the platform’s signing credentials expire first.central-cli traceset uploadnow uploads files over 2 MiB whole: it sent at most 2 MiB per part. -
BREAKING:
GET /api/v1/modelsreports the Pod and Rack topology container models astype: "pod"andtype: "rack". They were reported as"switch".ModelTypegainsrackandpod, the valuesGET /api/v1/models/{model_id}already reports for these models, andtype=rackandtype=podbecome valid filters on the list (the server already accepted them). A client generated from an earlier spec with a closedModelTypeenum fails to parse a list response that contains these models; to migrate, regenerate or upgrade the client. -
BREAKING:
POST /api/v1/tracesets/upload-urlrequires an upload withprimaryfiles to declare its rank count inworkloadMetadata, asshape.rankCountor as parallelism degrees (dp,tp,sp,ep,pp). Without one it returns 400VALIDATION_ERRORnaming both forms, before any upload URL is issued. It also returns 400 for a declaration it cannot accept, naming the field: ashape.rankCountor degree that is not a whole number of at least 1, ashape.rankCountthat differs from the parallelism product (naming both), a count above 2,147,483,647, or aworkloadMetadata,shapeorparallelismthat is neither an object nornull. An upload of supporting files only needs no declaration. To migrate: addworkloadMetadatadeclaring the rank count to every upload of trace files; withcentral-cli, pass--workload-metadata <PATH>. -
POST /api/v1/tracesets/upload-url/completereports the tracesetreadyfor every completed upload, including one with new files, which previously reportedprocessing. Every file of the upload reportsmetadataStatuscomplete. A traceset uploaded with exactly oneprimaryfile that declares N ranks reports that file’srankRangeas0to N−1. -
Traceset promotion (the Python client’s
promote_traceset) returns 422UNPROCESSABLE_ENTITYwhen the newworkloadMetadatawould change the rank count the traceset declared at upload, naming both counts. A declared rank count cannot be changed after upload: for a traceset that carries one, the newworkloadMetadatamust declare the same count, and metadata that declares none differs from it. -
BREAKING:
minandmaxin a component schema (ParameterValueSchema, returned byGET /api/v1/components/{id}) are nowParameterBoundobjects instead of numbers. A numeric type’s bound is{"value": 1}. A dimensional type’s (datarate,timeval,bytes,queuesize) bound carries its unit, such as{"value": 10, "unit": "us"}, which can differ from the unit of the parameter’s value. A dimensional bound of0is{"value": 0}with no unit. A model’s bound that the platform cannot read is left out of the schema. To migrate: readmin.valueandmin.unitwhere you readmin. -
BREAKING:
GET /api/v1/simulationsnow accepts only a singlefield:directionpair insort(for examplecreated_at:desc). A compound sort such asstatus:asc,created_at:descreturns 400; it previously returned 200 but could not be paginated correctly past the first page. Anextcursor replayed with a differentsortthan the one that produced it also returns 400 instead of a wrong page. To migrate: send one sort field, and when you changesort, restart pagination withoutnext. -
Presigned URL expiry reduced: Simulation result download URLs (
GET /simulations/{id}/resultsandGET /simulations/{id}/results/download-url) now expire after 15 minutes (900 s) instead of the previous 60 minutes (3600 s). This is a defense-in-depth hardening to limit exposure if a URL leaks. Clients that fetch a presigned URL and consume it after a delay greater than 15 minutes will receive an HTTP 403 from S3. TheexpiresAtfield in thedownload-urlresponse reflects the actual expiry. No known consumers cache presigned URLs beyond this window. -
BREAKING:
SimpleWorkload.rankschanged from integer enum ([64, 128, 256, 512, 1024, 4096]) tointegerwithminimum: 1. WithouttopologyConstraints, the server still restricts to the 6 reference values. WithtopologyConstraints, any positive value satisfying the constraint solver is accepted. -
BREAKING:
TracesetFilerenamed toFileResponsein the Python client. Adds required fieldmetadata_status. Update imports:from python_client.models import FileResponse(wasTracesetFile). -
BREAKING:
ContainerDefinition.type_andAllowedTypesResponse.container_typenow useContainerTypeinstead ofComponentTypein the Python client. Both arestrenums with identical string values, so equality comparisons by value still work. Updateisinstancechecks if used. -
BREAKING:
DlrmMetadata,TraceMetadata, andTraceMetadataWorkloadTyperemoved from the Python client. These types are no longer part of the API surface. Remove any imports that reference them. -
Traceset listing scope widened:
GET /api/v1/tracesets?workspaceId=Xnow returns all non-deleted tracesets visible to the workspace, including promoted tracesets with scopetenantorpublic. Previously, onlyworkspace-scoped tracesets were returned. This ensures promoted tracesets remain visible after promotion. -
TrafficType output consolidation: API responses now return
"chakra"where"coordinated"was previously emitted for thetrafficTypefield. Input is backward-compatible: both"chakra"and"coordinated"are accepted via serde alias. This reflects the A5 schema migration consolidating Coordinated into Chakra. -
BREAKING:
PATCH /api/v1/configurations/{config_id}/tracesetnow requires the traceset to have a positive rank count before attaching. The endpoint previously accepted any valid traceset regardless of library state; it now enforces that the rank count is present and positive (required to populateNumOfChakraFilesin the Chakra workload model). Two new error responses are returned when the traceset’s rank count is missing or invalid:Migration: Both responses are permanent for that traceset and do not resolve on retry. This endpoint first answered a traceset with no rank count with a retry-safe409 Conflict; see the next entry. -
BREAKING: a traceset with no rank count is now answered
422 Unprocessable Entity(UNPROCESSABLE_ENTITY) in place of the retry-safe409 Conflict(CONFLICT), byPATCH /api/v1/configurations/{config_id}/traceset, byPATCH /api/v1/configurations/{config_id}/mapping-file, and byPATCH /api/v1/configurations/{config_id}when a mapping file is attached and the body carriesactiveTraceset. The409said to retry after metadata extraction completed, but a traceset you upload never gained a rank count that way, so the retry never succeeded. The422names the traceset and does not resolve on retry. Migration: Stop retrying the request on this response. A client that retries on409CONFLICTfor these operations should treat the422as permanent for that traceset.
[Previous Unreleased] - 2024-12-23
Changed
-
BREAKING:
Pagination.limitrenamed toPagination.countin API responses- Affected: All paginated list endpoints
- Before:
{"limit": 10, "hasMore": true, "cursor": "..."} - After:
{"count": 10, "hasMore": true, "cursor": "..."} - Semantic change:
countrepresents the actual number of items returned (may be less than requested limit) - Note: Query parameter
?limit=Nremains unchanged; only the response field name changed - Migration: Update client code to read
countinstead oflimitfrom pagination responses
-
BREAKING:
ParameterDefinition.defaulttype changed from JSON value to string- Affected:
GET /api/v1/models/{id},GET /api/v1/components/{id} - Before:
{"default": 100}or{"default": true} - After:
{"default": "100"}or{"default": "true"} - Migration: Parse the string value according to the parameter’s
typefield
- Affected:
-
BREAKING:
ComponentDeclaration.modelformat changed to use standardized model reference- Affected:
GET /api/v1/templates/{id},GET /api/v1/configurations/{id},GET /api/v1/configurations/{id}/versions/{v},POST /api/v1/templates/{id}/clone - Before:
{"model": "ScalaSwitch:3.2.1", "name": "spine-1"}(model in internal format, name user-defined) - After:
{"model": "scala-switch-v3.2.1", "name": "spine-1"}(model standardized to API format, name remains user-manageable) - Format: Model field is standardized to API format (
scala-switch-v{version}) - Name field: Remains user-manageable and unchanged from input
- Benefit: Model field can be parsed to extract model reference for use with
GET /api/v1/models/{model_id} - Migration: Update any code that parses or displays component model fields
- Affected:
-
BREAKING: Only referenced components are returned in configuration responses
- Affected:
GET /api/v1/templates/{id},GET /api/v1/configurations/{id},POST /api/v1/templates/{id}/clone - Before: All components declared in the configuration were returned, including unused ones
- After: Only components referenced in
topology.components,topology.containers, orcontainers[].componentsare returned - Rationale: Reduces response size and focuses on components actually used in the topology
- Migration: If your code relies on seeing all declared components, use the stored configuration data directly
- Affected:
-
Template cloning preserves original data format
- Affected:
POST /api/v1/templates/{id}/clone - Change: Cloned configurations now preserve the original template’s data format (legacy or new format)
- Before: Template data was transformed to new format during cloning
- After: Template data format is preserved, only metadata fields (version, workspaceId, name, status, parent_config_id) are updated
- Benefit: Maintains compatibility with existing templates and allows format-specific handling
- Affected:
Removed
- BREAKING: Removed fields from
ParameterDefinition:componentType- was used for nested component type referencesmodel- was used for model references within parametersparameters- was used for nested parameter definitions- Migration: These fields were not widely used. If you relied on nested parameter structures, contact the API team for migration guidance.
Added
-
Model Metadata Enrichment: Templates API now fetches model metadata from
model_version- Affected:
GET /api/v1/templates/{id} - Components are enriched with parameter schemas and type information from the database
- When a component references a model (e.g.,
ScalaSwitch:4.0.0), the API looks up the model inmodel_versionand includes the full parameter schema - Benefit: Clients receive complete model metadata without needing separate API calls to
/api/v1/models/{model_id}
- Affected:
-
Parameter Extraction: Extended parameter extraction to include coordinator-level parameters
- Application models now expose parameters from
Coordinators,ModelProfiles, andTrafficPatternsections - Parameters include group information (e.g.,
Delay.CoordinatorAttributes)
- Application models now expose parameters from