Интеграции и SDK
Любой клиент с настраиваемым base URL работает с TokenDock. Меняются две настройки — адрес и ключ.
Что работает без изменений
Формат запросов и ответов совпадает с OpenAI, поэтому SDK, фреймворки и готовые клиенты не требуют патчей. В таблице — точки, куда подставляются адрес и ключ.
| Клиент | Что настроить | Примечание |
|---|---|---|
| openai-python | base_url, api_key | Клиент OpenAI() принимает адрес при создании — остальной код не меняется. |
| openai-node | baseURL, apiKey | То же самое в конструкторе new OpenAI(). Работает и в Node.js, и в Bun. |
| LangChain | base_url, api_key | Класс ChatOpenAI в Python и JS. Цепочки, агенты и tools работают как есть. |
| LlamaIndex | api_base, api_key | Модели вне каталога OpenAI подключаются через OpenAILike с is_chat_model. |
| Vercel AI SDK | baseURL, apiKey | Провайдер createOpenAI. streamText и generateText — без изменений. |
| Cursor | Override OpenAI Base URL, API Key | Settings → Models. Модель добавляется вручную по полному id. |
| Continue | apiBase, apiKey | В config.json указывается provider: openai и полный id модели. |
| Open WebUI | OPENAI_API_BASE_URL, OPENAI_API_KEY | Переменные окружения контейнера. Список моделей подтягивается из GET /models. |
Значение base URL везде одно — https://api.tokendock.cloud/v1. Ключ читается из переменной окружения
TOKENDOCK_API_KEY: так его не видно в истории команд и в репозитории.
Официальные SDK OpenAI
Библиотеки openai для Python и Node.js принимают адрес при создании клиента. Дальше всё
как обычно: chat completions, streaming, tools, эмбеддинги.
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.tokendock.cloud/v1",
api_key=os.environ["TOKENDOCK_API_KEY"],
)
response = client.chat.completions.create(
model="anthropic/claude-4.5-sonnet",
messages=[
{"role": "system", "content": "Отвечай коротко, без вступлений."},
{"role": "user", "content": "Чем отличается индекс BRIN от btree?"},
],
)
print(response.choices[0].message.content) import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.tokendock.cloud/v1",
apiKey: process.env.TOKENDOCK_API_KEY,
});
const response = await client.chat.completions.create({
model: "openai/gpt-4.1-mini",
messages: [
{ role: "user", content: "Собери регулярку для российского ИНН." },
],
temperature: 0.2,
});
console.log(response.choices[0].message.content); Фреймворки
LangChain и LlamaIndex используют тот же OpenAI-клиент под капотом — достаточно передать base_url.
В LlamaIndex для моделей вне каталога OpenAI берите класс OpenAILike и укажите
is_chat_model=True, иначе библиотека попытается угадать формат по имени модели.
import os
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="deepseek/deepseek-v4",
base_url="https://api.tokendock.cloud/v1",
api_key=os.environ["TOKENDOCK_API_KEY"],
temperature=0.2,
)
answer = llm.invoke("Составь SQL: топ-10 клиентов по выручке за квартал.")
print(answer.content)
Vercel AI SDK подключается через провайдер createOpenAI. Потоковая выдача идёт по тому же
SSE, что описан в разделе streaming.
import { createOpenAI } from "@ai-sdk/openai";
import { streamText } from "ai";
const tokendock = createOpenAI({
baseURL: "https://api.tokendock.cloud/v1",
apiKey: process.env.TOKENDOCK_API_KEY,
});
const result = streamText({
model: tokendock("openai/gpt-4.1-mini"),
prompt: "Опиши схему таблицы orders в двух предложениях.",
});
for await (const part of result.textStream) {
process.stdout.write(part);
} IDE и готовые клиенты
Continue настраивается файлом конфигурации. Указывайте provider: "openai" и полный id
модели из каталога, вместе с вендором.
{
"models": [
{
"title": "TokenDock — Claude 4.5 Sonnet",
"provider": "openai",
"model": "anthropic/claude-4.5-sonnet",
"apiBase": "https://api.tokendock.cloud/v1",
"apiKey": "sk-td-4f9c1a2e8b7d3056a1c9e4f2b8d70a63"
},
{
"title": "TokenDock — Qwen3 Coder 480B",
"provider": "openai",
"model": "qwen/qwen3-coder-480b",
"apiBase": "https://api.tokendock.cloud/v1",
"apiKey": "sk-td-4f9c1a2e8b7d3056a1c9e4f2b8d70a63"
}
]
} В Cursor те же значения задаются в интерфейсе.
- Где
- Settings → Models
- OpenAI API Key
- sk-td-…
- Override OpenAI Base URL
- https://api.tokendock.cloud/v1
- Модель
- Добавьте вручную полный id, например
anthropic/claude-4.5-sonnet
Open WebUI поднимается в контейнере: адрес и ключ передаются переменными окружения, список моделей клиент
забирает сам через GET /models.
docker run -d -p 3000:8080 \
-e OPENAI_API_BASE_URL="https://api.tokendock.cloud/v1" \
-e OPENAI_API_KEY="$TOKENDOCK_API_KEY" \
-v open-webui:/app/backend/data \
--name open-webui ghcr.io/open-webui/open-webui:main Общее правило
Если клиент умеет менять base URL — он работает. Проверять совместимость заранее не нужно: подставьте адрес, ключ и полный id модели, и запрос уйдёт в тот же обработчик, что и curl из быстрого старта.
- Работает —
/chat/completionsс tools, vision и streaming,/embeddings,/models. - Не работает — вендорские эндпоинты вне этого набора: Assistants, Threads, Batch, Files, Fine-tuning, Realtime, генерация изображений и звука.
- Требует внимания — клиенты с зашитым списком моделей: добавьте нужный id вручную, автоподстановка «gpt-4o» без вендора вернёт 404.
Прокси и корпоративная сеть
TokenDock живёт на одном домене: и API, и консоль. Открывать пул адресов вендоров не нужно — исходящие соединения к OpenAI, Anthropic и остальным устанавливает сам шлюз.
- Домен
- api.tokendock.cloud
- Протокол и порт
- HTTPS · 443
- TLS
- 1.2 и выше, обязателен SNI. Запросы по HTTP отклоняются.
- Что открыть
- Исходящий HTTPS к одному хосту. Вебсокеты и дополнительные порты не используются.
- Буферизация. Прокси не должен копить ответ целиком — иначе streaming превратится в один пакет в конце. В nginx это
proxy_buffering off. - MITM-прокси. Если сеть подменяет сертификат, добавьте корневой сертификат компании в доверенные — иначе SDK упадёт на проверке TLS.
- Таймауты. Длинные ответы генерируются десятками секунд. Ставьте таймаут чтения от 120 секунд, для потока — по паузе между чанками.