Почти все провайдеры дают похожий интерфейс: список сообщений с ролями (system, user, assistant), параметры генерации, ответ с текстом и расходом токенов. Многие совместимы с форматом OpenAI, поэтому переключиться между провайдерами можно сменой адреса и ключа.
resp = await client.chat.completions.create(
model="...",
messages=[
{"role": "system", "content": "Ты помощник службы поддержки магазина."},
{"role": "user", "content": question},
],
temperature=0.2,
)
print(resp.choices[0].message.content, resp.usage.total_tokens)
Модель не помнит прошлые запросы: история диалога каждый раз отправляется целиком, и за неё платят снова.