跳至主要內容
GELATOlab DEVELOPER ATELIER 建立 API Key

PUBLIC API · VERSION 1.0 BETA

讓你的 LLM,
接上配方科學。

從食材名稱解析,到 PAC、POD、MSNF、總固形物與凍結點計算。GELATOlab API 把確定性的配方引擎交給你的 agent、內部工具與自動化流程。

BASE URLhttps://gelatolab.com.tw/api/v1
AUTHBearer API Key
RATE LIMIT60 requests / min
BALANCE COST1 unit / success
IARCHITECTURE

運作方式

GELATOlab API 是標準 HTTPS JSON API,不必安裝專用 SDK。LLM 不應自行猜測食材 ID 或計算配方數值;正確流程是先搜尋食材,再把 API 回傳的 ID 與克數送進配方平衡端點。

01USER INPUT食材名稱與克數

例如:鮮奶 600g、砂糖 160g

02RESOLVE搜尋官方食材 ID

每項食材呼叫 ingredients/search

03CALCULATE送出配方平衡

由 GELATOlab 引擎回傳數值

SERVER-SIDE ONLY

API Key 不可放在瀏覽器、手機 App 或公開程式碼。

請把 Key 存在 server environment variable、雲端 Secret Manager 或密碼管理器。前端應呼叫你自己的後端,再由後端呼叫 GELATOlab API。

IIQUICKSTART

申請與安裝

01

啟用 BUSINESS

Public API 是 BUSINESS 與 ENTERPRISE 權益。登入 GELATOlab 後,確認帳號方案仍在有效期間。

02

開啟開發者中心

前往「設定 → GELATOlab API → 開啟開發者中心」,建立 LIVE 或 TEST Key。每個帳號最多可有 5 組啟用中的 Key。

03

立即保存 Key

完整 Key 只在建立時顯示一次。複製後存進 Secret Manager;若遺失,請撤銷舊 Key 並建立新 Key。

04

選擇你的執行環境

Node.js 18 以上可直接使用內建 fetch;Python 安裝 requests;終端機測試可直接使用 cURL。

NODE.JS 18+

不需要額外安裝 SDK

建立一個 server-side 專案,使用 Node.js 內建的 fetch。請勿把 Key 寫死在程式碼中。

TERMINAL
mkdir gelatolab-api-demo
cd gelatolab-api-demo
npm init -y
node --version

# macOS / Linux
export GELATOLAB_API_KEY="gl_live_your_key"

# Windows PowerShell
$env:GELATOLAB_API_KEY="gl_live_your_key"
CLIENT.MJS
const BASE_URL = "https://gelatolab.com.tw/api/v1";
const API_KEY = process.env.GELATOLAB_API_KEY;

if (!API_KEY) throw new Error("Missing GELATOLAB_API_KEY");

export async function gelatoLab(path, options = {}) {
  const response = await fetch(`${BASE_URL}${path}`, {
    ...options,
    headers: {
      Authorization: `Bearer ${API_KEY}`,
      "Content-Type": "application/json",
      ...options.headers,
    },
  });

  const body = await response.json();
  if (!response.ok) {
    const error = new Error(body.message || "GELATOlab API error");
    error.status = response.status;
    error.code = body.error;
    error.requestId = body.request_id;
    throw error;
  }
  return body;
}
IIIAUTHENTICATION

驗證與環境

除了 /health/openapi.json,所有請求都必須在 Authorization header 放入 Bearer Key。

HTTP HEADER
Authorization: Bearer gl_live_your_key
LIVE KEY

gl_live_*

正式服務使用。請依團隊、應用程式或環境分開建立,方便單獨撤銷。

TEST KEY

gl_test_*

開發與測試環境使用。TEST 與 LIVE 的 Key 類型必須和建立時的環境一致。

IVENDPOINTS

端點與完整流程

METHODPATH用途UNITS
GET/ingredients/search

把使用者食材名稱解析成官方 ID

0
POST/recipes/balance

計算 PAC、POD、MSNF、固形物與凍結點

1 / success
GET/usage

查詢本月 included 與 prepaid 額度

0
GET/health

檢查 API、引擎與食材資料版本

0

STEP A · RESOLVE INGREDIENTS

先搜尋每一項食材

使用者輸入的「鮮奶」可能是別名。搜尋端點會回傳 GELATOlab 官方食材 ID;後續配方只能傳 ID 與克數,不接受自行填入成分資料。

REQUEST
curl "https://gelatolab.com.tw/api/v1/ingredients/search?q=鮮奶&limit=5" \
  -H "Authorization: Bearer $GELATOLAB_API_KEY"
200 RESPONSE
{
  "request_id": "...",
  "query": "鮮奶",
  "matches": [
    {
      "id": "ilLc1HQsDxs7X4vyVDR1",
      "name": "全脂牛奶",
      "name_en": "Whole Milk",
      "category": "乳製品",
      "match_score": 95
    }
  ],
  "usage_units": 0
}

STEP B · BALANCE RECIPE

使用 ID 與克數計算配方

每次 POST 必須帶一個 8–128 字元的 Idempotency-Key。相同 Key 與相同 request body 重送時,不會重複扣 unit;相同 Key 搭配不同內容會回傳 409。

REQUEST
curl "https://gelatolab.com.tw/api/v1/recipes/balance" \
  -X POST \
  -H "Authorization: Bearer $GELATOLAB_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: recipe-demo-20260717-001" \
  --data '{
    "recipe_type": "milk",
    "items": [
      { "ingredient_id": "ilLc1HQsDxs7X4vyVDR1", "grams": 600 },
      { "ingredient_id": "2Sef4m2eeoyHz11NqQwq", "grams": 150 },
      { "ingredient_id": "v5qYjTLMaisEiKy9has0", "grams": 160 },
      { "ingredient_id": "CFY4HJ1JJXrcB8JvPPXM", "grams": 40 },
      { "ingredient_id": "R3_002", "grams": 50 }
    ]
  }'
200 RESPONSE · EXCERPT
{
  "recipe_type": "milk",
  "usage_units": 1,
  "balance": {
    "totalWeight": 1000,
    "water": 66.6,
    "fat": 7.39,
    "protein": 3.68,
    "sugar": 15.97,
    "totalSolids": 33.4,
    "msnf": 9.86,
    "pod": 16.83,
    "pac": 181,
    "freezingPoint": -1.8,
    "overrun": 27.3
  }
}
SUPPORTED RECIPE TYPES
milkcreamsorbetyogurtveganalcoholpethighProteinsugarFree

STEP C · CHECK USAGE

查詢剩餘額度

REQUEST
curl "https://gelatolab.com.tw/api/v1/usage" \
  -H "Authorization: Bearer $GELATOLAB_API_KEY"
VAGENT INTEGRATION

接到 LLM 或 Agent

讓模型負責理解需求與整理食材;讓 GELATOlab 負責食材解析與數值計算。這個責任邊界能避免模型捏造 PAC、POD 或食材係數。

SYSTEM INSTRUCTION

把以下規則放進 agent 的 system prompt

PROMPT.TXT
你可以使用 GELATOlab 配方工具。

規則:
1. 使用者提供食材名稱時,先逐項呼叫 searchIngredients。
2. 只能使用搜尋結果回傳的 ingredient_id;不可自行猜測 ID。
3. 收集所有 ID 與克數後,再呼叫 balanceRecipe。
4. PAC、POD、MSNF、總固形物與凍結點必須引用 API 結果,不可自行計算。
5. 同一次配方重試必須沿用相同 Idempotency-Key。
6. API 回傳 402 時,告知使用者額度不足;不要繞過計費。
7. API 回傳 request_id 時保留它,方便問題追蹤。

FUNCTION SCHEMA

通用 function calling 工具定義

大多數支援 function calling 的 LLM SDK 都能映射這組 JSON Schema;欄位包裝方式依供應商 SDK 調整。

TOOLS.JS
export const gelatolabTools = [
  {
    name: "gelatolab_search_ingredients",
    description: "把食材名稱解析為 GELATOlab 官方 ingredient_id。配方計算前必須先呼叫。",
    inputSchema: {
      type: "object",
      additionalProperties: false,
      required: ["query"],
      properties: {
        query: { type: "string", minLength: 1, maxLength: 80 },
        limit: { type: "integer", minimum: 1, maximum: 20, default: 5 }
      }
    }
  },
  {
    name: "gelatolab_balance_recipe",
    description: "使用官方食材 ID 與克數計算配方平衡。成功呼叫扣 1 unit。",
    inputSchema: {
      type: "object",
      additionalProperties: false,
      required: ["recipe_type", "items"],
      properties: {
        recipe_type: {
          type: "string",
          enum: ["milk", "cream", "sorbet", "yogurt", "vegan", "alcohol", "pet", "highProtein", "sugarFree"]
        },
        items: {
          type: "array",
          minItems: 1,
          maxItems: 60,
          items: {
            type: "object",
            additionalProperties: false,
            required: ["ingredient_id", "grams"],
            properties: {
              ingredient_id: { type: "string" },
              grams: { type: "number", exclusiveMinimum: 0, maximum: 100000 }
            }
          }
        }
      }
    }
  }
];

TOOL DISPATCHER

在你的後端執行模型的 tool call

DISPATCHER.MJS
import crypto from "node:crypto";
import { gelatoLab } from "./client.mjs";

export async function runGelatoLabTool(name, input) {
  if (name === "gelatolab_search_ingredients") {
    const query = new URLSearchParams({
      q: input.query,
      limit: String(input.limit || 5),
    });
    return gelatoLab(`/ingredients/search?${query}`);
  }

  if (name === "gelatolab_balance_recipe") {
    return gelatoLab("/recipes/balance", {
      method: "POST",
      headers: { "Idempotency-Key": crypto.randomUUID() },
      body: JSON.stringify(input),
    });
  }

  throw new Error(`Unknown tool: ${name}`);
}
VIUSAGE & BILLING

額度與限制

MONTHLY INCLUDED100units / API account
SEARCH0unit / request
BALANCE1unit / success
RATE LIMIT60requests / minute / key

只有成功完成的 recipes/balance 扣 1 unit。計算失敗會退回預留額度;同一個 Idempotency-Key 與相同內容的重送不會重複扣點。每月 included 額度先使用,再扣 prepaid units。

STARTER

1,000 units

NT$490

NT$0.49 / unit

SCALE

20,000 units

NT$5,990

NT$0.2995 / unit

LLM 模型 token 費用由你的模型供應商另行計收,不包含在 GELATOlab units 內。

VIIERRORS

錯誤處理

錯誤回應都是 JSON,包含穩定的 error code、可讀訊息與 request_id。記錄 request_id,但不要把 API Key 寫進 log。

HTTP常見 error code處理方式
400invalid_query / invalid_items

修正輸入格式、recipe_type 或 Idempotency-Key。

401invalid_api_key

確認 Bearer header、Key 是否完整,或重新建立 Key。

402insufficient_quota

前往開發者中心購買 units,再重送原請求。

403business_required / insufficient_scope

確認 BUSINESS 權益與 Key scopes。

409idempotency_conflict / request_in_progress

相同操作沿用原 Key;不同內容產生新 Key。短暫等待後可重試。

422ingredient_not_found

重新呼叫搜尋端點取得有效 ID。

429rate_limit_exceeded

依 Retry-After header 指示延後,使用 exponential backoff。

5xxinternal_error

保留 request_id,延遲後重試;不要無限重送。

ERROR SHAPE
{
  "error": "ingredient_not_found",
  "message": "找不到官方食材 ID",
  "request_id": "d0f7...",
  "details": {
    "index": 2,
    "ingredient_id": "unknown-id"
  }
}
VIIIGO LIVE

正式上線清單

READY TO FORMULATE

先建立一組 TEST Key,完成第一支配方。

開啟開發者中心