azureml-registry-tools 0.1.0a23__py3-none-any.whl → 0.1.0a25__py3-none-any.whl

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.
@@ -275,12 +275,12 @@
275
275
  "keywords": {
276
276
  "description": "List of key words as a comma-separated string. Max 3 keywords",
277
277
  "type": "string",
278
- "pattern": "^(Agents|Audio|Coding|Conversation|Instruction|Large context|Low latency|Multilingual|Multimodal|Multipurpose|RAG|Reasoning|Summarization|Translation|Understanding|Vision|Atomistic generation|Chat|Hybrid Reasoning|Vision Language Model)(?:\\s*,\\s*(Agents|Audio|Coding|Conversation|Instruction|Large context|Low latency|Multilingual|Multimodal|Multipurpose|RAG|Reasoning|Summarization|Translation|Understanding|Vision|Atomistic generation|Chat|Hybrid Reasoning|Vision Language Model)){0,2}$"
278
+ "pattern": "^(Agents|Audio|Coding|Conversation|Instruction|Large context|Low latency|Multilingual|Multimodal|Multipurpose|RAG|Reasoning|Summarization|Translation|Understanding|Vision|Atomistic generation)(?:\\s*,\\s*(Agents|Audio|Coding|Conversation|Instruction|Large context|Low latency|Multilingual|Multimodal|Multipurpose|RAG|Reasoning|Summarization|Translation|Understanding|Vision|Atomistic generation)){0,2}$"
279
279
  },
280
280
  "languages": {
281
281
  "description": "Comma-separated list of supported languages (ISO 639-1 language codes)",
282
282
  "type": "string",
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))*$"
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))*$"
284
284
  },
285
285
  "license": {
286
286
  "description": "License type",
@@ -385,7 +385,7 @@
385
385
  "task": {
386
386
  "description": "Tasks supported by the model as a comma-separated string",
387
387
  "type": "string",
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|explanation-and-chain-of-thought-reasoning|video-analytics-and-spatial-temporal-awareness)(?:\\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|explanation-and-chain-of-thought-reasoning|video-analytics-and-spatial-temporal-awareness))*$"
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))*$"
389
389
  },
390
390
  "textContextWindow": {
391
391
  "description": "Context window size",
@@ -452,12 +452,488 @@
452
452
  }
453
453
  }
454
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
+ },
455
931
  "version": {
456
932
  "description": "Model version",
457
933
  "oneOf": [{ "type": "string" }, { "type": "integer", "minimum": 1 }]
458
934
  }
459
935
  },
460
- "required": ["$schema", "name", "path", "tags", "version"],
936
+ "required": ["$schema", "name", "path", "version"],
461
937
  "definitions": {
462
938
  "skuListDefinition": {
463
939
  "type": "string",
@@ -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}")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: azureml-registry-tools
3
- Version: 0.1.0a23
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
@@ -13,13 +13,13 @@ azureml/registry/data/asset.yaml.template,sha256=WTgfuvKEBp-EVFSQ0JpU0h4z_ULJdUL
13
13
  azureml/registry/data/description.md.template,sha256=wQLk54U8hoXU1y9235R4irc6FGYPXGO-x9EHUorP15Q,84
14
14
  azureml/registry/data/evaluation.md.template,sha256=JaDecIfLV9vZDUrZzVRPzVHHnKD-BQGBgQ-cw1dHavU,277
15
15
  azureml/registry/data/model-variant.schema.json,sha256=AT4Dy6cCtp_SFUfSqYIqcER8AldpYm0QIEy1abY3QWE,1699
16
- azureml/registry/data/model.schema.json,sha256=j6orgqiVNpQYbvrphBZDLtWxslTXUy0VrTnC6Int200,29192
16
+ azureml/registry/data/model.schema.json,sha256=zkg4hnHbn7AAaTOOlOLkdPYJPT0OHGnr8s65G9faJo0,45338
17
17
  azureml/registry/data/model.yaml.template,sha256=h5uqAN22FLaWrbPxIb8yVKH9cGDBrIwooXYYfsKhxDw,245
18
18
  azureml/registry/data/notes.md.template,sha256=zSRyOR__9NGL2j0tugY7HgFkwkAdcE2pJyyyGsz1SAk,248
19
19
  azureml/registry/data/validate_model_schema.py,sha256=OQp2E01kdxSphvUQYQvelSiD24-qUG6nTFuzW60wX2c,8322
20
20
  azureml/registry/data/validate_model_variant_schema.py,sha256=JPVNtRBn6qciMu4PaRXOvS86OGGW0cocL2Rri4xYKo8,3629
21
21
  azureml/registry/mgmt/__init__.py,sha256=LMhqcEC8ItmmpKZljElGXH-6olHlT3SLl0dJU01OvuM,226
22
- azureml/registry/mgmt/asset_management.py,sha256=x-deg8nwVODqDlIAZOagzghuBS7qG-j8h35TO0hcicI,11129
22
+ azureml/registry/mgmt/asset_management.py,sha256=kt607xr81-sTa7qq5ndpVfq4IaCutNsrqZWmmBoZz2g,14189
23
23
  azureml/registry/mgmt/create_asset_template.py,sha256=ejwLuIsmzJOoUePoxbM-eGMg2E3QHfdX-nPMBzYUVMQ,3525
24
24
  azureml/registry/mgmt/create_manifest.py,sha256=N9wRmjAKO09A3utN_lCUsM_Ufpj7PL0SJz-XHPHWuyM,9528
25
25
  azureml/registry/mgmt/create_model_spec.py,sha256=1PdAcUf-LomvljoT8wKQihXMTLd7DoTgN0qDX4Lol1A,10473
@@ -30,9 +30,9 @@ azureml/registry/tools/config.py,sha256=tjPaoBsWtPXBL8Ww1hcJtsr2SuIjPKt79dR8iovc
30
30
  azureml/registry/tools/create_or_update_assets.py,sha256=7LcuBzwU-HNE9ADG2igFXI696aKR028yTYxMuDtjVmA,16095
31
31
  azureml/registry/tools/registry_utils.py,sha256=zgYlCiOONtQJ4yZ9wg8tKVoE8dh6rrjB8hYBGhpV9-0,1403
32
32
  azureml/registry/tools/repo2registry_config.py,sha256=eXp_tU8Jyi30g8xGf7wbpLgKEPpieohBANKxMSLzq7s,4873
33
- azureml_registry_tools-0.1.0a23.dist-info/licenses/LICENSE.txt,sha256=n20rxwp7_NGrrShv9Qvcs90sjI1l3Pkt3m-5OPCWzgs,845
34
- azureml_registry_tools-0.1.0a23.dist-info/METADATA,sha256=HprALdWRfc7GdfU8IM8xflcYVGWfHauAksUtMqQd4Kk,522
35
- azureml_registry_tools-0.1.0a23.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
36
- azureml_registry_tools-0.1.0a23.dist-info/entry_points.txt,sha256=iRUkAeQidMnO6RQzpLqMUBTcyYtNzAfSin9WnSdVGLw,147
37
- azureml_registry_tools-0.1.0a23.dist-info/top_level.txt,sha256=ZOeEa0TAXo6i5wOjwBoqfIGEuxOcKuscGgNSpizqREY,8
38
- azureml_registry_tools-0.1.0a23.dist-info/RECORD,,
33
+ azureml_registry_tools-0.1.0a25.dist-info/licenses/LICENSE.txt,sha256=n20rxwp7_NGrrShv9Qvcs90sjI1l3Pkt3m-5OPCWzgs,845
34
+ azureml_registry_tools-0.1.0a25.dist-info/METADATA,sha256=k-lHRaUM18kePgPyvbBnJR9sMj75u8xZXNGmortFI3E,522
35
+ azureml_registry_tools-0.1.0a25.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
36
+ azureml_registry_tools-0.1.0a25.dist-info/entry_points.txt,sha256=iRUkAeQidMnO6RQzpLqMUBTcyYtNzAfSin9WnSdVGLw,147
37
+ azureml_registry_tools-0.1.0a25.dist-info/top_level.txt,sha256=ZOeEa0TAXo6i5wOjwBoqfIGEuxOcKuscGgNSpizqREY,8
38
+ azureml_registry_tools-0.1.0a25.dist-info/RECORD,,