diff --git a/schema/config-schema.json b/schema/config-schema.json index ce13fcc..16cc011 100644 --- a/schema/config-schema.json +++ b/schema/config-schema.json @@ -41,8 +41,34 @@ }, "capabilities": { "$ref": "#/$defs/ModelCapabilities" + }, + "architecture_config": { + "$ref": "#/$defs/ArchitectureConfig" + } + }, + "additionalProperties": false + }, + "ArchitectureConfig": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["transformer"] + }, + "numLayers": { + "type": "integer", + "minimum": 1 + }, + "hiddenSize": { + "type": "integer", + "minimum": 1 + }, + "numAttentionHeads": { + "type": "integer", + "minimum": 1 } }, + "required": ["type", "numLayers", "hiddenSize", "numAttentionHeads"], "additionalProperties": false }, "ModelDescriptor": { diff --git a/schema/config_test.go b/schema/config_test.go index 391727a..aec04cc 100644 --- a/schema/config_test.go +++ b/schema/config_test.go @@ -589,3 +589,51 @@ func TestConfig(t *testing.T) { } } } + +func TestArchitectureConfigValid(t *testing.T) { + validJSON := `{ + "descriptor": {"name": "test-model"}, + "config": { + "paramSize": "8b", + "architecture_config": { + "type": "transformer", + "numLayers": 32, + "hiddenSize": 4096, + "numAttentionHeads": 32 + } + }, + "modelfs": { + "type": "layers", + "diffIds": ["sha256:1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"] + } + }` + + err := schema.ValidatorMediaTypeModelConfig.Validate(strings.NewReader(validJSON)) + if err != nil { + t.Fatalf("expected valid architecture_config to pass, got error: %v", err) + } +} + +func TestArchitectureConfigMissingRequiredField(t *testing.T) { + // Missing numLayers field + invalidJSON := `{ + "descriptor": {"name": "test-model"}, + "config": { + "paramSize": "8b", + "architecture_config": { + "type": "transformer", + "hiddenSize": 4096, + "numAttentionHeads": 32 + } + }, + "modelfs": { + "type": "layers", + "diffIds": ["sha256:1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"] + } + }` + + err := schema.ValidatorMediaTypeModelConfig.Validate(strings.NewReader(invalidJSON)) + if err == nil { + t.Fatalf("expected architecture_config with missing numLayers to fail validation") + } +} diff --git a/specs-go/v1/config.go b/specs-go/v1/config.go index 427aa35..bcd564e 100644 --- a/specs-go/v1/config.go +++ b/specs-go/v1/config.go @@ -42,6 +42,24 @@ type ModelConfig struct { // Special capabilities that the model supports Capabilities *ModelCapabilities `json:"capabilities,omitempty"` + + // Architecture-specific configuration parameters + ArchitectureConfig *ArchitectureConfig `json:"architecture_config,omitempty"` +} + +// ArchitectureConfig defines architecture-specific parameters for the model. +type ArchitectureConfig struct { + // Type specifies the model architecture type (e.g., "transformer"). + Type string `json:"type"` + + // NumLayers is the number of layers in the model. + NumLayers int `json:"numLayers"` + + // HiddenSize is the dimensionality of the hidden representations. + HiddenSize int `json:"hiddenSize"` + + // NumAttentionHeads is the number of attention heads. + NumAttentionHeads int `json:"numAttentionHeads"` } // ModelFS describes a layer content addresses