Source: https://ailoot.ai/models/pt-pt/glm-5-3/
Canonical: https://ailoot.ai/models/pt-pt/glm-5-3/
Language: pt-pt

# Z.ai: GLM 5.3

[Markdown](https://ailoot.ai/models/pt-pt/glm-5-3/index.md) · [JSON](https://ailoot.ai/models/pt-pt/glm-5-3/facts.json)

## [Z.ai: GLM 5.3](https://ailoot.ai/models/pt-pt/glm-5-3/)

Z.ai GLM 5.3 é um modelo de raciocínio textual para engenharia de software complexa, trabalho em terminal e agentes de longa duração. Suporta um contexto de 1M tokens documentado pelo fabricante, até 128K tokens de saída, chamada de funções e esforço de raciocínio low/high/max, mantendo o raciocínio sempre ativado.

- [**Ailoot · Anthropic Messages** `POST /v1/messages` `glm-5.3`](https://ailoot.ai/models/pt-pt/glm-5-3/#method-0)
- [**Ailoot · OpenAI Responses** `POST /v1/responses` `glm-5.3`](https://ailoot.ai/models/pt-pt/glm-5-3/#method-1)
- [**Ailoot · OpenAI Chat** `POST /v1/chat/completions` `glm-5.3`](https://ailoot.ai/models/pt-pt/glm-5-3/#method-2)
- [**Ailoot Ultra · OpenAI Chat** `POST /v1/chat/completions` `glm-5.3`](https://ailoot.ai/models/pt-pt/glm-5-3/#method-3)
- [**Ailoot Ultra · Anthropic Messages** `POST /v1/messages` `glm-5.3`](https://ailoot.ai/models/pt-pt/glm-5-3/#method-4)
- [**Ailoot · Anthropic Messages** `POST /v1/messages` `glm`](https://ailoot.ai/models/pt-pt/glm-5-3/#method-5)
- [**Ailoot · OpenAI Responses** `POST /v1/responses` `glm`](https://ailoot.ai/models/pt-pt/glm-5-3/#method-6)
- [**Ailoot · OpenAI Chat** `POST /v1/chat/completions` `glm`](https://ailoot.ai/models/pt-pt/glm-5-3/#method-7)
- [**Ailoot · Anthropic Messages** `POST /v1/messages` `glm-5`](https://ailoot.ai/models/pt-pt/glm-5-3/#method-8)
- [**Ailoot · OpenAI Responses** `POST /v1/responses` `glm-5`](https://ailoot.ai/models/pt-pt/glm-5-3/#method-9)
- [**Ailoot · OpenAI Chat** `POST /v1/chat/completions` `glm-5`](https://ailoot.ai/models/pt-pt/glm-5-3/#method-10)
- [**Ailoot · Anthropic Messages** `POST /v1/messages` `glm-5.1`](https://ailoot.ai/models/pt-pt/glm-5-3/#method-11)
- [**Ailoot · OpenAI Responses** `POST /v1/responses` `glm-5.1`](https://ailoot.ai/models/pt-pt/glm-5-3/#method-12)
- [**Ailoot · OpenAI Chat** `POST /v1/chat/completions` `glm-5.1`](https://ailoot.ai/models/pt-pt/glm-5-3/#method-13)
- [**Ailoot · Anthropic Messages** `POST /v1/messages` `glm-5.2`](https://ailoot.ai/models/pt-pt/glm-5-3/#method-14)
- [**Ailoot · OpenAI Responses** `POST /v1/responses` `glm-5.2`](https://ailoot.ai/models/pt-pt/glm-5-3/#method-15)
- [**Ailoot · OpenAI Chat** `POST /v1/chat/completions` `glm-5.2`](https://ailoot.ai/models/pt-pt/glm-5-3/#method-16)
- [**Ailoot · Anthropic Messages** `POST /v1/messages` `glm-latest`](https://ailoot.ai/models/pt-pt/glm-5-3/#method-17)
- [**Ailoot · OpenAI Responses** `POST /v1/responses` `glm-latest`](https://ailoot.ai/models/pt-pt/glm-5-3/#method-18)
- [**Ailoot · OpenAI Chat** `POST /v1/chat/completions` `glm-latest`](https://ailoot.ai/models/pt-pt/glm-5-3/#method-19)
- [**Ailoot Ultra · OpenAI Chat** `POST /v1/chat/completions` `z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/glm-5-3/#method-20)
- [**Ailoot Ultra · Anthropic Messages** `POST /v1/messages` `z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/glm-5-3/#method-21)
- [**Ailoot Ultra · OpenAI Chat** `POST /v1/chat/completions` `~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/glm-5-3/#method-22)
- [**Ailoot Ultra · Anthropic Messages** `POST /v1/messages` `~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/glm-5-3/#method-23)

Sobre o modelo

Esta descrição apresenta as capacidades do modelo. As entradas, saídas e opções disponíveis no Ailoot para o método selecionado estão indicadas abaixo.

Z.ai GLM 5.3 é um modelo de raciocínio textual de grande escala concebido para engenharia de software complexa e trabalho de agentes de longa duração. O fabricante afirma que utiliza o mesmo modelo de base de GLM 5.2, sendo os novos ganhos provenientes do pós-treino. A versão centra-se numa programação mais capaz, em operações de terminal e em tarefas mais amplas que envolvem várias etapas dependentes. Aceita texto e produz texto, incluindo código, explicações, planos e pedidos de chamada de ferramentas numa aplicação ligada a ferramentas.

O modo de raciocínio documentado está sempre ativado. GLM 5.3 oferece três níveis de esforço: low, high e max, sendo max o valor predefinido. O fabricante recomenda max para trabalho de programação complexo; low oferece uma opção de raciocínio mais leve para etapas mais simples. Utilize o nível selecionado juntamente com um resultado final claro e critérios de conclusão. Por exemplo: «Inspecione estes ficheiros e os resultados das verificações que falharam, identifique a causa nos módulos afetados, proponha uma correção que preserve a interface pública e explique quais as verificações que demonstram que a regressão foi resolvida.»

O fabricante especifica uma janela de contexto de 1M tokens e um comprimento máximo de saída de 128K tokens. Organize o material longo em torno da relação que o modelo precisa de investigar. Preserve nomes de ficheiros, definições relevantes, identificações das fontes e a ordem das observações, deixando espaço para o raciocínio e a resposta final dentro do contexto de trabalho aplicável. Uma janela grande é útil para dependências entre módulos ou para uma longa sequência de observações de agentes; não transforma um arquivo indiscriminado de material sem relação numa tarefa bem definida.

Para trabalho num repositório, forneça o comportamento esperado, o texto-fonte relevante, as versões das dependências e a saída efetiva do erro. Peça ao modelo que identifique o comportamento afetado antes de propor uma correção. Para uma refatorização, indique a interface e os invariantes que devem permanecer intactos. Uma resposta útil contém o código revisto, a razão pela qual a alteração resolve o problema observado e os casos necessários para verificar o resultado. Devolva os resultados efetivos ao fluxo de trabalho ligado a ferramentas para que a etapa seguinte se baseie no estado alterado e não na proposta anterior.

Para trabalho de desempenho, forneça uma carga de trabalho, uma referência inicial e medições, como tempos, perfis ou registos de alocação. A Z.ai descreve tarefas de treino que envolvem diagnóstico de estrangulamentos, otimização, experiências e resultados que preservam a correção. Um pedido prático é: «Utilize este perfil para identificar o estrangulamento com maior impacto, proponha uma alteração mensurável e explique que resultado justificaria mantê-la.» Distinga uma hipótese sobre desempenho de uma melhoria registada. Preserve a mesma carga de trabalho e as condições relevantes ao inspecionar um resultado.

A versão também desenvolve a capacidade de análise de vulnerabilidades. Para uma revisão defensiva do código-fonte, forneça o código relevante, os limites de confiança previstos e as condições em que é executado. Peça uma conclusão que ligue um problema suspeito à entrada e ao comportamento afetados e a uma correção específica. Separe uma potencial fragilidade de uma falha reproduzida e conserve a observação utilizada para a validar. Um relatório é mais útil quando dá prioridade a elementos de prova concretos e a correções propostas, em vez de tratar todos os padrões suspeitos como vulnerabilidades confirmadas.

A chamada de funções permite que uma aplicação envolvente disponibilize operações externas ao modelo. Defina a finalidade, os argumentos e o resultado esperado de cada ferramenta e devolva depois a observação efetiva da ferramenta para a etapa seguinte. O modelo pode raciocinar sobre esse resultado e decidir de que forma altera a tarefa. Mantenha distinguíveis as ações propostas, as operações executadas e as verificações por resolver. O fabricante também documenta respostas em fluxo contínuo, que devolvem separadamente fragmentos de raciocínio e de resposta; reúna a resposta concluída antes de a tratar como relatório final ou explicação de código.

A ficha local do modelo apresenta um pormenor específico sobre as definições do histórico: o seu template de conversação conserva o raciocínio por predefinição, enquanto o fabricante recomenda a remoção explícita do raciocínio antigo em cenários de conversação comuns. Aplique a estrutura de conversa adequada ao caso de utilização, preservando as respostas efetivamente concluídas e os resultados de ferramentas necessários à continuação. Evite tratar as definições de controlo de raciocínio de GLM 5.2 ou das edições separadas GLM 5.3 Flash como intercambiáveis com os controlos low/high/max deste modelo.

Para resultados estruturados, especifique os campos, os tipos e as regras de origem esperados. Um produto útil pode ser uma tabela de defeitos, um plano de alterações ou um objeto JSON que resuma observações. Valide tanto a estrutura como os valores antes de uma aplicação os utilizar. O resultado final deve identificar a resposta ou o produto revisto, os elementos de prova que o sustentam e os pressupostos restantes. Um maior esforço de raciocínio não demonstra que uma ferramenta foi executada, que uma correção proposta passou nas verificações ou que uma afirmação factual tem apoio para além do material fornecido.

Tarefa prática

### Tarefa prática

Exemplo técnico em inglês

```
Target a measured bottleneck

Profile P1 for one import: parsing 0.4 s, per-row database lookups 8.1 s, writing 0.8 s. The import handles 10,000 rows, including repeated customer IDs. Propose one correctness-preserving optimization, describe what lookup behavior must remain identical and define a same-workload check before claiming an improvement.
```

#### Resultado esperado

```
A bottleneck hypothesis, one proposed change and a correctness plus timing comparison plan.
```

#### Verificar o resultado

```
The proposal must use P1 without inventing an observed speedup or losing missing-customer behavior.
```

**Ailoot · Anthropic Messages** `POST /v1/messages` `glm-5.3`

[`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=messages)

Z.ai /`glm-5.3`

ID do modelo

- `glm-5.3`
- `glm`
- `glm-5`
- `glm-5.1`
- `glm-5.2`
- `glm-latest`

### Introdução

Z.ai GLM 5.3 é um modelo de raciocínio textual para engenharia de software complexa, trabalho em terminal e agentes de longa duração. Suporta um contexto de 1M tokens documentado pelo fabricante, até 128K tokens de saída, chamada de funções e esforço de raciocínio low/high/max, mantendo o raciocínio sempre ativado.

Entradas aceites

Texto

Resultados

Texto

### Disponível no Ailoot · entradas e métodos

**Ailoot · Anthropic Messages** `POST /v1/messages`

Entrada

`text`

Saída

`text`

Contexto

1 000 000 tokens

Saída máxima

131 072 tokens

Formato de saída

json ou SSE

| Campo | Tipo | Requisito | Valores e limites | Predefinição |
| --- | --- | --- | --- | --- |
| Campo`model` | Tipo`string` | RequisitoObrigatório | Valores e limites glm-5.3 | Predefinição— |
| Campo`messages` | Tipo`message[]` | RequisitoObrigatório | Valores e limites Número mínimo de elementos: 1 | Predefinição— |
| Campo`messages[].role` | Tipo`string` | RequisitoObrigatório | Valores e limites user, assistant | Predefinição— |
| Campo`messages[].content` | Tipo`string\|content_block[]` | RequisitoObrigatório | Valores e limites | Predefinição— |
| Campo`system` | Tipo`string\|content_block[]` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`max_tokens` | Tipo`integer` | RequisitoObrigatório | Valores e limites Mínimo: 1 O limite aplica-se a: Limite exato do modelo ou da ficha selecionados | Predefinição— |
| Campo`stream` | Tipo`boolean` | RequisitoOpcional | Valores e limites | Predefiniçãofalse |
| Campo`temperature` | Tipo`number` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`top_p` | Tipo`number` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`stop_sequences` | Tipo`string[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tools` | Tipo`tool[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tools[].name` | Tipo`string` | RequisitoOpcional | Valores e limites Aplica-se quando: Ferramenta fornecida | Predefinição— |
| Campo`tools[].description` | Tipo`string` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`tools[].input_schema` | Tipo`JSON_schema` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`tool_choice` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`thinking.type` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`thinking.budget_tokens` | Tipo`integer` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`output_config.effort` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`metadata` | Tipo`object` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`cache_control` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |

Combinações de materiais de entrada

**Texto** · Texto UTF8

`messages[].content ou bloco type=text`

Parâmetros e ciclo de vida do método

| Parâmetro | Contrato |
| --- | --- |
| Parâmetro`material_types` | Contratotext |
| Parâmetro`required` | Contratomodel, messages, max\_tokens |
| Parâmetro`optional_controls` | Contratonull |
| Parâmetro`content_type` | Contratoapplication/json |
| Parâmetro`text_file_material` | ContratoConteúdo UTF-8 real inserido como texto; ID de ficheiros/URLs precisam de suporte separado e exato |

Ciclo de vida: `exact retained published method`

As estruturas dos métodos e os ID são exatos; a capacidade do fornecedor é distinta da admissão dos pedidos.

### Tarifários

#### Tarifas dos métodos Ailoot

Entrada

0,0014 US$ */ 1K*

Saída

0,0044 US$ */ 1K*

Leitura da cache

≈0,00026 US$ */ 1K*

O Ailoot reserva um montante estimado antes de um pedido. Após o resultado, liquida o custo final com base na utilização medida. No streaming, a liquidação usa o registo final de utilização. [Como funcionam a reserva e a liquidação →](https://ailoot.ai/docs/pt-pt/billing/reserve/)

#### Detalhes da tarifa de referência

As tabelas de referência do modelo não alteram a seleção do método, as cotações ou os custos. Os custos ativos usam as tarifas do método Ailoot selecionado.

Tabelas de referência do modelo

#### Preços por configuração

Associe cada custo às condições apresentadas. Use uma única tarifa para cada conjunto de configurações alternativas.

| Configuração | Tabela de tarifas | Tokens de contexto, mais de | Tokens de contexto, até ao limite inclusive | Custo |
| --- | --- | --- | --- | --- |
| ConfiguraçãoOpenAI Chat · Tarifas de base por token | Tabela de tarifasTarifa base | Tokens de contexto, mais de— | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoOpenAI Chat · Escalão 1 por comprimento do pedido | Tabela de tarifas— | Tokens de contexto, mais de0 | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoAnthropic Messages · Tarifas de base por token | Tabela de tarifasTarifa base | Tokens de contexto, mais de— | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoAnthropic Messages · Escalão 1 por comprimento do pedido | Tabela de tarifas— | Tokens de contexto, mais de0 | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |

### Exemplos de pedidos

#### Ailoot · Anthropic Messages

Exemplo de textoPython SDKNode.js SDKStreaming em Python

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "glm-5.3", "max_tokens": 1024, "messages": []}')
f=Path(os.environ["AILOOT_TEXT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 source material")
text=f.read_text(encoding="utf-8")
if not text.strip():raise SystemExit("Source material must contain text")
p["messages"]=[{"role":"user","content":"Summarize this material and quote supporting source passages.\n\n"+text}]
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/messages \
  -H "x-api-key: $AILOOT_API_KEY" -H 'anthropic-version: 2023-06-01' -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
print(json.dumps(json.loads(Path("result.json").read_text()),ensure_ascii=False,indent=2))
PY_RESULT
```

```python
import anthropic
import os

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client = anthropic.Anthropic(base_url="https://api.ailoot.ai", api_key=os.environ["AILOOT_API_KEY"], max_retries=0)
msg = client.messages.create(
    model="glm-5.3",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Explain the difference between an observation and a hypothesis in three sentences."}],
)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(msg.to_dict(mode="json"))
```

```js
import Anthropic from "@anthropic-ai/sdk";

if (!process.env.AILOOT_API_KEY?.trim()) throw new Error("Set AILOOT_API_KEY before making a request");
const client = new Anthropic({ baseURL: "https://api.ailoot.ai", apiKey: process.env.AILOOT_API_KEY, maxRetries: 0 });
const msg = await client.messages.create({
  model: "glm-5.3",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Explain the difference between an observation and a hypothesis in three sentences." }],
});
import { writeFileSync } from "node:fs";

function saveResult(data, stem = "result") {
  writeFileSync(stem + ".json", JSON.stringify(data, null, 2));
  console.log(JSON.stringify(data, null, 2));
  const saveBlob = (encoded, suffix, label) => {
    const raw = Buffer.from(encoded, "base64");
    const ext = raw.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10])) ? "png" : raw[0]===255 && raw[1]===216 ? "jpg" : raw.subarray(0,4).toString()==="RIFF" && raw.subarray(8,12).toString()==="WEBP" ? "webp" : suffix;
    const file = `${stem}-${label}.${ext}`;
    writeFileSync(file, raw); console.log("Saved", file);
  };
  for (const [i, block] of (data.content || []).entries()) console.log("Content", i, JSON.stringify(block));
  for (const choice of data.choices || []) console.log("Choice", choice.index, JSON.stringify(choice.message || choice.delta || {}));
  for (const [i, item] of (data.output || []).entries()) {
    console.log("Output", i, JSON.stringify(item));
    if (item.type === "image_generation_call" && item.result) saveBlob(item.result, item.output_format || "bin", `output-${i}`);
  }
  for (const [ci, candidate] of (data.candidates || []).entries()) {
    for (const [pi, part] of (candidate.content?.parts || []).entries()) {
      console.log("Candidate/part", ci, pi, JSON.stringify(part));
      const blob = part.inlineData || part.inline_data;
      if (blob?.data) {
        const mime = blob.mimeType || blob.mime_type;
        const suffix = ({"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"})[mime] || "bin";
        saveBlob(blob.data, suffix, `candidate-${ci}-part-${pi}`);
      }
    }
  }
}

saveResult(msg);
```

```python
import anthropic,os
from pathlib import Path

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=anthropic.Anthropic(base_url="https://api.ailoot.ai",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

with client.messages.stream(model='glm-5.3',max_tokens=1024,messages=[{"role":"user","content":"Explain observations and hypotheses in three sentences."}]) as stream:
    with Path("stream-events.jsonl").open("w",encoding="utf-8") as log:
        for event in stream:
            payload=event.to_dict(mode="json")
            log.write(json.dumps(payload,ensure_ascii=False)+"\n"); log.flush()
            print(json.dumps(payload,ensure_ascii=False))
    final=stream.get_final_message()
    save_result(final.to_dict(mode="json"),"stream-result")
```

### Receber e guardar os resultados

#### Ailoot · Anthropic Messages

json ou SSE

##### Guardar todos os resultados concluídos

Guarde cada resposta, ficheiro e parte de conteúdo devolvidos na íntegra.

Conserve todos os blocos de conteúdo, as assinaturas de raciocínio e os ID reais de utilização de ferramentas. Junte todos os deltas de blocos SSE; o primeiro bloco de texto não é a saída completa.

##### Se for necessário verificar a resposta original

Conserve os ID e cabeçalhos de pedido/resposta. Não é fornecido um URL genérico para obter uma tarefa textual.

Campos da resposta

| Campo | Tipo |
| --- | --- |
| Campo`id` | Tipostring |
| Campo`model` | Tipostring |
| Campo`content[]` | Tipotext\|thinking\|tool\_use\|other content block |
| Campo`stop_reason` | Tipostring\|null |
| Campo`usage` | Tipoobject |

Erros e passos seguintes

| Resposta | Condição | Passo seguinte |
| --- | --- | --- |
| Resposta400 · `invalid_request_error` | CondiçãoCampos obrigatórios, representação do material ou valor do parâmetro inválidos | Passo seguinteCorrija os campos indicados antes de um novo pedido de criação. |

### Aliases

#### Aliases do modelo

<strong>Ailoot</strong> [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=messages), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=messages), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=messages), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=messages), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=messages), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=messages)
**Ailoot Ultra** [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3&fmt=messages), [`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=messages), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=messages)

#### Aliases dos caminhos dos métodos

`/chat/completions`

#### IDs de chamada relacionados

[`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=messages), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=messages), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=messages), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=messages), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=messages), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=messages), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=messages), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=messages), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3&fmt=messages)

**Ailoot · OpenAI Responses** `POST /v1/responses` `glm-5.3`

[`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=responses)

Z.ai /`glm-5.3`

ID do modelo

- `glm-5.3`
- `glm`
- `glm-5`
- `glm-5.1`
- `glm-5.2`
- `glm-latest`

### Introdução

Z.ai GLM 5.3 é um modelo de raciocínio textual para engenharia de software complexa, trabalho em terminal e agentes de longa duração. Suporta um contexto de 1M tokens documentado pelo fabricante, até 128K tokens de saída, chamada de funções e esforço de raciocínio low/high/max, mantendo o raciocínio sempre ativado.

Entradas aceites

Texto

Resultados

Texto

### Disponível no Ailoot · entradas e métodos

**Ailoot · OpenAI Responses** `POST /v1/responses`

Entrada

`text`

Saída

`text`

Contexto

1 000 000 tokens

Saída máxima

131 072 tokens

Formato de saída

json ou SSE

| Campo | Tipo | Requisito | Valores e limites | Predefinição |
| --- | --- | --- | --- | --- |
| Campo`model` | Tipo`string` | RequisitoObrigatório | Valores e limites glm-5.3 | Predefinição— |
| Campo`input` | Tipo`string\|input_item[]` | RequisitoObrigatório | Valores e limites | Predefinição— |
| Campo`instructions` | Tipo`string` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`input[].type` | Tipo`string` | RequisitoOpcional | Valores e limites message, reasoning, function\_call, function\_call\_output | Predefinição— |
| Campo`input[].content` | Tipo`string\|content_part[]` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`input[].call_id` | Tipo`string` | RequisitoOpcional | Valores e limites Aplica-se quando: function\_call\_output; conserve o call\_id realmente devolvido | Predefinição— |
| Campo`input[].output` | Tipo`string\|content_part[]` | RequisitoOpcional | Valores e limites Aplica-se quando: function\_call\_output | Predefinição— |
| Campo`max_output_tokens` | Tipo`integer` | RequisitoOpcional | Valores e limites Mínimo: 1 Depende do modelo | Predefinição— |
| Campo`stream` | Tipo`boolean` | RequisitoOpcional | Valores e limites | Predefiniçãofalse |
| Campo`temperature` | Tipo`number` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`top_p` | Tipo`number` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tools` | Tipo`tool[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tool_choice` | Tipo`string\|object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`parallel_tool_calls` | Tipo`boolean` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`reasoning.effort` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`reasoning.summary` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`text.format` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`text.verbosity` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`include` | Tipo`string[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`store` | Tipo`boolean` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`previous_response_id` | Tipo`string` | RequisitoOpcional | Valores e limites Requisito do ID: Só um ID de resposta real de uma continuação suportada Depende do modelo | Predefinição— |
| Campo`service_tier` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`prompt_cache_key` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`prompt_cache_options` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |

Combinações de materiais de entrada

**Texto** · Texto UTF8

`Texto de entrada ou parte input_text`

Parâmetros e ciclo de vida do método

| Parâmetro | Contrato |
| --- | --- |
| Parâmetro`material_types` | Contratotext |
| Parâmetro`required` | Contratomodel, input |
| Parâmetro`optional_controls` | Contratonull |
| Parâmetro`content_type` | Contratoapplication/json |
| Parâmetro`text_file_material` | ContratoConteúdo UTF-8 real inserido como texto; ID de ficheiros/URLs precisam de suporte separado e exato |

Ciclo de vida: `exact retained published method`

As estruturas dos métodos e os ID são exatos; a capacidade do fornecedor é distinta da admissão dos pedidos.

### Tarifários

#### Tarifas dos métodos Ailoot

Entrada

0,0014 US$ */ 1K*

Saída

0,0044 US$ */ 1K*

Leitura da cache

≈0,00026 US$ */ 1K*

O Ailoot reserva um montante estimado antes de um pedido. Após o resultado, liquida o custo final com base na utilização medida. No streaming, a liquidação usa o registo final de utilização. [Como funcionam a reserva e a liquidação →](https://ailoot.ai/docs/pt-pt/billing/reserve/)

#### Detalhes da tarifa de referência

As tabelas de referência do modelo não alteram a seleção do método, as cotações ou os custos. Os custos ativos usam as tarifas do método Ailoot selecionado.

Tabelas de referência do modelo

#### Preços por configuração

Associe cada custo às condições apresentadas. Use uma única tarifa para cada conjunto de configurações alternativas.

| Configuração | Tabela de tarifas | Tokens de contexto, mais de | Tokens de contexto, até ao limite inclusive | Custo |
| --- | --- | --- | --- | --- |
| ConfiguraçãoOpenAI Chat · Tarifas de base por token | Tabela de tarifasTarifa base | Tokens de contexto, mais de— | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoOpenAI Chat · Escalão 1 por comprimento do pedido | Tabela de tarifas— | Tokens de contexto, mais de0 | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoAnthropic Messages · Tarifas de base por token | Tabela de tarifasTarifa base | Tokens de contexto, mais de— | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoAnthropic Messages · Escalão 1 por comprimento do pedido | Tabela de tarifas— | Tokens de contexto, mais de0 | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |

### Exemplos de pedidos

#### Ailoot · OpenAI Responses

Exemplo de textoPython SDKNode.js SDKStreaming em Python

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "glm-5.3", "input": ""}')
f=Path(os.environ["AILOOT_TEXT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 source material")
text=f.read_text(encoding="utf-8")
if not text.strip():raise SystemExit("Source material must contain text")
p["input"]="Summarize this material and quote supporting source passages.\n\n"+text
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/responses \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(json.loads(Path("result.json").read_text(encoding="utf-8")))
PY_RESULT
```

```python
from openai import OpenAI
import os

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client = OpenAI(base_url="https://api.ailoot.ai/v1", api_key=os.environ["AILOOT_API_KEY"], max_retries=0)
resp = client.responses.create(model="glm-5.3", input="Explain the difference between an observation and a hypothesis in three sentences.")
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(resp.to_dict(mode="json"))
```

```js
import OpenAI from "openai";

if (!process.env.AILOOT_API_KEY?.trim()) throw new Error("Set AILOOT_API_KEY before making a request");
const client = new OpenAI({ baseURL: "https://api.ailoot.ai/v1", apiKey: process.env.AILOOT_API_KEY, maxRetries: 0 });
const resp = await client.responses.create({ model: "glm-5.3", input: "Explain the difference between an observation and a hypothesis in three sentences." });
import { writeFileSync } from "node:fs";

function saveResult(data, stem = "result") {
  writeFileSync(stem + ".json", JSON.stringify(data, null, 2));
  console.log(JSON.stringify(data, null, 2));
  const saveBlob = (encoded, suffix, label) => {
    const raw = Buffer.from(encoded, "base64");
    const ext = raw.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10])) ? "png" : raw[0]===255 && raw[1]===216 ? "jpg" : raw.subarray(0,4).toString()==="RIFF" && raw.subarray(8,12).toString()==="WEBP" ? "webp" : suffix;
    const file = `${stem}-${label}.${ext}`;
    writeFileSync(file, raw); console.log("Saved", file);
  };
  for (const [i, block] of (data.content || []).entries()) console.log("Content", i, JSON.stringify(block));
  for (const choice of data.choices || []) console.log("Choice", choice.index, JSON.stringify(choice.message || choice.delta || {}));
  for (const [i, item] of (data.output || []).entries()) {
    console.log("Output", i, JSON.stringify(item));
    if (item.type === "image_generation_call" && item.result) saveBlob(item.result, item.output_format || "bin", `output-${i}`);
  }
  for (const [ci, candidate] of (data.candidates || []).entries()) {
    for (const [pi, part] of (candidate.content?.parts || []).entries()) {
      console.log("Candidate/part", ci, pi, JSON.stringify(part));
      const blob = part.inlineData || part.inline_data;
      if (blob?.data) {
        const mime = blob.mimeType || blob.mime_type;
        const suffix = ({"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"})[mime] || "bin";
        saveBlob(blob.data, suffix, `candidate-${ci}-part-${pi}`);
      }
    }
  }
}

saveResult(resp);
```

```python
from openai import OpenAI
import os
from pathlib import Path
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
with client.responses.stream(model="glm-5.3", input="Explain the difference between an observation and a hypothesis in three sentences.") as stream:
    with Path("stream-events.jsonl").open("w",encoding="utf-8") as log:
        for event in stream:
            payload=event.to_dict(mode="json")
            log.write(json.dumps(payload,ensure_ascii=False)+"\n"); log.flush()
            print(json.dumps(payload,ensure_ascii=False))
    final=stream.get_final_response()
    save_result(final.to_dict(mode="json"),"stream-result")
```

### Receber e guardar os resultados

#### Ailoot · OpenAI Responses

json ou SSE

##### Guardar todos os resultados concluídos

Guarde cada resposta, ficheiro e parte de conteúdo devolvidos na íntegra.

Conserve cada elemento de saída e parte de conteúdo, o call\_id real da função, o raciocínio cifrado e os dados de utilização. Em streaming, mantenha a identidade completa dos eventos e elementos.

##### Se for necessário verificar a resposta original

Conserve os ID e cabeçalhos de pedido/resposta. Não é fornecido um URL genérico para obter uma tarefa textual.

Campos da resposta

| Campo | Tipo |
| --- | --- |
| Campo`id` | Tipostring |
| Campo`status` | Tipostring |
| Campo`output[]` | Tipomessage\|reasoning\|function\_call\|other item |
| Campo`output[].content[]` | Tipocontent part |
| Campo`usage` | Tipoobject |

Erros e passos seguintes

| Resposta | Condição | Passo seguinte |
| --- | --- | --- |
| Resposta400 · `invalid_request_error` | CondiçãoCampos obrigatórios, representação do material ou valor do parâmetro inválidos | Passo seguinteCorrija os campos indicados antes de um novo pedido de criação. |

### Aliases

#### Aliases do modelo

<strong>Ailoot</strong> [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=responses), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=responses), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=responses), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=responses), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=responses), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=responses)
**Ailoot Ultra** [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3), [`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest)

#### Aliases dos caminhos dos métodos

`/chat/completions`

#### IDs de chamada relacionados

[`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=responses), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=responses), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=responses), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=responses), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=responses), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=responses), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3)

**Ailoot · OpenAI Chat** `POST /v1/chat/completions` `glm-5.3`

[`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=chat)

Z.ai /`glm-5.3`

ID do modelo

- `glm-5.3`
- `glm`
- `glm-5`
- `glm-5.1`
- `glm-5.2`
- `glm-latest`

### Introdução

Z.ai GLM 5.3 é um modelo de raciocínio textual para engenharia de software complexa, trabalho em terminal e agentes de longa duração. Suporta um contexto de 1M tokens documentado pelo fabricante, até 128K tokens de saída, chamada de funções e esforço de raciocínio low/high/max, mantendo o raciocínio sempre ativado.

Entradas aceites

Texto

Resultados

Texto

### Disponível no Ailoot · entradas e métodos

**Ailoot · OpenAI Chat** `POST /v1/chat/completions`

Entrada

`text`

Saída

`text`

Contexto

1 000 000 tokens

Saída máxima

131 072 tokens

Formato de saída

json ou SSE

| Campo | Tipo | Requisito | Valores e limites | Predefinição |
| --- | --- | --- | --- | --- |
| Campo`model` | Tipo`string` | RequisitoObrigatório | Valores e limites glm-5.3 | Predefinição— |
| Campo`messages` | Tipo`message[]` | RequisitoObrigatório | Valores e limites Número mínimo de elementos: 1 | Predefinição— |
| Campo`messages[].role` | Tipo`string` | RequisitoObrigatório | Valores e limites Exemplos: system, user, assistant, tool, function Condições: Estes papéis são representados explicitamente pelos tipos de compatibilidade do código-fonte; o conjunto exato de papéis continua específico do modelo. Depende do modelo | Predefinição— |
| Campo`messages[].content` | Tipo`string\|content_part[]\|null` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`messages[].tool_calls` | Tipo`tool_call[]` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`messages[].tool_call_id` | Tipo`string` | RequisitoOpcional | Valores e limites Aplica-se quando: role=tool; use o ID realmente devolvido | Predefinição— |
| Campo`messages[].name` | Tipo`string` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`messages[].reasoning_content` | Tipo`string` | RequisitoOpcional | Valores e limites Aplica-se quando: Reintroduza o raciocínio realmente devolvido quando este modelo o utiliza | Predefinição— |
| Campo`messages[].reasoning_details` | Tipo`object\|array` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`max_tokens` | Tipo`integer` | RequisitoOpcional | Valores e limites Mínimo: 1 Depende do modelo | Predefinição— |
| Campo`max_completion_tokens` | Tipo`integer` | RequisitoOpcional | Valores e limites Mínimo: 1 Depende do modelo | Predefinição— |
| Campo`stream` | Tipo`boolean` | RequisitoOpcional | Valores e limites | Predefiniçãofalse |
| Campo`stream_options.include_usage` | Tipo`boolean` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`temperature` | Tipo`number` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`top_p` | Tipo`number` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`stop` | Tipo`string\|string[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tools` | Tipo`function_tool[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tools[].type` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tools[].function.name` | Tipo`string` | RequisitoObrigatório | Valores e limites Aplica-se quando: Função fornecida como ferramenta | Predefinição— |
| Campo`tools[].function.description` | Tipo`string` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`tools[].function.parameters` | Tipo`JSON_schema` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`tool_choice` | Tipo`string\|object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`parallel_tool_calls` | Tipo`boolean` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`response_format` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`reasoning_effort` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`reasoning` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`service_tier` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`instructions` | Tipo`string` | RequisitoOpcional | Valores e limites Campo de compatibilidade | Predefinição— |
| Campo`functions` | Tipo`function[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`function_call` | Tipo`string\|object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`prompt_cache_options` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |

Combinações de materiais de entrada

**Texto** · Texto UTF8

`messages[].content`

Parâmetros e ciclo de vida do método

| Parâmetro | Contrato |
| --- | --- |
| Parâmetro`material_types` | Contratotext |
| Parâmetro`required` | Contratomodel, messages |
| Parâmetro`optional_controls` | Contratonull |
| Parâmetro`content_type` | Contratoapplication/json |
| Parâmetro`text_file_material` | ContratoConteúdo UTF-8 real inserido como texto; ID de ficheiros/URLs precisam de suporte separado e exato |

Ciclo de vida: `exact retained published method`

As estruturas dos métodos e os ID são exatos; a capacidade do fornecedor é distinta da admissão dos pedidos.

### Tarifários

#### Tarifas dos métodos Ailoot

Entrada

0,0014 US$ */ 1K*

Saída

0,0044 US$ */ 1K*

Leitura da cache

≈0,00026 US$ */ 1K*

O Ailoot reserva um montante estimado antes de um pedido. Após o resultado, liquida o custo final com base na utilização medida. No streaming, a liquidação usa o registo final de utilização. [Como funcionam a reserva e a liquidação →](https://ailoot.ai/docs/pt-pt/billing/reserve/)

#### Detalhes da tarifa de referência

As tabelas de referência do modelo não alteram a seleção do método, as cotações ou os custos. Os custos ativos usam as tarifas do método Ailoot selecionado.

Tabelas de referência do modelo

#### Preços por configuração

Associe cada custo às condições apresentadas. Use uma única tarifa para cada conjunto de configurações alternativas.

| Configuração | Tabela de tarifas | Tokens de contexto, mais de | Tokens de contexto, até ao limite inclusive | Custo |
| --- | --- | --- | --- | --- |
| ConfiguraçãoOpenAI Chat · Tarifas de base por token | Tabela de tarifasTarifa base | Tokens de contexto, mais de— | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoOpenAI Chat · Escalão 1 por comprimento do pedido | Tabela de tarifas— | Tokens de contexto, mais de0 | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoAnthropic Messages · Tarifas de base por token | Tabela de tarifasTarifa base | Tokens de contexto, mais de— | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoAnthropic Messages · Escalão 1 por comprimento do pedido | Tabela de tarifas— | Tokens de contexto, mais de0 | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |

### Exemplos de pedidos

#### Ailoot · OpenAI Chat

Exemplo de textoPython SDKNode.js SDKStreaming em Python

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "glm-5.3", "messages": []}')
f=Path(os.environ["AILOOT_TEXT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 source material")
text=f.read_text(encoding="utf-8")
if not text.strip():raise SystemExit("Source material must contain text")
p["messages"]=[{"role":"user","content":"Summarize this material and quote supporting source passages.\n\n"+text}]
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/chat/completions \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
print(json.dumps(json.loads(Path("result.json").read_text()),ensure_ascii=False,indent=2))
PY_RESULT
```

```python
from openai import OpenAI
import os

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client = OpenAI(base_url="https://api.ailoot.ai/v1", api_key=os.environ["AILOOT_API_KEY"], max_retries=0)
resp = client.chat.completions.create(
    model="glm-5.3",
    messages=[{"role": "user", "content": "Explain the difference between an observation and a hypothesis in three sentences."}],
)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(resp.to_dict(mode="json"))
```

```js
import OpenAI from "openai";

if (!process.env.AILOOT_API_KEY?.trim()) throw new Error("Set AILOOT_API_KEY before making a request");
const client = new OpenAI({ baseURL: "https://api.ailoot.ai/v1", apiKey: process.env.AILOOT_API_KEY, maxRetries: 0 });
const resp = await client.chat.completions.create({
  model: "glm-5.3",
  messages: [{ role: "user", content: "Explain the difference between an observation and a hypothesis in three sentences." }],
});
import { writeFileSync } from "node:fs";

function saveResult(data, stem = "result") {
  writeFileSync(stem + ".json", JSON.stringify(data, null, 2));
  console.log(JSON.stringify(data, null, 2));
  const saveBlob = (encoded, suffix, label) => {
    const raw = Buffer.from(encoded, "base64");
    const ext = raw.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10])) ? "png" : raw[0]===255 && raw[1]===216 ? "jpg" : raw.subarray(0,4).toString()==="RIFF" && raw.subarray(8,12).toString()==="WEBP" ? "webp" : suffix;
    const file = `${stem}-${label}.${ext}`;
    writeFileSync(file, raw); console.log("Saved", file);
  };
  for (const [i, block] of (data.content || []).entries()) console.log("Content", i, JSON.stringify(block));
  for (const choice of data.choices || []) console.log("Choice", choice.index, JSON.stringify(choice.message || choice.delta || {}));
  for (const [i, item] of (data.output || []).entries()) {
    console.log("Output", i, JSON.stringify(item));
    if (item.type === "image_generation_call" && item.result) saveBlob(item.result, item.output_format || "bin", `output-${i}`);
  }
  for (const [ci, candidate] of (data.candidates || []).entries()) {
    for (const [pi, part] of (candidate.content?.parts || []).entries()) {
      console.log("Candidate/part", ci, pi, JSON.stringify(part));
      const blob = part.inlineData || part.inline_data;
      if (blob?.data) {
        const mime = blob.mimeType || blob.mime_type;
        const suffix = ({"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"})[mime] || "bin";
        saveBlob(blob.data, suffix, `candidate-${ci}-part-${pi}`);
      }
    }
  }
}

saveResult(resp);
```

```python
from openai import OpenAI
import os
from pathlib import Path

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

with client.chat.completions.stream(model='glm-5.3',messages=[{"role":"user","content":"Explain observations and hypotheses in three sentences."}]) as stream:
    with Path("stream-events.jsonl").open("w",encoding="utf-8") as log:
        for event in stream:
            payload=event.to_dict(mode="json")
            log.write(json.dumps(payload,ensure_ascii=False)+"\n"); log.flush()
            print(json.dumps(payload,ensure_ascii=False))
    final=stream.get_final_completion()
    save_result(final.to_dict(mode="json"),"stream-result")
```

### Receber e guardar os resultados

#### Ailoot · OpenAI Chat

json ou SSE

##### Guardar todos os resultados concluídos

Guarde cada resposta, ficheiro e parte de conteúdo devolvidos na íntegra.

Conserve cada opção com o conteúdo, as chamadas de ferramentas e o raciocínio. Em SSE, junte os deltas por índice de opção e ferramenta e mantenha o motivo final de conclusão e os dados de utilização.

##### Se for necessário verificar a resposta original

Conserve os ID e cabeçalhos de pedido/resposta. Não é fornecido um URL genérico para obter uma tarefa textual.

Campos da resposta

| Campo | Tipo |
| --- | --- |
| Campo`choices[].index` | Tipointeger |
| Campo`choices[].message.content` | Tipostring\|null |
| Campo`choices[].message.tool_calls` | Tipotool\_call\[\] |
| Campo`choices[].message.reasoning_content` | Tipostring |
| Campo`choices[].message.reasoning_details` | Tipoobject\|array |
| Campo`choices[].finish_reason` | Tipostring\|null |
| Campo`usage` | Tipoobject |

Erros e passos seguintes

| Resposta | Condição | Passo seguinte |
| --- | --- | --- |
| Resposta400 · `invalid_request_error` | CondiçãoCampos obrigatórios, representação do material ou valor do parâmetro inválidos | Passo seguinteCorrija os campos indicados antes de um novo pedido de criação. |

### Aliases

#### Aliases do modelo

<strong>Ailoot</strong> [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=chat), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=chat), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=chat), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=chat), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=chat), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=chat)
**Ailoot Ultra** [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3&fmt=chat), [`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=chat), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=chat)

#### Aliases dos caminhos dos métodos

`/chat/completions`

#### IDs de chamada relacionados

[`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=chat), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=chat), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=chat), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=chat), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=chat), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=chat), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=chat), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=chat), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3&fmt=chat)

**Ailoot Ultra · OpenAI Chat** `POST /v1/chat/completions` `glm-5.3`

[`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3&fmt=chat)

Z.ai /`glm-5.3`

ID do modelo

- `glm-5.3`
- `z-ai/glm-5.3`
- `~z-ai/glm-latest`

### Introdução

Z.ai GLM 5.3 é um modelo de raciocínio textual para engenharia de software complexa, trabalho em terminal e agentes de longa duração. Suporta um contexto de 1M tokens documentado pelo fabricante, até 128K tokens de saída, chamada de funções e esforço de raciocínio low/high/max, mantendo o raciocínio sempre ativado.

Entradas aceites

Texto

Resultados

Texto

### Disponível no Ailoot · entradas e métodos

**Ailoot Ultra · OpenAI Chat** `POST /v1/chat/completions`

Entrada

`text`

Saída

`text`

Formato de saída

json ou SSE

| Campo | Tipo | Requisito | Valores e limites | Predefinição |
| --- | --- | --- | --- | --- |
| Campo`model` | Tipo`string` | RequisitoObrigatório | Valores e limites glm-5.3 | Predefinição— |
| Campo`messages` | Tipo`message[]` | RequisitoObrigatório | Valores e limites Número mínimo de elementos: 1 | Predefinição— |
| Campo`messages[].role` | Tipo`string` | RequisitoObrigatório | Valores e limites Depende do modelo | Predefinição— |
| Campo`messages[].content` | Tipo`string` | RequisitoOpcional | Valores e limites Aplica-se quando: Conversação textual | Predefinição— |
| Campo`stream` | Tipo`boolean` | RequisitoOpcional | Valores e limites | Predefiniçãofalse |

Combinações de materiais de entrada

**Texto** · Texto UTF8

`messages[].content`

Parâmetros e ciclo de vida do método

| Parâmetro | Contrato |
| --- | --- |
| Parâmetro`content_type` | Contratoapplication/json |
| Parâmetro`required` | Contratomodel, messages |
| Parâmetro`material_types` | Contratotext |
| Parâmetro`messages` | ContratoLista de mensagens com estrutura role/content |
| Parâmetro`file_material` | ContratoDocumento UTF-8 real inserido como texto literal; nenhum ID de ficheiro inferido |
| Parâmetro`optional_controls` | Contratostream |
| Parâmetro`control_scope` | ContratoConversação textual; stream é um booleano e tem false como predefinição. |
| Parâmetro`output_modalities` | Contratotext |
| Parâmetro`hosted_operations` | Contratofalse |
| Parâmetro`multimodal_input_binding` | Contratonull |

Aliases do método: `/chat/completions`

Ciclo de vida: `synchronous_or_streamed`

Envie o ID exato do modelo com messages.

O comprimento do contexto não é um limite de saída.

Um ficheiro de texto pode fornecer texto literal; as entradas de imagem/áudio/objeto de ficheiro exigem uma associação exata.

### Tarifários

As referências tarifárias não acrescentam opções ao pedido. Os parâmetros suportados constam do método selecionado.

Modo rápido

Tarifa normal Quando o modo rápido está selecionado

Modo flex

Tarifa normal Quando o modo flex está selecionado

Esforço máximo de raciocínio

Tarifa normal Quando o esforço máximo de raciocínio usa o ajuste predefinido (default)

Esforço de raciocínio · elevado

Tarifa normal Quando o esforço de raciocínio é elevado

Esforço de raciocínio · baixo

Tarifa normal Quando o esforço de raciocínio é baixo

Esforço de raciocínio · máximo

Tarifa normal Quando o esforço de raciocínio é máximo

#### Tarifas Ailoot

#### Preços por configuração

Associe cada custo às condições apresentadas. Use uma única tarifa para cada conjunto de configurações alternativas.

| Configuração | Tabela de tarifas | Tokens de contexto, mais de | Tokens de contexto, até ao limite inclusive | Custo |
| --- | --- | --- | --- | --- |
| ConfiguraçãoTarifas base dos tokens | Tabela de tarifasTarifa base | Tokens de contexto, mais de— | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoEscalão 1 por comprimento do pedido | Tabela de tarifas— | Tokens de contexto, mais de0 | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |

O Ailoot reserva um montante estimado antes de um pedido. Após o resultado, liquida o custo final com base na utilização medida. No streaming, a liquidação usa o registo final de utilização. [Como funcionam a reserva e a liquidação →](https://ailoot.ai/docs/pt-pt/billing/reserve/)

### Exemplos de pedidos

#### Ailoot Ultra · OpenAI Chat

curlPython SDK

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model":"glm-5.3","messages":[{"role":"user","content":"hello"}],"stream":false}')

Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/chat/completions \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
r=json.loads(Path("result.json").read_text())
for x in r.get("choices",[]):
    if x.get("message",{}).get("content"): print(x["message"]["content"])
PY_RESULT
```

```python
from openai import OpenAI
import os

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
result=client.chat.completions.create(model="glm-5.3", messages=[{"role":"user","content":"hello"}], stream=False)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(result.to_dict(mode="json"))
```

### Receber e guardar os resultados

#### Ailoot Ultra · OpenAI Chat

json ou SSE

##### Guardar todos os resultados concluídos

Guarde cada resposta, ficheiro e parte de conteúdo devolvidos na íntegra.

Conserve cada opção com o conteúdo, as chamadas de ferramentas e o raciocínio. Em SSE, junte os deltas por índice de opção e ferramenta e mantenha o motivo final de conclusão e os dados de utilização.

##### Se for necessário verificar a resposta original

Conserve os ID e cabeçalhos de pedido/resposta. Não é fornecido um URL genérico para obter uma tarefa textual.

Campos da resposta

| Campo | Tipo |
| --- | --- |
| Campo`choices[].index` | Tipointeger |
| Campo`choices[].message.content` | Tipostring\|null |
| Campo`choices[].message.tool_calls` | Tipotool\_call\[\] |
| Campo`choices[].message.reasoning_content` | Tipostring |
| Campo`choices[].message.reasoning_details` | Tipoobject\|array |
| Campo`choices[].finish_reason` | Tipostring\|null |
| Campo`usage` | Tipoobject |

Erros e passos seguintes

| Resposta | Condição | Passo seguinte |
| --- | --- | --- |
| Resposta400 · `invalid_request_error` | CondiçãoCampos obrigatórios, representação do material ou valor do parâmetro inválidos | Passo seguinteCorrija os campos indicados antes de um novo pedido de criação. |

### Aliases

#### Aliases do modelo

<strong>Ailoot</strong> [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=chat), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=chat), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=chat), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=chat), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=chat), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=chat)
**Ailoot Ultra** [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3&fmt=chat), [`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=chat), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=chat)

#### Aliases dos caminhos dos métodos

`/chat/completions`

#### IDs de chamada relacionados

[`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=chat), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=chat), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=chat), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=chat), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=chat), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=chat), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=chat), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=chat), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3&fmt=chat)

**Ailoot Ultra · Anthropic Messages** `POST /v1/messages` `glm-5.3`

[`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3&fmt=messages)

Z.ai /`glm-5.3`

ID do modelo

- `glm-5.3`
- `z-ai/glm-5.3`
- `~z-ai/glm-latest`

### Introdução

Z.ai GLM 5.3 é um modelo de raciocínio textual para engenharia de software complexa, trabalho em terminal e agentes de longa duração. Suporta um contexto de 1M tokens documentado pelo fabricante, até 128K tokens de saída, chamada de funções e esforço de raciocínio low/high/max, mantendo o raciocínio sempre ativado.

Entradas aceites

Texto

Resultados

json · sse

### Disponível no Ailoot · entradas e métodos

**Ailoot Ultra · Anthropic Messages** `POST /v1/messages`

Entrada

`text`

Saída

`json`, `sse`

Formato de saída

JSON ou SSE

| Campo | Tipo | Requisito | Valores e limites | Predefinição |
| --- | --- | --- | --- | --- |
| Campo`model` | Tipo`string` | RequisitoObrigatório | Valores e limites glm-5.3 | Predefinição— |
| Campo`messages` | Tipo`message[]` | RequisitoObrigatório | Valores e limites | Predefinição— |
| Campo`messages[].role` | Tipo`string` | RequisitoObrigatório | Valores e limites user, assistant | Predefinição— |
| Campo`messages[].content` | Tipo`string` | RequisitoObrigatório | Valores e limites | Predefinição— |
| Campo`max_tokens` | Tipo`integer` | RequisitoObrigatório | Valores e limites | Predefinição— |
| Campo`stream` | Tipo`boolean` | RequisitoOpcional | Valores e limites | Predefiniçãofalse |

Combinações de materiais de entrada

**Texto** · Texto UTF-8

`Cadeia de caracteres messages[].content`

Parâmetros e ciclo de vida do método

| Parâmetro | Contrato |
| --- | --- |
| Parâmetro`content_type` | Contratoapplication/json |
| Parâmetro`required` | Contratomodel, messages, max\_tokens |
| Parâmetro`optional_controls` | Contratostream |
| Parâmetro`material_types` | Contratotext |
| Parâmetro`text_file_material` | ContratoLeia o documento UTF-8 real e coloque o texto na entrada indicada ou na cadeia de conteúdo da mensagem. |

Ciclo de vida: `synchronous_or_streamed`

### Tarifários

As referências tarifárias não acrescentam opções ao pedido. Os parâmetros suportados constam do método selecionado.

Modo rápido

Tarifa normal Quando o modo rápido está selecionado

Modo flex

Tarifa normal Quando o modo flex está selecionado

Esforço máximo de raciocínio

Tarifa normal Quando o esforço máximo de raciocínio usa o ajuste predefinido (default)

Esforço de raciocínio · elevado

Tarifa normal Quando o esforço de raciocínio é elevado

Esforço de raciocínio · baixo

Tarifa normal Quando o esforço de raciocínio é baixo

Esforço de raciocínio · máximo

Tarifa normal Quando o esforço de raciocínio é máximo

#### Tarifas Ailoot

#### Preços por configuração

Associe cada custo às condições apresentadas. Use uma única tarifa para cada conjunto de configurações alternativas.

| Configuração | Tabela de tarifas | Tokens de contexto, mais de | Tokens de contexto, até ao limite inclusive | Custo |
| --- | --- | --- | --- | --- |
| ConfiguraçãoTarifas base dos tokens | Tabela de tarifasTarifa base | Tokens de contexto, mais de— | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoEscalão 1 por comprimento do pedido | Tabela de tarifas— | Tokens de contexto, mais de0 | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |

O Ailoot reserva um montante estimado antes de um pedido. Após o resultado, liquida o custo final com base na utilização medida. No streaming, a liquidação usa o registo final de utilização. [Como funcionam a reserva e a liquidação →](https://ailoot.ai/docs/pt-pt/billing/reserve/)

### Exemplos de pedidos

#### Ailoot Ultra · Anthropic Messages

Corpo JSON mínimo completocurl · use o seu documento UTF-8Python · guarde o resultado completo

```json
{
  "model": "glm-5.3",
  "max_tokens": 128,
  "messages": [
    {
      "role": "user",
      "content": "Summarize the incident report."
    }
  ],
  "stream": false
}
```

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 document}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json, os
from pathlib import Path

source_file = Path(os.environ['AILOOT_TEXT_FILE'])
if not source_file.is_file():
    raise SystemExit('Set AILOOT_TEXT_FILE to your actual UTF-8 document')
text = source_file.read_text(encoding='utf-8')
if not text.strip():
    raise SystemExit('Choose a document containing text')
payload = {'model': 'glm-5.3', 'max_tokens': 128, 'messages': [{'role': 'user', 'content': 'Summarize the incident report.'}]}
payload['messages'][0]['content'] = 'Summarize this material and quote supporting source passages.\n\n' + text
Path('request.json').write_text(json.dumps(payload, ensure_ascii=False), encoding='utf-8')
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/messages \
  -H "x-api-key: $AILOOT_API_KEY" -H 'anthropic-version: 2023-06-01' -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path

result = json.loads(Path('result.json').read_text(encoding='utf-8'))
print(json.dumps(result, ensure_ascii=False, indent=2))
PY_RESULT
```

```python
import json, os
from pathlib import Path

source_file = Path(os.environ['AILOOT_TEXT_FILE'])
if not source_file.is_file():
    raise SystemExit('Set AILOOT_TEXT_FILE to your actual UTF-8 document')
text = source_file.read_text(encoding='utf-8')
if not text.strip():
    raise SystemExit('Choose a document containing text')
payload = {'model': 'glm-5.3', 'max_tokens': 128, 'messages': [{'role': 'user', 'content': 'Summarize the incident report.'}]}
payload['messages'][0]['content'] = 'Summarize this material and quote supporting source passages.\n\n' + text
from urllib.request import Request, urlopen
from urllib.error import HTTPError

api_key = os.environ['AILOOT_API_KEY']
if not api_key.strip():
    raise SystemExit('Set AILOOT_API_KEY before making a request')
headers = {'x-api-key': 'PLACEHOLDER_KEY', 'anthropic-version': '2023-06-01', 'Content-Type': 'application/json'}
headers['x-api-key'] = api_key
request = Request('https://api.ailoot.ai/v1/messages', data=json.dumps(payload, ensure_ascii=False).encode('utf-8'), headers=headers, method='POST')
try:
    with urlopen(request, timeout=120) as response:
        raw = response.read()
        Path('response-headers.txt').write_text(str(response.headers), encoding='utf-8')
except HTTPError as error:
    Path('result.json').write_bytes(error.read())
    Path('response-headers.txt').write_text(str(error.headers), encoding='utf-8')
    raise
Path('result.json').write_bytes(raw)
import json
from pathlib import Path

result = json.loads(Path('result.json').read_text(encoding='utf-8'))
print(json.dumps(result, ensure_ascii=False, indent=2))
```

### Receber e guardar os resultados

#### Ailoot Ultra · Anthropic Messages

JSON ou SSE

##### Guardar todos os resultados concluídos

Guarde cada resposta, ficheiro e parte de conteúdo devolvidos na íntegra.

Conserve todos os blocos de conteúdo, as assinaturas de raciocínio e os ID reais de utilização de ferramentas. Junte todos os deltas de blocos SSE; o primeiro bloco de texto não é a saída completa.

##### Se for necessário verificar a resposta original

Conserve os ID e cabeçalhos de pedido/resposta. Não é fornecido um URL genérico para obter uma tarefa textual.

Campos da resposta

| Campo | Tipo |
| --- | --- |
| Campo`id` | Tipostring |
| Campo`model` | Tipostring |
| Campo`content[]` | Tipotext\|thinking\|tool\_use\|other content block |
| Campo`stop_reason` | Tipostring\|null |
| Campo`usage` | Tipoobject |

Erros e passos seguintes

| Resposta | Condição | Passo seguinte |
| --- | --- | --- |
| Resposta400 · `invalid_request_error` | CondiçãoCampos obrigatórios, representação do material ou valor do parâmetro inválidos | Passo seguinteCorrija os campos indicados antes de um novo pedido de criação. |

### Aliases

#### Aliases do modelo

<strong>Ailoot</strong> [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=messages), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=messages), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=messages), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=messages), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=messages), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=messages)
**Ailoot Ultra** [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3&fmt=messages), [`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=messages), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=messages)

#### Aliases dos caminhos dos métodos

`/chat/completions`

#### IDs de chamada relacionados

[`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=messages), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=messages), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=messages), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=messages), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=messages), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=messages), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=messages), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=messages), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3&fmt=messages)

**Ailoot · Anthropic Messages** `POST /v1/messages` `glm`

[`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=messages)

Z.ai /`glm`

ID do modelo

- `glm-5.3`
- `glm`
- `glm-5`
- `glm-5.1`
- `glm-5.2`
- `glm-latest`

### Introdução

Z.ai GLM 5.3 é um modelo de raciocínio textual para engenharia de software complexa, trabalho em terminal e agentes de longa duração. Suporta um contexto de 1M tokens documentado pelo fabricante, até 128K tokens de saída, chamada de funções e esforço de raciocínio low/high/max, mantendo o raciocínio sempre ativado.

Entradas aceites

Texto

Resultados

Texto

### Disponível no Ailoot · entradas e métodos

**Ailoot · Anthropic Messages** `POST /v1/messages`

Entrada

`text`

Saída

`text`

Contexto

1 000 000 tokens

Saída máxima

131 072 tokens

Formato de saída

json ou SSE

| Campo | Tipo | Requisito | Valores e limites | Predefinição |
| --- | --- | --- | --- | --- |
| Campo`model` | Tipo`string` | RequisitoObrigatório | Valores e limites glm | Predefinição— |
| Campo`messages` | Tipo`message[]` | RequisitoObrigatório | Valores e limites Número mínimo de elementos: 1 | Predefinição— |
| Campo`messages[].role` | Tipo`string` | RequisitoObrigatório | Valores e limites user, assistant | Predefinição— |
| Campo`messages[].content` | Tipo`string\|content_block[]` | RequisitoObrigatório | Valores e limites | Predefinição— |
| Campo`system` | Tipo`string\|content_block[]` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`max_tokens` | Tipo`integer` | RequisitoObrigatório | Valores e limites Mínimo: 1 O limite aplica-se a: Limite exato do modelo ou da ficha selecionados | Predefinição— |
| Campo`stream` | Tipo`boolean` | RequisitoOpcional | Valores e limites | Predefiniçãofalse |
| Campo`temperature` | Tipo`number` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`top_p` | Tipo`number` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`stop_sequences` | Tipo`string[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tools` | Tipo`tool[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tools[].name` | Tipo`string` | RequisitoOpcional | Valores e limites Aplica-se quando: Ferramenta fornecida | Predefinição— |
| Campo`tools[].description` | Tipo`string` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`tools[].input_schema` | Tipo`JSON_schema` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`tool_choice` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`thinking.type` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`thinking.budget_tokens` | Tipo`integer` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`output_config.effort` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`metadata` | Tipo`object` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`cache_control` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |

Combinações de materiais de entrada

**Texto** · Texto UTF8

`messages[].content ou bloco type=text`

Parâmetros e ciclo de vida do método

| Parâmetro | Contrato |
| --- | --- |
| Parâmetro`material_types` | Contratotext |
| Parâmetro`required` | Contratomodel, messages, max\_tokens |
| Parâmetro`optional_controls` | Contratonull |
| Parâmetro`content_type` | Contratoapplication/json |
| Parâmetro`text_file_material` | ContratoConteúdo UTF-8 real inserido como texto; ID de ficheiros/URLs precisam de suporte separado e exato |

Ciclo de vida: `exact retained published method`

As estruturas dos métodos e os ID são exatos; a capacidade do fornecedor é distinta da admissão dos pedidos.

### Tarifários

#### Tarifas dos métodos Ailoot

Entrada

0,0014 US$ */ 1K*

Saída

0,0044 US$ */ 1K*

Leitura da cache

≈0,00026 US$ */ 1K*

O Ailoot reserva um montante estimado antes de um pedido. Após o resultado, liquida o custo final com base na utilização medida. No streaming, a liquidação usa o registo final de utilização. [Como funcionam a reserva e a liquidação →](https://ailoot.ai/docs/pt-pt/billing/reserve/)

#### Detalhes da tarifa de referência

As tabelas de referência do modelo não alteram a seleção do método, as cotações ou os custos. Os custos ativos usam as tarifas do método Ailoot selecionado.

Tabelas de referência do modelo

#### Preços por configuração

Associe cada custo às condições apresentadas. Use uma única tarifa para cada conjunto de configurações alternativas.

| Configuração | Tabela de tarifas | Tokens de contexto, mais de | Tokens de contexto, até ao limite inclusive | Custo |
| --- | --- | --- | --- | --- |
| ConfiguraçãoOpenAI Chat · Tarifas de base por token | Tabela de tarifasTarifa base | Tokens de contexto, mais de— | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoOpenAI Chat · Escalão 1 por comprimento do pedido | Tabela de tarifas— | Tokens de contexto, mais de0 | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoAnthropic Messages · Tarifas de base por token | Tabela de tarifasTarifa base | Tokens de contexto, mais de— | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoAnthropic Messages · Escalão 1 por comprimento do pedido | Tabela de tarifas— | Tokens de contexto, mais de0 | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |

### Exemplos de pedidos

#### Ailoot · Anthropic Messages

Exemplo de textoPython SDKNode.js SDKStreaming em Python

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "glm", "max_tokens": 1024, "messages": []}')
f=Path(os.environ["AILOOT_TEXT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 source material")
text=f.read_text(encoding="utf-8")
if not text.strip():raise SystemExit("Source material must contain text")
p["messages"]=[{"role":"user","content":"Summarize this material and quote supporting source passages.\n\n"+text}]
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/messages \
  -H "x-api-key: $AILOOT_API_KEY" -H 'anthropic-version: 2023-06-01' -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
print(json.dumps(json.loads(Path("result.json").read_text()),ensure_ascii=False,indent=2))
PY_RESULT
```

```python
import anthropic
import os

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client = anthropic.Anthropic(base_url="https://api.ailoot.ai", api_key=os.environ["AILOOT_API_KEY"], max_retries=0)
msg = client.messages.create(
    model="glm",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Explain the difference between an observation and a hypothesis in three sentences."}],
)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(msg.to_dict(mode="json"))
```

```js
import Anthropic from "@anthropic-ai/sdk";

if (!process.env.AILOOT_API_KEY?.trim()) throw new Error("Set AILOOT_API_KEY before making a request");
const client = new Anthropic({ baseURL: "https://api.ailoot.ai", apiKey: process.env.AILOOT_API_KEY, maxRetries: 0 });
const msg = await client.messages.create({
  model: "glm",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Explain the difference between an observation and a hypothesis in three sentences." }],
});
import { writeFileSync } from "node:fs";

function saveResult(data, stem = "result") {
  writeFileSync(stem + ".json", JSON.stringify(data, null, 2));
  console.log(JSON.stringify(data, null, 2));
  const saveBlob = (encoded, suffix, label) => {
    const raw = Buffer.from(encoded, "base64");
    const ext = raw.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10])) ? "png" : raw[0]===255 && raw[1]===216 ? "jpg" : raw.subarray(0,4).toString()==="RIFF" && raw.subarray(8,12).toString()==="WEBP" ? "webp" : suffix;
    const file = `${stem}-${label}.${ext}`;
    writeFileSync(file, raw); console.log("Saved", file);
  };
  for (const [i, block] of (data.content || []).entries()) console.log("Content", i, JSON.stringify(block));
  for (const choice of data.choices || []) console.log("Choice", choice.index, JSON.stringify(choice.message || choice.delta || {}));
  for (const [i, item] of (data.output || []).entries()) {
    console.log("Output", i, JSON.stringify(item));
    if (item.type === "image_generation_call" && item.result) saveBlob(item.result, item.output_format || "bin", `output-${i}`);
  }
  for (const [ci, candidate] of (data.candidates || []).entries()) {
    for (const [pi, part] of (candidate.content?.parts || []).entries()) {
      console.log("Candidate/part", ci, pi, JSON.stringify(part));
      const blob = part.inlineData || part.inline_data;
      if (blob?.data) {
        const mime = blob.mimeType || blob.mime_type;
        const suffix = ({"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"})[mime] || "bin";
        saveBlob(blob.data, suffix, `candidate-${ci}-part-${pi}`);
      }
    }
  }
}

saveResult(msg);
```

```python
import anthropic,os
from pathlib import Path

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=anthropic.Anthropic(base_url="https://api.ailoot.ai",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

with client.messages.stream(model='glm',max_tokens=1024,messages=[{"role":"user","content":"Explain observations and hypotheses in three sentences."}]) as stream:
    with Path("stream-events.jsonl").open("w",encoding="utf-8") as log:
        for event in stream:
            payload=event.to_dict(mode="json")
            log.write(json.dumps(payload,ensure_ascii=False)+"\n"); log.flush()
            print(json.dumps(payload,ensure_ascii=False))
    final=stream.get_final_message()
    save_result(final.to_dict(mode="json"),"stream-result")
```

### Receber e guardar os resultados

#### Ailoot · Anthropic Messages

json ou SSE

##### Guardar todos os resultados concluídos

Guarde cada resposta, ficheiro e parte de conteúdo devolvidos na íntegra.

Conserve todos os blocos de conteúdo, as assinaturas de raciocínio e os ID reais de utilização de ferramentas. Junte todos os deltas de blocos SSE; o primeiro bloco de texto não é a saída completa.

##### Se for necessário verificar a resposta original

Conserve os ID e cabeçalhos de pedido/resposta. Não é fornecido um URL genérico para obter uma tarefa textual.

Campos da resposta

| Campo | Tipo |
| --- | --- |
| Campo`id` | Tipostring |
| Campo`model` | Tipostring |
| Campo`content[]` | Tipotext\|thinking\|tool\_use\|other content block |
| Campo`stop_reason` | Tipostring\|null |
| Campo`usage` | Tipoobject |

Erros e passos seguintes

| Resposta | Condição | Passo seguinte |
| --- | --- | --- |
| Resposta400 · `invalid_request_error` | CondiçãoCampos obrigatórios, representação do material ou valor do parâmetro inválidos | Passo seguinteCorrija os campos indicados antes de um novo pedido de criação. |

### Aliases

#### Aliases do modelo

<strong>Ailoot</strong> [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=messages), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=messages), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=messages), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=messages), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=messages), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=messages)
**Ailoot Ultra** [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3&fmt=messages), [`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=messages), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=messages)

#### Aliases dos caminhos dos métodos

`/chat/completions`

#### IDs de chamada relacionados

[`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=messages), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=messages), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=messages), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=messages), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=messages), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=messages), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=messages), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=messages), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3&fmt=messages)

**Ailoot · OpenAI Responses** `POST /v1/responses` `glm`

[`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=responses)

Z.ai /`glm`

ID do modelo

- `glm-5.3`
- `glm`
- `glm-5`
- `glm-5.1`
- `glm-5.2`
- `glm-latest`

### Introdução

Z.ai GLM 5.3 é um modelo de raciocínio textual para engenharia de software complexa, trabalho em terminal e agentes de longa duração. Suporta um contexto de 1M tokens documentado pelo fabricante, até 128K tokens de saída, chamada de funções e esforço de raciocínio low/high/max, mantendo o raciocínio sempre ativado.

Entradas aceites

Texto

Resultados

Texto

### Disponível no Ailoot · entradas e métodos

**Ailoot · OpenAI Responses** `POST /v1/responses`

Entrada

`text`

Saída

`text`

Contexto

1 000 000 tokens

Saída máxima

131 072 tokens

Formato de saída

json ou SSE

| Campo | Tipo | Requisito | Valores e limites | Predefinição |
| --- | --- | --- | --- | --- |
| Campo`model` | Tipo`string` | RequisitoObrigatório | Valores e limites glm | Predefinição— |
| Campo`input` | Tipo`string\|input_item[]` | RequisitoObrigatório | Valores e limites | Predefinição— |
| Campo`instructions` | Tipo`string` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`input[].type` | Tipo`string` | RequisitoOpcional | Valores e limites message, reasoning, function\_call, function\_call\_output | Predefinição— |
| Campo`input[].content` | Tipo`string\|content_part[]` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`input[].call_id` | Tipo`string` | RequisitoOpcional | Valores e limites Aplica-se quando: function\_call\_output; conserve o call\_id realmente devolvido | Predefinição— |
| Campo`input[].output` | Tipo`string\|content_part[]` | RequisitoOpcional | Valores e limites Aplica-se quando: function\_call\_output | Predefinição— |
| Campo`max_output_tokens` | Tipo`integer` | RequisitoOpcional | Valores e limites Mínimo: 1 Depende do modelo | Predefinição— |
| Campo`stream` | Tipo`boolean` | RequisitoOpcional | Valores e limites | Predefiniçãofalse |
| Campo`temperature` | Tipo`number` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`top_p` | Tipo`number` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tools` | Tipo`tool[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tool_choice` | Tipo`string\|object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`parallel_tool_calls` | Tipo`boolean` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`reasoning.effort` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`reasoning.summary` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`text.format` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`text.verbosity` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`include` | Tipo`string[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`store` | Tipo`boolean` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`previous_response_id` | Tipo`string` | RequisitoOpcional | Valores e limites Requisito do ID: Só um ID de resposta real de uma continuação suportada Depende do modelo | Predefinição— |
| Campo`service_tier` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`prompt_cache_key` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`prompt_cache_options` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |

Combinações de materiais de entrada

**Texto** · Texto UTF8

`Texto de entrada ou parte input_text`

Parâmetros e ciclo de vida do método

| Parâmetro | Contrato |
| --- | --- |
| Parâmetro`material_types` | Contratotext |
| Parâmetro`required` | Contratomodel, input |
| Parâmetro`optional_controls` | Contratonull |
| Parâmetro`content_type` | Contratoapplication/json |
| Parâmetro`text_file_material` | ContratoConteúdo UTF-8 real inserido como texto; ID de ficheiros/URLs precisam de suporte separado e exato |

Ciclo de vida: `exact retained published method`

As estruturas dos métodos e os ID são exatos; a capacidade do fornecedor é distinta da admissão dos pedidos.

### Tarifários

#### Tarifas dos métodos Ailoot

Entrada

0,0014 US$ */ 1K*

Saída

0,0044 US$ */ 1K*

Leitura da cache

≈0,00026 US$ */ 1K*

O Ailoot reserva um montante estimado antes de um pedido. Após o resultado, liquida o custo final com base na utilização medida. No streaming, a liquidação usa o registo final de utilização. [Como funcionam a reserva e a liquidação →](https://ailoot.ai/docs/pt-pt/billing/reserve/)

#### Detalhes da tarifa de referência

As tabelas de referência do modelo não alteram a seleção do método, as cotações ou os custos. Os custos ativos usam as tarifas do método Ailoot selecionado.

Tabelas de referência do modelo

#### Preços por configuração

Associe cada custo às condições apresentadas. Use uma única tarifa para cada conjunto de configurações alternativas.

| Configuração | Tabela de tarifas | Tokens de contexto, mais de | Tokens de contexto, até ao limite inclusive | Custo |
| --- | --- | --- | --- | --- |
| ConfiguraçãoOpenAI Chat · Tarifas de base por token | Tabela de tarifasTarifa base | Tokens de contexto, mais de— | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoOpenAI Chat · Escalão 1 por comprimento do pedido | Tabela de tarifas— | Tokens de contexto, mais de0 | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoAnthropic Messages · Tarifas de base por token | Tabela de tarifasTarifa base | Tokens de contexto, mais de— | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoAnthropic Messages · Escalão 1 por comprimento do pedido | Tabela de tarifas— | Tokens de contexto, mais de0 | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |

### Exemplos de pedidos

#### Ailoot · OpenAI Responses

Exemplo de textoPython SDKNode.js SDKStreaming em Python

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "glm", "input": ""}')
f=Path(os.environ["AILOOT_TEXT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 source material")
text=f.read_text(encoding="utf-8")
if not text.strip():raise SystemExit("Source material must contain text")
p["input"]="Summarize this material and quote supporting source passages.\n\n"+text
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/responses \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(json.loads(Path("result.json").read_text(encoding="utf-8")))
PY_RESULT
```

```python
from openai import OpenAI
import os

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client = OpenAI(base_url="https://api.ailoot.ai/v1", api_key=os.environ["AILOOT_API_KEY"], max_retries=0)
resp = client.responses.create(model="glm", input="Explain the difference between an observation and a hypothesis in three sentences.")
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(resp.to_dict(mode="json"))
```

```js
import OpenAI from "openai";

if (!process.env.AILOOT_API_KEY?.trim()) throw new Error("Set AILOOT_API_KEY before making a request");
const client = new OpenAI({ baseURL: "https://api.ailoot.ai/v1", apiKey: process.env.AILOOT_API_KEY, maxRetries: 0 });
const resp = await client.responses.create({ model: "glm", input: "Explain the difference between an observation and a hypothesis in three sentences." });
import { writeFileSync } from "node:fs";

function saveResult(data, stem = "result") {
  writeFileSync(stem + ".json", JSON.stringify(data, null, 2));
  console.log(JSON.stringify(data, null, 2));
  const saveBlob = (encoded, suffix, label) => {
    const raw = Buffer.from(encoded, "base64");
    const ext = raw.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10])) ? "png" : raw[0]===255 && raw[1]===216 ? "jpg" : raw.subarray(0,4).toString()==="RIFF" && raw.subarray(8,12).toString()==="WEBP" ? "webp" : suffix;
    const file = `${stem}-${label}.${ext}`;
    writeFileSync(file, raw); console.log("Saved", file);
  };
  for (const [i, block] of (data.content || []).entries()) console.log("Content", i, JSON.stringify(block));
  for (const choice of data.choices || []) console.log("Choice", choice.index, JSON.stringify(choice.message || choice.delta || {}));
  for (const [i, item] of (data.output || []).entries()) {
    console.log("Output", i, JSON.stringify(item));
    if (item.type === "image_generation_call" && item.result) saveBlob(item.result, item.output_format || "bin", `output-${i}`);
  }
  for (const [ci, candidate] of (data.candidates || []).entries()) {
    for (const [pi, part] of (candidate.content?.parts || []).entries()) {
      console.log("Candidate/part", ci, pi, JSON.stringify(part));
      const blob = part.inlineData || part.inline_data;
      if (blob?.data) {
        const mime = blob.mimeType || blob.mime_type;
        const suffix = ({"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"})[mime] || "bin";
        saveBlob(blob.data, suffix, `candidate-${ci}-part-${pi}`);
      }
    }
  }
}

saveResult(resp);
```

```python
from openai import OpenAI
import os
from pathlib import Path
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
with client.responses.stream(model="glm", input="Explain the difference between an observation and a hypothesis in three sentences.") as stream:
    with Path("stream-events.jsonl").open("w",encoding="utf-8") as log:
        for event in stream:
            payload=event.to_dict(mode="json")
            log.write(json.dumps(payload,ensure_ascii=False)+"\n"); log.flush()
            print(json.dumps(payload,ensure_ascii=False))
    final=stream.get_final_response()
    save_result(final.to_dict(mode="json"),"stream-result")
```

### Receber e guardar os resultados

#### Ailoot · OpenAI Responses

json ou SSE

##### Guardar todos os resultados concluídos

Guarde cada resposta, ficheiro e parte de conteúdo devolvidos na íntegra.

Conserve cada elemento de saída e parte de conteúdo, o call\_id real da função, o raciocínio cifrado e os dados de utilização. Em streaming, mantenha a identidade completa dos eventos e elementos.

##### Se for necessário verificar a resposta original

Conserve os ID e cabeçalhos de pedido/resposta. Não é fornecido um URL genérico para obter uma tarefa textual.

Campos da resposta

| Campo | Tipo |
| --- | --- |
| Campo`id` | Tipostring |
| Campo`status` | Tipostring |
| Campo`output[]` | Tipomessage\|reasoning\|function\_call\|other item |
| Campo`output[].content[]` | Tipocontent part |
| Campo`usage` | Tipoobject |

Erros e passos seguintes

| Resposta | Condição | Passo seguinte |
| --- | --- | --- |
| Resposta400 · `invalid_request_error` | CondiçãoCampos obrigatórios, representação do material ou valor do parâmetro inválidos | Passo seguinteCorrija os campos indicados antes de um novo pedido de criação. |

### Aliases

#### Aliases do modelo

<strong>Ailoot</strong> [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=responses), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=responses), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=responses), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=responses), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=responses), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=responses)
**Ailoot Ultra** [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3), [`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest)

#### Aliases dos caminhos dos métodos

`/chat/completions`

#### IDs de chamada relacionados

[`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=responses), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=responses), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=responses), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=responses), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=responses), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=responses), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3)

**Ailoot · OpenAI Chat** `POST /v1/chat/completions` `glm`

[`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=chat)

Z.ai /`glm`

ID do modelo

- `glm-5.3`
- `glm`
- `glm-5`
- `glm-5.1`
- `glm-5.2`
- `glm-latest`

### Introdução

Z.ai GLM 5.3 é um modelo de raciocínio textual para engenharia de software complexa, trabalho em terminal e agentes de longa duração. Suporta um contexto de 1M tokens documentado pelo fabricante, até 128K tokens de saída, chamada de funções e esforço de raciocínio low/high/max, mantendo o raciocínio sempre ativado.

Entradas aceites

Texto

Resultados

Texto

### Disponível no Ailoot · entradas e métodos

**Ailoot · OpenAI Chat** `POST /v1/chat/completions`

Entrada

`text`

Saída

`text`

Contexto

1 000 000 tokens

Saída máxima

131 072 tokens

Formato de saída

json ou SSE

| Campo | Tipo | Requisito | Valores e limites | Predefinição |
| --- | --- | --- | --- | --- |
| Campo`model` | Tipo`string` | RequisitoObrigatório | Valores e limites glm | Predefinição— |
| Campo`messages` | Tipo`message[]` | RequisitoObrigatório | Valores e limites Número mínimo de elementos: 1 | Predefinição— |
| Campo`messages[].role` | Tipo`string` | RequisitoObrigatório | Valores e limites Exemplos: system, user, assistant, tool, function Condições: Estes papéis são representados explicitamente pelos tipos de compatibilidade do código-fonte; o conjunto exato de papéis continua específico do modelo. Depende do modelo | Predefinição— |
| Campo`messages[].content` | Tipo`string\|content_part[]\|null` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`messages[].tool_calls` | Tipo`tool_call[]` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`messages[].tool_call_id` | Tipo`string` | RequisitoOpcional | Valores e limites Aplica-se quando: role=tool; use o ID realmente devolvido | Predefinição— |
| Campo`messages[].name` | Tipo`string` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`messages[].reasoning_content` | Tipo`string` | RequisitoOpcional | Valores e limites Aplica-se quando: Reintroduza o raciocínio realmente devolvido quando este modelo o utiliza | Predefinição— |
| Campo`messages[].reasoning_details` | Tipo`object\|array` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`max_tokens` | Tipo`integer` | RequisitoOpcional | Valores e limites Mínimo: 1 Depende do modelo | Predefinição— |
| Campo`max_completion_tokens` | Tipo`integer` | RequisitoOpcional | Valores e limites Mínimo: 1 Depende do modelo | Predefinição— |
| Campo`stream` | Tipo`boolean` | RequisitoOpcional | Valores e limites | Predefiniçãofalse |
| Campo`stream_options.include_usage` | Tipo`boolean` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`temperature` | Tipo`number` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`top_p` | Tipo`number` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`stop` | Tipo`string\|string[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tools` | Tipo`function_tool[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tools[].type` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tools[].function.name` | Tipo`string` | RequisitoObrigatório | Valores e limites Aplica-se quando: Função fornecida como ferramenta | Predefinição— |
| Campo`tools[].function.description` | Tipo`string` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`tools[].function.parameters` | Tipo`JSON_schema` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`tool_choice` | Tipo`string\|object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`parallel_tool_calls` | Tipo`boolean` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`response_format` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`reasoning_effort` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`reasoning` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`service_tier` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`instructions` | Tipo`string` | RequisitoOpcional | Valores e limites Campo de compatibilidade | Predefinição— |
| Campo`functions` | Tipo`function[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`function_call` | Tipo`string\|object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`prompt_cache_options` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |

Combinações de materiais de entrada

**Texto** · Texto UTF8

`messages[].content`

Parâmetros e ciclo de vida do método

| Parâmetro | Contrato |
| --- | --- |
| Parâmetro`material_types` | Contratotext |
| Parâmetro`required` | Contratomodel, messages |
| Parâmetro`optional_controls` | Contratonull |
| Parâmetro`content_type` | Contratoapplication/json |
| Parâmetro`text_file_material` | ContratoConteúdo UTF-8 real inserido como texto; ID de ficheiros/URLs precisam de suporte separado e exato |

Ciclo de vida: `exact retained published method`

As estruturas dos métodos e os ID são exatos; a capacidade do fornecedor é distinta da admissão dos pedidos.

### Tarifários

#### Tarifas dos métodos Ailoot

Entrada

0,0014 US$ */ 1K*

Saída

0,0044 US$ */ 1K*

Leitura da cache

≈0,00026 US$ */ 1K*

O Ailoot reserva um montante estimado antes de um pedido. Após o resultado, liquida o custo final com base na utilização medida. No streaming, a liquidação usa o registo final de utilização. [Como funcionam a reserva e a liquidação →](https://ailoot.ai/docs/pt-pt/billing/reserve/)

#### Detalhes da tarifa de referência

As tabelas de referência do modelo não alteram a seleção do método, as cotações ou os custos. Os custos ativos usam as tarifas do método Ailoot selecionado.

Tabelas de referência do modelo

#### Preços por configuração

Associe cada custo às condições apresentadas. Use uma única tarifa para cada conjunto de configurações alternativas.

| Configuração | Tabela de tarifas | Tokens de contexto, mais de | Tokens de contexto, até ao limite inclusive | Custo |
| --- | --- | --- | --- | --- |
| ConfiguraçãoOpenAI Chat · Tarifas de base por token | Tabela de tarifasTarifa base | Tokens de contexto, mais de— | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoOpenAI Chat · Escalão 1 por comprimento do pedido | Tabela de tarifas— | Tokens de contexto, mais de0 | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoAnthropic Messages · Tarifas de base por token | Tabela de tarifasTarifa base | Tokens de contexto, mais de— | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoAnthropic Messages · Escalão 1 por comprimento do pedido | Tabela de tarifas— | Tokens de contexto, mais de0 | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |

### Exemplos de pedidos

#### Ailoot · OpenAI Chat

Exemplo de textoPython SDKNode.js SDKStreaming em Python

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "glm", "messages": []}')
f=Path(os.environ["AILOOT_TEXT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 source material")
text=f.read_text(encoding="utf-8")
if not text.strip():raise SystemExit("Source material must contain text")
p["messages"]=[{"role":"user","content":"Summarize this material and quote supporting source passages.\n\n"+text}]
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/chat/completions \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
print(json.dumps(json.loads(Path("result.json").read_text()),ensure_ascii=False,indent=2))
PY_RESULT
```

```python
from openai import OpenAI
import os

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client = OpenAI(base_url="https://api.ailoot.ai/v1", api_key=os.environ["AILOOT_API_KEY"], max_retries=0)
resp = client.chat.completions.create(
    model="glm",
    messages=[{"role": "user", "content": "Explain the difference between an observation and a hypothesis in three sentences."}],
)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(resp.to_dict(mode="json"))
```

```js
import OpenAI from "openai";

if (!process.env.AILOOT_API_KEY?.trim()) throw new Error("Set AILOOT_API_KEY before making a request");
const client = new OpenAI({ baseURL: "https://api.ailoot.ai/v1", apiKey: process.env.AILOOT_API_KEY, maxRetries: 0 });
const resp = await client.chat.completions.create({
  model: "glm",
  messages: [{ role: "user", content: "Explain the difference between an observation and a hypothesis in three sentences." }],
});
import { writeFileSync } from "node:fs";

function saveResult(data, stem = "result") {
  writeFileSync(stem + ".json", JSON.stringify(data, null, 2));
  console.log(JSON.stringify(data, null, 2));
  const saveBlob = (encoded, suffix, label) => {
    const raw = Buffer.from(encoded, "base64");
    const ext = raw.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10])) ? "png" : raw[0]===255 && raw[1]===216 ? "jpg" : raw.subarray(0,4).toString()==="RIFF" && raw.subarray(8,12).toString()==="WEBP" ? "webp" : suffix;
    const file = `${stem}-${label}.${ext}`;
    writeFileSync(file, raw); console.log("Saved", file);
  };
  for (const [i, block] of (data.content || []).entries()) console.log("Content", i, JSON.stringify(block));
  for (const choice of data.choices || []) console.log("Choice", choice.index, JSON.stringify(choice.message || choice.delta || {}));
  for (const [i, item] of (data.output || []).entries()) {
    console.log("Output", i, JSON.stringify(item));
    if (item.type === "image_generation_call" && item.result) saveBlob(item.result, item.output_format || "bin", `output-${i}`);
  }
  for (const [ci, candidate] of (data.candidates || []).entries()) {
    for (const [pi, part] of (candidate.content?.parts || []).entries()) {
      console.log("Candidate/part", ci, pi, JSON.stringify(part));
      const blob = part.inlineData || part.inline_data;
      if (blob?.data) {
        const mime = blob.mimeType || blob.mime_type;
        const suffix = ({"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"})[mime] || "bin";
        saveBlob(blob.data, suffix, `candidate-${ci}-part-${pi}`);
      }
    }
  }
}

saveResult(resp);
```

```python
from openai import OpenAI
import os
from pathlib import Path

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

with client.chat.completions.stream(model='glm',messages=[{"role":"user","content":"Explain observations and hypotheses in three sentences."}]) as stream:
    with Path("stream-events.jsonl").open("w",encoding="utf-8") as log:
        for event in stream:
            payload=event.to_dict(mode="json")
            log.write(json.dumps(payload,ensure_ascii=False)+"\n"); log.flush()
            print(json.dumps(payload,ensure_ascii=False))
    final=stream.get_final_completion()
    save_result(final.to_dict(mode="json"),"stream-result")
```

### Receber e guardar os resultados

#### Ailoot · OpenAI Chat

json ou SSE

##### Guardar todos os resultados concluídos

Guarde cada resposta, ficheiro e parte de conteúdo devolvidos na íntegra.

Conserve cada opção com o conteúdo, as chamadas de ferramentas e o raciocínio. Em SSE, junte os deltas por índice de opção e ferramenta e mantenha o motivo final de conclusão e os dados de utilização.

##### Se for necessário verificar a resposta original

Conserve os ID e cabeçalhos de pedido/resposta. Não é fornecido um URL genérico para obter uma tarefa textual.

Campos da resposta

| Campo | Tipo |
| --- | --- |
| Campo`choices[].index` | Tipointeger |
| Campo`choices[].message.content` | Tipostring\|null |
| Campo`choices[].message.tool_calls` | Tipotool\_call\[\] |
| Campo`choices[].message.reasoning_content` | Tipostring |
| Campo`choices[].message.reasoning_details` | Tipoobject\|array |
| Campo`choices[].finish_reason` | Tipostring\|null |
| Campo`usage` | Tipoobject |

Erros e passos seguintes

| Resposta | Condição | Passo seguinte |
| --- | --- | --- |
| Resposta400 · `invalid_request_error` | CondiçãoCampos obrigatórios, representação do material ou valor do parâmetro inválidos | Passo seguinteCorrija os campos indicados antes de um novo pedido de criação. |

### Aliases

#### Aliases do modelo

<strong>Ailoot</strong> [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=chat), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=chat), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=chat), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=chat), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=chat), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=chat)
**Ailoot Ultra** [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3&fmt=chat), [`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=chat), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=chat)

#### Aliases dos caminhos dos métodos

`/chat/completions`

#### IDs de chamada relacionados

[`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=chat), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=chat), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=chat), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=chat), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=chat), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=chat), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=chat), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=chat), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3&fmt=chat)

**Ailoot · Anthropic Messages** `POST /v1/messages` `glm-5`

[`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=messages)

Z.ai /`glm-5`

ID do modelo

- `glm-5.3`
- `glm`
- `glm-5`
- `glm-5.1`
- `glm-5.2`
- `glm-latest`

### Introdução

Z.ai GLM 5.3 é um modelo de raciocínio textual para engenharia de software complexa, trabalho em terminal e agentes de longa duração. Suporta um contexto de 1M tokens documentado pelo fabricante, até 128K tokens de saída, chamada de funções e esforço de raciocínio low/high/max, mantendo o raciocínio sempre ativado.

Entradas aceites

Texto

Resultados

Texto

### Disponível no Ailoot · entradas e métodos

**Ailoot · Anthropic Messages** `POST /v1/messages`

Entrada

`text`

Saída

`text`

Contexto

1 000 000 tokens

Saída máxima

131 072 tokens

Formato de saída

json ou SSE

| Campo | Tipo | Requisito | Valores e limites | Predefinição |
| --- | --- | --- | --- | --- |
| Campo`model` | Tipo`string` | RequisitoObrigatório | Valores e limites glm-5 | Predefinição— |
| Campo`messages` | Tipo`message[]` | RequisitoObrigatório | Valores e limites Número mínimo de elementos: 1 | Predefinição— |
| Campo`messages[].role` | Tipo`string` | RequisitoObrigatório | Valores e limites user, assistant | Predefinição— |
| Campo`messages[].content` | Tipo`string\|content_block[]` | RequisitoObrigatório | Valores e limites | Predefinição— |
| Campo`system` | Tipo`string\|content_block[]` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`max_tokens` | Tipo`integer` | RequisitoObrigatório | Valores e limites Mínimo: 1 O limite aplica-se a: Limite exato do modelo ou da ficha selecionados | Predefinição— |
| Campo`stream` | Tipo`boolean` | RequisitoOpcional | Valores e limites | Predefiniçãofalse |
| Campo`temperature` | Tipo`number` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`top_p` | Tipo`number` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`stop_sequences` | Tipo`string[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tools` | Tipo`tool[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tools[].name` | Tipo`string` | RequisitoOpcional | Valores e limites Aplica-se quando: Ferramenta fornecida | Predefinição— |
| Campo`tools[].description` | Tipo`string` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`tools[].input_schema` | Tipo`JSON_schema` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`tool_choice` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`thinking.type` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`thinking.budget_tokens` | Tipo`integer` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`output_config.effort` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`metadata` | Tipo`object` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`cache_control` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |

Combinações de materiais de entrada

**Texto** · Texto UTF8

`messages[].content ou bloco type=text`

Parâmetros e ciclo de vida do método

| Parâmetro | Contrato |
| --- | --- |
| Parâmetro`material_types` | Contratotext |
| Parâmetro`required` | Contratomodel, messages, max\_tokens |
| Parâmetro`optional_controls` | Contratonull |
| Parâmetro`content_type` | Contratoapplication/json |
| Parâmetro`text_file_material` | ContratoConteúdo UTF-8 real inserido como texto; ID de ficheiros/URLs precisam de suporte separado e exato |

Ciclo de vida: `exact retained published method`

As estruturas dos métodos e os ID são exatos; a capacidade do fornecedor é distinta da admissão dos pedidos.

### Tarifários

#### Tarifas dos métodos Ailoot

Entrada

0,0014 US$ */ 1K*

Saída

0,0044 US$ */ 1K*

Leitura da cache

≈0,00026 US$ */ 1K*

O Ailoot reserva um montante estimado antes de um pedido. Após o resultado, liquida o custo final com base na utilização medida. No streaming, a liquidação usa o registo final de utilização. [Como funcionam a reserva e a liquidação →](https://ailoot.ai/docs/pt-pt/billing/reserve/)

#### Detalhes da tarifa de referência

As tabelas de referência do modelo não alteram a seleção do método, as cotações ou os custos. Os custos ativos usam as tarifas do método Ailoot selecionado.

Tabelas de referência do modelo

#### Preços por configuração

Associe cada custo às condições apresentadas. Use uma única tarifa para cada conjunto de configurações alternativas.

| Configuração | Tabela de tarifas | Tokens de contexto, mais de | Tokens de contexto, até ao limite inclusive | Custo |
| --- | --- | --- | --- | --- |
| ConfiguraçãoOpenAI Chat · Tarifas de base por token | Tabela de tarifasTarifa base | Tokens de contexto, mais de— | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoOpenAI Chat · Escalão 1 por comprimento do pedido | Tabela de tarifas— | Tokens de contexto, mais de0 | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoAnthropic Messages · Tarifas de base por token | Tabela de tarifasTarifa base | Tokens de contexto, mais de— | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoAnthropic Messages · Escalão 1 por comprimento do pedido | Tabela de tarifas— | Tokens de contexto, mais de0 | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |

### Exemplos de pedidos

#### Ailoot · Anthropic Messages

Exemplo de textoPython SDKNode.js SDKStreaming em Python

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "glm-5", "max_tokens": 1024, "messages": []}')
f=Path(os.environ["AILOOT_TEXT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 source material")
text=f.read_text(encoding="utf-8")
if not text.strip():raise SystemExit("Source material must contain text")
p["messages"]=[{"role":"user","content":"Summarize this material and quote supporting source passages.\n\n"+text}]
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/messages \
  -H "x-api-key: $AILOOT_API_KEY" -H 'anthropic-version: 2023-06-01' -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
print(json.dumps(json.loads(Path("result.json").read_text()),ensure_ascii=False,indent=2))
PY_RESULT
```

```python
import anthropic
import os

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client = anthropic.Anthropic(base_url="https://api.ailoot.ai", api_key=os.environ["AILOOT_API_KEY"], max_retries=0)
msg = client.messages.create(
    model="glm-5",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Explain the difference between an observation and a hypothesis in three sentences."}],
)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(msg.to_dict(mode="json"))
```

```js
import Anthropic from "@anthropic-ai/sdk";

if (!process.env.AILOOT_API_KEY?.trim()) throw new Error("Set AILOOT_API_KEY before making a request");
const client = new Anthropic({ baseURL: "https://api.ailoot.ai", apiKey: process.env.AILOOT_API_KEY, maxRetries: 0 });
const msg = await client.messages.create({
  model: "glm-5",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Explain the difference between an observation and a hypothesis in three sentences." }],
});
import { writeFileSync } from "node:fs";

function saveResult(data, stem = "result") {
  writeFileSync(stem + ".json", JSON.stringify(data, null, 2));
  console.log(JSON.stringify(data, null, 2));
  const saveBlob = (encoded, suffix, label) => {
    const raw = Buffer.from(encoded, "base64");
    const ext = raw.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10])) ? "png" : raw[0]===255 && raw[1]===216 ? "jpg" : raw.subarray(0,4).toString()==="RIFF" && raw.subarray(8,12).toString()==="WEBP" ? "webp" : suffix;
    const file = `${stem}-${label}.${ext}`;
    writeFileSync(file, raw); console.log("Saved", file);
  };
  for (const [i, block] of (data.content || []).entries()) console.log("Content", i, JSON.stringify(block));
  for (const choice of data.choices || []) console.log("Choice", choice.index, JSON.stringify(choice.message || choice.delta || {}));
  for (const [i, item] of (data.output || []).entries()) {
    console.log("Output", i, JSON.stringify(item));
    if (item.type === "image_generation_call" && item.result) saveBlob(item.result, item.output_format || "bin", `output-${i}`);
  }
  for (const [ci, candidate] of (data.candidates || []).entries()) {
    for (const [pi, part] of (candidate.content?.parts || []).entries()) {
      console.log("Candidate/part", ci, pi, JSON.stringify(part));
      const blob = part.inlineData || part.inline_data;
      if (blob?.data) {
        const mime = blob.mimeType || blob.mime_type;
        const suffix = ({"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"})[mime] || "bin";
        saveBlob(blob.data, suffix, `candidate-${ci}-part-${pi}`);
      }
    }
  }
}

saveResult(msg);
```

```python
import anthropic,os
from pathlib import Path

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=anthropic.Anthropic(base_url="https://api.ailoot.ai",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

with client.messages.stream(model='glm-5',max_tokens=1024,messages=[{"role":"user","content":"Explain observations and hypotheses in three sentences."}]) as stream:
    with Path("stream-events.jsonl").open("w",encoding="utf-8") as log:
        for event in stream:
            payload=event.to_dict(mode="json")
            log.write(json.dumps(payload,ensure_ascii=False)+"\n"); log.flush()
            print(json.dumps(payload,ensure_ascii=False))
    final=stream.get_final_message()
    save_result(final.to_dict(mode="json"),"stream-result")
```

### Receber e guardar os resultados

#### Ailoot · Anthropic Messages

json ou SSE

##### Guardar todos os resultados concluídos

Guarde cada resposta, ficheiro e parte de conteúdo devolvidos na íntegra.

Conserve todos os blocos de conteúdo, as assinaturas de raciocínio e os ID reais de utilização de ferramentas. Junte todos os deltas de blocos SSE; o primeiro bloco de texto não é a saída completa.

##### Se for necessário verificar a resposta original

Conserve os ID e cabeçalhos de pedido/resposta. Não é fornecido um URL genérico para obter uma tarefa textual.

Campos da resposta

| Campo | Tipo |
| --- | --- |
| Campo`id` | Tipostring |
| Campo`model` | Tipostring |
| Campo`content[]` | Tipotext\|thinking\|tool\_use\|other content block |
| Campo`stop_reason` | Tipostring\|null |
| Campo`usage` | Tipoobject |

Erros e passos seguintes

| Resposta | Condição | Passo seguinte |
| --- | --- | --- |
| Resposta400 · `invalid_request_error` | CondiçãoCampos obrigatórios, representação do material ou valor do parâmetro inválidos | Passo seguinteCorrija os campos indicados antes de um novo pedido de criação. |

### Aliases

#### Aliases do modelo

<strong>Ailoot</strong> [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=messages), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=messages), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=messages), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=messages), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=messages), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=messages)
**Ailoot Ultra** [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3&fmt=messages), [`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=messages), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=messages)

#### Aliases dos caminhos dos métodos

`/chat/completions`

#### IDs de chamada relacionados

[`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=messages), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=messages), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=messages), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=messages), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=messages), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=messages), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=messages), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=messages), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3&fmt=messages)

**Ailoot · OpenAI Responses** `POST /v1/responses` `glm-5`

[`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=responses)

Z.ai /`glm-5`

ID do modelo

- `glm-5.3`
- `glm`
- `glm-5`
- `glm-5.1`
- `glm-5.2`
- `glm-latest`

### Introdução

Z.ai GLM 5.3 é um modelo de raciocínio textual para engenharia de software complexa, trabalho em terminal e agentes de longa duração. Suporta um contexto de 1M tokens documentado pelo fabricante, até 128K tokens de saída, chamada de funções e esforço de raciocínio low/high/max, mantendo o raciocínio sempre ativado.

Entradas aceites

Texto

Resultados

Texto

### Disponível no Ailoot · entradas e métodos

**Ailoot · OpenAI Responses** `POST /v1/responses`

Entrada

`text`

Saída

`text`

Contexto

1 000 000 tokens

Saída máxima

131 072 tokens

Formato de saída

json ou SSE

| Campo | Tipo | Requisito | Valores e limites | Predefinição |
| --- | --- | --- | --- | --- |
| Campo`model` | Tipo`string` | RequisitoObrigatório | Valores e limites glm-5 | Predefinição— |
| Campo`input` | Tipo`string\|input_item[]` | RequisitoObrigatório | Valores e limites | Predefinição— |
| Campo`instructions` | Tipo`string` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`input[].type` | Tipo`string` | RequisitoOpcional | Valores e limites message, reasoning, function\_call, function\_call\_output | Predefinição— |
| Campo`input[].content` | Tipo`string\|content_part[]` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`input[].call_id` | Tipo`string` | RequisitoOpcional | Valores e limites Aplica-se quando: function\_call\_output; conserve o call\_id realmente devolvido | Predefinição— |
| Campo`input[].output` | Tipo`string\|content_part[]` | RequisitoOpcional | Valores e limites Aplica-se quando: function\_call\_output | Predefinição— |
| Campo`max_output_tokens` | Tipo`integer` | RequisitoOpcional | Valores e limites Mínimo: 1 Depende do modelo | Predefinição— |
| Campo`stream` | Tipo`boolean` | RequisitoOpcional | Valores e limites | Predefiniçãofalse |
| Campo`temperature` | Tipo`number` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`top_p` | Tipo`number` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tools` | Tipo`tool[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tool_choice` | Tipo`string\|object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`parallel_tool_calls` | Tipo`boolean` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`reasoning.effort` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`reasoning.summary` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`text.format` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`text.verbosity` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`include` | Tipo`string[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`store` | Tipo`boolean` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`previous_response_id` | Tipo`string` | RequisitoOpcional | Valores e limites Requisito do ID: Só um ID de resposta real de uma continuação suportada Depende do modelo | Predefinição— |
| Campo`service_tier` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`prompt_cache_key` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`prompt_cache_options` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |

Combinações de materiais de entrada

**Texto** · Texto UTF8

`Texto de entrada ou parte input_text`

Parâmetros e ciclo de vida do método

| Parâmetro | Contrato |
| --- | --- |
| Parâmetro`material_types` | Contratotext |
| Parâmetro`required` | Contratomodel, input |
| Parâmetro`optional_controls` | Contratonull |
| Parâmetro`content_type` | Contratoapplication/json |
| Parâmetro`text_file_material` | ContratoConteúdo UTF-8 real inserido como texto; ID de ficheiros/URLs precisam de suporte separado e exato |

Ciclo de vida: `exact retained published method`

As estruturas dos métodos e os ID são exatos; a capacidade do fornecedor é distinta da admissão dos pedidos.

### Tarifários

#### Tarifas dos métodos Ailoot

Entrada

0,0014 US$ */ 1K*

Saída

0,0044 US$ */ 1K*

Leitura da cache

≈0,00026 US$ */ 1K*

O Ailoot reserva um montante estimado antes de um pedido. Após o resultado, liquida o custo final com base na utilização medida. No streaming, a liquidação usa o registo final de utilização. [Como funcionam a reserva e a liquidação →](https://ailoot.ai/docs/pt-pt/billing/reserve/)

#### Detalhes da tarifa de referência

As tabelas de referência do modelo não alteram a seleção do método, as cotações ou os custos. Os custos ativos usam as tarifas do método Ailoot selecionado.

Tabelas de referência do modelo

#### Preços por configuração

Associe cada custo às condições apresentadas. Use uma única tarifa para cada conjunto de configurações alternativas.

| Configuração | Tabela de tarifas | Tokens de contexto, mais de | Tokens de contexto, até ao limite inclusive | Custo |
| --- | --- | --- | --- | --- |
| ConfiguraçãoOpenAI Chat · Tarifas de base por token | Tabela de tarifasTarifa base | Tokens de contexto, mais de— | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoOpenAI Chat · Escalão 1 por comprimento do pedido | Tabela de tarifas— | Tokens de contexto, mais de0 | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoAnthropic Messages · Tarifas de base por token | Tabela de tarifasTarifa base | Tokens de contexto, mais de— | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoAnthropic Messages · Escalão 1 por comprimento do pedido | Tabela de tarifas— | Tokens de contexto, mais de0 | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |

### Exemplos de pedidos

#### Ailoot · OpenAI Responses

Exemplo de textoPython SDKNode.js SDKStreaming em Python

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "glm-5", "input": ""}')
f=Path(os.environ["AILOOT_TEXT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 source material")
text=f.read_text(encoding="utf-8")
if not text.strip():raise SystemExit("Source material must contain text")
p["input"]="Summarize this material and quote supporting source passages.\n\n"+text
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/responses \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(json.loads(Path("result.json").read_text(encoding="utf-8")))
PY_RESULT
```

```python
from openai import OpenAI
import os

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client = OpenAI(base_url="https://api.ailoot.ai/v1", api_key=os.environ["AILOOT_API_KEY"], max_retries=0)
resp = client.responses.create(model="glm-5", input="Explain the difference between an observation and a hypothesis in three sentences.")
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(resp.to_dict(mode="json"))
```

```js
import OpenAI from "openai";

if (!process.env.AILOOT_API_KEY?.trim()) throw new Error("Set AILOOT_API_KEY before making a request");
const client = new OpenAI({ baseURL: "https://api.ailoot.ai/v1", apiKey: process.env.AILOOT_API_KEY, maxRetries: 0 });
const resp = await client.responses.create({ model: "glm-5", input: "Explain the difference between an observation and a hypothesis in three sentences." });
import { writeFileSync } from "node:fs";

function saveResult(data, stem = "result") {
  writeFileSync(stem + ".json", JSON.stringify(data, null, 2));
  console.log(JSON.stringify(data, null, 2));
  const saveBlob = (encoded, suffix, label) => {
    const raw = Buffer.from(encoded, "base64");
    const ext = raw.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10])) ? "png" : raw[0]===255 && raw[1]===216 ? "jpg" : raw.subarray(0,4).toString()==="RIFF" && raw.subarray(8,12).toString()==="WEBP" ? "webp" : suffix;
    const file = `${stem}-${label}.${ext}`;
    writeFileSync(file, raw); console.log("Saved", file);
  };
  for (const [i, block] of (data.content || []).entries()) console.log("Content", i, JSON.stringify(block));
  for (const choice of data.choices || []) console.log("Choice", choice.index, JSON.stringify(choice.message || choice.delta || {}));
  for (const [i, item] of (data.output || []).entries()) {
    console.log("Output", i, JSON.stringify(item));
    if (item.type === "image_generation_call" && item.result) saveBlob(item.result, item.output_format || "bin", `output-${i}`);
  }
  for (const [ci, candidate] of (data.candidates || []).entries()) {
    for (const [pi, part] of (candidate.content?.parts || []).entries()) {
      console.log("Candidate/part", ci, pi, JSON.stringify(part));
      const blob = part.inlineData || part.inline_data;
      if (blob?.data) {
        const mime = blob.mimeType || blob.mime_type;
        const suffix = ({"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"})[mime] || "bin";
        saveBlob(blob.data, suffix, `candidate-${ci}-part-${pi}`);
      }
    }
  }
}

saveResult(resp);
```

```python
from openai import OpenAI
import os
from pathlib import Path
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
with client.responses.stream(model="glm-5", input="Explain the difference between an observation and a hypothesis in three sentences.") as stream:
    with Path("stream-events.jsonl").open("w",encoding="utf-8") as log:
        for event in stream:
            payload=event.to_dict(mode="json")
            log.write(json.dumps(payload,ensure_ascii=False)+"\n"); log.flush()
            print(json.dumps(payload,ensure_ascii=False))
    final=stream.get_final_response()
    save_result(final.to_dict(mode="json"),"stream-result")
```

### Receber e guardar os resultados

#### Ailoot · OpenAI Responses

json ou SSE

##### Guardar todos os resultados concluídos

Guarde cada resposta, ficheiro e parte de conteúdo devolvidos na íntegra.

Conserve cada elemento de saída e parte de conteúdo, o call\_id real da função, o raciocínio cifrado e os dados de utilização. Em streaming, mantenha a identidade completa dos eventos e elementos.

##### Se for necessário verificar a resposta original

Conserve os ID e cabeçalhos de pedido/resposta. Não é fornecido um URL genérico para obter uma tarefa textual.

Campos da resposta

| Campo | Tipo |
| --- | --- |
| Campo`id` | Tipostring |
| Campo`status` | Tipostring |
| Campo`output[]` | Tipomessage\|reasoning\|function\_call\|other item |
| Campo`output[].content[]` | Tipocontent part |
| Campo`usage` | Tipoobject |

Erros e passos seguintes

| Resposta | Condição | Passo seguinte |
| --- | --- | --- |
| Resposta400 · `invalid_request_error` | CondiçãoCampos obrigatórios, representação do material ou valor do parâmetro inválidos | Passo seguinteCorrija os campos indicados antes de um novo pedido de criação. |

### Aliases

#### Aliases do modelo

<strong>Ailoot</strong> [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=responses), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=responses), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=responses), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=responses), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=responses), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=responses)
**Ailoot Ultra** [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3), [`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest)

#### Aliases dos caminhos dos métodos

`/chat/completions`

#### IDs de chamada relacionados

[`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=responses), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=responses), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=responses), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=responses), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=responses), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=responses), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3)

**Ailoot · OpenAI Chat** `POST /v1/chat/completions` `glm-5`

[`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=chat)

Z.ai /`glm-5`

ID do modelo

- `glm-5.3`
- `glm`
- `glm-5`
- `glm-5.1`
- `glm-5.2`
- `glm-latest`

### Introdução

Z.ai GLM 5.3 é um modelo de raciocínio textual para engenharia de software complexa, trabalho em terminal e agentes de longa duração. Suporta um contexto de 1M tokens documentado pelo fabricante, até 128K tokens de saída, chamada de funções e esforço de raciocínio low/high/max, mantendo o raciocínio sempre ativado.

Entradas aceites

Texto

Resultados

Texto

### Disponível no Ailoot · entradas e métodos

**Ailoot · OpenAI Chat** `POST /v1/chat/completions`

Entrada

`text`

Saída

`text`

Contexto

1 000 000 tokens

Saída máxima

131 072 tokens

Formato de saída

json ou SSE

| Campo | Tipo | Requisito | Valores e limites | Predefinição |
| --- | --- | --- | --- | --- |
| Campo`model` | Tipo`string` | RequisitoObrigatório | Valores e limites glm-5 | Predefinição— |
| Campo`messages` | Tipo`message[]` | RequisitoObrigatório | Valores e limites Número mínimo de elementos: 1 | Predefinição— |
| Campo`messages[].role` | Tipo`string` | RequisitoObrigatório | Valores e limites Exemplos: system, user, assistant, tool, function Condições: Estes papéis são representados explicitamente pelos tipos de compatibilidade do código-fonte; o conjunto exato de papéis continua específico do modelo. Depende do modelo | Predefinição— |
| Campo`messages[].content` | Tipo`string\|content_part[]\|null` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`messages[].tool_calls` | Tipo`tool_call[]` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`messages[].tool_call_id` | Tipo`string` | RequisitoOpcional | Valores e limites Aplica-se quando: role=tool; use o ID realmente devolvido | Predefinição— |
| Campo`messages[].name` | Tipo`string` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`messages[].reasoning_content` | Tipo`string` | RequisitoOpcional | Valores e limites Aplica-se quando: Reintroduza o raciocínio realmente devolvido quando este modelo o utiliza | Predefinição— |
| Campo`messages[].reasoning_details` | Tipo`object\|array` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`max_tokens` | Tipo`integer` | RequisitoOpcional | Valores e limites Mínimo: 1 Depende do modelo | Predefinição— |
| Campo`max_completion_tokens` | Tipo`integer` | RequisitoOpcional | Valores e limites Mínimo: 1 Depende do modelo | Predefinição— |
| Campo`stream` | Tipo`boolean` | RequisitoOpcional | Valores e limites | Predefiniçãofalse |
| Campo`stream_options.include_usage` | Tipo`boolean` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`temperature` | Tipo`number` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`top_p` | Tipo`number` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`stop` | Tipo`string\|string[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tools` | Tipo`function_tool[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tools[].type` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tools[].function.name` | Tipo`string` | RequisitoObrigatório | Valores e limites Aplica-se quando: Função fornecida como ferramenta | Predefinição— |
| Campo`tools[].function.description` | Tipo`string` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`tools[].function.parameters` | Tipo`JSON_schema` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`tool_choice` | Tipo`string\|object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`parallel_tool_calls` | Tipo`boolean` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`response_format` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`reasoning_effort` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`reasoning` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`service_tier` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`instructions` | Tipo`string` | RequisitoOpcional | Valores e limites Campo de compatibilidade | Predefinição— |
| Campo`functions` | Tipo`function[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`function_call` | Tipo`string\|object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`prompt_cache_options` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |

Combinações de materiais de entrada

**Texto** · Texto UTF8

`messages[].content`

Parâmetros e ciclo de vida do método

| Parâmetro | Contrato |
| --- | --- |
| Parâmetro`material_types` | Contratotext |
| Parâmetro`required` | Contratomodel, messages |
| Parâmetro`optional_controls` | Contratonull |
| Parâmetro`content_type` | Contratoapplication/json |
| Parâmetro`text_file_material` | ContratoConteúdo UTF-8 real inserido como texto; ID de ficheiros/URLs precisam de suporte separado e exato |

Ciclo de vida: `exact retained published method`

As estruturas dos métodos e os ID são exatos; a capacidade do fornecedor é distinta da admissão dos pedidos.

### Tarifários

#### Tarifas dos métodos Ailoot

Entrada

0,0014 US$ */ 1K*

Saída

0,0044 US$ */ 1K*

Leitura da cache

≈0,00026 US$ */ 1K*

O Ailoot reserva um montante estimado antes de um pedido. Após o resultado, liquida o custo final com base na utilização medida. No streaming, a liquidação usa o registo final de utilização. [Como funcionam a reserva e a liquidação →](https://ailoot.ai/docs/pt-pt/billing/reserve/)

#### Detalhes da tarifa de referência

As tabelas de referência do modelo não alteram a seleção do método, as cotações ou os custos. Os custos ativos usam as tarifas do método Ailoot selecionado.

Tabelas de referência do modelo

#### Preços por configuração

Associe cada custo às condições apresentadas. Use uma única tarifa para cada conjunto de configurações alternativas.

| Configuração | Tabela de tarifas | Tokens de contexto, mais de | Tokens de contexto, até ao limite inclusive | Custo |
| --- | --- | --- | --- | --- |
| ConfiguraçãoOpenAI Chat · Tarifas de base por token | Tabela de tarifasTarifa base | Tokens de contexto, mais de— | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoOpenAI Chat · Escalão 1 por comprimento do pedido | Tabela de tarifas— | Tokens de contexto, mais de0 | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoAnthropic Messages · Tarifas de base por token | Tabela de tarifasTarifa base | Tokens de contexto, mais de— | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoAnthropic Messages · Escalão 1 por comprimento do pedido | Tabela de tarifas— | Tokens de contexto, mais de0 | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |

### Exemplos de pedidos

#### Ailoot · OpenAI Chat

Exemplo de textoPython SDKNode.js SDKStreaming em Python

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "glm-5", "messages": []}')
f=Path(os.environ["AILOOT_TEXT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 source material")
text=f.read_text(encoding="utf-8")
if not text.strip():raise SystemExit("Source material must contain text")
p["messages"]=[{"role":"user","content":"Summarize this material and quote supporting source passages.\n\n"+text}]
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/chat/completions \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
print(json.dumps(json.loads(Path("result.json").read_text()),ensure_ascii=False,indent=2))
PY_RESULT
```

```python
from openai import OpenAI
import os

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client = OpenAI(base_url="https://api.ailoot.ai/v1", api_key=os.environ["AILOOT_API_KEY"], max_retries=0)
resp = client.chat.completions.create(
    model="glm-5",
    messages=[{"role": "user", "content": "Explain the difference between an observation and a hypothesis in three sentences."}],
)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(resp.to_dict(mode="json"))
```

```js
import OpenAI from "openai";

if (!process.env.AILOOT_API_KEY?.trim()) throw new Error("Set AILOOT_API_KEY before making a request");
const client = new OpenAI({ baseURL: "https://api.ailoot.ai/v1", apiKey: process.env.AILOOT_API_KEY, maxRetries: 0 });
const resp = await client.chat.completions.create({
  model: "glm-5",
  messages: [{ role: "user", content: "Explain the difference between an observation and a hypothesis in three sentences." }],
});
import { writeFileSync } from "node:fs";

function saveResult(data, stem = "result") {
  writeFileSync(stem + ".json", JSON.stringify(data, null, 2));
  console.log(JSON.stringify(data, null, 2));
  const saveBlob = (encoded, suffix, label) => {
    const raw = Buffer.from(encoded, "base64");
    const ext = raw.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10])) ? "png" : raw[0]===255 && raw[1]===216 ? "jpg" : raw.subarray(0,4).toString()==="RIFF" && raw.subarray(8,12).toString()==="WEBP" ? "webp" : suffix;
    const file = `${stem}-${label}.${ext}`;
    writeFileSync(file, raw); console.log("Saved", file);
  };
  for (const [i, block] of (data.content || []).entries()) console.log("Content", i, JSON.stringify(block));
  for (const choice of data.choices || []) console.log("Choice", choice.index, JSON.stringify(choice.message || choice.delta || {}));
  for (const [i, item] of (data.output || []).entries()) {
    console.log("Output", i, JSON.stringify(item));
    if (item.type === "image_generation_call" && item.result) saveBlob(item.result, item.output_format || "bin", `output-${i}`);
  }
  for (const [ci, candidate] of (data.candidates || []).entries()) {
    for (const [pi, part] of (candidate.content?.parts || []).entries()) {
      console.log("Candidate/part", ci, pi, JSON.stringify(part));
      const blob = part.inlineData || part.inline_data;
      if (blob?.data) {
        const mime = blob.mimeType || blob.mime_type;
        const suffix = ({"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"})[mime] || "bin";
        saveBlob(blob.data, suffix, `candidate-${ci}-part-${pi}`);
      }
    }
  }
}

saveResult(resp);
```

```python
from openai import OpenAI
import os
from pathlib import Path

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

with client.chat.completions.stream(model='glm-5',messages=[{"role":"user","content":"Explain observations and hypotheses in three sentences."}]) as stream:
    with Path("stream-events.jsonl").open("w",encoding="utf-8") as log:
        for event in stream:
            payload=event.to_dict(mode="json")
            log.write(json.dumps(payload,ensure_ascii=False)+"\n"); log.flush()
            print(json.dumps(payload,ensure_ascii=False))
    final=stream.get_final_completion()
    save_result(final.to_dict(mode="json"),"stream-result")
```

### Receber e guardar os resultados

#### Ailoot · OpenAI Chat

json ou SSE

##### Guardar todos os resultados concluídos

Guarde cada resposta, ficheiro e parte de conteúdo devolvidos na íntegra.

Conserve cada opção com o conteúdo, as chamadas de ferramentas e o raciocínio. Em SSE, junte os deltas por índice de opção e ferramenta e mantenha o motivo final de conclusão e os dados de utilização.

##### Se for necessário verificar a resposta original

Conserve os ID e cabeçalhos de pedido/resposta. Não é fornecido um URL genérico para obter uma tarefa textual.

Campos da resposta

| Campo | Tipo |
| --- | --- |
| Campo`choices[].index` | Tipointeger |
| Campo`choices[].message.content` | Tipostring\|null |
| Campo`choices[].message.tool_calls` | Tipotool\_call\[\] |
| Campo`choices[].message.reasoning_content` | Tipostring |
| Campo`choices[].message.reasoning_details` | Tipoobject\|array |
| Campo`choices[].finish_reason` | Tipostring\|null |
| Campo`usage` | Tipoobject |

Erros e passos seguintes

| Resposta | Condição | Passo seguinte |
| --- | --- | --- |
| Resposta400 · `invalid_request_error` | CondiçãoCampos obrigatórios, representação do material ou valor do parâmetro inválidos | Passo seguinteCorrija os campos indicados antes de um novo pedido de criação. |

### Aliases

#### Aliases do modelo

<strong>Ailoot</strong> [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=chat), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=chat), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=chat), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=chat), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=chat), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=chat)
**Ailoot Ultra** [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3&fmt=chat), [`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=chat), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=chat)

#### Aliases dos caminhos dos métodos

`/chat/completions`

#### IDs de chamada relacionados

[`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=chat), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=chat), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=chat), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=chat), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=chat), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=chat), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=chat), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=chat), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3&fmt=chat)

**Ailoot · Anthropic Messages** `POST /v1/messages` `glm-5.1`

[`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=messages)

Z.ai /`glm-5.1`

ID do modelo

- `glm-5.3`
- `glm`
- `glm-5`
- `glm-5.1`
- `glm-5.2`
- `glm-latest`

### Introdução

Z.ai GLM 5.3 é um modelo de raciocínio textual para engenharia de software complexa, trabalho em terminal e agentes de longa duração. Suporta um contexto de 1M tokens documentado pelo fabricante, até 128K tokens de saída, chamada de funções e esforço de raciocínio low/high/max, mantendo o raciocínio sempre ativado.

Entradas aceites

Texto

Resultados

Texto

### Disponível no Ailoot · entradas e métodos

**Ailoot · Anthropic Messages** `POST /v1/messages`

Entrada

`text`

Saída

`text`

Contexto

1 000 000 tokens

Saída máxima

131 072 tokens

Formato de saída

json ou SSE

| Campo | Tipo | Requisito | Valores e limites | Predefinição |
| --- | --- | --- | --- | --- |
| Campo`model` | Tipo`string` | RequisitoObrigatório | Valores e limites glm-5.1 | Predefinição— |
| Campo`messages` | Tipo`message[]` | RequisitoObrigatório | Valores e limites Número mínimo de elementos: 1 | Predefinição— |
| Campo`messages[].role` | Tipo`string` | RequisitoObrigatório | Valores e limites user, assistant | Predefinição— |
| Campo`messages[].content` | Tipo`string\|content_block[]` | RequisitoObrigatório | Valores e limites | Predefinição— |
| Campo`system` | Tipo`string\|content_block[]` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`max_tokens` | Tipo`integer` | RequisitoObrigatório | Valores e limites Mínimo: 1 O limite aplica-se a: Limite exato do modelo ou da ficha selecionados | Predefinição— |
| Campo`stream` | Tipo`boolean` | RequisitoOpcional | Valores e limites | Predefiniçãofalse |
| Campo`temperature` | Tipo`number` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`top_p` | Tipo`number` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`stop_sequences` | Tipo`string[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tools` | Tipo`tool[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tools[].name` | Tipo`string` | RequisitoOpcional | Valores e limites Aplica-se quando: Ferramenta fornecida | Predefinição— |
| Campo`tools[].description` | Tipo`string` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`tools[].input_schema` | Tipo`JSON_schema` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`tool_choice` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`thinking.type` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`thinking.budget_tokens` | Tipo`integer` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`output_config.effort` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`metadata` | Tipo`object` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`cache_control` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |

Combinações de materiais de entrada

**Texto** · Texto UTF8

`messages[].content ou bloco type=text`

Parâmetros e ciclo de vida do método

| Parâmetro | Contrato |
| --- | --- |
| Parâmetro`material_types` | Contratotext |
| Parâmetro`required` | Contratomodel, messages, max\_tokens |
| Parâmetro`optional_controls` | Contratonull |
| Parâmetro`content_type` | Contratoapplication/json |
| Parâmetro`text_file_material` | ContratoConteúdo UTF-8 real inserido como texto; ID de ficheiros/URLs precisam de suporte separado e exato |

Ciclo de vida: `exact retained published method`

As estruturas dos métodos e os ID são exatos; a capacidade do fornecedor é distinta da admissão dos pedidos.

### Tarifários

#### Tarifas dos métodos Ailoot

Entrada

0,0014 US$ */ 1K*

Saída

0,0044 US$ */ 1K*

Leitura da cache

≈0,00026 US$ */ 1K*

O Ailoot reserva um montante estimado antes de um pedido. Após o resultado, liquida o custo final com base na utilização medida. No streaming, a liquidação usa o registo final de utilização. [Como funcionam a reserva e a liquidação →](https://ailoot.ai/docs/pt-pt/billing/reserve/)

#### Detalhes da tarifa de referência

As tabelas de referência do modelo não alteram a seleção do método, as cotações ou os custos. Os custos ativos usam as tarifas do método Ailoot selecionado.

Tabelas de referência do modelo

#### Preços por configuração

Associe cada custo às condições apresentadas. Use uma única tarifa para cada conjunto de configurações alternativas.

| Configuração | Tabela de tarifas | Tokens de contexto, mais de | Tokens de contexto, até ao limite inclusive | Custo |
| --- | --- | --- | --- | --- |
| ConfiguraçãoOpenAI Chat · Tarifas de base por token | Tabela de tarifasTarifa base | Tokens de contexto, mais de— | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoOpenAI Chat · Escalão 1 por comprimento do pedido | Tabela de tarifas— | Tokens de contexto, mais de0 | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoAnthropic Messages · Tarifas de base por token | Tabela de tarifasTarifa base | Tokens de contexto, mais de— | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoAnthropic Messages · Escalão 1 por comprimento do pedido | Tabela de tarifas— | Tokens de contexto, mais de0 | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |

### Exemplos de pedidos

#### Ailoot · Anthropic Messages

Exemplo de textoPython SDKNode.js SDKStreaming em Python

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "glm-5.1", "max_tokens": 1024, "messages": []}')
f=Path(os.environ["AILOOT_TEXT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 source material")
text=f.read_text(encoding="utf-8")
if not text.strip():raise SystemExit("Source material must contain text")
p["messages"]=[{"role":"user","content":"Summarize this material and quote supporting source passages.\n\n"+text}]
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/messages \
  -H "x-api-key: $AILOOT_API_KEY" -H 'anthropic-version: 2023-06-01' -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
print(json.dumps(json.loads(Path("result.json").read_text()),ensure_ascii=False,indent=2))
PY_RESULT
```

```python
import anthropic
import os

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client = anthropic.Anthropic(base_url="https://api.ailoot.ai", api_key=os.environ["AILOOT_API_KEY"], max_retries=0)
msg = client.messages.create(
    model="glm-5.1",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Explain the difference between an observation and a hypothesis in three sentences."}],
)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(msg.to_dict(mode="json"))
```

```js
import Anthropic from "@anthropic-ai/sdk";

if (!process.env.AILOOT_API_KEY?.trim()) throw new Error("Set AILOOT_API_KEY before making a request");
const client = new Anthropic({ baseURL: "https://api.ailoot.ai", apiKey: process.env.AILOOT_API_KEY, maxRetries: 0 });
const msg = await client.messages.create({
  model: "glm-5.1",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Explain the difference between an observation and a hypothesis in three sentences." }],
});
import { writeFileSync } from "node:fs";

function saveResult(data, stem = "result") {
  writeFileSync(stem + ".json", JSON.stringify(data, null, 2));
  console.log(JSON.stringify(data, null, 2));
  const saveBlob = (encoded, suffix, label) => {
    const raw = Buffer.from(encoded, "base64");
    const ext = raw.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10])) ? "png" : raw[0]===255 && raw[1]===216 ? "jpg" : raw.subarray(0,4).toString()==="RIFF" && raw.subarray(8,12).toString()==="WEBP" ? "webp" : suffix;
    const file = `${stem}-${label}.${ext}`;
    writeFileSync(file, raw); console.log("Saved", file);
  };
  for (const [i, block] of (data.content || []).entries()) console.log("Content", i, JSON.stringify(block));
  for (const choice of data.choices || []) console.log("Choice", choice.index, JSON.stringify(choice.message || choice.delta || {}));
  for (const [i, item] of (data.output || []).entries()) {
    console.log("Output", i, JSON.stringify(item));
    if (item.type === "image_generation_call" && item.result) saveBlob(item.result, item.output_format || "bin", `output-${i}`);
  }
  for (const [ci, candidate] of (data.candidates || []).entries()) {
    for (const [pi, part] of (candidate.content?.parts || []).entries()) {
      console.log("Candidate/part", ci, pi, JSON.stringify(part));
      const blob = part.inlineData || part.inline_data;
      if (blob?.data) {
        const mime = blob.mimeType || blob.mime_type;
        const suffix = ({"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"})[mime] || "bin";
        saveBlob(blob.data, suffix, `candidate-${ci}-part-${pi}`);
      }
    }
  }
}

saveResult(msg);
```

```python
import anthropic,os
from pathlib import Path

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=anthropic.Anthropic(base_url="https://api.ailoot.ai",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

with client.messages.stream(model='glm-5.1',max_tokens=1024,messages=[{"role":"user","content":"Explain observations and hypotheses in three sentences."}]) as stream:
    with Path("stream-events.jsonl").open("w",encoding="utf-8") as log:
        for event in stream:
            payload=event.to_dict(mode="json")
            log.write(json.dumps(payload,ensure_ascii=False)+"\n"); log.flush()
            print(json.dumps(payload,ensure_ascii=False))
    final=stream.get_final_message()
    save_result(final.to_dict(mode="json"),"stream-result")
```

### Receber e guardar os resultados

#### Ailoot · Anthropic Messages

json ou SSE

##### Guardar todos os resultados concluídos

Guarde cada resposta, ficheiro e parte de conteúdo devolvidos na íntegra.

Conserve todos os blocos de conteúdo, as assinaturas de raciocínio e os ID reais de utilização de ferramentas. Junte todos os deltas de blocos SSE; o primeiro bloco de texto não é a saída completa.

##### Se for necessário verificar a resposta original

Conserve os ID e cabeçalhos de pedido/resposta. Não é fornecido um URL genérico para obter uma tarefa textual.

Campos da resposta

| Campo | Tipo |
| --- | --- |
| Campo`id` | Tipostring |
| Campo`model` | Tipostring |
| Campo`content[]` | Tipotext\|thinking\|tool\_use\|other content block |
| Campo`stop_reason` | Tipostring\|null |
| Campo`usage` | Tipoobject |

Erros e passos seguintes

| Resposta | Condição | Passo seguinte |
| --- | --- | --- |
| Resposta400 · `invalid_request_error` | CondiçãoCampos obrigatórios, representação do material ou valor do parâmetro inválidos | Passo seguinteCorrija os campos indicados antes de um novo pedido de criação. |

### Aliases

#### Aliases do modelo

<strong>Ailoot</strong> [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=messages), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=messages), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=messages), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=messages), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=messages), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=messages)
**Ailoot Ultra** [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3&fmt=messages), [`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=messages), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=messages)

#### Aliases dos caminhos dos métodos

`/chat/completions`

#### IDs de chamada relacionados

[`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=messages), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=messages), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=messages), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=messages), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=messages), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=messages), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=messages), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=messages), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3&fmt=messages)

**Ailoot · OpenAI Responses** `POST /v1/responses` `glm-5.1`

[`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=responses)

Z.ai /`glm-5.1`

ID do modelo

- `glm-5.3`
- `glm`
- `glm-5`
- `glm-5.1`
- `glm-5.2`
- `glm-latest`

### Introdução

Z.ai GLM 5.3 é um modelo de raciocínio textual para engenharia de software complexa, trabalho em terminal e agentes de longa duração. Suporta um contexto de 1M tokens documentado pelo fabricante, até 128K tokens de saída, chamada de funções e esforço de raciocínio low/high/max, mantendo o raciocínio sempre ativado.

Entradas aceites

Texto

Resultados

Texto

### Disponível no Ailoot · entradas e métodos

**Ailoot · OpenAI Responses** `POST /v1/responses`

Entrada

`text`

Saída

`text`

Contexto

1 000 000 tokens

Saída máxima

131 072 tokens

Formato de saída

json ou SSE

| Campo | Tipo | Requisito | Valores e limites | Predefinição |
| --- | --- | --- | --- | --- |
| Campo`model` | Tipo`string` | RequisitoObrigatório | Valores e limites glm-5.1 | Predefinição— |
| Campo`input` | Tipo`string\|input_item[]` | RequisitoObrigatório | Valores e limites | Predefinição— |
| Campo`instructions` | Tipo`string` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`input[].type` | Tipo`string` | RequisitoOpcional | Valores e limites message, reasoning, function\_call, function\_call\_output | Predefinição— |
| Campo`input[].content` | Tipo`string\|content_part[]` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`input[].call_id` | Tipo`string` | RequisitoOpcional | Valores e limites Aplica-se quando: function\_call\_output; conserve o call\_id realmente devolvido | Predefinição— |
| Campo`input[].output` | Tipo`string\|content_part[]` | RequisitoOpcional | Valores e limites Aplica-se quando: function\_call\_output | Predefinição— |
| Campo`max_output_tokens` | Tipo`integer` | RequisitoOpcional | Valores e limites Mínimo: 1 Depende do modelo | Predefinição— |
| Campo`stream` | Tipo`boolean` | RequisitoOpcional | Valores e limites | Predefiniçãofalse |
| Campo`temperature` | Tipo`number` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`top_p` | Tipo`number` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tools` | Tipo`tool[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tool_choice` | Tipo`string\|object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`parallel_tool_calls` | Tipo`boolean` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`reasoning.effort` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`reasoning.summary` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`text.format` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`text.verbosity` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`include` | Tipo`string[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`store` | Tipo`boolean` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`previous_response_id` | Tipo`string` | RequisitoOpcional | Valores e limites Requisito do ID: Só um ID de resposta real de uma continuação suportada Depende do modelo | Predefinição— |
| Campo`service_tier` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`prompt_cache_key` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`prompt_cache_options` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |

Combinações de materiais de entrada

**Texto** · Texto UTF8

`Texto de entrada ou parte input_text`

Parâmetros e ciclo de vida do método

| Parâmetro | Contrato |
| --- | --- |
| Parâmetro`material_types` | Contratotext |
| Parâmetro`required` | Contratomodel, input |
| Parâmetro`optional_controls` | Contratonull |
| Parâmetro`content_type` | Contratoapplication/json |
| Parâmetro`text_file_material` | ContratoConteúdo UTF-8 real inserido como texto; ID de ficheiros/URLs precisam de suporte separado e exato |

Ciclo de vida: `exact retained published method`

As estruturas dos métodos e os ID são exatos; a capacidade do fornecedor é distinta da admissão dos pedidos.

### Tarifários

#### Tarifas dos métodos Ailoot

Entrada

0,0014 US$ */ 1K*

Saída

0,0044 US$ */ 1K*

Leitura da cache

≈0,00026 US$ */ 1K*

O Ailoot reserva um montante estimado antes de um pedido. Após o resultado, liquida o custo final com base na utilização medida. No streaming, a liquidação usa o registo final de utilização. [Como funcionam a reserva e a liquidação →](https://ailoot.ai/docs/pt-pt/billing/reserve/)

#### Detalhes da tarifa de referência

As tabelas de referência do modelo não alteram a seleção do método, as cotações ou os custos. Os custos ativos usam as tarifas do método Ailoot selecionado.

Tabelas de referência do modelo

#### Preços por configuração

Associe cada custo às condições apresentadas. Use uma única tarifa para cada conjunto de configurações alternativas.

| Configuração | Tabela de tarifas | Tokens de contexto, mais de | Tokens de contexto, até ao limite inclusive | Custo |
| --- | --- | --- | --- | --- |
| ConfiguraçãoOpenAI Chat · Tarifas de base por token | Tabela de tarifasTarifa base | Tokens de contexto, mais de— | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoOpenAI Chat · Escalão 1 por comprimento do pedido | Tabela de tarifas— | Tokens de contexto, mais de0 | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoAnthropic Messages · Tarifas de base por token | Tabela de tarifasTarifa base | Tokens de contexto, mais de— | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoAnthropic Messages · Escalão 1 por comprimento do pedido | Tabela de tarifas— | Tokens de contexto, mais de0 | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |

### Exemplos de pedidos

#### Ailoot · OpenAI Responses

Exemplo de textoPython SDKNode.js SDKStreaming em Python

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "glm-5.1", "input": ""}')
f=Path(os.environ["AILOOT_TEXT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 source material")
text=f.read_text(encoding="utf-8")
if not text.strip():raise SystemExit("Source material must contain text")
p["input"]="Summarize this material and quote supporting source passages.\n\n"+text
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/responses \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(json.loads(Path("result.json").read_text(encoding="utf-8")))
PY_RESULT
```

```python
from openai import OpenAI
import os

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client = OpenAI(base_url="https://api.ailoot.ai/v1", api_key=os.environ["AILOOT_API_KEY"], max_retries=0)
resp = client.responses.create(model="glm-5.1", input="Explain the difference between an observation and a hypothesis in three sentences.")
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(resp.to_dict(mode="json"))
```

```js
import OpenAI from "openai";

if (!process.env.AILOOT_API_KEY?.trim()) throw new Error("Set AILOOT_API_KEY before making a request");
const client = new OpenAI({ baseURL: "https://api.ailoot.ai/v1", apiKey: process.env.AILOOT_API_KEY, maxRetries: 0 });
const resp = await client.responses.create({ model: "glm-5.1", input: "Explain the difference between an observation and a hypothesis in three sentences." });
import { writeFileSync } from "node:fs";

function saveResult(data, stem = "result") {
  writeFileSync(stem + ".json", JSON.stringify(data, null, 2));
  console.log(JSON.stringify(data, null, 2));
  const saveBlob = (encoded, suffix, label) => {
    const raw = Buffer.from(encoded, "base64");
    const ext = raw.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10])) ? "png" : raw[0]===255 && raw[1]===216 ? "jpg" : raw.subarray(0,4).toString()==="RIFF" && raw.subarray(8,12).toString()==="WEBP" ? "webp" : suffix;
    const file = `${stem}-${label}.${ext}`;
    writeFileSync(file, raw); console.log("Saved", file);
  };
  for (const [i, block] of (data.content || []).entries()) console.log("Content", i, JSON.stringify(block));
  for (const choice of data.choices || []) console.log("Choice", choice.index, JSON.stringify(choice.message || choice.delta || {}));
  for (const [i, item] of (data.output || []).entries()) {
    console.log("Output", i, JSON.stringify(item));
    if (item.type === "image_generation_call" && item.result) saveBlob(item.result, item.output_format || "bin", `output-${i}`);
  }
  for (const [ci, candidate] of (data.candidates || []).entries()) {
    for (const [pi, part] of (candidate.content?.parts || []).entries()) {
      console.log("Candidate/part", ci, pi, JSON.stringify(part));
      const blob = part.inlineData || part.inline_data;
      if (blob?.data) {
        const mime = blob.mimeType || blob.mime_type;
        const suffix = ({"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"})[mime] || "bin";
        saveBlob(blob.data, suffix, `candidate-${ci}-part-${pi}`);
      }
    }
  }
}

saveResult(resp);
```

```python
from openai import OpenAI
import os
from pathlib import Path
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
with client.responses.stream(model="glm-5.1", input="Explain the difference between an observation and a hypothesis in three sentences.") as stream:
    with Path("stream-events.jsonl").open("w",encoding="utf-8") as log:
        for event in stream:
            payload=event.to_dict(mode="json")
            log.write(json.dumps(payload,ensure_ascii=False)+"\n"); log.flush()
            print(json.dumps(payload,ensure_ascii=False))
    final=stream.get_final_response()
    save_result(final.to_dict(mode="json"),"stream-result")
```

### Receber e guardar os resultados

#### Ailoot · OpenAI Responses

json ou SSE

##### Guardar todos os resultados concluídos

Guarde cada resposta, ficheiro e parte de conteúdo devolvidos na íntegra.

Conserve cada elemento de saída e parte de conteúdo, o call\_id real da função, o raciocínio cifrado e os dados de utilização. Em streaming, mantenha a identidade completa dos eventos e elementos.

##### Se for necessário verificar a resposta original

Conserve os ID e cabeçalhos de pedido/resposta. Não é fornecido um URL genérico para obter uma tarefa textual.

Campos da resposta

| Campo | Tipo |
| --- | --- |
| Campo`id` | Tipostring |
| Campo`status` | Tipostring |
| Campo`output[]` | Tipomessage\|reasoning\|function\_call\|other item |
| Campo`output[].content[]` | Tipocontent part |
| Campo`usage` | Tipoobject |

Erros e passos seguintes

| Resposta | Condição | Passo seguinte |
| --- | --- | --- |
| Resposta400 · `invalid_request_error` | CondiçãoCampos obrigatórios, representação do material ou valor do parâmetro inválidos | Passo seguinteCorrija os campos indicados antes de um novo pedido de criação. |

### Aliases

#### Aliases do modelo

<strong>Ailoot</strong> [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=responses), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=responses), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=responses), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=responses), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=responses), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=responses)
**Ailoot Ultra** [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3), [`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest)

#### Aliases dos caminhos dos métodos

`/chat/completions`

#### IDs de chamada relacionados

[`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=responses), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=responses), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=responses), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=responses), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=responses), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=responses), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3)

**Ailoot · OpenAI Chat** `POST /v1/chat/completions` `glm-5.1`

[`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=chat)

Z.ai /`glm-5.1`

ID do modelo

- `glm-5.3`
- `glm`
- `glm-5`
- `glm-5.1`
- `glm-5.2`
- `glm-latest`

### Introdução

Z.ai GLM 5.3 é um modelo de raciocínio textual para engenharia de software complexa, trabalho em terminal e agentes de longa duração. Suporta um contexto de 1M tokens documentado pelo fabricante, até 128K tokens de saída, chamada de funções e esforço de raciocínio low/high/max, mantendo o raciocínio sempre ativado.

Entradas aceites

Texto

Resultados

Texto

### Disponível no Ailoot · entradas e métodos

**Ailoot · OpenAI Chat** `POST /v1/chat/completions`

Entrada

`text`

Saída

`text`

Contexto

1 000 000 tokens

Saída máxima

131 072 tokens

Formato de saída

json ou SSE

| Campo | Tipo | Requisito | Valores e limites | Predefinição |
| --- | --- | --- | --- | --- |
| Campo`model` | Tipo`string` | RequisitoObrigatório | Valores e limites glm-5.1 | Predefinição— |
| Campo`messages` | Tipo`message[]` | RequisitoObrigatório | Valores e limites Número mínimo de elementos: 1 | Predefinição— |
| Campo`messages[].role` | Tipo`string` | RequisitoObrigatório | Valores e limites Exemplos: system, user, assistant, tool, function Condições: Estes papéis são representados explicitamente pelos tipos de compatibilidade do código-fonte; o conjunto exato de papéis continua específico do modelo. Depende do modelo | Predefinição— |
| Campo`messages[].content` | Tipo`string\|content_part[]\|null` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`messages[].tool_calls` | Tipo`tool_call[]` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`messages[].tool_call_id` | Tipo`string` | RequisitoOpcional | Valores e limites Aplica-se quando: role=tool; use o ID realmente devolvido | Predefinição— |
| Campo`messages[].name` | Tipo`string` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`messages[].reasoning_content` | Tipo`string` | RequisitoOpcional | Valores e limites Aplica-se quando: Reintroduza o raciocínio realmente devolvido quando este modelo o utiliza | Predefinição— |
| Campo`messages[].reasoning_details` | Tipo`object\|array` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`max_tokens` | Tipo`integer` | RequisitoOpcional | Valores e limites Mínimo: 1 Depende do modelo | Predefinição— |
| Campo`max_completion_tokens` | Tipo`integer` | RequisitoOpcional | Valores e limites Mínimo: 1 Depende do modelo | Predefinição— |
| Campo`stream` | Tipo`boolean` | RequisitoOpcional | Valores e limites | Predefiniçãofalse |
| Campo`stream_options.include_usage` | Tipo`boolean` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`temperature` | Tipo`number` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`top_p` | Tipo`number` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`stop` | Tipo`string\|string[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tools` | Tipo`function_tool[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tools[].type` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tools[].function.name` | Tipo`string` | RequisitoObrigatório | Valores e limites Aplica-se quando: Função fornecida como ferramenta | Predefinição— |
| Campo`tools[].function.description` | Tipo`string` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`tools[].function.parameters` | Tipo`JSON_schema` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`tool_choice` | Tipo`string\|object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`parallel_tool_calls` | Tipo`boolean` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`response_format` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`reasoning_effort` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`reasoning` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`service_tier` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`instructions` | Tipo`string` | RequisitoOpcional | Valores e limites Campo de compatibilidade | Predefinição— |
| Campo`functions` | Tipo`function[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`function_call` | Tipo`string\|object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`prompt_cache_options` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |

Combinações de materiais de entrada

**Texto** · Texto UTF8

`messages[].content`

Parâmetros e ciclo de vida do método

| Parâmetro | Contrato |
| --- | --- |
| Parâmetro`material_types` | Contratotext |
| Parâmetro`required` | Contratomodel, messages |
| Parâmetro`optional_controls` | Contratonull |
| Parâmetro`content_type` | Contratoapplication/json |
| Parâmetro`text_file_material` | ContratoConteúdo UTF-8 real inserido como texto; ID de ficheiros/URLs precisam de suporte separado e exato |

Ciclo de vida: `exact retained published method`

As estruturas dos métodos e os ID são exatos; a capacidade do fornecedor é distinta da admissão dos pedidos.

### Tarifários

#### Tarifas dos métodos Ailoot

Entrada

0,0014 US$ */ 1K*

Saída

0,0044 US$ */ 1K*

Leitura da cache

≈0,00026 US$ */ 1K*

O Ailoot reserva um montante estimado antes de um pedido. Após o resultado, liquida o custo final com base na utilização medida. No streaming, a liquidação usa o registo final de utilização. [Como funcionam a reserva e a liquidação →](https://ailoot.ai/docs/pt-pt/billing/reserve/)

#### Detalhes da tarifa de referência

As tabelas de referência do modelo não alteram a seleção do método, as cotações ou os custos. Os custos ativos usam as tarifas do método Ailoot selecionado.

Tabelas de referência do modelo

#### Preços por configuração

Associe cada custo às condições apresentadas. Use uma única tarifa para cada conjunto de configurações alternativas.

| Configuração | Tabela de tarifas | Tokens de contexto, mais de | Tokens de contexto, até ao limite inclusive | Custo |
| --- | --- | --- | --- | --- |
| ConfiguraçãoOpenAI Chat · Tarifas de base por token | Tabela de tarifasTarifa base | Tokens de contexto, mais de— | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoOpenAI Chat · Escalão 1 por comprimento do pedido | Tabela de tarifas— | Tokens de contexto, mais de0 | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoAnthropic Messages · Tarifas de base por token | Tabela de tarifasTarifa base | Tokens de contexto, mais de— | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoAnthropic Messages · Escalão 1 por comprimento do pedido | Tabela de tarifas— | Tokens de contexto, mais de0 | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |

### Exemplos de pedidos

#### Ailoot · OpenAI Chat

Exemplo de textoPython SDKNode.js SDKStreaming em Python

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "glm-5.1", "messages": []}')
f=Path(os.environ["AILOOT_TEXT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 source material")
text=f.read_text(encoding="utf-8")
if not text.strip():raise SystemExit("Source material must contain text")
p["messages"]=[{"role":"user","content":"Summarize this material and quote supporting source passages.\n\n"+text}]
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/chat/completions \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
print(json.dumps(json.loads(Path("result.json").read_text()),ensure_ascii=False,indent=2))
PY_RESULT
```

```python
from openai import OpenAI
import os

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client = OpenAI(base_url="https://api.ailoot.ai/v1", api_key=os.environ["AILOOT_API_KEY"], max_retries=0)
resp = client.chat.completions.create(
    model="glm-5.1",
    messages=[{"role": "user", "content": "Explain the difference between an observation and a hypothesis in three sentences."}],
)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(resp.to_dict(mode="json"))
```

```js
import OpenAI from "openai";

if (!process.env.AILOOT_API_KEY?.trim()) throw new Error("Set AILOOT_API_KEY before making a request");
const client = new OpenAI({ baseURL: "https://api.ailoot.ai/v1", apiKey: process.env.AILOOT_API_KEY, maxRetries: 0 });
const resp = await client.chat.completions.create({
  model: "glm-5.1",
  messages: [{ role: "user", content: "Explain the difference between an observation and a hypothesis in three sentences." }],
});
import { writeFileSync } from "node:fs";

function saveResult(data, stem = "result") {
  writeFileSync(stem + ".json", JSON.stringify(data, null, 2));
  console.log(JSON.stringify(data, null, 2));
  const saveBlob = (encoded, suffix, label) => {
    const raw = Buffer.from(encoded, "base64");
    const ext = raw.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10])) ? "png" : raw[0]===255 && raw[1]===216 ? "jpg" : raw.subarray(0,4).toString()==="RIFF" && raw.subarray(8,12).toString()==="WEBP" ? "webp" : suffix;
    const file = `${stem}-${label}.${ext}`;
    writeFileSync(file, raw); console.log("Saved", file);
  };
  for (const [i, block] of (data.content || []).entries()) console.log("Content", i, JSON.stringify(block));
  for (const choice of data.choices || []) console.log("Choice", choice.index, JSON.stringify(choice.message || choice.delta || {}));
  for (const [i, item] of (data.output || []).entries()) {
    console.log("Output", i, JSON.stringify(item));
    if (item.type === "image_generation_call" && item.result) saveBlob(item.result, item.output_format || "bin", `output-${i}`);
  }
  for (const [ci, candidate] of (data.candidates || []).entries()) {
    for (const [pi, part] of (candidate.content?.parts || []).entries()) {
      console.log("Candidate/part", ci, pi, JSON.stringify(part));
      const blob = part.inlineData || part.inline_data;
      if (blob?.data) {
        const mime = blob.mimeType || blob.mime_type;
        const suffix = ({"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"})[mime] || "bin";
        saveBlob(blob.data, suffix, `candidate-${ci}-part-${pi}`);
      }
    }
  }
}

saveResult(resp);
```

```python
from openai import OpenAI
import os
from pathlib import Path

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

with client.chat.completions.stream(model='glm-5.1',messages=[{"role":"user","content":"Explain observations and hypotheses in three sentences."}]) as stream:
    with Path("stream-events.jsonl").open("w",encoding="utf-8") as log:
        for event in stream:
            payload=event.to_dict(mode="json")
            log.write(json.dumps(payload,ensure_ascii=False)+"\n"); log.flush()
            print(json.dumps(payload,ensure_ascii=False))
    final=stream.get_final_completion()
    save_result(final.to_dict(mode="json"),"stream-result")
```

### Receber e guardar os resultados

#### Ailoot · OpenAI Chat

json ou SSE

##### Guardar todos os resultados concluídos

Guarde cada resposta, ficheiro e parte de conteúdo devolvidos na íntegra.

Conserve cada opção com o conteúdo, as chamadas de ferramentas e o raciocínio. Em SSE, junte os deltas por índice de opção e ferramenta e mantenha o motivo final de conclusão e os dados de utilização.

##### Se for necessário verificar a resposta original

Conserve os ID e cabeçalhos de pedido/resposta. Não é fornecido um URL genérico para obter uma tarefa textual.

Campos da resposta

| Campo | Tipo |
| --- | --- |
| Campo`choices[].index` | Tipointeger |
| Campo`choices[].message.content` | Tipostring\|null |
| Campo`choices[].message.tool_calls` | Tipotool\_call\[\] |
| Campo`choices[].message.reasoning_content` | Tipostring |
| Campo`choices[].message.reasoning_details` | Tipoobject\|array |
| Campo`choices[].finish_reason` | Tipostring\|null |
| Campo`usage` | Tipoobject |

Erros e passos seguintes

| Resposta | Condição | Passo seguinte |
| --- | --- | --- |
| Resposta400 · `invalid_request_error` | CondiçãoCampos obrigatórios, representação do material ou valor do parâmetro inválidos | Passo seguinteCorrija os campos indicados antes de um novo pedido de criação. |

### Aliases

#### Aliases do modelo

<strong>Ailoot</strong> [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=chat), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=chat), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=chat), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=chat), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=chat), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=chat)
**Ailoot Ultra** [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3&fmt=chat), [`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=chat), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=chat)

#### Aliases dos caminhos dos métodos

`/chat/completions`

#### IDs de chamada relacionados

[`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=chat), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=chat), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=chat), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=chat), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=chat), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=chat), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=chat), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=chat), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3&fmt=chat)

**Ailoot · Anthropic Messages** `POST /v1/messages` `glm-5.2`

[`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=messages)

Z.ai /`glm-5.2`

ID do modelo

- `glm-5.3`
- `glm`
- `glm-5`
- `glm-5.1`
- `glm-5.2`
- `glm-latest`

### Introdução

Z.ai GLM 5.3 é um modelo de raciocínio textual para engenharia de software complexa, trabalho em terminal e agentes de longa duração. Suporta um contexto de 1M tokens documentado pelo fabricante, até 128K tokens de saída, chamada de funções e esforço de raciocínio low/high/max, mantendo o raciocínio sempre ativado.

Entradas aceites

Texto

Resultados

Texto

### Disponível no Ailoot · entradas e métodos

**Ailoot · Anthropic Messages** `POST /v1/messages`

Entrada

`text`

Saída

`text`

Contexto

1 000 000 tokens

Saída máxima

131 072 tokens

Formato de saída

json ou SSE

| Campo | Tipo | Requisito | Valores e limites | Predefinição |
| --- | --- | --- | --- | --- |
| Campo`model` | Tipo`string` | RequisitoObrigatório | Valores e limites glm-5.2 | Predefinição— |
| Campo`messages` | Tipo`message[]` | RequisitoObrigatório | Valores e limites Número mínimo de elementos: 1 | Predefinição— |
| Campo`messages[].role` | Tipo`string` | RequisitoObrigatório | Valores e limites user, assistant | Predefinição— |
| Campo`messages[].content` | Tipo`string\|content_block[]` | RequisitoObrigatório | Valores e limites | Predefinição— |
| Campo`system` | Tipo`string\|content_block[]` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`max_tokens` | Tipo`integer` | RequisitoObrigatório | Valores e limites Mínimo: 1 O limite aplica-se a: Limite exato do modelo ou da ficha selecionados | Predefinição— |
| Campo`stream` | Tipo`boolean` | RequisitoOpcional | Valores e limites | Predefiniçãofalse |
| Campo`temperature` | Tipo`number` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`top_p` | Tipo`number` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`stop_sequences` | Tipo`string[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tools` | Tipo`tool[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tools[].name` | Tipo`string` | RequisitoOpcional | Valores e limites Aplica-se quando: Ferramenta fornecida | Predefinição— |
| Campo`tools[].description` | Tipo`string` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`tools[].input_schema` | Tipo`JSON_schema` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`tool_choice` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`thinking.type` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`thinking.budget_tokens` | Tipo`integer` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`output_config.effort` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`metadata` | Tipo`object` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`cache_control` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |

Combinações de materiais de entrada

**Texto** · Texto UTF8

`messages[].content ou bloco type=text`

Parâmetros e ciclo de vida do método

| Parâmetro | Contrato |
| --- | --- |
| Parâmetro`material_types` | Contratotext |
| Parâmetro`required` | Contratomodel, messages, max\_tokens |
| Parâmetro`optional_controls` | Contratonull |
| Parâmetro`content_type` | Contratoapplication/json |
| Parâmetro`text_file_material` | ContratoConteúdo UTF-8 real inserido como texto; ID de ficheiros/URLs precisam de suporte separado e exato |

Ciclo de vida: `exact retained published method`

As estruturas dos métodos e os ID são exatos; a capacidade do fornecedor é distinta da admissão dos pedidos.

### Tarifários

#### Tarifas dos métodos Ailoot

Entrada

0,0014 US$ */ 1K*

Saída

0,0044 US$ */ 1K*

Leitura da cache

≈0,00026 US$ */ 1K*

O Ailoot reserva um montante estimado antes de um pedido. Após o resultado, liquida o custo final com base na utilização medida. No streaming, a liquidação usa o registo final de utilização. [Como funcionam a reserva e a liquidação →](https://ailoot.ai/docs/pt-pt/billing/reserve/)

#### Detalhes da tarifa de referência

As tabelas de referência do modelo não alteram a seleção do método, as cotações ou os custos. Os custos ativos usam as tarifas do método Ailoot selecionado.

Tabelas de referência do modelo

#### Preços por configuração

Associe cada custo às condições apresentadas. Use uma única tarifa para cada conjunto de configurações alternativas.

| Configuração | Tabela de tarifas | Tokens de contexto, mais de | Tokens de contexto, até ao limite inclusive | Custo |
| --- | --- | --- | --- | --- |
| ConfiguraçãoOpenAI Chat · Tarifas de base por token | Tabela de tarifasTarifa base | Tokens de contexto, mais de— | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoOpenAI Chat · Escalão 1 por comprimento do pedido | Tabela de tarifas— | Tokens de contexto, mais de0 | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoAnthropic Messages · Tarifas de base por token | Tabela de tarifasTarifa base | Tokens de contexto, mais de— | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoAnthropic Messages · Escalão 1 por comprimento do pedido | Tabela de tarifas— | Tokens de contexto, mais de0 | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |

### Exemplos de pedidos

#### Ailoot · Anthropic Messages

Exemplo de textoPython SDKNode.js SDKStreaming em Python

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "glm-5.2", "max_tokens": 1024, "messages": []}')
f=Path(os.environ["AILOOT_TEXT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 source material")
text=f.read_text(encoding="utf-8")
if not text.strip():raise SystemExit("Source material must contain text")
p["messages"]=[{"role":"user","content":"Summarize this material and quote supporting source passages.\n\n"+text}]
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/messages \
  -H "x-api-key: $AILOOT_API_KEY" -H 'anthropic-version: 2023-06-01' -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
print(json.dumps(json.loads(Path("result.json").read_text()),ensure_ascii=False,indent=2))
PY_RESULT
```

```python
import anthropic
import os

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client = anthropic.Anthropic(base_url="https://api.ailoot.ai", api_key=os.environ["AILOOT_API_KEY"], max_retries=0)
msg = client.messages.create(
    model="glm-5.2",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Explain the difference between an observation and a hypothesis in three sentences."}],
)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(msg.to_dict(mode="json"))
```

```js
import Anthropic from "@anthropic-ai/sdk";

if (!process.env.AILOOT_API_KEY?.trim()) throw new Error("Set AILOOT_API_KEY before making a request");
const client = new Anthropic({ baseURL: "https://api.ailoot.ai", apiKey: process.env.AILOOT_API_KEY, maxRetries: 0 });
const msg = await client.messages.create({
  model: "glm-5.2",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Explain the difference between an observation and a hypothesis in three sentences." }],
});
import { writeFileSync } from "node:fs";

function saveResult(data, stem = "result") {
  writeFileSync(stem + ".json", JSON.stringify(data, null, 2));
  console.log(JSON.stringify(data, null, 2));
  const saveBlob = (encoded, suffix, label) => {
    const raw = Buffer.from(encoded, "base64");
    const ext = raw.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10])) ? "png" : raw[0]===255 && raw[1]===216 ? "jpg" : raw.subarray(0,4).toString()==="RIFF" && raw.subarray(8,12).toString()==="WEBP" ? "webp" : suffix;
    const file = `${stem}-${label}.${ext}`;
    writeFileSync(file, raw); console.log("Saved", file);
  };
  for (const [i, block] of (data.content || []).entries()) console.log("Content", i, JSON.stringify(block));
  for (const choice of data.choices || []) console.log("Choice", choice.index, JSON.stringify(choice.message || choice.delta || {}));
  for (const [i, item] of (data.output || []).entries()) {
    console.log("Output", i, JSON.stringify(item));
    if (item.type === "image_generation_call" && item.result) saveBlob(item.result, item.output_format || "bin", `output-${i}`);
  }
  for (const [ci, candidate] of (data.candidates || []).entries()) {
    for (const [pi, part] of (candidate.content?.parts || []).entries()) {
      console.log("Candidate/part", ci, pi, JSON.stringify(part));
      const blob = part.inlineData || part.inline_data;
      if (blob?.data) {
        const mime = blob.mimeType || blob.mime_type;
        const suffix = ({"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"})[mime] || "bin";
        saveBlob(blob.data, suffix, `candidate-${ci}-part-${pi}`);
      }
    }
  }
}

saveResult(msg);
```

```python
import anthropic,os
from pathlib import Path

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=anthropic.Anthropic(base_url="https://api.ailoot.ai",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

with client.messages.stream(model='glm-5.2',max_tokens=1024,messages=[{"role":"user","content":"Explain observations and hypotheses in three sentences."}]) as stream:
    with Path("stream-events.jsonl").open("w",encoding="utf-8") as log:
        for event in stream:
            payload=event.to_dict(mode="json")
            log.write(json.dumps(payload,ensure_ascii=False)+"\n"); log.flush()
            print(json.dumps(payload,ensure_ascii=False))
    final=stream.get_final_message()
    save_result(final.to_dict(mode="json"),"stream-result")
```

### Receber e guardar os resultados

#### Ailoot · Anthropic Messages

json ou SSE

##### Guardar todos os resultados concluídos

Guarde cada resposta, ficheiro e parte de conteúdo devolvidos na íntegra.

Conserve todos os blocos de conteúdo, as assinaturas de raciocínio e os ID reais de utilização de ferramentas. Junte todos os deltas de blocos SSE; o primeiro bloco de texto não é a saída completa.

##### Se for necessário verificar a resposta original

Conserve os ID e cabeçalhos de pedido/resposta. Não é fornecido um URL genérico para obter uma tarefa textual.

Campos da resposta

| Campo | Tipo |
| --- | --- |
| Campo`id` | Tipostring |
| Campo`model` | Tipostring |
| Campo`content[]` | Tipotext\|thinking\|tool\_use\|other content block |
| Campo`stop_reason` | Tipostring\|null |
| Campo`usage` | Tipoobject |

Erros e passos seguintes

| Resposta | Condição | Passo seguinte |
| --- | --- | --- |
| Resposta400 · `invalid_request_error` | CondiçãoCampos obrigatórios, representação do material ou valor do parâmetro inválidos | Passo seguinteCorrija os campos indicados antes de um novo pedido de criação. |

### Aliases

#### Aliases do modelo

<strong>Ailoot</strong> [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=messages), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=messages), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=messages), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=messages), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=messages), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=messages)
**Ailoot Ultra** [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3&fmt=messages), [`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=messages), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=messages)

#### Aliases dos caminhos dos métodos

`/chat/completions`

#### IDs de chamada relacionados

[`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=messages), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=messages), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=messages), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=messages), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=messages), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=messages), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=messages), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=messages), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3&fmt=messages)

**Ailoot · OpenAI Responses** `POST /v1/responses` `glm-5.2`

[`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=responses)

Z.ai /`glm-5.2`

ID do modelo

- `glm-5.3`
- `glm`
- `glm-5`
- `glm-5.1`
- `glm-5.2`
- `glm-latest`

### Introdução

Z.ai GLM 5.3 é um modelo de raciocínio textual para engenharia de software complexa, trabalho em terminal e agentes de longa duração. Suporta um contexto de 1M tokens documentado pelo fabricante, até 128K tokens de saída, chamada de funções e esforço de raciocínio low/high/max, mantendo o raciocínio sempre ativado.

Entradas aceites

Texto

Resultados

Texto

### Disponível no Ailoot · entradas e métodos

**Ailoot · OpenAI Responses** `POST /v1/responses`

Entrada

`text`

Saída

`text`

Contexto

1 000 000 tokens

Saída máxima

131 072 tokens

Formato de saída

json ou SSE

| Campo | Tipo | Requisito | Valores e limites | Predefinição |
| --- | --- | --- | --- | --- |
| Campo`model` | Tipo`string` | RequisitoObrigatório | Valores e limites glm-5.2 | Predefinição— |
| Campo`input` | Tipo`string\|input_item[]` | RequisitoObrigatório | Valores e limites | Predefinição— |
| Campo`instructions` | Tipo`string` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`input[].type` | Tipo`string` | RequisitoOpcional | Valores e limites message, reasoning, function\_call, function\_call\_output | Predefinição— |
| Campo`input[].content` | Tipo`string\|content_part[]` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`input[].call_id` | Tipo`string` | RequisitoOpcional | Valores e limites Aplica-se quando: function\_call\_output; conserve o call\_id realmente devolvido | Predefinição— |
| Campo`input[].output` | Tipo`string\|content_part[]` | RequisitoOpcional | Valores e limites Aplica-se quando: function\_call\_output | Predefinição— |
| Campo`max_output_tokens` | Tipo`integer` | RequisitoOpcional | Valores e limites Mínimo: 1 Depende do modelo | Predefinição— |
| Campo`stream` | Tipo`boolean` | RequisitoOpcional | Valores e limites | Predefiniçãofalse |
| Campo`temperature` | Tipo`number` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`top_p` | Tipo`number` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tools` | Tipo`tool[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tool_choice` | Tipo`string\|object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`parallel_tool_calls` | Tipo`boolean` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`reasoning.effort` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`reasoning.summary` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`text.format` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`text.verbosity` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`include` | Tipo`string[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`store` | Tipo`boolean` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`previous_response_id` | Tipo`string` | RequisitoOpcional | Valores e limites Requisito do ID: Só um ID de resposta real de uma continuação suportada Depende do modelo | Predefinição— |
| Campo`service_tier` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`prompt_cache_key` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`prompt_cache_options` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |

Combinações de materiais de entrada

**Texto** · Texto UTF8

`Texto de entrada ou parte input_text`

Parâmetros e ciclo de vida do método

| Parâmetro | Contrato |
| --- | --- |
| Parâmetro`material_types` | Contratotext |
| Parâmetro`required` | Contratomodel, input |
| Parâmetro`optional_controls` | Contratonull |
| Parâmetro`content_type` | Contratoapplication/json |
| Parâmetro`text_file_material` | ContratoConteúdo UTF-8 real inserido como texto; ID de ficheiros/URLs precisam de suporte separado e exato |

Ciclo de vida: `exact retained published method`

As estruturas dos métodos e os ID são exatos; a capacidade do fornecedor é distinta da admissão dos pedidos.

### Tarifários

#### Tarifas dos métodos Ailoot

Entrada

0,0014 US$ */ 1K*

Saída

0,0044 US$ */ 1K*

Leitura da cache

≈0,00026 US$ */ 1K*

O Ailoot reserva um montante estimado antes de um pedido. Após o resultado, liquida o custo final com base na utilização medida. No streaming, a liquidação usa o registo final de utilização. [Como funcionam a reserva e a liquidação →](https://ailoot.ai/docs/pt-pt/billing/reserve/)

#### Detalhes da tarifa de referência

As tabelas de referência do modelo não alteram a seleção do método, as cotações ou os custos. Os custos ativos usam as tarifas do método Ailoot selecionado.

Tabelas de referência do modelo

#### Preços por configuração

Associe cada custo às condições apresentadas. Use uma única tarifa para cada conjunto de configurações alternativas.

| Configuração | Tabela de tarifas | Tokens de contexto, mais de | Tokens de contexto, até ao limite inclusive | Custo |
| --- | --- | --- | --- | --- |
| ConfiguraçãoOpenAI Chat · Tarifas de base por token | Tabela de tarifasTarifa base | Tokens de contexto, mais de— | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoOpenAI Chat · Escalão 1 por comprimento do pedido | Tabela de tarifas— | Tokens de contexto, mais de0 | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoAnthropic Messages · Tarifas de base por token | Tabela de tarifasTarifa base | Tokens de contexto, mais de— | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoAnthropic Messages · Escalão 1 por comprimento do pedido | Tabela de tarifas— | Tokens de contexto, mais de0 | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |

### Exemplos de pedidos

#### Ailoot · OpenAI Responses

Exemplo de textoPython SDKNode.js SDKStreaming em Python

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "glm-5.2", "input": ""}')
f=Path(os.environ["AILOOT_TEXT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 source material")
text=f.read_text(encoding="utf-8")
if not text.strip():raise SystemExit("Source material must contain text")
p["input"]="Summarize this material and quote supporting source passages.\n\n"+text
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/responses \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(json.loads(Path("result.json").read_text(encoding="utf-8")))
PY_RESULT
```

```python
from openai import OpenAI
import os

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client = OpenAI(base_url="https://api.ailoot.ai/v1", api_key=os.environ["AILOOT_API_KEY"], max_retries=0)
resp = client.responses.create(model="glm-5.2", input="Explain the difference between an observation and a hypothesis in three sentences.")
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(resp.to_dict(mode="json"))
```

```js
import OpenAI from "openai";

if (!process.env.AILOOT_API_KEY?.trim()) throw new Error("Set AILOOT_API_KEY before making a request");
const client = new OpenAI({ baseURL: "https://api.ailoot.ai/v1", apiKey: process.env.AILOOT_API_KEY, maxRetries: 0 });
const resp = await client.responses.create({ model: "glm-5.2", input: "Explain the difference between an observation and a hypothesis in three sentences." });
import { writeFileSync } from "node:fs";

function saveResult(data, stem = "result") {
  writeFileSync(stem + ".json", JSON.stringify(data, null, 2));
  console.log(JSON.stringify(data, null, 2));
  const saveBlob = (encoded, suffix, label) => {
    const raw = Buffer.from(encoded, "base64");
    const ext = raw.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10])) ? "png" : raw[0]===255 && raw[1]===216 ? "jpg" : raw.subarray(0,4).toString()==="RIFF" && raw.subarray(8,12).toString()==="WEBP" ? "webp" : suffix;
    const file = `${stem}-${label}.${ext}`;
    writeFileSync(file, raw); console.log("Saved", file);
  };
  for (const [i, block] of (data.content || []).entries()) console.log("Content", i, JSON.stringify(block));
  for (const choice of data.choices || []) console.log("Choice", choice.index, JSON.stringify(choice.message || choice.delta || {}));
  for (const [i, item] of (data.output || []).entries()) {
    console.log("Output", i, JSON.stringify(item));
    if (item.type === "image_generation_call" && item.result) saveBlob(item.result, item.output_format || "bin", `output-${i}`);
  }
  for (const [ci, candidate] of (data.candidates || []).entries()) {
    for (const [pi, part] of (candidate.content?.parts || []).entries()) {
      console.log("Candidate/part", ci, pi, JSON.stringify(part));
      const blob = part.inlineData || part.inline_data;
      if (blob?.data) {
        const mime = blob.mimeType || blob.mime_type;
        const suffix = ({"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"})[mime] || "bin";
        saveBlob(blob.data, suffix, `candidate-${ci}-part-${pi}`);
      }
    }
  }
}

saveResult(resp);
```

```python
from openai import OpenAI
import os
from pathlib import Path
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
with client.responses.stream(model="glm-5.2", input="Explain the difference between an observation and a hypothesis in three sentences.") as stream:
    with Path("stream-events.jsonl").open("w",encoding="utf-8") as log:
        for event in stream:
            payload=event.to_dict(mode="json")
            log.write(json.dumps(payload,ensure_ascii=False)+"\n"); log.flush()
            print(json.dumps(payload,ensure_ascii=False))
    final=stream.get_final_response()
    save_result(final.to_dict(mode="json"),"stream-result")
```

### Receber e guardar os resultados

#### Ailoot · OpenAI Responses

json ou SSE

##### Guardar todos os resultados concluídos

Guarde cada resposta, ficheiro e parte de conteúdo devolvidos na íntegra.

Conserve cada elemento de saída e parte de conteúdo, o call\_id real da função, o raciocínio cifrado e os dados de utilização. Em streaming, mantenha a identidade completa dos eventos e elementos.

##### Se for necessário verificar a resposta original

Conserve os ID e cabeçalhos de pedido/resposta. Não é fornecido um URL genérico para obter uma tarefa textual.

Campos da resposta

| Campo | Tipo |
| --- | --- |
| Campo`id` | Tipostring |
| Campo`status` | Tipostring |
| Campo`output[]` | Tipomessage\|reasoning\|function\_call\|other item |
| Campo`output[].content[]` | Tipocontent part |
| Campo`usage` | Tipoobject |

Erros e passos seguintes

| Resposta | Condição | Passo seguinte |
| --- | --- | --- |
| Resposta400 · `invalid_request_error` | CondiçãoCampos obrigatórios, representação do material ou valor do parâmetro inválidos | Passo seguinteCorrija os campos indicados antes de um novo pedido de criação. |

### Aliases

#### Aliases do modelo

<strong>Ailoot</strong> [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=responses), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=responses), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=responses), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=responses), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=responses), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=responses)
**Ailoot Ultra** [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3), [`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest)

#### Aliases dos caminhos dos métodos

`/chat/completions`

#### IDs de chamada relacionados

[`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=responses), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=responses), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=responses), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=responses), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=responses), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=responses), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3)

**Ailoot · OpenAI Chat** `POST /v1/chat/completions` `glm-5.2`

[`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=chat)

Z.ai /`glm-5.2`

ID do modelo

- `glm-5.3`
- `glm`
- `glm-5`
- `glm-5.1`
- `glm-5.2`
- `glm-latest`

### Introdução

Z.ai GLM 5.3 é um modelo de raciocínio textual para engenharia de software complexa, trabalho em terminal e agentes de longa duração. Suporta um contexto de 1M tokens documentado pelo fabricante, até 128K tokens de saída, chamada de funções e esforço de raciocínio low/high/max, mantendo o raciocínio sempre ativado.

Entradas aceites

Texto

Resultados

Texto

### Disponível no Ailoot · entradas e métodos

**Ailoot · OpenAI Chat** `POST /v1/chat/completions`

Entrada

`text`

Saída

`text`

Contexto

1 000 000 tokens

Saída máxima

131 072 tokens

Formato de saída

json ou SSE

| Campo | Tipo | Requisito | Valores e limites | Predefinição |
| --- | --- | --- | --- | --- |
| Campo`model` | Tipo`string` | RequisitoObrigatório | Valores e limites glm-5.2 | Predefinição— |
| Campo`messages` | Tipo`message[]` | RequisitoObrigatório | Valores e limites Número mínimo de elementos: 1 | Predefinição— |
| Campo`messages[].role` | Tipo`string` | RequisitoObrigatório | Valores e limites Exemplos: system, user, assistant, tool, function Condições: Estes papéis são representados explicitamente pelos tipos de compatibilidade do código-fonte; o conjunto exato de papéis continua específico do modelo. Depende do modelo | Predefinição— |
| Campo`messages[].content` | Tipo`string\|content_part[]\|null` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`messages[].tool_calls` | Tipo`tool_call[]` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`messages[].tool_call_id` | Tipo`string` | RequisitoOpcional | Valores e limites Aplica-se quando: role=tool; use o ID realmente devolvido | Predefinição— |
| Campo`messages[].name` | Tipo`string` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`messages[].reasoning_content` | Tipo`string` | RequisitoOpcional | Valores e limites Aplica-se quando: Reintroduza o raciocínio realmente devolvido quando este modelo o utiliza | Predefinição— |
| Campo`messages[].reasoning_details` | Tipo`object\|array` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`max_tokens` | Tipo`integer` | RequisitoOpcional | Valores e limites Mínimo: 1 Depende do modelo | Predefinição— |
| Campo`max_completion_tokens` | Tipo`integer` | RequisitoOpcional | Valores e limites Mínimo: 1 Depende do modelo | Predefinição— |
| Campo`stream` | Tipo`boolean` | RequisitoOpcional | Valores e limites | Predefiniçãofalse |
| Campo`stream_options.include_usage` | Tipo`boolean` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`temperature` | Tipo`number` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`top_p` | Tipo`number` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`stop` | Tipo`string\|string[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tools` | Tipo`function_tool[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tools[].type` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tools[].function.name` | Tipo`string` | RequisitoObrigatório | Valores e limites Aplica-se quando: Função fornecida como ferramenta | Predefinição— |
| Campo`tools[].function.description` | Tipo`string` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`tools[].function.parameters` | Tipo`JSON_schema` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`tool_choice` | Tipo`string\|object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`parallel_tool_calls` | Tipo`boolean` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`response_format` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`reasoning_effort` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`reasoning` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`service_tier` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`instructions` | Tipo`string` | RequisitoOpcional | Valores e limites Campo de compatibilidade | Predefinição— |
| Campo`functions` | Tipo`function[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`function_call` | Tipo`string\|object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`prompt_cache_options` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |

Combinações de materiais de entrada

**Texto** · Texto UTF8

`messages[].content`

Parâmetros e ciclo de vida do método

| Parâmetro | Contrato |
| --- | --- |
| Parâmetro`material_types` | Contratotext |
| Parâmetro`required` | Contratomodel, messages |
| Parâmetro`optional_controls` | Contratonull |
| Parâmetro`content_type` | Contratoapplication/json |
| Parâmetro`text_file_material` | ContratoConteúdo UTF-8 real inserido como texto; ID de ficheiros/URLs precisam de suporte separado e exato |

Ciclo de vida: `exact retained published method`

As estruturas dos métodos e os ID são exatos; a capacidade do fornecedor é distinta da admissão dos pedidos.

### Tarifários

#### Tarifas dos métodos Ailoot

Entrada

0,0014 US$ */ 1K*

Saída

0,0044 US$ */ 1K*

Leitura da cache

≈0,00026 US$ */ 1K*

O Ailoot reserva um montante estimado antes de um pedido. Após o resultado, liquida o custo final com base na utilização medida. No streaming, a liquidação usa o registo final de utilização. [Como funcionam a reserva e a liquidação →](https://ailoot.ai/docs/pt-pt/billing/reserve/)

#### Detalhes da tarifa de referência

As tabelas de referência do modelo não alteram a seleção do método, as cotações ou os custos. Os custos ativos usam as tarifas do método Ailoot selecionado.

Tabelas de referência do modelo

#### Preços por configuração

Associe cada custo às condições apresentadas. Use uma única tarifa para cada conjunto de configurações alternativas.

| Configuração | Tabela de tarifas | Tokens de contexto, mais de | Tokens de contexto, até ao limite inclusive | Custo |
| --- | --- | --- | --- | --- |
| ConfiguraçãoOpenAI Chat · Tarifas de base por token | Tabela de tarifasTarifa base | Tokens de contexto, mais de— | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoOpenAI Chat · Escalão 1 por comprimento do pedido | Tabela de tarifas— | Tokens de contexto, mais de0 | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoAnthropic Messages · Tarifas de base por token | Tabela de tarifasTarifa base | Tokens de contexto, mais de— | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoAnthropic Messages · Escalão 1 por comprimento do pedido | Tabela de tarifas— | Tokens de contexto, mais de0 | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |

### Exemplos de pedidos

#### Ailoot · OpenAI Chat

Exemplo de textoPython SDKNode.js SDKStreaming em Python

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "glm-5.2", "messages": []}')
f=Path(os.environ["AILOOT_TEXT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 source material")
text=f.read_text(encoding="utf-8")
if not text.strip():raise SystemExit("Source material must contain text")
p["messages"]=[{"role":"user","content":"Summarize this material and quote supporting source passages.\n\n"+text}]
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/chat/completions \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
print(json.dumps(json.loads(Path("result.json").read_text()),ensure_ascii=False,indent=2))
PY_RESULT
```

```python
from openai import OpenAI
import os

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client = OpenAI(base_url="https://api.ailoot.ai/v1", api_key=os.environ["AILOOT_API_KEY"], max_retries=0)
resp = client.chat.completions.create(
    model="glm-5.2",
    messages=[{"role": "user", "content": "Explain the difference between an observation and a hypothesis in three sentences."}],
)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(resp.to_dict(mode="json"))
```

```js
import OpenAI from "openai";

if (!process.env.AILOOT_API_KEY?.trim()) throw new Error("Set AILOOT_API_KEY before making a request");
const client = new OpenAI({ baseURL: "https://api.ailoot.ai/v1", apiKey: process.env.AILOOT_API_KEY, maxRetries: 0 });
const resp = await client.chat.completions.create({
  model: "glm-5.2",
  messages: [{ role: "user", content: "Explain the difference between an observation and a hypothesis in three sentences." }],
});
import { writeFileSync } from "node:fs";

function saveResult(data, stem = "result") {
  writeFileSync(stem + ".json", JSON.stringify(data, null, 2));
  console.log(JSON.stringify(data, null, 2));
  const saveBlob = (encoded, suffix, label) => {
    const raw = Buffer.from(encoded, "base64");
    const ext = raw.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10])) ? "png" : raw[0]===255 && raw[1]===216 ? "jpg" : raw.subarray(0,4).toString()==="RIFF" && raw.subarray(8,12).toString()==="WEBP" ? "webp" : suffix;
    const file = `${stem}-${label}.${ext}`;
    writeFileSync(file, raw); console.log("Saved", file);
  };
  for (const [i, block] of (data.content || []).entries()) console.log("Content", i, JSON.stringify(block));
  for (const choice of data.choices || []) console.log("Choice", choice.index, JSON.stringify(choice.message || choice.delta || {}));
  for (const [i, item] of (data.output || []).entries()) {
    console.log("Output", i, JSON.stringify(item));
    if (item.type === "image_generation_call" && item.result) saveBlob(item.result, item.output_format || "bin", `output-${i}`);
  }
  for (const [ci, candidate] of (data.candidates || []).entries()) {
    for (const [pi, part] of (candidate.content?.parts || []).entries()) {
      console.log("Candidate/part", ci, pi, JSON.stringify(part));
      const blob = part.inlineData || part.inline_data;
      if (blob?.data) {
        const mime = blob.mimeType || blob.mime_type;
        const suffix = ({"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"})[mime] || "bin";
        saveBlob(blob.data, suffix, `candidate-${ci}-part-${pi}`);
      }
    }
  }
}

saveResult(resp);
```

```python
from openai import OpenAI
import os
from pathlib import Path

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

with client.chat.completions.stream(model='glm-5.2',messages=[{"role":"user","content":"Explain observations and hypotheses in three sentences."}]) as stream:
    with Path("stream-events.jsonl").open("w",encoding="utf-8") as log:
        for event in stream:
            payload=event.to_dict(mode="json")
            log.write(json.dumps(payload,ensure_ascii=False)+"\n"); log.flush()
            print(json.dumps(payload,ensure_ascii=False))
    final=stream.get_final_completion()
    save_result(final.to_dict(mode="json"),"stream-result")
```

### Receber e guardar os resultados

#### Ailoot · OpenAI Chat

json ou SSE

##### Guardar todos os resultados concluídos

Guarde cada resposta, ficheiro e parte de conteúdo devolvidos na íntegra.

Conserve cada opção com o conteúdo, as chamadas de ferramentas e o raciocínio. Em SSE, junte os deltas por índice de opção e ferramenta e mantenha o motivo final de conclusão e os dados de utilização.

##### Se for necessário verificar a resposta original

Conserve os ID e cabeçalhos de pedido/resposta. Não é fornecido um URL genérico para obter uma tarefa textual.

Campos da resposta

| Campo | Tipo |
| --- | --- |
| Campo`choices[].index` | Tipointeger |
| Campo`choices[].message.content` | Tipostring\|null |
| Campo`choices[].message.tool_calls` | Tipotool\_call\[\] |
| Campo`choices[].message.reasoning_content` | Tipostring |
| Campo`choices[].message.reasoning_details` | Tipoobject\|array |
| Campo`choices[].finish_reason` | Tipostring\|null |
| Campo`usage` | Tipoobject |

Erros e passos seguintes

| Resposta | Condição | Passo seguinte |
| --- | --- | --- |
| Resposta400 · `invalid_request_error` | CondiçãoCampos obrigatórios, representação do material ou valor do parâmetro inválidos | Passo seguinteCorrija os campos indicados antes de um novo pedido de criação. |

### Aliases

#### Aliases do modelo

<strong>Ailoot</strong> [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=chat), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=chat), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=chat), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=chat), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=chat), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=chat)
**Ailoot Ultra** [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3&fmt=chat), [`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=chat), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=chat)

#### Aliases dos caminhos dos métodos

`/chat/completions`

#### IDs de chamada relacionados

[`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=chat), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=chat), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=chat), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=chat), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=chat), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=chat), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=chat), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=chat), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3&fmt=chat)

**Ailoot · Anthropic Messages** `POST /v1/messages` `glm-latest`

[`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=messages)

Z.ai /`glm-latest`

ID do modelo

- `glm-5.3`
- `glm`
- `glm-5`
- `glm-5.1`
- `glm-5.2`
- `glm-latest`

### Introdução

Z.ai GLM 5.3 é um modelo de raciocínio textual para engenharia de software complexa, trabalho em terminal e agentes de longa duração. Suporta um contexto de 1M tokens documentado pelo fabricante, até 128K tokens de saída, chamada de funções e esforço de raciocínio low/high/max, mantendo o raciocínio sempre ativado.

Entradas aceites

Texto

Resultados

Texto

### Disponível no Ailoot · entradas e métodos

**Ailoot · Anthropic Messages** `POST /v1/messages`

Entrada

`text`

Saída

`text`

Contexto

1 000 000 tokens

Saída máxima

131 072 tokens

Formato de saída

json ou SSE

| Campo | Tipo | Requisito | Valores e limites | Predefinição |
| --- | --- | --- | --- | --- |
| Campo`model` | Tipo`string` | RequisitoObrigatório | Valores e limites glm-latest | Predefinição— |
| Campo`messages` | Tipo`message[]` | RequisitoObrigatório | Valores e limites Número mínimo de elementos: 1 | Predefinição— |
| Campo`messages[].role` | Tipo`string` | RequisitoObrigatório | Valores e limites user, assistant | Predefinição— |
| Campo`messages[].content` | Tipo`string\|content_block[]` | RequisitoObrigatório | Valores e limites | Predefinição— |
| Campo`system` | Tipo`string\|content_block[]` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`max_tokens` | Tipo`integer` | RequisitoObrigatório | Valores e limites Mínimo: 1 O limite aplica-se a: Limite exato do modelo ou da ficha selecionados | Predefinição— |
| Campo`stream` | Tipo`boolean` | RequisitoOpcional | Valores e limites | Predefiniçãofalse |
| Campo`temperature` | Tipo`number` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`top_p` | Tipo`number` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`stop_sequences` | Tipo`string[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tools` | Tipo`tool[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tools[].name` | Tipo`string` | RequisitoOpcional | Valores e limites Aplica-se quando: Ferramenta fornecida | Predefinição— |
| Campo`tools[].description` | Tipo`string` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`tools[].input_schema` | Tipo`JSON_schema` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`tool_choice` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`thinking.type` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`thinking.budget_tokens` | Tipo`integer` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`output_config.effort` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`metadata` | Tipo`object` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`cache_control` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |

Combinações de materiais de entrada

**Texto** · Texto UTF8

`messages[].content ou bloco type=text`

Parâmetros e ciclo de vida do método

| Parâmetro | Contrato |
| --- | --- |
| Parâmetro`material_types` | Contratotext |
| Parâmetro`required` | Contratomodel, messages, max\_tokens |
| Parâmetro`optional_controls` | Contratonull |
| Parâmetro`content_type` | Contratoapplication/json |
| Parâmetro`text_file_material` | ContratoConteúdo UTF-8 real inserido como texto; ID de ficheiros/URLs precisam de suporte separado e exato |

Ciclo de vida: `exact retained published method`

As estruturas dos métodos e os ID são exatos; a capacidade do fornecedor é distinta da admissão dos pedidos.

### Tarifários

#### Tarifas dos métodos Ailoot

Entrada

0,0014 US$ */ 1K*

Saída

0,0044 US$ */ 1K*

Leitura da cache

≈0,00026 US$ */ 1K*

O Ailoot reserva um montante estimado antes de um pedido. Após o resultado, liquida o custo final com base na utilização medida. No streaming, a liquidação usa o registo final de utilização. [Como funcionam a reserva e a liquidação →](https://ailoot.ai/docs/pt-pt/billing/reserve/)

#### Detalhes da tarifa de referência

As tabelas de referência do modelo não alteram a seleção do método, as cotações ou os custos. Os custos ativos usam as tarifas do método Ailoot selecionado.

Tabelas de referência do modelo

#### Preços por configuração

Associe cada custo às condições apresentadas. Use uma única tarifa para cada conjunto de configurações alternativas.

| Configuração | Tabela de tarifas | Tokens de contexto, mais de | Tokens de contexto, até ao limite inclusive | Custo |
| --- | --- | --- | --- | --- |
| ConfiguraçãoOpenAI Chat · Tarifas de base por token | Tabela de tarifasTarifa base | Tokens de contexto, mais de— | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoOpenAI Chat · Escalão 1 por comprimento do pedido | Tabela de tarifas— | Tokens de contexto, mais de0 | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoAnthropic Messages · Tarifas de base por token | Tabela de tarifasTarifa base | Tokens de contexto, mais de— | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoAnthropic Messages · Escalão 1 por comprimento do pedido | Tabela de tarifas— | Tokens de contexto, mais de0 | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |

### Exemplos de pedidos

#### Ailoot · Anthropic Messages

Exemplo de textoPython SDKNode.js SDKStreaming em Python

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "glm-latest", "max_tokens": 1024, "messages": []}')
f=Path(os.environ["AILOOT_TEXT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 source material")
text=f.read_text(encoding="utf-8")
if not text.strip():raise SystemExit("Source material must contain text")
p["messages"]=[{"role":"user","content":"Summarize this material and quote supporting source passages.\n\n"+text}]
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/messages \
  -H "x-api-key: $AILOOT_API_KEY" -H 'anthropic-version: 2023-06-01' -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
print(json.dumps(json.loads(Path("result.json").read_text()),ensure_ascii=False,indent=2))
PY_RESULT
```

```python
import anthropic
import os

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client = anthropic.Anthropic(base_url="https://api.ailoot.ai", api_key=os.environ["AILOOT_API_KEY"], max_retries=0)
msg = client.messages.create(
    model="glm-latest",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Explain the difference between an observation and a hypothesis in three sentences."}],
)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(msg.to_dict(mode="json"))
```

```js
import Anthropic from "@anthropic-ai/sdk";

if (!process.env.AILOOT_API_KEY?.trim()) throw new Error("Set AILOOT_API_KEY before making a request");
const client = new Anthropic({ baseURL: "https://api.ailoot.ai", apiKey: process.env.AILOOT_API_KEY, maxRetries: 0 });
const msg = await client.messages.create({
  model: "glm-latest",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Explain the difference between an observation and a hypothesis in three sentences." }],
});
import { writeFileSync } from "node:fs";

function saveResult(data, stem = "result") {
  writeFileSync(stem + ".json", JSON.stringify(data, null, 2));
  console.log(JSON.stringify(data, null, 2));
  const saveBlob = (encoded, suffix, label) => {
    const raw = Buffer.from(encoded, "base64");
    const ext = raw.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10])) ? "png" : raw[0]===255 && raw[1]===216 ? "jpg" : raw.subarray(0,4).toString()==="RIFF" && raw.subarray(8,12).toString()==="WEBP" ? "webp" : suffix;
    const file = `${stem}-${label}.${ext}`;
    writeFileSync(file, raw); console.log("Saved", file);
  };
  for (const [i, block] of (data.content || []).entries()) console.log("Content", i, JSON.stringify(block));
  for (const choice of data.choices || []) console.log("Choice", choice.index, JSON.stringify(choice.message || choice.delta || {}));
  for (const [i, item] of (data.output || []).entries()) {
    console.log("Output", i, JSON.stringify(item));
    if (item.type === "image_generation_call" && item.result) saveBlob(item.result, item.output_format || "bin", `output-${i}`);
  }
  for (const [ci, candidate] of (data.candidates || []).entries()) {
    for (const [pi, part] of (candidate.content?.parts || []).entries()) {
      console.log("Candidate/part", ci, pi, JSON.stringify(part));
      const blob = part.inlineData || part.inline_data;
      if (blob?.data) {
        const mime = blob.mimeType || blob.mime_type;
        const suffix = ({"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"})[mime] || "bin";
        saveBlob(blob.data, suffix, `candidate-${ci}-part-${pi}`);
      }
    }
  }
}

saveResult(msg);
```

```python
import anthropic,os
from pathlib import Path

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=anthropic.Anthropic(base_url="https://api.ailoot.ai",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

with client.messages.stream(model='glm-latest',max_tokens=1024,messages=[{"role":"user","content":"Explain observations and hypotheses in three sentences."}]) as stream:
    with Path("stream-events.jsonl").open("w",encoding="utf-8") as log:
        for event in stream:
            payload=event.to_dict(mode="json")
            log.write(json.dumps(payload,ensure_ascii=False)+"\n"); log.flush()
            print(json.dumps(payload,ensure_ascii=False))
    final=stream.get_final_message()
    save_result(final.to_dict(mode="json"),"stream-result")
```

### Receber e guardar os resultados

#### Ailoot · Anthropic Messages

json ou SSE

##### Guardar todos os resultados concluídos

Guarde cada resposta, ficheiro e parte de conteúdo devolvidos na íntegra.

Conserve todos os blocos de conteúdo, as assinaturas de raciocínio e os ID reais de utilização de ferramentas. Junte todos os deltas de blocos SSE; o primeiro bloco de texto não é a saída completa.

##### Se for necessário verificar a resposta original

Conserve os ID e cabeçalhos de pedido/resposta. Não é fornecido um URL genérico para obter uma tarefa textual.

Campos da resposta

| Campo | Tipo |
| --- | --- |
| Campo`id` | Tipostring |
| Campo`model` | Tipostring |
| Campo`content[]` | Tipotext\|thinking\|tool\_use\|other content block |
| Campo`stop_reason` | Tipostring\|null |
| Campo`usage` | Tipoobject |

Erros e passos seguintes

| Resposta | Condição | Passo seguinte |
| --- | --- | --- |
| Resposta400 · `invalid_request_error` | CondiçãoCampos obrigatórios, representação do material ou valor do parâmetro inválidos | Passo seguinteCorrija os campos indicados antes de um novo pedido de criação. |

### Aliases

#### Aliases do modelo

<strong>Ailoot</strong> [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=messages), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=messages), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=messages), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=messages), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=messages), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=messages)
**Ailoot Ultra** [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3&fmt=messages), [`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=messages), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=messages)

#### Aliases dos caminhos dos métodos

`/chat/completions`

#### IDs de chamada relacionados

[`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=messages), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=messages), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=messages), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=messages), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=messages), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=messages), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=messages), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=messages), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3&fmt=messages)

**Ailoot · OpenAI Responses** `POST /v1/responses` `glm-latest`

[`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=responses)

Z.ai /`glm-latest`

ID do modelo

- `glm-5.3`
- `glm`
- `glm-5`
- `glm-5.1`
- `glm-5.2`
- `glm-latest`

### Introdução

Z.ai GLM 5.3 é um modelo de raciocínio textual para engenharia de software complexa, trabalho em terminal e agentes de longa duração. Suporta um contexto de 1M tokens documentado pelo fabricante, até 128K tokens de saída, chamada de funções e esforço de raciocínio low/high/max, mantendo o raciocínio sempre ativado.

Entradas aceites

Texto

Resultados

Texto

### Disponível no Ailoot · entradas e métodos

**Ailoot · OpenAI Responses** `POST /v1/responses`

Entrada

`text`

Saída

`text`

Contexto

1 000 000 tokens

Saída máxima

131 072 tokens

Formato de saída

json ou SSE

| Campo | Tipo | Requisito | Valores e limites | Predefinição |
| --- | --- | --- | --- | --- |
| Campo`model` | Tipo`string` | RequisitoObrigatório | Valores e limites glm-latest | Predefinição— |
| Campo`input` | Tipo`string\|input_item[]` | RequisitoObrigatório | Valores e limites | Predefinição— |
| Campo`instructions` | Tipo`string` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`input[].type` | Tipo`string` | RequisitoOpcional | Valores e limites message, reasoning, function\_call, function\_call\_output | Predefinição— |
| Campo`input[].content` | Tipo`string\|content_part[]` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`input[].call_id` | Tipo`string` | RequisitoOpcional | Valores e limites Aplica-se quando: function\_call\_output; conserve o call\_id realmente devolvido | Predefinição— |
| Campo`input[].output` | Tipo`string\|content_part[]` | RequisitoOpcional | Valores e limites Aplica-se quando: function\_call\_output | Predefinição— |
| Campo`max_output_tokens` | Tipo`integer` | RequisitoOpcional | Valores e limites Mínimo: 1 Depende do modelo | Predefinição— |
| Campo`stream` | Tipo`boolean` | RequisitoOpcional | Valores e limites | Predefiniçãofalse |
| Campo`temperature` | Tipo`number` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`top_p` | Tipo`number` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tools` | Tipo`tool[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tool_choice` | Tipo`string\|object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`parallel_tool_calls` | Tipo`boolean` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`reasoning.effort` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`reasoning.summary` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`text.format` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`text.verbosity` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`include` | Tipo`string[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`store` | Tipo`boolean` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`previous_response_id` | Tipo`string` | RequisitoOpcional | Valores e limites Requisito do ID: Só um ID de resposta real de uma continuação suportada Depende do modelo | Predefinição— |
| Campo`service_tier` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`prompt_cache_key` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`prompt_cache_options` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |

Combinações de materiais de entrada

**Texto** · Texto UTF8

`Texto de entrada ou parte input_text`

Parâmetros e ciclo de vida do método

| Parâmetro | Contrato |
| --- | --- |
| Parâmetro`material_types` | Contratotext |
| Parâmetro`required` | Contratomodel, input |
| Parâmetro`optional_controls` | Contratonull |
| Parâmetro`content_type` | Contratoapplication/json |
| Parâmetro`text_file_material` | ContratoConteúdo UTF-8 real inserido como texto; ID de ficheiros/URLs precisam de suporte separado e exato |

Ciclo de vida: `exact retained published method`

As estruturas dos métodos e os ID são exatos; a capacidade do fornecedor é distinta da admissão dos pedidos.

### Tarifários

#### Tarifas dos métodos Ailoot

Entrada

0,0014 US$ */ 1K*

Saída

0,0044 US$ */ 1K*

Leitura da cache

≈0,00026 US$ */ 1K*

O Ailoot reserva um montante estimado antes de um pedido. Após o resultado, liquida o custo final com base na utilização medida. No streaming, a liquidação usa o registo final de utilização. [Como funcionam a reserva e a liquidação →](https://ailoot.ai/docs/pt-pt/billing/reserve/)

#### Detalhes da tarifa de referência

As tabelas de referência do modelo não alteram a seleção do método, as cotações ou os custos. Os custos ativos usam as tarifas do método Ailoot selecionado.

Tabelas de referência do modelo

#### Preços por configuração

Associe cada custo às condições apresentadas. Use uma única tarifa para cada conjunto de configurações alternativas.

| Configuração | Tabela de tarifas | Tokens de contexto, mais de | Tokens de contexto, até ao limite inclusive | Custo |
| --- | --- | --- | --- | --- |
| ConfiguraçãoOpenAI Chat · Tarifas de base por token | Tabela de tarifasTarifa base | Tokens de contexto, mais de— | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoOpenAI Chat · Escalão 1 por comprimento do pedido | Tabela de tarifas— | Tokens de contexto, mais de0 | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoAnthropic Messages · Tarifas de base por token | Tabela de tarifasTarifa base | Tokens de contexto, mais de— | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoAnthropic Messages · Escalão 1 por comprimento do pedido | Tabela de tarifas— | Tokens de contexto, mais de0 | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |

### Exemplos de pedidos

#### Ailoot · OpenAI Responses

Exemplo de textoPython SDKNode.js SDKStreaming em Python

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "glm-latest", "input": ""}')
f=Path(os.environ["AILOOT_TEXT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 source material")
text=f.read_text(encoding="utf-8")
if not text.strip():raise SystemExit("Source material must contain text")
p["input"]="Summarize this material and quote supporting source passages.\n\n"+text
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/responses \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(json.loads(Path("result.json").read_text(encoding="utf-8")))
PY_RESULT
```

```python
from openai import OpenAI
import os

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client = OpenAI(base_url="https://api.ailoot.ai/v1", api_key=os.environ["AILOOT_API_KEY"], max_retries=0)
resp = client.responses.create(model="glm-latest", input="Explain the difference between an observation and a hypothesis in three sentences.")
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(resp.to_dict(mode="json"))
```

```js
import OpenAI from "openai";

if (!process.env.AILOOT_API_KEY?.trim()) throw new Error("Set AILOOT_API_KEY before making a request");
const client = new OpenAI({ baseURL: "https://api.ailoot.ai/v1", apiKey: process.env.AILOOT_API_KEY, maxRetries: 0 });
const resp = await client.responses.create({ model: "glm-latest", input: "Explain the difference between an observation and a hypothesis in three sentences." });
import { writeFileSync } from "node:fs";

function saveResult(data, stem = "result") {
  writeFileSync(stem + ".json", JSON.stringify(data, null, 2));
  console.log(JSON.stringify(data, null, 2));
  const saveBlob = (encoded, suffix, label) => {
    const raw = Buffer.from(encoded, "base64");
    const ext = raw.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10])) ? "png" : raw[0]===255 && raw[1]===216 ? "jpg" : raw.subarray(0,4).toString()==="RIFF" && raw.subarray(8,12).toString()==="WEBP" ? "webp" : suffix;
    const file = `${stem}-${label}.${ext}`;
    writeFileSync(file, raw); console.log("Saved", file);
  };
  for (const [i, block] of (data.content || []).entries()) console.log("Content", i, JSON.stringify(block));
  for (const choice of data.choices || []) console.log("Choice", choice.index, JSON.stringify(choice.message || choice.delta || {}));
  for (const [i, item] of (data.output || []).entries()) {
    console.log("Output", i, JSON.stringify(item));
    if (item.type === "image_generation_call" && item.result) saveBlob(item.result, item.output_format || "bin", `output-${i}`);
  }
  for (const [ci, candidate] of (data.candidates || []).entries()) {
    for (const [pi, part] of (candidate.content?.parts || []).entries()) {
      console.log("Candidate/part", ci, pi, JSON.stringify(part));
      const blob = part.inlineData || part.inline_data;
      if (blob?.data) {
        const mime = blob.mimeType || blob.mime_type;
        const suffix = ({"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"})[mime] || "bin";
        saveBlob(blob.data, suffix, `candidate-${ci}-part-${pi}`);
      }
    }
  }
}

saveResult(resp);
```

```python
from openai import OpenAI
import os
from pathlib import Path
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
with client.responses.stream(model="glm-latest", input="Explain the difference between an observation and a hypothesis in three sentences.") as stream:
    with Path("stream-events.jsonl").open("w",encoding="utf-8") as log:
        for event in stream:
            payload=event.to_dict(mode="json")
            log.write(json.dumps(payload,ensure_ascii=False)+"\n"); log.flush()
            print(json.dumps(payload,ensure_ascii=False))
    final=stream.get_final_response()
    save_result(final.to_dict(mode="json"),"stream-result")
```

### Receber e guardar os resultados

#### Ailoot · OpenAI Responses

json ou SSE

##### Guardar todos os resultados concluídos

Guarde cada resposta, ficheiro e parte de conteúdo devolvidos na íntegra.

Conserve cada elemento de saída e parte de conteúdo, o call\_id real da função, o raciocínio cifrado e os dados de utilização. Em streaming, mantenha a identidade completa dos eventos e elementos.

##### Se for necessário verificar a resposta original

Conserve os ID e cabeçalhos de pedido/resposta. Não é fornecido um URL genérico para obter uma tarefa textual.

Campos da resposta

| Campo | Tipo |
| --- | --- |
| Campo`id` | Tipostring |
| Campo`status` | Tipostring |
| Campo`output[]` | Tipomessage\|reasoning\|function\_call\|other item |
| Campo`output[].content[]` | Tipocontent part |
| Campo`usage` | Tipoobject |

Erros e passos seguintes

| Resposta | Condição | Passo seguinte |
| --- | --- | --- |
| Resposta400 · `invalid_request_error` | CondiçãoCampos obrigatórios, representação do material ou valor do parâmetro inválidos | Passo seguinteCorrija os campos indicados antes de um novo pedido de criação. |

### Aliases

#### Aliases do modelo

<strong>Ailoot</strong> [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=responses), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=responses), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=responses), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=responses), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=responses), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=responses)
**Ailoot Ultra** [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3), [`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest)

#### Aliases dos caminhos dos métodos

`/chat/completions`

#### IDs de chamada relacionados

[`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=responses), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=responses), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=responses), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=responses), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=responses), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=responses), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3)

**Ailoot · OpenAI Chat** `POST /v1/chat/completions` `glm-latest`

[`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=chat)

Z.ai /`glm-latest`

ID do modelo

- `glm-5.3`
- `glm`
- `glm-5`
- `glm-5.1`
- `glm-5.2`
- `glm-latest`

### Introdução

Z.ai GLM 5.3 é um modelo de raciocínio textual para engenharia de software complexa, trabalho em terminal e agentes de longa duração. Suporta um contexto de 1M tokens documentado pelo fabricante, até 128K tokens de saída, chamada de funções e esforço de raciocínio low/high/max, mantendo o raciocínio sempre ativado.

Entradas aceites

Texto

Resultados

Texto

### Disponível no Ailoot · entradas e métodos

**Ailoot · OpenAI Chat** `POST /v1/chat/completions`

Entrada

`text`

Saída

`text`

Contexto

1 000 000 tokens

Saída máxima

131 072 tokens

Formato de saída

json ou SSE

| Campo | Tipo | Requisito | Valores e limites | Predefinição |
| --- | --- | --- | --- | --- |
| Campo`model` | Tipo`string` | RequisitoObrigatório | Valores e limites glm-latest | Predefinição— |
| Campo`messages` | Tipo`message[]` | RequisitoObrigatório | Valores e limites Número mínimo de elementos: 1 | Predefinição— |
| Campo`messages[].role` | Tipo`string` | RequisitoObrigatório | Valores e limites Exemplos: system, user, assistant, tool, function Condições: Estes papéis são representados explicitamente pelos tipos de compatibilidade do código-fonte; o conjunto exato de papéis continua específico do modelo. Depende do modelo | Predefinição— |
| Campo`messages[].content` | Tipo`string\|content_part[]\|null` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`messages[].tool_calls` | Tipo`tool_call[]` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`messages[].tool_call_id` | Tipo`string` | RequisitoOpcional | Valores e limites Aplica-se quando: role=tool; use o ID realmente devolvido | Predefinição— |
| Campo`messages[].name` | Tipo`string` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`messages[].reasoning_content` | Tipo`string` | RequisitoOpcional | Valores e limites Aplica-se quando: Reintroduza o raciocínio realmente devolvido quando este modelo o utiliza | Predefinição— |
| Campo`messages[].reasoning_details` | Tipo`object\|array` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`max_tokens` | Tipo`integer` | RequisitoOpcional | Valores e limites Mínimo: 1 Depende do modelo | Predefinição— |
| Campo`max_completion_tokens` | Tipo`integer` | RequisitoOpcional | Valores e limites Mínimo: 1 Depende do modelo | Predefinição— |
| Campo`stream` | Tipo`boolean` | RequisitoOpcional | Valores e limites | Predefiniçãofalse |
| Campo`stream_options.include_usage` | Tipo`boolean` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`temperature` | Tipo`number` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`top_p` | Tipo`number` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`stop` | Tipo`string\|string[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tools` | Tipo`function_tool[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tools[].type` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tools[].function.name` | Tipo`string` | RequisitoObrigatório | Valores e limites Aplica-se quando: Função fornecida como ferramenta | Predefinição— |
| Campo`tools[].function.description` | Tipo`string` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`tools[].function.parameters` | Tipo`JSON_schema` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`tool_choice` | Tipo`string\|object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`parallel_tool_calls` | Tipo`boolean` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`response_format` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`reasoning_effort` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`reasoning` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`service_tier` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`instructions` | Tipo`string` | RequisitoOpcional | Valores e limites Campo de compatibilidade | Predefinição— |
| Campo`functions` | Tipo`function[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`function_call` | Tipo`string\|object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`prompt_cache_options` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |

Combinações de materiais de entrada

**Texto** · Texto UTF8

`messages[].content`

Parâmetros e ciclo de vida do método

| Parâmetro | Contrato |
| --- | --- |
| Parâmetro`material_types` | Contratotext |
| Parâmetro`required` | Contratomodel, messages |
| Parâmetro`optional_controls` | Contratonull |
| Parâmetro`content_type` | Contratoapplication/json |
| Parâmetro`text_file_material` | ContratoConteúdo UTF-8 real inserido como texto; ID de ficheiros/URLs precisam de suporte separado e exato |

Ciclo de vida: `exact retained published method`

As estruturas dos métodos e os ID são exatos; a capacidade do fornecedor é distinta da admissão dos pedidos.

### Tarifários

#### Tarifas dos métodos Ailoot

Entrada

0,0014 US$ */ 1K*

Saída

0,0044 US$ */ 1K*

Leitura da cache

≈0,00026 US$ */ 1K*

O Ailoot reserva um montante estimado antes de um pedido. Após o resultado, liquida o custo final com base na utilização medida. No streaming, a liquidação usa o registo final de utilização. [Como funcionam a reserva e a liquidação →](https://ailoot.ai/docs/pt-pt/billing/reserve/)

#### Detalhes da tarifa de referência

As tabelas de referência do modelo não alteram a seleção do método, as cotações ou os custos. Os custos ativos usam as tarifas do método Ailoot selecionado.

Tabelas de referência do modelo

#### Preços por configuração

Associe cada custo às condições apresentadas. Use uma única tarifa para cada conjunto de configurações alternativas.

| Configuração | Tabela de tarifas | Tokens de contexto, mais de | Tokens de contexto, até ao limite inclusive | Custo |
| --- | --- | --- | --- | --- |
| ConfiguraçãoOpenAI Chat · Tarifas de base por token | Tabela de tarifasTarifa base | Tokens de contexto, mais de— | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoOpenAI Chat · Escalão 1 por comprimento do pedido | Tabela de tarifas— | Tokens de contexto, mais de0 | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoAnthropic Messages · Tarifas de base por token | Tabela de tarifasTarifa base | Tokens de contexto, mais de— | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoAnthropic Messages · Escalão 1 por comprimento do pedido | Tabela de tarifas— | Tokens de contexto, mais de0 | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |

### Exemplos de pedidos

#### Ailoot · OpenAI Chat

Exemplo de textoPython SDKNode.js SDKStreaming em Python

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "glm-latest", "messages": []}')
f=Path(os.environ["AILOOT_TEXT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 source material")
text=f.read_text(encoding="utf-8")
if not text.strip():raise SystemExit("Source material must contain text")
p["messages"]=[{"role":"user","content":"Summarize this material and quote supporting source passages.\n\n"+text}]
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/chat/completions \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
print(json.dumps(json.loads(Path("result.json").read_text()),ensure_ascii=False,indent=2))
PY_RESULT
```

```python
from openai import OpenAI
import os

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client = OpenAI(base_url="https://api.ailoot.ai/v1", api_key=os.environ["AILOOT_API_KEY"], max_retries=0)
resp = client.chat.completions.create(
    model="glm-latest",
    messages=[{"role": "user", "content": "Explain the difference between an observation and a hypothesis in three sentences."}],
)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(resp.to_dict(mode="json"))
```

```js
import OpenAI from "openai";

if (!process.env.AILOOT_API_KEY?.trim()) throw new Error("Set AILOOT_API_KEY before making a request");
const client = new OpenAI({ baseURL: "https://api.ailoot.ai/v1", apiKey: process.env.AILOOT_API_KEY, maxRetries: 0 });
const resp = await client.chat.completions.create({
  model: "glm-latest",
  messages: [{ role: "user", content: "Explain the difference between an observation and a hypothesis in three sentences." }],
});
import { writeFileSync } from "node:fs";

function saveResult(data, stem = "result") {
  writeFileSync(stem + ".json", JSON.stringify(data, null, 2));
  console.log(JSON.stringify(data, null, 2));
  const saveBlob = (encoded, suffix, label) => {
    const raw = Buffer.from(encoded, "base64");
    const ext = raw.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10])) ? "png" : raw[0]===255 && raw[1]===216 ? "jpg" : raw.subarray(0,4).toString()==="RIFF" && raw.subarray(8,12).toString()==="WEBP" ? "webp" : suffix;
    const file = `${stem}-${label}.${ext}`;
    writeFileSync(file, raw); console.log("Saved", file);
  };
  for (const [i, block] of (data.content || []).entries()) console.log("Content", i, JSON.stringify(block));
  for (const choice of data.choices || []) console.log("Choice", choice.index, JSON.stringify(choice.message || choice.delta || {}));
  for (const [i, item] of (data.output || []).entries()) {
    console.log("Output", i, JSON.stringify(item));
    if (item.type === "image_generation_call" && item.result) saveBlob(item.result, item.output_format || "bin", `output-${i}`);
  }
  for (const [ci, candidate] of (data.candidates || []).entries()) {
    for (const [pi, part] of (candidate.content?.parts || []).entries()) {
      console.log("Candidate/part", ci, pi, JSON.stringify(part));
      const blob = part.inlineData || part.inline_data;
      if (blob?.data) {
        const mime = blob.mimeType || blob.mime_type;
        const suffix = ({"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"})[mime] || "bin";
        saveBlob(blob.data, suffix, `candidate-${ci}-part-${pi}`);
      }
    }
  }
}

saveResult(resp);
```

```python
from openai import OpenAI
import os
from pathlib import Path

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

with client.chat.completions.stream(model='glm-latest',messages=[{"role":"user","content":"Explain observations and hypotheses in three sentences."}]) as stream:
    with Path("stream-events.jsonl").open("w",encoding="utf-8") as log:
        for event in stream:
            payload=event.to_dict(mode="json")
            log.write(json.dumps(payload,ensure_ascii=False)+"\n"); log.flush()
            print(json.dumps(payload,ensure_ascii=False))
    final=stream.get_final_completion()
    save_result(final.to_dict(mode="json"),"stream-result")
```

### Receber e guardar os resultados

#### Ailoot · OpenAI Chat

json ou SSE

##### Guardar todos os resultados concluídos

Guarde cada resposta, ficheiro e parte de conteúdo devolvidos na íntegra.

Conserve cada opção com o conteúdo, as chamadas de ferramentas e o raciocínio. Em SSE, junte os deltas por índice de opção e ferramenta e mantenha o motivo final de conclusão e os dados de utilização.

##### Se for necessário verificar a resposta original

Conserve os ID e cabeçalhos de pedido/resposta. Não é fornecido um URL genérico para obter uma tarefa textual.

Campos da resposta

| Campo | Tipo |
| --- | --- |
| Campo`choices[].index` | Tipointeger |
| Campo`choices[].message.content` | Tipostring\|null |
| Campo`choices[].message.tool_calls` | Tipotool\_call\[\] |
| Campo`choices[].message.reasoning_content` | Tipostring |
| Campo`choices[].message.reasoning_details` | Tipoobject\|array |
| Campo`choices[].finish_reason` | Tipostring\|null |
| Campo`usage` | Tipoobject |

Erros e passos seguintes

| Resposta | Condição | Passo seguinte |
| --- | --- | --- |
| Resposta400 · `invalid_request_error` | CondiçãoCampos obrigatórios, representação do material ou valor do parâmetro inválidos | Passo seguinteCorrija os campos indicados antes de um novo pedido de criação. |

### Aliases

#### Aliases do modelo

<strong>Ailoot</strong> [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=chat), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=chat), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=chat), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=chat), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=chat), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=chat)
**Ailoot Ultra** [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3&fmt=chat), [`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=chat), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=chat)

#### Aliases dos caminhos dos métodos

`/chat/completions`

#### IDs de chamada relacionados

[`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=chat), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=chat), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=chat), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=chat), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=chat), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=chat), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=chat), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=chat), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3&fmt=chat)

**Ailoot Ultra · OpenAI Chat** `POST /v1/chat/completions` `z-ai/glm-5.3`

[`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=chat)

Z.ai /`z-ai/glm-5.3`

ID do modelo

- `glm-5.3`
- `z-ai/glm-5.3`
- `~z-ai/glm-latest`

### Introdução

Z.ai GLM 5.3 é um modelo de raciocínio textual para engenharia de software complexa, trabalho em terminal e agentes de longa duração. Suporta um contexto de 1M tokens documentado pelo fabricante, até 128K tokens de saída, chamada de funções e esforço de raciocínio low/high/max, mantendo o raciocínio sempre ativado.

Entradas aceites

Texto

Resultados

Texto

### Disponível no Ailoot · entradas e métodos

**Ailoot Ultra · OpenAI Chat** `POST /v1/chat/completions`

Entrada

`text`

Saída

`text`

Formato de saída

json ou SSE

| Campo | Tipo | Requisito | Valores e limites | Predefinição |
| --- | --- | --- | --- | --- |
| Campo`model` | Tipo`string` | RequisitoObrigatório | Valores e limites z-ai/glm-5.3 | Predefinição— |
| Campo`messages` | Tipo`message[]` | RequisitoObrigatório | Valores e limites Número mínimo de elementos: 1 | Predefinição— |
| Campo`messages[].role` | Tipo`string` | RequisitoObrigatório | Valores e limites Exemplos: system, user, assistant, tool, function Condições: Estes papéis são representados explicitamente pelos tipos de compatibilidade do código-fonte; o conjunto exato de papéis continua específico do modelo. Depende do modelo | Predefinição— |
| Campo`messages[].content` | Tipo`string\|content_part[]\|null` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`messages[].tool_calls` | Tipo`tool_call[]` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`messages[].tool_call_id` | Tipo`string` | RequisitoOpcional | Valores e limites Aplica-se quando: role=tool; use o ID realmente devolvido | Predefinição— |
| Campo`messages[].name` | Tipo`string` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`messages[].reasoning_content` | Tipo`string` | RequisitoOpcional | Valores e limites Aplica-se quando: Reintroduza o raciocínio realmente devolvido quando este modelo o utiliza | Predefinição— |
| Campo`messages[].reasoning_details` | Tipo`object\|array` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`max_tokens` | Tipo`integer` | RequisitoOpcional | Valores e limites Mínimo: 1 Depende do modelo | Predefinição— |
| Campo`max_completion_tokens` | Tipo`integer` | RequisitoOpcional | Valores e limites Mínimo: 1 Depende do modelo | Predefinição— |
| Campo`stream` | Tipo`boolean` | RequisitoOpcional | Valores e limites | Predefiniçãofalse |
| Campo`stream_options.include_usage` | Tipo`boolean` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`temperature` | Tipo`number` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`top_p` | Tipo`number` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`stop` | Tipo`string\|string[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tools` | Tipo`function_tool[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tools[].type` | Tipo`string` | RequisitoOpcional | Valores e limites function Depende do modelo | Predefinição— |
| Campo`tools[].function.name` | Tipo`string` | RequisitoObrigatório | Valores e limites Aplica-se quando: Função fornecida como ferramenta | Predefinição— |
| Campo`tools[].function.description` | Tipo`string` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`tools[].function.parameters` | Tipo`JSON_schema` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`tool_choice` | Tipo`string\|object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`parallel_tool_calls` | Tipo`boolean` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`response_format` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`reasoning_effort` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`reasoning` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`service_tier` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`instructions` | Tipo`string` | RequisitoOpcional | Valores e limites Campo de compatibilidade | Predefinição— |
| Campo`functions` | Tipo`function[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`function_call` | Tipo`string\|object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`prompt_cache_options` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`modalities` | Tipo`string[]` | RequisitoOpcional | Valores e limites text | Predefinição— |
| Campo`provider` | Tipo`object` | RequisitoOpcional | Valores e limites Condições: provider.options é rejeitado nesta rota textual Ultra | Predefinição— |
| Campo`cache_control.ttl` | Tipo`string` | RequisitoOpcional | Valores e limites Condições: 1h é rejeitado nos locais efetivos da cache de prompts | Predefinição— |

Combinações de materiais de entrada

**Texto** · Texto UTF8

`messages[].content`

Parâmetros e ciclo de vida do método

| Parâmetro | Contrato |
| --- | --- |
| Parâmetro`content_type` | Contratoapplication/json |
| Parâmetro`required` | Contratomodel, messages |
| Parâmetro`material_types` | Contratotext |
| Parâmetro`messages` | ContratoLista de mensagens com estrutura role/content |
| Parâmetro`file_material` | ContratoDocumento UTF-8 real inserido como texto literal; nenhum ID de ficheiro inferido |
| Parâmetro`optional_controls` | Contratostream, temperature, top\_p, stop, max\_tokens, max\_completion\_tokens, reasoning, response\_format, tools, tool\_choice |
| Parâmetro`control_scope` | ContratoEspecífico do modelo; as ferramentas de funções do utilizador diferem das ferramentas alojadas |
| Parâmetro`output_modalities` | Contratotext |
| Parâmetro`hosted_operations` | Contratofalse |
| Parâmetro`multimodal_input_binding` | Contratonull |

Ciclo de vida: `synchronous_or_streamed`

Envie o ID exato do modelo com messages.

O comprimento do contexto não é um limite de saída.

Um ficheiro de texto pode fornecer texto literal; as entradas de imagem/áudio/objeto de ficheiro exigem uma associação exata.

### Tarifários

As referências tarifárias não acrescentam opções ao pedido. Os parâmetros suportados constam do método selecionado.

Modo rápido

Tarifa normal Quando o modo rápido está selecionado

Modo flex

Tarifa normal Quando o modo flex está selecionado

Esforço máximo de raciocínio

Tarifa normal Quando o esforço máximo de raciocínio usa o ajuste predefinido (default)

Esforço de raciocínio · elevado

Tarifa normal Quando o esforço de raciocínio é elevado

Esforço de raciocínio · baixo

Tarifa normal Quando o esforço de raciocínio é baixo

Esforço de raciocínio · máximo

Tarifa normal Quando o esforço de raciocínio é máximo

#### Tarifas Ailoot

#### Preços por configuração

Associe cada custo às condições apresentadas. Use uma única tarifa para cada conjunto de configurações alternativas.

| Configuração | Tabela de tarifas | Tokens de contexto, mais de | Tokens de contexto, até ao limite inclusive | Custo |
| --- | --- | --- | --- | --- |
| ConfiguraçãoTarifas base dos tokens | Tabela de tarifasTarifa base | Tokens de contexto, mais de— | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoEscalão 1 por comprimento do pedido | Tabela de tarifas— | Tokens de contexto, mais de0 | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |

O Ailoot reserva um montante estimado antes de um pedido. Após o resultado, liquida o custo final com base na utilização medida. No streaming, a liquidação usa o registo final de utilização. [Como funcionam a reserva e a liquidação →](https://ailoot.ai/docs/pt-pt/billing/reserve/)

### Exemplos de pedidos

#### Ailoot Ultra · OpenAI Chat

curlPython SDKStreaming em Python

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "z-ai/glm-5.3", "messages": [{"role": "user", "content": "Explain the difference between an observation and a hypothesis in three sentences."}]}')

Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/chat/completions \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
r=json.loads(Path("result.json").read_text())
for x in r.get("choices",[]):
    if x.get("message",{}).get("content"): print(x["message"]["content"])
PY_RESULT
```

```python
from openai import OpenAI
import os

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
result=client.chat.completions.create(model='z-ai/glm-5.3',messages=[{"role":"user","content":"Explain observations and hypotheses in three sentences."}])
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(result.to_dict(mode="json"))
```

```python
from openai import OpenAI
import os
from pathlib import Path

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

with client.chat.completions.stream(model='z-ai/glm-5.3',messages=[{"role":"user","content":"Explain observations and hypotheses in three sentences."}]) as stream:
    with Path("stream-events.jsonl").open("w",encoding="utf-8") as log:
        for event in stream:
            payload=event.to_dict(mode="json")
            log.write(json.dumps(payload,ensure_ascii=False)+"\n"); log.flush()
            print(json.dumps(payload,ensure_ascii=False))
    final=stream.get_final_completion()
    save_result(final.to_dict(mode="json"),"stream-result")
```

### Receber e guardar os resultados

#### Ailoot Ultra · OpenAI Chat

json ou SSE

##### Guardar todos os resultados concluídos

Guarde cada resposta, ficheiro e parte de conteúdo devolvidos na íntegra.

Conserve cada opção com o conteúdo, as chamadas de ferramentas e o raciocínio. Em SSE, junte os deltas por índice de opção e ferramenta e mantenha o motivo final de conclusão e os dados de utilização.

##### Se for necessário verificar a resposta original

Conserve os ID e cabeçalhos de pedido/resposta. Não é fornecido um URL genérico para obter uma tarefa textual.

Campos da resposta

| Campo | Tipo |
| --- | --- |
| Campo`choices[].index` | Tipointeger |
| Campo`choices[].message.content` | Tipostring\|null |
| Campo`choices[].message.tool_calls` | Tipotool\_call\[\] |
| Campo`choices[].message.reasoning_content` | Tipostring |
| Campo`choices[].message.reasoning_details` | Tipoobject\|array |
| Campo`choices[].finish_reason` | Tipostring\|null |
| Campo`usage` | Tipoobject |

Erros e passos seguintes

| Resposta | Condição | Passo seguinte |
| --- | --- | --- |
| Resposta400 · `invalid_request_error` | CondiçãoCampos obrigatórios, representação do material ou valor do parâmetro inválidos | Passo seguinteCorrija os campos indicados antes de um novo pedido de criação. |

### Aliases

#### Aliases do modelo

<strong>Ailoot</strong> [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=chat), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=chat), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=chat), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=chat), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=chat), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=chat)
**Ailoot Ultra** [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3&fmt=chat), [`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=chat), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=chat)

#### Aliases dos caminhos dos métodos

`/chat/completions`

#### IDs de chamada relacionados

[`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=chat), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=chat), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=chat), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=chat), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=chat), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=chat), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=chat), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=chat), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3&fmt=chat)

**Ailoot Ultra · Anthropic Messages** `POST /v1/messages` `z-ai/glm-5.3`

[`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=messages)

Z.ai /`z-ai/glm-5.3`

ID do modelo

- `glm-5.3`
- `z-ai/glm-5.3`
- `~z-ai/glm-latest`

### Introdução

Z.ai GLM 5.3 é um modelo de raciocínio textual para engenharia de software complexa, trabalho em terminal e agentes de longa duração. Suporta um contexto de 1M tokens documentado pelo fabricante, até 128K tokens de saída, chamada de funções e esforço de raciocínio low/high/max, mantendo o raciocínio sempre ativado.

Entradas aceites

Texto

Resultados

json · sse

### Disponível no Ailoot · entradas e métodos

**Ailoot Ultra · Anthropic Messages** `POST /v1/messages`

Entrada

`text`

Saída

`json`, `sse`

Formato de saída

JSON ou SSE

| Campo | Tipo | Requisito | Valores e limites | Predefinição |
| --- | --- | --- | --- | --- |
| Campo`model` | Tipo`string` | RequisitoObrigatório | Valores e limites z-ai/glm-5.3 | Predefinição— |
| Campo`messages` | Tipo`message[]` | RequisitoObrigatório | Valores e limites | Predefinição— |
| Campo`messages[].role` | Tipo`string` | RequisitoObrigatório | Valores e limites user, assistant | Predefinição— |
| Campo`messages[].content` | Tipo`string` | RequisitoObrigatório | Valores e limites | Predefinição— |
| Campo`max_tokens` | Tipo`integer` | RequisitoObrigatório | Valores e limites | Predefinição— |
| Campo`stream` | Tipo`boolean` | RequisitoOpcional | Valores e limites | Predefiniçãofalse |

Combinações de materiais de entrada

**Texto** · Texto UTF-8

`Cadeia de caracteres messages[].content`

Parâmetros e ciclo de vida do método

| Parâmetro | Contrato |
| --- | --- |
| Parâmetro`content_type` | Contratoapplication/json |
| Parâmetro`required` | Contratomodel, messages, max\_tokens |
| Parâmetro`optional_controls` | Contratostream |
| Parâmetro`material_types` | Contratotext |
| Parâmetro`text_file_material` | ContratoLeia o documento UTF-8 real e coloque o texto na entrada indicada ou na cadeia de conteúdo da mensagem. |

Ciclo de vida: `synchronous_or_streamed`

### Tarifários

As referências tarifárias não acrescentam opções ao pedido. Os parâmetros suportados constam do método selecionado.

Modo rápido

Tarifa normal Quando o modo rápido está selecionado

Modo flex

Tarifa normal Quando o modo flex está selecionado

Esforço máximo de raciocínio

Tarifa normal Quando o esforço máximo de raciocínio usa o ajuste predefinido (default)

Esforço de raciocínio · elevado

Tarifa normal Quando o esforço de raciocínio é elevado

Esforço de raciocínio · baixo

Tarifa normal Quando o esforço de raciocínio é baixo

Esforço de raciocínio · máximo

Tarifa normal Quando o esforço de raciocínio é máximo

#### Tarifas Ailoot

#### Preços por configuração

Associe cada custo às condições apresentadas. Use uma única tarifa para cada conjunto de configurações alternativas.

| Configuração | Tabela de tarifas | Tokens de contexto, mais de | Tokens de contexto, até ao limite inclusive | Custo |
| --- | --- | --- | --- | --- |
| ConfiguraçãoTarifas base dos tokens | Tabela de tarifasTarifa base | Tokens de contexto, mais de— | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoEscalão 1 por comprimento do pedido | Tabela de tarifas— | Tokens de contexto, mais de0 | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |

O Ailoot reserva um montante estimado antes de um pedido. Após o resultado, liquida o custo final com base na utilização medida. No streaming, a liquidação usa o registo final de utilização. [Como funcionam a reserva e a liquidação →](https://ailoot.ai/docs/pt-pt/billing/reserve/)

### Exemplos de pedidos

#### Ailoot Ultra · Anthropic Messages

Corpo JSON mínimo completocurl · use o seu documento UTF-8Python · guarde o resultado completo

```json
{
  "model": "z-ai/glm-5.3",
  "max_tokens": 128,
  "messages": [
    {
      "role": "user",
      "content": "Summarize the incident report."
    }
  ],
  "stream": false
}
```

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 document}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json, os
from pathlib import Path

source_file = Path(os.environ['AILOOT_TEXT_FILE'])
if not source_file.is_file():
    raise SystemExit('Set AILOOT_TEXT_FILE to your actual UTF-8 document')
text = source_file.read_text(encoding='utf-8')
if not text.strip():
    raise SystemExit('Choose a document containing text')
payload = {'model': 'z-ai/glm-5.3', 'max_tokens': 128, 'messages': [{'role': 'user', 'content': 'Summarize the incident report.'}]}
payload['messages'][0]['content'] = 'Summarize this material and quote supporting source passages.\n\n' + text
Path('request.json').write_text(json.dumps(payload, ensure_ascii=False), encoding='utf-8')
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/messages \
  -H "x-api-key: $AILOOT_API_KEY" -H 'anthropic-version: 2023-06-01' -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path

result = json.loads(Path('result.json').read_text(encoding='utf-8'))
print(json.dumps(result, ensure_ascii=False, indent=2))
PY_RESULT
```

```python
import json, os
from pathlib import Path

source_file = Path(os.environ['AILOOT_TEXT_FILE'])
if not source_file.is_file():
    raise SystemExit('Set AILOOT_TEXT_FILE to your actual UTF-8 document')
text = source_file.read_text(encoding='utf-8')
if not text.strip():
    raise SystemExit('Choose a document containing text')
payload = {'model': 'z-ai/glm-5.3', 'max_tokens': 128, 'messages': [{'role': 'user', 'content': 'Summarize the incident report.'}]}
payload['messages'][0]['content'] = 'Summarize this material and quote supporting source passages.\n\n' + text
from urllib.request import Request, urlopen
from urllib.error import HTTPError

api_key = os.environ['AILOOT_API_KEY']
if not api_key.strip():
    raise SystemExit('Set AILOOT_API_KEY before making a request')
headers = {'x-api-key': 'PLACEHOLDER_KEY', 'anthropic-version': '2023-06-01', 'Content-Type': 'application/json'}
headers['x-api-key'] = api_key
request = Request('https://api.ailoot.ai/v1/messages', data=json.dumps(payload, ensure_ascii=False).encode('utf-8'), headers=headers, method='POST')
try:
    with urlopen(request, timeout=120) as response:
        raw = response.read()
        Path('response-headers.txt').write_text(str(response.headers), encoding='utf-8')
except HTTPError as error:
    Path('result.json').write_bytes(error.read())
    Path('response-headers.txt').write_text(str(error.headers), encoding='utf-8')
    raise
Path('result.json').write_bytes(raw)
import json
from pathlib import Path

result = json.loads(Path('result.json').read_text(encoding='utf-8'))
print(json.dumps(result, ensure_ascii=False, indent=2))
```

### Receber e guardar os resultados

#### Ailoot Ultra · Anthropic Messages

JSON ou SSE

##### Guardar todos os resultados concluídos

Guarde cada resposta, ficheiro e parte de conteúdo devolvidos na íntegra.

Conserve todos os blocos de conteúdo, as assinaturas de raciocínio e os ID reais de utilização de ferramentas. Junte todos os deltas de blocos SSE; o primeiro bloco de texto não é a saída completa.

##### Se for necessário verificar a resposta original

Conserve os ID e cabeçalhos de pedido/resposta. Não é fornecido um URL genérico para obter uma tarefa textual.

Campos da resposta

| Campo | Tipo |
| --- | --- |
| Campo`id` | Tipostring |
| Campo`model` | Tipostring |
| Campo`content[]` | Tipotext\|thinking\|tool\_use\|other content block |
| Campo`stop_reason` | Tipostring\|null |
| Campo`usage` | Tipoobject |

Erros e passos seguintes

| Resposta | Condição | Passo seguinte |
| --- | --- | --- |
| Resposta400 · `invalid_request_error` | CondiçãoCampos obrigatórios, representação do material ou valor do parâmetro inválidos | Passo seguinteCorrija os campos indicados antes de um novo pedido de criação. |

### Aliases

#### Aliases do modelo

<strong>Ailoot</strong> [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=messages), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=messages), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=messages), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=messages), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=messages), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=messages)
**Ailoot Ultra** [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3&fmt=messages), [`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=messages), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=messages)

#### Aliases dos caminhos dos métodos

`/chat/completions`

#### IDs de chamada relacionados

[`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=messages), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=messages), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=messages), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=messages), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=messages), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=messages), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=messages), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=messages), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3&fmt=messages)

**Ailoot Ultra · OpenAI Chat** `POST /v1/chat/completions` `~z-ai/glm-latest`

[`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=chat)

Z.ai /`~z-ai/glm-latest`

ID do modelo

- `glm-5.3`
- `z-ai/glm-5.3`
- `~z-ai/glm-latest`

### Introdução

Z.ai GLM 5.3 é um modelo de raciocínio textual para engenharia de software complexa, trabalho em terminal e agentes de longa duração. Suporta um contexto de 1M tokens documentado pelo fabricante, até 128K tokens de saída, chamada de funções e esforço de raciocínio low/high/max, mantendo o raciocínio sempre ativado.

Entradas aceites

Texto

Resultados

Texto

### Disponível no Ailoot · entradas e métodos

**Ailoot Ultra · OpenAI Chat** `POST /v1/chat/completions`

Entrada

`text`

Saída

`text`

Formato de saída

json ou SSE

| Campo | Tipo | Requisito | Valores e limites | Predefinição |
| --- | --- | --- | --- | --- |
| Campo`model` | Tipo`string` | RequisitoObrigatório | Valores e limites ~z-ai/glm-latest | Predefinição— |
| Campo`messages` | Tipo`message[]` | RequisitoObrigatório | Valores e limites Número mínimo de elementos: 1 | Predefinição— |
| Campo`messages[].role` | Tipo`string` | RequisitoObrigatório | Valores e limites Exemplos: system, user, assistant, tool, function Condições: Estes papéis são representados explicitamente pelos tipos de compatibilidade do código-fonte; o conjunto exato de papéis continua específico do modelo. Depende do modelo | Predefinição— |
| Campo`messages[].content` | Tipo`string\|content_part[]\|null` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`messages[].tool_calls` | Tipo`tool_call[]` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`messages[].tool_call_id` | Tipo`string` | RequisitoOpcional | Valores e limites Aplica-se quando: role=tool; use o ID realmente devolvido | Predefinição— |
| Campo`messages[].name` | Tipo`string` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`messages[].reasoning_content` | Tipo`string` | RequisitoOpcional | Valores e limites Aplica-se quando: Reintroduza o raciocínio realmente devolvido quando este modelo o utiliza | Predefinição— |
| Campo`messages[].reasoning_details` | Tipo`object\|array` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`max_tokens` | Tipo`integer` | RequisitoOpcional | Valores e limites Mínimo: 1 Depende do modelo | Predefinição— |
| Campo`max_completion_tokens` | Tipo`integer` | RequisitoOpcional | Valores e limites Mínimo: 1 Depende do modelo | Predefinição— |
| Campo`stream` | Tipo`boolean` | RequisitoOpcional | Valores e limites | Predefiniçãofalse |
| Campo`stream_options.include_usage` | Tipo`boolean` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`temperature` | Tipo`number` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`top_p` | Tipo`number` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`stop` | Tipo`string\|string[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tools` | Tipo`function_tool[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`tools[].type` | Tipo`string` | RequisitoOpcional | Valores e limites function Depende do modelo | Predefinição— |
| Campo`tools[].function.name` | Tipo`string` | RequisitoObrigatório | Valores e limites Aplica-se quando: Função fornecida como ferramenta | Predefinição— |
| Campo`tools[].function.description` | Tipo`string` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`tools[].function.parameters` | Tipo`JSON_schema` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`tool_choice` | Tipo`string\|object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`parallel_tool_calls` | Tipo`boolean` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`response_format` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`reasoning_effort` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`reasoning` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`service_tier` | Tipo`string` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`instructions` | Tipo`string` | RequisitoOpcional | Valores e limites Campo de compatibilidade | Predefinição— |
| Campo`functions` | Tipo`function[]` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`function_call` | Tipo`string\|object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`prompt_cache_options` | Tipo`object` | RequisitoOpcional | Valores e limites Depende do modelo | Predefinição— |
| Campo`modalities` | Tipo`string[]` | RequisitoOpcional | Valores e limites text | Predefinição— |
| Campo`provider` | Tipo`object` | RequisitoOpcional | Valores e limites Condições: provider.options é rejeitado nesta rota textual Ultra | Predefinição— |
| Campo`cache_control.ttl` | Tipo`string` | RequisitoOpcional | Valores e limites Condições: 1h é rejeitado nos locais efetivos da cache de prompts | Predefinição— |

Combinações de materiais de entrada

**Texto** · Texto UTF8

`messages[].content`

Parâmetros e ciclo de vida do método

| Parâmetro | Contrato |
| --- | --- |
| Parâmetro`content_type` | Contratoapplication/json |
| Parâmetro`required` | Contratomodel, messages |
| Parâmetro`material_types` | Contratotext |
| Parâmetro`messages` | ContratoLista de mensagens com estrutura role/content |
| Parâmetro`file_material` | ContratoDocumento UTF-8 real inserido como texto literal; nenhum ID de ficheiro inferido |
| Parâmetro`optional_controls` | Contratostream, temperature, top\_p, stop, max\_tokens, max\_completion\_tokens, reasoning, response\_format, tools, tool\_choice |
| Parâmetro`control_scope` | ContratoEspecífico do modelo; as ferramentas de funções do utilizador diferem das ferramentas alojadas |
| Parâmetro`output_modalities` | Contratotext |
| Parâmetro`hosted_operations` | Contratofalse |
| Parâmetro`multimodal_input_binding` | Contratonull |

Ciclo de vida: `synchronous_or_streamed`

Envie o ID exato do modelo com messages.

O comprimento do contexto não é um limite de saída.

Um ficheiro de texto pode fornecer texto literal; as entradas de imagem/áudio/objeto de ficheiro exigem uma associação exata.

### Tarifários

As referências tarifárias não acrescentam opções ao pedido. Os parâmetros suportados constam do método selecionado.

Modo rápido

Tarifa normal Quando o modo rápido está selecionado

Modo flex

Tarifa normal Quando o modo flex está selecionado

Esforço máximo de raciocínio

Tarifa normal Quando o esforço máximo de raciocínio usa o ajuste predefinido (default)

Esforço de raciocínio · elevado

Tarifa normal Quando o esforço de raciocínio é elevado

Esforço de raciocínio · baixo

Tarifa normal Quando o esforço de raciocínio é baixo

Esforço de raciocínio · máximo

Tarifa normal Quando o esforço de raciocínio é máximo

#### Tarifas Ailoot

#### Preços por configuração

Associe cada custo às condições apresentadas. Use uma única tarifa para cada conjunto de configurações alternativas.

| Configuração | Tabela de tarifas | Tokens de contexto, mais de | Tokens de contexto, até ao limite inclusive | Custo |
| --- | --- | --- | --- | --- |
| ConfiguraçãoTarifas base dos tokens | Tabela de tarifasTarifa base | Tokens de contexto, mais de— | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoEscalão 1 por comprimento do pedido | Tabela de tarifas— | Tokens de contexto, mais de0 | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |

O Ailoot reserva um montante estimado antes de um pedido. Após o resultado, liquida o custo final com base na utilização medida. No streaming, a liquidação usa o registo final de utilização. [Como funcionam a reserva e a liquidação →](https://ailoot.ai/docs/pt-pt/billing/reserve/)

### Exemplos de pedidos

#### Ailoot Ultra · OpenAI Chat

curlPython SDKStreaming em Python

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "~z-ai/glm-latest", "messages": [{"role": "user", "content": "Explain the difference between an observation and a hypothesis in three sentences."}]}')

Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/chat/completions \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
r=json.loads(Path("result.json").read_text())
for x in r.get("choices",[]):
    if x.get("message",{}).get("content"): print(x["message"]["content"])
PY_RESULT
```

```python
from openai import OpenAI
import os

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
result=client.chat.completions.create(model='~z-ai/glm-latest',messages=[{"role":"user","content":"Explain observations and hypotheses in three sentences."}])
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(result.to_dict(mode="json"))
```

```python
from openai import OpenAI
import os
from pathlib import Path

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

with client.chat.completions.stream(model='~z-ai/glm-latest',messages=[{"role":"user","content":"Explain observations and hypotheses in three sentences."}]) as stream:
    with Path("stream-events.jsonl").open("w",encoding="utf-8") as log:
        for event in stream:
            payload=event.to_dict(mode="json")
            log.write(json.dumps(payload,ensure_ascii=False)+"\n"); log.flush()
            print(json.dumps(payload,ensure_ascii=False))
    final=stream.get_final_completion()
    save_result(final.to_dict(mode="json"),"stream-result")
```

### Receber e guardar os resultados

#### Ailoot Ultra · OpenAI Chat

json ou SSE

##### Guardar todos os resultados concluídos

Guarde cada resposta, ficheiro e parte de conteúdo devolvidos na íntegra.

Conserve cada opção com o conteúdo, as chamadas de ferramentas e o raciocínio. Em SSE, junte os deltas por índice de opção e ferramenta e mantenha o motivo final de conclusão e os dados de utilização.

##### Se for necessário verificar a resposta original

Conserve os ID e cabeçalhos de pedido/resposta. Não é fornecido um URL genérico para obter uma tarefa textual.

Campos da resposta

| Campo | Tipo |
| --- | --- |
| Campo`choices[].index` | Tipointeger |
| Campo`choices[].message.content` | Tipostring\|null |
| Campo`choices[].message.tool_calls` | Tipotool\_call\[\] |
| Campo`choices[].message.reasoning_content` | Tipostring |
| Campo`choices[].message.reasoning_details` | Tipoobject\|array |
| Campo`choices[].finish_reason` | Tipostring\|null |
| Campo`usage` | Tipoobject |

Erros e passos seguintes

| Resposta | Condição | Passo seguinte |
| --- | --- | --- |
| Resposta400 · `invalid_request_error` | CondiçãoCampos obrigatórios, representação do material ou valor do parâmetro inválidos | Passo seguinteCorrija os campos indicados antes de um novo pedido de criação. |

### Aliases

#### Aliases do modelo

<strong>Ailoot</strong> [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=chat), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=chat), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=chat), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=chat), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=chat), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=chat)
**Ailoot Ultra** [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3&fmt=chat), [`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=chat), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=chat)

#### Aliases dos caminhos dos métodos

`/chat/completions`

#### IDs de chamada relacionados

[`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=chat), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=chat), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=chat), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=chat), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=chat), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=chat), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=chat), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=chat), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3&fmt=chat)

**Ailoot Ultra · Anthropic Messages** `POST /v1/messages` `~z-ai/glm-latest`

[`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=messages)

Z.ai /`~z-ai/glm-latest`

ID do modelo

- `glm-5.3`
- `z-ai/glm-5.3`
- `~z-ai/glm-latest`

### Introdução

Z.ai GLM 5.3 é um modelo de raciocínio textual para engenharia de software complexa, trabalho em terminal e agentes de longa duração. Suporta um contexto de 1M tokens documentado pelo fabricante, até 128K tokens de saída, chamada de funções e esforço de raciocínio low/high/max, mantendo o raciocínio sempre ativado.

Entradas aceites

Texto

Resultados

json · sse

### Disponível no Ailoot · entradas e métodos

**Ailoot Ultra · Anthropic Messages** `POST /v1/messages`

Entrada

`text`

Saída

`json`, `sse`

Formato de saída

JSON ou SSE

| Campo | Tipo | Requisito | Valores e limites | Predefinição |
| --- | --- | --- | --- | --- |
| Campo`model` | Tipo`string` | RequisitoObrigatório | Valores e limites ~z-ai/glm-latest | Predefinição— |
| Campo`messages` | Tipo`message[]` | RequisitoObrigatório | Valores e limites | Predefinição— |
| Campo`messages[].role` | Tipo`string` | RequisitoObrigatório | Valores e limites user, assistant | Predefinição— |
| Campo`messages[].content` | Tipo`string` | RequisitoObrigatório | Valores e limites | Predefinição— |
| Campo`max_tokens` | Tipo`integer` | RequisitoObrigatório | Valores e limites | Predefinição— |
| Campo`stream` | Tipo`boolean` | RequisitoOpcional | Valores e limites | Predefiniçãofalse |

Combinações de materiais de entrada

**Texto** · Texto UTF-8

`Cadeia de caracteres messages[].content`

Parâmetros e ciclo de vida do método

| Parâmetro | Contrato |
| --- | --- |
| Parâmetro`content_type` | Contratoapplication/json |
| Parâmetro`required` | Contratomodel, messages, max\_tokens |
| Parâmetro`optional_controls` | Contratostream |
| Parâmetro`material_types` | Contratotext |
| Parâmetro`text_file_material` | ContratoLeia o documento UTF-8 real e coloque o texto na entrada indicada ou na cadeia de conteúdo da mensagem. |

Ciclo de vida: `synchronous_or_streamed`

### Tarifários

As referências tarifárias não acrescentam opções ao pedido. Os parâmetros suportados constam do método selecionado.

Modo rápido

Tarifa normal Quando o modo rápido está selecionado

Modo flex

Tarifa normal Quando o modo flex está selecionado

Esforço máximo de raciocínio

Tarifa normal Quando o esforço máximo de raciocínio usa o ajuste predefinido (default)

Esforço de raciocínio · elevado

Tarifa normal Quando o esforço de raciocínio é elevado

Esforço de raciocínio · baixo

Tarifa normal Quando o esforço de raciocínio é baixo

Esforço de raciocínio · máximo

Tarifa normal Quando o esforço de raciocínio é máximo

#### Tarifas Ailoot

#### Preços por configuração

Associe cada custo às condições apresentadas. Use uma única tarifa para cada conjunto de configurações alternativas.

| Configuração | Tabela de tarifas | Tokens de contexto, mais de | Tokens de contexto, até ao limite inclusive | Custo |
| --- | --- | --- | --- | --- |
| ConfiguraçãoTarifas base dos tokens | Tabela de tarifasTarifa base | Tokens de contexto, mais de— | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoEscalão 1 por comprimento do pedido | Tabela de tarifas— | Tokens de contexto, mais de0 | Tokens de contexto, até ao limite inclusiveSem limite superior | Custo Entrada · Tokens de entrada **$0.0028** / 1K tokens Saída · Tokens de saída **$0.0088** / 1K tokens Entrada · Leitura da cache **$0.00052** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |

O Ailoot reserva um montante estimado antes de um pedido. Após o resultado, liquida o custo final com base na utilização medida. No streaming, a liquidação usa o registo final de utilização. [Como funcionam a reserva e a liquidação →](https://ailoot.ai/docs/pt-pt/billing/reserve/)

### Exemplos de pedidos

#### Ailoot Ultra · Anthropic Messages

Corpo JSON mínimo completocurl · use o seu documento UTF-8Python · guarde o resultado completo

```json
{
  "model": "~z-ai/glm-latest",
  "max_tokens": 128,
  "messages": [
    {
      "role": "user",
      "content": "Summarize the incident report."
    }
  ],
  "stream": false
}
```

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 document}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json, os
from pathlib import Path

source_file = Path(os.environ['AILOOT_TEXT_FILE'])
if not source_file.is_file():
    raise SystemExit('Set AILOOT_TEXT_FILE to your actual UTF-8 document')
text = source_file.read_text(encoding='utf-8')
if not text.strip():
    raise SystemExit('Choose a document containing text')
payload = {'model': '~z-ai/glm-latest', 'max_tokens': 128, 'messages': [{'role': 'user', 'content': 'Summarize the incident report.'}]}
payload['messages'][0]['content'] = 'Summarize this material and quote supporting source passages.\n\n' + text
Path('request.json').write_text(json.dumps(payload, ensure_ascii=False), encoding='utf-8')
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/messages \
  -H "x-api-key: $AILOOT_API_KEY" -H 'anthropic-version: 2023-06-01' -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path

result = json.loads(Path('result.json').read_text(encoding='utf-8'))
print(json.dumps(result, ensure_ascii=False, indent=2))
PY_RESULT
```

```python
import json, os
from pathlib import Path

source_file = Path(os.environ['AILOOT_TEXT_FILE'])
if not source_file.is_file():
    raise SystemExit('Set AILOOT_TEXT_FILE to your actual UTF-8 document')
text = source_file.read_text(encoding='utf-8')
if not text.strip():
    raise SystemExit('Choose a document containing text')
payload = {'model': '~z-ai/glm-latest', 'max_tokens': 128, 'messages': [{'role': 'user', 'content': 'Summarize the incident report.'}]}
payload['messages'][0]['content'] = 'Summarize this material and quote supporting source passages.\n\n' + text
from urllib.request import Request, urlopen
from urllib.error import HTTPError

api_key = os.environ['AILOOT_API_KEY']
if not api_key.strip():
    raise SystemExit('Set AILOOT_API_KEY before making a request')
headers = {'x-api-key': 'PLACEHOLDER_KEY', 'anthropic-version': '2023-06-01', 'Content-Type': 'application/json'}
headers['x-api-key'] = api_key
request = Request('https://api.ailoot.ai/v1/messages', data=json.dumps(payload, ensure_ascii=False).encode('utf-8'), headers=headers, method='POST')
try:
    with urlopen(request, timeout=120) as response:
        raw = response.read()
        Path('response-headers.txt').write_text(str(response.headers), encoding='utf-8')
except HTTPError as error:
    Path('result.json').write_bytes(error.read())
    Path('response-headers.txt').write_text(str(error.headers), encoding='utf-8')
    raise
Path('result.json').write_bytes(raw)
import json
from pathlib import Path

result = json.loads(Path('result.json').read_text(encoding='utf-8'))
print(json.dumps(result, ensure_ascii=False, indent=2))
```

### Receber e guardar os resultados

#### Ailoot Ultra · Anthropic Messages

JSON ou SSE

##### Guardar todos os resultados concluídos

Guarde cada resposta, ficheiro e parte de conteúdo devolvidos na íntegra.

Conserve todos os blocos de conteúdo, as assinaturas de raciocínio e os ID reais de utilização de ferramentas. Junte todos os deltas de blocos SSE; o primeiro bloco de texto não é a saída completa.

##### Se for necessário verificar a resposta original

Conserve os ID e cabeçalhos de pedido/resposta. Não é fornecido um URL genérico para obter uma tarefa textual.

Campos da resposta

| Campo | Tipo |
| --- | --- |
| Campo`id` | Tipostring |
| Campo`model` | Tipostring |
| Campo`content[]` | Tipotext\|thinking\|tool\_use\|other content block |
| Campo`stop_reason` | Tipostring\|null |
| Campo`usage` | Tipoobject |

Erros e passos seguintes

| Resposta | Condição | Passo seguinte |
| --- | --- | --- |
| Resposta400 · `invalid_request_error` | CondiçãoCampos obrigatórios, representação do material ou valor do parâmetro inválidos | Passo seguinteCorrija os campos indicados antes de um novo pedido de criação. |

### Aliases

#### Aliases do modelo

<strong>Ailoot</strong> [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=messages), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=messages), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=messages), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=messages), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=messages), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=messages)
**Ailoot Ultra** [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3&fmt=messages), [`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=messages), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=messages)

#### Aliases dos caminhos dos métodos

`/chat/completions`

#### IDs de chamada relacionados

[`z-ai/glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=messages), [`glm`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=messages), [`glm-5`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=messages), [`glm-5.1`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=messages), [`glm-5.2`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=messages), [`glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=messages), [`~z-ai/glm-latest`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=messages), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=messages), [`glm-5.3`](https://ailoot.ai/models/pt-pt/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3&fmt=messages)

FAQ · Z.ai: GLM 5.3

Que entradas e resultados estão disponíveis?

`POST /v1/messages` · `glm-5.3`: `text` → `text` `POST /v1/responses` · `glm-5.3`: `text` → `text` `POST /v1/chat/completions` · `glm-5.3`: `text` → `text` `POST /v1/chat/completions` · `glm-5.3`: `text` → `text` `POST /v1/messages` · `glm-5.3`: `text` → `json`, `sse` `POST /v1/messages` · `glm`: `text` → `text` `POST /v1/responses` · `glm`: `text` → `text` `POST /v1/chat/completions` · `glm`: `text` → `text` `POST /v1/messages` · `glm-5`: `text` → `text` `POST /v1/responses` · `glm-5`: `text` → `text` `POST /v1/chat/completions` · `glm-5`: `text` → `text` `POST /v1/messages` · `glm-5.1`: `text` → `text` `POST /v1/responses` · `glm-5.1`: `text` → `text` `POST /v1/chat/completions` · `glm-5.1`: `text` → `text` `POST /v1/messages` · `glm-5.2`: `text` → `text` `POST /v1/responses` · `glm-5.2`: `text` → `text` `POST /v1/chat/completions` · `glm-5.2`: `text` → `text` `POST /v1/messages` · `glm-latest`: `text` → `text` `POST /v1/responses` · `glm-latest`: `text` → `text` `POST /v1/chat/completions` · `glm-latest`: `text` → `text` `POST /v1/chat/completions` · `z-ai/glm-5.3`: `text` → `text` `POST /v1/messages` · `z-ai/glm-5.3`: `text` → `json`, `sse` `POST /v1/chat/completions` · `~z-ai/glm-latest`: `text` → `text` `POST /v1/messages` · `~z-ai/glm-latest`: `text` → `json`, `sse`

Que campos utiliza o pedido?

`POST /v1/messages` · `glm-5.3`: `model`, `messages`, `system`, `max_tokens`, `stream`, `metadata` `POST /v1/responses` · `glm-5.3`: `model`, `input`, `instructions`, `stream` `POST /v1/chat/completions` · `glm-5.3`: `model`, `messages`, `stream` `POST /v1/chat/completions` · `glm-5.3`: `model`, `messages`, `stream` `POST /v1/messages` · `glm-5.3`: `model`, `messages`, `max_tokens`, `stream` `POST /v1/messages` · `glm`: `model`, `messages`, `system`, `max_tokens`, `stream`, `metadata` `POST /v1/responses` · `glm`: `model`, `input`, `instructions`, `stream` `POST /v1/chat/completions` · `glm`: `model`, `messages`, `stream` `POST /v1/messages` · `glm-5`: `model`, `messages`, `system`, `max_tokens`, `stream`, `metadata` `POST /v1/responses` · `glm-5`: `model`, `input`, `instructions`, `stream` `POST /v1/chat/completions` · `glm-5`: `model`, `messages`, `stream` `POST /v1/messages` · `glm-5.1`: `model`, `messages`, `system`, `max_tokens`, `stream`, `metadata` `POST /v1/responses` · `glm-5.1`: `model`, `input`, `instructions`, `stream` `POST /v1/chat/completions` · `glm-5.1`: `model`, `messages`, `stream` `POST /v1/messages` · `glm-5.2`: `model`, `messages`, `system`, `max_tokens`, `stream`, `metadata` `POST /v1/responses` · `glm-5.2`: `model`, `input`, `instructions`, `stream` `POST /v1/chat/completions` · `glm-5.2`: `model`, `messages`, `stream` `POST /v1/messages` · `glm-latest`: `model`, `messages`, `system`, `max_tokens`, `stream`, `metadata` `POST /v1/responses` · `glm-latest`: `model`, `input`, `instructions`, `stream` `POST /v1/chat/completions` · `glm-latest`: `model`, `messages`, `stream` `POST /v1/chat/completions` · `z-ai/glm-5.3`: `model`, `messages`, `stream`, `modalities`, `provider` `POST /v1/messages` · `z-ai/glm-5.3`: `model`, `messages`, `max_tokens`, `stream` `POST /v1/chat/completions` · `~z-ai/glm-latest`: `model`, `messages`, `stream`, `modalities`, `provider` `POST /v1/messages` · `~z-ai/glm-latest`: `model`, `messages`, `max_tokens`, `stream`

Que limites se aplicam?

`POST /v1/messages` · `glm-5.3`: `ctx`: `1000000`; `max_out`: `131072`; `messages.min_items`: `1`; `max_tokens.minimum`: `1` `POST /v1/responses` · `glm-5.3`: `ctx`: `1000000`; `max_out`: `131072` `POST /v1/chat/completions` · `glm-5.3`: `ctx`: `1000000`; `max_out`: `131072`; `messages.min_items`: `1` `POST /v1/chat/completions` · `glm-5.3`: `messages.min_items`: `1` `POST /v1/messages` · `glm`: `ctx`: `1000000`; `max_out`: `131072`; `messages.min_items`: `1`; `max_tokens.minimum`: `1` `POST /v1/responses` · `glm`: `ctx`: `1000000`; `max_out`: `131072` `POST /v1/chat/completions` · `glm`: `ctx`: `1000000`; `max_out`: `131072`; `messages.min_items`: `1` `POST /v1/messages` · `glm-5`: `ctx`: `1000000`; `max_out`: `131072`; `messages.min_items`: `1`; `max_tokens.minimum`: `1` `POST /v1/responses` · `glm-5`: `ctx`: `1000000`; `max_out`: `131072` `POST /v1/chat/completions` · `glm-5`: `ctx`: `1000000`; `max_out`: `131072`; `messages.min_items`: `1` `POST /v1/messages` · `glm-5.1`: `ctx`: `1000000`; `max_out`: `131072`; `messages.min_items`: `1`; `max_tokens.minimum`: `1` `POST /v1/responses` · `glm-5.1`: `ctx`: `1000000`; `max_out`: `131072` `POST /v1/chat/completions` · `glm-5.1`: `ctx`: `1000000`; `max_out`: `131072`; `messages.min_items`: `1` `POST /v1/messages` · `glm-5.2`: `ctx`: `1000000`; `max_out`: `131072`; `messages.min_items`: `1`; `max_tokens.minimum`: `1` `POST /v1/responses` · `glm-5.2`: `ctx`: `1000000`; `max_out`: `131072` `POST /v1/chat/completions` · `glm-5.2`: `ctx`: `1000000`; `max_out`: `131072`; `messages.min_items`: `1` `POST /v1/messages` · `glm-latest`: `ctx`: `1000000`; `max_out`: `131072`; `messages.min_items`: `1`; `max_tokens.minimum`: `1` `POST /v1/responses` · `glm-latest`: `ctx`: `1000000`; `max_out`: `131072` `POST /v1/chat/completions` · `glm-latest`: `ctx`: `1000000`; `max_out`: `131072`; `messages.min_items`: `1` `POST /v1/chat/completions` · `z-ai/glm-5.3`: `messages.min_items`: `1` `POST /v1/chat/completions` · `~z-ai/glm-latest`: `messages.min_items`: `1`

Ligue o Ailoot ao Claude Code, OpenCode, Hermes ou à sua aplicação.

## A empresa e a sua carteira de projetos

A empresa e a sua carteira de projetos: milhões de clientes; vendas mensais na ordem dos milhares de milhões.

## Compre tokens com desconto.

Desconto por subscrição para trabalho regular. Códigos promocionais — até 50% na compra de tokens.

Subscrição

Escolha um plano com desconto para os pedidos regulares.

Código promocional até 50%

Introduza o código na compra. O preço é recalculado conforme a campanha em vigor.

Custos no histórico

O modelo, os tokens e o montante são guardados para cada pedido.

[Escolher subscrição](https://ailoot.ai/docs/pt-pt/billing/subscriptions/) · [Ver preços dos modelos](https://ailoot.ai/models/pt-pt/)

## Ligue a API ao produto que vende.

SaaS, aplicações e bots — ao abrigo da oferta e do contrato de licença Ailoot. Para revenda, peça uma licença de revendedor.

Aplicação comercial

Integre geração de texto, imagens, vídeo e som nas funcionalidades pagas do seu serviço.

Licença de revendedor

Envie uma descrição do projeto e do modelo de acesso. Peça condições escritas de utilização e revenda.

Documentos no site

A oferta, o contrato de licença e a política de tratamento de dados estão disponíveis antes da ligação.

[Pedir licença de revendedor](mailto:support@ailoot.ai) · [Oferta e contrato de licença](https://ailoot.ai/legal/offer?lang=pt-pt)

## Ailoot · A empresa e a sua carteira de projetos





A Ailoot assenta numa experiência operacional consolidada, numa ampla base de clientes, num serviço estável e no acompanhamento contínuo dos KPI.





A empresa e a sua carteira de projetos: milhões de clientes; vendas mensais na ordem dos milhares de milhões.





A Ailoot aplica essa experiência operacional ao acesso por API a funcionalidades de IA nos produtos dos clientes, agentes, aplicações e automatizações.
