OpenAI SDK
Chat Completions, Embeddings и Models через OpenAI-совместимый API.
Адрес шлюза вашего региона: определяем…
Подключение
Укажите в SDK base_url = адрес шлюза + /v1 и API-ключ Айтечества вместо ключа провайдера. Шлюз сам выберет провайдера по алиасу модели и подставит его учётные данные.
Python
Работают обычные и потоковые ответы, инструменты (function calling) и response_format. Данные восстанавливаются в ответе, включая аргументы вызова инструментов.
import os
from openai import OpenAI
client = OpenAI(
base_url="https://<gateway>/v1",
api_key=os.environ["AITECH_API_KEY"], # atk_… key from the console
)
stream = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "Draft a reply to John Smith, john.smith@example.com"}],
stream=True,
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="")
Node.js / TypeScript
Тот же код, что и с OpenAI, — меняется только адрес и ключ.
import OpenAI from 'openai';
const client = new OpenAI({
baseURL: 'https://<gateway>/v1',
apiKey: process.env.AITECH_API_KEY, // atk_… key from the console
});
const completion = await client.chat.completions.create({
model: 'gpt-4o-mini',
messages: [{ role: 'user', content: 'Summarize the contract with INN 7701234560' }],
});
console.log(completion.choices[0]?.message.content);
Эмбеддинги
Тексты для /v1/embeddings псевдонимизируются перед отправкой. По умолчанию одинаковые значения получают одинаковые ключевые псевдонимы внутри организации, поэтому поиск по векторам продолжает работать.
vectors = client.embeddings.create(
model="text-embedding-3-small",
input=["Customer John Smith asked about invoice 42"],
)
Заголовки ответа
X-Aitech-Request-Id — идентификатор в журнале; X-Aitech-Decision — итог (passed, masked, warned); X-Aitech-Warnings и X-Aitech-Entities — ключи категорий, закодированные percent-encoding (декодируйте decodeURIComponent).
Ошибки
Ошибки шлюза приходят в формате OpenAI с расширением aitech: например, 403 policy_blocked с error.aitech.block_reasons — какие категории заблокировали запрос (только ключи категорий, никогда сами значения). Если маскирование невозможно, запрос отклоняется и не уходит к модели.
{
"error": {
"message": "Request blocked by policy",
"type": "permission_error",
"code": "policy_blocked",
"param": null,
"aitech": {
"request_id": "0b6f…",
"block_reasons": ["CREDENTIAL"],
"warn_reasons": []
}
}
}