Skip to main content

Лучшие практики

Оптимизируйте использование API по стоимости, производительности и надёжности.

Оптимизация затрат

Контролируйте расходы на API с помощью этих стратегий:

Мониторинг в реальном времени: Отслеживайте расходы через usage.total_cost_usd в ответе API. Каждый ответ содержит точную стоимость запроса.

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

cost-tracking.ts
// Track costs after each request
let runningBalance = parseFloat(initialBalance);

async function sendMessage(content: string) {
  const response = await client.chat.completions.create({
    model: "Qwen/Qwen3-235B-A22B-Instruct-2507-FP8",
    messages: [{ role: "user", content }],
  });

  const usage = response.usage as any;
  runningBalance -= usage.total_cost_usd;

  if (runningBalance < 10) {
    showLowBalanceWarning();
  }

  return response;
}

Производительность

Оптимизируйте время ответа и пропускную способность:

Используйте streaming для длинных ответов. Streaming снижает воспринимаемую задержку с 5-10 секунд до мгновенного отклика.

streaming.ts
const stream = await client.chat.completions.create({
  model: "Qwen/Qwen3-8B",
  messages: [{ role: "user", content: "Explain quantum computing" }],
  stream: true,
});

for await (const chunk of stream) {
  process.stdout.write(chunk.choices[0]?.delta?.content || "");
}

Кэшируйте повторяющиеся запросы на стороне приложения. Идентичные промпты дают идентичные ответы при temperature: 0.

Совет

Группируйте связанные запросы: отправляйте несколько сообщений в одном conversation вместо отдельных запросов.

Надёжность

Создавайте надёжные приложения, корректно обрабатывающие сбои:

Реализуйте retry с exponential backoff. При ошибках 429 (rate limit) или 503 (network) повторяйте запрос с увеличивающейся задержкой.

retry.ts
async function requestWithRetry(fn: () => Promise<any>, maxRetries = 3) {
  for (let attempt = 0; attempt < maxRetries; attempt++) {
    try {
      return await fn();
    } catch (error: any) {
      const status = error?.status;
      if (status === 429 || status === 503) {
        const delay = Math.pow(2, attempt) * 1000; // 1s, 2s, 4s
        await new Promise(r => setTimeout(r, delay));
        continue;
      }
      throw error;
    }
  }
  throw new Error("Max retries exceeded");
}

Устанавливайте разумные таймауты. Для chat completions рекомендуем 30-60 секунд, для embeddings — 10-15 секунд.

Безопасность

Защитите ваши API-ключи и данные:

  • Никогда не используйте API-ключи в frontend-коде или публичных репозиториях
  • Храните ключи в переменных окружения, не в коде
  • Регулярно ротируйте ключи, особенно если подозреваете утечку
  • Используйте отдельные ключи для development и production

Обработка ошибок

Корректно обрабатывайте ошибки для лучшего пользовательского опыта:

Проверяйте HTTP статус перед парсингом ответа. Коды 4xx означают ошибку клиента, 5xx — временную недоступность сервиса.

error_handling.py
from openai import OpenAI, APIError

client = OpenAI(base_url="https://api.gonkagate.com/v1", api_key="gp-...")

try:
    response = client.chat.completions.create(
        model="Qwen/Qwen3-8B",
        messages=[{"role": "user", "content": "Hello"}]
    )
except APIError as e:
    if e.status_code == 401:
        print("Invalid API key")
    elif e.status_code == 402:
        print("Insufficient balance")
    elif e.status_code == 429:
        print("Rate limit exceeded")
    elif e.status_code == 503:
        print("Network temporarily unavailable")
    else:
        print(f"Unexpected error: {e}")
Была ли эта страница полезной?