Source: https://ailoot.ai/models/zh-hant-tw/nvidia-riva-translate-4b-instruct-v2/
Canonical: https://ailoot.ai/models/zh-hant-tw/nvidia-riva-translate-4b-instruct-v2/
Language: zh-hant-tw

# Riva Translate 4B Instruct v2

[Markdown](https://ailoot.ai/models/zh-hant-tw/nvidia-riva-translate-4b-instruct-v2/index.md) · [JSON](https://ailoot.ai/models/zh-hant-tw/nvidia-riva-translate-4b-instruct-v2/facts.json)

## [Riva Translate 4B Instruct v2](https://ailoot.ai/models/zh-hant-tw/nvidia-riva-translate-4b-instruct-v2/)

NVIDIA 的 Riva-Translate-4B-Instruct-v2 可在英文與另外 36 種語言及地區變體之間翻譯句子和文件，包括俄文、烏克蘭文及印地文。支援在請求中提供翻譯範例，上下文長度可達 8K token。

- [**Ailoot · OpenAI Chat** `POST /v1/chat/completions` `nvidia/riva-translate-4b-instruct-v2`](https://ailoot.ai/models/zh-hant-tw/nvidia-riva-translate-4b-instruct-v2/#method-0)
- [**Ailoot · OpenAI Chat** `POST /v1/chat/completions` `riva-translate`](https://ailoot.ai/models/zh-hant-tw/nvidia-riva-translate-4b-instruct-v2/#method-1)
- [**Ailoot · OpenAI Chat** `POST /v1/chat/completions` `riva-translate-latest`](https://ailoot.ai/models/zh-hant-tw/nvidia-riva-translate-4b-instruct-v2/#method-2)

關於模型

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

Riva-Translate-4B-Instruct-v2 是 NVIDIA 的文字翻譯模型，支援 37 種語言及地區變體。它能翻譯單句與文件，接收原文後，以文字形式輸出譯文。適合翻譯工作者、行銷人員，以及製作多語言內容的開發者使用。

#### 支援的語言

支援英文，以及下列語言與變體：

- 捷克文、丹麥文、德文、希臘文、歐洲及拉丁美洲西班牙文、芬蘭文、法文、匈牙利文、義大利文、立陶宛文、拉脫維亞文、荷蘭文、挪威文、波蘭文、歐洲及巴西葡萄牙文、羅馬尼亞文、俄文、斯洛伐克文、瑞典文、愛沙尼亞文、斯洛維尼亞文、保加利亞文、烏克蘭文及克羅埃西亞文。
- 簡體及繁體中文、日文、印地文、韓文、阿拉伯文、越南文、土耳其文、印尼文及泰文。

翻譯方向以英文為中心，可從英文翻譯成各個其他語言，也可反向翻譯。俄文和烏克蘭文各有獨立的翻譯方向。西班牙文、葡萄牙文及中文則可分別選擇地區變體或書寫系統。

#### 翻譯方向與範例

系統訊息指定語言配對，使用者訊息提供待翻譯的文字。例如，`en-ru` 表示英文翻譯成俄文，`ru-en` 表示俄文翻譯成英文，`en-uk` 表示英文翻譯成烏克蘭文。中文使用明確的 `en-zh-cn` 和 `en-zh-tw` 標記，葡萄牙文則使用 `en-pt-pt` 和 `en-pt-br`。

模型支援在請求中提供數個翻譯範例。可將包含原文的使用者訊息與包含譯文的回覆交替排列，讓模型在處理新文字前，先看到完整的翻譯配對。NVIDIA 建議使用明確指定來源語言與目標語言的翻譯範本；未使用時，結果可能較不符合需求。

#### 模型規模與訓練方式

模型採用解碼器式 Transformer，約有 4.18 十億個參數，由經過壓縮與蒸餾的基礎模型進一步微調而成。訓練包含持續預訓練及範例學習，資料使用不同風格的原文與譯文配對，涵蓋口語到正式語體。上下文長度可達 8K token。

#### 翻譯結果的特性

翻譯結果會受到使用領域、原文品質及上下文影響，可能出現文法或語意傳達上的錯誤。更精確地描述需求，有助於改善翻譯。

實用任務

### 實用任務

英文技術範例

```
Translate a dispatch notice into Russian

Translate from English to Russian using the English-to-Russian direction en-ru in the existing translation template. Source text: 'Order AX-17 is ready for dispatch. Please confirm the delivery address before 16:00 on Friday. If the address is unchanged, no reply is required.' Keep the order identifier and time exact; return only the translation.
```

#### 預期結果

```
A Russian translation preserving AX-17, Friday 16:00 and the conditional no-reply instruction.
```

#### 檢查結果

```
Check the no-reply condition is not inverted and no dispatch date is added.
```

**Ailoot · OpenAI Chat** `POST /v1/chat/completions` `nvidia/riva-translate-4b-instruct-v2`

[`nvidia/riva-translate-4b-instruct-v2`](https://ailoot.ai/models/zh-hant-tw/#m=nvidia%2Friva-translate-4b-instruct-v2&route=Core&caller=nvidia%2Friva-translate-4b-instruct-v2&fmt=chat)

NVIDIA /`nvidia/riva-translate-4b-instruct-v2`

模型 ID

- `nvidia/riva-translate-4b-instruct-v2`
- `riva-translate`
- `riva-translate-latest`

### 入門

NVIDIA 的 Riva-Translate-4B-Instruct-v2 可在英文與另外 36 種語言及地區變體之間翻譯句子和文件，包括俄文、烏克蘭文及印地文。支援在請求中提供翻譯範例，上下文長度可達 8K token。

接受的輸入

文字

結果

文字

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

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

輸入

`text`

輸出

`text`

上下文

4,096 tokens

輸出上限

1,024 tokens

輸出格式

json 或 SSE

| 欄位 | 類型 | 要求 | 值與限制 | 預設值 |
| --- | --- | --- | --- | --- |
| 欄位`model` | 類型`string` | 要求必填 | 值與限制 nvidia/riva-translate-4b-instruct-v2 | 預設值— |
| 欄位`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.0001 */ 1K*

輸出

US$0.0002 */ 1K*

讀取快取

US$0.0001 */ 1K*

寫入快取

US$0.0001 */ 1K*

寫入快取，5 分鐘

US$0.0001 */ 1K tokens*

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

### 請求範例

#### 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": "nvidia/riva-translate-4b-instruct-v2", "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="nvidia/riva-translate-4b-instruct-v2",
    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: "nvidia/riva-translate-4b-instruct-v2",
  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='nvidia/riva-translate-4b-instruct-v2',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` | 條件必要欄位、素材表示方式或參數值無效 | 下一步提出新的建立請求前，先修正指定欄位。 |

### 別名

#### 模型別名

**Ailoot** [`nvidia/riva-translate-4b-instruct-v2`](https://ailoot.ai/models/zh-hant-tw/#m=nvidia%2Friva-translate-4b-instruct-v2&route=Core&caller=nvidia%2Friva-translate-4b-instruct-v2&fmt=chat), [`riva-translate`](https://ailoot.ai/models/zh-hant-tw/#m=nvidia%2Friva-translate-4b-instruct-v2&route=Core&caller=riva-translate&fmt=chat), [`riva-translate-latest`](https://ailoot.ai/models/zh-hant-tw/#m=nvidia%2Friva-translate-4b-instruct-v2&route=Core&caller=riva-translate-latest&fmt=chat)

#### 方法路徑別名

請使用上方列出的 API 方法路徑。

#### 相關呼叫用 ID

[`nvidia/riva-translate-4b-instruct-v2`](https://ailoot.ai/models/zh-hant-tw/#m=nvidia%2Friva-translate-4b-instruct-v2&route=Core&caller=nvidia%2Friva-translate-4b-instruct-v2&fmt=chat), [`riva-translate`](https://ailoot.ai/models/zh-hant-tw/#m=nvidia%2Friva-translate-4b-instruct-v2&route=Core&caller=riva-translate&fmt=chat), [`riva-translate-latest`](https://ailoot.ai/models/zh-hant-tw/#m=nvidia%2Friva-translate-4b-instruct-v2&route=Core&caller=riva-translate-latest&fmt=chat)

**Ailoot · OpenAI Chat** `POST /v1/chat/completions` `riva-translate`

[`riva-translate`](https://ailoot.ai/models/zh-hant-tw/#m=nvidia%2Friva-translate-4b-instruct-v2&route=Core&caller=riva-translate&fmt=chat)

NVIDIA /`riva-translate`

模型 ID

- `nvidia/riva-translate-4b-instruct-v2`
- `riva-translate`
- `riva-translate-latest`

### 入門

NVIDIA 的 Riva-Translate-4B-Instruct-v2 可在英文與另外 36 種語言及地區變體之間翻譯句子和文件，包括俄文、烏克蘭文及印地文。支援在請求中提供翻譯範例，上下文長度可達 8K token。

接受的輸入

文字

結果

文字

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

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

輸入

`text`

輸出

`text`

上下文

4,096 tokens

輸出上限

1,024 tokens

輸出格式

json 或 SSE

| 欄位 | 類型 | 要求 | 值與限制 | 預設值 |
| --- | --- | --- | --- | --- |
| 欄位`model` | 類型`string` | 要求必填 | 值與限制 riva-translate | 預設值— |
| 欄位`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.0001 */ 1K*

輸出

US$0.0002 */ 1K*

讀取快取

US$0.0001 */ 1K*

寫入快取

US$0.0001 */ 1K*

寫入快取，5 分鐘

US$0.0001 */ 1K tokens*

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

### 請求範例

#### 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": "riva-translate", "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="riva-translate",
    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: "riva-translate",
  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='riva-translate',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` | 條件必要欄位、素材表示方式或參數值無效 | 下一步提出新的建立請求前，先修正指定欄位。 |

### 別名

#### 模型別名

**Ailoot** [`nvidia/riva-translate-4b-instruct-v2`](https://ailoot.ai/models/zh-hant-tw/#m=nvidia%2Friva-translate-4b-instruct-v2&route=Core&caller=nvidia%2Friva-translate-4b-instruct-v2&fmt=chat), [`riva-translate`](https://ailoot.ai/models/zh-hant-tw/#m=nvidia%2Friva-translate-4b-instruct-v2&route=Core&caller=riva-translate&fmt=chat), [`riva-translate-latest`](https://ailoot.ai/models/zh-hant-tw/#m=nvidia%2Friva-translate-4b-instruct-v2&route=Core&caller=riva-translate-latest&fmt=chat)

#### 方法路徑別名

請使用上方列出的 API 方法路徑。

#### 相關呼叫用 ID

[`nvidia/riva-translate-4b-instruct-v2`](https://ailoot.ai/models/zh-hant-tw/#m=nvidia%2Friva-translate-4b-instruct-v2&route=Core&caller=nvidia%2Friva-translate-4b-instruct-v2&fmt=chat), [`riva-translate`](https://ailoot.ai/models/zh-hant-tw/#m=nvidia%2Friva-translate-4b-instruct-v2&route=Core&caller=riva-translate&fmt=chat), [`riva-translate-latest`](https://ailoot.ai/models/zh-hant-tw/#m=nvidia%2Friva-translate-4b-instruct-v2&route=Core&caller=riva-translate-latest&fmt=chat)

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

[`riva-translate-latest`](https://ailoot.ai/models/zh-hant-tw/#m=nvidia%2Friva-translate-4b-instruct-v2&route=Core&caller=riva-translate-latest&fmt=chat)

NVIDIA /`riva-translate-latest`

模型 ID

- `nvidia/riva-translate-4b-instruct-v2`
- `riva-translate`
- `riva-translate-latest`

### 入門

NVIDIA 的 Riva-Translate-4B-Instruct-v2 可在英文與另外 36 種語言及地區變體之間翻譯句子和文件，包括俄文、烏克蘭文及印地文。支援在請求中提供翻譯範例，上下文長度可達 8K token。

接受的輸入

文字

結果

文字

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

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

輸入

`text`

輸出

`text`

上下文

4,096 tokens

輸出上限

1,024 tokens

輸出格式

json 或 SSE

| 欄位 | 類型 | 要求 | 值與限制 | 預設值 |
| --- | --- | --- | --- | --- |
| 欄位`model` | 類型`string` | 要求必填 | 值與限制 riva-translate-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.0001 */ 1K*

輸出

US$0.0002 */ 1K*

讀取快取

US$0.0001 */ 1K*

寫入快取

US$0.0001 */ 1K*

寫入快取，5 分鐘

US$0.0001 */ 1K tokens*

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

### 請求範例

#### 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": "riva-translate-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="riva-translate-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: "riva-translate-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='riva-translate-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` | 條件必要欄位、素材表示方式或參數值無效 | 下一步提出新的建立請求前，先修正指定欄位。 |

### 別名

#### 模型別名

**Ailoot** [`nvidia/riva-translate-4b-instruct-v2`](https://ailoot.ai/models/zh-hant-tw/#m=nvidia%2Friva-translate-4b-instruct-v2&route=Core&caller=nvidia%2Friva-translate-4b-instruct-v2&fmt=chat), [`riva-translate`](https://ailoot.ai/models/zh-hant-tw/#m=nvidia%2Friva-translate-4b-instruct-v2&route=Core&caller=riva-translate&fmt=chat), [`riva-translate-latest`](https://ailoot.ai/models/zh-hant-tw/#m=nvidia%2Friva-translate-4b-instruct-v2&route=Core&caller=riva-translate-latest&fmt=chat)

#### 方法路徑別名

請使用上方列出的 API 方法路徑。

#### 相關呼叫用 ID

[`nvidia/riva-translate-4b-instruct-v2`](https://ailoot.ai/models/zh-hant-tw/#m=nvidia%2Friva-translate-4b-instruct-v2&route=Core&caller=nvidia%2Friva-translate-4b-instruct-v2&fmt=chat), [`riva-translate`](https://ailoot.ai/models/zh-hant-tw/#m=nvidia%2Friva-translate-4b-instruct-v2&route=Core&caller=riva-translate&fmt=chat), [`riva-translate-latest`](https://ailoot.ai/models/zh-hant-tw/#m=nvidia%2Friva-translate-4b-instruct-v2&route=Core&caller=riva-translate-latest&fmt=chat)

FAQ · nvidia/riva-translate-4b-instruct-v2

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

`POST /v1/chat/completions` · `nvidia/riva-translate-4b-instruct-v2`: `text` → `text` `POST /v1/chat/completions` · `riva-translate`: `text` → `text` `POST /v1/chat/completions` · `riva-translate-latest`: `text` → `text`

請求使用哪些欄位？

`POST /v1/chat/completions` · `nvidia/riva-translate-4b-instruct-v2`: `model`, `messages`, `stream` `POST /v1/chat/completions` · `riva-translate`: `model`, `messages`, `stream` `POST /v1/chat/completions` · `riva-translate-latest`: `model`, `messages`, `stream`

適用哪些限制？

`POST /v1/chat/completions` · `nvidia/riva-translate-4b-instruct-v2`: `ctx`: `4096`; `max_out`: `1024`; `messages.min_items`: `1` `POST /v1/chat/completions` · `riva-translate`: `ctx`: `4096`; `max_out`: `1024`; `messages.min_items`: `1` `POST /v1/chat/completions` · `riva-translate-latest`: `ctx`: `4096`; `max_out`: `1024`; `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功能。
