Palette · K-LLM · Developer docs

One Korean endpoint. Four seats. OpenAI shape.

https://llm.pltt.dev/v1 speaks the OpenAI chat-completions shape and adds one field, reasoning_effort. Pick a seat, send Korean, read the answer and its reasoning as separate fields.

Measured againstGPT-6 AstraGemini 3.1 ProClaude Fable 5.1
Quickstart

Your first Korean completion in 30 seconds.

Export a key, send one curl. Same request shape as OpenAI chat completions, plus reasoning_effort.

curl · non-stream
# 1. your key (minted by the operator)
export PALETTE_API_KEY=pk_...

# 2. one request, low effort, Korean prompt
curl https://llm.pltt.dev/v1/chat/completions \
  -H "Authorization: Bearer $PALETTE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "palette-llm",
    "reasoning_effort": "low",
    "messages": [
      {"role": "user", "content": "공급사 A(단가 낮음, 납기 2주 지연)와 B(단가 8% 높음, 납기 준수) 중 하나를 고르고 이유를 두 문장으로 답하세요."}
    ]
  }'
response · 200 · shape exact, ids and counts illustrative
{
  "id": "chatcmpl-4f1d0b6c9a2e",
  "object": "chat.completion",
  "created": 1790035200,
  "model": "palette-llm",
  "reasoning_effort": "low",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "reasoning_content": "A는 단가가 낮지만 납기가 2주 늦어 생산 일정에 영향을 준다. B는 단가가 8% 높지만 납기를 지킨다.",
        "content": "공급사 B를 선택합니다. 8%의 단가 차이보다 2주 납기 지연으로 인한 생산 중단 비용이 더 크기 때문입니다."
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {"prompt_tokens": 96, "completion_tokens": 88, "total_tokens": 184}
}

Routes that exist

  • 01GET /v1/health No key. Probes each seat's upstream and returns {"ok": bool, "seats": {...}}.
  • 02GET /v1/models Key required. Lists the seats with backing, modalities and the accepted reasoning_effort values.
  • 03POST /v1/chat/completions Key required. OpenAI chat shape plus reasoning_effort; stream: true for server-sent events.
  • 04POST /v1/decision/systemone Key required. Palette Decision: typed questions (choice · noul · score) over one state, calibrated probabilities back. GET /v1/decision/models lists the decision models.
  • 05POST /v1/ocr Key required. Palette Light OCR: Korean line OCR on one image (multipart file, JSON image_b64, or a raw image body). GET /v1/ocr/models.
  • 06Nothing else. No /v1/completions, /v1/embeddings or /v1/responses. The gateway's own /docs and /redoc are disabled.
Authentication

One header, on every route except health.

Send Authorization: Bearer <palette key> on GET /v1/models and POST /v1/chat/completions. Keys are minted by the operator and stored server-side only as a SHA-256 hash.

  • 01Key format. pk_ followed by 48 URL-safe characters.
  • 02No key or bad key. 401 with a JSON body {"detail": "..."}. The message is Korean; see Errors.
  • 03Revocation. A revoked key can keep working for up to 60 seconds (per-container key cache TTL).
  • 04Quotas. None enforced per key today. The gateway counts requests per key name, seat and day for reporting only.
401 · bodies
# no Authorization header
{"detail": "Authorization: Bearer <palette key> 헤더가 필요합니다."}

# unknown or revoked key
{"detail": "유효하지 않거나 폐기된 키입니다."}
Seats

Five seats behind one model field.

Copy seat ids exactly. An unknown model silently falls back to palette-llm; there is no 404.

SeatBackingRuns onVisionContextKorean (n=300)Role
palette-llmPalette LLM
Palette LLM
Palette managed endpointtext only1MCLIcK 0.850 · KMMLU 0.723Default decision-maker
palette-llm-maxPalette LLM Max
Palette LLM Max
Palette managed endpointyes1MCLIcK 0.802 · KMMLU 0.736Hardest decisions
palette-vlmPalette Vision
Palette Vision
Palette managed endpointyes1Mnot runFast + vision · alias palette-llm-fast
palette-llm-koPalette LLM Korean
Palette LLM Korean
Palette GPU · Palette inference server · Palette GPUyes · up to 6 images256KCLIcK 0.869 · KMMLU 0.640Our weights · Korean-tuning target
palette-islandPalette Island-X
Palette Island-X
Palette CPU · warmno4KFunctionChat 82.2 tool calls, n=500Korean tool calling · intent routing

Korean scores are our own 300-item CLIcK and KMMLU runs, 2026-09-23. See Benchmarks for the frontier rows on the same items.

When to use which

palette-llm

Default. Korean business decisions, text only, 1M context. Low effort answered a Korean supplier decision in 3.2 s.

palette-llm-max

For the hardest decisions. Highest KMMLU of the LLM seats (0.736, n=300). Vision, 1M context.

palette-vlm

Fast and sees. Read a Korean invoice image and verified its total in 4.0 s. palette-llm-fast is an alias.

palette-llm-ko

Our weights on our GPU. Highest CLIcK of the LLM seats (0.869, n=300). Up to 6 images, 256K context, Korean reasoning protocol. Vision in 6.4 s.

palette-island

Our 0.8B tool-calling model. Send OpenAI tools and get tool_calls back: 82.2 on FunctionChat SingleCall (n=500; best Korean 2B model 73.2). Not a chat model, 4K context, CPU, 3.6 s median per call. Relative dates (내일, 모레) are not resolved reliably; compute them in your code.

Resolution rules

  • 01model omitted → palette-llm.
  • 02palette-llm-fast → palette-vlm.
  • 03Any other unknown string → palette-llm, silently. There is no 404 for unknown models.
  • 04Rewriting. The gateway sends the backing id upstream and writes the seat id back into non-stream responses. Stream chunks from the shared seats keep the backing id.
GET /v1/models · response · 200
{
  "object": "list",
  "data": [
    {"id": "palette-llm",     "object": "model", "owned_by": "palette", "backing": "Palette LLM",       "configured": true, "modalities": ["text"],          "reasoning_effort": ["low", "medium", "high", "xhigh"]},
    {"id": "palette-llm-max", "object": "model", "owned_by": "palette", "backing": "Palette LLM Max",    "configured": true, "modalities": ["text", "image"], "reasoning_effort": ["low", "medium", "high", "xhigh"]},
    {"id": "palette-vlm",     "object": "model", "owned_by": "palette", "backing": "Palette Vision", "configured": true, "modalities": ["text", "image"], "reasoning_effort": ["low", "medium", "high", "xhigh"]},
    {"id": "palette-llm-ko",  "object": "model", "owned_by": "palette", "backing": "palette-llm",           "configured": true, "modalities": ["text", "image"], "reasoning_effort": ["low", "medium", "high", "xhigh"]},
    {"id": "palette-island",  "object": "model", "owned_by": "palette", "tier": "tool-calling-small", "configured": true, "modalities": ["text"], "requires": "tools"},
    {"id": "palette-llm-fast", "object": "model", "owned_by": "palette", "alias_of": "palette-vlm"},
    {"id": "palette-decision", "object": "model", "owned_by": "palette", "tier": "decision", "endpoint": "/v1/decision/systemone", "configured": true},
    {"id": "palette-light-ocr", "object": "model", "owned_by": "palette", "tier": "ocr", "endpoint": "/v1/ocr", "configured": true}
  ]
}

backing is the id the gateway sends upstream; for palette-llm-ko it is the Palette inference server served-model name (palette-llm by default), not the Hugging Face id. configured means an upstream URL is set. Alias entries carry alias_of and no other capability fields.

Reasoning effort

One dial, four stops.

reasoning_effort: low, medium, high or xhigh. Also accepted as "reasoning": {"effort": "..."}, which wins when both are present. Default medium. Reasoning comes back in message.reasoning_content (non-stream) and delta.reasoning_content (stream), always separate from content.

EffortShared seats (palette-llm, palette-llm-max, palette-vlm)palette-llm-koDefault max_tokens
lownative lowSystem instruction: answer directly, no visible thinking.1024
mediumnative low. The upstreams advertise only low, high and max; native medium produced 5,101 chars of thinking in 9.5 s vs 160 chars in 3.2 s at native low, so fast is the default.System instruction: 2 to 3 sentences of rationale, then the answer. The rationale stays in content.2048
highnative high[추론] / [답변] marker protocol. Text before [답변] goes to reasoning_content, text after it to content.8192
xhighnative max plus a self-review pass (second call, max_tokens 4096).Marker protocol draft plus a self-review pass (second call, max_tokens 4096).16384 (draft)
  • 01Set max_tokens ≥ 4000 for high and xhigh when you set it yourself. A small budget can be consumed by thinking and leave content empty.
  • 02Normalization. Case-insensitive; - and _ are stripped. minimal → low. extra-high, extra_high, extrahigh, max → xhigh. Anything else → medium, silently. Both fields are consumed by the gateway and never forwarded verbatim.
  • 03Shared seats retry. If the upstream answers 400 to a request carrying reasoning_effort, the gateway retries once without it, so a model without the switch still answers.
  • 04palette-llm-ko system message. The gateway appends one Korean system message (the effort instruction) at the end of messages on every request.
  • 05xhigh, non-stream. content is the review pass's final answer (text after [답변], or the whole review text if the marker is absent). reasoning_content is the draft's reasoning followed by [초안 답] <draft answer> and [검토] <review>.
  • 06high on palette-llm-ko without [답변]. Non-stream returns everything in content with reasoning_content "". Stream returns everything as delta.reasoning_content with no content deltas. Render reasoning_content when content is empty.
request · high · max_tokens set
# POST /v1/chat/completions
{
  "model": "palette-llm-ko",
  "reasoning_effort": "high",
  "max_tokens": 4000,
  "messages": [
    {"role": "user", "content": "공급사 A(단가 낮음, 납기 2주 지연)와 B(단가 8% 높음, 납기 준수) 중 하나를 고르고 이유를 두 문장으로 답하세요."}
  ]
}

# response excerpt: reasoning and answer are separate fields (values illustrative)
"message": {
  "role": "assistant",
  "reasoning_content": "공급사 A는 단가가 낮지만 납기가 2주 늦다. B는 8% 비싸지만 납기를 지킨다.",
  "content": "공급사 B를 선택합니다. 납기 지연 비용이 단가 차이보다 큽니다."
}
Streaming

Server-sent events. Reasoning and answer on separate deltas.

stream: true returns Content-Type: text/event-stream. Each event is one line data: {json} followed by a blank line; the stream ends with data: [DONE]. Reasoning arrives in choices[0].delta.reasoning_content, the answer in choices[0].delta.content.

curl · stream
curl -N https://llm.pltt.dev/v1/chat/completions \
  -H "Authorization: Bearer $PALETTE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "palette-llm",
    "reasoning_effort": "high",
    "max_tokens": 4000,
    "stream": true,
    "messages": [
      {"role": "user", "content": "공급사 A(단가 낮음, 납기 2주 지연)와 B(단가 8% 높음, 납기 준수) 중 하나를 고르고 이유를 두 문장으로 답하세요."}
    ]
  }'
events · palette-llm-ko · high · shape exact, values illustrative
data: {"id":"chatcmpl-9b7e2c1a","object":"chat.completion.chunk","created":1790035201,"model":"palette-llm-ko","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"공급사 A는 단가가 낮지만 "},"finish_reason":null}]}

data: {"id":"chatcmpl-9b7e2c1a","object":"chat.completion.chunk","created":1790035201,"model":"palette-llm-ko","choices":[{"index":0,"delta":{"reasoning_content":"납기가 2주 늦다. B는 8% 비싸지만 납기를 지킨다."},"finish_reason":null}]}

data: {"id":"chatcmpl-9b7e2c1a","object":"chat.completion.chunk","created":1790035201,"model":"palette-llm-ko","choices":[{"index":0,"delta":{"content":"공급사 B를 선택합니다."},"finish_reason":null}]}

data: {"id":"chatcmpl-9b7e2c1a","object":"chat.completion.chunk","created":1790035201,"model":"palette-llm-ko","choices":[{"index":0,"delta":{"content":" 납기 지연 비용이 단가 차이보다 큽니다."},"finish_reason":null}]}

data: {"id":"chatcmpl-9b7e2c1a","object":"chat.completion.chunk","created":1790035201,"model":"palette-llm-ko","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}

data: [DONE]
  • 01Shared seats forward the upstream bytes unchanged (low, medium, high, and the review pass of xhigh). In those chunks model is the backing id, for example Palette LLM, and there is no top-level reasoning_effort. Do not key on model in chunks.
  • 02palette-llm-ko, high and xhigh. The gateway re-emits chunks with model set to the seat id and routes text around the [답변] marker; it holds back a short tail so a marker split across chunks is still caught. Synthesized chunks (the final flush before [DONE], the xhigh head chunk) may omit created or usage. Always read choices[0].delta.
  • 03xhigh stream. The draft runs non-streamed first (added latency), then the review pass is streamed. On the shared seats the review pass is forwarded raw, so content may begin with the [답변] marker line and the draft's reasoning is not in the stream. On palette-llm-ko the first chunk carries the draft reasoning plus [초안 답] …\n\n[검토]\n in delta.reasoning_content, then the review pass is split-streamed.
  • 04Guard for an empty choices array. Some upstreams send a final chunk with empty choices that carries only usage.
Vision

Send an image as a content part.

On vision seats, content is an array of parts: {"type":"text","text":"..."} and {"type":"image_url","image_url":{"url":"data:image/png;base64,..."}}. An https:// URL works in place of the data URI.

palette-vlm · alias palette-llm-fast palette-llm-max palette-llm-ko · up to 6 images palette-llm · text only
4.0s
palette-vlm read a Korean invoice image and verified its total.
6.4s
palette-llm-ko, one vision request. Measured 2026-09-23.
  • 01Vision seats. palette-vlm (alias palette-llm-fast), palette-llm-max, palette-llm-ko.
  • 02Images per request. palette-llm-ko: up to 6. Shared seats: not published, upstream-dependent.
  • 03palette-llm is text only. Pick palette-vlm, palette-llm-max or palette-llm-ko for images.
python · openai · image_url
import base64
import os
from openai import OpenAI

client = OpenAI(base_url="https://llm.pltt.dev/v1", api_key=os.environ["PALETTE_API_KEY"])

with open("invoice.png", "rb") as f:
    b64 = base64.b64encode(f.read()).decode()

r = client.chat.completions.create(
    model="palette-vlm",
    messages=[{
        "role": "user",
        "content": [
            {"type": "text", "text": "이 세금계산서의 합계 금액을 읽고, 품목 금액의 합과 일치하는지 확인해 주세요."},
            {"type": "image_url", "image_url": {"url": f"data:image/png;base64,{b64}"}},
        ],
    }],
    extra_body={"reasoning_effort": "low"},
)
print(r.choices[0].message.content)
Decision & OCR

Two more Palette services behind the same key.

Same base URL, same Authorization header. Palette Decision answers typed questions about one piece of text with calibrated probabilities instead of prose. Palette Light OCR reads Korean text lines off an image in about 1.6 s per A4 page.

  • 01Decision questions. choice: criteria is an object, option label → description (or null). noul: yes/no, criteria optional. score: criteria is an ordered list of levels, low to high; the answer is the expected level. Up to 32 questions per request, each scored independently; probabilities are normalised over the listed options.
  • 02Decision models. palette-decision-27b: K-DECIDE 800 items 0.944 (training-harness eval, 2026-10-15). palette-decision-latest: the served 7.3B, 0.873 on the same 800 (2026-10-14), faster. Omit model for the latter. Measured through the gateway: 27B two-question request 1.1 s.
  • 03OCR. Up to 20 MB, long side downscaled to 4000 px, EXIF rotation applied. lines come in reading order with a 4-point box and a confidence; text joins rows with newlines. Measured: 48 lines on an A4 test page in 1.6 s server-side; CER 0.08% on 600 held-out synthetic Korean lines. Real scans and photos are not yet measured.
curl · POST /v1/decision/systemone
curl https://llm.pltt.dev/v1/decision/systemone \
  -H "Authorization: Bearer $PALETTE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "palette-decision-27b",
    "state": "배송이 3일째 물류센터에 멈춰 있어요. 오늘 안에 출발 안 되면 취소하고 환불받을게요.",
    "questions": {
      "team":    {"type": "choice", "instructions": "이 문의를 처리할 팀은?",
                  "criteria": {"배송": "배송 지연·추적", "환불": "취소·환불 처리", "기타": "그 외"}},
      "cancel":  {"type": "noul",   "instructions": "고객이 취소 의사를 밝혔는가?"},
      "urgency": {"type": "score",  "instructions": "긴급도를 평가하라.",
                  "criteria": ["기한 없음", "며칠 내", "명확한 기한 있음", "오늘 안에 처리 필요"]}
    }
  }'
200 · application/json · shape exact, values from a 2026-10-20 run
{
  "model": "palette-decision-27b",
  "answers": {
    "team":    {"type": "choice", "choice": "배송", "probabilities": {"배송": 0.7213, "환불": 0.1609, "기타": 0.1177}, "confidence": 0.582},
    "cancel":  {"type": "noul",   "noul": 0.99,   "probabilities": {"true": 0.99, "false": 0.01}, "confidence": 0.98},
    "urgency": {"type": "score",  "score": 2.7737, "probabilities": {"0": 0.0185, "1": 0.0252, "2": 0.1204, "3": 0.8359}, "confidence": 0.7812,
                "legend": {"0": "기한 없음", "1": "며칠 내", "2": "명확한 기한 있음", "3": "오늘 안에 처리 필요"}}
  },
  "usage": {"input_tokens": 713, "shared_prefix_tokens": 342, "output_tokens": 3}
}
curl · POST /v1/ocr
curl https://llm.pltt.dev/v1/ocr \
  -H "Authorization: Bearer $PALETTE_API_KEY" \
  -F "file=@page.png"

# or JSON: -H "Content-Type: application/json" -d '{"image_b64": "<base64 or data URL>"}'
200 · application/json · shape exact, values from a 2026-10-20 run
{
  "model": "palette-light-ocr",
  "lang": "ko",
  "text": "AIO 세미나 소스팩: OCR 벤치마크\n본 문서는 2026년 10월 17일에 생성되었습니다. (1)\n컨트롤러 펌웨어 버전 3.2.1, 테스트 로그 #20251017-A (2)\n…",
  "lines": [
    {"text": "본 문서는 2026년 10월 17일에 생성되었습니다. (1)", "confidence": 0.98, "box": [[212, 388], [1664, 388], [1664, 446], [212, 446]]},
    {"text": "컨트롤러 펌웨어 버전 3.2.1, 테스트 로그 #20251017-A (2)", "confidence": 0.97, "box": [[212, 470], [1790, 470], [1790, 528], [212, 528]]}
  ],
  "width": 2480,
  "height": 3508,
  "ms": {"detect": 281, "recognise": 1116, "total": 1560}
}
SDKs

Any OpenAI-compatible client. Three shown.

Set base_url to https://llm.pltt.dev/v1 and pass the key. reasoning_effort travels as an extra body field. All examples assume export PALETTE_API_KEY=pk_....

python · openai · non-stream
import os
from openai import OpenAI

client = OpenAI(base_url="https://llm.pltt.dev/v1", api_key=os.environ["PALETTE_API_KEY"])

r = client.chat.completions.create(
    model="palette-llm",
    messages=[{"role": "user", "content": "공급사 A(단가 낮음, 납기 2주 지연)와 B(단가 8% 높음, 납기 준수) 중 하나를 고르고 이유를 두 문장으로 답하세요."}],
    max_tokens=4000,
    extra_body={"reasoning_effort": "high"},
)
msg = r.choices[0].message
print("reasoning:", getattr(msg, "reasoning_content", None))
print("answer:", msg.content)
python · openai · stream
stream = client.chat.completions.create(
    model="palette-llm",
    messages=[{"role": "user", "content": "부산에서 서울까지 KTX로 얼마나 걸리나요? 한 문장으로."}],
    stream=True,
    extra_body={"reasoning_effort": "low"},
)
for chunk in stream:
    if not chunk.choices:
        continue
    d = chunk.choices[0].delta
    if getattr(d, "reasoning_content", None):
        print(d.reasoning_content, end="", flush=True)
    if d.content:
        print(d.content, end="", flush=True)

The SDK also accepts reasoning_effort="high" as a named argument; it produces the same JSON field. extra_body is shown because it passes "xhigh" without a type check.

Palette OS

Two variables point Palette OS at the gateway.

Palette OS talks to any OpenAI-compatible base URL. Set these two and pick seats by id.

.env
PALETTE_LLM_BASE_URL=https://llm.pltt.dev/v1
PALETTE_LLM_API_KEY=pk_...
Picker idBackingVisionContext
palette-llmPalette LLMtext only1M
palette-llm-maxPalette LLM Maxyes1M
palette-vlmPalette Visionyes1M
palette-llm-koPalette LLM Koreanyes · up to 6 images256K
palette-llm-fastalias of palette-vlmyes1M
  • 01The base URL includes /v1. https://llm.pltt.dev/v1, not the bare host.
  • 02Picker ids are seat ids. palette-llm, palette-llm-max, palette-vlm, palette-llm-ko. palette-llm-fast resolves to palette-vlm. Unknown ids silently become palette-llm, so copy them exactly.
  • 03Health first. GET /v1/health needs no key; ok is true only when every configured seat returns 200.
  • 04Reasoning stays separate. Read message.reasoning_content and delta.reasoning_content. The one exception is medium on palette-llm-ko, where the 2 to 3 sentence rationale is part of content.
Limits

Limits to know before you scale.

No per-key quota is enforced today. These are the concurrency, context, image and time ceilings as configured on 2026-09-23.

LimitValue
Concurrency, shared seats16 concurrent requests per shared model per workspace (Palette cloud).
Concurrency, gateway64 concurrent requests.
Concurrency, palette-llm-koPalette inference server --max-num-seqs 64 per container, up to 2 containers, always hot (min_containers=1).
Context1M tokens on palette-llm, palette-llm-max and palette-vlm; 256K on palette-llm-ko (Palette LLM Korean 4's documented ceiling, --max-model-len 262144).
Images per requestpalette-llm-ko: up to 6 (--limit-mm-per-prompt {"image": 6}). Shared seats: not published, upstream-dependent.
Request timeout900 s end to end at the gateway (30 s connect). Long xhigh runs count both passes against it.
Default max_tokensPer effort when omitted: 1024 / 2048 / 8192 / 16384. Review pass fixed at 4096.
Errors

Every error is a JSON detail string.

Gateway errors are FastAPI-shaped: {"detail": "<message>"}. Upstream failures pass through with the same status code.

StatusWhendetail
401No Authorization: Bearer headerAuthorization: Bearer <palette key> 헤더가 필요합니다.
401Unknown or revoked key유효하지 않거나 폐기된 키입니다.
503The seat has no upstream URL configuredseat has no upstream configured yet
503Operator misconfiguration: Palette cloud proxy token missing (shared seats)Palette cloud proxy token not configured
upstream 4xx / 5xxThe backing server rejected or failed the callSame status code; detail is the first 500 characters of the upstream body
403Cloudflare error code: 1010. Only Python's stock urllib User-Agent is blockedCloudflare HTML or text, not JSON
  • 01Cloudflare 1010. Only Python's stock urllib User-Agent is blocked. The OpenAI SDK, requests, httpx, curl and fetch all pass. The body is Cloudflare text, not JSON, so do not parse detail from a 403.
  • 02Silent, not errors. Unknown model → palette-llm. Unknown reasoning_effort → medium.
  • 03Empty content on high or xhigh. Usually a small max_tokens consumed by thinking. Set max_tokens ≥ 4000, and render reasoning_content when content is empty.
Benchmarks

Korean, measured on the same 300 items.

CLIcK and KMMLU, our 300-item runs, dated 2026-09-23. Bold rows are Palette seats. Frontier rows are on the same items, for context only.

3.2s
palette-llm, low effort, Korean supplier decision.
4.0s
palette-vlm, Korean invoice image, total verified.
6.4s
palette-llm-ko, one vision request.
ModelSeatCLIcK (n=300)KMMLU (n=300)Runs on
GPT-6 Astrafrontier · context only0.9650.853Vendor API
Gemini 3.1 Profrontier · context only0.9570.819Vendor API
Claude Fable 5.1frontier · context only0.9300.803Vendor API
Palette LLM Koreanpalette-llm-ko0.8690.640Palette GPU · Palette inference server · Palette GPU
Palette LLMpalette-llm0.8500.723Palette managed endpoint
Palette LLM Maxpalette-llm-max0.8020.736Palette managed endpoint

Higher is better. Scores are quoted exactly as measured, nothing rounded. palette-vlm (Palette Vision) was not run on these items. Latencies above are single measured runs from 2026-09-23, not averages.