| Method | Path | Auth | Purpose |
|---|
# every route except GET /v1/health
export PALETTE_API_KEY=pk_...
curl https://llm.pltt.dev/v1/models \
-H "Authorization: Bearer $PALETTE_API_KEY"{"detail": "Authorization: Bearer <palette key> 헤더가 필요합니다."}{"detail": "유효하지 않거나 폐기된 키입니다."}KMMLU 0.723 · n=300
KMMLU 0.736 · n=300
alias: palette-llm-fast
KMMLU 0.640 · n=300 · vision 6.4 s
| Model | CLIcK n=300 | KMMLU n=300 | Vision | Context | Where | Status |
|---|---|---|---|---|---|---|
| palette-llm-ko | 0.869 | 0.640 | Yes | 256K | Palette GPU, Palette inference server | served |
| palette-llm | 0.850 | 0.723 | No | 1M | Palette managed endpoint | served |
| palette-llm-max | 0.802 | 0.736 | Yes | 1M | Palette managed endpoint | served |
| palette-vlm | not run | not run | Yes | 1M | Palette managed endpoint | served |
| palette-island | tool calls | FunctionChat 82.2 n=500 | No | 4K | Palette CPU, warm | served |
| GPT-6 Astra | 0.965 | 0.853 | - | - | not served here | context |
| Gemini 3.1 Pro | 0.957 | 0.819 | - | - | not served here | context |
| Claude Fable 5.1 | 0.930 | 0.803 | - | - | not served here | context |
| Effort | Shared seats (native thinking) | palette-llm-ko (Korean protocol) | Default max_tokens |
|---|---|---|---|
| low | 1024 | ||
| medium (default) | 2048 | ||
| high | 8192 | ||
| xhigh | 16384 (draft) + 4096 (review) |
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)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)| Status | When | detail |
|---|
| Limit | Value |
|---|---|
| Concurrency, shared seats | |
| Concurrency, gateway | |
| Concurrency, palette-llm-ko | |
| Context | |
| Images per request | |
| Request timeout | |
| Default max_tokens | |
| Key cache |
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 -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]"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)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)import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://llm.pltt.dev/v1",
apiKey: process.env.PALETTE_API_KEY,
});
const r = await client.chat.completions.create({
model: "palette-llm",
messages: [{ role: "user", content: "공급사 A(단가 낮음, 납기 2주 지연)와 B(단가 8% 높음, 납기 준수) 중 하나를 고르고 이유를 두 문장으로 답하세요." }],
max_tokens: 4000,
reasoning_effort: "high",
});
console.log("reasoning:", r.choices[0].message.reasoning_content);
console.log("answer:", r.choices[0].message.content);
// Streaming
const stream = await client.chat.completions.create({
model: "palette-llm",
messages: [{ role: "user", content: "부산에서 서울까지 KTX로 얼마나 걸리나요? 한 문장으로." }],
stream: true,
reasoning_effort: "low",
});
for await (const chunk of stream) {
const d = chunk.choices[0]?.delta ?? {};
if (d.reasoning_content) process.stdout.write(d.reasoning_content);
if (d.content) process.stdout.write(d.content);
}import os
from langchain.chat_models import init_chat_model
llm = init_chat_model(
"palette-llm",
model_provider="openai",
base_url="https://llm.pltt.dev/v1",
api_key=os.environ["PALETTE_API_KEY"],
max_tokens=4000,
extra_body={"reasoning_effort": "high"},
)
msg = llm.invoke("공급사 A(단가 낮음, 납기 2주 지연)와 B(단가 8% 높음, 납기 준수) 중 하나를 고르고 이유를 두 문장으로 답하세요.")
print("answer:", msg.content)
print("reasoning:", msg.additional_kwargs.get("reasoning_content"))