Palette · API reference · 2026

One endpoint. OpenAI shape. Korean by default.

Works withopenai SDKcurlfetchLangChain
Overview

Seven routes. One key. Streams when you ask.

7
5
1M

Base URL

Authorization

Content types

Routes

MethodPathAuthPurpose
Authentication

Send the key on every call except health.

Header

Key format

Revocation

Quotas

curl
# every route except GET /v1/health
export PALETTE_API_KEY=pk_...

curl https://llm.pltt.dev/v1/models \
  -H "Authorization: Bearer $PALETTE_API_KEY"
401 · missing header
{"detail": "Authorization: Bearer <palette key> 헤더가 필요합니다."}
401 · unknown or revoked key
{"detail": "유효하지 않거나 폐기된 키입니다."}
Endpoints

Seven routes, documented from the code that serves them.

»openapi.json
Schemas

The objects, field by field.

Models

Five seats behind one model field.

Same 300 items, frontier for context

ModelCLIcK n=300KMMLU n=300VisionContextWhereStatus
palette-llm-ko0.8690.640Yes256KPalette GPU, Palette inference serverserved
palette-llm0.8500.723No1MPalette managed endpointserved
palette-llm-max0.8020.736Yes1MPalette managed endpointserved
palette-vlmnot runnot runYes1MPalette managed endpointserved
palette-islandtool callsFunctionChat 82.2 n=500No4KPalette CPU, warmserved
GPT-6 Astra0.9650.853--not served herecontext
Gemini 3.1 Pro0.9570.819--not served herecontext
Claude Fable 5.10.9300.803--not served herecontext

Reasoning effort

One switch, four levels, two implementations.

EffortShared seats (native thinking)palette-llm-ko (Korean protocol)Default max_tokens
low1024
medium (default)2048
high8192
xhigh16384 (draft) + 4096 (review)

Rules the gateway applies

  • 01
  • 02
  • 03
  • 04
  • 05
  • 06
Streaming

Server-sent events, OpenAI chunk shape.

  • 01
  • 02
  • 03
  • 04
python · consume a 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:          # final usage chunk may have empty 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)
Images

Send an image as a content part.

Shape

Per request

Measured

python · palette-vlm
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)
Errors

FastAPI-shaped bodies. Korean detail for auth.

StatusWhendetail

Limits

What the gateway enforces or inherits.

LimitValue
Concurrency, shared seats
Concurrency, gateway
Concurrency, palette-llm-ko
Context
Images per request
Request timeout
Default max_tokens
Key cache
Examples

Ready to run. Set PALETTE_API_KEY first.

curl · non-stream · low
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% 높음, 납기 준수) 중 하나를 고르고 이유를 두 문장으로 답하세요."}
    ]
  }'
curl · stream · high
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% 높음, 납기 준수) 중 하나를 고르고 이유를 두 문장으로 답하세요."}
    ]
  }'
# chunks arrive as "data: {...}"; reasoning in delta.reasoning_content, answer in delta.content, then "data: [DONE]"