Node.js
Справочник API
Официальные SDK openai и @anthropic-ai/sdk работают с Zukko без изменений кода — меняются только base URL и ключ. Примеры ниже — ES-модули (Node.js 18+, файл .mjs или "type": "module" в package.json).
| SDK | Base URL | Key |
|---|---|---|
OpenAI (openai) | https://api.zukko.pro/v1 | fetch_... |
Anthropic (@anthropic-ai/sdk) | https://api.zukko.pro | fetch_... |
Ключ удобно держать в переменной окружения:
bash
export ZUKKO_API_KEY="fetch_..."1OpenAI SDK
bash
npm install openaijs
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.zukko.pro/v1",
apiKey: process.env.ZUKKO_API_KEY,
});
const r = await client.chat.completions.create({
model: "gpt-5.6-sol",
messages: [{ role: "user", content: "Привет!" }],
});
console.log(r.choices[0].message.content);Потоковый ответ
js
const stream = await client.chat.completions.create({
model: "claude-sonnet-5",
messages: [{ role: "user", content: "Напиши хайку про код" }],
stream: true,
});
for await (const chunk of stream) {
if (chunk.choices.length > 0) {
process.stdout.write(chunk.choices[0].delta?.content ?? "");
} else if (chunk.usage) {
console.log("\nтокены:", chunk.usage.prompt_tokens, "вход,", chunk.usage.completion_tokens, "выход");
}
}Проверка chunk.choices.length обязательна: Zukko включает stream_options.include_usage, и последний фрагмент потока приходит с usage и пустым choices.
Стоимость запроса
js
const { data, response } = await client.chat.completions
.create({ model: "glm-5.3-flash", messages: [{ role: "user", content: "Привет!" }] })
.withResponse();
console.log(response.headers.get("x-zukko-cost-micros")); // микродоллары
console.log(data.choices[0].message.content);Заголовок есть только у обычных (не потоковых) ответов.
2Anthropic SDK
bash
npm install @anthropic-ai/sdkjs
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({
baseURL: "https://api.zukko.pro",
apiKey: process.env.ZUKKO_API_KEY,
});
const msg = await client.messages.create({
model: "claude-sonnet-5",
max_tokens: 1024,
messages: [{ role: "user", content: "Привет!" }],
});
console.log(msg.content[0].text);Base URL — без /v1: SDK сам добавит /v1/messages.
Потоковый ответ
js
const stream = client.messages.stream({
model: "claude-sonnet-5",
max_tokens: 1024,
messages: [{ role: "user", content: "Напиши хайку про код" }],
});
stream.on("text", (text) => process.stdout.write(text));
const final = await stream.finalMessage();
console.log("\nтокены на выходе:", final.usage.output_tokens);3Если что-то не так
Коды ошибок и что с ними делать — в разделе Ошибки API. Формат потоков — в разделе Стриминг.