OpenAI SDK
Chat Completions, стриминг, инструменты и эмбеддинги через OpenAI SDK.
Morphogen совместим с OpenAI API. Укажите base_url и ключ Morphogen, остальной код остаётся прежним. Подойдут Python, TypeScript и любой клиент с настраиваемым адресом.
Подключение
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.morphogen.ru/v1",
api_key=os.environ["MORPHOGEN_API_KEY"],
)Модели можно брать любые текстовые из client.models.list(), не только GPT: claude-sonnet-5 отвечает через тот же клиент.
Запрос
resp = client.chat.completions.create(
model="claude-sonnet-5",
max_tokens=300,
messages=[
{"role": "system", "content": "Отвечай коротко."},
{"role": "user", "content": "Чем отличается TCP от UDP?"},
],
)
print(resp.choices[0].message.content)
print(resp.usage.total_tokens)Всегда передавайте max_tokens: без него резервируется сумма по максимальной длине ответа, и при небольшом балансе запрос вернёт 402. Параметры запроса: Chat Completions.
Потоковый ответ
stream = client.chat.completions.create(
model="claude-sonnet-5",
max_tokens=300,
stream=True,
messages=[{"role": "user", "content": "Напиши хокку про дождь"}],
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)Вызов инструментов
tools = [{
"type": "function",
"function": {
"name": "get_weather",
"description": "Погода в городе",
"parameters": {
"type": "object",
"properties": {"city": {"type": "string"}},
"required": ["city"],
},
},
}]
resp = client.chat.completions.create(
model="gpt-6-sol",
max_tokens=300,
tools=tools,
messages=[{"role": "user", "content": "Какая погода в Казани?"}],
)
call = resp.choices[0].message.tool_calls[0]
print(call.function.name, call.function.arguments)Выполните функцию у себя и верните результат сообщением с role: "tool" в следующем запросе. Инструменты работают у моделей с поддержкой tool use.
Эмбеддинги
emb = client.embeddings.create(model="bge-m3", input=["Как вернуть товар?"])
print(len(emb.data[0].embedding))Параметры: Embeddings.
Responses API
Тот же клиент вызывает client.responses.create(...). Хранения истории нет: не передавайте store=True и previous_response_id, иначе будет 400 stateful_not_supported. Подробности: Responses.
Обработка ошибок
import openai
try:
client.chat.completions.create(model="claude-sonnet-5", max_tokens=100, messages=[...])
except openai.RateLimitError as e:
print("лимит, повторите через", e.response.headers.get("retry-after"), "с")
except openai.APIStatusError as e:
print(e.status_code, e.body)Код ошибки лежит в e.body["error"]["code"]. Все коды: Ошибки.