--- name: genconfig_json_marshal kind: function lang: go domain: ml version: "1.0.0" purity: impure signature: "func GenconfigMarshal(cfg GenerationConfig) ([]byte, error)\nfunc GenconfigUnmarshal(data []byte) (GenerationConfig, error)" description: "Wrappers json.Marshal/Unmarshal para GenerationConfig con formato canonico (MarshalIndent 2 espacios). Garantiza roundtrip identico al Python: json.dumps(indent=2, sort_keys=False). Campos JSON en snake_case." tags: [ml, json, marshal, unmarshal, serialization, generation, canonical, pendiente-usar] uses_functions: [] uses_types: [generation_config_go_ml] returns: [] returns_optional: false error_type: "error_go_core" imports: ["encoding/json"] params: - name: cfg desc: "GenerationConfig a serializar. Campos omitempty (negative_prompt, loras, clip_skip) se omiten si son zero/nil/empty." - name: data desc: "JSON bytes a deserializar. Acepta formato compacto o con indent. Keys deben ser snake_case (negative_prompt, cfg_scale, model_type, etc.)." output: "GenconfigMarshal: bytes JSON con indent 2 espacios, orden de campos segun declaracion del struct (prompt, negative_prompt, seed, steps, cfg_scale, sampler, width, height, model, loras, clip_skip). GenconfigUnmarshal: GenerationConfig poblado o error de parsing." tested: true tests: - "roundtrip marshal unmarshal produce config igual" - "json cross-language snake_case keys se deserializan correctamente" test_file_path: "functions/ml/genconfig_test.go" file_path: "functions/ml/genconfig_json_marshal.go" --- ## Ejemplo ```go cfg := ml.GenerationConfig{ Prompt: "a mountain at sunset", Seed: 1234, Steps: 30, CfgScale: 7.0, Sampler: "euler", Width: 768, Height: 512, Model: ml.ModelRef{Name: "sdxl-base", ModelType: "sdxl", Quantization: "fp16"}, } b, err := ml.GenconfigMarshal(cfg) // b == { // "prompt": "a mountain at sunset", // "seed": 1234, // ... // } cfg2, err := ml.GenconfigUnmarshal(b) // cfg2 == cfg (DeepEqual) ``` ## Notas ### Formato canonico y compatibilidad con Python `GenconfigMarshal` usa `json.MarshalIndent(cfg, "", " ")`. El formato resultante es identico al que produce Python con `model.model_dump_json()` o `json.dumps(data, indent=2)` cuando `sort_keys=False`: - Keys en orden de declaracion del struct (no alfabetico). - Indent de 2 espacios, sin trailing whitespace. - Campos omitempty ausentes si zero: `negative_prompt` ausente si `""`, `loras` ausente si `[]`, `clip_skip` ausente si `nil`. ### Keys JSON (snake_case obligatorio) | Campo Go | Key JSON | |---|---| | `Prompt` | `"prompt"` | | `NegativePrompt` | `"negative_prompt"` | | `Seed` | `"seed"` | | `Steps` | `"steps"` | | `CfgScale` | `"cfg_scale"` | | `Sampler` | `"sampler"` | | `Width` | `"width"` | | `Height` | `"height"` | | `Model.ModelType` | `"model_type"` | | `Model.Quantization` | `"quantization"` | | `ClipSkip` | `"clip_skip"` | ### Por que impure Los errores de `json.Unmarshal` son errores de parsing del input externo, no de I/O, pero se modelan como `(T, error)` para forzar manejo explicito en el caller. Marcado `impure` con `error_type: error_go_core` por convencion del registry.