8000 introduce support for models by ndeloof · Pull Request #799 · compose-spec/compose-go · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

introduce support for models #799

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 30, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions loader/loader_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3862,3 +3862,39 @@ services:
InterfaceName: "eth0",
})
}

func TestModel(t *testing.T) {
p, err := loadYAML(`
name: model
services:
test_array:
models:
- foo

test_mapping:
models:
foo:
endpoint_var: MODEL_URL

models:
foo:
model: ai/model
context_size: 1024
runtime_flags:
- "--some-flag"
`)
assert.NilError(t, err)
assert.DeepEqual(t, p.Models["foo"], types.ModelConfig{
Model: "ai/model",
ContextSize: 1024,
RuntimeFlags: []string{"--some-flag"},
})
assert.DeepEqual(t, p.Services["test_array"].Models, map[string]*types.ServiceModelConfig{
"foo": nil,
})
assert.DeepEqual(t, p.Services["test_mapping"].Models, map[string]*types.ServiceModelConfig{
"foo": {
EndpointVariable: "MODEL_URL",
},
})
}
7 changes: 7 additions & 0 deletions override/merge.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ func init() {
mergeSpecials["services.*.labels"] = mergeToSequence
mergeSpecials["services.*.volumes.*.volume.labels"] = mergeToSequence
mergeSpecials["services.*.logging"] = mergeLogging
mergeSpecials["services.*.models"] = mergeModels
mergeSpecials["services.*.networks"] = mergeNetworks
mergeSpecials["services.*.sysctls"] = mergeToSequence
mergeSpecials["services.*.tmpfs"] = mergeToSequence
Expand Down Expand Up @@ -158,6 +159,12 @@ func mergeDependsOn(c any, o any, path tree.Path) (any, error) {
return mergeMappings(right, left, path)
}

func mergeModels(c any, o any, path tree.Path) (any, error) {
right := convertIntoMapping(c, nil)
left := convertIntoMapping(o, nil)
return mergeMappings(right, left, path)
}

func mergeNetworks(c any, o any, path tree.Path) (any, error) {
right := convertIntoMapping(c, nil)
left := convertIntoMapping(o, nil)
Expand Down
58 changes: 58 additions & 0 deletions schema/compose-spec.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,17 @@
"description": "The services that will be used by your application."
},

"models": {
"type": "object",
"patternProperties": {
"^[a-zA-Z0-9._-]+$": {
"$ref": "#/definitions/model"
}
},
"description": "Language models that will be used by your application."
},


"networks": {
"type": "object",
"patternProperties": {
Expand Down Expand Up @@ -511,6 +522,27 @@
"type": "string",
"description": "Network mode. Values can be 'bridge', 'host', 'none', 'service:[service name]', or 'container:[container name]'."
},
"models": {
"oneOf": [
{"$ref": "#/definitions/list_of_strings"},
{"type": "object",
"patternProperties": {
"^[a-zA-Z0-9._-]+$": {
"type": "object",
"properties": {
"endpoint_var": {
"type": "string",
"description": "Environment variable set to AI model endpoint."
}
},
"additionalProperties": false,
"patternProperties": {"^x-": {}}
}
}
}
],
"description": "AI Models to use, referencing entries under the top-level models key."
},
"networks": {
"oneOf": [
{"$ref": "#/definitions/list_of_strings"},
Expand Down Expand Up @@ -1530,6 +1562,32 @@
"patternProperties": {"^x-": {}}
},

"model": {
"type": "object",
"description": "Language Model for the Compose application.",
"properties": {
"name": {
"type": "string",
"description": "Custom name for this model."
},
"model": {
"type": "string",
"description": "Language Model to run."
},
"context_size": {
"type": "integer"
},
"runtime_flags": {
"type": "array",
"items": {"type": "string"},
"description": "Raw runtime flags to pass to the inference engine."
}
},
"required": ["model"],
"additionalProperties": false,
"patternProperties": {"^x-": {}}
},

"command": {
"oneOf": [
{
Expand Down
3 changes: 2 additions & 1 deletion transform/canonical.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@ func init() {
transformers["services.*.label_file"] = transformStringOrList
transformers["services.*.extends"] = transformExtends
transformers["services.*.gpus"] = transformGpus
transformers["services.*.networks"] = transformServiceNetworks
transformers["services.*.networks"] = transformStringSliceToMap
transformers["services.*.models"] = transformStringSliceToMap
transformers["services.*.volumes.*"] = transformVolumeMount
transformers["services.*.dns"] = transformStringOrList
transformers["services.*.devices.*"] = transformDeviceMapping
Expand Down
8 changes: 4 additions & 4 deletions transform/services.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,13 @@ func transformService(data any, p tree.Path, ignoreParseError bool) (any, error)
}
}

func transformServiceNetworks(data any, _ tree.Path, _ bool) (any, error) {
func transformStringSliceToMap(data any, _ tree.Path, _ bool) (any, error) {
if slice, ok := data.([]any); ok {
networks := make(map[string]any, len(slice))
mapping := make(map[string]any, len(slice))
for _, net := range slice {
networks[net.(string)] = nil
mapping[net.(string)] = nil
}
return networks, nil
return mapping, nil
}
return data, nil
}
2 changes: 2 additions & 0 deletions types/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,8 @@ type Secrets map[string]SecretConfig
// Configs is a map of ConfigObjConfig
type Configs map[string]ConfigObjConfig

type Models map[string]ModelConfig

// Extensions is a map of custom extension
type Extensions map[string]any

Expand Down
Loading
0