*Client concreto, ctx como primer argumento en todas partes y grupos de recursos, y corrige todos los bugs conocidos de la v2. Cubre las 67 operaciones de la API actual.
De un vistazo
Construcción y opciones
Opciones por petición:
Método por método
api es el rest.Rest de la v2, c el *squarecloud.Client de la v3.
Tipos
Errores
rest.APIError (StatusCode, Code, Message) pasa a ser squarecloud.APIError (Status, Code, Message, Method, Path): renombra StatusCode a Status. rest.ErrorCode(err) y rest.IsRateLimit(err) se eliminaron: usa errors.As y comprueba Code o Status == 429.
- Los fallos de red ahora son
*APIErrorconStatus0,CodeNETWORK_ERRORoTIMEOUTy el texto de la causa comoMessage, y envuelven la causa (errors.Is(err, context.Canceled)funciona). - Lo mismo ocurre con las comprobaciones locales (
Status0:INVALID_ID,FILE_TOO_LARGE,INVALID_API_KEY) y con un cuerpo 2xx que no es JSON (UNKNOWN_ERROR,Invalid JSON in HTTP <status> response). - Un cuerpo 2xx que dice
"status": "error"ahora es un error (la v2 lo notificaba como éxito). Los rechazos del clúster al iniciar o detener aplicaciones y bases de datos llegan como 409CONTAINER_ALREADY_STARTED,CONTAINER_ALREADY_STOPPED,CONTAINER_TEMPORARILY_SUSPENDED,CONTAINER_NOT_FOUND,CONTAINER_INSUFFICIENT_DISK_SPACE,CONTAINER_NETWORK_CONFLICToACTION_FAILED, sin mensaje. El SDK devuelve una respuesta de tipo “ya” como error: trátala tú mismo como éxito si lo necesitas. - Una respuesta sin código tiene
CodeUNKNOWN_ERROR. - Una clave de API caducada da 401
ACCESS_DENIED, como una desconocida. - Hay una constante
Code*por cada código que documenta la API. Ahora la API envía 429RATE_LIMITED(CodeRateLimited) donde antes enviabaRATE_LIMITyRATE_LIMIT_EXCEEDED;CodeRateLimityCodeRateLimitExceededse mantienen, obsoletas. - Todo error de
AI.Chattiene la forma de OpenAI con un código en minúsculas (access_denied,rate_limit_exceeded,server_overloaded, …), queCodecontiene tal cual. Error()producesquarecloud: <METHOD> <path>: HTTP <status> <CODE>: <message>(v2:squarecloud: <message> (<CODE>, HTTP <status>)). Compara los campos, no el texto.
Cambios de comportamiento
- Clave de API vacía:
New("")(o una clave compuesta solo por espacios) sigue devolviendo un cliente (no puede devolver un error), pero todas las llamadas salvoService.Statusfallan localmente conINVALID_API_KEY. - Snapshot 202: la v2 devolvía un
*APIErrorconStatusCode202. La v3 devuelve unSnapshotCreatedconPending: truey un errornil. - Tiempo real:
Nextahora devuelve unRealtimeEvent. Usa un switch sobreev.Event(system,status,logs,error,message). Para los logs, imprimeev.Line(el byte\u0001/\u0002se elimina;ev.Datasigue siendo el frame sin procesar) y usaev.Streampara stdout/stderr. Para el estado, usaev.Status: nunca esnilen un evento de estado y se combina superficialmente entre frames y reconexiones. Después deREALTIME_DISCONNECTED,Nextdevuelveio.EOF. El stream ya no muere a los 30 s, las reconexiones esperan al menos 5,5 s desde la apertura anterior y la apertura está limitada por el timeout del cliente hasta que llegan los encabezados. Consulta Tiempo real. - Timeouts: la v2 usaba un timeout fijo de 30 s del
http.Clientpara todo. La v3 aplica un deadline por defecto solo cuandoctxno tiene ninguno: el timeout del cliente (WithTimeout, 30 s) para la mayoría de las llamadas; al menos 2 minutos para start/stop/restart, la creación de bases de datos, la creación/restauración de snapshots yAI.Chat; ninguno para las subidas, las escrituras de archivos con más de 1 MiB de contenido y las descargas de snapshots.WithTimeout(0)los desactiva todos. - Ventanas de red vacías:
Analytics,ErrorsyPerformancedevuelven punterosnilcuando la ventana no tiene tráfico. - Encabezados: todas las peticiones a la API envían
Accept: application/json(text/event-streampara tiempo real). ElUser-Agentpor defecto cambió deSquare GOasquarecloud-sdk-go/3.0.0(WithUserAgentlo sigue reemplazando). - Ids: ahora todos los ids se codifican con percent-encoding como un único segmento de ruta (la v2 los pegaba tal cual en la ruta), y un id vacío,
.o..falla localmente conINVALID_ID. - Escritura de archivos: la v2 siempre enviaba el contenido como string, lo que corrompía los archivos binarios, y no podía escribir un archivo vacío. La v3 siempre envía el contenido codificado en base64, así que cada byte se conserva, un contenido vacío escribe un archivo vacío y un contenido de más de 10 MB falla localmente con
FILE_TOO_LARGE. La API responde 400INVALID_CONTENTa un contenido que no puede decodificar. - Lectura de archivos: la v3 siempre solicita base64 y lo decodifica, en lugar del array de bytes JSON que leía la v2 (que la API ha declarado obsoleto). Un archivo de más de 10 MB da 413
FILE_TOO_LARGE. - Listado de archivos: listar un directorio que no existe da 404
FILE_NOT_FOUND; antes era una lista vacía. - Snapshots: las entradas del listado incluyen
VersionIDyURLprocedentes de la API; no se extrae nada deKey. - Reintentos: novedad. Los errores de red en GET, los 503
UPLOAD_BUSY/ANALYTICS_BUSYy el 503DATABASE_UNAVAILABLEen GET se reintentan dos veces por defecto;WithMaxRetries(0)restaura el comportamiento de la v2.DATABASE_UNAVAILABLEpuede llegar después de que una mutación haya empezado, así que el SDK nunca lo reintenta en otros métodos; reintenta tú mismo una mutación idempotente si quieres. Consulta Reintentos. - Versión de Go: el mínimo baja de Go 1.24 a Go 1.22.

