--- name: sdcli_resolve_binary kind: function lang: go domain: ml version: "1.0.0" purity: impure signature: "func SdcliResolveBinary(hint string) (SdcliBinary, error)" description: "Localiza el binario sd / sd-cli de stable-diffusion.cpp. Busca en orden: hint explicito, LookPath('sd'), LookPath('sd-cli'). Detecta la version ejecutando --version con timeout 3s. Retorna SdcliBinary con path, version y fuente de resolucion." tags: [ml, sdcli, stablediffusion, binary, subprocess, imagegen] uses_functions: [] uses_types: [] returns: [] returns_optional: false error_type: "error_go_core" imports: ["context", "fmt", "os", "os/exec", "strings", "time"] params: - name: hint desc: "Path explicito al binario sd. Si es string vacio se busca en PATH. Si no es vacio debe existir y ser ejecutable." output: "SdcliBinary con Path absoluto, Version detectada (puede ser vacia si --version falla) y Source ('config' si viene de hint, 'path' si viene de LookPath)." tested: true tests: - "missing binary returns error when PATH empty" - "hint path resolves to config source" test_file_path: "functions/ml/sdcli_test.go" file_path: "functions/ml/sdcli_resolve_binary.go" --- ## Ejemplo ```go // Buscar automaticamente en PATH bin, err := SdcliResolveBinary("") if err != nil { log.Fatal(err) } fmt.Printf("sd found at %s (version: %s)\n", bin.Path, bin.Version) // Hint explicito (ej. desde config de usuario) bin, err = SdcliResolveBinary("/opt/stable-diffusion/sd") ``` ## Notas `SdcliBinary` es el token de resolucion que se pasa a `SdcliGenerate`. Separar la resolucion de la ejecucion permite validar el binario al arrancar la app sin lanzar una generacion. La deteccion de version es best-effort: si `sd --version` no existe o falla, `Version` queda vacia y no se propaga error. Algunos builds de stable-diffusion.cpp no implementan `--version`; en ese caso `Version == ""` es el comportamiento esperado. `Source` distingue binarios configurados explicitamente (`"config"`) de los encontrados en PATH (`"path"`), util para logging y diagnostico.