Text
Referência da API GLM-5.3
Campos de requisição, raciocínio, ferramentas, streaming e uso do GLM-5.3, com exemplos completos de Chat, Responses e Messages.
GLM-5.3 aceita texto e retorna texto ou chamadas de ferramentas. Sempre raciocina, oferece os níveis low, high e max e permite até 131.072 tokens de saída. Use glm-5.3 para a opção Default. Seu grupo padrão é glm; glm-5.3:glm continua sendo uma seleção explícita desse mesmo grupo. Grupos adicionais usam seu próprio sufixo no modelo.
URL base: https://api.seedrouter.ai. Autentique com Authorization: Bearer $SEEDROUTER_API_KEY. Mantenha as credenciais no servidor. Messages também aceita o cabeçalho compatível x-api-key.
Esta referência segue o contrato Chat da Z.ai, o esquema Responses do fabricante e seu guia de compatibilidade Messages. Os limites específicos vêm do guia GLM-5.3. O alinhamento à documentação não comprova todos os comportamentos reais. Os testes de 29 de outubro de 2026 concluíram requisições de texto e streaming nos três formatos, chamadas de funções em Chat, saída em objeto JSON e continuação de resposta salva. Não foram comprovados acertos de cache, prazos explícitos de cache nem todos os controles de compatibilidade. Os campos de referência Messages abaixo são diferenciados dos campos GLM documentados pelo fabricante.
Especificação OpenAPI · Referência Markdown · Modelo e Playground · Guia de preços
Início rápido
Cada exemplo envia uma requisição Chat Completions. max_tokens: 2048 é um orçamento de exemplo, não o padrão. O raciocínio e a resposta visível compartilham esse orçamento; confira finish_reason antes de considerar a resposta completa.
curl https://api.seedrouter.ai/v1/chat/completions \
-H "Authorization: Bearer $SEEDROUTER_API_KEY" \
-H 'Content-Type: application/json' \
-d '{"model":"glm-5.3","messages":[{"role":"user","content":"Explain an idempotency key with one concrete example."}],"reasoning_effort":"low","max_tokens":2048}'import os
from openai import OpenAI
client = OpenAI(api_key=os.environ["SEEDROUTER_API_KEY"], base_url="https://api.seedrouter.ai/v1")
response = client.chat.completions.create(
model="glm-5.3",
messages=[{"role": "user", "content": "Explain an idempotency key with one concrete example."}],
max_tokens=2048,
extra_body={"reasoning_effort": "low"},
)
print(response.choices[0].message.content)
print(response.usage)import OpenAI from 'openai';
const client = new OpenAI({apiKey: process.env.SEEDROUTER_API_KEY, baseURL: 'https://api.seedrouter.ai/v1'});
const response = await client.chat.completions.create({
model: 'glm-5.3',
messages: [{role: 'user', content: 'Explain an idempotency key with one concrete example.'}],
reasoning_effort: 'low',
max_tokens: 2048,
});
console.log(response.choices[0].message.content);
console.log(response.usage);package main
import (
"bytes"
"fmt"
"io"
"net/http"
"os"
"time"
)
func main() {
body := []byte(`{"model":"glm-5.3","messages":[{"role":"user","content":"Explain an idempotency key with one concrete example."}],"reasoning_effort":"low","max_tokens":2048}`)
req, err := http.NewRequest("POST", "https://api.seedrouter.ai/v1/chat/completions", bytes.NewReader(body))
if err != nil { panic(err) }
req.Header.Set("Authorization", "Bearer " + os.Getenv("SEEDROUTER_API_KEY"))
req.Header.Set("Content-Type", "application/json")
client := &http.Client{Timeout: 3 * time.Minute}
res, err := client.Do(req)
if err != nil { panic(err) }
defer res.Body.Close()
data, err := io.ReadAll(res.Body)
if err != nil { panic(err) }
if res.StatusCode != http.StatusOK { panic(fmt.Sprintf("HTTP %d: %s", res.StatusCode, data)) }
fmt.Println(string(data))
}Chat Completions
POST /v1/chat/completions aceita 16 campos de nível superior. Os campos não aceitam null salvo indicação explícita. Campos opcionais podem ser omitidos; não envie null no lugar da omissão.
| Campo | Tipo | Obrigatório | Padrão e restrições |
|---|---|---|---|
model | string | Sim | glm-5.3 (Default) |
messages | array | Sim | Pelo menos uma mensagem; deve conter uma mensagem de usuário ou ferramenta |
do_sample | boolean | Não | true; false torna temperature e top_p ineficazes |
stream | boolean | Não | false |
thinking | object | Não | type: enabled; clear_thinking: true |
reasoning_effort | string | Não | low, high, max; padrão max |
temperature | number | Não | 0–1 inclusivo; padrão 1 |
top_p | number | Não | 0.01–1 inclusivo; padrão 0.95 |
max_tokens | integer | Não | 1–131072; sem padrão publicado para Chat |
tool_stream | boolean | Não | false; true exige stream: true |
tools | array | Não | Função, retrieval ou web_search; até 128 entradas |
tool_choice | string | Não | auto somente |
stop | string array | Não | Até quatro strings no esquema oficial; quatro foram aceitas em uma requisição real, mas a correspondência de parada não foi exercitada |
response_format | object | Não | type obrigatório: text ou json_object; padrão text |
request_id | string | Não | 6–64 caracteres; identificador exclusivo da requisição definido pelo cliente |
user_id | string | Não | 6–128 caracteres; evite informações pessoais |
Mensagens system e user exigem content em string. Uma mensagem assistant pode conter content em string, reasoning_content e tool_calls. Uma mensagem tool exige content e tool_call_id. Preserve exatamente o raciocínio histórico ao usar thinking.clear_thinking: false, incluindo a ordem das chamadas do assistente e dos resultados de ferramentas. Não é possível desativar o raciocínio.
Uma ferramenta de função usa {type:"function", function:{name, description, parameters}}. O nome contém de 1 a 64 letras ASCII, dígitos, sublinhados ou hífens. O esquema legível por máquina exige description e parameters; o texto menciona a omissão para funções sem parâmetros. Use a estrutura completa até que esse conflito seja resolvido. parameters é o JSON Schema da sua função; não é interpretado como conteúdo da mensagem.
Uma ferramenta de recuperação usa {type:"retrieval", retrieval:{knowledge_id, prompt_template?}}. O ID de conhecimento pertence à conta que atende à requisição; declarar essa ferramenta não cria uma base de conhecimento.
Uma ferramenta de busca na web usa {type:"web_search", web_search:{search_engine:"search_pro_jina"}}. Os campos opcionais incluem enable, search_query, count (1–50), search_domain_filter, search_recency_filter (oneDay, oneWeek, oneMonth, oneYear, noLimit), content_size (medium, high), result_sequence (before, after), search_result, require_search e search_prompt. Consulte os tipos exatos no OpenAPI. A disponibilidade de busca e recuperação por conta precisa de verificação real.
O modo de objeto JSON produz JSON, mas não impõe um JSON Schema fornecido. Inclua os campos desejados no prompt e valide o resultado no seu aplicativo.
Responses
POST /v1/responses aceita 15 campos de criação de nível superior. Isso segue o esquema Responses do fabricante, especializado para GLM-5.3; o comportamento exato entre serviços continua sujeito a verificação.
curl https://api.seedrouter.ai/v1/responses \
-H "Authorization: Bearer $SEEDROUTER_API_KEY" \
-H 'Content-Type: application/json' \
-d '{"model":"glm-5.3","input":[{"type":"message","role":"user","content":"Give a concise example of a safe retry."}],"reasoning":{"effort":"low"},"max_output_tokens":2048,"store":false}'| Campo | Tipo | Obrigatório | Padrão e restrições |
|---|---|---|---|
model | string | Sim | glm-5.3 |
input | string ou array | Sim | Itens nativos de entrada listados abaixo |
instructions | string | Não | Instruções de sistema |
stream | boolean | Não | false |
temperature | number | Não | 0–1, no máximo duas casas decimais; padrão 1 |
top_p | number | Não | 0.01–1, no máximo duas casas decimais; padrão 0.95 |
max_output_tokens | integer | Não | 1–131072; padrão 65536, incluindo raciocínio |
stop | string array | Não | Nenhum limite de quantidade declarado neste protocolo |
tools | array | Não | Função, namespace, custom ou web_search |
tool_choice | string | Não | none ou auto |
reasoning | object | Não | effort: low, high, max; padrão max |
text | object | Não | format.type: text ou json_object |
prompt_cache_key | string | Não | Chave de cache; sem limite de tamanho documentado |
previous_response_id | string | Não | Referencia uma resposta salva anteriormente |
store | boolean | Não | false; se esta resposta deve ser salva |
Itens de mensagem de entrada exigem type: "message", um papel (user, system, assistant, developer) e conteúdo. O conteúdo pode ser uma string, um bloco de texto ou uma lista de blocos de texto. Use input_text ou output_text do assistente com text em string. Esquemas genéricos de imagem/arquivo não conferem capacidade de visão a este modelo somente de texto.
Itens de entrada de chamada de função exigem type: "function_call", name, call_id e arguments como string JSON; namespace é opcional. Resultados exigem type: "function_call_output", call_id e output em string. Itens de raciocínio usam type: "reasoning" e um único objeto content: {type:"reasoning_text", text:"..."}. Preserve-o sem converter em lista.
Ferramentas de função exigem type: "function" e name, com description e parameters opcionais. Ferramentas namespace exigem type: "namespace" e name e podem conter tools de função. Ferramentas personalizadas exigem type: "custom" e name. Ferramentas de busca na web exigem type: "web_search". Não copie para este formato os campos obrigatórios de funções de Chat.
A resposta anterior referenciada precisa ter sido armazenada. Salvar a resposta atual é uma escolha separada; previous_response_id não força store: true na requisição atual. O prazo de retenção do fabricante é de sete dias. Um teste real salvou uma resposta e continuou a partir do ID com store: false na requisição atual; isso não comprova todas as operações com respostas salvas.
Operações com respostas salvas
Quando store: true funcionar, preserve o ID retornado sem alterações. Estas operações autenticadas usam a mesma conta que criou a resposta:
GET /v1/responses/{response_id}recupera a resposta salva.GET /v1/responses/{response_id}/input_itemslista os itens de entrada. Campos de consulta opcionais:order(ascoudesc, padrãodesc),limit(inteiro de 1–100, padrão 20) eafter(last_id da página anterior).DELETE /v1/responses/{response_id}exclui a resposta salva.
Uma requisição de criação posterior pode usar o ID salvo como previous_response_id. O acesso exige que o usuário original ainda tenha acesso ao modelo. A retenção é de no máximo sete dias; respostas expiradas ou excluídas não podem ser continuadas. Recuperação, exclusão e continuação mantêm o vínculo com a conta original. Não há endpoint de cancelamento documentado. Essas operações são cobertas por testes locais de contrato. O teste real de 29 de outubro confirmou salvamento e continuação; recuperação e listagem de itens de entrada retornaram 404, e a exclusão não foi testada. Não dependa de recuperação, listagem ou exclusão até confirmar sua disponibilidade.
Compatibilidade com Messages
POST /v1/messages usa um envelope compatível com Anthropic. Inclua anthropic-version: 2023-06-01. O fabricante demonstra diretamente model, messages, max_tokens e stream. Não publica um esquema GLM Messages completo e alerta para diferenças em relação ao Claude. Os controles restantes são campos da referência de compatibilidade, não capacidades GLM verificadas individualmente.
curl https://api.seedrouter.ai/v1/messages \
-H "Authorization: Bearer $SEEDROUTER_API_KEY" \
-H 'Content-Type: application/json' \
-H 'anthropic-version: 2023-06-01' \
-d '{"model":"glm-5.3","messages":[{"role":"user","content":"Explain a safe retry in two sentences."}],"max_tokens":2048}'| Campo | Estrutura e validação | Evidência |
|---|---|---|
model | String obrigatória glm-5.3 | Exemplo GLM |
messages | Lista user/assistant obrigatória e não vazia; string ou blocos nativos de texto/ferramenta | Exemplo de texto GLM; formatos dos blocos seguem a referência de compatibilidade |
max_tokens | Inteiro obrigatório 1–131072 | Exemplo GLM e limite de saída do modelo |
stream | Booleano; padrão false | Exemplo GLM |
system | String ou lista de blocos de texto | Referência de compatibilidade |
temperature | Número 0–1 | Referência de compatibilidade; mapeamento não verificado |
top_p | Número 0.01–1 | Referência de compatibilidade; mapeamento não verificado |
top_k | Inteiro não negativo | Referência de compatibilidade; mapeamento não verificado |
stop_sequences | Lista de strings | Referência de compatibilidade |
tools | Ferramentas de cliente: name, input_schema, description opcional | Referência de compatibilidade |
tool_choice | Objeto com type auto, none, any ou tool; ferramenta nomeada exige name | Referência de compatibilidade |
thinking | enabled com budget_tokens, ou adaptive; não é possível desativar o raciocínio | Referência de compatibilidade mais a regra de raciocínio sempre ativo do GLM |
output_config | Objeto com effort low, high ou max | Nome de campo compatível; mapeamento não verificado |
metadata | Objeto com user_id opcional | Referência de compatibilidade |
cache_control | Marcador ephemeral, ttl opcional 5m ou 1h | Apenas referência do protocolo; comportamento de TTL explícito do GLM não verificado |
O orçamento compatível de raciocínio enabled é de pelo menos 1024 e menor que max_tokens. Blocos de texto exigem text; o histórico de raciocínio exige thinking e signature; raciocínio ocultado exige data. Blocos de uso de ferramenta exigem id, name e input; blocos de resultado exigem tool_use_id. Nenhum bloco de imagem, áudio ou vídeo é aceito. Marcadores explícitos de cache não comprovam um acerto, um prazo ou uma tarifa separada. O cache de contexto documentado do modelo é automático.
Saída, streaming e uso
Chat retorna id, created, model, choices e usage, com request_id e web_search opcionais. Leia choices[].message.content, reasoning_content e tool_calls. Uma resposta com chamada de ferramenta pode não ter texto de resposta. SSE envia incrementos de raciocínio, texto e argumentos de ferramentas, seguidos de [DONE]. Una os fragmentos de argumentos pelo índice da chamada. Nenhum campo stream_options faz parte da requisição GLM Chat oficial.
Responses retorna a união nativa output: mensagens, raciocínio e chamadas de ferramentas. SSE inclui response.created, response.in_progress, eventos de itens de saída e partes de conteúdo, incrementos de texto/raciocínio/argumentos de função, progresso de busca e os eventos finais response.completed, response.incomplete ou response.failed. Não exige um marcador [DONE]. Preserve índices e números de sequência.
Messages retorna um envelope de mensagem nativo com blocos de conteúdo, stop_reason e usage. Os nomes dos eventos incluem message_start, content_block_start/delta/stop, message_delta e message_stop. Preserve assinaturas de raciocínio e IDs de ferramentas como histórico opaco.
| Formato | Entrada total | Entrada em cache | Saída |
|---|---|---|---|
| Chat | prompt_tokens | prompt_tokens_details.cached_tokens | completion_tokens |
| Responses | input_tokens | input_tokens_details.cached_tokens | output_tokens |
| Messages | input_tokens mais cache_read_input_tokens e quaisquer cache_creation_input_tokens | cache_read_input_tokens | output_tokens |
O raciocínio é uma parcela da saída, não uma cobrança adicional. A entrada em cache de Chat/Responses é uma parcela da entrada total. Subtraia as parcelas em cache informadas separadamente antes de aplicar a tarifa de entrada comum. Respostas públicas expõem o uso de tokens, não valores monetários. Os preços atuais vêm das configurações de cobrança em tempo real; requisições que falham não são cobradas.
Validação e erros
Tipos inválidos, raciocínio desativado, níveis não aceitos, orçamentos de saída excessivos e entrada de mídia falham na validação. tool_stream de Chat exige stream. Campos de nível superior não aceitos são omitidos, não encaminhados. Credenciais são obrigatórias; saldo insuficiente impede uma requisição paga. Os erros usam o envelope público de erro (Messages usa seu formato nativo). Nunca trate um streaming interrompido como resposta completa nem reenvie automaticamente uma requisição com resultado incerto.
O Playground expõe os mesmos campos admitidos para o formato selecionado. Valores opcionais vazios são omitidos; false e zero explícitos são preservados. Mudar de formato inicia uma nova conversa. A estimativa de uso precisa tanto do uso informado quanto das tarifas atuais.
