Перейти к содержимому

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": []
    }
  }
}