> ## Documentation Index
> Fetch the complete documentation index at: https://docs.squarecloud.app/llms.txt
> Use this file to discover all available pages before exploring further.

# IA

> Llama al AI Gateway de Square Cloud desde el SDK de Go con c.AI.Chat: chat completions compatibles con OpenAI, sin streaming.

`c.AI.Chat(ctx, request)` llama al [AI Gateway](/en/api-reference/ai-gateway), un endpoint de chat completions **compatible con OpenAI**. Necesita el scope `ai:chat` y un plan Standard o superior.

```go theme={"system"}
package main

import (
	"context"
	"fmt"
	"log"
	"os"

	"github.com/squarecloudofc/sdk-api-go/v3"
)

func main() {
	ctx := context.Background()
	c := squarecloud.New(os.Getenv("SQUARECLOUD_API_KEY"))

	completion, err := c.AI.Chat(ctx, squarecloud.ChatRequest{
		Model: "cubic",
		Messages: []squarecloud.ChatMessage{
			{Role: "system", Content: "You are a helpful assistant."},
			{Role: "user", Content: "What is Square Cloud?"},
		},
		MaxTokens: 512,
	})
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println(completion.Choices[0].Message.Content)
	fmt.Println(completion.Usage.TotalTokens)
}
```

## Petición

Campos de `squarecloud.ChatRequest`, con sus nombres JSON:

| Campo                                            | Descripción                                                                                                                                                                                    |
| ------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Model` (`model`)                                | `cubic`. Se acepta por compatibilidad: no hay ningún otro modelo. `""` no se envía                                                                                                             |
| `Messages` (`messages`)                          | `[]ChatMessage` con `Role`, `Content`, `ToolCallID` (`tool_call_id`) y `ToolCalls` (`tool_calls`). `Role` es `system`, `user`, `assistant` o `tool`. `Content` siempre se envía, `""` incluido |
| `Tools` / `ToolChoice` (`tools` / `tool_choice`) | Function calling de OpenAI: `Tools` es un `[]json.RawMessage`, `ToolChoice` cualquier valor codificable en JSON                                                                                |
| `MaxTokens` (`max_tokens`)                       | Número máximo de tokens de la respuesta. `0` no se envía                                                                                                                                       |
| `Temperature` (`temperature`)                    | Temperatura de muestreo, un `*float64`. `nil` no se envía                                                                                                                                      |

La respuesta es un `ChatCompletion` con la forma de OpenAI: `ID`, `Object`, `Created`, `Model`, `Choices` (`Index`, `Message`, `FinishReason`) y `Usage` (`PromptTokens`, `CompletionTokens`, `TotalTokens`).

## Sin streaming

`AI.Chat` no hace streaming: devuelve la respuesta completa. `ChatRequest` no tiene campo `stream`; la API responde 400 `stream_not_supported` a `stream: true`.

## Timeout

El gateway concede a cada petición **90 segundos** en total y después responde 503 `server_overloaded`. Sin un deadline en `ctx`, el SDK espera al menos 2 minutos antes de agotar el tiempo, así que recibes la respuesta del gateway.

## Errores

Los errores de IA usan el formato de OpenAI, así que sus códigos están en **minúsculas**. Aun así se devuelven como un [`*APIError`](/es/sdks/go/errors), con `Code` igual al código de OpenAI (o a su `type` cuando no hay código):

```go theme={"system"}
_, err := c.AI.Chat(ctx, squarecloud.ChatRequest{
	Messages: []squarecloud.ChatMessage{{Role: "user", Content: "Hi"}},
})

var apiErr *squarecloud.APIError
if errors.As(err, &apiErr) && apiErr.Code == "server_overloaded" {
	// safe to retry yourself
}
```

| Estado | Código                                                                                                  | Cuándo                                                                               |
| ------ | ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ |
| 400    | `stream_not_supported`                                                                                  | Se envió `stream: true`                                                              |
| 400    | `invalid_messages`, `invalid_tools`, `invalid_tool_choice`, `invalid_temperature`, `invalid_max_tokens` | Un campo mal formado                                                                 |
| 400    | `context_length_exceeded`                                                                               | La conversación supera la ventana de contexto del plan                               |
| 401    | `access_denied`                                                                                         | Clave de API no válida                                                               |
| 403    | `upgrade_required`                                                                                      | El plan no tiene acceso al AI Gateway                                                |
| 429    | `rate_limit_exceeded`, `concurrent_limit_reached`                                                       | Demasiado rápido, o ya hay una petición en curso                                     |
| 429    | `daily_limit_reached`, `daily_request_limit_reached`, `daily_spend_limit_reached`                       | Se agotó un presupuesto diario (se reinicia a las 00:00 UTC)                         |
| 503    | `server_overloaded`                                                                                     | La capacidad está llena o se superó el plazo de 90 s: se puede reintentar sin riesgo |
| 503    | `daily_capacity_reached`                                                                                | Se agotó la capacidad diaria de la plataforma                                        |

El SDK **nunca reintenta** los errores de IA: la petición es un `POST` no idempotente. Consulta la [referencia del AI Gateway](/en/api-reference/ai-gateway) para ver los límites de cada plan.
