azureml-registry-tools 0.1.0a20__tar.gz → 0.1.0a25__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. {azureml_registry_tools-0.1.0a20/azureml_registry_tools.egg-info → azureml_registry_tools-0.1.0a25}/PKG-INFO +1 -1
  2. {azureml_registry_tools-0.1.0a20 → azureml_registry_tools-0.1.0a25}/azureml/registry/_rest_client/base_rest_client.py +1 -1
  3. {azureml_registry_tools-0.1.0a20 → azureml_registry_tools-0.1.0a25}/azureml/registry/_rest_client/registry_management_client.py +4 -1
  4. {azureml_registry_tools-0.1.0a20 → azureml_registry_tools-0.1.0a25}/azureml/registry/data/model.schema.json +494 -7
  5. {azureml_registry_tools-0.1.0a20 → azureml_registry_tools-0.1.0a25}/azureml/registry/mgmt/asset_management.py +79 -9
  6. {azureml_registry_tools-0.1.0a20 → azureml_registry_tools-0.1.0a25}/azureml/registry/tools/create_or_update_assets.py +1 -1
  7. {azureml_registry_tools-0.1.0a20 → azureml_registry_tools-0.1.0a25/azureml_registry_tools.egg-info}/PKG-INFO +1 -1
  8. {azureml_registry_tools-0.1.0a20 → azureml_registry_tools-0.1.0a25}/setup.py +1 -1
  9. {azureml_registry_tools-0.1.0a20 → azureml_registry_tools-0.1.0a25}/LICENSE.txt +0 -0
  10. {azureml_registry_tools-0.1.0a20 → azureml_registry_tools-0.1.0a25}/MANIFEST.in +0 -0
  11. {azureml_registry_tools-0.1.0a20 → azureml_registry_tools-0.1.0a25}/azureml/__init__.py +0 -0
  12. {azureml_registry_tools-0.1.0a20 → azureml_registry_tools-0.1.0a25}/azureml/registry/__init__.py +0 -0
  13. {azureml_registry_tools-0.1.0a20 → azureml_registry_tools-0.1.0a25}/azureml/registry/_cli/__init__.py +0 -0
  14. {azureml_registry_tools-0.1.0a20 → azureml_registry_tools-0.1.0a25}/azureml/registry/_cli/registry_syndication_cli.py +0 -0
  15. {azureml_registry_tools-0.1.0a20 → azureml_registry_tools-0.1.0a25}/azureml/registry/_cli/repo2registry_cli.py +0 -0
  16. {azureml_registry_tools-0.1.0a20 → azureml_registry_tools-0.1.0a25}/azureml/registry/_rest_client/__init__.py +0 -0
  17. {azureml_registry_tools-0.1.0a20 → azureml_registry_tools-0.1.0a25}/azureml/registry/_rest_client/arm_client.py +0 -0
  18. {azureml_registry_tools-0.1.0a20 → azureml_registry_tools-0.1.0a25}/azureml/registry/_rest_client/registry_model_client.py +0 -0
  19. {azureml_registry_tools-0.1.0a20 → azureml_registry_tools-0.1.0a25}/azureml/registry/data/__init__.py +0 -0
  20. {azureml_registry_tools-0.1.0a20 → azureml_registry_tools-0.1.0a25}/azureml/registry/data/asset.yaml.template +0 -0
  21. {azureml_registry_tools-0.1.0a20 → azureml_registry_tools-0.1.0a25}/azureml/registry/data/description.md.template +0 -0
  22. {azureml_registry_tools-0.1.0a20 → azureml_registry_tools-0.1.0a25}/azureml/registry/data/evaluation.md.template +0 -0
  23. {azureml_registry_tools-0.1.0a20 → azureml_registry_tools-0.1.0a25}/azureml/registry/data/model-variant.schema.json +0 -0
  24. {azureml_registry_tools-0.1.0a20 → azureml_registry_tools-0.1.0a25}/azureml/registry/data/model.yaml.template +0 -0
  25. {azureml_registry_tools-0.1.0a20 → azureml_registry_tools-0.1.0a25}/azureml/registry/data/notes.md.template +0 -0
  26. {azureml_registry_tools-0.1.0a20 → azureml_registry_tools-0.1.0a25}/azureml/registry/data/validate_model_schema.py +0 -0
  27. {azureml_registry_tools-0.1.0a20 → azureml_registry_tools-0.1.0a25}/azureml/registry/data/validate_model_variant_schema.py +0 -0
  28. {azureml_registry_tools-0.1.0a20 → azureml_registry_tools-0.1.0a25}/azureml/registry/mgmt/__init__.py +0 -0
  29. {azureml_registry_tools-0.1.0a20 → azureml_registry_tools-0.1.0a25}/azureml/registry/mgmt/create_asset_template.py +0 -0
  30. {azureml_registry_tools-0.1.0a20 → azureml_registry_tools-0.1.0a25}/azureml/registry/mgmt/create_manifest.py +0 -0
  31. {azureml_registry_tools-0.1.0a20 → azureml_registry_tools-0.1.0a25}/azureml/registry/mgmt/create_model_spec.py +0 -0
  32. {azureml_registry_tools-0.1.0a20 → azureml_registry_tools-0.1.0a25}/azureml/registry/mgmt/model_management.py +0 -0
  33. {azureml_registry_tools-0.1.0a20 → azureml_registry_tools-0.1.0a25}/azureml/registry/mgmt/syndication_manifest.py +0 -0
  34. {azureml_registry_tools-0.1.0a20 → azureml_registry_tools-0.1.0a25}/azureml/registry/tools/__init__.py +0 -0
  35. {azureml_registry_tools-0.1.0a20 → azureml_registry_tools-0.1.0a25}/azureml/registry/tools/config.py +0 -0
  36. {azureml_registry_tools-0.1.0a20 → azureml_registry_tools-0.1.0a25}/azureml/registry/tools/registry_utils.py +0 -0
  37. {azureml_registry_tools-0.1.0a20 → azureml_registry_tools-0.1.0a25}/azureml/registry/tools/repo2registry_config.py +0 -0
  38. {azureml_registry_tools-0.1.0a20 → azureml_registry_tools-0.1.0a25}/azureml_registry_tools.egg-info/SOURCES.txt +0 -0
  39. {azureml_registry_tools-0.1.0a20 → azureml_registry_tools-0.1.0a25}/azureml_registry_tools.egg-info/dependency_links.txt +0 -0
  40. {azureml_registry_tools-0.1.0a20 → azureml_registry_tools-0.1.0a25}/azureml_registry_tools.egg-info/entry_points.txt +0 -0
  41. {azureml_registry_tools-0.1.0a20 → azureml_registry_tools-0.1.0a25}/azureml_registry_tools.egg-info/requires.txt +0 -0
  42. {azureml_registry_tools-0.1.0a20 → azureml_registry_tools-0.1.0a25}/azureml_registry_tools.egg-info/top_level.txt +0 -0
  43. {azureml_registry_tools-0.1.0a20 → azureml_registry_tools-0.1.0a25}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: azureml-registry-tools
3
- Version: 0.1.0a20
3
+ Version: 0.1.0a25
4
4
  Summary: AzureML Registry tools and CLI
5
5
  Author: Microsoft Corp
6
6
  License: https://aka.ms/azureml-sdk-license
@@ -178,7 +178,7 @@ class BaseAzureRestClient(BaseRestClient):
178
178
  super().__init__(base_url, api_key=api_key, max_retries=max_retries, backoff_factor=backoff_factor)
179
179
  # Only after super().__init__ is self.session available
180
180
  if api_key is None:
181
- self._credential = DefaultAzureCredential()
181
+ self._credential = DefaultAzureCredential() # CodeQL [SM05139] DefaultAzureCredential should only be used for local development and testing purposes.
182
182
  self._refresh_api_key_if_needed()
183
183
  # Ensure self.api_key is set for future use
184
184
  api_key = self.api_key
@@ -24,7 +24,10 @@ class RegistryManagementClient(BaseAzureRestClient):
24
24
  if primary_region is None:
25
25
  # Resolve the primary region if not provided
26
26
  primary_region = self.resolve_registry_primary_region(registry_name)
27
- base_url = f"https://{primary_region}.api.azureml.ms"
27
+ if primary_region.lower() == "centraluseuap":
28
+ base_url = "https://int.api.azureml-test.ms"
29
+ else:
30
+ base_url = f"https://{primary_region}.api.azureml.ms"
28
31
  super().__init__(base_url, api_key=api_key, max_retries=max_retries, backoff_factor=backoff_factor)
29
32
  self.registry_name = registry_name
30
33
 
@@ -176,7 +176,17 @@
176
176
  "azureOffers": {
177
177
  "description": "Supported azure offer types as a comma-separated string",
178
178
  "type": "string",
179
- "pattern": "^(standard-paygo|RestrictedAccess|PTU|batch-paygo|VM)(?:\\s*,\\s*(standard-paygo|RestrictedAccess|PTU|batch-paygo|VM))*$"
179
+ "pattern": "^(standard-paygo|RestrictedAccess|PTU|batch-paygo|VM|VM-withSurcharge)(?:\\s*,\\s*(standard-paygo|RestrictedAccess|PTU|batch-paygo|VM|VM-withSurcharge))*$"
180
+ },
181
+ "maap-surcharge": {
182
+ "description": "MaaP Surcharge",
183
+ "type": "string",
184
+ "enum": ["true", "false"]
185
+ },
186
+ "maap-surcharge-type": {
187
+ "description": "MaaP Surcharge Type",
188
+ "type": "string",
189
+ "pattern": "^(model)(?:\\s*,\\s*(model))*$"
180
190
  },
181
191
  "benchmark": {
182
192
  "description": "Benchmark type",
@@ -270,7 +280,7 @@
270
280
  "languages": {
271
281
  "description": "Comma-separated list of supported languages (ISO 639-1 language codes)",
272
282
  "type": "string",
273
- "pattern": "^(aa|ab|ae|af|ak|am|an|ar|as|av|ay|az|ba|be|bg|bh|bi|bm|bn|bo|br|bs|ca|ce|ch|co|cr|cs|cu|cv|cy|da|de|dv|dz|ee|el|en|eo|es|et|eu|fa|ff|fi|fj|fo|fr|fy|ga|gd|gl|gn|gu|gv|ha|he|hi|ho|hr|ht|hu|hy|hz|ia|id|ie|ig|ii|ik|io|is|it|iu|ja|jv|ka|kg|ki|kj|kk|kl|km|kn|ko|kr|ks|ku|kv|kw|ky|la|lb|lg|li|ln|lo|lt|lu|lv|mg|mh|mi|mk|ml|mn|mr|ms|mt|my|na|nb|nd|ne|ng|nl|nn|\"no\"|nr|nv|ny|oc|oj|om|or|os|pa|pi|pl|ps|pt|pt-br|qu|rm|rn|ro|ru|rw|sa|sc|sd|se|sg|si|sk|sl|sm|sn|so|sq|sr|ss|st|su|sv|sw|ta|te|tg|th|ti|tk|tl|tn|to|tr|ts|tt|tw|ty|ug|uk|ur|uz|ve|vi|vo|wa|wo|xh|yi|yo|za|zh|zh-cn|zu)(?:\\s*,\\s*(aa|ab|ae|af|ak|am|an|ar|as|av|ay|az|ba|be|bg|bh|bi|bm|bn|bo|br|bs|ca|ce|ch|co|cr|cs|cu|cv|cy|da|de|dv|dz|ee|el|en|eo|es|et|eu|fa|ff|fi|fj|fo|fr|fy|ga|gd|gl|gn|gu|gv|ha|he|hi|ho|hr|ht|hu|hy|hz|ia|id|ie|ig|ii|ik|io|is|it|iu|ja|jv|ka|kg|ki|kj|kk|kl|km|kn|ko|kr|ks|ku|kv|kw|ky|la|lb|lg|li|ln|lo|lt|lu|lv|mg|mh|mi|mk|ml|mn|mr|ms|mt|my|na|nb|nd|ne|ng|nl|nn|\"no\"|nr|nv|ny|oc|oj|om|or|os|pa|pi|pl|ps|pt|pt-br|qu|rm|rn|ro|ru|rw|sa|sc|sd|se|sg|si|sk|sl|sm|sn|so|sq|sr|ss|st|su|sv|sw|ta|te|tg|th|ti|tk|tl|tn|to|tr|ts|tt|tw|ty|ug|uk|ur|uz|ve|vi|vo|wa|wo|xh|yi|yo|za|zh|zh-cn|zu))*$"
283
+ "pattern": "^(aa|ab|ae|af|ak|am|an|ar|as|av|ay|az|ba|be|bg|bh|bi|bm|bn|bo|br|bs|ca|ce|ch|co|cr|cs|cu|cv|cy|da|de|dv|dz|ee|el|en|eo|es|et|eu|fa|ff|fi|fj|fo|fr|fy|ga|gd|gl|gn|gu|gv|ha|he|hi|ho|hr|ht|hu|hy|hz|ia|id|ie|ig|ii|ik|io|is|it|iu|ja|jv|ka|kg|ki|kj|kk|kl|km|kn|ko|kr|ks|ku|kv|kw|ky|la|lb|lg|li|ln|lo|lt|lu|lv|mg|mh|mi|mk|ml|mn|mr|ms|mt|my|na|nb|nd|ne|ng|nl|nn|no|nr|nv|ny|oc|oj|om|or|os|pa|pi|pl|ps|pt|pt-br|qu|rm|rn|ro|ru|rw|sa|sc|sd|se|sg|si|sk|sl|sm|sn|so|sq|sr|ss|st|su|sv|sw|ta|te|tg|th|ti|tk|tl|tn|to|tr|ts|tt|tw|ty|ug|uk|ur|uz|ve|vi|vo|wa|wo|xh|yi|yo|za|zh|zh-cn|zu)(?:\\s*,\\s*(aa|ab|ae|af|ak|am|an|ar|as|av|ay|az|ba|be|bg|bh|bi|bm|bn|bo|br|bs|ca|ce|ch|co|cr|cs|cu|cv|cy|da|de|dv|dz|ee|el|en|eo|es|et|eu|fa|ff|fi|fj|fo|fr|fy|ga|gd|gl|gn|gu|gv|ha|he|hi|ho|hr|ht|hu|hy|hz|ia|id|ie|ig|ii|ik|io|is|it|iu|ja|jv|ka|kg|ki|kj|kk|kl|km|kn|ko|kr|ks|ku|kv|kw|ky|la|lb|lg|li|ln|lo|lt|lu|lv|mg|mh|mi|mk|ml|mn|mr|ms|mt|my|na|nb|nd|ne|ng|nl|nn|no|nr|nv|ny|oc|oj|om|or|os|pa|pi|pl|ps|pt|pt-br|qu|rm|rn|ro|ru|rw|sa|sc|sd|se|sg|si|sk|sl|sm|sn|so|sq|sr|ss|st|su|sv|sw|ta|te|tg|th|ti|tk|tl|tn|to|tr|ts|tt|tw|ty|ug|uk|ur|uz|ve|vi|vo|wa|wo|xh|yi|yo|za|zh|zh-cn|zu))*$"
274
284
  },
275
285
  "license": {
276
286
  "description": "License type",
@@ -354,7 +364,7 @@
354
364
  "outputModalities": {
355
365
  "description": "Output modalities supported (e.g., text) as a comma-separated string",
356
366
  "type": "string",
357
- "pattern": "^(audio|csv|embeddings|image|json|pdf|text|video)(?:\\s*,\\s*(audio|csv|embeddings|image|json|pdf|text|video))*$"
367
+ "pattern": "^(audio|csv|embeddings|image|json|pdf|text|video|3D-image)(?:\\s*,\\s*(audio|csv|embeddings|image|json|pdf|text|video|3D-image))*$"
358
368
  },
359
369
  "playgroundRateLimitTier": {
360
370
  "description": "Rate limit tier for playground",
@@ -375,7 +385,7 @@
375
385
  "task": {
376
386
  "description": "Tasks supported by the model as a comma-separated string",
377
387
  "type": "string",
378
- "pattern": "^(audio-analysis|audio-classification|audio-generation|automatic-speech-recognition|chat-completion|completions|content-filters|content-safety|conversational-ai|custom-extraction|data-generation|document-analysis|document-ingestion|document-translation|embeddings|face-detection|fill-mask|forecasting|image-analysis|image-classification|image-feature-extraction|image-text-to-text|image-to-image|image-to-text|intelligent-content-processing|intelligent-document-processing|optical-character-recognition|protein-sequence-generation|protein-structure-prediction|responses|responsible-ai|retrosynthesis-prediction|summarization|text-analysis|text-analytics|text-classification|text-generation|text-to-image|text-to-speech|time-series-forecasting|translation|speech-to-text|speech-translation|video-analysis|video-generation|video-text-to-text|visual-question-answering|zero-shot-classification|zero-shot-image-classification|materials-design)(?:\\s*,\\s*(audio-analysis|audio-classification|audio-generation|automatic-speech-recognition|chat-completion|completions|content-filters|content-safety|conversational-ai|custom-extraction|data-generation|document-analysis|document-ingestion|document-translation|embeddings|face-detection|fill-mask|forecasting|image-analysis|image-classification|image-feature-extraction|image-text-to-text|image-to-image|image-to-text|intelligent-content-processing|intelligent-document-processing|optical-character-recognition|protein-sequence-generation|protein-structure-prediction|responses|responsible-ai|summarization|text-analysis|text-analytics|text-classification|text-generation|text-to-image|text-to-speech|time-series-forecasting|translation|speech-to-text|speech-translation|video-analysis|video-generation|video-text-to-text|visual-question-answering|zero-shot-classification|zero-shot-image-classification|materials-design))*$"
388
+ "pattern": "^(audio-analysis|audio-classification|audio-generation|automatic-speech-recognition|chat-completion|completions|content-filters|content-safety|conversational-ai|custom-extraction|data-generation|document-analysis|document-ingestion|document-translation|embeddings|face-detection|fill-mask|forecasting|image-analysis|image-classification|image-feature-extraction|image-text-to-text|image-to-image|image-to-text|intelligent-content-processing|intelligent-document-processing|text-pii-extraction|conversation-pii-extraction|document-pii-extraction|detect-language|optical-character-recognition|protein-sequence-generation|protein-structure-prediction|responses|responsible-ai|retrosynthesis-prediction|summarization|text-analysis|text-analytics|text-classification|text-generation|text-to-image|text-to-speech|time-series-forecasting|translation|speech-to-text|speech-translation|video-analysis|video-generation|video-text-to-text|visual-question-answering|zero-shot-classification|zero-shot-image-classification|materials-design|atomistic-modelling|image-to-3D|text-to-3D|3D-generation|task-completion-verification|action-affordance|next-plausible-action-prediction|Structure-Prediction|Genomics)(?:\\s*,\\s*(audio-analysis|audio-classification|audio-generation|automatic-speech-recognition|chat-completion|completions|content-filters|content-safety|conversational-ai|custom-extraction|data-generation|document-analysis|document-ingestion|document-translation|embeddings|face-detection|fill-mask|forecasting|image-analysis|image-classification|image-feature-extraction|image-text-to-text|image-to-image|image-to-text|intelligent-content-processing|intelligent-document-processing|optical-character-recognition|protein-sequence-generation|protein-structure-prediction|responses|responsible-ai|summarization|text-analysis|text-analytics|text-classification|text-generation|text-pii-extraction|conversation-pii-extraction|document-pii-extraction|detect-language|text-to-image|text-to-speech|time-series-forecasting|translation|speech-to-text|speech-translation|video-analysis|video-generation|video-text-to-text|visual-question-answering|zero-shot-classification|zero-shot-image-classification|materials-design|atomistic-modelling|image-to-3D|text-to-3D|3D-generation|task-completion-verification|action-affordance|next-plausible-action-prediction|Structure-Prediction|Genomics))*$"
379
389
  },
380
390
  "textContextWindow": {
381
391
  "description": "Context window size",
@@ -442,12 +452,488 @@
442
452
  }
443
453
  }
444
454
  },
455
+ "system_metadata": {
456
+ "type": "object",
457
+ "description": "Model system metadata",
458
+ "additionalProperties": false,
459
+ "properties": {
460
+ "invisibleUntil": {
461
+ "type": "string",
462
+ "format": "date-time",
463
+ "description": "Date until which the model is invisible"
464
+ },
465
+ "playgroundRateLimitTier": {
466
+ "type": "string",
467
+ "description": "Rate limit tier for playground",
468
+ "enum": [
469
+ "high",
470
+ "low",
471
+ "custom",
472
+ "embeddings"
473
+ ]
474
+ },
475
+ "publisher": {
476
+ "type": "string",
477
+ "description": "Model provider/author name"
478
+ },
479
+ "license": {
480
+ "type": "string",
481
+ "description": "License type",
482
+ "enum": [
483
+ "custom",
484
+ "other",
485
+ "llama2",
486
+ "apache-2.0",
487
+ "Llama 3.1 Community Licensed",
488
+ "MIT"
489
+ ]
490
+ },
491
+ "licenseDescription": {
492
+ "type": "string",
493
+ "description": "Description of the license terms",
494
+ "format": "long-string"
495
+ },
496
+ "summary": {
497
+ "type": "string",
498
+ "description": "Brief description of the model",
499
+ "format": "long-string"
500
+ },
501
+ "displayName": {
502
+ "type": "string",
503
+ "description": "Display name for marketing materials"
504
+ },
505
+ "keywords": {
506
+ "type": "array",
507
+ "items": {
508
+ "$ref": "#/definitions/keywordsEnum"
509
+ },
510
+ "description": "List of key words. Max 3 keywords"
511
+ },
512
+ "languages": {
513
+ "type": "array",
514
+ "items": {
515
+ "type": "string",
516
+ "pattern": "^(aa|ab|ae|af|ak|am|an|ar|as|av|ay|az|ba|be|bg|bh|bi|bm|bn|bo|br|bs|ca|ce|ch|co|cr|cs|cu|cv|cy|da|de|dv|dz|ee|el|en|eo|es|et|eu|fa|ff|fi|fj|fo|fr|fy|ga|gd|gl|gn|gu|gv|ha|he|hi|ho|hr|ht|hu|hy|hz|ia|id|ie|ig|ii|ik|io|is|it|iu|ja|jv|ka|kg|ki|kj|kk|kl|km|kn|ko|kr|ks|ku|kv|kw|ky|la|lb|lg|li|ln|lo|lt|lu|lv|mg|mh|mi|mk|ml|mn|mr|ms|mt|my|na|nb|nd|ne|ng|nl|nn|no|nr|nv|ny|oc|oj|om|or|os|pa|pi|pl|ps|pt|pt-br|qu|rm|rn|ro|ru|rw|sa|sc|sd|se|sg|si|sk|sl|sm|sn|so|sq|sr|ss|st|su|sv|sw|ta|te|tg|th|ti|tk|tl|tn|to|tr|ts|tt|tw|ty|ug|uk|ur|uz|ve|vi|vo|wa|wo|xh|yi|yo|za|zh|zh-cn|zu)$"
517
+ },
518
+ "description": "Supported languages (ISO 639-1 language codes)"
519
+ },
520
+ "textContextWindow": {
521
+ "type": "integer",
522
+ "minimum": 1,
523
+ "description": "Context window size"
524
+ },
525
+ "maxOutputTokens": {
526
+ "type": "integer",
527
+ "minimum": 1,
528
+ "description": "Maximum number of output tokens"
529
+ },
530
+ "inputModalities": {
531
+ "type": "array",
532
+ "items": {
533
+ "$ref": "#/definitions/modalitiesEnum"
534
+ },
535
+ "description": "Input modalities supported (e.g., text, image, audio)"
536
+ },
537
+ "outputModalities": {
538
+ "type": "array",
539
+ "items": {
540
+ "type": "string",
541
+ "enum": [
542
+ "audio",
543
+ "csv",
544
+ "embeddings",
545
+ "image",
546
+ "json",
547
+ "pdf",
548
+ "text",
549
+ "video",
550
+ "3D-image"
551
+ ]
552
+ },
553
+ "description": "Output modalities supported (e.g., text)"
554
+ },
555
+ "modelCapabilities": {
556
+ "type": "array",
557
+ "items": {
558
+ "type": "string",
559
+ "enum": [
560
+ "agents",
561
+ "assistants",
562
+ "routing",
563
+ "reasoning",
564
+ "streaming",
565
+ "tool-calling"
566
+ ]
567
+ },
568
+ "description": "Model capabilities (e.g., agents, assistants)"
569
+ },
570
+ "playground_rate_limit_tier": {
571
+ "type": "string",
572
+ "description": "Rate limit tier for playground",
573
+ "enum": [
574
+ "high",
575
+ "low",
576
+ "custom",
577
+ "embeddings"
578
+ ]
579
+ },
580
+ "azureOffers": {
581
+ "type": "array",
582
+ "items": {
583
+ "type": "string",
584
+ "enum": [
585
+ "standard-paygo",
586
+ "RestrictedAccess",
587
+ "PTU",
588
+ "batch-paygo",
589
+ "VM",
590
+ "VM-withSurcharge"
591
+ ]
592
+ },
593
+ "description": "Supported azure offer types"
594
+ },
595
+ "baseModelWeightsVersion": {
596
+ "oneOf": [
597
+ {
598
+ "type": "string"
599
+ },
600
+ {
601
+ "type": "number",
602
+ "minimum": 1.0
603
+ }
604
+ ]
605
+ },
606
+ "sharedComputeCapacityEnabled": {
607
+ "type": "boolean",
608
+ "description": "Whether shared compute capacity is enabled"
609
+ },
610
+ "freePlayground": {
611
+ "type": "boolean",
612
+ "description": "Whether the model is available in free playground"
613
+ },
614
+ "deploymentOptions": {
615
+ "type": "array",
616
+ "items": {
617
+ "type": "string",
618
+ "enum": [
619
+ "ServerlessMaaS",
620
+ "UnifiedEndpointMaaS",
621
+ "MaaP",
622
+ "AOAI",
623
+ "Restricted",
624
+ "MonetizedMaaP"
625
+ ]
626
+ },
627
+ "description": "Which types of deployment are supported in the UI"
628
+ },
629
+ "inferenceSupportedEnvs": {
630
+ "type": "array",
631
+ "items": {
632
+ "type": "string",
633
+ "enum": [
634
+ "ds_mii",
635
+ "hf",
636
+ "vllm"
637
+ ]
638
+ },
639
+ "description": "Supported inference environments"
640
+ },
641
+ "isDirectFromAzure": {
642
+ "type": "boolean",
643
+ "description": "If the model is an Azure Direct model"
644
+ },
645
+ "inferenceEnvironmentAssetId": {
646
+ "type": "string",
647
+ "pattern": "azureml://registries/([^/]+)/environments/([^/]+)/versions/([^/]+)"
648
+ },
649
+ "modelArchitecture": {
650
+ "type": "string",
651
+ "description": "Model architecture type"
652
+ },
653
+ "componentVersion": {
654
+ "type": "string",
655
+ "description": "Version of the model component"
656
+ },
657
+ "modelPath": {
658
+ "type": "string",
659
+ "description": "Path to the model files or artifacts"
660
+ },
661
+ "aotManifest": {
662
+ "type": "string",
663
+ "description": "Ahead-of-time compilation manifest for the model"
664
+ },
665
+ "hasDeltaWeights": {
666
+ "type": "boolean",
667
+ "description": "Whether the model uses delta weights"
668
+ },
669
+ "featured": {
670
+ "type": "boolean",
671
+ "description": "Whether the model is featured"
672
+ },
673
+ "preview": {
674
+ "type": "boolean",
675
+ "description": "Whether the model is in preview"
676
+ },
677
+ "benchmark": {
678
+ "type": "string",
679
+ "description": "Benchmark type",
680
+ "enum": [
681
+ "quality",
682
+ "embeddings"
683
+ ]
684
+ },
685
+ "datasets": {
686
+ "type": "array",
687
+ "items": {
688
+ "type": "string",
689
+ "enum": [
690
+ "Publicly available sources",
691
+ "bookcorpus",
692
+ "wikipedia"
693
+ ]
694
+ },
695
+ "description": "Where data was sourced for training"
696
+ },
697
+ "industry": {
698
+ "type": "string",
699
+ "description": "The industry for the model",
700
+ "enum": [
701
+ "consumer-goods",
702
+ "health-and-life-sciences",
703
+ "manufacturing",
704
+ "mobility",
705
+ "financial-services"
706
+ ]
707
+ },
708
+ "trainingDataDate": {
709
+ "type": "string",
710
+ "description": "Training cutoff date",
711
+ "pattern": "^(January|February|March|April|May|June|July|August|September|October|November|December)\\s+\\d{4}$",
712
+ "format": "month-year"
713
+ },
714
+ "evaluation": {
715
+ "type": "string",
716
+ "description": "Reference to evaluation documentation"
717
+ },
718
+ "notes": {
719
+ "type": "string",
720
+ "description": "Reference to notes documentation"
721
+ },
722
+ "featureFlags": {
723
+ "type": "array",
724
+ "items": {
725
+ "type": "string",
726
+ "enum": [
727
+ "OpenAI.EAGatingTier",
728
+ "OpenAI.EnterpriseTier",
729
+ "OpenAI.1PGatingTier",
730
+ "OpenAI.OneVetGatingTier",
731
+ "OpenAI.1000CUGatingTier",
732
+ "OpenAI.computer-use-preview",
733
+ "OpenAI.Preview.202409",
734
+ "OpenAITest",
735
+ "AIServices.grok-4-code",
736
+ "AIServices.grok-4"
737
+ ]
738
+ },
739
+ "description": "List of feature flags for the models to gate usage"
740
+ },
741
+ "tasks": {
742
+ "type": "object",
743
+ "description": "Tasks that the model can perform",
744
+ "additionalProperties": false,
745
+ "properties": {
746
+ "inferenceTasks": {
747
+ "type": "array",
748
+ "items": {
749
+ "$ref": "#/definitions/taskEnum"
750
+ },
751
+ "description": "Tasks supported by the model"
752
+ },
753
+ "fineTuningTasks": {
754
+ "type": "array",
755
+ "items": {
756
+ "$ref": "#/definitions/finetuningTasksEnum"
757
+ },
758
+ "description": "Tasks for which the model can be fine-tuned"
759
+ },
760
+ "fineTuningMethods": {
761
+ "type": "array",
762
+ "description": "Methods for finetuning the model",
763
+ "items": {
764
+ "type": "string"
765
+ }
766
+ }
767
+ }
768
+ },
769
+ "platformCapabilities": {
770
+ "type": "object",
771
+ "description": "Platform-specific capabilities and settings",
772
+ "additionalProperties": false,
773
+ "properties": {
774
+ "enableMaap": {
775
+ "type": "boolean",
776
+ "description": "Whether MAAP is enabled (inverse of disable-maap)"
777
+ },
778
+ "enableBatch": {
779
+ "type": "boolean",
780
+ "description": "Whether batch processing is enabled (inverse of disable-batch)"
781
+ },
782
+ "maasInference": {
783
+ "type": "boolean",
784
+ "description": "Whether MaaS inference is enabled"
785
+ },
786
+ "maasFineTuning": {
787
+ "type": "boolean",
788
+ "description": "Whether MaaS fine-tuning is enabled"
789
+ }
790
+ }
791
+ },
792
+ "supportedComputes": {
793
+ "type": "object",
794
+ "description": "Compute types supported for different operations",
795
+ "additionalProperties": false,
796
+ "properties": {
797
+ "evaluationComputes": {
798
+ "type": "array",
799
+ "items": {
800
+ "$ref": "#/definitions/skuEnum"
801
+ },
802
+ "description": "List of compute SKUs allowed for evaluation"
803
+ },
804
+ "finetuneComputes": {
805
+ "type": "array",
806
+ "items": {
807
+ "$ref": "#/definitions/skuEnum"
808
+ },
809
+ "description": "List of compute SKUs allowed for finetune with maap"
810
+ },
811
+ "inferenceComputes": {
812
+ "type": "array",
813
+ "items": {
814
+ "$ref": "#/definitions/skuEnum"
815
+ },
816
+ "description": "List of compute SKUs allowed for inference"
817
+ }
818
+ }
819
+ },
820
+ "sku": {
821
+ "type": "object",
822
+ "description": "SKU specifications for different operations",
823
+ "additionalProperties": false,
824
+ "properties": {
825
+ "finetuneRecommendedSku": {
826
+ "description": "Skus that can be used for finetune maap",
827
+ "$ref": "#/definitions/skuListDefinition"
828
+ },
829
+ "evaluationMinSkuSpec": {
830
+ "type": "string",
831
+ "description": "Minimum SKU specification for evaluation in the format of 'cores|GPUs|RAM(GB)|VRAM(GB)'",
832
+ "pattern": "^\\d+\\|\\d+\\|\\d+\\|\\d+$",
833
+ "format": "sku-spec"
834
+ },
835
+ "evaluationRecommendedSku": {
836
+ "description": "Evaluation recommended sku",
837
+ "$ref": "#/definitions/skuListDefinition"
838
+ },
839
+ "finetuneMinSkuSpec": {
840
+ "type": "string",
841
+ "description": "Minimum SKU specification for finetune in the format of 'cores|GPUs|RAM(GB)|VRAM(GB)'",
842
+ "pattern": "^\\d+\\|\\d+\\|\\d+\\|\\d+$",
843
+ "format": "sku-spec"
844
+ },
845
+ "inferenceMinSkuSpec": {
846
+ "type": "string",
847
+ "description": "Minimum SKU specification for inference in the format of 'cores|GPUs|RAM(GB)|VRAM(GB)'",
848
+ "pattern": "^\\d+\\|\\d+\\|\\d+\\|\\d+$",
849
+ "format": "sku-spec"
850
+ },
851
+ "inferenceRecommendedSku": {
852
+ "description": "A list of comma separated skus that the client should use to deploy the model",
853
+ "$ref": "#/definitions/skuListDefinition"
854
+ }
855
+ }
856
+ },
857
+ "maasFinetuning": {
858
+ "type": "object",
859
+ "description": "Model-as-a-Service fine-tuning configuration",
860
+ "additionalProperties": false,
861
+ "properties": {
862
+ "maasFinetuningTest": {
863
+ "type": "boolean",
864
+ "description": "Used for testing maas-finetuning in INT"
865
+ },
866
+ "maasFinetuningDeployRegions": {
867
+ "type": "array",
868
+ "items": {
869
+ "type": "string",
870
+ "enum": [
871
+ "eastus2",
872
+ "eastus",
873
+ "northcentralus",
874
+ "westus3",
875
+ "westus",
876
+ "southcentralus"
877
+ ]
878
+ },
879
+ "description": "Regions where fine-tuned models can be deployed"
880
+ },
881
+ "maasFinetuningOffer": {
882
+ "type": "boolean",
883
+ "description": "Whether MaaS fine-tuning offer is available"
884
+ },
885
+ "maasFinetuningRegions": {
886
+ "type": "string",
887
+ "description": "Regions where fine-tuning is available as a comma-separated string",
888
+ "pattern": "^(westus3|eastus2|eastus|southcentralus|northcentralus|westus)(?:\\s*,\\s*(westus3|eastus2|eastus|southcentralus|northcentralus|westus))*$"
889
+ }
890
+ }
891
+ },
892
+ "deprecation": {
893
+ "type": "object",
894
+ "description": "Deprecation and retirement schedule information",
895
+ "additionalProperties": false,
896
+ "properties": {
897
+ "finetuneDeprecationDate": {
898
+ "type": "string",
899
+ "description": "The date that finetune will be deprecated. Date format yyyy-MM-dd. The deprecation will happen at midnight UTC",
900
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
901
+ "format": "date-time"
902
+ },
903
+ "finetuneRetirementDate": {
904
+ "type": "string",
905
+ "description": "The date that finetune will be retired. Date format yyyy-MM-dd. The retirement will happen at midnight UTC",
906
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
907
+ "format": "date-time"
908
+ },
909
+ "inferenceDeprecationDate": {
910
+ "type": "string",
911
+ "description": "The date that inference will be deprecated. Date format yyyy-MM-dd. The deprecation will happen at midnight UTC",
912
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
913
+ "format": "date-time"
914
+ },
915
+ "inferenceLegacyDate": {
916
+ "type": "string",
917
+ "description": "The date that inference will become legacy. Date format yyyy-MM-dd. The change will happen at midnight UTC",
918
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
919
+ "format": "date-time"
920
+ },
921
+ "inferenceRetirementDate": {
922
+ "type": "string",
923
+ "description": "The date that inference will be retired. Date format yyyy-MM-dd. The retirement will happen at midnight UTC",
924
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
925
+ "format": "date-time"
926
+ }
927
+ }
928
+ }
929
+ }
930
+ },
445
931
  "version": {
446
932
  "description": "Model version",
447
933
  "oneOf": [{ "type": "string" }, { "type": "integer", "minimum": 1 }]
448
934
  }
449
935
  },
450
- "required": ["$schema", "name", "path", "tags", "version"],
936
+ "required": ["$schema", "name", "path", "version"],
451
937
  "definitions": {
452
938
  "skuListDefinition": {
453
939
  "type": "string",
@@ -558,7 +1044,8 @@
558
1044
  "speech-translation",
559
1045
  "video-analysis",
560
1046
  "video-generation",
561
- "materials-design"
1047
+ "materials-design",
1048
+ "atomistic-modelling"
562
1049
  ]
563
1050
  },
564
1051
  "finetuningTasksListDefinition": {
@@ -619,7 +1106,7 @@
619
1106
  "featureFlagsListDefinition": {
620
1107
  "type": "string",
621
1108
  "description": "A comma-separated list of valid feature flags with no duplicates",
622
- "pattern": "^(OpenAI\\.EAGatingTier|OpenAI\\.EnterpriseTier|OpenAI\\.1PGatingTier|OpenAI\\.OneVetGatingTier|OpenAI\\.1000CUGatingTier|OpenAI\\.computer-use-preview|OpenAI\\.Preview\\.202409|OpenAITest|AIServices\\.grok-4-code)(?:\\s*,\\s*(OpenAI\\.EAGatingTier|OpenAI\\.EnterpriseTier|OpenAI\\.1PGatingTier|OpenAI\\.OneVetGatingTier|OpenAI\\.1000CUGatingTier|OpenAI\\.computer-use-preview|OpenAI\\.Preview\\.202409|OpenAITest|AIServices\\.grok-4-code))*$"
1109
+ "pattern": "^(OpenAI\\.EAGatingTier|OpenAI\\.EnterpriseTier|OpenAI\\.1PGatingTier|OpenAI\\.OneVetGatingTier|OpenAI\\.1000CUGatingTier|OpenAI\\.computer-use-preview|OpenAI\\.Preview\\.202409|OpenAITest|AIServices\\.grok-4-code|AIServices\\.grok-4)(?:\\s*,\\s*(OpenAI\\.EAGatingTier|OpenAI\\.EnterpriseTier|OpenAI\\.1PGatingTier|OpenAI\\.OneVetGatingTier|OpenAI\\.1000CUGatingTier|OpenAI\\.computer-use-preview|OpenAI\\.Preview\\.202409|OpenAITest|AIServices\\.grok-4-code|AIServices\\.grok-4))*$"
623
1110
  }
624
1111
  }
625
1112
  }
@@ -3,6 +3,7 @@
3
3
  # ---------------------------------------------------------
4
4
  """Asset management commands for registry-mgmt CLI."""
5
5
 
6
+ import requests
6
7
  import sys
7
8
  import shutil
8
9
  import tempfile
@@ -16,6 +17,7 @@ from azure.identity import DefaultAzureCredential
16
17
 
17
18
  from azureml.registry.data.validate_model_schema import validate_model_schema
18
19
  from azureml.registry.data.validate_model_variant_schema import validate_model_variant_schema
20
+ from azureml.registry._rest_client.registry_management_client import RegistryManagementClient
19
21
 
20
22
  # Windows compatibility patch - must be applied before importing azureml.assets
21
23
  from subprocess import run
@@ -87,6 +89,52 @@ def validate_model(asset_path: Path, allow_additional_properties: bool = False)
87
89
  return True
88
90
 
89
91
 
92
+ def put_system_metadata(ml_client: MLClient, asset: AssetConfig, registry: str, system_metadata: dict):
93
+ """PUT system metadata for an asset.
94
+
95
+ Args:
96
+ ml_client (MLClient): ML client.
97
+ asset (AssetConfig): Asset config.
98
+ registry (str): Name of registry.
99
+ system_metadata (dict): System metadata payload.
100
+ """
101
+ # Use RegistryManagementClient for discovery
102
+ registry_mgmt_client = RegistryManagementClient(registry_name=registry)
103
+ discovery = registry_mgmt_client.discovery()
104
+
105
+ # Extract the needed components
106
+ base_url = discovery.get('registryFqdns', {}).get(discovery.get('primaryRegion', '').lower(), {}).get('uri')
107
+ subscription_id = discovery.get('subscriptionId')
108
+ resource_group = discovery.get('resourceGroup')
109
+
110
+ # Build the URL
111
+ mms_id = f"{asset.name}:{asset.version}"
112
+ url = (f"{base_url}/modelregistry/v1.0/subscriptions/{subscription_id}/resourceGroups/{resource_group}/"
113
+ f"providers/Microsoft.MachineLearningServices/registries/{registry}/models/{mms_id}/systemMetadata")
114
+
115
+ # Get token and make request
116
+ access_token = ml_client._credential.get_token("https://ml.azure.com").token
117
+ headers = {
118
+ "Content-Type": "application/json",
119
+ "Authorization": f"Bearer {access_token}"
120
+ }
121
+
122
+ print("Attempting to PUT system metadata")
123
+ print(f"Payload: {system_metadata}")
124
+
125
+ response = requests.put(url, headers=headers, json=system_metadata)
126
+
127
+ if response.status_code in [200, 201, 202]:
128
+ print("PUT request successful")
129
+ return response.json()
130
+ else:
131
+ print(f"PUT request failed: {url}")
132
+ print(f"Status Code: {response.status_code}")
133
+ print(f"Response: {response.reason}")
134
+ print(f"Content: {response.text}")
135
+ raise Exception(response.reason)
136
+
137
+
90
138
  def build_mutable_asset(base_asset: AssetConfig, mutable_asset_dir: str, override_storage: bool = False) -> AssetConfig:
91
139
  """Build a mutable copy of the asset in a temporary directory.
92
140
 
@@ -97,6 +145,7 @@ def build_mutable_asset(base_asset: AssetConfig, mutable_asset_dir: str, overrid
97
145
 
98
146
  Returns:
99
147
  AssetConfig: Mutable asset configuration object
148
+ system_metadata_payload (dict): Extracted system metadata from asset spec
100
149
  """
101
150
  common_dir, _ = util.find_common_directory(base_asset.release_paths)
102
151
 
@@ -114,20 +163,19 @@ def build_mutable_asset(base_asset: AssetConfig, mutable_asset_dir: str, overrid
114
163
  spec_config_file = mutable_asset_dir / base_spec_file.relative_to(common_dir)
115
164
  model_config_file = mutable_asset_dir / base_model_file.relative_to(common_dir)
116
165
 
166
+ with open(spec_config_file, "r") as f:
167
+ spec_config = yaml.safe_load(f)
168
+
117
169
  # Override storage info for model card preview
118
170
  if override_storage:
119
171
  print("Model card preview - Default setting version and storage info")
120
172
 
121
173
  # Autoincrement version for mutable asset
122
- with open(spec_config_file, "r") as f:
123
- spec_config = yaml.safe_load(f)
124
- spec_config["version"] = datetime.now().strftime("%Y%m%d%H%M%S")
174
+ spec_config["version"] = datetime.now().strftime("%Y%m%d%H%M%S")
125
175
 
126
176
  # Remove intellectualPropertyPublisher if it exists in properties
127
- spec_config["properties"].pop("intellectualPropertyPublisher", None)
128
-
129
- with open(spec_config_file, "w") as f:
130
- yaml.dump(spec_config, f)
177
+ if "properties" in spec_config:
178
+ spec_config["properties"].pop("intellectualPropertyPublisher", None)
131
179
 
132
180
  # Create dummy file to upload to storage
133
181
  with open(mutable_asset_dir / "dummy.txt", "w") as f:
@@ -147,9 +195,23 @@ def build_mutable_asset(base_asset: AssetConfig, mutable_asset_dir: str, overrid
147
195
  with open(model_config_file, "w") as f:
148
196
  yaml.dump(new_model_config, f)
149
197
 
198
+ # Extract system_metadata from model spec
199
+ # PUT request will be made after asset creation while the SDK update/PATCH logic is being updated
200
+ system_metadata_payload = spec_config.pop("system_metadata", {})
201
+ if system_metadata_payload:
202
+ print(f"system_metadata found in model spec. Extracted system_metadata and saved "
203
+ f"to system_metadata: {system_metadata_payload}")
204
+ else:
205
+ print(f"No system_metadata found in model spec. Using system metadata payload {system_metadata_payload}")
206
+
207
+ # Write updated spec config back to the file
208
+ if override_storage or system_metadata_payload:
209
+ with open(spec_config_file, "w") as f:
210
+ yaml.dump(spec_config, f)
211
+
150
212
  mutable_asset = AssetConfig(asset_config_file)
151
213
 
152
- return mutable_asset
214
+ return mutable_asset, system_metadata_payload
153
215
 
154
216
 
155
217
  def create_or_update_asset(readonly_asset: AssetConfig, registry_name: str, subscription_id: str, resource_group: str, override_storage: bool = False):
@@ -174,7 +236,7 @@ def create_or_update_asset(readonly_asset: AssetConfig, registry_name: str, subs
174
236
  )
175
237
 
176
238
  with tempfile.TemporaryDirectory() as mutable_asset_dir:
177
- mutable_asset = build_mutable_asset(base_asset=readonly_asset, mutable_asset_dir=mutable_asset_dir, override_storage=override_storage)
239
+ mutable_asset, system_metadata_payload = build_mutable_asset(base_asset=readonly_asset, mutable_asset_dir=mutable_asset_dir, override_storage=override_storage)
178
240
  try:
179
241
  success = create_asset(mutable_asset, registry_name, ml_client)
180
242
  if not success:
@@ -183,6 +245,14 @@ def create_or_update_asset(readonly_asset: AssetConfig, registry_name: str, subs
183
245
  print(f"Failed to create/update asset: {e}")
184
246
  raise
185
247
 
248
+ # PUT system metadata after model creation
249
+ if success:
250
+ try:
251
+ put_system_metadata(ml_client, mutable_asset, registry_name, system_metadata_payload)
252
+ except Exception as e:
253
+ print(f"Failed to update {mutable_asset.name} with system metadata: {e}")
254
+ raise
255
+
186
256
  print("\n[VALIDATE YOUR ASSET IN THE UI HERE]")
187
257
  print(f" - Model Catalog link: https://ai.azure.com/explore/models/{mutable_asset.name}/version/{mutable_asset.version}/registry/{registry_name}")
188
258
  print(f" - Azure Portal link: https://ml.azure.com/registries/{registry_name}/models/{mutable_asset.name}/version/{mutable_asset.version}")
@@ -275,7 +275,7 @@ def create_or_update_assets(input_dir: Path,
275
275
  subscription_id=repo2registry_config.subscription_id,
276
276
  resource_group_name=repo2registry_config.resource_group,
277
277
  registry_name=repo2registry_config.registry_name,
278
- credential=DefaultAzureCredential(),
278
+ credential=DefaultAzureCredential(), # CodeQL [SM05139] DefaultAzureCredential should only be used for local development and testing purposes.
279
279
  )
280
280
 
281
281
  results_dict = {}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: azureml-registry-tools
3
- Version: 0.1.0a20
3
+ Version: 0.1.0a25
4
4
  Summary: AzureML Registry tools and CLI
5
5
  Author: Microsoft Corp
6
6
  License: https://aka.ms/azureml-sdk-license
@@ -18,7 +18,7 @@ exclude_list = ["*.tests"]
18
18
 
19
19
  setup(
20
20
  name='azureml-registry-tools',
21
- version="0.1.0a20",
21
+ version="0.1.0a25",
22
22
  description='AzureML Registry tools and CLI',
23
23
  author='Microsoft Corp',
24
24
  license="https://aka.ms/azureml-sdk-license",