Weatmood API

Weatmood API

Weatmood API даёт доступ к языковым моделям через единый интерфейс, совместимый с [OI] Chat Completions API. Если у вас уже есть код под [OI], достаточно заменить base_url и API-ключ.

Совместимость

Поддерживаются официальные SDK [OI] для Python, Node.js, Go и Java, а также любые библиотеки, работающие с Chat Completions API.

Быстрый старт

Получите API-ключ в разделе API ключи, затем отправьте первый запрос.

Модели пока отключены

Доступ к провайдеру ещё не открыт, поэтому запросы к моделям сейчас возвращают ошибку. Примеры ниже описывают рабочий формат — они заработают сразу после включения моделей.

Python

pip install openai
from openai import OpenAI

client = OpenAI(
    api_key="wm-ваш-ключ",
    base_url="https://api.weatmood.com/v1"
)

response = client.chat.completions.create(
    model="weatmood-alpha",
    messages=[
        {"role": "system", "content": "Ты — полезный ассистент."},
        {"role": "user", "content": "Объясни, что такое рекурсия"}
    ]
)

print(response.choices[0].message.content)

Node.js

npm install openai
import OpenAI from "openai";

const client = new OpenAI({
  apiKey: "wm-ваш-ключ",
  baseURL: "https://api.weatmood.com/v1"
});

const response = await client.chat.completions.create({
  model: "weatmood-alpha",
  messages: [{ role: "user", content: "Привет!" }]
});

console.log(response.choices[0].message.content);

cURL

curl https://api.weatmood.com/v1/chat/completions \
  -H "Authorization: Bearer wm-ваш-ключ" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "weatmood-alpha",
    "messages": [{"role": "user", "content": "Привет!"}]
  }'

Аутентификация

Каждый запрос должен содержать заголовок Authorization с вашим API-ключом:

Authorization: Bearer wm-YOUR_API_KEY

Ключи имеют префикс wm- и создаются в разделе API ключи. Храните ключ в переменной окружения, а не в коде:

# .env
WEATMOOD_API_KEY=wm-ваш-ключ
import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["WEATMOOD_API_KEY"],
    base_url="https://api.weatmood.com/v1"
)
Безопасность

Никогда не публикуйте ключ в открытых репозиториях и не используйте его в клиентском коде (браузер, мобильное приложение) — только на сервере. При утечке немедленно отзовите ключ в консоли.

Chat Completions

POST /v1/chat/completions

Основной эндпоинт для генерации ответов. Принимает историю сообщений и возвращает ответ модели.

Тело запроса

ПолеТипОписание
modelstringОбязательно. ID модели, например weatmood-alpha
messagesarrayОбязательно. История диалога
streambooleanПечатать ответ по мере генерации. По умолчанию false
temperaturenumberСлучайность ответа, 0–2. По умолчанию 1
max_tokensintegerМаксимум токенов в ответе
top_pnumberNucleus sampling, 0–1
stopstring / arrayПоследовательности, останавливающие генерацию

Формат сообщений

{
  "messages": [
    {"role": "system", "content": "Ты — ассистент поддержки."},
    {"role": "user", "content": "Как сбросить пароль?"},
    {"role": "assistant", "content": "Откройте настройки..."},
    {"role": "user", "content": "А если нет доступа к почте?"}
  ]
}

Роли: system — задаёт поведение, user — сообщения пользователя, assistant — предыдущие ответы модели.

Ответ

{
  "id": "chatcmpl-abc123",
  "object": "chat.completion",
  "created": 1726900000,
  "model": "weatmood-alpha",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "Для сброса пароля..."
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 24,
    "completion_tokens": 156,
    "total_tokens": 180
  }
}

Стриминг

Установите stream: true, чтобы получать ответ по частям. Это снижает задержку до первого символа.

stream = client.chat.completions.create(
    model="weatmood-alpha",
    messages=[{"role": "user", "content": "Напиши хокку"}],
    stream=True
)

for chunk in stream:
    delta = chunk.choices[0].delta.content
    if delta:
        print(delta, end="", flush=True)

Каждый чанк — отдельная строка data: в формате SSE. Поток завершается строкой data: [DONE].

data: {"choices":[{"delta":{"content":"Ти"}}]}
data: {"choices":[{"delta":{"content":"хий"}}]}
data: {"choices":[{"delta":{"content":" пруд"}}]}
data: [DONE]

Модели

GET /v1/models

Возвращает список доступных моделей с параметрами и ценами.

models = client.models.list()
for m in models.data:
    print(m.id)

Характеристики

Модели временно недоступны

Доступ к провайдеру ещё не открыт, поэтому модели линейки Weatmood отключены. Характеристики появятся здесь после запуска.

Модель Принимает Отдаёт Контекст Макс. вход Макс. выход Кеш Статус
weatmood-alpha неизвестно неизвестно неизвестно неизвестно неизвестно неизвестно Отключена
weatmood-flash-alpha неизвестно неизвестно неизвестно неизвестно неизвестно неизвестно Отключена
weatmood-omni-alpha неизвестно неизвестно неизвестно неизвестно неизвестно неизвестно Отключена

Когда модели заработают

Как только доступ к провайдеру будет открыт, здесь появится полная спецификация каждой модели: что она принимает и отдаёт, размер контекста, максимальные вход и выход, поддержка кеширования промпта, стриминга и вызова инструментов.

Изображения

Пока недоступно

Модель weatmood-omni-alpha с поддержкой изображений ещё не включена. Формат запроса ниже описывает, как это будет работать после запуска.

Модель принимает изображения вместе с текстом. Передавайте их как URL или base64.

response = client.chat.completions.create(
    model="weatmood-omni-alpha",
    messages=[{
        "role": "user",
        "content": [
            {"type": "text", "text": "Что на этом изображении?"},
            {"type": "image_url", "image_url": {"url": "https://example.com/photo.jpg"}}
        ]
    }]
)

Для локальных файлов используйте data-URL:

import base64

with open("photo.jpg", "rb") as f:
    encoded = base64.b64encode(f.read()).decode()

image_url = f"data:image/jpeg;base64,{encoded}"

Tool Calling

Модель может вызывать ваши функции. Опишите инструменты в параметре tools.

tools = [{
    "type": "function",
    "function": {
        "name": "get_weather",
        "description": "Узнать погоду в городе",
        "parameters": {
            "type": "object",
            "properties": {
                "city": {"type": "string", "description": "Название города"}
            },
            "required": ["city"]
        }
    }
}]

response = client.chat.completions.create(
    model="weatmood-alpha",
    messages=[{"role": "user", "content": "Какая погода в Москве?"}],
    tools=tools
)

tool_call = response.choices[0].message.tool_calls[0]
print(tool_call.function.name)       # get_weather
print(tool_call.function.arguments)  # {"city": "Москва"}

Затем верните результат модели:

messages.append(response.choices[0].message)
messages.append({
    "role": "tool",
    "tool_call_id": tool_call.id,
    "content": '{"temp": -3, "condition": "снег"}'
})

final = client.chat.completions.create(
    model="weatmood-alpha",
    messages=messages,
    tools=tools
)

Параметры генерации

ПараметрДиапазонКогда менять
temperature0–20 — точные ответы, 1.5 — творческие
top_p0–1Альтернатива temperature, используйте одно из двух
max_tokens1–128000Ограничить длину ответа
presence_penalty-2–2Штраф за повторение тем
frequency_penalty-2–2Штраф за повторение слов
seedintegerВоспроизводимость ответов

Ошибки

API возвращает стандартные HTTP-коды. Тело ответа содержит описание:

{
  "error": {
    "message": "Invalid API key provided",
    "type": "invalid_request_error",
    "code": "invalid_api_key"
  }
}
КодЗначениеЧто делать
400Некорректный запросПроверьте тело запроса и параметры
401Неверный ключПроверьте Authorization
402Недостаточно средствПополните баланс
403Доступ запрещёнКлюч отозван или заблокирован
404Модель не найденаПроверьте ID в /v1/models
429Превышен лимитСнизьте частоту, повторите с задержкой
500Ошибка сервераПовторите запрос
503Модель недоступнаПовторите позже или выберите другую

Повторные попытки

При 429 и 5xx используйте экспоненциальную задержку:

import time

def request_with_retry(fn, attempts=5):
    for i in range(attempts):
        try:
            return fn()
        except Exception as e:
            if i == attempts - 1:
                raise
            time.sleep(2 ** i)  # 1, 2, 4, 8 секунд

Лимиты

ЛимитЗначение
Запросов в секунду15
Всплеск (burst)30 запросов
Размер запроса32 МБ
Таймаут ответа620 секунд

Заголовки ответа содержат текущее состояние:

X-RateLimit-Limit: 15
X-RateLimit-Remaining: 12

Цены

Списание идёт с баланса аккаунта. Актуальные цены на модели смотрите в разделе Модели или через /v1/models.

Кэширование

Повторяющиеся части промпта кэшируются и тарифицируются дешевле. Кэш включается автоматически для моделей с поддержкой supports_cache.

SDK и библиотеки

API совместим с [OI]-форматом, поэтому подходят официальные и сторонние SDK.

ЯзыкУстановка
Pythonpip install openai
Node.jsnpm install openai
Gogo get github.com/sashabaranov/go-openai
PHPcomposer require openai-php/client
Rubygem install ruby-openai

LangChain

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model="weatmood-alpha",
    api_key="wm-ваш-ключ",
    base_url="https://api.weatmood.com/v1"
)

Нужна помощь?

Пишите в поддержку через страницу помощи или в чат на weatmood.com.