Лучшие практики
Оптимизируйте использование API по стоимости, производительности и надёжности.
Оптимизация затрат
Контролируйте расходы на API с помощью этих стратегий:
Мониторинг в реальном времени: Отслеживайте расходы через usage.total_cost_usd в ответе API. Каждый ответ содержит точную стоимость запроса.
Предупреждения о низком балансе: Настройте алерты когда баланс падает ниже порога (например, $10) чтобы избежать прерывания сервиса.
// 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 секунд до мгновенного отклика.
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.
Совет
Надёжность
Создавайте надёжные приложения, корректно обрабатывающие сбои:
Реализуйте retry с exponential backoff. При ошибках 429 (rate limit) или 503 (network) повторяйте запрос с увеличивающейся задержкой.
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 — временную недоступность сервиса.
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}")