diff --git a/cli/azd/extensions/azure.ai.finetune/CHANGELOG.md b/cli/azd/extensions/azure.ai.finetune/CHANGELOG.md index 96a1a179867..726ea78e170 100644 --- a/cli/azd/extensions/azure.ai.finetune/CHANGELOG.md +++ b/cli/azd/extensions/azure.ai.finetune/CHANGELOG.md @@ -1,5 +1,11 @@ # Release History + +## 0.0.13-preview (2026-01-28) + +- Defaulting to supervise when fine tuning method is not return by API +- Adding training Type when cloning a job + ## 0.0.12-preview (2026-01-23) - Add Project-endpoint parameter to init command diff --git a/cli/azd/extensions/azure.ai.finetune/extension.yaml b/cli/azd/extensions/azure.ai.finetune/extension.yaml index 3cb5d2d19f6..cfb4b741c4c 100644 --- a/cli/azd/extensions/azure.ai.finetune/extension.yaml +++ b/cli/azd/extensions/azure.ai.finetune/extension.yaml @@ -3,7 +3,7 @@ namespace: ai.finetuning displayName: Foundry Fine Tuning (Preview) description: Extension for Foundry Fine Tuning. (Preview) usage: azd ai finetuning [options] -version: 0.0.12-preview +version: 0.0.13-preview language: go capabilities: - custom-commands diff --git a/cli/azd/extensions/azure.ai.finetune/internal/cmd/init.go b/cli/azd/extensions/azure.ai.finetune/internal/cmd/init.go index d0f7bcb7814..47324d0e526 100644 --- a/cli/azd/extensions/azure.ai.finetune/internal/cmd/init.go +++ b/cli/azd/extensions/azure.ai.finetune/internal/cmd/init.go @@ -907,6 +907,11 @@ method: yamlContent += fmt.Sprintf("validation_file: %s\n", job.ValidationFile) } + // Add extra_body with trainingType if present + if trainingType, ok := job.ExtraFields["trainingType"]; ok { + yamlContent += fmt.Sprintf("extra_body:\n trainingType: %v\n", trainingType) + } + // Determine the output directory (use src flag or current directory) outputDir := a.flags.src if outputDir == "" { diff --git a/cli/azd/extensions/azure.ai.finetune/internal/providers/openai/conversions.go b/cli/azd/extensions/azure.ai.finetune/internal/providers/openai/conversions.go index a1f08cf18d7..d6ca0055039 100644 --- a/cli/azd/extensions/azure.ai.finetune/internal/providers/openai/conversions.go +++ b/cli/azd/extensions/azure.ai.finetune/internal/providers/openai/conversions.go @@ -63,7 +63,18 @@ func convertOpenAIJobToModel(openaiJob openai.FineTuningJob) *models.FineTuningJ // convertOpenAIJobToDetailModel converts OpenAI SDK job to detailed domain model func convertOpenAIJobToDetailModel(openaiJob *openai.FineTuningJob) *models.FineTuningJobDetail { - // Extract hyperparameters from OpenAI job + // Extract extra fields from the API response + extraFields := make(map[string]interface{}) + for key, field := range openaiJob.JSON.ExtraFields { + // Parse the raw JSON value + var value interface{} + if err := json.Unmarshal([]byte(field.Raw()), &value); err == nil { + extraFields[key] = value + } else { + extraFields[key] = string(field.Raw()) + } + } + hyperparameters := &models.Hyperparameters{} if openaiJob.Method.Type == "supervised" { hyperparameters.BatchSize = openaiJob.Method.Supervised.Hyperparameters.BatchSize.OfInt @@ -86,6 +97,7 @@ func convertOpenAIJobToDetailModel(openaiJob *openai.FineTuningJob) *models.Fine } } else { // Fallback to top-level hyperparameters (for backward compatibility) + openaiJob.Method.Type = "supervised" hyperparameters.BatchSize = openaiJob.Hyperparameters.BatchSize.OfInt hyperparameters.LearningRateMultiplier = openaiJob.Hyperparameters.LearningRateMultiplier.OfFloat hyperparameters.NEpochs = openaiJob.Hyperparameters.NEpochs.OfInt @@ -120,6 +132,7 @@ func convertOpenAIJobToDetailModel(openaiJob *openai.FineTuningJob) *models.Fine ValidationFile: openaiJob.ValidationFile, Hyperparameters: hyperparameters, Seed: openaiJob.Seed, + ExtraFields: extraFields, } return jobDetail diff --git a/cli/azd/extensions/azure.ai.finetune/pkg/models/finetune.go b/cli/azd/extensions/azure.ai.finetune/pkg/models/finetune.go index e2f43c3b199..e67e558799e 100644 --- a/cli/azd/extensions/azure.ai.finetune/pkg/models/finetune.go +++ b/cli/azd/extensions/azure.ai.finetune/pkg/models/finetune.go @@ -123,12 +123,13 @@ type FineTuningJobDetail struct { CreatedAt time.Time `json:"created_at" yaml:"created_at"` FinishedAt *time.Time `json:"finished_at,omitempty" yaml:"finished_at,omitempty"` EstimatedFinish *time.Time `json:"estimated_finish,omitempty" yaml:"estimated_finish,omitempty"` - Method string `json:"training_type" yaml:"training_type"` + Method string `json:"method.type" yaml:"method.type"` TrainingFile string `json:"training_file" yaml:"training_file"` ValidationFile string `json:"validation_file,omitempty" yaml:"validation_file,omitempty"` Hyperparameters *Hyperparameters `json:"hyperparameters" yaml:"hyperparameters"` VendorMetadata map[string]interface{} `json:"-" yaml:"-"` Seed int64 `json:"-" yaml:"-"` + ExtraFields map[string]interface{} `json:"extra_fields,omitempty" yaml:"extra_fields,omitempty"` } // JobEvent represents an event associated with a fine-tuning job diff --git a/cli/azd/extensions/azure.ai.finetune/version.txt b/cli/azd/extensions/azure.ai.finetune/version.txt index d07831535ee..95d20fe702c 100644 --- a/cli/azd/extensions/azure.ai.finetune/version.txt +++ b/cli/azd/extensions/azure.ai.finetune/version.txt @@ -1 +1 @@ -0.0.12-preview +0.0.13-preview