Регистрация

Интеграции и 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, эмбеддинги.

python · openai
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)
javascript · openai
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, иначе библиотека попытается угадать формат по имени модели.

python · langchain
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.

typescript · vercel ai sdk
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 модели из каталога, вместе с вендором.

json · continue config.json
{
  "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.

bash · open webui
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 секунд, для потока — по паузе между чанками.
Про потоковую выдачу