Использование

Этот раздел покрывает основные способы использования Evolution OpenAI.

Основы работы с SDK

Инициализация клиента

from evolution_openai import OpenAI

client = OpenAI(
    key_id="your_key_id",
    secret="your_secret",
    base_url="https://your-endpoint.cloud.ru/v1"
)

Chat Completions API

Базовый запрос

response = client.chat.completions.create(
    model="default",
    messages=[
        {"role": "system", "content": "Ты полезный помощник."},
        {"role": "user", "content": "Объясни квантовую физику простыми словами"}
    ],
    max_tokens=200
)

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

С дополнительными параметрами

response = client.chat.completions.create(
    model="default",
    messages=[
        {"role": "system", "content": "Ты креативный писатель."},
        {"role": "user", "content": "Напиши короткую историю про робота"}
    ],
    max_tokens=300,
    temperature=0.8,          # Креативность (0.0-2.0)
    top_p=0.9,               # Nucleus sampling
    frequency_penalty=0.5,    # Штраф за повторения
    presence_penalty=0.3,     # Штраф за присутствие токенов
    stop=["КОНЕЦ", "END"]     # Остановочные последовательности
)

Диалоговый режим

# История диалога
conversation = [
    {"role": "system", "content": "Ты дружелюбный помощник."}
]

# Функция для продолжения диалога
def chat(message):
    conversation.append({"role": "user", "content": message})

    response = client.chat.completions.create(
        model="default",
        messages=conversation,
        max_tokens=150
    )

    assistant_message = response.choices[0].message.content
    conversation.append({"role": "assistant", "content": assistant_message})

    return assistant_message

# Пример диалога
print(chat("Привет! Как дела?"))
print(chat("Расскажи анекдот"))
print(chat("Объясни предыдущий анекдот"))

Models API

Получение списка моделей

models = client.models.list()
for model in models.data:
    print(f"ID: {model.id}, Created: {model.created}")

Информация о конкретной модели

model = client.models.retrieve("default")
print(f"Model: {model.id}")
print(f"Owner: {model.owned_by}")

Legacy Completions API

Note

Рекомендуется использовать Chat Completions API для новых проектов.

response = client.completions.create(
    model="default",
    prompt="Расскажи о преимуществах искусственного интеллекта:",
    max_tokens=150,
    temperature=0.7
)

print(response.choices[0].text)

Продвинутые возможности

Per-request конфигурация

# Временное изменение таймаута для одного запроса
response = client.with_options(timeout=60.0).chat.completions.create(
    model="default",
    messages=[{"role": "user", "content": "Долгий запрос..."}],
    max_tokens=500
)

Raw response доступ

# Получение полного HTTP ответа
raw_response = client.chat.completions.with_raw_response.create(
    model="default",
    messages=[{"role": "user", "content": "Тестовое сообщение"}],
    max_tokens=50
)

print(f"Status Code: {raw_response.status_code}")
print(f"Headers: {raw_response.headers}")

# Парсинг ответа
parsed = raw_response.parse()
print(parsed.choices[0].message.content)

Context Manager

with OpenAI(
    key_id="your_key_id",
    secret="your_secret",
    base_url="https://your-endpoint.cloud.ru/v1"
) as client:
    response = client.chat.completions.create(
        model="default",
        messages=[{"role": "user", "content": "Привет!"}]
    )
    print(response.choices[0].message.content)
# Клиент автоматически закрывается

Helper функции

create_client()

from evolution_openai import create_client

client = create_client(
    key_id="your_key_id",
    secret="your_secret",
    base_url="https://your-endpoint.cloud.ru/v1",
    timeout=30.0,
    max_retries=3
)

Конфигурация клиента

Таймауты

client = OpenAI(
    key_id="your_key_id",
    secret="your_secret",
    base_url="https://your-endpoint.cloud.ru/v1",
    timeout=30.0  # 30 секунд
)

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

client = OpenAI(
    key_id="your_key_id",
    secret="your_secret",
    base_url="https://your-endpoint.cloud.ru/v1",
    max_retries=5  # До 5 повторных попыток
)

Кастомные заголовки

client = OpenAI(
    key_id="your_key_id",
    secret="your_secret",
    base_url="https://your-endpoint.cloud.ru/v1",
    default_headers={
        "User-Agent": "MyApp/1.0",
        "X-Custom-Header": "custom-value"
    }
)

Обработка ответов

Структура ответа

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

# Основные поля ответа
print(f"ID: {response.id}")
print(f"Model: {response.model}")
print(f"Created: {response.created}")

# Выбор ответа
choice = response.choices[0]
print(f"Message: {choice.message.content}")
print(f"Role: {choice.message.role}")
print(f"Finish Reason: {choice.finish_reason}")

# Статистика использования
if response.usage:
    print(f"Prompt Tokens: {response.usage.prompt_tokens}")
    print(f"Completion Tokens: {response.usage.completion_tokens}")
    print(f"Total Tokens: {response.usage.total_tokens}")

Несколько вариантов ответа

response = client.chat.completions.create(
    model="default",
    messages=[{"role": "user", "content": "Назови три цвета"}],
    n=3  # Получить 3 варианта ответа
)

for i, choice in enumerate(response.choices):
    print(f"Вариант {i+1}: {choice.message.content}")

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

Управление контекстом

def manage_conversation_length(messages, max_tokens=2000):
    """Обрезает историю диалога, если она слишком длинная"""
    total_tokens = estimate_tokens(messages)

    while total_tokens > max_tokens and len(messages) > 1:
        # Удаляем самые старые сообщения (кроме системного)
        if messages[1]["role"] != "system":
            messages.pop(1)
        else:
            messages.pop(2)
        total_tokens = estimate_tokens(messages)

    return messages

def estimate_tokens(messages):
    """Примерная оценка количества токенов"""
    return sum(len(msg["content"].split()) * 1.3 for msg in messages)

Кеширование ответов

import hashlib
from functools import lru_cache

@lru_cache(maxsize=100)
def cached_completion(prompt_hash, max_tokens=100):
    """Кеширует ответы для одинаковых запросов"""
    response = client.chat.completions.create(
        model="default",
        messages=[{"role": "user", "content": prompt_hash}],
        max_tokens=max_tokens
    )
    return response.choices[0].message.content

def get_completion(prompt):
    prompt_hash = hashlib.md5(prompt.encode()).hexdigest()
    return cached_completion(prompt_hash)

Обработка больших текстов

def process_large_text(text, chunk_size=2000):
    """Обрабатывает большой текст по частям"""
    chunks = [text[i:i+chunk_size] for i in range(0, len(text), chunk_size)]
    results = []

    for i, chunk in enumerate(chunks):
        print(f"Обрабатываю часть {i+1}/{len(chunks)}")

        response = client.chat.completions.create(
            model="default",
            messages=[
                {"role": "system", "content": "Суммируй следующий текст:"},
                {"role": "user", "content": chunk}
            ],
            max_tokens=200
        )

        results.append(response.choices[0].message.content)

    return results

Мониторинг использования

import time
from collections import defaultdict

class UsageTracker:
    def __init__(self):
        self.stats = defaultdict(int)
        self.start_time = time.time()

    def track_request(self, response):
        if response.usage:
            self.stats["total_tokens"] += response.usage.total_tokens
            self.stats["requests"] += 1

    def get_stats(self):
        elapsed = time.time() - self.start_time
        return {
            "total_requests": self.stats["requests"],
            "total_tokens": self.stats["total_tokens"],
            "avg_tokens_per_request": self.stats["total_tokens"] / max(1, self.stats["requests"]),
            "requests_per_minute": self.stats["requests"] / (elapsed / 60),
            "tokens_per_minute": self.stats["total_tokens"] / (elapsed / 60)
        }

# Использование
tracker = UsageTracker()

response = client.chat.completions.create(
    model="default",
    messages=[{"role": "user", "content": "Тест"}]
)

tracker.track_request(response)
print(tracker.get_stats())