in cli/azd/pkg/project/service_target_ai_endpoint.go [68:193]
func (m *aiEndpointTarget) Deploy(
ctx context.Context,
serviceConfig *ServiceConfig,
servicePackage *ServicePackageResult,
targetResource *environment.TargetResource,
progress *async.Progress[ServiceProgress],
) (*ServiceDeployResult, error) {
endpointConfig, err := ai.ParseConfig[ai.EndpointDeploymentConfig](serviceConfig.Config)
if err != nil {
return nil, err
}
workspaceScope, err := m.getWorkspaceScope(serviceConfig, targetResource)
if err != nil {
return nil, err
}
deployResult := &AiEndpointDeploymentResult{}
// Initialize the AI project that will be used for the python bridge
progress.SetProgress(NewServiceProgress("Initializing AI project"))
if err := m.aiHelper.Initialize(ctx); err != nil {
return nil, fmt.Errorf("failed initializing AI project: %w", err)
}
// Ensure the workspace is valid
if err := m.aiHelper.ValidateWorkspace(ctx, workspaceScope); err != nil {
return nil, fmt.Errorf("workspace '%s' was not found within subscription '%s' and resource group '%s': %w",
workspaceScope.Workspace(),
workspaceScope.SubscriptionId(),
workspaceScope.ResourceGroup(),
err,
)
}
// Deploy flow
if endpointConfig.Flow != nil {
progress.SetProgress(NewServiceProgress("Deploying AI Prompt Flow"))
flow, err := m.aiHelper.CreateFlow(ctx, workspaceScope, serviceConfig, endpointConfig.Flow)
if err != nil {
return nil, err
}
deployResult.Flow = flow
}
// Deploy environment
if endpointConfig.Environment != nil {
progress.SetProgress(NewServiceProgress("Configuring AI environment"))
envVersion, err := m.aiHelper.CreateEnvironmentVersion(
ctx,
workspaceScope,
serviceConfig,
endpointConfig.Environment,
)
if err != nil {
return nil, err
}
deployResult.Environment = envVersion
}
// Deploy model
if endpointConfig.Model != nil {
progress.SetProgress(NewServiceProgress("Configuring AI model"))
modelVersion, err := m.aiHelper.CreateModelVersion(ctx, workspaceScope, serviceConfig, endpointConfig.Model)
if err != nil {
return nil, err
}
deployResult.Model = modelVersion
}
// Deploy to endpoint
if endpointConfig.Deployment != nil {
progress.SetProgress(NewServiceProgress("Deploying to AI Online Endpoint"))
endpointName := filepath.Base(targetResource.ResourceName())
onlineDeployment, err := m.aiHelper.DeployToEndpoint(
ctx,
workspaceScope,
serviceConfig,
endpointName,
endpointConfig,
)
if err != nil {
return nil, err
}
if onlineDeployment == nil {
return nil, fmt.Errorf("unexpected response from deployToEndpoint: deployment is nil")
}
if onlineDeployment.Name == nil {
return nil, fmt.Errorf("unexpected response from deployToEndpoint: deployment name is nil")
}
deploymentName := *onlineDeployment.Name
progress.SetProgress(NewServiceProgress("Updating traffic"))
_, err = m.aiHelper.UpdateTraffic(ctx, workspaceScope, endpointName, deploymentName)
if err != nil {
return nil, fmt.Errorf("failed updating traffic: %w", err)
}
progress.SetProgress(NewServiceProgress("Removing old deployments"))
if err := m.aiHelper.DeleteDeployments(
ctx, workspaceScope, endpointName, []string{deploymentName}); err != nil {
return nil, fmt.Errorf("failed deleting previous deployments: %w", err)
}
deployResult.Deployment = onlineDeployment
}
endpoints, err := m.Endpoints(ctx, serviceConfig, targetResource)
if err != nil {
return nil, err
}
if err := m.envManager.Save(ctx, m.env); err != nil {
return nil, fmt.Errorf("failed saving environment: %w", err)
}
return &ServiceDeployResult{
Details: deployResult,
Package: servicePackage,
Endpoints: endpoints,
}, nil
}