Google: Gemini 2.5 Pro
Gemini 2.5 Pro 是 Google 用於複雜程式碼、數學、STEM 及長上下文分析的穩定版 thinking 模型。它接收文字、圖像、音訊、影片及 PDF,回傳文字,支援工具與結構化輸出。動態推理預算支援 128–32,768 token,無法完全關閉。
- Ailoot · Anthropic Messages
POST /v1/messagesgemini-2.5-pro - Ailoot · Gemini generateContent
POST /v1beta/models/{model}:generateContentgemini-2.5-pro - Ailoot Ultra · OpenAI Chat
POST /v1/chat/completionsgemini-2.5-pro - Ailoot Ultra · Anthropic Messages
POST /v1/messagesgemini-2.5-pro - Ailoot Ultra · OpenAI Chat
POST /v1/chat/completionsgoogle/gemini-2.5-pro - Ailoot Ultra · Anthropic Messages
POST /v1/messagesgoogle/gemini-2.5-pro
關於模型
此說明介紹模型的能力。Ailoot 可用的輸入、輸出與選項,依所選方法列於下方。
Gemini 2.5 Pro 是 Google 用於進階程式開發、數學、STEM 及長上下文分析的穩定版 thinking 設定。它能理解文字、音訊、圖像、影片及整個程式碼儲存庫,其 Gemini API 設定也接受 PDF 輸入。輸出為文字,包含程式碼、書面分析或結構化紀錄。實用任務應提供證據,要求可檢查的結果,例如附解說的解答、程式碼庫發現或多文件比較。
程式開發應提供相關檔案、觀察到的行為,以及重要變更或問題。長上下文可協助模型關聯模組,而非僅依單一孤立片段推理。程式碼路徑調查可要求從輸入表單追蹤某個識別碼,經過處理至儲存,找出契約改變的位置並提出聚焦修正。請保留限制並要求支持參照。修訂建議需要與實際程式碼,以及透過連接工具完成的任何驗證比較。
數學或科學分析應說明問題、假設、單位及所需答案形式。請提供計算依賴的資料或圖形。要求有依據的結果,以及讓結果可評估的檢查,例如邊界案例或與原始值比較。模型推理能力不會消除題目敘述的歧義。應讓未知量或無依據假設保持可見,而非用方便的數值取代。
文件記載的預設為動態 thinking。Gemini 2.5 GenerateContent 指南對 Pro 支援 128 至 32,768 token 的明確推理預算,或以 -1 使用自適應 thinking。此版本無法完全關閉 thinking。這些控制不同於 Flash 的零預算選項,也不同於 Gemini 3 的 thinking-level 設定。Thinking 預算指引推理,而非保證確切內部 token 數量;回應上限也需為最終成果留下空間。
多模態文件工作應指出支持答案的頁面、圖表、圖像區域或錄影事件。實用整合任務可要求列出多份來源文件中相互競爭的主張、支持段落,以及與某項決策相關的差異。請要求模型區分明述事實與推論。影片或音訊應定義結果是描述、轉錄稿、摘要或比較。在此設定中,圖像與聲音是文字結果的證據。
此確切 API 頁面記載函式呼叫、程式碼執行、檔案搜尋、搜尋 grounding、Maps grounding、URL context 及結構化輸出。請定義函式用途及參數欄位,在後續回合保留真實結果。受結構描述約束的紀錄應指定必要欄位及缺漏資訊的表示方式。原生架構為多模態稀疏混合專家 Transformer;此模型設計本身不會提供外部工具執行,也不會在回傳文字或程式碼之外提供完成的應用程式。
原生模型資訊卡列出 1M 輸入上下文及 64K 文字輸出;API 表指定 1,048,576 輸入 token 及 65,536 輸出 token。指令、來源內容及保留歷史皆需納入輸入準備。最大回應額度包含推理 token,因此過小上限可能中斷最終答案。文件記載快取及批次處理,以及 Flex、Priority 選項。準備獨立長上下文任務時,應保留各來源識別碼及所需最終形式。
穩定版識別碼與共用 Pro 模型資訊卡另行討論的 Experimental 及 Preview 版本不同。不能只因共享 Pro 名稱,就將那些版本專屬結果歸於此設定。資訊卡指出可能的幻覺,以及因果理解、複雜演繹及反事實推理限制,知識截止時間為 2025 年 1 月。最新資訊重要時請提供最新證據,並檢查來源參照、計算及修改建議。實用輸出是任務所要求且有依據的文字或程式碼成果。
實用任務
實用任務
英文技術範例
Trace an identifier through storage
Trace this identifier through three excerpts: form sends {customer_id:'0017'}; service computes id=Number(body.customer_id); repository stores String(id). Requirement: preserve leading zeros. Identify where the contract changes, propose a minimal consistent correction and give tests for '0017', '17' and a missing ID. Do not claim the tests were executed.預期結果
A source-path explanation, a proposed patch and a three-case regression-test plan.檢查結果
Check that the proposed path preserves distinct strings 0017 and 17 while specifying missing-ID behavior.Ailoot · Anthropic Messages POST /v1/messages gemini-2.5-pro
gemini-2.5-pro入門
Gemini 2.5 Pro 是 Google 用於複雜程式碼、數學、STEM 及長上下文分析的穩定版 thinking 模型。它接收文字、圖像、音訊、影片及 PDF,回傳文字,支援工具與結構化輸出。動態推理預算支援 128–32,768 token,無法完全關閉。
- 接受的輸入
- 文字 · 圖片
- 結果
- 文字
Ailoot 可用 · 輸入與方法
Ailoot · Anthropic Messages POST /v1/messages
- 輸入
text,image- 輸出
text- 上下文
- 1,048,576 tokens
- 輸出上限
- 65,536 tokens
- 輸出格式
- json 或 SSE
| 欄位 | 類型 | 要求 | 值與限制 | 預設值 |
|---|---|---|---|---|
欄位model | 類型string | 要求必填 | 值與限制 gemini-2.5-pro | 預設值— |
欄位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 區塊
文字 + 圖片
{type:image,source:{type:base64,media_type,data}} 或 type=url 的來源
方法參數與生命週期
| 參數 | 規格 |
|---|---|
參數material_types | 規格text, image |
參數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 方法費率
POST /v1/messages- 輸入
- US$0.00125 / 1K
- 輸出
- US$0.01 / 1K
- 讀取快取
- US$0.000125 / 1K
依請求長度計價 · Anthropic Messages
| 請求大小,tokens | 輸入 | 輸出 | 讀取快取 | 寫入快取 | 快取 5 分鐘 | 快取 1 小時 |
|---|---|---|---|---|---|---|
| 請求大小,tokens(0; 200,000] | 輸入US$0.00125 | 輸出US$0.01 | 讀取快取US$0.000125 | 寫入快取基本費率:— | 快取 5 分鐘基本費率:— | 快取 1 小時基本費率:— |
| 請求大小,tokens(200,000; ∞) | 輸入US$0.0025 | 輸出US$0.015 | 讀取快取US$0.00025 | 寫入快取基本費率:— | 快取 5 分鐘基本費率:— | 快取 1 小時基本費率:— |
費率單位為每 1K Token 的 USD 金額。 未設定費率時,會沿用此方法的基本費率;«—» 表示未設定基本費率。
Ailoot 會在請求前預留估算金額。取得結果後,依實測用量結算最終費用。串流結算採用最終用量紀錄。預留金額與結算的運作方式 →
參考費率詳情
模型層級的參考費率表不會變更方法選擇、報價或費用。實際計費採用所選 Ailoot 方法的費率。
模型參考費率表
各設定的價格
請逐一核對各項費用與所列條件。每組互為替代選項的設定只套用一種費率。
| 設定 | 費率表 | 上下文 Token 數大於 | 上下文 Token 數小於或等於 | 費用 |
|---|---|---|---|---|
| 設定OpenAI Chat · 基本 token 費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token $0.0025 / 1K Token 輸出 · 輸出 Token $0.02 / 1K Token 輸入 · 讀取快取 $0.00025 / 1K Token 輸入 · 寫入快取 $0.00075 / 1K Token 輸入 · 寫入快取,1 小時 — / 1K Token 輸出 · 推理輸出詞元 $0.02 / 1K Token |
| 設定OpenAI Chat · 請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於200,000 | 費用 輸入 · 輸入 Token $0.0025 / 1K Token 輸出 · 輸出 Token $0.02 / 1K Token 輸入 · 讀取快取 $0.00025 / 1K Token 輸入 · 寫入快取 $0.00075 / 1K Token 輸入 · 寫入快取,1 小時 — / 1K Token |
| 設定OpenAI Chat · 請求長度級距 2 | 費率表— | 上下文 Token 數大於200,000 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token $0.005 / 1K Token 輸出 · 輸出 Token $0.03 / 1K Token 輸入 · 讀取快取 $0.0005 / 1K Token 輸入 · 寫入快取 $0.00075 / 1K Token 輸入 · 寫入快取,1 小時 — / 1K Token |
| 設定Anthropic Messages · 基本 token 費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token $0.0025 / 1K Token 輸出 · 輸出 Token $0.02 / 1K Token 輸入 · 讀取快取 $0.00025 / 1K Token 輸入 · 寫入快取 $0.00075 / 1K Token 輸入 · 寫入快取,1 小時 — / 1K Token 輸出 · 推理輸出詞元 $0.02 / 1K Token |
| 設定Anthropic Messages · 請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於200,000 | 費用 輸入 · 輸入 Token $0.0025 / 1K Token 輸出 · 輸出 Token $0.02 / 1K Token 輸入 · 讀取快取 $0.00025 / 1K Token 輸入 · 寫入快取 $0.00075 / 1K Token 輸入 · 寫入快取,1 小時 — / 1K Token |
| 設定Anthropic Messages · 請求長度級距 2 | 費率表— | 上下文 Token 數大於200,000 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token $0.005 / 1K Token 輸出 · 輸出 Token $0.03 / 1K Token 輸入 · 讀取快取 $0.0005 / 1K Token 輸入 · 寫入快取 $0.00075 / 1K Token 輸入 · 寫入快取,1 小時 — / 1K Token |
請求範例
Ailoot · Anthropic Messages
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": "gemini-2.5-pro", "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
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_IMAGE_FILE:?Set your actual PNG JPEG or WebP image}"
export AILOOT_IMAGE_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "gemini-2.5-pro", "max_tokens": 1024, "messages": [{"role": "user", "content": [{"type": "text", "text": "Read labels and numbers in this image; flag unreadable text."}]}]}')
import base64
f=Path(os.environ["AILOOT_IMAGE_FILE"])
if not f.is_file():raise SystemExit("Choose an actual PNG JPEG or WebP image")
raw=f.read_bytes()
mime="image/png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "image/jpeg" if raw.startswith(b"\xff\xd8") else "image/webp" if raw[:4]==b"RIFF" and raw[8:12]==b"WEBP" else None
if not mime:raise SystemExit("Use PNG JPEG or WebP")
b64=base64.b64encode(raw).decode()
p["messages"][0]["content"].append({"type":"image","source":{"type":"base64","media_type":mime,"data":b64}})
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
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="gemini-2.5-pro",
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"))
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: "gemini-2.5-pro",
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);
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='gemini-2.5-pro',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 | 條件必要欄位、素材表示方式或參數值無效 | 下一步提出新的建立請求前,先修正指定欄位。 |
別名
模型別名
Ailoot gemini-2.5-pro
Ailoot Ultra gemini-2.5-pro, google/gemini-2.5-pro
方法路徑別名
/chat/completions
相關呼叫用 ID
Ailoot · Gemini generateContent POST /v1beta/models/{model}:generateContent gemini-2.5-pro
gemini-2.5-pro入門
Gemini 2.5 Pro 是 Google 用於複雜程式碼、數學、STEM 及長上下文分析的穩定版 thinking 模型。它接收文字、圖像、音訊、影片及 PDF,回傳文字,支援工具與結構化輸出。動態推理預算支援 128–32,768 token,無法完全關閉。
- 接受的輸入
- 文字 · 圖片
- 結果
- 文字
Ailoot 可用 · 輸入與方法
Ailoot · Gemini generateContent POST /v1beta/models/{model}:generateContent
- 輸入
text,image- 輸出
text- 上下文
- 1,048,576 tokens
- 輸出上限
- 65,536 tokens
- 輸出格式
- json 或支援的串流
| 欄位 | 類型 | 要求 | 值與限制 | 預設值 |
|---|---|---|---|---|
欄位path.model | 類型string | 要求必填 | 值與限制 gemini-2.5-pro | 預設值— |
欄位contents | 類型content[] | 要求必填 | 值與限制 項目數下限: 1 | 預設值— |
欄位contents[].role | 類型string | 要求選填 | 值與限制 user, model | 預設值— |
欄位contents[].parts | 類型part[] | 要求必填 | 值與限制 | 預設值— |
欄位systemInstruction | 類型content | 要求選填 | 值與限制 | 預設值— |
欄位generationConfig.maxOutputTokens | 類型integer | 要求選填 | 值與限制 最小值: 1 依模型而定 | 預設值— |
欄位generationConfig.temperature | 類型number | 要求選填 | 值與限制 依模型而定 | 預設值— |
欄位generationConfig.topP | 類型number | 要求選填 | 值與限制 依模型而定 | 預設值— |
欄位generationConfig.topK | 類型integer | 要求選填 | 值與限制 依模型而定 | 預設值— |
欄位generationConfig.stopSequences | 類型string[] | 要求選填 | 值與限制 依模型而定 | 預設值— |
欄位generationConfig.thinkingConfig.includeThoughts | 類型boolean | 要求選填 | 值與限制 依模型而定 | 預設值— |
欄位generationConfig.thinkingConfig.thinkingBudget | 類型integer | 要求選填 | 值與限制 依模型而定 | 預設值— |
欄位tools[].functionDeclarations | 類型function_declaration[] | 要求選填 | 值與限制 依模型而定 | 預設值— |
欄位toolConfig.functionCallingConfig.mode | 類型string | 要求選填 | 值與限制 依模型而定 | 預設值— |
欄位safetySettings | 類型object[] | 要求選填 | 值與限制 依模型而定 | 預設值— |
欄位sessionId | 類型string | 要求選填 | 值與限制 | 預設值— |
輸入素材組合
文字 · UTF8 文字
contents[].parts[].text
文字 + 圖片
parts[].inlineData={mimeType,data}
方法參數與生命週期
| 參數 | 規格 |
|---|---|
參數material_types | 規格text, image |
參數required | 規格contents |
參數optional_controls | 規格null |
參數content_type | 規格application/json |
參數text_file_material | 規格實際 UTF-8 內容以文字插入;檔案 ID/URLs 需要另有精確支援 |
生命週期: exact retained published method
方法結構與 ID 均為精確值;供應商能力與准入狀態分開。
方案
Ailoot 方法費率
POST /v1beta/models/{model}:generateContent- 輸入
- US$0.00125 / 1K
- 輸出
- US$0.01 / 1K
- 讀取快取
- US$0.000125 / 1K
依請求長度計價 · Gemini generateContent
| 請求大小,tokens | 輸入 | 輸出 | 讀取快取 | 寫入快取 | 快取 5 分鐘 | 快取 1 小時 |
|---|---|---|---|---|---|---|
| 請求大小,tokens(0; 200,000] | 輸入US$0.00125 | 輸出US$0.01 | 讀取快取US$0.000125 | 寫入快取基本費率:— | 快取 5 分鐘基本費率:— | 快取 1 小時基本費率:— |
| 請求大小,tokens(200,000; ∞) | 輸入US$0.0025 | 輸出US$0.015 | 讀取快取US$0.00025 | 寫入快取基本費率:— | 快取 5 分鐘基本費率:— | 快取 1 小時基本費率:— |
費率單位為每 1K Token 的 USD 金額。 未設定費率時,會沿用此方法的基本費率;«—» 表示未設定基本費率。
Ailoot 會在請求前預留估算金額。取得結果後,依實測用量結算最終費用。串流結算採用最終用量紀錄。預留金額與結算的運作方式 →
參考費率詳情
模型層級的參考費率表不會變更方法選擇、報價或費用。實際計費採用所選 Ailoot 方法的費率。
模型參考費率表
各設定的價格
請逐一核對各項費用與所列條件。每組互為替代選項的設定只套用一種費率。
| 設定 | 費率表 | 上下文 Token 數大於 | 上下文 Token 數小於或等於 | 費用 |
|---|---|---|---|---|
| 設定OpenAI Chat · 基本 token 費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token $0.0025 / 1K Token 輸出 · 輸出 Token $0.02 / 1K Token 輸入 · 讀取快取 $0.00025 / 1K Token 輸入 · 寫入快取 $0.00075 / 1K Token 輸入 · 寫入快取,1 小時 — / 1K Token 輸出 · 推理輸出詞元 $0.02 / 1K Token |
| 設定OpenAI Chat · 請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於200,000 | 費用 輸入 · 輸入 Token $0.0025 / 1K Token 輸出 · 輸出 Token $0.02 / 1K Token 輸入 · 讀取快取 $0.00025 / 1K Token 輸入 · 寫入快取 $0.00075 / 1K Token 輸入 · 寫入快取,1 小時 — / 1K Token |
| 設定OpenAI Chat · 請求長度級距 2 | 費率表— | 上下文 Token 數大於200,000 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token $0.005 / 1K Token 輸出 · 輸出 Token $0.03 / 1K Token 輸入 · 讀取快取 $0.0005 / 1K Token 輸入 · 寫入快取 $0.00075 / 1K Token 輸入 · 寫入快取,1 小時 — / 1K Token |
| 設定Anthropic Messages · 基本 token 費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token $0.0025 / 1K Token 輸出 · 輸出 Token $0.02 / 1K Token 輸入 · 讀取快取 $0.00025 / 1K Token 輸入 · 寫入快取 $0.00075 / 1K Token 輸入 · 寫入快取,1 小時 — / 1K Token 輸出 · 推理輸出詞元 $0.02 / 1K Token |
| 設定Anthropic Messages · 請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於200,000 | 費用 輸入 · 輸入 Token $0.0025 / 1K Token 輸出 · 輸出 Token $0.02 / 1K Token 輸入 · 讀取快取 $0.00025 / 1K Token 輸入 · 寫入快取 $0.00075 / 1K Token 輸入 · 寫入快取,1 小時 — / 1K Token |
| 設定Anthropic Messages · 請求長度級距 2 | 費率表— | 上下文 Token 數大於200,000 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token $0.005 / 1K Token 輸出 · 輸出 Token $0.03 / 1K Token 輸入 · 讀取快取 $0.0005 / 1K Token 輸入 · 寫入快取 $0.00075 / 1K Token 輸入 · 寫入快取,1 小時 — / 1K Token |
請求範例
Ailoot · Gemini generateContent
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('{"contents": []}')
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["contents"]=[{"role":"user","parts":[{"text":"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/v1beta/models/gemini-2.5-pro:generateContent \
-H "x-goog-api-key: $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
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_IMAGE_FILE:?Set your actual PNG JPEG or WebP image}"
export AILOOT_IMAGE_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"contents": [{"role": "user", "parts": [{"text": "Read labels and numbers in this image; flag unreadable text."}]}]}')
import base64
f=Path(os.environ["AILOOT_IMAGE_FILE"])
if not f.is_file():raise SystemExit("Choose an actual PNG JPEG or WebP image")
raw=f.read_bytes()
mime="image/png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "image/jpeg" if raw.startswith(b"\xff\xd8") else "image/webp" if raw[:4]==b"RIFF" and raw[8:12]==b"WEBP" else None
if not mime:raise SystemExit("Use PNG JPEG or WebP")
b64=base64.b64encode(raw).decode()
p["contents"][0]["parts"].append({"inlineData":{"mimeType":mime,"data":b64}})
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1beta/models/gemini-2.5-pro:generateContent \
-H "x-goog-api-key: $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
from google import genai
from google.genai import types
import os
if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client = genai.Client(
api_key=os.environ["AILOOT_API_KEY"],
http_options=types.HttpOptions(base_url="https://api.ailoot.ai"),
)
resp = client.models.generate_content(model="gemini-2.5-pro", contents="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_json_dict())
import { GoogleGenAI } from "@google/genai";
if (!process.env.AILOOT_API_KEY?.trim()) throw new Error("Set AILOOT_API_KEY before making a request");
const ai = new GoogleGenAI({ apiKey: process.env.AILOOT_API_KEY, httpOptions: { baseUrl: "https://api.ailoot.ai" } });
const resp = await ai.models.generateContent({ model: "gemini-2.5-pro", contents: "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);
from google import genai
from google.genai import types
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=genai.Client(api_key=os.environ["AILOOT_API_KEY"],http_options=types.HttpOptions(base_url="https://api.ailoot.ai"))
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))
count=0
with Path("stream-events.jsonl").open("w",encoding="utf-8") as log:
for chunk in client.models.generate_content_stream(model='gemini-2.5-pro',contents="Explain observations and hypotheses in three sentences."):
payload=chunk.to_json_dict()
log.write(json.dumps(payload,ensure_ascii=False)+"\n"); log.flush()
save_result(payload,"stream-chunk-"+str(count))
count+=1
接收並儲存結果
Ailoot · Gemini generateContent
json 或支援的串流
保留所有已完成的結果
請保留所有完整傳回的回應、檔案與內容區塊。
保留所有候選項與部分,包括函式呼叫、思考簽章與用量;依序組合串流片段。
需要檢查原始回應時
保留請求/回應 ID 與標頭。未提供通用的文字工作擷取 URL。
回應欄位
| 欄位 | 類型 |
|---|---|
欄位responseId | 類型string |
欄位modelVersion | 類型string |
欄位candidates[].content.parts[] | 類型text|inlineData|functionCall|other part |
欄位candidates[].finishReason | 類型string |
欄位usageMetadata | 類型object |
錯誤與後續步驟
| 回應 | 條件 | 下一步 |
|---|---|---|
回應400 · invalid_request_error | 條件必要欄位、素材表示方式或參數值無效 | 下一步提出新的建立請求前,先修正指定欄位。 |
別名
模型別名
Ailoot gemini-2.5-pro
Ailoot Ultra gemini-2.5-pro, google/gemini-2.5-pro
方法路徑別名
/chat/completions
相關呼叫用 ID
Ailoot Ultra · OpenAI Chat POST /v1/chat/completions gemini-2.5-pro
gemini-2.5-progemini-2.5-progoogle/gemini-2.5-pro
入門
Gemini 2.5 Pro 是 Google 用於複雜程式碼、數學、STEM 及長上下文分析的穩定版 thinking 模型。它接收文字、圖像、音訊、影片及 PDF,回傳文字,支援工具與結構化輸出。動態推理預算支援 128–32,768 token,無法完全關閉。
- 接受的輸入
- 文字
- 結果
- 文字
Ailoot 可用 · 輸入與方法
Ailoot Ultra · OpenAI Chat POST /v1/chat/completions
- 輸入
text- 輸出
text- 輸出格式
- json 或 SSE
| 欄位 | 類型 | 要求 | 值與限制 | 預設值 |
|---|---|---|---|---|
欄位model | 類型string | 要求必填 | 值與限制 gemini-2.5-pro | 預設值— |
欄位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 調整值時
- 顯式快取計價
- 未啟用 請求顯式快取時
- 推理輸出
- 推理詞元已包含在彙總輸出中,並按列出的子集費率計費;切勿重複計入這些詞元。 輸出包含推理詞元時
Ailoot 費率
各設定的價格
請逐一核對各項費用與所列條件。每組互為替代選項的設定只套用一種費率。
| 設定 | 費率表 | 上下文 Token 數大於 | 上下文 Token 數小於或等於 | 費用 |
|---|---|---|---|---|
| 設定詞元基本費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token $0.0025 / 1K Token 輸出 · 輸出 Token $0.02 / 1K Token 輸入 · 讀取快取 $0.00025 / 1K Token 輸入 · 寫入快取 $0.00075 / 1K Token 輸入 · 寫入快取,1 小時 — / 1K Token 輸出 · 推理輸出詞元 $0.02 / 1K Token |
| 設定請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於200,000 | 費用 輸入 · 輸入 Token $0.0025 / 1K Token 輸出 · 輸出 Token $0.02 / 1K Token 輸入 · 讀取快取 $0.00025 / 1K Token 輸入 · 寫入快取 $0.00075 / 1K Token 輸入 · 寫入快取,1 小時 — / 1K Token |
| 設定請求長度級距 2 | 費率表— | 上下文 Token 數大於200,000 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token $0.005 / 1K Token 輸出 · 輸出 Token $0.03 / 1K Token 輸入 · 讀取快取 $0.0005 / 1K Token 輸入 · 寫入快取 $0.00075 / 1K Token 輸入 · 寫入快取,1 小時 — / 1K Token |
Ailoot 會在請求前預留估算金額。取得結果後,依實測用量結算最終費用。串流結算採用最終用量紀錄。預留金額與結算的運作方式 →
請求範例
Ailoot Ultra · OpenAI Chat
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model":"gemini-2.5-pro","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
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="gemini-2.5-pro", 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 | 條件必要欄位、素材表示方式或參數值無效 | 下一步提出新的建立請求前,先修正指定欄位。 |
別名
模型別名
Ailoot gemini-2.5-pro
Ailoot Ultra gemini-2.5-pro, google/gemini-2.5-pro
方法路徑別名
/chat/completions
相關呼叫用 ID
Ailoot Ultra · Anthropic Messages POST /v1/messages gemini-2.5-pro
gemini-2.5-progemini-2.5-progoogle/gemini-2.5-pro
入門
Gemini 2.5 Pro 是 Google 用於複雜程式碼、數學、STEM 及長上下文分析的穩定版 thinking 模型。它接收文字、圖像、音訊、影片及 PDF,回傳文字,支援工具與結構化輸出。動態推理預算支援 128–32,768 token,無法完全關閉。
- 接受的輸入
- 文字
- 結果
- json · sse
Ailoot 可用 · 輸入與方法
Ailoot Ultra · Anthropic Messages POST /v1/messages
- 輸入
text- 輸出
json,sse- 輸出格式
- JSON 或 SSE
| 欄位 | 類型 | 要求 | 值與限制 | 預設值 |
|---|---|---|---|---|
欄位model | 類型string | 要求必填 | 值與限制 gemini-2.5-pro | 預設值— |
欄位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 調整值時
- 顯式快取計價
- 未啟用 請求顯式快取時
- 推理輸出
- 推理詞元已包含在彙總輸出中,並按列出的子集費率計費;切勿重複計入這些詞元。 輸出包含推理詞元時
Ailoot 費率
各設定的價格
請逐一核對各項費用與所列條件。每組互為替代選項的設定只套用一種費率。
| 設定 | 費率表 | 上下文 Token 數大於 | 上下文 Token 數小於或等於 | 費用 |
|---|---|---|---|---|
| 設定詞元基本費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token $0.0025 / 1K Token 輸出 · 輸出 Token $0.02 / 1K Token 輸入 · 讀取快取 $0.00025 / 1K Token 輸入 · 寫入快取 $0.00075 / 1K Token 輸入 · 寫入快取,1 小時 — / 1K Token 輸出 · 推理輸出詞元 $0.02 / 1K Token |
| 設定請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於200,000 | 費用 輸入 · 輸入 Token $0.0025 / 1K Token 輸出 · 輸出 Token $0.02 / 1K Token 輸入 · 讀取快取 $0.00025 / 1K Token 輸入 · 寫入快取 $0.00075 / 1K Token 輸入 · 寫入快取,1 小時 — / 1K Token |
| 設定請求長度級距 2 | 費率表— | 上下文 Token 數大於200,000 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token $0.005 / 1K Token 輸出 · 輸出 Token $0.03 / 1K Token 輸入 · 讀取快取 $0.0005 / 1K Token 輸入 · 寫入快取 $0.00075 / 1K Token 輸入 · 寫入快取,1 小時 — / 1K Token |
Ailoot 會在請求前預留估算金額。取得結果後,依實測用量結算最終費用。串流結算採用最終用量紀錄。預留金額與結算的運作方式 →
請求範例
Ailoot Ultra · Anthropic Messages
{
"model": "gemini-2.5-pro",
"max_tokens": 128,
"messages": [
{
"role": "user",
"content": "Summarize the incident report."
}
],
"stream": false
}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': 'gemini-2.5-pro', '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
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': 'gemini-2.5-pro', '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 | 條件必要欄位、素材表示方式或參數值無效 | 下一步提出新的建立請求前,先修正指定欄位。 |
別名
模型別名
Ailoot gemini-2.5-pro
Ailoot Ultra gemini-2.5-pro, google/gemini-2.5-pro
方法路徑別名
/chat/completions
相關呼叫用 ID
Ailoot Ultra · OpenAI Chat POST /v1/chat/completions google/gemini-2.5-pro
google/gemini-2.5-progemini-2.5-progoogle/gemini-2.5-pro
入門
Gemini 2.5 Pro 是 Google 用於複雜程式碼、數學、STEM 及長上下文分析的穩定版 thinking 模型。它接收文字、圖像、音訊、影片及 PDF,回傳文字,支援工具與結構化輸出。動態推理預算支援 128–32,768 token,無法完全關閉。
- 接受的輸入
- 文字
- 結果
- 文字
Ailoot 可用 · 輸入與方法
Ailoot Ultra · OpenAI Chat POST /v1/chat/completions
- 輸入
text- 輸出
text- 輸出格式
- json 或 SSE
| 欄位 | 類型 | 要求 | 值與限制 | 預設值 |
|---|---|---|---|---|
欄位model | 類型string | 要求必填 | 值與限制 google/gemini-2.5-pro | 預設值— |
欄位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 調整值時
- 顯式快取計價
- 未啟用 請求顯式快取時
- 推理輸出
- 推理詞元已包含在彙總輸出中,並按列出的子集費率計費;切勿重複計入這些詞元。 輸出包含推理詞元時
Ailoot 費率
各設定的價格
請逐一核對各項費用與所列條件。每組互為替代選項的設定只套用一種費率。
| 設定 | 費率表 | 上下文 Token 數大於 | 上下文 Token 數小於或等於 | 費用 |
|---|---|---|---|---|
| 設定詞元基本費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token $0.0025 / 1K Token 輸出 · 輸出 Token $0.02 / 1K Token 輸入 · 讀取快取 $0.00025 / 1K Token 輸入 · 寫入快取 $0.00075 / 1K Token 輸入 · 寫入快取,1 小時 — / 1K Token 輸出 · 推理輸出詞元 $0.02 / 1K Token |
| 設定請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於200,000 | 費用 輸入 · 輸入 Token $0.0025 / 1K Token 輸出 · 輸出 Token $0.02 / 1K Token 輸入 · 讀取快取 $0.00025 / 1K Token 輸入 · 寫入快取 $0.00075 / 1K Token 輸入 · 寫入快取,1 小時 — / 1K Token |
| 設定請求長度級距 2 | 費率表— | 上下文 Token 數大於200,000 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token $0.005 / 1K Token 輸出 · 輸出 Token $0.03 / 1K Token 輸入 · 讀取快取 $0.0005 / 1K Token 輸入 · 寫入快取 $0.00075 / 1K Token 輸入 · 寫入快取,1 小時 — / 1K Token |
Ailoot 會在請求前預留估算金額。取得結果後,依實測用量結算最終費用。串流結算採用最終用量紀錄。預留金額與結算的運作方式 →
請求範例
Ailoot Ultra · OpenAI Chat
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "google/gemini-2.5-pro", "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
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='google/gemini-2.5-pro',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"))
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='google/gemini-2.5-pro',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 | 條件必要欄位、素材表示方式或參數值無效 | 下一步提出新的建立請求前,先修正指定欄位。 |
別名
模型別名
Ailoot gemini-2.5-pro
Ailoot Ultra gemini-2.5-pro, google/gemini-2.5-pro
方法路徑別名
/chat/completions
相關呼叫用 ID
Ailoot Ultra · Anthropic Messages POST /v1/messages google/gemini-2.5-pro
google/gemini-2.5-progemini-2.5-progoogle/gemini-2.5-pro
入門
Gemini 2.5 Pro 是 Google 用於複雜程式碼、數學、STEM 及長上下文分析的穩定版 thinking 模型。它接收文字、圖像、音訊、影片及 PDF,回傳文字,支援工具與結構化輸出。動態推理預算支援 128–32,768 token,無法完全關閉。
- 接受的輸入
- 文字
- 結果
- json · sse
Ailoot 可用 · 輸入與方法
Ailoot Ultra · Anthropic Messages POST /v1/messages
- 輸入
text- 輸出
json,sse- 輸出格式
- JSON 或 SSE
| 欄位 | 類型 | 要求 | 值與限制 | 預設值 |
|---|---|---|---|---|
欄位model | 類型string | 要求必填 | 值與限制 google/gemini-2.5-pro | 預設值— |
欄位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 調整值時
- 顯式快取計價
- 未啟用 請求顯式快取時
- 推理輸出
- 推理詞元已包含在彙總輸出中,並按列出的子集費率計費;切勿重複計入這些詞元。 輸出包含推理詞元時
Ailoot 費率
各設定的價格
請逐一核對各項費用與所列條件。每組互為替代選項的設定只套用一種費率。
| 設定 | 費率表 | 上下文 Token 數大於 | 上下文 Token 數小於或等於 | 費用 |
|---|---|---|---|---|
| 設定詞元基本費率 | 費率表基本費率 | 上下文 Token 數大於— | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token $0.0025 / 1K Token 輸出 · 輸出 Token $0.02 / 1K Token 輸入 · 讀取快取 $0.00025 / 1K Token 輸入 · 寫入快取 $0.00075 / 1K Token 輸入 · 寫入快取,1 小時 — / 1K Token 輸出 · 推理輸出詞元 $0.02 / 1K Token |
| 設定請求長度級距 1 | 費率表— | 上下文 Token 數大於0 | 上下文 Token 數小於或等於200,000 | 費用 輸入 · 輸入 Token $0.0025 / 1K Token 輸出 · 輸出 Token $0.02 / 1K Token 輸入 · 讀取快取 $0.00025 / 1K Token 輸入 · 寫入快取 $0.00075 / 1K Token 輸入 · 寫入快取,1 小時 — / 1K Token |
| 設定請求長度級距 2 | 費率表— | 上下文 Token 數大於200,000 | 上下文 Token 數小於或等於無上限 | 費用 輸入 · 輸入 Token $0.005 / 1K Token 輸出 · 輸出 Token $0.03 / 1K Token 輸入 · 讀取快取 $0.0005 / 1K Token 輸入 · 寫入快取 $0.00075 / 1K Token 輸入 · 寫入快取,1 小時 — / 1K Token |
Ailoot 會在請求前預留估算金額。取得結果後,依實測用量結算最終費用。串流結算採用最終用量紀錄。預留金額與結算的運作方式 →
請求範例
Ailoot Ultra · Anthropic Messages
{
"model": "google/gemini-2.5-pro",
"max_tokens": 128,
"messages": [
{
"role": "user",
"content": "Summarize the incident report."
}
],
"stream": false
}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': 'google/gemini-2.5-pro', '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
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': 'google/gemini-2.5-pro', '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 | 條件必要欄位、素材表示方式或參數值無效 | 下一步提出新的建立請求前,先修正指定欄位。 |
別名
模型別名
Ailoot gemini-2.5-pro
Ailoot Ultra gemini-2.5-pro, google/gemini-2.5-pro
方法路徑別名
/chat/completions
相關呼叫用 ID
FAQ · Google: Gemini 2.5 Pro
- 可以使用哪些輸入與結果?
POST /v1/messages·gemini-2.5-pro:text,image→textPOST /v1beta/models/{model}:generateContent·gemini-2.5-pro:text,image→textPOST /v1/chat/completions·gemini-2.5-pro:text→textPOST /v1/messages·gemini-2.5-pro:text→json,ssePOST /v1/chat/completions·google/gemini-2.5-pro:text→textPOST /v1/messages·google/gemini-2.5-pro:text→json,sse- 請求使用哪些欄位?
POST /v1/messages·gemini-2.5-pro:model,messages,system,max_tokens,stream,metadataPOST /v1beta/models/{model}:generateContent·gemini-2.5-pro:contents,systemInstruction,sessionIdPOST /v1/chat/completions·gemini-2.5-pro:model,messages,streamPOST /v1/messages·gemini-2.5-pro:model,messages,max_tokens,streamPOST /v1/chat/completions·google/gemini-2.5-pro:model,messages,stream,modalities,providerPOST /v1/messages·google/gemini-2.5-pro:model,messages,max_tokens,stream- 適用哪些限制?
POST /v1/messages·gemini-2.5-pro:ctx:1048576;max_out:65536;messages.min_items:1;max_tokens.minimum:1POST /v1beta/models/{model}:generateContent·gemini-2.5-pro:ctx:1048576;max_out:65536;contents.min_items:1POST /v1/chat/completions·gemini-2.5-pro:messages.min_items:1POST /v1/chat/completions·google/gemini-2.5-pro:messages.min_items:1