*Client concreto, ctx como primeiro argumento em todo lugar e grupos de recursos, e corrige todos os bugs conhecidos da v2. Ela cobre todas as 67 operações da API atual.
Visão geral
Construção e opções
Opções por requisição:
Método a método
api é o rest.Rest da v2, c o *squarecloud.Client da v3.
Tipos
Erros
rest.APIError (StatusCode, Code, Message) passa a ser squarecloud.APIError (Status, Code, Message, Method, Path): renomeie StatusCode para Status. rest.ErrorCode(err) e rest.IsRateLimit(err) foram removidos: use errors.As e verifique Code ou Status == 429.
- Falhas de rede agora são
*APIErrorcomStatus0,CodeNETWORK_ERRORouTIMEOUTe o texto da causa comoMessage, e fazem unwrap para a causa (errors.Is(err, context.Canceled)funciona). - O mesmo vale para as verificações locais (
Status0:INVALID_ID,FILE_TOO_LARGE,INVALID_API_KEY) e para um corpo 2xx que não é JSON (UNKNOWN_ERROR,Invalid JSON in HTTP <status> response). - Um corpo 2xx que diz
"status": "error"agora é um erro (a v2 o reportava como sucesso). As recusas do cluster ao iniciar/parar aplicações e bancos de dados chegam como 409CONTAINER_ALREADY_STARTED,CONTAINER_ALREADY_STOPPED,CONTAINER_TEMPORARILY_SUSPENDED,CONTAINER_NOT_FOUND,CONTAINER_INSUFFICIENT_DISK_SPACE,CONTAINER_NETWORK_CONFLICTouACTION_FAILED, sem mensagem. O SDK retorna uma resposta “já” como erro: trate-a como sucesso por conta própria se precisar. - Uma resposta sem código tem
CodeUNKNOWN_ERROR. - Uma chave de API expirada resulta em 401
ACCESS_DENIED, como uma desconhecida. - Há uma constante
Code*para cada código que a API documenta. A API agora envia 429RATE_LIMITED(CodeRateLimited) onde enviavaRATE_LIMITeRATE_LIMIT_EXCEEDED;CodeRateLimiteCodeRateLimitExceededcontinuam existindo, depreciados. - Todo erro de
AI.Chatsegue o formato da OpenAI, com um código em minúsculas (access_denied,rate_limit_exceeded,server_overloaded, …), queCodecarrega literalmente. Error()gerasquarecloud: <METHOD> <path>: HTTP <status> <CODE>: <message>(v2:squarecloud: <message> (<CODE>, HTTP <status>)). Compare pelos campos, não pelo texto.
Mudanças de comportamento
- Chave de API vazia:
New("")(ou uma chave composta apenas de espaços) ainda retorna um cliente (ele não pode retornar um erro), mas toda chamada, excetoService.Status, falha localmente comINVALID_API_KEY. - Snapshot 202: a v2 retornava um
*APIErrorcomStatusCode202. A v3 retorna umSnapshotCreatedcomPending: truee um erronil. - Realtime:
Nextagora retorna umRealtimeEvent. Faça um switch emev.Event(system,status,logs,error,message). Para logs, imprimaev.Line(o byte\u0001/\u0002é removido;ev.Datapermanece o frame bruto) e useev.Streampara stdout/stderr. Para status, useev.Status: nuncanilem um evento de status, mesclado superficialmente entre frames e reconexões. ApósREALTIME_DISCONNECTED,Nextretornaio.EOF. O stream não morre mais após 30 s, as reconexões esperam pelo menos 5,5 s após a abertura anterior, e a abertura é limitada pelo timeout do cliente até os headers chegarem. Veja Tempo real. - Timeouts: a v2 usava um timeout fixo de 30 s no
http.Clientpara tudo. A v3 aplica um prazo padrão apenas quando octxnão tem nenhum: o timeout do cliente (WithTimeout, 30 s) para a maioria das chamadas; pelo menos 2 minutos para start/stop/restart, criação de bancos de dados, criação/restauração de snapshots eAI.Chat; nenhum para uploads, escritas de arquivos com mais de 1 MiB de conteúdo e downloads de snapshots.WithTimeout(0)desativa todos eles. - Janelas de rede vazias:
Analytics,ErrorsePerformanceretornam ponteirosnilquando a janela não tem tráfego. - Headers: toda requisição à API envia
Accept: application/json(text/event-streampara realtime). OUser-Agentpadrão mudou deSquare GOparasquarecloud-sdk-go/3.0.0(WithUserAgentainda o substitui). - Ids: todo id agora é codificado com percent-encoding como um único segmento de caminho (a v2 o colava no caminho como estava), e um id vazio,
.ou..falha localmente comINVALID_ID. - Escrita de arquivos: a v2 sempre enviava o conteúdo como string, o que corrompia arquivos binários, e não conseguia escrever um arquivo vazio. A v3 sempre envia o conteúdo codificado em base64, então todo byte chega intacto, conteúdo vazio escreve um arquivo vazio, e conteúdo acima de 10 MB falha localmente com
FILE_TOO_LARGE. A API responde 400INVALID_CONTENTpara conteúdo que não consegue decodificar. - Leitura de arquivos: a v3 sempre solicita base64 e o decodifica, em vez do array de bytes JSON que a v2 lia (que a API depreciou). Um arquivo acima de 10 MB resulta em 413
FILE_TOO_LARGE. - Listagem de arquivos: listar um diretório que não existe resulta em 404
FILE_NOT_FOUND; antes era uma lista vazia. - Snapshots: as entradas da listagem trazem
VersionIDeURLvindos da API; nada é extraído deKey. - Novas tentativas: novidade. Erros de rede em GET, 503
UPLOAD_BUSY/ANALYTICS_BUSYe 503DATABASE_UNAVAILABLEem GET são tentados novamente duas vezes por padrão;WithMaxRetries(0)restaura o comportamento da v2.DATABASE_UNAVAILABLEpode chegar depois que uma mutação já começou, então o SDK nunca o repete em outros métodos; repita uma mutação idempotente por conta própria se quiser. Veja Novas tentativas. - Versão do Go: o mínimo caiu do Go 1.24 para o Go 1.22.

