Source: https://ailoot.ai/models/zh-hant-tw/glm-5-3/
Canonical: https://ailoot.ai/models/zh-hant-tw/glm-5-3/
Language: zh-hant-tw

# Z.ai: GLM 5.3

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

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

Z.ai GLM 5.3 是文字推理模型，適用於複雜軟體工程、終端機工作與長期任務代理。它支援製造商文件記載的 1M 詞元上下文、最多 128K 輸出詞元、函式呼叫與 low/high/max 推理強度，推理全程保持啟用。

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

關於模型

此說明介紹模型的能力。Ailoot 可用的輸入、輸出與選項，依所選方法列於下方。

Z.ai GLM 5.3 是大型文字推理模型，為複雜軟體工程與長期代理工作設計。製造商表示，它與 GLM 5.2 使用相同基礎模型，新增效能提升來自後訓練。此版本著重於更強的程式設計、終端機操作，以及涉及多個相依步驟的廣泛任務。它接收並產生文字；在連接工具的應用程式中，文字可包含程式碼、說明、計畫與工具呼叫請求。

文件中的推理模式一律啟用。GLM 5.3 提供三種強度：low、high 與 max，預設為 max。製造商建議複雜程式設計工作採用 max；low 則為較簡單步驟提供較輕量的推理選項。將選定強度與明確的最終成品及完成準則搭配。例如：「檢視這些檔案與失敗結果，沿受影響的模組追查原因，提出保留公開介面的修正，並解釋哪些檢查可確立回歸問題已解決。」

製造商規定 1M 詞元的上下文視窗與 128K 詞元的輸出長度上限。圍繞模型需要調查的關係組織長篇素材。保留檔名、相關定義、來源標籤與觀察順序，並在適用工作上下文中為推理及最終答案預留空間。大視窗適合跨模組相依關係或長串代理觀察；它不會讓缺乏方向、含有無關素材的資料封存自動變成定義明確的任務。

進行儲存庫工作時，提供預期行為、相關原始碼文字、相依套件版本與實際錯誤輸出。要求模型先辨識受影響的行為，再提出修補。重構時，指出必須完整保留的介面與不變條件。實用的回覆包含修訂後的程式碼、變更為何能解決觀察到的問題，以及檢查結果所需的案例。將實際結果回饋至連接工具的流程，讓下一步以變更後狀態為依據，而非以前一份提案為依據。

進行效能工作時，提供工作負載、基準及測量資料，例如時間、效能剖析或配置紀錄。Z.ai 描述的訓練任務涵蓋瓶頸診斷、最佳化、實驗及保留正確性的結果。實用的請求是：「利用這份效能剖析找出影響最大的瓶頸，提出一項可量測的變更，並解釋什麼結果足以支持保留它。」區分效能假設與已記錄的改善。檢視結果時，保留相同工作負載與相關條件。

此版本也發展了弱點分析能力。進行防禦性原始碼審查時，提供相關程式碼、預期信任邊界與執行條件。要求發現能將疑似問題連結至受影響輸入、行為與聚焦的修正方式。區分潛在弱點與已重現故障，並保留驗證所用的觀察。報告若優先呈現具體證據與修正建議，而非將每種可疑模式都視為已確認弱點，會更有用。

函式呼叫讓外圍應用程式向模型提供外部操作。定義每個工具的用途、引數與預期結果，再將實際工具觀察回傳給下一步。模型可以推理該結果，判斷它如何改變任務。保持提議動作、已執行操作與未解檢查彼此可區分。製造商也記載了串流回覆，會分別回傳推理與答案片段；先組合完整答案，再將其視為最終報告或程式碼說明。

本機模型卡提供了一項明確的歷史設定細節：其聊天範本預設保留思考，但製造商建議一般聊天情境明確清除舊思考。依使用情境套用合適的對話結構，保留接續工作所需的實際完整答案與工具結果。避免將 GLM 5.2 或另行命名的 GLM 5.3 Flash 版本之推理控制設定，視為可與此模型的 low/high/max 控制項互換。

對結構化結果，指定預期欄位、型別與來源規則。實用成品可以是缺陷表、變更計畫，或彙整觀察的 JSON 物件。應用程式使用前，同時驗證結構與欄位值。最終結果應指出答案或修訂成品、支持它的證據及剩餘假設。更多推理投入並不能證明工具已執行、提議的修補已通過檢查，或事實主張具有提供素材以外的支持。

實用任務

### 實用任務

英文技術範例

```
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.
```

#### 預期結果

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

#### 檢查結果

```
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/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=messages)

Z.ai /`glm-5.3`

模型 ID

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

### 入門

Z.ai GLM 5.3 是文字推理模型，適用於複雜軟體工程、終端機工作與長期任務代理。它支援製造商文件記載的 1M 詞元上下文、最多 128K 輸出詞元、函式呼叫與 low/high/max 推理強度，推理全程保持啟用。

接受的輸入

文字

結果

文字

### Ailoot 可用 · 輸入與方法

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

輸入

`text`

輸出

`text`

上下文

1,000,000 tokens

輸出上限

131,072 tokens

輸出格式

json 或 SSE

| 欄位 | 類型 | 要求 | 值與限制 | 預設值 |
| --- | --- | --- | --- | --- |
| 欄位`model` | 類型`string` | 要求必填 | 值與限制 glm-5.3 | 預設值— |
| 欄位`messages` | 類型`message[]` | 要求必填 | 值與限制 項目數下限: 1 | 預設值— |
| 欄位`messages[].role` | 類型`string` | 要求必填 | 值與限制 user, assistant | 預設值— |
| 欄位`messages[].content` | 類型`string\|content_block[]` | 要求必填 | 值與限制 | 預設值— |
| 欄位`system` | 類型`string\|content_block[]` | 要求選填 | 值與限制 | 預設值— |
| 欄位`max_tokens` | 類型`integer` | 要求必填 | 值與限制 最小值: 1 限制適用對象: 所選模型／卡片的確切上限 | 預設值— |
| 欄位`stream` | 類型`boolean` | 要求選填 | 值與限制 | 預設值false |
| 欄位`temperature` | 類型`number` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`top_p` | 類型`number` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`stop_sequences` | 類型`string[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tools` | 類型`tool[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tools[].name` | 類型`string` | 要求選填 | 值與限制 適用條件: 已提供工具 | 預設值— |
| 欄位`tools[].description` | 類型`string` | 要求選填 | 值與限制 | 預設值— |
| 欄位`tools[].input_schema` | 類型`JSON_schema` | 要求選填 | 值與限制 | 預設值— |
| 欄位`tool_choice` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`thinking.type` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`thinking.budget_tokens` | 類型`integer` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`output_config.effort` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`metadata` | 類型`object` | 要求選填 | 值與限制 | 預設值— |
| 欄位`cache_control` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |

輸入素材組合

**文字** · UTF8 文字

`messages[].content 或 type=text 區塊`

方法參數與生命週期

| 參數 | 規格 |
| --- | --- |
| 參數`material_types` | 規格text |
| 參數`required` | 規格model, messages, max\_tokens |
| 參數`optional_controls` | 規格null |
| 參數`content_type` | 規格application/json |
| 參數`text_file_material` | 規格實際 UTF-8 內容以文字插入；檔案 ID／URLs 需要另有精確支援 |

生命週期： `exact retained published method`

方法結構與 ID 均為精確值；供應商能力與准入狀態分開。

### 方案

#### Ailoot 方法費率

輸入

US$0.0014 */ 1K*

輸出

US$0.0044 */ 1K*

讀取快取

≈US$0.00026 */ 1K*

Ailoot 會在請求前預留估算金額。取得結果後，依實測用量結算最終費用。串流結算採用最終用量紀錄。[預留金額與結算的運作方式 →](https://ailoot.ai/docs/zh-hant-tw/billing/reserve/)

#### 參考費率詳情

模型層級的參考費率表不會變更方法選擇、報價或費用。實際計費採用所選 Ailoot 方法的費率。

模型參考費率表

#### 各設定的價格

請逐一核對各項費用與所列條件。每組互為替代選項的設定只套用一種費率。

| 設定 | 費率表 | 上下文 Token 數大於 | 上下文 Token 數小於或等於 | 費用 |
| --- | --- | --- | --- | --- |
| 設定OpenAI Chat · 基本 token 費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定OpenAI Chat · 請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定Anthropic Messages · 基本 token 費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定Anthropic Messages · 請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |

### 請求範例

#### Ailoot · Anthropic Messages

文字範例Python SDKNode.js SDKPython 串流

```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")
```

### 接收並儲存結果

#### Ailoot · Anthropic Messages

json 或 SSE

##### 保留所有已完成的結果

請保留所有完整傳回的回應、檔案與內容區塊。

保留所有內容區塊、思考簽章與實際工具使用 ID。組合所有 SSE 區塊增量；第一個文字區塊不是完整輸出。

##### 需要檢查原始回應時

保留請求／回應 ID 與標頭。未提供通用的文字工作擷取 URL。

回應欄位

| 欄位 | 類型 |
| --- | --- |
| 欄位`id` | 類型string |
| 欄位`model` | 類型string |
| 欄位`content[]` | 類型text\|thinking\|tool\_use\|other content block |
| 欄位`stop_reason` | 類型string\|null |
| 欄位`usage` | 類型object |

錯誤與後續步驟

| 回應 | 條件 | 下一步 |
| --- | --- | --- |
| 回應400 · `invalid_request_error` | 條件必要欄位、素材表示方式或參數值無效 | 下一步提出新的建立請求前，先修正指定欄位。 |

### 別名

#### 模型別名

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

#### 方法路徑別名

`/chat/completions`

#### 相關呼叫用 ID

[`z-ai/glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=messages), [`glm`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=messages), [`glm-5`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=messages), [`glm-5.1`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=messages), [`glm-5.2`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=messages), [`glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=messages), [`~z-ai/glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=messages), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=messages), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#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/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=responses)

Z.ai /`glm-5.3`

模型 ID

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

### 入門

Z.ai GLM 5.3 是文字推理模型，適用於複雜軟體工程、終端機工作與長期任務代理。它支援製造商文件記載的 1M 詞元上下文、最多 128K 輸出詞元、函式呼叫與 low/high/max 推理強度，推理全程保持啟用。

接受的輸入

文字

結果

文字

### Ailoot 可用 · 輸入與方法

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

輸入

`text`

輸出

`text`

上下文

1,000,000 tokens

輸出上限

131,072 tokens

輸出格式

json 或 SSE

| 欄位 | 類型 | 要求 | 值與限制 | 預設值 |
| --- | --- | --- | --- | --- |
| 欄位`model` | 類型`string` | 要求必填 | 值與限制 glm-5.3 | 預設值— |
| 欄位`input` | 類型`string\|input_item[]` | 要求必填 | 值與限制 | 預設值— |
| 欄位`instructions` | 類型`string` | 要求選填 | 值與限制 | 預設值— |
| 欄位`input[].type` | 類型`string` | 要求選填 | 值與限制 message, reasoning, function\_call, function\_call\_output | 預設值— |
| 欄位`input[].content` | 類型`string\|content_part[]` | 要求選填 | 值與限制 | 預設值— |
| 欄位`input[].call_id` | 類型`string` | 要求選填 | 值與限制 適用條件: function\_call\_output；保留實際回傳的 call\_id | 預設值— |
| 欄位`input[].output` | 類型`string\|content_part[]` | 要求選填 | 值與限制 適用條件: function\_call\_output | 預設值— |
| 欄位`max_output_tokens` | 類型`integer` | 要求選填 | 值與限制 最小值: 1 依模型而定 | 預設值— |
| 欄位`stream` | 類型`boolean` | 要求選填 | 值與限制 | 預設值false |
| 欄位`temperature` | 類型`number` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`top_p` | 類型`number` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tools` | 類型`tool[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tool_choice` | 類型`string\|object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`parallel_tool_calls` | 類型`boolean` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`reasoning.effort` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`reasoning.summary` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`text.format` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`text.verbosity` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`include` | 類型`string[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`store` | 類型`boolean` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`previous_response_id` | 類型`string` | 要求選填 | 值與限制 ID 要求: 僅限支援的延續流程實際回傳的回應 ID 依模型而定 | 預設值— |
| 欄位`service_tier` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`prompt_cache_key` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`prompt_cache_options` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |

輸入素材組合

**文字** · UTF8 文字

`輸入文字或 input_text 部分`

方法參數與生命週期

| 參數 | 規格 |
| --- | --- |
| 參數`material_types` | 規格text |
| 參數`required` | 規格model, input |
| 參數`optional_controls` | 規格null |
| 參數`content_type` | 規格application/json |
| 參數`text_file_material` | 規格實際 UTF-8 內容以文字插入；檔案 ID／URLs 需要另有精確支援 |

生命週期： `exact retained published method`

方法結構與 ID 均為精確值；供應商能力與准入狀態分開。

### 方案

#### Ailoot 方法費率

輸入

US$0.0014 */ 1K*

輸出

US$0.0044 */ 1K*

讀取快取

≈US$0.00026 */ 1K*

Ailoot 會在請求前預留估算金額。取得結果後，依實測用量結算最終費用。串流結算採用最終用量紀錄。[預留金額與結算的運作方式 →](https://ailoot.ai/docs/zh-hant-tw/billing/reserve/)

#### 參考費率詳情

模型層級的參考費率表不會變更方法選擇、報價或費用。實際計費採用所選 Ailoot 方法的費率。

模型參考費率表

#### 各設定的價格

請逐一核對各項費用與所列條件。每組互為替代選項的設定只套用一種費率。

| 設定 | 費率表 | 上下文 Token 數大於 | 上下文 Token 數小於或等於 | 費用 |
| --- | --- | --- | --- | --- |
| 設定OpenAI Chat · 基本 token 費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定OpenAI Chat · 請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定Anthropic Messages · 基本 token 費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定Anthropic Messages · 請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |

### 請求範例

#### Ailoot · OpenAI Responses

文字範例Python SDKNode.js SDKPython 串流

```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")
```

### 接收並儲存結果

#### Ailoot · OpenAI Responses

json 或 SSE

##### 保留所有已完成的結果

請保留所有完整傳回的回應、檔案與內容區塊。

保留每個輸出項目與內容部分、實際函式 call\_id、加密推理與用量。串流時保留完整事件／項目身分。

##### 需要檢查原始回應時

保留請求／回應 ID 與標頭。未提供通用的文字工作擷取 URL。

回應欄位

| 欄位 | 類型 |
| --- | --- |
| 欄位`id` | 類型string |
| 欄位`status` | 類型string |
| 欄位`output[]` | 類型message\|reasoning\|function\_call\|other item |
| 欄位`output[].content[]` | 類型content part |
| 欄位`usage` | 類型object |

錯誤與後續步驟

| 回應 | 條件 | 下一步 |
| --- | --- | --- |
| 回應400 · `invalid_request_error` | 條件必要欄位、素材表示方式或參數值無效 | 下一步提出新的建立請求前，先修正指定欄位。 |

### 別名

#### 模型別名

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

#### 方法路徑別名

`/chat/completions`

#### 相關呼叫用 ID

[`z-ai/glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3), [`glm`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=responses), [`glm-5`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=responses), [`glm-5.1`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=responses), [`glm-5.2`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=responses), [`glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=responses), [`~z-ai/glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=responses), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#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/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=chat)

Z.ai /`glm-5.3`

模型 ID

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

### 入門

Z.ai GLM 5.3 是文字推理模型，適用於複雜軟體工程、終端機工作與長期任務代理。它支援製造商文件記載的 1M 詞元上下文、最多 128K 輸出詞元、函式呼叫與 low/high/max 推理強度，推理全程保持啟用。

接受的輸入

文字

結果

文字

### Ailoot 可用 · 輸入與方法

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

輸入

`text`

輸出

`text`

上下文

1,000,000 tokens

輸出上限

131,072 tokens

輸出格式

json 或 SSE

| 欄位 | 類型 | 要求 | 值與限制 | 預設值 |
| --- | --- | --- | --- | --- |
| 欄位`model` | 類型`string` | 要求必填 | 值與限制 glm-5.3 | 預設值— |
| 欄位`messages` | 類型`message[]` | 要求必填 | 值與限制 項目數下限: 1 | 預設值— |
| 欄位`messages[].role` | 類型`string` | 要求必填 | 值與限制 範例：system, user, assistant, tool, function 條件: 這些角色由 原始碼中的相容型別明確表示；確切角色集合仍依模型而定。 依模型而定 | 預設值— |
| 欄位`messages[].content` | 類型`string\|content_part[]\|null` | 要求選填 | 值與限制 | 預設值— |
| 欄位`messages[].tool_calls` | 類型`tool_call[]` | 要求選填 | 值與限制 | 預設值— |
| 欄位`messages[].tool_call_id` | 類型`string` | 要求選填 | 值與限制 適用條件: role=tool；使用實際回傳的 ID | 預設值— |
| 欄位`messages[].name` | 類型`string` | 要求選填 | 值與限制 | 預設值— |
| 欄位`messages[].reasoning_content` | 類型`string` | 要求選填 | 值與限制 適用條件: 此模型使用推理內容時，將實際回傳的推理內容帶回後續請求 | 預設值— |
| 欄位`messages[].reasoning_details` | 類型`object\|array` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`max_tokens` | 類型`integer` | 要求選填 | 值與限制 最小值: 1 依模型而定 | 預設值— |
| 欄位`max_completion_tokens` | 類型`integer` | 要求選填 | 值與限制 最小值: 1 依模型而定 | 預設值— |
| 欄位`stream` | 類型`boolean` | 要求選填 | 值與限制 | 預設值false |
| 欄位`stream_options.include_usage` | 類型`boolean` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`temperature` | 類型`number` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`top_p` | 類型`number` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`stop` | 類型`string\|string[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tools` | 類型`function_tool[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tools[].type` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tools[].function.name` | 類型`string` | 要求必填 | 值與限制 適用條件: 已提供函式工具 | 預設值— |
| 欄位`tools[].function.description` | 類型`string` | 要求選填 | 值與限制 | 預設值— |
| 欄位`tools[].function.parameters` | 類型`JSON_schema` | 要求選填 | 值與限制 | 預設值— |
| 欄位`tool_choice` | 類型`string\|object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`parallel_tool_calls` | 類型`boolean` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`response_format` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`reasoning_effort` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`reasoning` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`service_tier` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`instructions` | 類型`string` | 要求選填 | 值與限制 相容性欄位 | 預設值— |
| 欄位`functions` | 類型`function[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`function_call` | 類型`string\|object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`prompt_cache_options` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |

輸入素材組合

**文字** · UTF8 文字

`messages[].content`

方法參數與生命週期

| 參數 | 規格 |
| --- | --- |
| 參數`material_types` | 規格text |
| 參數`required` | 規格model, messages |
| 參數`optional_controls` | 規格null |
| 參數`content_type` | 規格application/json |
| 參數`text_file_material` | 規格實際 UTF-8 內容以文字插入；檔案 ID／URLs 需要另有精確支援 |

生命週期： `exact retained published method`

方法結構與 ID 均為精確值；供應商能力與准入狀態分開。

### 方案

#### Ailoot 方法費率

輸入

US$0.0014 */ 1K*

輸出

US$0.0044 */ 1K*

讀取快取

≈US$0.00026 */ 1K*

Ailoot 會在請求前預留估算金額。取得結果後，依實測用量結算最終費用。串流結算採用最終用量紀錄。[預留金額與結算的運作方式 →](https://ailoot.ai/docs/zh-hant-tw/billing/reserve/)

#### 參考費率詳情

模型層級的參考費率表不會變更方法選擇、報價或費用。實際計費採用所選 Ailoot 方法的費率。

模型參考費率表

#### 各設定的價格

請逐一核對各項費用與所列條件。每組互為替代選項的設定只套用一種費率。

| 設定 | 費率表 | 上下文 Token 數大於 | 上下文 Token 數小於或等於 | 費用 |
| --- | --- | --- | --- | --- |
| 設定OpenAI Chat · 基本 token 費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定OpenAI Chat · 請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定Anthropic Messages · 基本 token 費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定Anthropic Messages · 請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |

### 請求範例

#### Ailoot · OpenAI Chat

文字範例Python SDKNode.js SDKPython 串流

```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")
```

### 接收並儲存結果

#### Ailoot · OpenAI Chat

json 或 SSE

##### 保留所有已完成的結果

請保留所有完整傳回的回應、檔案與內容區塊。

保留每個候選項及其內容／工具呼叫／推理。SSE 中依候選項／工具索引組合增量，保留最終完成原因與用量。

##### 需要檢查原始回應時

保留請求／回應 ID 與標頭。未提供通用的文字工作擷取 URL。

回應欄位

| 欄位 | 類型 |
| --- | --- |
| 欄位`choices[].index` | 類型integer |
| 欄位`choices[].message.content` | 類型string\|null |
| 欄位`choices[].message.tool_calls` | 類型tool\_call\[\] |
| 欄位`choices[].message.reasoning_content` | 類型string |
| 欄位`choices[].message.reasoning_details` | 類型object\|array |
| 欄位`choices[].finish_reason` | 類型string\|null |
| 欄位`usage` | 類型object |

錯誤與後續步驟

| 回應 | 條件 | 下一步 |
| --- | --- | --- |
| 回應400 · `invalid_request_error` | 條件必要欄位、素材表示方式或參數值無效 | 下一步提出新的建立請求前，先修正指定欄位。 |

### 別名

#### 模型別名

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

#### 方法路徑別名

`/chat/completions`

#### 相關呼叫用 ID

[`z-ai/glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=chat), [`glm`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=chat), [`glm-5`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=chat), [`glm-5.1`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=chat), [`glm-5.2`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=chat), [`glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=chat), [`~z-ai/glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=chat), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=chat), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#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/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3&fmt=chat)

Z.ai /`glm-5.3`

模型 ID

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

### 入門

Z.ai GLM 5.3 是文字推理模型，適用於複雜軟體工程、終端機工作與長期任務代理。它支援製造商文件記載的 1M 詞元上下文、最多 128K 輸出詞元、函式呼叫與 low/high/max 推理強度，推理全程保持啟用。

接受的輸入

文字

結果

文字

### Ailoot 可用 · 輸入與方法

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

輸入

`text`

輸出

`text`

輸出格式

json 或 SSE

| 欄位 | 類型 | 要求 | 值與限制 | 預設值 |
| --- | --- | --- | --- | --- |
| 欄位`model` | 類型`string` | 要求必填 | 值與限制 glm-5.3 | 預設值— |
| 欄位`messages` | 類型`message[]` | 要求必填 | 值與限制 項目數下限: 1 | 預設值— |
| 欄位`messages[].role` | 類型`string` | 要求必填 | 值與限制 依模型而定 | 預設值— |
| 欄位`messages[].content` | 類型`string` | 要求選填 | 值與限制 適用條件: 文字對話 | 預設值— |
| 欄位`stream` | 類型`boolean` | 要求選填 | 值與限制 | 預設值false |

輸入素材組合

**文字** · UTF8 文字

`messages[].content`

方法參數與生命週期

| 參數 | 規格 |
| --- | --- |
| 參數`content_type` | 規格application/json |
| 參數`required` | 規格model, messages |
| 參數`material_types` | 規格text |
| 參數`messages` | 規格具有 role/content 結構的訊息陣列 |
| 參數`file_material` | 規格實際 UTF-8 文件以原文文字插入；不推定檔案 ID |
| 參數`optional_controls` | 規格stream |
| 參數`control_scope` | 規格文字對話；stream 是布林值，預設為 false。 |
| 參數`output_modalities` | 規格text |
| 參數`hosted_operations` | 規格false |
| 參數`multimodal_input_binding` | 規格null |

方法別名： `/chat/completions`

生命週期： `synchronous_or_streamed`

將確切模型 ID 與 messages 一併送出。

上下文長度不是輸出上限。

文字檔案可提供原文文字；圖片／音訊／檔案物件輸入需要精確綁定。

### 方案

費率資訊不會增加請求選項。支援的參數列於所選方法中。

快速模式

標準費率 選取快速模式時

flex 模式

標準費率 選取 flex 模式時

最高推理強度

標準費率 最高推理強度採用 default 調整值時

推理強度 · high

標準費率 推理強度設為 high 時

推理強度 · low

標準費率 推理強度設為 low 時

推理強度 · max

標準費率 推理強度設為 max 時

#### Ailoot 費率

#### 各設定的價格

請逐一核對各項費用與所列條件。每組互為替代選項的設定只套用一種費率。

| 設定 | 費率表 | 上下文 Token 數大於 | 上下文 Token 數小於或等於 | 費用 |
| --- | --- | --- | --- | --- |
| 設定詞元基本費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |

Ailoot 會在請求前預留估算金額。取得結果後，依實測用量結算最終費用。串流結算採用最終用量紀錄。[預留金額與結算的運作方式 →](https://ailoot.ai/docs/zh-hant-tw/billing/reserve/)

### 請求範例

#### 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"))
```

### 接收並儲存結果

#### Ailoot Ultra · OpenAI Chat

json 或 SSE

##### 保留所有已完成的結果

請保留所有完整傳回的回應、檔案與內容區塊。

保留每個候選項及其內容／工具呼叫／推理。SSE 中依候選項／工具索引組合增量，保留最終完成原因與用量。

##### 需要檢查原始回應時

保留請求／回應 ID 與標頭。未提供通用的文字工作擷取 URL。

回應欄位

| 欄位 | 類型 |
| --- | --- |
| 欄位`choices[].index` | 類型integer |
| 欄位`choices[].message.content` | 類型string\|null |
| 欄位`choices[].message.tool_calls` | 類型tool\_call\[\] |
| 欄位`choices[].message.reasoning_content` | 類型string |
| 欄位`choices[].message.reasoning_details` | 類型object\|array |
| 欄位`choices[].finish_reason` | 類型string\|null |
| 欄位`usage` | 類型object |

錯誤與後續步驟

| 回應 | 條件 | 下一步 |
| --- | --- | --- |
| 回應400 · `invalid_request_error` | 條件必要欄位、素材表示方式或參數值無效 | 下一步提出新的建立請求前，先修正指定欄位。 |

### 別名

#### 模型別名

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

#### 方法路徑別名

`/chat/completions`

#### 相關呼叫用 ID

[`z-ai/glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=chat), [`glm`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=chat), [`glm-5`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=chat), [`glm-5.1`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=chat), [`glm-5.2`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=chat), [`glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=chat), [`~z-ai/glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=chat), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=chat), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#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/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=glm-5.3&fmt=messages)

Z.ai /`glm-5.3`

模型 ID

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

### 入門

Z.ai GLM 5.3 是文字推理模型，適用於複雜軟體工程、終端機工作與長期任務代理。它支援製造商文件記載的 1M 詞元上下文、最多 128K 輸出詞元、函式呼叫與 low/high/max 推理強度，推理全程保持啟用。

接受的輸入

文字

結果

json · sse

### Ailoot 可用 · 輸入與方法

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

輸入

`text`

輸出

`json`, `sse`

輸出格式

JSON 或 SSE

| 欄位 | 類型 | 要求 | 值與限制 | 預設值 |
| --- | --- | --- | --- | --- |
| 欄位`model` | 類型`string` | 要求必填 | 值與限制 glm-5.3 | 預設值— |
| 欄位`messages` | 類型`message[]` | 要求必填 | 值與限制 | 預設值— |
| 欄位`messages[].role` | 類型`string` | 要求必填 | 值與限制 user, assistant | 預設值— |
| 欄位`messages[].content` | 類型`string` | 要求必填 | 值與限制 | 預設值— |
| 欄位`max_tokens` | 類型`integer` | 要求必填 | 值與限制 | 預設值— |
| 欄位`stream` | 類型`boolean` | 要求選填 | 值與限制 | 預設值false |

輸入素材組合

**文字** · UTF-8 文字

`messages[].content 字串`

方法參數與生命週期

| 參數 | 規格 |
| --- | --- |
| 參數`content_type` | 規格application/json |
| 參數`required` | 規格model, messages, max\_tokens |
| 參數`optional_controls` | 規格stream |
| 參數`material_types` | 規格text |
| 參數`text_file_material` | 規格讀取實際 UTF-8 文件，將文字放入指定的 input 或訊息內容字串。 |

生命週期： `synchronous_or_streamed`

### 方案

費率資訊不會增加請求選項。支援的參數列於所選方法中。

快速模式

標準費率 選取快速模式時

flex 模式

標準費率 選取 flex 模式時

最高推理強度

標準費率 最高推理強度採用 default 調整值時

推理強度 · high

標準費率 推理強度設為 high 時

推理強度 · low

標準費率 推理強度設為 low 時

推理強度 · max

標準費率 推理強度設為 max 時

#### Ailoot 費率

#### 各設定的價格

請逐一核對各項費用與所列條件。每組互為替代選項的設定只套用一種費率。

| 設定 | 費率表 | 上下文 Token 數大於 | 上下文 Token 數小於或等於 | 費用 |
| --- | --- | --- | --- | --- |
| 設定詞元基本費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |

Ailoot 會在請求前預留估算金額。取得結果後，依實測用量結算最終費用。串流結算採用最終用量紀錄。[預留金額與結算的運作方式 →](https://ailoot.ai/docs/zh-hant-tw/billing/reserve/)

### 請求範例

#### Ailoot Ultra · Anthropic Messages

完整的最小 JSON 請求主體curl · 使用您的 UTF-8 文件Python · 儲存完整結果

```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))
```

### 接收並儲存結果

#### Ailoot Ultra · Anthropic Messages

JSON 或 SSE

##### 保留所有已完成的結果

請保留所有完整傳回的回應、檔案與內容區塊。

保留所有內容區塊、思考簽章與實際工具使用 ID。組合所有 SSE 區塊增量；第一個文字區塊不是完整輸出。

##### 需要檢查原始回應時

保留請求／回應 ID 與標頭。未提供通用的文字工作擷取 URL。

回應欄位

| 欄位 | 類型 |
| --- | --- |
| 欄位`id` | 類型string |
| 欄位`model` | 類型string |
| 欄位`content[]` | 類型text\|thinking\|tool\_use\|other content block |
| 欄位`stop_reason` | 類型string\|null |
| 欄位`usage` | 類型object |

錯誤與後續步驟

| 回應 | 條件 | 下一步 |
| --- | --- | --- |
| 回應400 · `invalid_request_error` | 條件必要欄位、素材表示方式或參數值無效 | 下一步提出新的建立請求前，先修正指定欄位。 |

### 別名

#### 模型別名

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

#### 方法路徑別名

`/chat/completions`

#### 相關呼叫用 ID

[`z-ai/glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=messages), [`glm`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=messages), [`glm-5`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=messages), [`glm-5.1`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=messages), [`glm-5.2`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=messages), [`glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=messages), [`~z-ai/glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=messages), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=messages), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#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/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=messages)

Z.ai /`glm`

模型 ID

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

### 入門

Z.ai GLM 5.3 是文字推理模型，適用於複雜軟體工程、終端機工作與長期任務代理。它支援製造商文件記載的 1M 詞元上下文、最多 128K 輸出詞元、函式呼叫與 low/high/max 推理強度，推理全程保持啟用。

接受的輸入

文字

結果

文字

### Ailoot 可用 · 輸入與方法

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

輸入

`text`

輸出

`text`

上下文

1,000,000 tokens

輸出上限

131,072 tokens

輸出格式

json 或 SSE

| 欄位 | 類型 | 要求 | 值與限制 | 預設值 |
| --- | --- | --- | --- | --- |
| 欄位`model` | 類型`string` | 要求必填 | 值與限制 glm | 預設值— |
| 欄位`messages` | 類型`message[]` | 要求必填 | 值與限制 項目數下限: 1 | 預設值— |
| 欄位`messages[].role` | 類型`string` | 要求必填 | 值與限制 user, assistant | 預設值— |
| 欄位`messages[].content` | 類型`string\|content_block[]` | 要求必填 | 值與限制 | 預設值— |
| 欄位`system` | 類型`string\|content_block[]` | 要求選填 | 值與限制 | 預設值— |
| 欄位`max_tokens` | 類型`integer` | 要求必填 | 值與限制 最小值: 1 限制適用對象: 所選模型／卡片的確切上限 | 預設值— |
| 欄位`stream` | 類型`boolean` | 要求選填 | 值與限制 | 預設值false |
| 欄位`temperature` | 類型`number` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`top_p` | 類型`number` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`stop_sequences` | 類型`string[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tools` | 類型`tool[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tools[].name` | 類型`string` | 要求選填 | 值與限制 適用條件: 已提供工具 | 預設值— |
| 欄位`tools[].description` | 類型`string` | 要求選填 | 值與限制 | 預設值— |
| 欄位`tools[].input_schema` | 類型`JSON_schema` | 要求選填 | 值與限制 | 預設值— |
| 欄位`tool_choice` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`thinking.type` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`thinking.budget_tokens` | 類型`integer` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`output_config.effort` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`metadata` | 類型`object` | 要求選填 | 值與限制 | 預設值— |
| 欄位`cache_control` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |

輸入素材組合

**文字** · UTF8 文字

`messages[].content 或 type=text 區塊`

方法參數與生命週期

| 參數 | 規格 |
| --- | --- |
| 參數`material_types` | 規格text |
| 參數`required` | 規格model, messages, max\_tokens |
| 參數`optional_controls` | 規格null |
| 參數`content_type` | 規格application/json |
| 參數`text_file_material` | 規格實際 UTF-8 內容以文字插入；檔案 ID／URLs 需要另有精確支援 |

生命週期： `exact retained published method`

方法結構與 ID 均為精確值；供應商能力與准入狀態分開。

### 方案

#### Ailoot 方法費率

輸入

US$0.0014 */ 1K*

輸出

US$0.0044 */ 1K*

讀取快取

≈US$0.00026 */ 1K*

Ailoot 會在請求前預留估算金額。取得結果後，依實測用量結算最終費用。串流結算採用最終用量紀錄。[預留金額與結算的運作方式 →](https://ailoot.ai/docs/zh-hant-tw/billing/reserve/)

#### 參考費率詳情

模型層級的參考費率表不會變更方法選擇、報價或費用。實際計費採用所選 Ailoot 方法的費率。

模型參考費率表

#### 各設定的價格

請逐一核對各項費用與所列條件。每組互為替代選項的設定只套用一種費率。

| 設定 | 費率表 | 上下文 Token 數大於 | 上下文 Token 數小於或等於 | 費用 |
| --- | --- | --- | --- | --- |
| 設定OpenAI Chat · 基本 token 費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定OpenAI Chat · 請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定Anthropic Messages · 基本 token 費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定Anthropic Messages · 請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |

### 請求範例

#### Ailoot · Anthropic Messages

文字範例Python SDKNode.js SDKPython 串流

```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")
```

### 接收並儲存結果

#### Ailoot · Anthropic Messages

json 或 SSE

##### 保留所有已完成的結果

請保留所有完整傳回的回應、檔案與內容區塊。

保留所有內容區塊、思考簽章與實際工具使用 ID。組合所有 SSE 區塊增量；第一個文字區塊不是完整輸出。

##### 需要檢查原始回應時

保留請求／回應 ID 與標頭。未提供通用的文字工作擷取 URL。

回應欄位

| 欄位 | 類型 |
| --- | --- |
| 欄位`id` | 類型string |
| 欄位`model` | 類型string |
| 欄位`content[]` | 類型text\|thinking\|tool\_use\|other content block |
| 欄位`stop_reason` | 類型string\|null |
| 欄位`usage` | 類型object |

錯誤與後續步驟

| 回應 | 條件 | 下一步 |
| --- | --- | --- |
| 回應400 · `invalid_request_error` | 條件必要欄位、素材表示方式或參數值無效 | 下一步提出新的建立請求前，先修正指定欄位。 |

### 別名

#### 模型別名

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

#### 方法路徑別名

`/chat/completions`

#### 相關呼叫用 ID

[`z-ai/glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=messages), [`glm`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=messages), [`glm-5`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=messages), [`glm-5.1`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=messages), [`glm-5.2`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=messages), [`glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=messages), [`~z-ai/glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=messages), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=messages), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#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/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=responses)

Z.ai /`glm`

模型 ID

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

### 入門

Z.ai GLM 5.3 是文字推理模型，適用於複雜軟體工程、終端機工作與長期任務代理。它支援製造商文件記載的 1M 詞元上下文、最多 128K 輸出詞元、函式呼叫與 low/high/max 推理強度，推理全程保持啟用。

接受的輸入

文字

結果

文字

### Ailoot 可用 · 輸入與方法

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

輸入

`text`

輸出

`text`

上下文

1,000,000 tokens

輸出上限

131,072 tokens

輸出格式

json 或 SSE

| 欄位 | 類型 | 要求 | 值與限制 | 預設值 |
| --- | --- | --- | --- | --- |
| 欄位`model` | 類型`string` | 要求必填 | 值與限制 glm | 預設值— |
| 欄位`input` | 類型`string\|input_item[]` | 要求必填 | 值與限制 | 預設值— |
| 欄位`instructions` | 類型`string` | 要求選填 | 值與限制 | 預設值— |
| 欄位`input[].type` | 類型`string` | 要求選填 | 值與限制 message, reasoning, function\_call, function\_call\_output | 預設值— |
| 欄位`input[].content` | 類型`string\|content_part[]` | 要求選填 | 值與限制 | 預設值— |
| 欄位`input[].call_id` | 類型`string` | 要求選填 | 值與限制 適用條件: function\_call\_output；保留實際回傳的 call\_id | 預設值— |
| 欄位`input[].output` | 類型`string\|content_part[]` | 要求選填 | 值與限制 適用條件: function\_call\_output | 預設值— |
| 欄位`max_output_tokens` | 類型`integer` | 要求選填 | 值與限制 最小值: 1 依模型而定 | 預設值— |
| 欄位`stream` | 類型`boolean` | 要求選填 | 值與限制 | 預設值false |
| 欄位`temperature` | 類型`number` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`top_p` | 類型`number` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tools` | 類型`tool[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tool_choice` | 類型`string\|object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`parallel_tool_calls` | 類型`boolean` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`reasoning.effort` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`reasoning.summary` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`text.format` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`text.verbosity` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`include` | 類型`string[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`store` | 類型`boolean` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`previous_response_id` | 類型`string` | 要求選填 | 值與限制 ID 要求: 僅限支援的延續流程實際回傳的回應 ID 依模型而定 | 預設值— |
| 欄位`service_tier` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`prompt_cache_key` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`prompt_cache_options` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |

輸入素材組合

**文字** · UTF8 文字

`輸入文字或 input_text 部分`

方法參數與生命週期

| 參數 | 規格 |
| --- | --- |
| 參數`material_types` | 規格text |
| 參數`required` | 規格model, input |
| 參數`optional_controls` | 規格null |
| 參數`content_type` | 規格application/json |
| 參數`text_file_material` | 規格實際 UTF-8 內容以文字插入；檔案 ID／URLs 需要另有精確支援 |

生命週期： `exact retained published method`

方法結構與 ID 均為精確值；供應商能力與准入狀態分開。

### 方案

#### Ailoot 方法費率

輸入

US$0.0014 */ 1K*

輸出

US$0.0044 */ 1K*

讀取快取

≈US$0.00026 */ 1K*

Ailoot 會在請求前預留估算金額。取得結果後，依實測用量結算最終費用。串流結算採用最終用量紀錄。[預留金額與結算的運作方式 →](https://ailoot.ai/docs/zh-hant-tw/billing/reserve/)

#### 參考費率詳情

模型層級的參考費率表不會變更方法選擇、報價或費用。實際計費採用所選 Ailoot 方法的費率。

模型參考費率表

#### 各設定的價格

請逐一核對各項費用與所列條件。每組互為替代選項的設定只套用一種費率。

| 設定 | 費率表 | 上下文 Token 數大於 | 上下文 Token 數小於或等於 | 費用 |
| --- | --- | --- | --- | --- |
| 設定OpenAI Chat · 基本 token 費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定OpenAI Chat · 請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定Anthropic Messages · 基本 token 費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定Anthropic Messages · 請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |

### 請求範例

#### Ailoot · OpenAI Responses

文字範例Python SDKNode.js SDKPython 串流

```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")
```

### 接收並儲存結果

#### Ailoot · OpenAI Responses

json 或 SSE

##### 保留所有已完成的結果

請保留所有完整傳回的回應、檔案與內容區塊。

保留每個輸出項目與內容部分、實際函式 call\_id、加密推理與用量。串流時保留完整事件／項目身分。

##### 需要檢查原始回應時

保留請求／回應 ID 與標頭。未提供通用的文字工作擷取 URL。

回應欄位

| 欄位 | 類型 |
| --- | --- |
| 欄位`id` | 類型string |
| 欄位`status` | 類型string |
| 欄位`output[]` | 類型message\|reasoning\|function\_call\|other item |
| 欄位`output[].content[]` | 類型content part |
| 欄位`usage` | 類型object |

錯誤與後續步驟

| 回應 | 條件 | 下一步 |
| --- | --- | --- |
| 回應400 · `invalid_request_error` | 條件必要欄位、素材表示方式或參數值無效 | 下一步提出新的建立請求前，先修正指定欄位。 |

### 別名

#### 模型別名

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

#### 方法路徑別名

`/chat/completions`

#### 相關呼叫用 ID

[`z-ai/glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3), [`glm`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=responses), [`glm-5`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=responses), [`glm-5.1`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=responses), [`glm-5.2`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=responses), [`glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=responses), [`~z-ai/glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=responses), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#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/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=chat)

Z.ai /`glm`

模型 ID

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

### 入門

Z.ai GLM 5.3 是文字推理模型，適用於複雜軟體工程、終端機工作與長期任務代理。它支援製造商文件記載的 1M 詞元上下文、最多 128K 輸出詞元、函式呼叫與 low/high/max 推理強度，推理全程保持啟用。

接受的輸入

文字

結果

文字

### Ailoot 可用 · 輸入與方法

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

輸入

`text`

輸出

`text`

上下文

1,000,000 tokens

輸出上限

131,072 tokens

輸出格式

json 或 SSE

| 欄位 | 類型 | 要求 | 值與限制 | 預設值 |
| --- | --- | --- | --- | --- |
| 欄位`model` | 類型`string` | 要求必填 | 值與限制 glm | 預設值— |
| 欄位`messages` | 類型`message[]` | 要求必填 | 值與限制 項目數下限: 1 | 預設值— |
| 欄位`messages[].role` | 類型`string` | 要求必填 | 值與限制 範例：system, user, assistant, tool, function 條件: 這些角色由 原始碼中的相容型別明確表示；確切角色集合仍依模型而定。 依模型而定 | 預設值— |
| 欄位`messages[].content` | 類型`string\|content_part[]\|null` | 要求選填 | 值與限制 | 預設值— |
| 欄位`messages[].tool_calls` | 類型`tool_call[]` | 要求選填 | 值與限制 | 預設值— |
| 欄位`messages[].tool_call_id` | 類型`string` | 要求選填 | 值與限制 適用條件: role=tool；使用實際回傳的 ID | 預設值— |
| 欄位`messages[].name` | 類型`string` | 要求選填 | 值與限制 | 預設值— |
| 欄位`messages[].reasoning_content` | 類型`string` | 要求選填 | 值與限制 適用條件: 此模型使用推理內容時，將實際回傳的推理內容帶回後續請求 | 預設值— |
| 欄位`messages[].reasoning_details` | 類型`object\|array` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`max_tokens` | 類型`integer` | 要求選填 | 值與限制 最小值: 1 依模型而定 | 預設值— |
| 欄位`max_completion_tokens` | 類型`integer` | 要求選填 | 值與限制 最小值: 1 依模型而定 | 預設值— |
| 欄位`stream` | 類型`boolean` | 要求選填 | 值與限制 | 預設值false |
| 欄位`stream_options.include_usage` | 類型`boolean` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`temperature` | 類型`number` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`top_p` | 類型`number` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`stop` | 類型`string\|string[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tools` | 類型`function_tool[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tools[].type` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tools[].function.name` | 類型`string` | 要求必填 | 值與限制 適用條件: 已提供函式工具 | 預設值— |
| 欄位`tools[].function.description` | 類型`string` | 要求選填 | 值與限制 | 預設值— |
| 欄位`tools[].function.parameters` | 類型`JSON_schema` | 要求選填 | 值與限制 | 預設值— |
| 欄位`tool_choice` | 類型`string\|object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`parallel_tool_calls` | 類型`boolean` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`response_format` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`reasoning_effort` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`reasoning` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`service_tier` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`instructions` | 類型`string` | 要求選填 | 值與限制 相容性欄位 | 預設值— |
| 欄位`functions` | 類型`function[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`function_call` | 類型`string\|object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`prompt_cache_options` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |

輸入素材組合

**文字** · UTF8 文字

`messages[].content`

方法參數與生命週期

| 參數 | 規格 |
| --- | --- |
| 參數`material_types` | 規格text |
| 參數`required` | 規格model, messages |
| 參數`optional_controls` | 規格null |
| 參數`content_type` | 規格application/json |
| 參數`text_file_material` | 規格實際 UTF-8 內容以文字插入；檔案 ID／URLs 需要另有精確支援 |

生命週期： `exact retained published method`

方法結構與 ID 均為精確值；供應商能力與准入狀態分開。

### 方案

#### Ailoot 方法費率

輸入

US$0.0014 */ 1K*

輸出

US$0.0044 */ 1K*

讀取快取

≈US$0.00026 */ 1K*

Ailoot 會在請求前預留估算金額。取得結果後，依實測用量結算最終費用。串流結算採用最終用量紀錄。[預留金額與結算的運作方式 →](https://ailoot.ai/docs/zh-hant-tw/billing/reserve/)

#### 參考費率詳情

模型層級的參考費率表不會變更方法選擇、報價或費用。實際計費採用所選 Ailoot 方法的費率。

模型參考費率表

#### 各設定的價格

請逐一核對各項費用與所列條件。每組互為替代選項的設定只套用一種費率。

| 設定 | 費率表 | 上下文 Token 數大於 | 上下文 Token 數小於或等於 | 費用 |
| --- | --- | --- | --- | --- |
| 設定OpenAI Chat · 基本 token 費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定OpenAI Chat · 請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定Anthropic Messages · 基本 token 費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定Anthropic Messages · 請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |

### 請求範例

#### Ailoot · OpenAI Chat

文字範例Python SDKNode.js SDKPython 串流

```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")
```

### 接收並儲存結果

#### Ailoot · OpenAI Chat

json 或 SSE

##### 保留所有已完成的結果

請保留所有完整傳回的回應、檔案與內容區塊。

保留每個候選項及其內容／工具呼叫／推理。SSE 中依候選項／工具索引組合增量，保留最終完成原因與用量。

##### 需要檢查原始回應時

保留請求／回應 ID 與標頭。未提供通用的文字工作擷取 URL。

回應欄位

| 欄位 | 類型 |
| --- | --- |
| 欄位`choices[].index` | 類型integer |
| 欄位`choices[].message.content` | 類型string\|null |
| 欄位`choices[].message.tool_calls` | 類型tool\_call\[\] |
| 欄位`choices[].message.reasoning_content` | 類型string |
| 欄位`choices[].message.reasoning_details` | 類型object\|array |
| 欄位`choices[].finish_reason` | 類型string\|null |
| 欄位`usage` | 類型object |

錯誤與後續步驟

| 回應 | 條件 | 下一步 |
| --- | --- | --- |
| 回應400 · `invalid_request_error` | 條件必要欄位、素材表示方式或參數值無效 | 下一步提出新的建立請求前，先修正指定欄位。 |

### 別名

#### 模型別名

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

#### 方法路徑別名

`/chat/completions`

#### 相關呼叫用 ID

[`z-ai/glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=chat), [`glm`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=chat), [`glm-5`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=chat), [`glm-5.1`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=chat), [`glm-5.2`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=chat), [`glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=chat), [`~z-ai/glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=chat), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=chat), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#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/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=messages)

Z.ai /`glm-5`

模型 ID

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

### 入門

Z.ai GLM 5.3 是文字推理模型，適用於複雜軟體工程、終端機工作與長期任務代理。它支援製造商文件記載的 1M 詞元上下文、最多 128K 輸出詞元、函式呼叫與 low/high/max 推理強度，推理全程保持啟用。

接受的輸入

文字

結果

文字

### Ailoot 可用 · 輸入與方法

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

輸入

`text`

輸出

`text`

上下文

1,000,000 tokens

輸出上限

131,072 tokens

輸出格式

json 或 SSE

| 欄位 | 類型 | 要求 | 值與限制 | 預設值 |
| --- | --- | --- | --- | --- |
| 欄位`model` | 類型`string` | 要求必填 | 值與限制 glm-5 | 預設值— |
| 欄位`messages` | 類型`message[]` | 要求必填 | 值與限制 項目數下限: 1 | 預設值— |
| 欄位`messages[].role` | 類型`string` | 要求必填 | 值與限制 user, assistant | 預設值— |
| 欄位`messages[].content` | 類型`string\|content_block[]` | 要求必填 | 值與限制 | 預設值— |
| 欄位`system` | 類型`string\|content_block[]` | 要求選填 | 值與限制 | 預設值— |
| 欄位`max_tokens` | 類型`integer` | 要求必填 | 值與限制 最小值: 1 限制適用對象: 所選模型／卡片的確切上限 | 預設值— |
| 欄位`stream` | 類型`boolean` | 要求選填 | 值與限制 | 預設值false |
| 欄位`temperature` | 類型`number` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`top_p` | 類型`number` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`stop_sequences` | 類型`string[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tools` | 類型`tool[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tools[].name` | 類型`string` | 要求選填 | 值與限制 適用條件: 已提供工具 | 預設值— |
| 欄位`tools[].description` | 類型`string` | 要求選填 | 值與限制 | 預設值— |
| 欄位`tools[].input_schema` | 類型`JSON_schema` | 要求選填 | 值與限制 | 預設值— |
| 欄位`tool_choice` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`thinking.type` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`thinking.budget_tokens` | 類型`integer` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`output_config.effort` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`metadata` | 類型`object` | 要求選填 | 值與限制 | 預設值— |
| 欄位`cache_control` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |

輸入素材組合

**文字** · UTF8 文字

`messages[].content 或 type=text 區塊`

方法參數與生命週期

| 參數 | 規格 |
| --- | --- |
| 參數`material_types` | 規格text |
| 參數`required` | 規格model, messages, max\_tokens |
| 參數`optional_controls` | 規格null |
| 參數`content_type` | 規格application/json |
| 參數`text_file_material` | 規格實際 UTF-8 內容以文字插入；檔案 ID／URLs 需要另有精確支援 |

生命週期： `exact retained published method`

方法結構與 ID 均為精確值；供應商能力與准入狀態分開。

### 方案

#### Ailoot 方法費率

輸入

US$0.0014 */ 1K*

輸出

US$0.0044 */ 1K*

讀取快取

≈US$0.00026 */ 1K*

Ailoot 會在請求前預留估算金額。取得結果後，依實測用量結算最終費用。串流結算採用最終用量紀錄。[預留金額與結算的運作方式 →](https://ailoot.ai/docs/zh-hant-tw/billing/reserve/)

#### 參考費率詳情

模型層級的參考費率表不會變更方法選擇、報價或費用。實際計費採用所選 Ailoot 方法的費率。

模型參考費率表

#### 各設定的價格

請逐一核對各項費用與所列條件。每組互為替代選項的設定只套用一種費率。

| 設定 | 費率表 | 上下文 Token 數大於 | 上下文 Token 數小於或等於 | 費用 |
| --- | --- | --- | --- | --- |
| 設定OpenAI Chat · 基本 token 費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定OpenAI Chat · 請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定Anthropic Messages · 基本 token 費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定Anthropic Messages · 請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |

### 請求範例

#### Ailoot · Anthropic Messages

文字範例Python SDKNode.js SDKPython 串流

```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")
```

### 接收並儲存結果

#### Ailoot · Anthropic Messages

json 或 SSE

##### 保留所有已完成的結果

請保留所有完整傳回的回應、檔案與內容區塊。

保留所有內容區塊、思考簽章與實際工具使用 ID。組合所有 SSE 區塊增量；第一個文字區塊不是完整輸出。

##### 需要檢查原始回應時

保留請求／回應 ID 與標頭。未提供通用的文字工作擷取 URL。

回應欄位

| 欄位 | 類型 |
| --- | --- |
| 欄位`id` | 類型string |
| 欄位`model` | 類型string |
| 欄位`content[]` | 類型text\|thinking\|tool\_use\|other content block |
| 欄位`stop_reason` | 類型string\|null |
| 欄位`usage` | 類型object |

錯誤與後續步驟

| 回應 | 條件 | 下一步 |
| --- | --- | --- |
| 回應400 · `invalid_request_error` | 條件必要欄位、素材表示方式或參數值無效 | 下一步提出新的建立請求前，先修正指定欄位。 |

### 別名

#### 模型別名

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

#### 方法路徑別名

`/chat/completions`

#### 相關呼叫用 ID

[`z-ai/glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=messages), [`glm`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=messages), [`glm-5`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=messages), [`glm-5.1`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=messages), [`glm-5.2`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=messages), [`glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=messages), [`~z-ai/glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=messages), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=messages), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#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/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=responses)

Z.ai /`glm-5`

模型 ID

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

### 入門

Z.ai GLM 5.3 是文字推理模型，適用於複雜軟體工程、終端機工作與長期任務代理。它支援製造商文件記載的 1M 詞元上下文、最多 128K 輸出詞元、函式呼叫與 low/high/max 推理強度，推理全程保持啟用。

接受的輸入

文字

結果

文字

### Ailoot 可用 · 輸入與方法

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

輸入

`text`

輸出

`text`

上下文

1,000,000 tokens

輸出上限

131,072 tokens

輸出格式

json 或 SSE

| 欄位 | 類型 | 要求 | 值與限制 | 預設值 |
| --- | --- | --- | --- | --- |
| 欄位`model` | 類型`string` | 要求必填 | 值與限制 glm-5 | 預設值— |
| 欄位`input` | 類型`string\|input_item[]` | 要求必填 | 值與限制 | 預設值— |
| 欄位`instructions` | 類型`string` | 要求選填 | 值與限制 | 預設值— |
| 欄位`input[].type` | 類型`string` | 要求選填 | 值與限制 message, reasoning, function\_call, function\_call\_output | 預設值— |
| 欄位`input[].content` | 類型`string\|content_part[]` | 要求選填 | 值與限制 | 預設值— |
| 欄位`input[].call_id` | 類型`string` | 要求選填 | 值與限制 適用條件: function\_call\_output；保留實際回傳的 call\_id | 預設值— |
| 欄位`input[].output` | 類型`string\|content_part[]` | 要求選填 | 值與限制 適用條件: function\_call\_output | 預設值— |
| 欄位`max_output_tokens` | 類型`integer` | 要求選填 | 值與限制 最小值: 1 依模型而定 | 預設值— |
| 欄位`stream` | 類型`boolean` | 要求選填 | 值與限制 | 預設值false |
| 欄位`temperature` | 類型`number` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`top_p` | 類型`number` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tools` | 類型`tool[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tool_choice` | 類型`string\|object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`parallel_tool_calls` | 類型`boolean` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`reasoning.effort` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`reasoning.summary` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`text.format` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`text.verbosity` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`include` | 類型`string[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`store` | 類型`boolean` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`previous_response_id` | 類型`string` | 要求選填 | 值與限制 ID 要求: 僅限支援的延續流程實際回傳的回應 ID 依模型而定 | 預設值— |
| 欄位`service_tier` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`prompt_cache_key` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`prompt_cache_options` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |

輸入素材組合

**文字** · UTF8 文字

`輸入文字或 input_text 部分`

方法參數與生命週期

| 參數 | 規格 |
| --- | --- |
| 參數`material_types` | 規格text |
| 參數`required` | 規格model, input |
| 參數`optional_controls` | 規格null |
| 參數`content_type` | 規格application/json |
| 參數`text_file_material` | 規格實際 UTF-8 內容以文字插入；檔案 ID／URLs 需要另有精確支援 |

生命週期： `exact retained published method`

方法結構與 ID 均為精確值；供應商能力與准入狀態分開。

### 方案

#### Ailoot 方法費率

輸入

US$0.0014 */ 1K*

輸出

US$0.0044 */ 1K*

讀取快取

≈US$0.00026 */ 1K*

Ailoot 會在請求前預留估算金額。取得結果後，依實測用量結算最終費用。串流結算採用最終用量紀錄。[預留金額與結算的運作方式 →](https://ailoot.ai/docs/zh-hant-tw/billing/reserve/)

#### 參考費率詳情

模型層級的參考費率表不會變更方法選擇、報價或費用。實際計費採用所選 Ailoot 方法的費率。

模型參考費率表

#### 各設定的價格

請逐一核對各項費用與所列條件。每組互為替代選項的設定只套用一種費率。

| 設定 | 費率表 | 上下文 Token 數大於 | 上下文 Token 數小於或等於 | 費用 |
| --- | --- | --- | --- | --- |
| 設定OpenAI Chat · 基本 token 費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定OpenAI Chat · 請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定Anthropic Messages · 基本 token 費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定Anthropic Messages · 請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |

### 請求範例

#### Ailoot · OpenAI Responses

文字範例Python SDKNode.js SDKPython 串流

```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")
```

### 接收並儲存結果

#### Ailoot · OpenAI Responses

json 或 SSE

##### 保留所有已完成的結果

請保留所有完整傳回的回應、檔案與內容區塊。

保留每個輸出項目與內容部分、實際函式 call\_id、加密推理與用量。串流時保留完整事件／項目身分。

##### 需要檢查原始回應時

保留請求／回應 ID 與標頭。未提供通用的文字工作擷取 URL。

回應欄位

| 欄位 | 類型 |
| --- | --- |
| 欄位`id` | 類型string |
| 欄位`status` | 類型string |
| 欄位`output[]` | 類型message\|reasoning\|function\_call\|other item |
| 欄位`output[].content[]` | 類型content part |
| 欄位`usage` | 類型object |

錯誤與後續步驟

| 回應 | 條件 | 下一步 |
| --- | --- | --- |
| 回應400 · `invalid_request_error` | 條件必要欄位、素材表示方式或參數值無效 | 下一步提出新的建立請求前，先修正指定欄位。 |

### 別名

#### 模型別名

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

#### 方法路徑別名

`/chat/completions`

#### 相關呼叫用 ID

[`z-ai/glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3), [`glm`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=responses), [`glm-5`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=responses), [`glm-5.1`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=responses), [`glm-5.2`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=responses), [`glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=responses), [`~z-ai/glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=responses), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#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/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=chat)

Z.ai /`glm-5`

模型 ID

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

### 入門

Z.ai GLM 5.3 是文字推理模型，適用於複雜軟體工程、終端機工作與長期任務代理。它支援製造商文件記載的 1M 詞元上下文、最多 128K 輸出詞元、函式呼叫與 low/high/max 推理強度，推理全程保持啟用。

接受的輸入

文字

結果

文字

### Ailoot 可用 · 輸入與方法

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

輸入

`text`

輸出

`text`

上下文

1,000,000 tokens

輸出上限

131,072 tokens

輸出格式

json 或 SSE

| 欄位 | 類型 | 要求 | 值與限制 | 預設值 |
| --- | --- | --- | --- | --- |
| 欄位`model` | 類型`string` | 要求必填 | 值與限制 glm-5 | 預設值— |
| 欄位`messages` | 類型`message[]` | 要求必填 | 值與限制 項目數下限: 1 | 預設值— |
| 欄位`messages[].role` | 類型`string` | 要求必填 | 值與限制 範例：system, user, assistant, tool, function 條件: 這些角色由 原始碼中的相容型別明確表示；確切角色集合仍依模型而定。 依模型而定 | 預設值— |
| 欄位`messages[].content` | 類型`string\|content_part[]\|null` | 要求選填 | 值與限制 | 預設值— |
| 欄位`messages[].tool_calls` | 類型`tool_call[]` | 要求選填 | 值與限制 | 預設值— |
| 欄位`messages[].tool_call_id` | 類型`string` | 要求選填 | 值與限制 適用條件: role=tool；使用實際回傳的 ID | 預設值— |
| 欄位`messages[].name` | 類型`string` | 要求選填 | 值與限制 | 預設值— |
| 欄位`messages[].reasoning_content` | 類型`string` | 要求選填 | 值與限制 適用條件: 此模型使用推理內容時，將實際回傳的推理內容帶回後續請求 | 預設值— |
| 欄位`messages[].reasoning_details` | 類型`object\|array` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`max_tokens` | 類型`integer` | 要求選填 | 值與限制 最小值: 1 依模型而定 | 預設值— |
| 欄位`max_completion_tokens` | 類型`integer` | 要求選填 | 值與限制 最小值: 1 依模型而定 | 預設值— |
| 欄位`stream` | 類型`boolean` | 要求選填 | 值與限制 | 預設值false |
| 欄位`stream_options.include_usage` | 類型`boolean` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`temperature` | 類型`number` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`top_p` | 類型`number` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`stop` | 類型`string\|string[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tools` | 類型`function_tool[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tools[].type` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tools[].function.name` | 類型`string` | 要求必填 | 值與限制 適用條件: 已提供函式工具 | 預設值— |
| 欄位`tools[].function.description` | 類型`string` | 要求選填 | 值與限制 | 預設值— |
| 欄位`tools[].function.parameters` | 類型`JSON_schema` | 要求選填 | 值與限制 | 預設值— |
| 欄位`tool_choice` | 類型`string\|object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`parallel_tool_calls` | 類型`boolean` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`response_format` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`reasoning_effort` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`reasoning` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`service_tier` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`instructions` | 類型`string` | 要求選填 | 值與限制 相容性欄位 | 預設值— |
| 欄位`functions` | 類型`function[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`function_call` | 類型`string\|object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`prompt_cache_options` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |

輸入素材組合

**文字** · UTF8 文字

`messages[].content`

方法參數與生命週期

| 參數 | 規格 |
| --- | --- |
| 參數`material_types` | 規格text |
| 參數`required` | 規格model, messages |
| 參數`optional_controls` | 規格null |
| 參數`content_type` | 規格application/json |
| 參數`text_file_material` | 規格實際 UTF-8 內容以文字插入；檔案 ID／URLs 需要另有精確支援 |

生命週期： `exact retained published method`

方法結構與 ID 均為精確值；供應商能力與准入狀態分開。

### 方案

#### Ailoot 方法費率

輸入

US$0.0014 */ 1K*

輸出

US$0.0044 */ 1K*

讀取快取

≈US$0.00026 */ 1K*

Ailoot 會在請求前預留估算金額。取得結果後，依實測用量結算最終費用。串流結算採用最終用量紀錄。[預留金額與結算的運作方式 →](https://ailoot.ai/docs/zh-hant-tw/billing/reserve/)

#### 參考費率詳情

模型層級的參考費率表不會變更方法選擇、報價或費用。實際計費採用所選 Ailoot 方法的費率。

模型參考費率表

#### 各設定的價格

請逐一核對各項費用與所列條件。每組互為替代選項的設定只套用一種費率。

| 設定 | 費率表 | 上下文 Token 數大於 | 上下文 Token 數小於或等於 | 費用 |
| --- | --- | --- | --- | --- |
| 設定OpenAI Chat · 基本 token 費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定OpenAI Chat · 請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定Anthropic Messages · 基本 token 費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定Anthropic Messages · 請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |

### 請求範例

#### Ailoot · OpenAI Chat

文字範例Python SDKNode.js SDKPython 串流

```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")
```

### 接收並儲存結果

#### Ailoot · OpenAI Chat

json 或 SSE

##### 保留所有已完成的結果

請保留所有完整傳回的回應、檔案與內容區塊。

保留每個候選項及其內容／工具呼叫／推理。SSE 中依候選項／工具索引組合增量，保留最終完成原因與用量。

##### 需要檢查原始回應時

保留請求／回應 ID 與標頭。未提供通用的文字工作擷取 URL。

回應欄位

| 欄位 | 類型 |
| --- | --- |
| 欄位`choices[].index` | 類型integer |
| 欄位`choices[].message.content` | 類型string\|null |
| 欄位`choices[].message.tool_calls` | 類型tool\_call\[\] |
| 欄位`choices[].message.reasoning_content` | 類型string |
| 欄位`choices[].message.reasoning_details` | 類型object\|array |
| 欄位`choices[].finish_reason` | 類型string\|null |
| 欄位`usage` | 類型object |

錯誤與後續步驟

| 回應 | 條件 | 下一步 |
| --- | --- | --- |
| 回應400 · `invalid_request_error` | 條件必要欄位、素材表示方式或參數值無效 | 下一步提出新的建立請求前，先修正指定欄位。 |

### 別名

#### 模型別名

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

#### 方法路徑別名

`/chat/completions`

#### 相關呼叫用 ID

[`z-ai/glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=chat), [`glm`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=chat), [`glm-5`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=chat), [`glm-5.1`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=chat), [`glm-5.2`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=chat), [`glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=chat), [`~z-ai/glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=chat), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=chat), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#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/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=messages)

Z.ai /`glm-5.1`

模型 ID

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

### 入門

Z.ai GLM 5.3 是文字推理模型，適用於複雜軟體工程、終端機工作與長期任務代理。它支援製造商文件記載的 1M 詞元上下文、最多 128K 輸出詞元、函式呼叫與 low/high/max 推理強度，推理全程保持啟用。

接受的輸入

文字

結果

文字

### Ailoot 可用 · 輸入與方法

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

輸入

`text`

輸出

`text`

上下文

1,000,000 tokens

輸出上限

131,072 tokens

輸出格式

json 或 SSE

| 欄位 | 類型 | 要求 | 值與限制 | 預設值 |
| --- | --- | --- | --- | --- |
| 欄位`model` | 類型`string` | 要求必填 | 值與限制 glm-5.1 | 預設值— |
| 欄位`messages` | 類型`message[]` | 要求必填 | 值與限制 項目數下限: 1 | 預設值— |
| 欄位`messages[].role` | 類型`string` | 要求必填 | 值與限制 user, assistant | 預設值— |
| 欄位`messages[].content` | 類型`string\|content_block[]` | 要求必填 | 值與限制 | 預設值— |
| 欄位`system` | 類型`string\|content_block[]` | 要求選填 | 值與限制 | 預設值— |
| 欄位`max_tokens` | 類型`integer` | 要求必填 | 值與限制 最小值: 1 限制適用對象: 所選模型／卡片的確切上限 | 預設值— |
| 欄位`stream` | 類型`boolean` | 要求選填 | 值與限制 | 預設值false |
| 欄位`temperature` | 類型`number` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`top_p` | 類型`number` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`stop_sequences` | 類型`string[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tools` | 類型`tool[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tools[].name` | 類型`string` | 要求選填 | 值與限制 適用條件: 已提供工具 | 預設值— |
| 欄位`tools[].description` | 類型`string` | 要求選填 | 值與限制 | 預設值— |
| 欄位`tools[].input_schema` | 類型`JSON_schema` | 要求選填 | 值與限制 | 預設值— |
| 欄位`tool_choice` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`thinking.type` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`thinking.budget_tokens` | 類型`integer` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`output_config.effort` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`metadata` | 類型`object` | 要求選填 | 值與限制 | 預設值— |
| 欄位`cache_control` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |

輸入素材組合

**文字** · UTF8 文字

`messages[].content 或 type=text 區塊`

方法參數與生命週期

| 參數 | 規格 |
| --- | --- |
| 參數`material_types` | 規格text |
| 參數`required` | 規格model, messages, max\_tokens |
| 參數`optional_controls` | 規格null |
| 參數`content_type` | 規格application/json |
| 參數`text_file_material` | 規格實際 UTF-8 內容以文字插入；檔案 ID／URLs 需要另有精確支援 |

生命週期： `exact retained published method`

方法結構與 ID 均為精確值；供應商能力與准入狀態分開。

### 方案

#### Ailoot 方法費率

輸入

US$0.0014 */ 1K*

輸出

US$0.0044 */ 1K*

讀取快取

≈US$0.00026 */ 1K*

Ailoot 會在請求前預留估算金額。取得結果後，依實測用量結算最終費用。串流結算採用最終用量紀錄。[預留金額與結算的運作方式 →](https://ailoot.ai/docs/zh-hant-tw/billing/reserve/)

#### 參考費率詳情

模型層級的參考費率表不會變更方法選擇、報價或費用。實際計費採用所選 Ailoot 方法的費率。

模型參考費率表

#### 各設定的價格

請逐一核對各項費用與所列條件。每組互為替代選項的設定只套用一種費率。

| 設定 | 費率表 | 上下文 Token 數大於 | 上下文 Token 數小於或等於 | 費用 |
| --- | --- | --- | --- | --- |
| 設定OpenAI Chat · 基本 token 費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定OpenAI Chat · 請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定Anthropic Messages · 基本 token 費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定Anthropic Messages · 請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |

### 請求範例

#### Ailoot · Anthropic Messages

文字範例Python SDKNode.js SDKPython 串流

```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")
```

### 接收並儲存結果

#### Ailoot · Anthropic Messages

json 或 SSE

##### 保留所有已完成的結果

請保留所有完整傳回的回應、檔案與內容區塊。

保留所有內容區塊、思考簽章與實際工具使用 ID。組合所有 SSE 區塊增量；第一個文字區塊不是完整輸出。

##### 需要檢查原始回應時

保留請求／回應 ID 與標頭。未提供通用的文字工作擷取 URL。

回應欄位

| 欄位 | 類型 |
| --- | --- |
| 欄位`id` | 類型string |
| 欄位`model` | 類型string |
| 欄位`content[]` | 類型text\|thinking\|tool\_use\|other content block |
| 欄位`stop_reason` | 類型string\|null |
| 欄位`usage` | 類型object |

錯誤與後續步驟

| 回應 | 條件 | 下一步 |
| --- | --- | --- |
| 回應400 · `invalid_request_error` | 條件必要欄位、素材表示方式或參數值無效 | 下一步提出新的建立請求前，先修正指定欄位。 |

### 別名

#### 模型別名

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

#### 方法路徑別名

`/chat/completions`

#### 相關呼叫用 ID

[`z-ai/glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=messages), [`glm`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=messages), [`glm-5`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=messages), [`glm-5.1`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=messages), [`glm-5.2`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=messages), [`glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=messages), [`~z-ai/glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=messages), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=messages), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#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/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=responses)

Z.ai /`glm-5.1`

模型 ID

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

### 入門

Z.ai GLM 5.3 是文字推理模型，適用於複雜軟體工程、終端機工作與長期任務代理。它支援製造商文件記載的 1M 詞元上下文、最多 128K 輸出詞元、函式呼叫與 low/high/max 推理強度，推理全程保持啟用。

接受的輸入

文字

結果

文字

### Ailoot 可用 · 輸入與方法

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

輸入

`text`

輸出

`text`

上下文

1,000,000 tokens

輸出上限

131,072 tokens

輸出格式

json 或 SSE

| 欄位 | 類型 | 要求 | 值與限制 | 預設值 |
| --- | --- | --- | --- | --- |
| 欄位`model` | 類型`string` | 要求必填 | 值與限制 glm-5.1 | 預設值— |
| 欄位`input` | 類型`string\|input_item[]` | 要求必填 | 值與限制 | 預設值— |
| 欄位`instructions` | 類型`string` | 要求選填 | 值與限制 | 預設值— |
| 欄位`input[].type` | 類型`string` | 要求選填 | 值與限制 message, reasoning, function\_call, function\_call\_output | 預設值— |
| 欄位`input[].content` | 類型`string\|content_part[]` | 要求選填 | 值與限制 | 預設值— |
| 欄位`input[].call_id` | 類型`string` | 要求選填 | 值與限制 適用條件: function\_call\_output；保留實際回傳的 call\_id | 預設值— |
| 欄位`input[].output` | 類型`string\|content_part[]` | 要求選填 | 值與限制 適用條件: function\_call\_output | 預設值— |
| 欄位`max_output_tokens` | 類型`integer` | 要求選填 | 值與限制 最小值: 1 依模型而定 | 預設值— |
| 欄位`stream` | 類型`boolean` | 要求選填 | 值與限制 | 預設值false |
| 欄位`temperature` | 類型`number` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`top_p` | 類型`number` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tools` | 類型`tool[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tool_choice` | 類型`string\|object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`parallel_tool_calls` | 類型`boolean` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`reasoning.effort` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`reasoning.summary` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`text.format` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`text.verbosity` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`include` | 類型`string[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`store` | 類型`boolean` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`previous_response_id` | 類型`string` | 要求選填 | 值與限制 ID 要求: 僅限支援的延續流程實際回傳的回應 ID 依模型而定 | 預設值— |
| 欄位`service_tier` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`prompt_cache_key` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`prompt_cache_options` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |

輸入素材組合

**文字** · UTF8 文字

`輸入文字或 input_text 部分`

方法參數與生命週期

| 參數 | 規格 |
| --- | --- |
| 參數`material_types` | 規格text |
| 參數`required` | 規格model, input |
| 參數`optional_controls` | 規格null |
| 參數`content_type` | 規格application/json |
| 參數`text_file_material` | 規格實際 UTF-8 內容以文字插入；檔案 ID／URLs 需要另有精確支援 |

生命週期： `exact retained published method`

方法結構與 ID 均為精確值；供應商能力與准入狀態分開。

### 方案

#### Ailoot 方法費率

輸入

US$0.0014 */ 1K*

輸出

US$0.0044 */ 1K*

讀取快取

≈US$0.00026 */ 1K*

Ailoot 會在請求前預留估算金額。取得結果後，依實測用量結算最終費用。串流結算採用最終用量紀錄。[預留金額與結算的運作方式 →](https://ailoot.ai/docs/zh-hant-tw/billing/reserve/)

#### 參考費率詳情

模型層級的參考費率表不會變更方法選擇、報價或費用。實際計費採用所選 Ailoot 方法的費率。

模型參考費率表

#### 各設定的價格

請逐一核對各項費用與所列條件。每組互為替代選項的設定只套用一種費率。

| 設定 | 費率表 | 上下文 Token 數大於 | 上下文 Token 數小於或等於 | 費用 |
| --- | --- | --- | --- | --- |
| 設定OpenAI Chat · 基本 token 費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定OpenAI Chat · 請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定Anthropic Messages · 基本 token 費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定Anthropic Messages · 請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |

### 請求範例

#### Ailoot · OpenAI Responses

文字範例Python SDKNode.js SDKPython 串流

```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")
```

### 接收並儲存結果

#### Ailoot · OpenAI Responses

json 或 SSE

##### 保留所有已完成的結果

請保留所有完整傳回的回應、檔案與內容區塊。

保留每個輸出項目與內容部分、實際函式 call\_id、加密推理與用量。串流時保留完整事件／項目身分。

##### 需要檢查原始回應時

保留請求／回應 ID 與標頭。未提供通用的文字工作擷取 URL。

回應欄位

| 欄位 | 類型 |
| --- | --- |
| 欄位`id` | 類型string |
| 欄位`status` | 類型string |
| 欄位`output[]` | 類型message\|reasoning\|function\_call\|other item |
| 欄位`output[].content[]` | 類型content part |
| 欄位`usage` | 類型object |

錯誤與後續步驟

| 回應 | 條件 | 下一步 |
| --- | --- | --- |
| 回應400 · `invalid_request_error` | 條件必要欄位、素材表示方式或參數值無效 | 下一步提出新的建立請求前，先修正指定欄位。 |

### 別名

#### 模型別名

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

#### 方法路徑別名

`/chat/completions`

#### 相關呼叫用 ID

[`z-ai/glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3), [`glm`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=responses), [`glm-5`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=responses), [`glm-5.1`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=responses), [`glm-5.2`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=responses), [`glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=responses), [`~z-ai/glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=responses), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#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/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=chat)

Z.ai /`glm-5.1`

模型 ID

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

### 入門

Z.ai GLM 5.3 是文字推理模型，適用於複雜軟體工程、終端機工作與長期任務代理。它支援製造商文件記載的 1M 詞元上下文、最多 128K 輸出詞元、函式呼叫與 low/high/max 推理強度，推理全程保持啟用。

接受的輸入

文字

結果

文字

### Ailoot 可用 · 輸入與方法

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

輸入

`text`

輸出

`text`

上下文

1,000,000 tokens

輸出上限

131,072 tokens

輸出格式

json 或 SSE

| 欄位 | 類型 | 要求 | 值與限制 | 預設值 |
| --- | --- | --- | --- | --- |
| 欄位`model` | 類型`string` | 要求必填 | 值與限制 glm-5.1 | 預設值— |
| 欄位`messages` | 類型`message[]` | 要求必填 | 值與限制 項目數下限: 1 | 預設值— |
| 欄位`messages[].role` | 類型`string` | 要求必填 | 值與限制 範例：system, user, assistant, tool, function 條件: 這些角色由 原始碼中的相容型別明確表示；確切角色集合仍依模型而定。 依模型而定 | 預設值— |
| 欄位`messages[].content` | 類型`string\|content_part[]\|null` | 要求選填 | 值與限制 | 預設值— |
| 欄位`messages[].tool_calls` | 類型`tool_call[]` | 要求選填 | 值與限制 | 預設值— |
| 欄位`messages[].tool_call_id` | 類型`string` | 要求選填 | 值與限制 適用條件: role=tool；使用實際回傳的 ID | 預設值— |
| 欄位`messages[].name` | 類型`string` | 要求選填 | 值與限制 | 預設值— |
| 欄位`messages[].reasoning_content` | 類型`string` | 要求選填 | 值與限制 適用條件: 此模型使用推理內容時，將實際回傳的推理內容帶回後續請求 | 預設值— |
| 欄位`messages[].reasoning_details` | 類型`object\|array` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`max_tokens` | 類型`integer` | 要求選填 | 值與限制 最小值: 1 依模型而定 | 預設值— |
| 欄位`max_completion_tokens` | 類型`integer` | 要求選填 | 值與限制 最小值: 1 依模型而定 | 預設值— |
| 欄位`stream` | 類型`boolean` | 要求選填 | 值與限制 | 預設值false |
| 欄位`stream_options.include_usage` | 類型`boolean` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`temperature` | 類型`number` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`top_p` | 類型`number` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`stop` | 類型`string\|string[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tools` | 類型`function_tool[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tools[].type` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tools[].function.name` | 類型`string` | 要求必填 | 值與限制 適用條件: 已提供函式工具 | 預設值— |
| 欄位`tools[].function.description` | 類型`string` | 要求選填 | 值與限制 | 預設值— |
| 欄位`tools[].function.parameters` | 類型`JSON_schema` | 要求選填 | 值與限制 | 預設值— |
| 欄位`tool_choice` | 類型`string\|object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`parallel_tool_calls` | 類型`boolean` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`response_format` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`reasoning_effort` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`reasoning` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`service_tier` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`instructions` | 類型`string` | 要求選填 | 值與限制 相容性欄位 | 預設值— |
| 欄位`functions` | 類型`function[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`function_call` | 類型`string\|object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`prompt_cache_options` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |

輸入素材組合

**文字** · UTF8 文字

`messages[].content`

方法參數與生命週期

| 參數 | 規格 |
| --- | --- |
| 參數`material_types` | 規格text |
| 參數`required` | 規格model, messages |
| 參數`optional_controls` | 規格null |
| 參數`content_type` | 規格application/json |
| 參數`text_file_material` | 規格實際 UTF-8 內容以文字插入；檔案 ID／URLs 需要另有精確支援 |

生命週期： `exact retained published method`

方法結構與 ID 均為精確值；供應商能力與准入狀態分開。

### 方案

#### Ailoot 方法費率

輸入

US$0.0014 */ 1K*

輸出

US$0.0044 */ 1K*

讀取快取

≈US$0.00026 */ 1K*

Ailoot 會在請求前預留估算金額。取得結果後，依實測用量結算最終費用。串流結算採用最終用量紀錄。[預留金額與結算的運作方式 →](https://ailoot.ai/docs/zh-hant-tw/billing/reserve/)

#### 參考費率詳情

模型層級的參考費率表不會變更方法選擇、報價或費用。實際計費採用所選 Ailoot 方法的費率。

模型參考費率表

#### 各設定的價格

請逐一核對各項費用與所列條件。每組互為替代選項的設定只套用一種費率。

| 設定 | 費率表 | 上下文 Token 數大於 | 上下文 Token 數小於或等於 | 費用 |
| --- | --- | --- | --- | --- |
| 設定OpenAI Chat · 基本 token 費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定OpenAI Chat · 請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定Anthropic Messages · 基本 token 費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定Anthropic Messages · 請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |

### 請求範例

#### Ailoot · OpenAI Chat

文字範例Python SDKNode.js SDKPython 串流

```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")
```

### 接收並儲存結果

#### Ailoot · OpenAI Chat

json 或 SSE

##### 保留所有已完成的結果

請保留所有完整傳回的回應、檔案與內容區塊。

保留每個候選項及其內容／工具呼叫／推理。SSE 中依候選項／工具索引組合增量，保留最終完成原因與用量。

##### 需要檢查原始回應時

保留請求／回應 ID 與標頭。未提供通用的文字工作擷取 URL。

回應欄位

| 欄位 | 類型 |
| --- | --- |
| 欄位`choices[].index` | 類型integer |
| 欄位`choices[].message.content` | 類型string\|null |
| 欄位`choices[].message.tool_calls` | 類型tool\_call\[\] |
| 欄位`choices[].message.reasoning_content` | 類型string |
| 欄位`choices[].message.reasoning_details` | 類型object\|array |
| 欄位`choices[].finish_reason` | 類型string\|null |
| 欄位`usage` | 類型object |

錯誤與後續步驟

| 回應 | 條件 | 下一步 |
| --- | --- | --- |
| 回應400 · `invalid_request_error` | 條件必要欄位、素材表示方式或參數值無效 | 下一步提出新的建立請求前，先修正指定欄位。 |

### 別名

#### 模型別名

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

#### 方法路徑別名

`/chat/completions`

#### 相關呼叫用 ID

[`z-ai/glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=chat), [`glm`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=chat), [`glm-5`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=chat), [`glm-5.1`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=chat), [`glm-5.2`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=chat), [`glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=chat), [`~z-ai/glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=chat), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=chat), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#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/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=messages)

Z.ai /`glm-5.2`

模型 ID

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

### 入門

Z.ai GLM 5.3 是文字推理模型，適用於複雜軟體工程、終端機工作與長期任務代理。它支援製造商文件記載的 1M 詞元上下文、最多 128K 輸出詞元、函式呼叫與 low/high/max 推理強度，推理全程保持啟用。

接受的輸入

文字

結果

文字

### Ailoot 可用 · 輸入與方法

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

輸入

`text`

輸出

`text`

上下文

1,000,000 tokens

輸出上限

131,072 tokens

輸出格式

json 或 SSE

| 欄位 | 類型 | 要求 | 值與限制 | 預設值 |
| --- | --- | --- | --- | --- |
| 欄位`model` | 類型`string` | 要求必填 | 值與限制 glm-5.2 | 預設值— |
| 欄位`messages` | 類型`message[]` | 要求必填 | 值與限制 項目數下限: 1 | 預設值— |
| 欄位`messages[].role` | 類型`string` | 要求必填 | 值與限制 user, assistant | 預設值— |
| 欄位`messages[].content` | 類型`string\|content_block[]` | 要求必填 | 值與限制 | 預設值— |
| 欄位`system` | 類型`string\|content_block[]` | 要求選填 | 值與限制 | 預設值— |
| 欄位`max_tokens` | 類型`integer` | 要求必填 | 值與限制 最小值: 1 限制適用對象: 所選模型／卡片的確切上限 | 預設值— |
| 欄位`stream` | 類型`boolean` | 要求選填 | 值與限制 | 預設值false |
| 欄位`temperature` | 類型`number` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`top_p` | 類型`number` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`stop_sequences` | 類型`string[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tools` | 類型`tool[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tools[].name` | 類型`string` | 要求選填 | 值與限制 適用條件: 已提供工具 | 預設值— |
| 欄位`tools[].description` | 類型`string` | 要求選填 | 值與限制 | 預設值— |
| 欄位`tools[].input_schema` | 類型`JSON_schema` | 要求選填 | 值與限制 | 預設值— |
| 欄位`tool_choice` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`thinking.type` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`thinking.budget_tokens` | 類型`integer` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`output_config.effort` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`metadata` | 類型`object` | 要求選填 | 值與限制 | 預設值— |
| 欄位`cache_control` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |

輸入素材組合

**文字** · UTF8 文字

`messages[].content 或 type=text 區塊`

方法參數與生命週期

| 參數 | 規格 |
| --- | --- |
| 參數`material_types` | 規格text |
| 參數`required` | 規格model, messages, max\_tokens |
| 參數`optional_controls` | 規格null |
| 參數`content_type` | 規格application/json |
| 參數`text_file_material` | 規格實際 UTF-8 內容以文字插入；檔案 ID／URLs 需要另有精確支援 |

生命週期： `exact retained published method`

方法結構與 ID 均為精確值；供應商能力與准入狀態分開。

### 方案

#### Ailoot 方法費率

輸入

US$0.0014 */ 1K*

輸出

US$0.0044 */ 1K*

讀取快取

≈US$0.00026 */ 1K*

Ailoot 會在請求前預留估算金額。取得結果後，依實測用量結算最終費用。串流結算採用最終用量紀錄。[預留金額與結算的運作方式 →](https://ailoot.ai/docs/zh-hant-tw/billing/reserve/)

#### 參考費率詳情

模型層級的參考費率表不會變更方法選擇、報價或費用。實際計費採用所選 Ailoot 方法的費率。

模型參考費率表

#### 各設定的價格

請逐一核對各項費用與所列條件。每組互為替代選項的設定只套用一種費率。

| 設定 | 費率表 | 上下文 Token 數大於 | 上下文 Token 數小於或等於 | 費用 |
| --- | --- | --- | --- | --- |
| 設定OpenAI Chat · 基本 token 費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定OpenAI Chat · 請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定Anthropic Messages · 基本 token 費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定Anthropic Messages · 請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |

### 請求範例

#### Ailoot · Anthropic Messages

文字範例Python SDKNode.js SDKPython 串流

```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")
```

### 接收並儲存結果

#### Ailoot · Anthropic Messages

json 或 SSE

##### 保留所有已完成的結果

請保留所有完整傳回的回應、檔案與內容區塊。

保留所有內容區塊、思考簽章與實際工具使用 ID。組合所有 SSE 區塊增量；第一個文字區塊不是完整輸出。

##### 需要檢查原始回應時

保留請求／回應 ID 與標頭。未提供通用的文字工作擷取 URL。

回應欄位

| 欄位 | 類型 |
| --- | --- |
| 欄位`id` | 類型string |
| 欄位`model` | 類型string |
| 欄位`content[]` | 類型text\|thinking\|tool\_use\|other content block |
| 欄位`stop_reason` | 類型string\|null |
| 欄位`usage` | 類型object |

錯誤與後續步驟

| 回應 | 條件 | 下一步 |
| --- | --- | --- |
| 回應400 · `invalid_request_error` | 條件必要欄位、素材表示方式或參數值無效 | 下一步提出新的建立請求前，先修正指定欄位。 |

### 別名

#### 模型別名

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

#### 方法路徑別名

`/chat/completions`

#### 相關呼叫用 ID

[`z-ai/glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=messages), [`glm`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=messages), [`glm-5`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=messages), [`glm-5.1`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=messages), [`glm-5.2`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=messages), [`glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=messages), [`~z-ai/glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=messages), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=messages), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#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/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=responses)

Z.ai /`glm-5.2`

模型 ID

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

### 入門

Z.ai GLM 5.3 是文字推理模型，適用於複雜軟體工程、終端機工作與長期任務代理。它支援製造商文件記載的 1M 詞元上下文、最多 128K 輸出詞元、函式呼叫與 low/high/max 推理強度，推理全程保持啟用。

接受的輸入

文字

結果

文字

### Ailoot 可用 · 輸入與方法

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

輸入

`text`

輸出

`text`

上下文

1,000,000 tokens

輸出上限

131,072 tokens

輸出格式

json 或 SSE

| 欄位 | 類型 | 要求 | 值與限制 | 預設值 |
| --- | --- | --- | --- | --- |
| 欄位`model` | 類型`string` | 要求必填 | 值與限制 glm-5.2 | 預設值— |
| 欄位`input` | 類型`string\|input_item[]` | 要求必填 | 值與限制 | 預設值— |
| 欄位`instructions` | 類型`string` | 要求選填 | 值與限制 | 預設值— |
| 欄位`input[].type` | 類型`string` | 要求選填 | 值與限制 message, reasoning, function\_call, function\_call\_output | 預設值— |
| 欄位`input[].content` | 類型`string\|content_part[]` | 要求選填 | 值與限制 | 預設值— |
| 欄位`input[].call_id` | 類型`string` | 要求選填 | 值與限制 適用條件: function\_call\_output；保留實際回傳的 call\_id | 預設值— |
| 欄位`input[].output` | 類型`string\|content_part[]` | 要求選填 | 值與限制 適用條件: function\_call\_output | 預設值— |
| 欄位`max_output_tokens` | 類型`integer` | 要求選填 | 值與限制 最小值: 1 依模型而定 | 預設值— |
| 欄位`stream` | 類型`boolean` | 要求選填 | 值與限制 | 預設值false |
| 欄位`temperature` | 類型`number` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`top_p` | 類型`number` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tools` | 類型`tool[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tool_choice` | 類型`string\|object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`parallel_tool_calls` | 類型`boolean` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`reasoning.effort` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`reasoning.summary` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`text.format` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`text.verbosity` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`include` | 類型`string[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`store` | 類型`boolean` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`previous_response_id` | 類型`string` | 要求選填 | 值與限制 ID 要求: 僅限支援的延續流程實際回傳的回應 ID 依模型而定 | 預設值— |
| 欄位`service_tier` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`prompt_cache_key` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`prompt_cache_options` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |

輸入素材組合

**文字** · UTF8 文字

`輸入文字或 input_text 部分`

方法參數與生命週期

| 參數 | 規格 |
| --- | --- |
| 參數`material_types` | 規格text |
| 參數`required` | 規格model, input |
| 參數`optional_controls` | 規格null |
| 參數`content_type` | 規格application/json |
| 參數`text_file_material` | 規格實際 UTF-8 內容以文字插入；檔案 ID／URLs 需要另有精確支援 |

生命週期： `exact retained published method`

方法結構與 ID 均為精確值；供應商能力與准入狀態分開。

### 方案

#### Ailoot 方法費率

輸入

US$0.0014 */ 1K*

輸出

US$0.0044 */ 1K*

讀取快取

≈US$0.00026 */ 1K*

Ailoot 會在請求前預留估算金額。取得結果後，依實測用量結算最終費用。串流結算採用最終用量紀錄。[預留金額與結算的運作方式 →](https://ailoot.ai/docs/zh-hant-tw/billing/reserve/)

#### 參考費率詳情

模型層級的參考費率表不會變更方法選擇、報價或費用。實際計費採用所選 Ailoot 方法的費率。

模型參考費率表

#### 各設定的價格

請逐一核對各項費用與所列條件。每組互為替代選項的設定只套用一種費率。

| 設定 | 費率表 | 上下文 Token 數大於 | 上下文 Token 數小於或等於 | 費用 |
| --- | --- | --- | --- | --- |
| 設定OpenAI Chat · 基本 token 費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定OpenAI Chat · 請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定Anthropic Messages · 基本 token 費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定Anthropic Messages · 請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |

### 請求範例

#### Ailoot · OpenAI Responses

文字範例Python SDKNode.js SDKPython 串流

```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")
```

### 接收並儲存結果

#### Ailoot · OpenAI Responses

json 或 SSE

##### 保留所有已完成的結果

請保留所有完整傳回的回應、檔案與內容區塊。

保留每個輸出項目與內容部分、實際函式 call\_id、加密推理與用量。串流時保留完整事件／項目身分。

##### 需要檢查原始回應時

保留請求／回應 ID 與標頭。未提供通用的文字工作擷取 URL。

回應欄位

| 欄位 | 類型 |
| --- | --- |
| 欄位`id` | 類型string |
| 欄位`status` | 類型string |
| 欄位`output[]` | 類型message\|reasoning\|function\_call\|other item |
| 欄位`output[].content[]` | 類型content part |
| 欄位`usage` | 類型object |

錯誤與後續步驟

| 回應 | 條件 | 下一步 |
| --- | --- | --- |
| 回應400 · `invalid_request_error` | 條件必要欄位、素材表示方式或參數值無效 | 下一步提出新的建立請求前，先修正指定欄位。 |

### 別名

#### 模型別名

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

#### 方法路徑別名

`/chat/completions`

#### 相關呼叫用 ID

[`z-ai/glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3), [`glm`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=responses), [`glm-5`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=responses), [`glm-5.1`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=responses), [`glm-5.2`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=responses), [`glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=responses), [`~z-ai/glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=responses), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#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/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=chat)

Z.ai /`glm-5.2`

模型 ID

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

### 入門

Z.ai GLM 5.3 是文字推理模型，適用於複雜軟體工程、終端機工作與長期任務代理。它支援製造商文件記載的 1M 詞元上下文、最多 128K 輸出詞元、函式呼叫與 low/high/max 推理強度，推理全程保持啟用。

接受的輸入

文字

結果

文字

### Ailoot 可用 · 輸入與方法

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

輸入

`text`

輸出

`text`

上下文

1,000,000 tokens

輸出上限

131,072 tokens

輸出格式

json 或 SSE

| 欄位 | 類型 | 要求 | 值與限制 | 預設值 |
| --- | --- | --- | --- | --- |
| 欄位`model` | 類型`string` | 要求必填 | 值與限制 glm-5.2 | 預設值— |
| 欄位`messages` | 類型`message[]` | 要求必填 | 值與限制 項目數下限: 1 | 預設值— |
| 欄位`messages[].role` | 類型`string` | 要求必填 | 值與限制 範例：system, user, assistant, tool, function 條件: 這些角色由 原始碼中的相容型別明確表示；確切角色集合仍依模型而定。 依模型而定 | 預設值— |
| 欄位`messages[].content` | 類型`string\|content_part[]\|null` | 要求選填 | 值與限制 | 預設值— |
| 欄位`messages[].tool_calls` | 類型`tool_call[]` | 要求選填 | 值與限制 | 預設值— |
| 欄位`messages[].tool_call_id` | 類型`string` | 要求選填 | 值與限制 適用條件: role=tool；使用實際回傳的 ID | 預設值— |
| 欄位`messages[].name` | 類型`string` | 要求選填 | 值與限制 | 預設值— |
| 欄位`messages[].reasoning_content` | 類型`string` | 要求選填 | 值與限制 適用條件: 此模型使用推理內容時，將實際回傳的推理內容帶回後續請求 | 預設值— |
| 欄位`messages[].reasoning_details` | 類型`object\|array` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`max_tokens` | 類型`integer` | 要求選填 | 值與限制 最小值: 1 依模型而定 | 預設值— |
| 欄位`max_completion_tokens` | 類型`integer` | 要求選填 | 值與限制 最小值: 1 依模型而定 | 預設值— |
| 欄位`stream` | 類型`boolean` | 要求選填 | 值與限制 | 預設值false |
| 欄位`stream_options.include_usage` | 類型`boolean` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`temperature` | 類型`number` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`top_p` | 類型`number` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`stop` | 類型`string\|string[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tools` | 類型`function_tool[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tools[].type` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tools[].function.name` | 類型`string` | 要求必填 | 值與限制 適用條件: 已提供函式工具 | 預設值— |
| 欄位`tools[].function.description` | 類型`string` | 要求選填 | 值與限制 | 預設值— |
| 欄位`tools[].function.parameters` | 類型`JSON_schema` | 要求選填 | 值與限制 | 預設值— |
| 欄位`tool_choice` | 類型`string\|object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`parallel_tool_calls` | 類型`boolean` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`response_format` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`reasoning_effort` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`reasoning` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`service_tier` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`instructions` | 類型`string` | 要求選填 | 值與限制 相容性欄位 | 預設值— |
| 欄位`functions` | 類型`function[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`function_call` | 類型`string\|object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`prompt_cache_options` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |

輸入素材組合

**文字** · UTF8 文字

`messages[].content`

方法參數與生命週期

| 參數 | 規格 |
| --- | --- |
| 參數`material_types` | 規格text |
| 參數`required` | 規格model, messages |
| 參數`optional_controls` | 規格null |
| 參數`content_type` | 規格application/json |
| 參數`text_file_material` | 規格實際 UTF-8 內容以文字插入；檔案 ID／URLs 需要另有精確支援 |

生命週期： `exact retained published method`

方法結構與 ID 均為精確值；供應商能力與准入狀態分開。

### 方案

#### Ailoot 方法費率

輸入

US$0.0014 */ 1K*

輸出

US$0.0044 */ 1K*

讀取快取

≈US$0.00026 */ 1K*

Ailoot 會在請求前預留估算金額。取得結果後，依實測用量結算最終費用。串流結算採用最終用量紀錄。[預留金額與結算的運作方式 →](https://ailoot.ai/docs/zh-hant-tw/billing/reserve/)

#### 參考費率詳情

模型層級的參考費率表不會變更方法選擇、報價或費用。實際計費採用所選 Ailoot 方法的費率。

模型參考費率表

#### 各設定的價格

請逐一核對各項費用與所列條件。每組互為替代選項的設定只套用一種費率。

| 設定 | 費率表 | 上下文 Token 數大於 | 上下文 Token 數小於或等於 | 費用 |
| --- | --- | --- | --- | --- |
| 設定OpenAI Chat · 基本 token 費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定OpenAI Chat · 請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定Anthropic Messages · 基本 token 費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定Anthropic Messages · 請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |

### 請求範例

#### Ailoot · OpenAI Chat

文字範例Python SDKNode.js SDKPython 串流

```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")
```

### 接收並儲存結果

#### Ailoot · OpenAI Chat

json 或 SSE

##### 保留所有已完成的結果

請保留所有完整傳回的回應、檔案與內容區塊。

保留每個候選項及其內容／工具呼叫／推理。SSE 中依候選項／工具索引組合增量，保留最終完成原因與用量。

##### 需要檢查原始回應時

保留請求／回應 ID 與標頭。未提供通用的文字工作擷取 URL。

回應欄位

| 欄位 | 類型 |
| --- | --- |
| 欄位`choices[].index` | 類型integer |
| 欄位`choices[].message.content` | 類型string\|null |
| 欄位`choices[].message.tool_calls` | 類型tool\_call\[\] |
| 欄位`choices[].message.reasoning_content` | 類型string |
| 欄位`choices[].message.reasoning_details` | 類型object\|array |
| 欄位`choices[].finish_reason` | 類型string\|null |
| 欄位`usage` | 類型object |

錯誤與後續步驟

| 回應 | 條件 | 下一步 |
| --- | --- | --- |
| 回應400 · `invalid_request_error` | 條件必要欄位、素材表示方式或參數值無效 | 下一步提出新的建立請求前，先修正指定欄位。 |

### 別名

#### 模型別名

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

#### 方法路徑別名

`/chat/completions`

#### 相關呼叫用 ID

[`z-ai/glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=chat), [`glm`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=chat), [`glm-5`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=chat), [`glm-5.1`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=chat), [`glm-5.2`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=chat), [`glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=chat), [`~z-ai/glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=chat), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=chat), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#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/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=messages)

Z.ai /`glm-latest`

模型 ID

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

### 入門

Z.ai GLM 5.3 是文字推理模型，適用於複雜軟體工程、終端機工作與長期任務代理。它支援製造商文件記載的 1M 詞元上下文、最多 128K 輸出詞元、函式呼叫與 low/high/max 推理強度，推理全程保持啟用。

接受的輸入

文字

結果

文字

### Ailoot 可用 · 輸入與方法

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

輸入

`text`

輸出

`text`

上下文

1,000,000 tokens

輸出上限

131,072 tokens

輸出格式

json 或 SSE

| 欄位 | 類型 | 要求 | 值與限制 | 預設值 |
| --- | --- | --- | --- | --- |
| 欄位`model` | 類型`string` | 要求必填 | 值與限制 glm-latest | 預設值— |
| 欄位`messages` | 類型`message[]` | 要求必填 | 值與限制 項目數下限: 1 | 預設值— |
| 欄位`messages[].role` | 類型`string` | 要求必填 | 值與限制 user, assistant | 預設值— |
| 欄位`messages[].content` | 類型`string\|content_block[]` | 要求必填 | 值與限制 | 預設值— |
| 欄位`system` | 類型`string\|content_block[]` | 要求選填 | 值與限制 | 預設值— |
| 欄位`max_tokens` | 類型`integer` | 要求必填 | 值與限制 最小值: 1 限制適用對象: 所選模型／卡片的確切上限 | 預設值— |
| 欄位`stream` | 類型`boolean` | 要求選填 | 值與限制 | 預設值false |
| 欄位`temperature` | 類型`number` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`top_p` | 類型`number` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`stop_sequences` | 類型`string[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tools` | 類型`tool[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tools[].name` | 類型`string` | 要求選填 | 值與限制 適用條件: 已提供工具 | 預設值— |
| 欄位`tools[].description` | 類型`string` | 要求選填 | 值與限制 | 預設值— |
| 欄位`tools[].input_schema` | 類型`JSON_schema` | 要求選填 | 值與限制 | 預設值— |
| 欄位`tool_choice` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`thinking.type` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`thinking.budget_tokens` | 類型`integer` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`output_config.effort` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`metadata` | 類型`object` | 要求選填 | 值與限制 | 預設值— |
| 欄位`cache_control` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |

輸入素材組合

**文字** · UTF8 文字

`messages[].content 或 type=text 區塊`

方法參數與生命週期

| 參數 | 規格 |
| --- | --- |
| 參數`material_types` | 規格text |
| 參數`required` | 規格model, messages, max\_tokens |
| 參數`optional_controls` | 規格null |
| 參數`content_type` | 規格application/json |
| 參數`text_file_material` | 規格實際 UTF-8 內容以文字插入；檔案 ID／URLs 需要另有精確支援 |

生命週期： `exact retained published method`

方法結構與 ID 均為精確值；供應商能力與准入狀態分開。

### 方案

#### Ailoot 方法費率

輸入

US$0.0014 */ 1K*

輸出

US$0.0044 */ 1K*

讀取快取

≈US$0.00026 */ 1K*

Ailoot 會在請求前預留估算金額。取得結果後，依實測用量結算最終費用。串流結算採用最終用量紀錄。[預留金額與結算的運作方式 →](https://ailoot.ai/docs/zh-hant-tw/billing/reserve/)

#### 參考費率詳情

模型層級的參考費率表不會變更方法選擇、報價或費用。實際計費採用所選 Ailoot 方法的費率。

模型參考費率表

#### 各設定的價格

請逐一核對各項費用與所列條件。每組互為替代選項的設定只套用一種費率。

| 設定 | 費率表 | 上下文 Token 數大於 | 上下文 Token 數小於或等於 | 費用 |
| --- | --- | --- | --- | --- |
| 設定OpenAI Chat · 基本 token 費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定OpenAI Chat · 請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定Anthropic Messages · 基本 token 費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定Anthropic Messages · 請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |

### 請求範例

#### Ailoot · Anthropic Messages

文字範例Python SDKNode.js SDKPython 串流

```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")
```

### 接收並儲存結果

#### Ailoot · Anthropic Messages

json 或 SSE

##### 保留所有已完成的結果

請保留所有完整傳回的回應、檔案與內容區塊。

保留所有內容區塊、思考簽章與實際工具使用 ID。組合所有 SSE 區塊增量；第一個文字區塊不是完整輸出。

##### 需要檢查原始回應時

保留請求／回應 ID 與標頭。未提供通用的文字工作擷取 URL。

回應欄位

| 欄位 | 類型 |
| --- | --- |
| 欄位`id` | 類型string |
| 欄位`model` | 類型string |
| 欄位`content[]` | 類型text\|thinking\|tool\_use\|other content block |
| 欄位`stop_reason` | 類型string\|null |
| 欄位`usage` | 類型object |

錯誤與後續步驟

| 回應 | 條件 | 下一步 |
| --- | --- | --- |
| 回應400 · `invalid_request_error` | 條件必要欄位、素材表示方式或參數值無效 | 下一步提出新的建立請求前，先修正指定欄位。 |

### 別名

#### 模型別名

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

#### 方法路徑別名

`/chat/completions`

#### 相關呼叫用 ID

[`z-ai/glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=messages), [`glm`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=messages), [`glm-5`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=messages), [`glm-5.1`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=messages), [`glm-5.2`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=messages), [`glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=messages), [`~z-ai/glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=messages), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=messages), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#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/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=responses)

Z.ai /`glm-latest`

模型 ID

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

### 入門

Z.ai GLM 5.3 是文字推理模型，適用於複雜軟體工程、終端機工作與長期任務代理。它支援製造商文件記載的 1M 詞元上下文、最多 128K 輸出詞元、函式呼叫與 low/high/max 推理強度，推理全程保持啟用。

接受的輸入

文字

結果

文字

### Ailoot 可用 · 輸入與方法

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

輸入

`text`

輸出

`text`

上下文

1,000,000 tokens

輸出上限

131,072 tokens

輸出格式

json 或 SSE

| 欄位 | 類型 | 要求 | 值與限制 | 預設值 |
| --- | --- | --- | --- | --- |
| 欄位`model` | 類型`string` | 要求必填 | 值與限制 glm-latest | 預設值— |
| 欄位`input` | 類型`string\|input_item[]` | 要求必填 | 值與限制 | 預設值— |
| 欄位`instructions` | 類型`string` | 要求選填 | 值與限制 | 預設值— |
| 欄位`input[].type` | 類型`string` | 要求選填 | 值與限制 message, reasoning, function\_call, function\_call\_output | 預設值— |
| 欄位`input[].content` | 類型`string\|content_part[]` | 要求選填 | 值與限制 | 預設值— |
| 欄位`input[].call_id` | 類型`string` | 要求選填 | 值與限制 適用條件: function\_call\_output；保留實際回傳的 call\_id | 預設值— |
| 欄位`input[].output` | 類型`string\|content_part[]` | 要求選填 | 值與限制 適用條件: function\_call\_output | 預設值— |
| 欄位`max_output_tokens` | 類型`integer` | 要求選填 | 值與限制 最小值: 1 依模型而定 | 預設值— |
| 欄位`stream` | 類型`boolean` | 要求選填 | 值與限制 | 預設值false |
| 欄位`temperature` | 類型`number` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`top_p` | 類型`number` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tools` | 類型`tool[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tool_choice` | 類型`string\|object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`parallel_tool_calls` | 類型`boolean` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`reasoning.effort` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`reasoning.summary` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`text.format` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`text.verbosity` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`include` | 類型`string[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`store` | 類型`boolean` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`previous_response_id` | 類型`string` | 要求選填 | 值與限制 ID 要求: 僅限支援的延續流程實際回傳的回應 ID 依模型而定 | 預設值— |
| 欄位`service_tier` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`prompt_cache_key` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`prompt_cache_options` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |

輸入素材組合

**文字** · UTF8 文字

`輸入文字或 input_text 部分`

方法參數與生命週期

| 參數 | 規格 |
| --- | --- |
| 參數`material_types` | 規格text |
| 參數`required` | 規格model, input |
| 參數`optional_controls` | 規格null |
| 參數`content_type` | 規格application/json |
| 參數`text_file_material` | 規格實際 UTF-8 內容以文字插入；檔案 ID／URLs 需要另有精確支援 |

生命週期： `exact retained published method`

方法結構與 ID 均為精確值；供應商能力與准入狀態分開。

### 方案

#### Ailoot 方法費率

輸入

US$0.0014 */ 1K*

輸出

US$0.0044 */ 1K*

讀取快取

≈US$0.00026 */ 1K*

Ailoot 會在請求前預留估算金額。取得結果後，依實測用量結算最終費用。串流結算採用最終用量紀錄。[預留金額與結算的運作方式 →](https://ailoot.ai/docs/zh-hant-tw/billing/reserve/)

#### 參考費率詳情

模型層級的參考費率表不會變更方法選擇、報價或費用。實際計費採用所選 Ailoot 方法的費率。

模型參考費率表

#### 各設定的價格

請逐一核對各項費用與所列條件。每組互為替代選項的設定只套用一種費率。

| 設定 | 費率表 | 上下文 Token 數大於 | 上下文 Token 數小於或等於 | 費用 |
| --- | --- | --- | --- | --- |
| 設定OpenAI Chat · 基本 token 費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定OpenAI Chat · 請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定Anthropic Messages · 基本 token 費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定Anthropic Messages · 請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |

### 請求範例

#### Ailoot · OpenAI Responses

文字範例Python SDKNode.js SDKPython 串流

```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")
```

### 接收並儲存結果

#### Ailoot · OpenAI Responses

json 或 SSE

##### 保留所有已完成的結果

請保留所有完整傳回的回應、檔案與內容區塊。

保留每個輸出項目與內容部分、實際函式 call\_id、加密推理與用量。串流時保留完整事件／項目身分。

##### 需要檢查原始回應時

保留請求／回應 ID 與標頭。未提供通用的文字工作擷取 URL。

回應欄位

| 欄位 | 類型 |
| --- | --- |
| 欄位`id` | 類型string |
| 欄位`status` | 類型string |
| 欄位`output[]` | 類型message\|reasoning\|function\_call\|other item |
| 欄位`output[].content[]` | 類型content part |
| 欄位`usage` | 類型object |

錯誤與後續步驟

| 回應 | 條件 | 下一步 |
| --- | --- | --- |
| 回應400 · `invalid_request_error` | 條件必要欄位、素材表示方式或參數值無效 | 下一步提出新的建立請求前，先修正指定欄位。 |

### 別名

#### 模型別名

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

#### 方法路徑別名

`/chat/completions`

#### 相關呼叫用 ID

[`z-ai/glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3), [`glm`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=responses), [`glm-5`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=responses), [`glm-5.1`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=responses), [`glm-5.2`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=responses), [`glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=responses), [`~z-ai/glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=responses), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#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/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=chat)

Z.ai /`glm-latest`

模型 ID

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

### 入門

Z.ai GLM 5.3 是文字推理模型，適用於複雜軟體工程、終端機工作與長期任務代理。它支援製造商文件記載的 1M 詞元上下文、最多 128K 輸出詞元、函式呼叫與 low/high/max 推理強度，推理全程保持啟用。

接受的輸入

文字

結果

文字

### Ailoot 可用 · 輸入與方法

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

輸入

`text`

輸出

`text`

上下文

1,000,000 tokens

輸出上限

131,072 tokens

輸出格式

json 或 SSE

| 欄位 | 類型 | 要求 | 值與限制 | 預設值 |
| --- | --- | --- | --- | --- |
| 欄位`model` | 類型`string` | 要求必填 | 值與限制 glm-latest | 預設值— |
| 欄位`messages` | 類型`message[]` | 要求必填 | 值與限制 項目數下限: 1 | 預設值— |
| 欄位`messages[].role` | 類型`string` | 要求必填 | 值與限制 範例：system, user, assistant, tool, function 條件: 這些角色由 原始碼中的相容型別明確表示；確切角色集合仍依模型而定。 依模型而定 | 預設值— |
| 欄位`messages[].content` | 類型`string\|content_part[]\|null` | 要求選填 | 值與限制 | 預設值— |
| 欄位`messages[].tool_calls` | 類型`tool_call[]` | 要求選填 | 值與限制 | 預設值— |
| 欄位`messages[].tool_call_id` | 類型`string` | 要求選填 | 值與限制 適用條件: role=tool；使用實際回傳的 ID | 預設值— |
| 欄位`messages[].name` | 類型`string` | 要求選填 | 值與限制 | 預設值— |
| 欄位`messages[].reasoning_content` | 類型`string` | 要求選填 | 值與限制 適用條件: 此模型使用推理內容時，將實際回傳的推理內容帶回後續請求 | 預設值— |
| 欄位`messages[].reasoning_details` | 類型`object\|array` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`max_tokens` | 類型`integer` | 要求選填 | 值與限制 最小值: 1 依模型而定 | 預設值— |
| 欄位`max_completion_tokens` | 類型`integer` | 要求選填 | 值與限制 最小值: 1 依模型而定 | 預設值— |
| 欄位`stream` | 類型`boolean` | 要求選填 | 值與限制 | 預設值false |
| 欄位`stream_options.include_usage` | 類型`boolean` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`temperature` | 類型`number` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`top_p` | 類型`number` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`stop` | 類型`string\|string[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tools` | 類型`function_tool[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tools[].type` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tools[].function.name` | 類型`string` | 要求必填 | 值與限制 適用條件: 已提供函式工具 | 預設值— |
| 欄位`tools[].function.description` | 類型`string` | 要求選填 | 值與限制 | 預設值— |
| 欄位`tools[].function.parameters` | 類型`JSON_schema` | 要求選填 | 值與限制 | 預設值— |
| 欄位`tool_choice` | 類型`string\|object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`parallel_tool_calls` | 類型`boolean` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`response_format` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`reasoning_effort` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`reasoning` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`service_tier` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`instructions` | 類型`string` | 要求選填 | 值與限制 相容性欄位 | 預設值— |
| 欄位`functions` | 類型`function[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`function_call` | 類型`string\|object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`prompt_cache_options` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |

輸入素材組合

**文字** · UTF8 文字

`messages[].content`

方法參數與生命週期

| 參數 | 規格 |
| --- | --- |
| 參數`material_types` | 規格text |
| 參數`required` | 規格model, messages |
| 參數`optional_controls` | 規格null |
| 參數`content_type` | 規格application/json |
| 參數`text_file_material` | 規格實際 UTF-8 內容以文字插入；檔案 ID／URLs 需要另有精確支援 |

生命週期： `exact retained published method`

方法結構與 ID 均為精確值；供應商能力與准入狀態分開。

### 方案

#### Ailoot 方法費率

輸入

US$0.0014 */ 1K*

輸出

US$0.0044 */ 1K*

讀取快取

≈US$0.00026 */ 1K*

Ailoot 會在請求前預留估算金額。取得結果後，依實測用量結算最終費用。串流結算採用最終用量紀錄。[預留金額與結算的運作方式 →](https://ailoot.ai/docs/zh-hant-tw/billing/reserve/)

#### 參考費率詳情

模型層級的參考費率表不會變更方法選擇、報價或費用。實際計費採用所選 Ailoot 方法的費率。

模型參考費率表

#### 各設定的價格

請逐一核對各項費用與所列條件。每組互為替代選項的設定只套用一種費率。

| 設定 | 費率表 | 上下文 Token 數大於 | 上下文 Token 數小於或等於 | 費用 |
| --- | --- | --- | --- | --- |
| 設定OpenAI Chat · 基本 token 費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定OpenAI Chat · 請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定Anthropic Messages · 基本 token 費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定Anthropic Messages · 請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |

### 請求範例

#### Ailoot · OpenAI Chat

文字範例Python SDKNode.js SDKPython 串流

```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")
```

### 接收並儲存結果

#### Ailoot · OpenAI Chat

json 或 SSE

##### 保留所有已完成的結果

請保留所有完整傳回的回應、檔案與內容區塊。

保留每個候選項及其內容／工具呼叫／推理。SSE 中依候選項／工具索引組合增量，保留最終完成原因與用量。

##### 需要檢查原始回應時

保留請求／回應 ID 與標頭。未提供通用的文字工作擷取 URL。

回應欄位

| 欄位 | 類型 |
| --- | --- |
| 欄位`choices[].index` | 類型integer |
| 欄位`choices[].message.content` | 類型string\|null |
| 欄位`choices[].message.tool_calls` | 類型tool\_call\[\] |
| 欄位`choices[].message.reasoning_content` | 類型string |
| 欄位`choices[].message.reasoning_details` | 類型object\|array |
| 欄位`choices[].finish_reason` | 類型string\|null |
| 欄位`usage` | 類型object |

錯誤與後續步驟

| 回應 | 條件 | 下一步 |
| --- | --- | --- |
| 回應400 · `invalid_request_error` | 條件必要欄位、素材表示方式或參數值無效 | 下一步提出新的建立請求前，先修正指定欄位。 |

### 別名

#### 模型別名

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

#### 方法路徑別名

`/chat/completions`

#### 相關呼叫用 ID

[`z-ai/glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=chat), [`glm`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=chat), [`glm-5`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=chat), [`glm-5.1`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=chat), [`glm-5.2`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=chat), [`glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=chat), [`~z-ai/glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=chat), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=chat), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#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/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=chat)

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

模型 ID

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

### 入門

Z.ai GLM 5.3 是文字推理模型，適用於複雜軟體工程、終端機工作與長期任務代理。它支援製造商文件記載的 1M 詞元上下文、最多 128K 輸出詞元、函式呼叫與 low/high/max 推理強度，推理全程保持啟用。

接受的輸入

文字

結果

文字

### Ailoot 可用 · 輸入與方法

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

輸入

`text`

輸出

`text`

輸出格式

json 或 SSE

| 欄位 | 類型 | 要求 | 值與限制 | 預設值 |
| --- | --- | --- | --- | --- |
| 欄位`model` | 類型`string` | 要求必填 | 值與限制 z-ai/glm-5.3 | 預設值— |
| 欄位`messages` | 類型`message[]` | 要求必填 | 值與限制 項目數下限: 1 | 預設值— |
| 欄位`messages[].role` | 類型`string` | 要求必填 | 值與限制 範例：system, user, assistant, tool, function 條件: 這些角色由 原始碼中的相容型別明確表示；確切角色集合仍依模型而定。 依模型而定 | 預設值— |
| 欄位`messages[].content` | 類型`string\|content_part[]\|null` | 要求選填 | 值與限制 | 預設值— |
| 欄位`messages[].tool_calls` | 類型`tool_call[]` | 要求選填 | 值與限制 | 預設值— |
| 欄位`messages[].tool_call_id` | 類型`string` | 要求選填 | 值與限制 適用條件: role=tool；使用實際回傳的 ID | 預設值— |
| 欄位`messages[].name` | 類型`string` | 要求選填 | 值與限制 | 預設值— |
| 欄位`messages[].reasoning_content` | 類型`string` | 要求選填 | 值與限制 適用條件: 此模型使用推理內容時，將實際回傳的推理內容帶回後續請求 | 預設值— |
| 欄位`messages[].reasoning_details` | 類型`object\|array` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`max_tokens` | 類型`integer` | 要求選填 | 值與限制 最小值: 1 依模型而定 | 預設值— |
| 欄位`max_completion_tokens` | 類型`integer` | 要求選填 | 值與限制 最小值: 1 依模型而定 | 預設值— |
| 欄位`stream` | 類型`boolean` | 要求選填 | 值與限制 | 預設值false |
| 欄位`stream_options.include_usage` | 類型`boolean` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`temperature` | 類型`number` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`top_p` | 類型`number` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`stop` | 類型`string\|string[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tools` | 類型`function_tool[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tools[].type` | 類型`string` | 要求選填 | 值與限制 function 依模型而定 | 預設值— |
| 欄位`tools[].function.name` | 類型`string` | 要求必填 | 值與限制 適用條件: 已提供函式工具 | 預設值— |
| 欄位`tools[].function.description` | 類型`string` | 要求選填 | 值與限制 | 預設值— |
| 欄位`tools[].function.parameters` | 類型`JSON_schema` | 要求選填 | 值與限制 | 預設值— |
| 欄位`tool_choice` | 類型`string\|object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`parallel_tool_calls` | 類型`boolean` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`response_format` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`reasoning_effort` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`reasoning` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`service_tier` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`instructions` | 類型`string` | 要求選填 | 值與限制 相容性欄位 | 預設值— |
| 欄位`functions` | 類型`function[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`function_call` | 類型`string\|object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`prompt_cache_options` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`modalities` | 類型`string[]` | 要求選填 | 值與限制 text | 預設值— |
| 欄位`provider` | 類型`object` | 要求選填 | 值與限制 條件: 此 Ultra 文字路由拒絕 provider.options | 預設值— |
| 欄位`cache_control.ttl` | 類型`string` | 要求選填 | 值與限制 條件: 實際提示詞快取位置拒絕 1h | 預設值— |

輸入素材組合

**文字** · UTF8 文字

`messages[].content`

方法參數與生命週期

| 參數 | 規格 |
| --- | --- |
| 參數`content_type` | 規格application/json |
| 參數`required` | 規格model, messages |
| 參數`material_types` | 規格text |
| 參數`messages` | 規格具有 role/content 結構的訊息陣列 |
| 參數`file_material` | 規格實際 UTF-8 文件以原文文字插入；不推定檔案 ID |
| 參數`optional_controls` | 規格stream, temperature, top\_p, stop, max\_tokens, max\_completion\_tokens, reasoning, response\_format, tools, tool\_choice |
| 參數`control_scope` | 規格依模型而定；使用者函式工具與託管工具不同 |
| 參數`output_modalities` | 規格text |
| 參數`hosted_operations` | 規格false |
| 參數`multimodal_input_binding` | 規格null |

生命週期： `synchronous_or_streamed`

將確切模型 ID 與 messages 一併送出。

上下文長度不是輸出上限。

文字檔案可提供原文文字；圖片／音訊／檔案物件輸入需要精確綁定。

### 方案

費率資訊不會增加請求選項。支援的參數列於所選方法中。

快速模式

標準費率 選取快速模式時

flex 模式

標準費率 選取 flex 模式時

最高推理強度

標準費率 最高推理強度採用 default 調整值時

推理強度 · high

標準費率 推理強度設為 high 時

推理強度 · low

標準費率 推理強度設為 low 時

推理強度 · max

標準費率 推理強度設為 max 時

#### Ailoot 費率

#### 各設定的價格

請逐一核對各項費用與所列條件。每組互為替代選項的設定只套用一種費率。

| 設定 | 費率表 | 上下文 Token 數大於 | 上下文 Token 數小於或等於 | 費用 |
| --- | --- | --- | --- | --- |
| 設定詞元基本費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |

Ailoot 會在請求前預留估算金額。取得結果後，依實測用量結算最終費用。串流結算採用最終用量紀錄。[預留金額與結算的運作方式 →](https://ailoot.ai/docs/zh-hant-tw/billing/reserve/)

### 請求範例

#### Ailoot Ultra · OpenAI Chat

curlPython SDKPython 串流

```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")
```

### 接收並儲存結果

#### Ailoot Ultra · OpenAI Chat

json 或 SSE

##### 保留所有已完成的結果

請保留所有完整傳回的回應、檔案與內容區塊。

保留每個候選項及其內容／工具呼叫／推理。SSE 中依候選項／工具索引組合增量，保留最終完成原因與用量。

##### 需要檢查原始回應時

保留請求／回應 ID 與標頭。未提供通用的文字工作擷取 URL。

回應欄位

| 欄位 | 類型 |
| --- | --- |
| 欄位`choices[].index` | 類型integer |
| 欄位`choices[].message.content` | 類型string\|null |
| 欄位`choices[].message.tool_calls` | 類型tool\_call\[\] |
| 欄位`choices[].message.reasoning_content` | 類型string |
| 欄位`choices[].message.reasoning_details` | 類型object\|array |
| 欄位`choices[].finish_reason` | 類型string\|null |
| 欄位`usage` | 類型object |

錯誤與後續步驟

| 回應 | 條件 | 下一步 |
| --- | --- | --- |
| 回應400 · `invalid_request_error` | 條件必要欄位、素材表示方式或參數值無效 | 下一步提出新的建立請求前，先修正指定欄位。 |

### 別名

#### 模型別名

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

#### 方法路徑別名

`/chat/completions`

#### 相關呼叫用 ID

[`z-ai/glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=chat), [`glm`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=chat), [`glm-5`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=chat), [`glm-5.1`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=chat), [`glm-5.2`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=chat), [`glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=chat), [`~z-ai/glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=chat), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=chat), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#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/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=messages)

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

模型 ID

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

### 入門

Z.ai GLM 5.3 是文字推理模型，適用於複雜軟體工程、終端機工作與長期任務代理。它支援製造商文件記載的 1M 詞元上下文、最多 128K 輸出詞元、函式呼叫與 low/high/max 推理強度，推理全程保持啟用。

接受的輸入

文字

結果

json · sse

### Ailoot 可用 · 輸入與方法

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

輸入

`text`

輸出

`json`, `sse`

輸出格式

JSON 或 SSE

| 欄位 | 類型 | 要求 | 值與限制 | 預設值 |
| --- | --- | --- | --- | --- |
| 欄位`model` | 類型`string` | 要求必填 | 值與限制 z-ai/glm-5.3 | 預設值— |
| 欄位`messages` | 類型`message[]` | 要求必填 | 值與限制 | 預設值— |
| 欄位`messages[].role` | 類型`string` | 要求必填 | 值與限制 user, assistant | 預設值— |
| 欄位`messages[].content` | 類型`string` | 要求必填 | 值與限制 | 預設值— |
| 欄位`max_tokens` | 類型`integer` | 要求必填 | 值與限制 | 預設值— |
| 欄位`stream` | 類型`boolean` | 要求選填 | 值與限制 | 預設值false |

輸入素材組合

**文字** · UTF-8 文字

`messages[].content 字串`

方法參數與生命週期

| 參數 | 規格 |
| --- | --- |
| 參數`content_type` | 規格application/json |
| 參數`required` | 規格model, messages, max\_tokens |
| 參數`optional_controls` | 規格stream |
| 參數`material_types` | 規格text |
| 參數`text_file_material` | 規格讀取實際 UTF-8 文件，將文字放入指定的 input 或訊息內容字串。 |

生命週期： `synchronous_or_streamed`

### 方案

費率資訊不會增加請求選項。支援的參數列於所選方法中。

快速模式

標準費率 選取快速模式時

flex 模式

標準費率 選取 flex 模式時

最高推理強度

標準費率 最高推理強度採用 default 調整值時

推理強度 · high

標準費率 推理強度設為 high 時

推理強度 · low

標準費率 推理強度設為 low 時

推理強度 · max

標準費率 推理強度設為 max 時

#### Ailoot 費率

#### 各設定的價格

請逐一核對各項費用與所列條件。每組互為替代選項的設定只套用一種費率。

| 設定 | 費率表 | 上下文 Token 數大於 | 上下文 Token 數小於或等於 | 費用 |
| --- | --- | --- | --- | --- |
| 設定詞元基本費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |

Ailoot 會在請求前預留估算金額。取得結果後，依實測用量結算最終費用。串流結算採用最終用量紀錄。[預留金額與結算的運作方式 →](https://ailoot.ai/docs/zh-hant-tw/billing/reserve/)

### 請求範例

#### Ailoot Ultra · Anthropic Messages

完整的最小 JSON 請求主體curl · 使用您的 UTF-8 文件Python · 儲存完整結果

```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))
```

### 接收並儲存結果

#### Ailoot Ultra · Anthropic Messages

JSON 或 SSE

##### 保留所有已完成的結果

請保留所有完整傳回的回應、檔案與內容區塊。

保留所有內容區塊、思考簽章與實際工具使用 ID。組合所有 SSE 區塊增量；第一個文字區塊不是完整輸出。

##### 需要檢查原始回應時

保留請求／回應 ID 與標頭。未提供通用的文字工作擷取 URL。

回應欄位

| 欄位 | 類型 |
| --- | --- |
| 欄位`id` | 類型string |
| 欄位`model` | 類型string |
| 欄位`content[]` | 類型text\|thinking\|tool\_use\|other content block |
| 欄位`stop_reason` | 類型string\|null |
| 欄位`usage` | 類型object |

錯誤與後續步驟

| 回應 | 條件 | 下一步 |
| --- | --- | --- |
| 回應400 · `invalid_request_error` | 條件必要欄位、素材表示方式或參數值無效 | 下一步提出新的建立請求前，先修正指定欄位。 |

### 別名

#### 模型別名

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

#### 方法路徑別名

`/chat/completions`

#### 相關呼叫用 ID

[`z-ai/glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=messages), [`glm`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=messages), [`glm-5`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=messages), [`glm-5.1`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=messages), [`glm-5.2`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=messages), [`glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=messages), [`~z-ai/glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=messages), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=messages), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#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/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=chat)

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

模型 ID

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

### 入門

Z.ai GLM 5.3 是文字推理模型，適用於複雜軟體工程、終端機工作與長期任務代理。它支援製造商文件記載的 1M 詞元上下文、最多 128K 輸出詞元、函式呼叫與 low/high/max 推理強度，推理全程保持啟用。

接受的輸入

文字

結果

文字

### Ailoot 可用 · 輸入與方法

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

輸入

`text`

輸出

`text`

輸出格式

json 或 SSE

| 欄位 | 類型 | 要求 | 值與限制 | 預設值 |
| --- | --- | --- | --- | --- |
| 欄位`model` | 類型`string` | 要求必填 | 值與限制 ~z-ai/glm-latest | 預設值— |
| 欄位`messages` | 類型`message[]` | 要求必填 | 值與限制 項目數下限: 1 | 預設值— |
| 欄位`messages[].role` | 類型`string` | 要求必填 | 值與限制 範例：system, user, assistant, tool, function 條件: 這些角色由 原始碼中的相容型別明確表示；確切角色集合仍依模型而定。 依模型而定 | 預設值— |
| 欄位`messages[].content` | 類型`string\|content_part[]\|null` | 要求選填 | 值與限制 | 預設值— |
| 欄位`messages[].tool_calls` | 類型`tool_call[]` | 要求選填 | 值與限制 | 預設值— |
| 欄位`messages[].tool_call_id` | 類型`string` | 要求選填 | 值與限制 適用條件: role=tool；使用實際回傳的 ID | 預設值— |
| 欄位`messages[].name` | 類型`string` | 要求選填 | 值與限制 | 預設值— |
| 欄位`messages[].reasoning_content` | 類型`string` | 要求選填 | 值與限制 適用條件: 此模型使用推理內容時，將實際回傳的推理內容帶回後續請求 | 預設值— |
| 欄位`messages[].reasoning_details` | 類型`object\|array` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`max_tokens` | 類型`integer` | 要求選填 | 值與限制 最小值: 1 依模型而定 | 預設值— |
| 欄位`max_completion_tokens` | 類型`integer` | 要求選填 | 值與限制 最小值: 1 依模型而定 | 預設值— |
| 欄位`stream` | 類型`boolean` | 要求選填 | 值與限制 | 預設值false |
| 欄位`stream_options.include_usage` | 類型`boolean` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`temperature` | 類型`number` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`top_p` | 類型`number` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`stop` | 類型`string\|string[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tools` | 類型`function_tool[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`tools[].type` | 類型`string` | 要求選填 | 值與限制 function 依模型而定 | 預設值— |
| 欄位`tools[].function.name` | 類型`string` | 要求必填 | 值與限制 適用條件: 已提供函式工具 | 預設值— |
| 欄位`tools[].function.description` | 類型`string` | 要求選填 | 值與限制 | 預設值— |
| 欄位`tools[].function.parameters` | 類型`JSON_schema` | 要求選填 | 值與限制 | 預設值— |
| 欄位`tool_choice` | 類型`string\|object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`parallel_tool_calls` | 類型`boolean` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`response_format` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`reasoning_effort` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`reasoning` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`service_tier` | 類型`string` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`instructions` | 類型`string` | 要求選填 | 值與限制 相容性欄位 | 預設值— |
| 欄位`functions` | 類型`function[]` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`function_call` | 類型`string\|object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`prompt_cache_options` | 類型`object` | 要求選填 | 值與限制 依模型而定 | 預設值— |
| 欄位`modalities` | 類型`string[]` | 要求選填 | 值與限制 text | 預設值— |
| 欄位`provider` | 類型`object` | 要求選填 | 值與限制 條件: 此 Ultra 文字路由拒絕 provider.options | 預設值— |
| 欄位`cache_control.ttl` | 類型`string` | 要求選填 | 值與限制 條件: 實際提示詞快取位置拒絕 1h | 預設值— |

輸入素材組合

**文字** · UTF8 文字

`messages[].content`

方法參數與生命週期

| 參數 | 規格 |
| --- | --- |
| 參數`content_type` | 規格application/json |
| 參數`required` | 規格model, messages |
| 參數`material_types` | 規格text |
| 參數`messages` | 規格具有 role/content 結構的訊息陣列 |
| 參數`file_material` | 規格實際 UTF-8 文件以原文文字插入；不推定檔案 ID |
| 參數`optional_controls` | 規格stream, temperature, top\_p, stop, max\_tokens, max\_completion\_tokens, reasoning, response\_format, tools, tool\_choice |
| 參數`control_scope` | 規格依模型而定；使用者函式工具與託管工具不同 |
| 參數`output_modalities` | 規格text |
| 參數`hosted_operations` | 規格false |
| 參數`multimodal_input_binding` | 規格null |

生命週期： `synchronous_or_streamed`

將確切模型 ID 與 messages 一併送出。

上下文長度不是輸出上限。

文字檔案可提供原文文字；圖片／音訊／檔案物件輸入需要精確綁定。

### 方案

費率資訊不會增加請求選項。支援的參數列於所選方法中。

快速模式

標準費率 選取快速模式時

flex 模式

標準費率 選取 flex 模式時

最高推理強度

標準費率 最高推理強度採用 default 調整值時

推理強度 · high

標準費率 推理強度設為 high 時

推理強度 · low

標準費率 推理強度設為 low 時

推理強度 · max

標準費率 推理強度設為 max 時

#### Ailoot 費率

#### 各設定的價格

請逐一核對各項費用與所列條件。每組互為替代選項的設定只套用一種費率。

| 設定 | 費率表 | 上下文 Token 數大於 | 上下文 Token 數小於或等於 | 費用 |
| --- | --- | --- | --- | --- |
| 設定詞元基本費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |

Ailoot 會在請求前預留估算金額。取得結果後，依實測用量結算最終費用。串流結算採用最終用量紀錄。[預留金額與結算的運作方式 →](https://ailoot.ai/docs/zh-hant-tw/billing/reserve/)

### 請求範例

#### Ailoot Ultra · OpenAI Chat

curlPython SDKPython 串流

```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")
```

### 接收並儲存結果

#### Ailoot Ultra · OpenAI Chat

json 或 SSE

##### 保留所有已完成的結果

請保留所有完整傳回的回應、檔案與內容區塊。

保留每個候選項及其內容／工具呼叫／推理。SSE 中依候選項／工具索引組合增量，保留最終完成原因與用量。

##### 需要檢查原始回應時

保留請求／回應 ID 與標頭。未提供通用的文字工作擷取 URL。

回應欄位

| 欄位 | 類型 |
| --- | --- |
| 欄位`choices[].index` | 類型integer |
| 欄位`choices[].message.content` | 類型string\|null |
| 欄位`choices[].message.tool_calls` | 類型tool\_call\[\] |
| 欄位`choices[].message.reasoning_content` | 類型string |
| 欄位`choices[].message.reasoning_details` | 類型object\|array |
| 欄位`choices[].finish_reason` | 類型string\|null |
| 欄位`usage` | 類型object |

錯誤與後續步驟

| 回應 | 條件 | 下一步 |
| --- | --- | --- |
| 回應400 · `invalid_request_error` | 條件必要欄位、素材表示方式或參數值無效 | 下一步提出新的建立請求前，先修正指定欄位。 |

### 別名

#### 模型別名

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

#### 方法路徑別名

`/chat/completions`

#### 相關呼叫用 ID

[`z-ai/glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=z-ai%2Fglm-5.3&fmt=chat), [`glm`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm&fmt=chat), [`glm-5`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5&fmt=chat), [`glm-5.1`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.1&fmt=chat), [`glm-5.2`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.2&fmt=chat), [`glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-latest&fmt=chat), [`~z-ai/glm-latest`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=chat), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Core&caller=glm-5.3&fmt=chat), [`glm-5.3`](https://ailoot.ai/models/zh-hant-tw/#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/zh-hant-tw/#m=z-ai%2Fglm-5.3&route=Ultra&caller=~z-ai%2Fglm-latest&fmt=messages)

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

模型 ID

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

### 入門

Z.ai GLM 5.3 是文字推理模型，適用於複雜軟體工程、終端機工作與長期任務代理。它支援製造商文件記載的 1M 詞元上下文、最多 128K 輸出詞元、函式呼叫與 low/high/max 推理強度，推理全程保持啟用。

接受的輸入

文字

結果

json · sse

### Ailoot 可用 · 輸入與方法

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

輸入

`text`

輸出

`json`, `sse`

輸出格式

JSON 或 SSE

| 欄位 | 類型 | 要求 | 值與限制 | 預設值 |
| --- | --- | --- | --- | --- |
| 欄位`model` | 類型`string` | 要求必填 | 值與限制 ~z-ai/glm-latest | 預設值— |
| 欄位`messages` | 類型`message[]` | 要求必填 | 值與限制 | 預設值— |
| 欄位`messages[].role` | 類型`string` | 要求必填 | 值與限制 user, assistant | 預設值— |
| 欄位`messages[].content` | 類型`string` | 要求必填 | 值與限制 | 預設值— |
| 欄位`max_tokens` | 類型`integer` | 要求必填 | 值與限制 | 預設值— |
| 欄位`stream` | 類型`boolean` | 要求選填 | 值與限制 | 預設值false |

輸入素材組合

**文字** · UTF-8 文字

`messages[].content 字串`

方法參數與生命週期

| 參數 | 規格 |
| --- | --- |
| 參數`content_type` | 規格application/json |
| 參數`required` | 規格model, messages, max\_tokens |
| 參數`optional_controls` | 規格stream |
| 參數`material_types` | 規格text |
| 參數`text_file_material` | 規格讀取實際 UTF-8 文件，將文字放入指定的 input 或訊息內容字串。 |

生命週期： `synchronous_or_streamed`

### 方案

費率資訊不會增加請求選項。支援的參數列於所選方法中。

快速模式

標準費率 選取快速模式時

flex 模式

標準費率 選取 flex 模式時

最高推理強度

標準費率 最高推理強度採用 default 調整值時

推理強度 · high

標準費率 推理強度設為 high 時

推理強度 · low

標準費率 推理強度設為 low 時

推理強度 · max

標準費率 推理強度設為 max 時

#### Ailoot 費率

#### 各設定的價格

請逐一核對各項費用與所列條件。每組互為替代選項的設定只套用一種費率。

| 設定 | 費率表 | 上下文 Token 數大於 | 上下文 Token 數小於或等於 | 費用 |
| --- | --- | --- | --- | --- |
| 設定詞元基本費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |
| 設定請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token **$0.0028** / 1K Token 輸出 · 輸出 Token **$0.0088** / 1K Token 輸入 · 讀取快取 **$0.00052** / 1K Token 輸入 · 寫入快取 **—** / 1K Token 輸入 · 寫入快取，1 小時 **—** / 1K Token |

Ailoot 會在請求前預留估算金額。取得結果後，依實測用量結算最終費用。串流結算採用最終用量紀錄。[預留金額與結算的運作方式 →](https://ailoot.ai/docs/zh-hant-tw/billing/reserve/)

### 請求範例

#### Ailoot Ultra · Anthropic Messages

完整的最小 JSON 請求主體curl · 使用您的 UTF-8 文件Python · 儲存完整結果

```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))
```

### 接收並儲存結果

#### Ailoot Ultra · Anthropic Messages

JSON 或 SSE

##### 保留所有已完成的結果

請保留所有完整傳回的回應、檔案與內容區塊。

保留所有內容區塊、思考簽章與實際工具使用 ID。組合所有 SSE 區塊增量；第一個文字區塊不是完整輸出。

##### 需要檢查原始回應時

保留請求／回應 ID 與標頭。未提供通用的文字工作擷取 URL。

回應欄位

| 欄位 | 類型 |
| --- | --- |
| 欄位`id` | 類型string |
| 欄位`model` | 類型string |
| 欄位`content[]` | 類型text\|thinking\|tool\_use\|other content block |
| 欄位`stop_reason` | 類型string\|null |
| 欄位`usage` | 類型object |

錯誤與後續步驟

| 回應 | 條件 | 下一步 |
| --- | --- | --- |
| 回應400 · `invalid_request_error` | 條件必要欄位、素材表示方式或參數值無效 | 下一步提出新的建立請求前，先修正指定欄位。 |

### 別名

#### 模型別名

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

#### 方法路徑別名

`/chat/completions`

#### 相關呼叫用 ID

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

FAQ · Z.ai: GLM 5.3

可以使用哪些輸入與結果？

`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`

請求使用哪些欄位？

`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`

適用哪些限制？

`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`

將 Ailoot 串接 Claude Code、OpenCode、Hermes 或自己的應用程式。

## 公司及其專案組合

公司及其專案組合：數百萬客戶，每月銷售額達數十億。

## 優惠購買 token。

訂閱優惠適合持續工作，折扣碼購買 token 最高可折 50%。

訂閱

為定期請求選擇優惠方案。

最高 50% 折扣碼

購買時輸入代碼，價格依活動重算。

歷史中的費用

每次請求保存模型、token 與金額。

[選擇訂閱](https://ailoot.ai/docs/zh-hant-tw/billing/subscriptions/) · [查看模型價格](https://ailoot.ai/models/zh-hant-tw/)

## 將 API 加入 你銷售的產品。

依 Ailoot 正式服務條款與授權合約串接 SaaS、應用程式與機器人；轉售請申請經銷授權。

商用應用程式

在付費功能加入文字、圖片、影片與聲音生成。

經銷授權

提供專案說明與存取方式，要求書面使用和轉售條件。

網站文件

串接前可閱讀正式服務條款、授權合約與資料處理政策。

[申請經銷授權](mailto:support@ailoot.ai) · [正式服務條款與授權合約](https://ailoot.ai/legal/offer?lang=zh-hant-tw)

## Ailoot · 公司及其專案組合





Ailoot以累積的營運經驗、廣大的客戶群、穩定的服務及持續的KPI管理為基礎。





公司及其專案組合：數百萬客戶，每月銷售額達數十億。





Ailoot將這些營運經驗用於API存取，讓客戶的產品、代理、應用程式及自動化流程使用AI功能。
