diff --git a/src/pkg/cli/compose/fixup.go b/src/pkg/cli/compose/fixup.go index ee667de68..8d9dd8f9f 100644 --- a/src/pkg/cli/compose/fixup.go +++ b/src/pkg/cli/compose/fixup.go @@ -76,6 +76,7 @@ func FixupServices(ctx context.Context, provider client.Provider, project *compo term.Warnf("service %q: service name is longer than 16 characters, you may run into issues with resource name length", svccfg.Name) } + // beta docker compose model runner syntax if svccfg.Provider != nil && svccfg.Provider.Type == "model" && svccfg.Image == "" && svccfg.Build == nil { fixupModelProvider(&svccfg, project, accountInfo) } @@ -99,6 +100,7 @@ func FixupServices(ctx context.Context, provider client.Provider, project *compo project.Services[svccfg.Name] = svccfg } + // modern docker compose model runner syntax for name, model := range project.Models { model.Name = name // ensure the model has a name svccfg := fixupModel(model, project, accountInfo) @@ -368,15 +370,22 @@ func fixupIngressPorts(svccfg *composeTypes.ServiceConfig) { const modelProviderNetwork = "model_provider_private" func fixupModel(model composeTypes.ModelConfig, project *composeTypes.Project, info *client.AccountInfo) *composeTypes.ServiceConfig { + if model.ContextSize != 0 { + term.Warnf("model %q: context_size is a Docker Model Runner parameter and is not supported for cloud deployments", model.Name) + } + if len(model.RuntimeFlags) > 0 { + term.Warnf("model %q: runtime_flags is a Docker Model Runner parameter and is not supported for cloud deployments", model.Name) + } svccfg := &composeTypes.ServiceConfig{ Name: model.Name, Extensions: model.Extensions, } - makeAccessGatewayService(svccfg, project, model.Model, info) // TODO: pass other model options too + makeAccessGatewayService(svccfg, project, model.Model, info) return svccfg } func fixupModelProvider(svccfg *composeTypes.ServiceConfig, project *composeTypes.Project, info *client.AccountInfo) { + term.Warnf("service %q: 'provider: type: model' is deprecated; use a top-level 'models:' entry instead", svccfg.Name) var model string if modelVals := svccfg.Provider.Options["model"]; len(modelVals) == 1 { model = modelVals[0] diff --git a/src/testdata/models/compose.yaml b/src/testdata/models/compose.yaml index d065bc5c9..4e68327b8 100644 --- a/src/testdata/models/compose.yaml +++ b/src/testdata/models/compose.yaml @@ -13,6 +13,11 @@ services: models: my_model: endpoint_var: MODEL_URL + withmodelvar: + image: app + models: + ai_model: + model_var: MY_MODEL_NAME models: ai_model: diff --git a/src/testdata/models/compose.yaml.fixup b/src/testdata/models/compose.yaml.fixup index 151cb4df0..3a33dd7a9 100644 --- a/src/testdata/models/compose.yaml.fixup +++ b/src/testdata/models/compose.yaml.fixup @@ -114,5 +114,29 @@ "default": null, "model_provider_private": null } + }, + "withmodelvar": { + "command": null, + "depends_on": { + "ai_model": { + "condition": "service_started", + "required": true + } + }, + "entrypoint": null, + "environment": { + "AI_MODEL_URL": "http://mock-ai-model:4000/v1/", + "MY_MODEL_NAME": "ai/model" + }, + "image": "app", + "models": { + "ai_model": { + "model_var": "MY_MODEL_NAME" + } + }, + "networks": { + "default": null, + "model_provider_private": null + } } } \ No newline at end of file diff --git a/src/testdata/models/compose.yaml.golden b/src/testdata/models/compose.yaml.golden index d2cdef87b..427a743aa 100644 --- a/src/testdata/models/compose.yaml.golden +++ b/src/testdata/models/compose.yaml.golden @@ -20,6 +20,13 @@ services: endpoint_var: MODEL_URL networks: default: null + withmodelvar: + image: app + models: + ai_model: + model_var: MY_MODEL_NAME + networks: + default: null networks: default: name: models_default diff --git a/src/testdata/models/compose.yaml.warnings b/src/testdata/models/compose.yaml.warnings index 83f7405d9..80720a11c 100644 --- a/src/testdata/models/compose.yaml.warnings +++ b/src/testdata/models/compose.yaml.warnings @@ -1,3 +1,5 @@ + ! model "my_model": context_size is a Docker Model Runner parameter and is not supported for cloud deployments + ! model "my_model": runtime_flags is a Docker Model Runner parameter and is not supported for cloud deployments ! service "ai_model": environment "LITELLM_MASTER_KEY" may contain sensitive information; consider using 'defang config set LITELLM_MASTER_KEY' to securely store this value ! service "ai_model": missing memory reservation; using provider-specific defaults. Specify deploy.resources.reservations.memory to avoid out-of-memory errors ! service "modellist": missing memory reservation; using provider-specific defaults. Specify deploy.resources.reservations.memory to avoid out-of-memory errors @@ -5,3 +7,4 @@ ! service "my_model": environment "LITELLM_MASTER_KEY" may contain sensitive information; consider using 'defang config set LITELLM_MASTER_KEY' to securely store this value ! service "my_model": missing memory reservation; using provider-specific defaults. Specify deploy.resources.reservations.memory to avoid out-of-memory errors ! service "withendpoint": missing memory reservation; using provider-specific defaults. Specify deploy.resources.reservations.memory to avoid out-of-memory errors + ! service "withmodelvar": missing memory reservation; using provider-specific defaults. Specify deploy.resources.reservations.memory to avoid out-of-memory errors diff --git a/src/testdata/provider/compose.yaml.warnings b/src/testdata/provider/compose.yaml.warnings index 95bc4b9ba..95757f965 100644 --- a/src/testdata/provider/compose.yaml.warnings +++ b/src/testdata/provider/compose.yaml.warnings @@ -1,3 +1,4 @@ + ! service "ai_runner": 'provider: type: model' is deprecated; use a top-level 'models:' entry instead ! service "ai_runner": environment "LITELLM_MASTER_KEY" may contain sensitive information; consider using 'defang config set LITELLM_MASTER_KEY' to securely store this value ! service "ai_runner": missing memory reservation; using provider-specific defaults. Specify deploy.resources.reservations.memory to avoid out-of-memory errors ! service "chat": environment "OPENAI_API_KEY" may contain sensitive information; consider using 'defang config set OPENAI_API_KEY' to securely store this value