Anthropic Messages
Drugi endpoint czatu, POST /v1/messages, odwzorowuje API Messages firmy Anthropic. Sięgnij po niego, jeśli twoja aplikacja jest już napisana na SDK Anthropic albo korzystasz z narzędzia, które wysyła zapytania w tym formacie - na przykład Claude Code. Działają tu wyłącznie modele z rodziny Claude. Wszystkie pozostałe modele czatu obsługuje /v1/chat/completions.
Obsługiwane modele
| Id | Stawka |
|---|---|
claude-opus-5.5 | 20,53 zł / 102,64 zł za 1 mln tokenów |
claude-sonnet-5 | 17,60 zł / 87,98 zł za 1 mln tokenów |
claude-fable-5.1 | 51,32 zł / 256,61 zł za 1 mln tokenów |
Jeśli podasz id modelu, który nie jest Claude'em, serwer zwróci błąd.
Nagłówki i ciało
POST https://kadraris.com/v1/messages
x-api-key: sk-kd-...
anthropic-version: 2023-06-01
Content-Type: application/jsonBez anthropic-version: 2023-06-01 zapytanie nie przejdzie, ale oficjalne SDK dokładają ten nagłówek automatycznie. Klucz wysyłasz w x-api-key albo w Authorization: Bearer - oba warianty opisuje Uwierzytelnianie.
| Pole | Typ | Obowiązkowe | Znaczenie |
|---|---|---|---|
model | string | tak | Id modelu Claude |
max_tokens | integer | tak | Najwięcej tokenów, ile może mieć odpowiedź |
messages | array | tak | Tury user i assistant na zmianę, w formacie Anthropic |
system | string albo array | nie | Instrukcja systemowa |
stream | boolean | nie | Wartość true przełącza na zdarzenia SSE w stylu Anthropic |
temperature | number | nie | Temperatura losowania |
tools | array | nie | Narzędzia opisane po anthropicowemu |
Pierwsze zapytanie
curl https://kadraris.com/v1/messages \
-H "x-api-key: $KADRARIS_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-opus-5.5",
"max_tokens": 1024,
"system": "Sprawdzasz kod krótko i rzeczowo.",
"messages": [{"role": "user",
"content": "Co tu nie gra: def area(w, h): return w + h"}]
}'# pip install anthropic
import os
from anthropic import Anthropic
client = Anthropic(
base_url="https://kadraris.com",
api_key=os.environ["KADRARIS_API_KEY"],
)
msg = client.messages.create(
model="claude-opus-5.5",
max_tokens=1024,
system="Sprawdzasz kod krótko i rzeczowo.",
messages=[{"role": "user",
"content": "Co tu nie gra: def area(w, h): return w + h"}],
)
print(msg.content[0].text)
print(msg.usage)// npm install @anthropic-ai/sdk
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({
baseURL: "https://kadraris.com",
apiKey: process.env.KADRARIS_API_KEY,
});
const msg = await client.messages.create({
model: "claude-opus-5.5",
max_tokens: 1024,
system: "Sprawdzasz kod krótko i rzeczowo.",
messages: [
{ role: "user",
content: "Co tu nie gra: def area(w, h): return w + h" },
],
});
console.log(msg.content[0].text);Uwaga na adres w SDK Anthropic: wpisujesz samo https://kadraris.com, bez końcówki /v1. Ścieżkę /v1/messages biblioteka dodaje sama, więc podwójne /v1 skończyłoby się błędem.
Co wraca
{
"id": "msg_...",
"type": "message",
"role": "assistant",
"model": "claude-opus-5.5",
"content": [{ "type": "text",
"text": "Funkcja dodaje boki zamiast je mnożyć..." }],
"stop_reason": "end_turn",
"usage": { "input_tokens": 31, "output_tokens": 57 }
}Rozliczenie opiera się na usage: osobno tokeny wejścia, osobno wyjścia, każde po stawce modelu.
Strumień zdarzeń
Gdy ustawisz stream: true, dostaniesz sekwencję zdarzeń w formacie Anthropic, m.in. message_start, content_block_delta i message_stop.
curl -N https://kadraris.com/v1/messages \
-H "x-api-key: $KADRARIS_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{"model": "claude-sonnet-5", "max_tokens": 512,
"stream": true,
"messages": [{"role": "user",
"content": "Czym różni się kadr od ujęcia?"}]}'with client.messages.stream(
model="claude-sonnet-5",
max_tokens=512,
messages=[{"role": "user",
"content": "Czym różni się kadr od ujęcia?"}],
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)const stream = client.messages.stream({
model: "claude-sonnet-5",
max_tokens: 512,
messages: [
{ role: "user", content: "Czym różni się kadr od ujęcia?" },
],
});
stream.on("text", (text) => process.stdout.write(text));
await stream.finalMessage();Narzędzia w formacie Anthropic
Każde narzędzie opisujesz polami name, description i input_schema. Gdy model postanowi go użyć, w odpowiedzi pojawi się blok tool_use. Ty uruchamiasz funkcję i w kolejnej turze użytkownika odsyłasz blok tool_result.
tools = [{
"name": "get_render_status",
"description": "Podaje stan renderu filmu po id",
"input_schema": {
"type": "object",
"properties": {"render_id": {"type": "string"}},
"required": ["render_id"],
},
}]
messages = [{"role": "user",
"content": "Czy render R-207 jest gotowy?"}]
first = client.messages.create(
model="claude-sonnet-5", max_tokens=1024,
tools=tools, messages=messages)
if first.stop_reason == "tool_use":
call = next(b for b in first.content if b.type == "tool_use")
# tu odpytujesz własny system
result = {"render_id": call.input["render_id"],
"status": "gotowy"}
messages += [
{"role": "assistant", "content": first.content},
{"role": "user", "content": [{
"type": "tool_result",
"tool_use_id": call.id,
"content": str(result)}]},
]
final = client.messages.create(
model="claude-sonnet-5", max_tokens=1024,
tools=tools, messages=messages)
print(final.content[0].text)Błędy na tym endpoincie
Odpowiedzi z błędem mają kształt znany z API Anthropic, więc SDK zgłasza swoje typowe wyjątki:
{ "type": "error", "error": { "type": "authentication_error", "message": "Invalid API key." } }Kody HTTP nie różnią się od reszty API. Jeden klucz może domyślnie wysłać 600 zapytań na minutę. Całość opisuje strona Błędy.
Messages czy chat completions
| Twoje narzędzie | Właściwy endpoint |
|---|---|
| SDK Anthropic, Claude Code | /v1/messages |
| SDK OpenAI, Cursor, Cline, Continue, n8n, Make | /v1/chat/completions |
| Claude wywoływany przez SDK OpenAI | /v1/chat/completions z model: "claude-..." |























