@@ -95,6 +95,10 @@ service OpenShell {
9595 rpc ImportProviderProfiles (ImportProviderProfilesRequest )
9696 returns (ImportProviderProfilesResponse );
9797
98+ // Update an existing custom provider type profile.
99+ rpc UpdateProviderProfiles (UpdateProviderProfilesRequest )
100+ returns (UpdateProviderProfilesResponse );
101+
98102 // Validate provider type profiles without registering them.
99103 rpc LintProviderProfiles (LintProviderProfilesRequest )
100104 returns (LintProviderProfilesResponse );
@@ -317,8 +321,9 @@ message SandboxSpec {
317321 openshell.sandbox.v1.SandboxPolicy policy = 7 ;
318322 // Provider names to attach to this sandbox.
319323 repeated string providers = 8 ;
320- // Request NVIDIA GPU resources for this sandbox.
321- bool gpu = 9 ;
324+ // Portable resource requirements used by the gateway for driver selection
325+ // and by drivers for provisioning.
326+ ResourceRequirements resource_requirements = 9 ;
322327 reserved 10 ;
323328 reserved "gpu_device" ;
324329 // Field 11 was `proposal_approval_mode`. The approval mode is now a
@@ -329,6 +334,18 @@ message SandboxSpec {
329334 reserved "proposal_approval_mode" ;
330335}
331336
337+ message ResourceRequirements {
338+ // GPU requirements for the sandbox. Presence indicates a GPU request.
339+ GpuResourceRequirements gpu = 1 ;
340+ }
341+
342+ // Public GPU resource requirements.
343+ message GpuResourceRequirements {
344+ // Optional number of GPUs requested. When omitted, the request is for one
345+ // GPU using the selected driver's default assignment behavior.
346+ optional uint32 count = 1 ;
347+ }
348+
332349// Public sandbox template mapped onto compute-driver template inputs.
333350message SandboxTemplate {
334351 // Fully-qualified OCI image reference used to boot the sandbox.
@@ -1075,6 +1092,10 @@ message ProviderProfile {
10751092 repeated openshell.sandbox.v1.NetworkBinary binaries = 7 ;
10761093 bool inference_capable = 8 ;
10771094 ProviderProfileDiscovery discovery = 9 ;
1095+ // Storage resource version for custom profiles. Built-in profiles and new
1096+ // profile files use 0. Gateway responses set this for stored custom profiles.
1097+ // Update calls use this for optimistic concurrency.
1098+ uint64 resource_version = 10 ;
10781099}
10791100
10801101// Stored custom provider profile object.
@@ -1105,6 +1126,25 @@ message ImportProviderProfilesResponse {
11051126 bool imported = 3 ;
11061127}
11071128
1129+ // Update one custom provider profile request.
1130+ message UpdateProviderProfilesRequest {
1131+ ProviderProfileImportItem profile = 1 ;
1132+ // Expected storage resource version for optimistic concurrency control.
1133+ // If 0, the server uses the resource_version embedded in profile.profile.
1134+ // Updates without a non-zero version are rejected to prevent stale files from
1135+ // silently overwriting newer profile definitions.
1136+ uint64 expected_resource_version = 2 ;
1137+ // Existing custom provider profile ID to update. The payload ID must match.
1138+ string id = 3 ;
1139+ }
1140+
1141+ // Update one custom provider profile response.
1142+ message UpdateProviderProfilesResponse {
1143+ repeated ProviderProfileDiagnostic diagnostics = 1 ;
1144+ ProviderProfile profile = 2 ;
1145+ bool updated = 3 ;
1146+ }
1147+
11081148// Lint provider profiles request.
11091149message LintProviderProfilesRequest {
11101150 repeated ProviderProfileImportItem profiles = 1 ;
0 commit comments